From a1aee92d3bc46b8de511650123f77ff8ec9972ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Mon, 22 Mar 2021 12:45:32 -0400
Subject: [PATCH] sharewith: route trough home

Change-Id: Ie253fab6909fc7de95ad894c7e602eb140fb8ebb
---
 .../java/cx/ring/client/HomeActivity.java     | 99 ++++---------------
 .../java/cx/ring/client/ShareActivity.java    | 28 ++++++
 .../cx/ring/fragments/ShareWithFragment.java  | 97 ++++++++----------
 .../java/cx/ring/utils/ConversationPath.java  |  5 +
 4 files changed, 92 insertions(+), 137 deletions(-)

diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index 9024023ae..73dadfb92 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -143,7 +143,7 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
     private ActivityHomeBinding mBinding;
 
     private AlertDialog mMigrationDialog;
-    private String mAccountWithPendingrequests = null;
+    //private String mAccountWithPendingrequests = null;
 
     private final CompositeDisposable mDisposable = new CompositeDisposable();
 
@@ -197,30 +197,6 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
             });
         }
 
-        // if app opened from notification display trust request fragment when mService will connected
-        /*Intent intent = getIntent();
-        Bundle extra = intent.getExtras();
-        String action = intent.getAction();
-        if (ACTION_PRESENT_TRUST_REQUEST_FRAGMENT.equals(action)) {
-            if (extra == null || extra.getString(ContactRequestsFragment.ACCOUNT_ID) == null) {
-                return;
-            }
-            mAccountWithPendingrequests = extra.getString(ContactRequestsFragment.ACCOUNT_ID);
-        } else if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
-            handleShareIntent(intent);
-        }
-        FragmentManager fragmentManager = getSupportFragmentManager();
-        fContent = fragmentManager.findFragmentById(R.id.main_frame);
-        if (fContent == null || Intent.ACTION_SEARCH.equals(action)) {
-            fContent = new SmartListFragment();
-            fragmentManager.beginTransaction()
-                    .replace(R.id.main_frame, fContent, HOME_TAG)
-                    .commitNow();
-        }
-        if (mAccountWithPendingrequests != null) {
-            presentTrustRequestFragment(mAccountWithPendingrequests);
-            mAccountWithPendingrequests = null;
-        }*/
         handleIntent(getIntent());
     }
 
@@ -237,39 +213,10 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
         mBinding = null;
     }
 
-    private void handleShareIntent(Intent intent) {
-        String action = intent.getAction();
-        if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
-            Bundle extra = intent.getExtras();
-            if (extra != null) {
-                if (ConversationPath.fromBundle(extra) != null) {
-                    intent.setClass(this, ConversationActivity.class);
-                    startActivity(intent);
-                }
-            }
-        }
-    }
-
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
-        /*Log.d(TAG, "onNewIntent: " + intent);
-        String action = intent.getAction();
-        if (ACTION_PRESENT_TRUST_REQUEST_FRAGMENT.equals(action)) {
-            Bundle extra = intent.getExtras();
-            if (extra == null || extra.getString(ContactRequestsFragment.ACCOUNT_ID) == null) {
-                return;
-            }
-            presentTrustRequestFragment(extra.getString(ContactRequestsFragment.ACCOUNT_ID));
-        } else if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
-            handleShareIntent(intent);
-        } else if (Intent.ACTION_SEARCH.equals(action)) {
-            if (fContent instanceof SmartListFragment) {
-                ((SmartListFragment)fContent).handleIntent(intent);
-            }
-        } else if (DRingService.ACTION_CONV_ACCEPT.equals(action) || Intent.ACTION_VIEW.equals(action))  {
-            startConversation(ConversationPath.fromIntent(intent));
-        }*/
+        handleIntent(intent);
     }
 
     private void handleIntent(Intent intent) {
@@ -285,15 +232,13 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
         } else if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
             ConversationPath path = ConversationPath.fromBundle(extra);
             if (path != null) {
-
-                intent.setClass(this, ConversationActivity.class);
+                startConversation(path);
+            } else {
+                intent.setClass(getApplicationContext(), ShareActivity.class);
                 startActivity(intent);
             }
         } else if (DRingService.ACTION_CONV_ACCEPT.equals(action) || Intent.ACTION_VIEW.equals(action))  {
             startConversation(ConversationPath.fromIntent(intent));
-            /*if (DeviceUtils.isTablet(this)) {
-                startConversationTablet(ConversationPath.fromIntent(intent).toBundle());
-            }*/
         } //else {
             FragmentManager fragmentManager = getSupportFragmentManager();
             fContent = fragmentManager.findFragmentById(R.id.main_frame);
@@ -395,16 +340,14 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             mDisposable.add((mAccountService
                     .getCurrentAccountSubject()
+                    .flatMap(Account::getConversationsSubject)
                     .observeOn(Schedulers.io())
-                    .map(account -> {
-                        Collection<Conversation> conversations = account.getConversations();
-                        synchronized (conversations) {
-                            return new ArrayList<>(conversations);
-                        }
-                    })
                     .subscribe(this::setShareShortcuts, e -> Log.e(TAG, "Error generating conversation shortcuts", e))));
         }
 
+        if (fConversation == null)
+            fConversation = (ConversationFragment) getSupportFragmentManager().findFragmentByTag(ConversationFragment.class.getSimpleName());
+
         int newOrientation = getResources().getConfiguration().orientation;
         if (mOrientation != newOrientation) {
             mOrientation = newOrientation;
@@ -414,12 +357,11 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
                 showTabletToolbar();
             } else {
                 // Remove ConversationFragment that might have been restored after an orientation change
-                if (fConversation == null)
-                    fConversation = (ConversationFragment) getSupportFragmentManager().findFragmentByTag(ConversationFragment.class.getSimpleName());
                 if (fConversation != null) {
-                   // fConversation = null;
-                   // getSupportFragmentManager().findFragmentByTag(ConversationFragment.class.getSimpleName());
-                    getSupportFragmentManager().beginTransaction().remove(fConversation).commitNow();
+                    getSupportFragmentManager()
+                            .beginTransaction()
+                            .remove(fConversation)
+                            .commitNow();
                     fConversation = null;
                 }
             }
@@ -834,8 +776,7 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
 
         List<Future<Bitmap>> futureIcons = new ArrayList<>(Math.min(conversations.size(),maxCount));
         for (Conversation conversation : conversations) {
-            Contact contact = conversation.getContact();
-            futureIcons.add(AvatarFactory.getBitmapAvatar(this, contact, targetSize)
+            futureIcons.add(AvatarFactory.getBitmapAvatar(this, conversation, targetSize, false)
                     .subscribeOn(Schedulers.computation())
                     .toFuture());
             if (++i == maxCount)
@@ -845,7 +786,6 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
 
         i = 0;
         for (Conversation conversation : conversations) {
-            Contact contact = conversation.getContact();
             IconCompat icon = null;
             try {
                 icon = IconCompat.createWithBitmap(futureIcons.get(i).get());
@@ -853,21 +793,22 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
                 Log.w(TAG, "Failed to load icon", e);
             }
 
-            Bundle bundle = ConversationPath.toBundle(conversation.getAccountId(), contact.getPrimaryNumber());
-            String key = ConversationPath.toKey(conversation.getAccountId(), contact.getPrimaryNumber());
+            ConversationPath path = new ConversationPath(conversation);
+            String key = path.toKey();
 
             Person person = new Person.Builder()
-                    .setName(contact.getDisplayName())
+                    .setName(conversation.getTitle())
                     .setKey(key)
                     .build();
 
             ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(this, key)
-                    .setShortLabel(contact.getDisplayName())
+                    .setShortLabel(conversation.getTitle())
                     .setPerson(person)
                     .setLongLived(true)
                     .setIcon(icon)
                     .setCategories(Collections.singleton(CONVERSATIONS_CATEGORY))
-                    .setIntent(new Intent(Intent.ACTION_SEND, Uri.EMPTY, this, ShareActivity.class).putExtras(bundle))
+                    .setIntent(new Intent(Intent.ACTION_SEND, Uri.EMPTY, this, HomeActivity.class)
+                            .putExtras(path.toBundle()))
                     .build();
 
             shortcutInfoList.add(shortcutInfo);
diff --git a/ring-android/app/src/main/java/cx/ring/client/ShareActivity.java b/ring-android/app/src/main/java/cx/ring/client/ShareActivity.java
index a7ab1f945..c8f01c11a 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ShareActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ShareActivity.java
@@ -1,14 +1,42 @@
+/*
+ *  Copyright (C) 2004-2021 Savoir-faire Linux Inc.
+ *
+ *  Authors: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
 package cx.ring.client;
 
+import android.content.Intent;
 import android.os.Bundle;
 import androidx.appcompat.app.AppCompatActivity;
 
 import cx.ring.R;
+import cx.ring.utils.ConversationPath;
 
 public class ShareActivity extends AppCompatActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+        Bundle extra = intent.getExtras();
+        if (ConversationPath.fromBundle(extra) != null) {
+            intent.setClass(this, ConversationActivity.class);
+            startActivity(intent);
+            finish();
+            return;
+        }
         setContentView(R.layout.activity_share);
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
index 7e8941ff8..fd739b2ee 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
@@ -24,33 +24,30 @@ import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.util.Log;
+import android.view.InflateException;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.appcompat.widget.Toolbar;
 
-import android.util.Log;
-import android.view.InflateException;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.VideoView;
+import net.jami.facades.ConversationFacade;
+import net.jami.services.ContactService;
+import net.jami.smartlist.SmartListViewModel;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import cx.ring.R;
 import cx.ring.adapters.SmartListAdapter;
 import cx.ring.application.JamiApplication;
 import cx.ring.client.ConversationActivity;
-import net.jami.facades.ConversationFacade;
-import net.jami.services.ContactService;
-import net.jami.smartlist.SmartListViewModel;
+import cx.ring.databinding.FragSharewithBinding;
 import cx.ring.utils.ConversationPath;
 import cx.ring.viewholders.SmartListViewHolder;
 import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -58,7 +55,6 @@ import io.reactivex.disposables.CompositeDisposable;
 
 public class ShareWithFragment extends Fragment {
     private final static String TAG = ShareWithFragment.class.getSimpleName();
-    private final static String SHORTCUT_ID = "android.intent.extra.shortcut.ID";
 
     private final CompositeDisposable mDisposable = new CompositeDisposable();
 
@@ -73,9 +69,7 @@ public class ShareWithFragment extends Fragment {
     private Intent mPendingIntent = null;
     private SmartListAdapter adapter;
 
-    private TextView previewText;
-    private ImageView previewImage;
-    private VideoView previewVideo;
+    private FragSharewithBinding binding;
 
     /**
      * Mandatory empty constructor for the fragment manager to instantiate the
@@ -90,20 +84,15 @@ public class ShareWithFragment extends Fragment {
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.frag_sharewith, container, false);
-        RecyclerView list = view.findViewById(R.id.shareList);
-        Toolbar toolbar = view.findViewById(R.id.toolbar);
-        previewText = view.findViewById(R.id.previewText);
-        previewImage = view.findViewById(R.id.previewImage);
-        previewVideo = view.findViewById(R.id.previewVideo);
-
-        Context context = view.getContext();
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+                             @Nullable Bundle savedInstanceState) {
+        binding = FragSharewithBinding.inflate(inflater);
+
+        Context context = binding.getRoot().getContext();
         Activity activity = getActivity();
         if (activity instanceof AppCompatActivity) {
             AppCompatActivity compatActivity = (AppCompatActivity) activity;
-            compatActivity.setSupportActionBar(toolbar);
+            compatActivity.setSupportActionBar(binding.toolbar);
             ActionBar ab = compatActivity.getSupportActionBar();
             if (ab != null)
                 ab.setDisplayHomeAsUpEnabled(true);
@@ -113,25 +102,25 @@ public class ShareWithFragment extends Fragment {
             String type = mPendingIntent.getType();
             ClipData clip = mPendingIntent.getClipData();
             if (type.startsWith("text/")) {
-                previewText.setText(mPendingIntent.getStringExtra(Intent.EXTRA_TEXT));
-                previewText.setVisibility(View.VISIBLE);
+                binding.previewText.setText(mPendingIntent.getStringExtra(Intent.EXTRA_TEXT));
+                binding.previewText.setVisibility(View.VISIBLE);
             } else if (type.startsWith("image/")) {
                 Uri data = mPendingIntent.getData();
                 if (data == null && clip != null && clip.getItemCount() > 0)
                     data = clip.getItemAt(0).getUri();
-                previewImage.setImageURI(data);
-                previewImage.setVisibility(View.VISIBLE);
+                binding.previewImage.setImageURI(data);
+                binding.previewImage.setVisibility(View.VISIBLE);
             } else if (type.startsWith("video/")) {
                 Uri data = mPendingIntent.getData();
                 if (data == null && clip != null && clip.getItemCount() > 0)
                     data = clip.getItemAt(0).getUri();
                 try {
-                    previewVideo.setVideoURI(data);
-                    previewVideo.setVisibility(View.VISIBLE);
+                    binding.previewVideo.setVideoURI(data);
+                    binding.previewVideo.setVisibility(View.VISIBLE);
                 } catch (NullPointerException | InflateException | NumberFormatException e) {
                     Log.e(TAG, e.getMessage());
                 }
-                previewVideo.setOnCompletionListener(mediaPlayer -> previewVideo.start());
+                binding.previewVideo.setOnCompletionListener(mediaPlayer -> binding.previewVideo.start());
             }
         }
 
@@ -143,7 +132,7 @@ public class ShareWithFragment extends Fragment {
                     mPendingIntent = null;
                     String type = intent.getType();
                     if (type != null && type.startsWith("text/")) {
-                        intent.putExtra(Intent.EXTRA_TEXT, previewText.getText().toString());
+                        intent.putExtra(Intent.EXTRA_TEXT, binding.previewText.getText().toString());
                     }
                     intent.putExtras(ConversationPath.toBundle(smartListViewModel.getAccountId(), smartListViewModel.getUri()));
                     intent.setClass(requireActivity(), ConversationActivity.class);
@@ -156,9 +145,9 @@ public class ShareWithFragment extends Fragment {
 
             }
         }, mDisposable);
-        list.setLayoutManager(new LinearLayoutManager(context));
-        list.setAdapter(adapter);
-        return view;
+        binding.shareList.setLayoutManager(new LinearLayoutManager(context));
+        binding.shareList.setAdapter(adapter);
+        return binding.getRoot();
     }
 
     @Override
@@ -174,8 +163,8 @@ public class ShareWithFragment extends Fragment {
                     if (adapter != null)
                         adapter.update(list);
                 }));
-        if (previewVideo != null && previewVideo.getVisibility() != View.GONE) {
-            previewVideo.start();
+        if (binding != null && binding.previewVideo.getVisibility() != View.GONE) {
+            binding.previewVideo.start();
         }
     }
 
@@ -186,24 +175,16 @@ public class ShareWithFragment extends Fragment {
     }
 
     @Override
-    public void onCreate(Bundle bundle) {
+    public void onCreate(@Nullable Bundle bundle) {
         super.onCreate(bundle);
-        Intent intent = getActivity().getIntent();
+        /*Intent intent = getActivity().getIntent();
         Bundle extra = intent.getExtras();
-        if (extra != null) {
-            if (ConversationPath.fromBundle(extra) != null) {
-                intent.setClass(getActivity(), ConversationActivity.class);
-                startActivity(intent);
-                return;
-            } else if (intent.hasExtra(SHORTCUT_ID)) {
-                ConversationPath conversationPath = ConversationPath.fromKey(extra.getString(SHORTCUT_ID));
-                intent.setClass(getActivity(), ConversationActivity.class)
-                        .putExtras(conversationPath.toBundle());
-                startActivity(intent);
-                return;
-            }
-        }
-        mPendingIntent = intent;
+        if (ConversationPath.fromBundle(extra) != null) {
+            intent.setClass(getActivity(), ConversationActivity.class);
+            startActivity(intent);
+            return;
+        }*/
+        mPendingIntent = getActivity().getIntent();
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java b/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java
index 255ed2142..fda742130 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java
@@ -25,6 +25,7 @@ import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.content.pm.ShortcutManagerCompat;
 
 import net.jami.model.Conversation;
 import net.jami.model.Interaction;
@@ -161,6 +162,10 @@ public class ConversationPath {
             String contactId = bundle.getString(KEY_CONVERSATION_URI);
             if (accountId != null && contactId != null) {
                 return new ConversationPath(accountId, contactId);
+            } else {
+                String shortcutId = bundle.getString(ShortcutManagerCompat.EXTRA_SHORTCUT_ID);
+                if (shortcutId != null)
+                    return fromKey(shortcutId);
             }
         }
         return null;
-- 
GitLab