From b53e0bc42319a111ba13e490fe4ad7d419e2f71d Mon Sep 17 00:00:00 2001
From: Amirhossein <amirhossein.naghshzan@savoirfairelinux.com>
Date: Thu, 4 Mar 2021 15:02:56 -0500
Subject: [PATCH] manifest: support direct share backward compatibility

Change-Id: I13b799f6728404ae68b8a319e662fe88c8adcc50
---
 ring-android/app/build.gradle                 |   1 +
 ring-android/app/proguard-rules.pro           |   1 +
 ring-android/app/src/main/AndroidManifest.xml |  12 +-
 .../java/cx/ring/client/HomeActivity.java     |   3 +-
 .../JamiInjectionComponent.java               |   3 -
 .../services/JamiChooserTargetService.java    | 105 ------------------
 .../services/NotificationServiceImpl.java     |   1 -
 7 files changed, 5 insertions(+), 121 deletions(-)
 delete mode 100644 ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java

diff --git a/ring-android/app/build.gradle b/ring-android/app/build.gradle
index 0d20992e3..ceed8e49c 100644
--- a/ring-android/app/build.gradle
+++ b/ring-android/app/build.gradle
@@ -97,6 +97,7 @@ dependencies {
     implementation "com.google.android.material:material:1.3.0"
     implementation 'com.google.android:flexbox:1.1.1'
     implementation 'org.osmdroid:osmdroid-android:6.1.10'
+    implementation "androidx.sharetarget:sharetarget:1.1.0"
 
     // ORM
     implementation 'com.j256.ormlite:ormlite-android:5.3'
diff --git a/ring-android/app/proguard-rules.pro b/ring-android/app/proguard-rules.pro
index c7ae3c9ac..4d0ed664e 100644
--- a/ring-android/app/proguard-rules.pro
+++ b/ring-android/app/proguard-rules.pro
@@ -9,6 +9,7 @@
 -keepattributes SourceFile,LineNumberTable
 
 -keep,includedescriptorclasses class androidx.core.content.FileProvider { *; }
+-keep,includedescriptorclasses class androidx.sharetarget.* { *; }
 
 -keepnames class * implements android.os.Parcelable {
     public static final ** CREATOR;
diff --git a/ring-android/app/src/main/AndroidManifest.xml b/ring-android/app/src/main/AndroidManifest.xml
index b3f02d00c..acca127b1 100644
--- a/ring-android/app/src/main/AndroidManifest.xml
+++ b/ring-android/app/src/main/AndroidManifest.xml
@@ -159,7 +159,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
             <meta-data
                 android:name="android.service.chooser.chooser_target_service"
-                android:value=".services.JamiChooserTargetService" />
+                android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
         </activity>
         <activity
             android:name=".account.AccountWizardActivity"
@@ -412,16 +412,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
             android:icon="@mipmap/ic_launcher"
             android:theme="@style/AppThemeBase.Dark" />
 
-        <service
-            android:name=".services.JamiChooserTargetService"
-            android:label="ChooserTargetService"
-            android:icon="@mipmap/ic_launcher"
-            android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
-            <intent-filter>
-                <action android:name="android.service.chooser.ChooserTargetService" />
-            </intent-filter>
-        </service>
-
         <service
             android:name=".service.JamiJobService"
             android:permission="android.permission.BIND_JOB_SERVICE" />
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 4674dd3c1..246c2d944 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
@@ -354,7 +354,7 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(count -> setBadge(R.id.navigation_home, count))));
 
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             mDisposable.add((mAccountService
                     .getCurrentAccountSubject()
                     .observeOn(Schedulers.computation())
@@ -809,6 +809,7 @@ public class HomeActivity extends AppCompatActivity implements BottomNavigationV
             i++;
         }
 
+        Log.w(TAG, "ShortcutManagerCompat.addDynamicShortcuts " + shortcutInfoList.size());
         ShortcutManagerCompat.removeAllDynamicShortcuts(this);
         ShortcutManagerCompat.addDynamicShortcuts(this, shortcutInfoList);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionComponent.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionComponent.java
index 0e09a4d2f..32e31932b 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionComponent.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionComponent.java
@@ -68,7 +68,6 @@ import cx.ring.services.HardwareService;
 import cx.ring.services.HistoryServiceImpl;
 import cx.ring.services.LocationSharingService;
 import cx.ring.services.NotificationServiceImpl;
-import cx.ring.services.JamiChooserTargetService;
 import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.services.SyncService;
 import cx.ring.settings.AccountFragment;
@@ -220,8 +219,6 @@ public interface JamiInjectionComponent {
 
     void inject(TVSettingsFragment.PrefsFragment prefsFragment);
 
-    void inject(JamiChooserTargetService service);
-
     void inject(LocationSharingFragment service);
 
     void inject(JamiJobService service);
diff --git a/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java b/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java
deleted file mode 100644
index 551df4a7c..000000000
--- a/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (C) 2004-2020 Savoir-faire Linux Inc.
- *
- *  Author: 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.services;
-
-import android.content.ComponentName;
-import android.content.IntentFilter;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Icon;
-import android.os.Build;
-import android.os.Bundle;
-import android.service.chooser.ChooserTarget;
-import android.service.chooser.ChooserTargetService;
-import android.util.Log;
-
-import androidx.annotation.RequiresApi;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import cx.ring.application.JamiApplication;
-import cx.ring.contacts.AvatarFactory;
-import cx.ring.facades.ConversationFacade;
-import cx.ring.fragments.ConversationFragment;
-import cx.ring.model.CallContact;
-import cx.ring.model.Conversation;
-import io.reactivex.schedulers.Schedulers;
-
-@RequiresApi(api = Build.VERSION_CODES.M)
-public class JamiChooserTargetService extends ChooserTargetService {
-
-    @Inject
-    @Singleton
-    ConversationFacade conversationFacade;
-
-    private int targetSize;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        JamiApplication.getInstance().startDaemon();
-        JamiApplication.getInstance().getInjectionComponent().inject(this);
-        targetSize = (int) (AvatarFactory.SIZE_NOTIF * getResources().getDisplayMetrics().density);
-    }
-
-    @Override
-    public List<ChooserTarget> onGetChooserTargets(ComponentName componentName, IntentFilter intentFilter) {
-        return conversationFacade
-                .getCurrentAccountSubject()
-                .firstOrError()
-                .flatMap(a -> a
-                        .getConversationsSubject()
-                        .firstOrError()
-                        .map(conversations -> {
-                            List<Future<Bitmap>> futureIcons = new ArrayList<>(conversations.size());
-                            for (Conversation conversation : conversations) {
-                                CallContact contact = conversation.getContact();
-                                futureIcons.add(AvatarFactory.getBitmapAvatar(this, contact, targetSize)
-                                        .subscribeOn(Schedulers.computation())
-                                        .toFuture());
-                            }
-                            int i=0;
-                            List<ChooserTarget> choosers = new ArrayList<>(conversations.size());
-                            for (Conversation conversation : conversations) {
-                                CallContact contact = conversation.getContact();
-                                Bundle bundle = new Bundle();
-                                bundle.putString(ConversationFragment.KEY_ACCOUNT_ID, a.getAccountID());
-                                bundle.putString(ConversationFragment.KEY_CONTACT_RING_ID, contact.getPrimaryNumber());
-                                Icon icon = null;
-                                try {
-                                    icon = Icon.createWithBitmap(futureIcons.get(i).get());
-                                } catch (Exception e) {
-                                    Log.w("RingChooserService", "Failed to load icon", e);
-                                }
-                                ChooserTarget target = new ChooserTarget(contact.getDisplayName(), icon, 1.f-(i/(float)conversations.size()), componentName, bundle);
-                                choosers.add(target);
-                                i++;
-                            }
-                            return choosers;
-                        }))
-                .timeout(5, TimeUnit.SECONDS)
-                .onErrorReturn(e -> new ArrayList<>())
-                .blockingGet();
-    }
-}
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 7528e861f..db7e9ea19 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
@@ -558,7 +558,6 @@ public class NotificationServiceImpl implements NotificationService {
                     .setIntent(PendingIntent.getActivity(mContext, 0, intentBubble,
                             PendingIntent.FLAG_UPDATE_CURRENT))
                     .build())
-                    .addPerson(contactPerson.getUri())
                     .setShortcutId(key);
         }
 
-- 
GitLab