conversation: detect if activity is in bubble

Change-Id: Ic5fbf6db92f86c7951e3039fd337e291d9d131cd
diff --git a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
index 4361b47..f88f305 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
@@ -45,6 +45,7 @@
 import cx.ring.databinding.ActivityConversationBinding;
 import cx.ring.fragments.ConversationFragment;
 import cx.ring.interfaces.Colorable;
+import cx.ring.services.NotificationServiceImpl;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.MediaButtonsHelper;
 
@@ -56,12 +57,16 @@
     private Intent mPendingIntent = null;
     private ActivityConversationBinding binding;
 
+    private boolean mIsBubble;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         JamiApplication.getInstance().startDaemon();
 
+        mIsBubble = getIntent().getBooleanExtra(NotificationServiceImpl.EXTRA_BUBBLE, false);
+
         binding = ActivityConversationBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
 
@@ -95,8 +100,11 @@
             conversationPath = ConversationPath.fromBundle(savedInstanceState);
         }
         if (mConversationFragment == null) {
+            Bundle bundle = conversationPath.toBundle();
+            bundle.putBoolean(NotificationServiceImpl.EXTRA_BUBBLE, mIsBubble);
+
             mConversationFragment = new ConversationFragment();
-            mConversationFragment.setArguments(conversationPath.toBundle());
+            mConversationFragment.setArguments(bundle);
             getSupportFragmentManager().beginTransaction()
                     .replace(R.id.main_frame, mConversationFragment, null)
                     .commit();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index a2c226e..d3427f8 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -102,6 +102,7 @@
 import cx.ring.services.LocationSharingService;
 import cx.ring.plugins.PluginUtils;
 import cx.ring.services.NotificationService;
+import cx.ring.services.NotificationServiceImpl;
 import cx.ring.settings.pluginssettings.PluginDetails;
 import cx.ring.utils.ActionHelper;
 import cx.ring.utils.AndroidFileUtils;
@@ -156,6 +157,8 @@
     private final CompositeDisposable mCompositeDisposable = new CompositeDisposable();
     private int mSelectedPosition;
 
+    private boolean mIsBubble;
+
     private AvatarDrawable mConversationAvatar;
     private final Map<String, AvatarDrawable> mParticipantAvatars = new HashMap<>();
     private final Map<String, AvatarDrawable> mSmallParticipantAvatars = new HashMap<>();
@@ -771,7 +774,7 @@
     @Override
     public void onResume() {
         super.onResume();
-        presenter.resume();
+        presenter.resume(mIsBubble);
     }
 
     @Override
@@ -813,6 +816,7 @@
     @Override
     protected void initPresenter(ConversationPresenter presenter) {
         ConversationPath path = ConversationPath.fromBundle(getArguments());
+        mIsBubble = getArguments().getBoolean(NotificationServiceImpl.EXTRA_BUBBLE);
         if (path == null)
             return;
         Uri contactUri = new Uri(path.getContactId());
diff --git a/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java
index 0a501ca..4989a33 100644
--- a/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java
@@ -89,6 +89,8 @@
 
 public class NotificationServiceImpl implements NotificationService {
 
+    public static final String EXTRA_BUBBLE = "bubble";
+
     private static final String TAG = NotificationServiceImpl.class.getSimpleName();
 
     private static final String NOTIF_MSG = "MESSAGE";
@@ -517,10 +519,12 @@
         if (contactPicture != null) {
             messageNotificationBuilder.setLargeIcon(contactPicture);
             Intent intentBubble = new Intent(Intent.ACTION_VIEW, path, mContext, ConversationActivity.class);
+            intentBubble.putExtra(EXTRA_BUBBLE, true);
             messageNotificationBuilder.setBubbleMetadata(new NotificationCompat.BubbleMetadata.Builder()
                     .setDesiredHeight(600)
                     .setIcon(IconCompat.createWithAdaptiveBitmap(contactPicture))
-                    .setIntent(PendingIntent.getActivity(mContext, 0, intentBubble, 0))
+                    .setIntent(PendingIntent.getActivity(mContext, 0, intentBubble,
+                            PendingIntent.FLAG_UPDATE_CURRENT))
                     .build());
         }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
index aac47e9..f2e9970 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
@@ -147,7 +147,7 @@
         }
     }
 
-    public void resume() {
+    public void resume(boolean isBubble) {
         Log.w(TAG, "resume " + mConversation + " " + mAccountId + " " + mContactUri);
         mVisibilityDisposable.clear();
         mVisibilityDisposable.add(mConversationSubject
@@ -155,7 +155,7 @@
                 .subscribe(conversation -> {
                     conversation.setVisible(true);
                     updateOngoingCallView(conversation);
-                    mConversationFacade.readMessages(mAccountService.getAccount(mAccountId), conversation);
+                    mConversationFacade.readMessages(mAccountService.getAccount(mAccountId), conversation, !isBubble);
                 }, e -> Log.e(TAG, "Error loading conversation", e)));
     }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java b/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
index 4c92093..e603c78 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
@@ -196,16 +196,18 @@
     public void readMessages(String accountId, Uri contact) {
         Account account = mAccountService.getAccount(accountId);
         if (account != null)
-            readMessages(account, account.getByUri(contact));
+            readMessages(account, account.getByUri(contact), true);
     }
 
-    public void readMessages(Account account, Conversation conversation) {
+    public void readMessages(Account account, Conversation conversation, boolean cancelNotification) {
         if (conversation != null) {
             String lastMessage = readMessages(conversation);
             if (lastMessage != null) {
                 account.refreshed(conversation);
-                mNotificationService.cancelTextNotification(conversation.getContact().getPrimaryUri());
                 mAccountService.setMessageDisplayed(account.getAccountID(), conversation.getContact().getPrimaryNumber(), lastMessage);
+                if (cancelNotification) {
+                    mNotificationService.cancelTextNotification(conversation.getContact().getPrimaryUri());
+                }
             }
         }
     }