diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index dcc669c7..a8933fe6 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -164,7 +164,7 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter tmpChkList) { + private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals app, HashSet tmpChkList) { if (info.packageName.equals("android")) { return false; } diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java index 28e4e8c3..f58c169d 100644 --- a/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java +++ b/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java @@ -23,13 +23,13 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.KeyEvent; import android.view.MotionEvent; import androidx.annotation.NonNull; -import androidx.core.os.BuildCompat; import androidx.navigation.NavController; import androidx.navigation.NavOptions; import androidx.navigation.Navigation; @@ -45,6 +45,7 @@ import org.lsposed.manager.databinding.ActivityMainBinding; import org.lsposed.manager.repo.RepoLoader; import org.lsposed.manager.ui.activity.base.BaseActivity; import org.lsposed.manager.util.ModuleUtil; +import org.lsposed.manager.util.ShortcutUtil; import org.lsposed.manager.util.UpdateUtil; import java.util.HashSet; @@ -153,7 +154,7 @@ public class MainActivity extends BaseActivity implements RepoLoader.RepoListene } public void restart() { - if (BuildCompat.isAtLeastS() || App.isParasitic()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || App.isParasitic()) { recreate(); } else { try { @@ -262,6 +263,9 @@ public class MainActivity extends BaseActivity implements RepoLoader.RepoListene } } } + if(App.isParasitic()){ + ShortcutUtil.updateShortcut(); + } } private void setModulesSummary(int moduleCount) { diff --git a/app/src/main/java/org/lsposed/manager/ui/dialog/WelcomeDialog.java b/app/src/main/java/org/lsposed/manager/ui/dialog/WelcomeDialog.java index 1a2741d5..7bd3453e 100644 --- a/app/src/main/java/org/lsposed/manager/ui/dialog/WelcomeDialog.java +++ b/app/src/main/java/org/lsposed/manager/ui/dialog/WelcomeDialog.java @@ -17,19 +17,24 @@ public class WelcomeDialog extends DialogFragment { private static boolean shown = false; private Dialog parasiticDialog(BlurBehindDialogBuilder builder) { - return builder + var shortcutSupported = ShortcutUtil.isRequestPinShortcutSupported(requireContext()); + builder .setTitle(R.string.parasitic_welcome) - .setMessage(R.string.parasitic_welcome_summary) + .setMessage(shortcutSupported ? R.string.parasitic_welcome_summary : + R.string.parasitic_welcome_summary_no_shortcut_support) .setNegativeButton(R.string.never_show, (dialog, which) -> App.getPreferences().edit().putBoolean("never_show_welcome", true).apply()) - .setNeutralButton(R.string.create_shortcut, (dialog, which) -> - ShortcutUtil.requestPinLaunchShortcut(() -> - App.getPreferences().edit().putBoolean("never_show_welcome", true).apply())) - .setPositiveButton(android.R.string.ok, null) - .create(); + .setPositiveButton(android.R.string.ok, null); + if (shortcutSupported) + builder.setNeutralButton(R.string.create_shortcut, (dialog, which) -> + ShortcutUtil.requestPinLaunchShortcut(() -> + App.getPreferences().edit().putBoolean("never_show_welcome", + true).apply())); + return builder.create(); } private Dialog appDialog(BlurBehindDialogBuilder builder) { + return builder .setTitle(R.string.app_welcome) .setMessage(R.string.app_welcome_summary) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index 3ba7454f..b60a757c 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -174,7 +174,7 @@ public class SettingsFragment extends BaseFragment { Preference shortcut = findPreference("add_shortcut"); if (shortcut != null) { - shortcut.setVisible(App.isParasitic()); + shortcut.setVisible(App.isParasitic() && ShortcutUtil.isRequestPinShortcutSupported(requireContext())); if (ShortcutUtil.isLaunchShortcutPinned()) { shortcut.setEnabled(false); shortcut.setSummary(R.string.settings_created_shortcut_summary); diff --git a/app/src/main/java/org/lsposed/manager/util/ShortcutUtil.java b/app/src/main/java/org/lsposed/manager/util/ShortcutUtil.java index 6b66e4c1..5bf178a4 100644 --- a/app/src/main/java/org/lsposed/manager/util/ShortcutUtil.java +++ b/app/src/main/java/org/lsposed/manager/util/ShortcutUtil.java @@ -19,10 +19,13 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.graphics.drawable.LayerDrawable; import android.os.Build; +import android.util.Log; import org.lsposed.manager.App; import org.lsposed.manager.R; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; public class ShortcutUtil { @@ -30,7 +33,7 @@ public class ShortcutUtil { private static Bitmap getBitmap(Context context, int id) { var r = context.getResources(); - var res = r.getDrawable(id, r.newTheme()); + var res = r.getDrawable(id, context.getTheme()); if (res instanceof BitmapDrawable) { return ((BitmapDrawable) res).getBitmap(); } else { @@ -108,20 +111,42 @@ public class ShortcutUtil { return PendingIntent.getBroadcast(context, 0, intent, flags).getIntentSender(); } - public static void requestPinLaunchShortcut(Runnable afterPinned) { - if (!App.isParasitic()) throw new RuntimeException(); - var context = App.getInstance(); + private static ShortcutInfo.Builder getShortcutBuilder(Context context) { var builder = new ShortcutInfo.Builder(context, SHORTCUT_ID) .setShortLabel(context.getString(R.string.app_name)) .setIntent(getLaunchIntent(context)) - .setIcon(Icon.createWithAdaptiveBitmap(getBitmap(context, R.drawable.ic_launcher))); + .setIcon(Icon.createWithAdaptiveBitmap(getBitmap(context, + R.drawable.ic_launcher))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { var activity = new ComponentName(context.getPackageName(), "android.app.AppDetailsActivity"); builder.setActivity(activity); } + return builder; + } + + public static boolean isRequestPinShortcutSupported(Context context) { var sm = context.getSystemService(ShortcutManager.class); - sm.requestPinShortcut(builder.build(), registerReceiver(context, afterPinned)); + return sm.isRequestPinShortcutSupported(); + } + + public static void requestPinLaunchShortcut(Runnable afterPinned) { + if (!App.isParasitic()) throw new RuntimeException(); + var context = App.getInstance(); + var sm = context.getSystemService(ShortcutManager.class); + if (!isRequestPinShortcutSupported(context)) return; + sm.requestPinShortcut(getShortcutBuilder(context).build(), + registerReceiver(context, afterPinned)); + } + + public static boolean updateShortcut() { + if (!isLaunchShortcutPinned()) return false; + Log.d(App.TAG, "update shortcut"); + var context = App.getInstance(); + var sm = context.getSystemService(ShortcutManager.class); + List shortcutInfoList = new ArrayList<>(); + shortcutInfoList.add(getShortcutBuilder(context).build()); + return sm.updateShortcuts(shortcutInfoList); } public static boolean isLaunchShortcutPinned() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 723daffc..c311a883 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,6 +80,7 @@ Welcome to LSPosed You are using the parasitic manager, which can create shortcut or still open from notification. + You are using the parasitic manager, which can open from notification. Create shortcut Never show Parasitic Manager Recommended