Update shortcut when resume MainActivity (#2285)

This commit is contained in:
Howard Wu 2022-12-06 21:26:12 +08:00 committed by GitHub
parent afa1eb0bf9
commit 47a991db8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 52 additions and 17 deletions

View File

@ -164,7 +164,7 @@ public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<Scope
return new ViewHolder(ItemModuleBinding.inflate(activity.getLayoutInflater(), parent, false)); return new ViewHolder(ItemModuleBinding.inflate(activity.getLayoutInflater(), parent, false));
} }
private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals app, HashSet<ScopeAdapter.ApplicationWithEquals> tmpChkList) { private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals app, HashSet<ApplicationWithEquals> tmpChkList) {
if (info.packageName.equals("android")) { if (info.packageName.equals("android")) {
return false; return false;
} }

View File

@ -23,13 +23,13 @@ import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.os.BuildCompat;
import androidx.navigation.NavController; import androidx.navigation.NavController;
import androidx.navigation.NavOptions; import androidx.navigation.NavOptions;
import androidx.navigation.Navigation; import androidx.navigation.Navigation;
@ -45,6 +45,7 @@ import org.lsposed.manager.databinding.ActivityMainBinding;
import org.lsposed.manager.repo.RepoLoader; import org.lsposed.manager.repo.RepoLoader;
import org.lsposed.manager.ui.activity.base.BaseActivity; import org.lsposed.manager.ui.activity.base.BaseActivity;
import org.lsposed.manager.util.ModuleUtil; import org.lsposed.manager.util.ModuleUtil;
import org.lsposed.manager.util.ShortcutUtil;
import org.lsposed.manager.util.UpdateUtil; import org.lsposed.manager.util.UpdateUtil;
import java.util.HashSet; import java.util.HashSet;
@ -153,7 +154,7 @@ public class MainActivity extends BaseActivity implements RepoLoader.RepoListene
} }
public void restart() { public void restart() {
if (BuildCompat.isAtLeastS() || App.isParasitic()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || App.isParasitic()) {
recreate(); recreate();
} else { } else {
try { try {
@ -262,6 +263,9 @@ public class MainActivity extends BaseActivity implements RepoLoader.RepoListene
} }
} }
} }
if(App.isParasitic()){
ShortcutUtil.updateShortcut();
}
} }
private void setModulesSummary(int moduleCount) { private void setModulesSummary(int moduleCount) {

View File

@ -17,19 +17,24 @@ public class WelcomeDialog extends DialogFragment {
private static boolean shown = false; private static boolean shown = false;
private Dialog parasiticDialog(BlurBehindDialogBuilder builder) { private Dialog parasiticDialog(BlurBehindDialogBuilder builder) {
return builder var shortcutSupported = ShortcutUtil.isRequestPinShortcutSupported(requireContext());
builder
.setTitle(R.string.parasitic_welcome) .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) -> .setNegativeButton(R.string.never_show, (dialog, which) ->
App.getPreferences().edit().putBoolean("never_show_welcome", true).apply()) App.getPreferences().edit().putBoolean("never_show_welcome", true).apply())
.setNeutralButton(R.string.create_shortcut, (dialog, which) -> .setPositiveButton(android.R.string.ok, null);
ShortcutUtil.requestPinLaunchShortcut(() -> if (shortcutSupported)
App.getPreferences().edit().putBoolean("never_show_welcome", true).apply())) builder.setNeutralButton(R.string.create_shortcut, (dialog, which) ->
.setPositiveButton(android.R.string.ok, null) ShortcutUtil.requestPinLaunchShortcut(() ->
.create(); App.getPreferences().edit().putBoolean("never_show_welcome",
true).apply()));
return builder.create();
} }
private Dialog appDialog(BlurBehindDialogBuilder builder) { private Dialog appDialog(BlurBehindDialogBuilder builder) {
return builder return builder
.setTitle(R.string.app_welcome) .setTitle(R.string.app_welcome)
.setMessage(R.string.app_welcome_summary) .setMessage(R.string.app_welcome_summary)

View File

@ -174,7 +174,7 @@ public class SettingsFragment extends BaseFragment {
Preference shortcut = findPreference("add_shortcut"); Preference shortcut = findPreference("add_shortcut");
if (shortcut != null) { if (shortcut != null) {
shortcut.setVisible(App.isParasitic()); shortcut.setVisible(App.isParasitic() && ShortcutUtil.isRequestPinShortcutSupported(requireContext()));
if (ShortcutUtil.isLaunchShortcutPinned()) { if (ShortcutUtil.isLaunchShortcutPinned()) {
shortcut.setEnabled(false); shortcut.setEnabled(false);
shortcut.setSummary(R.string.settings_created_shortcut_summary); shortcut.setSummary(R.string.settings_created_shortcut_summary);

View File

@ -19,10 +19,13 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LayerDrawable;
import android.os.Build; import android.os.Build;
import android.util.Log;
import org.lsposed.manager.App; import org.lsposed.manager.App;
import org.lsposed.manager.R; import org.lsposed.manager.R;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; import java.util.UUID;
public class ShortcutUtil { public class ShortcutUtil {
@ -30,7 +33,7 @@ public class ShortcutUtil {
private static Bitmap getBitmap(Context context, int id) { private static Bitmap getBitmap(Context context, int id) {
var r = context.getResources(); var r = context.getResources();
var res = r.getDrawable(id, r.newTheme()); var res = r.getDrawable(id, context.getTheme());
if (res instanceof BitmapDrawable) { if (res instanceof BitmapDrawable) {
return ((BitmapDrawable) res).getBitmap(); return ((BitmapDrawable) res).getBitmap();
} else { } else {
@ -108,20 +111,42 @@ public class ShortcutUtil {
return PendingIntent.getBroadcast(context, 0, intent, flags).getIntentSender(); return PendingIntent.getBroadcast(context, 0, intent, flags).getIntentSender();
} }
public static void requestPinLaunchShortcut(Runnable afterPinned) { private static ShortcutInfo.Builder getShortcutBuilder(Context context) {
if (!App.isParasitic()) throw new RuntimeException();
var context = App.getInstance();
var builder = new ShortcutInfo.Builder(context, SHORTCUT_ID) var builder = new ShortcutInfo.Builder(context, SHORTCUT_ID)
.setShortLabel(context.getString(R.string.app_name)) .setShortLabel(context.getString(R.string.app_name))
.setIntent(getLaunchIntent(context)) .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) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
var activity = new ComponentName(context.getPackageName(), var activity = new ComponentName(context.getPackageName(),
"android.app.AppDetailsActivity"); "android.app.AppDetailsActivity");
builder.setActivity(activity); builder.setActivity(activity);
} }
return builder;
}
public static boolean isRequestPinShortcutSupported(Context context) {
var sm = context.getSystemService(ShortcutManager.class); 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<ShortcutInfo> shortcutInfoList = new ArrayList<>();
shortcutInfoList.add(getShortcutBuilder(context).build());
return sm.updateShortcuts(shortcutInfoList);
} }
public static boolean isLaunchShortcutPinned() { public static boolean isLaunchShortcutPinned() {

View File

@ -80,6 +80,7 @@
<!-- WelcomeDialog --> <!-- WelcomeDialog -->
<string name="parasitic_welcome">Welcome to LSPosed</string> <string name="parasitic_welcome">Welcome to LSPosed</string>
<string name="parasitic_welcome_summary">You are using the parasitic manager, which can create shortcut or still open from notification.</string> <string name="parasitic_welcome_summary">You are using the parasitic manager, which can create shortcut or still open from notification.</string>
<string name="parasitic_welcome_summary_no_shortcut_support">You are using the parasitic manager, which can open from notification.</string>
<string name="create_shortcut">Create shortcut</string> <string name="create_shortcut">Create shortcut</string>
<string name="never_show">Never show</string> <string name="never_show">Never show</string>
<string name="app_welcome">Parasitic Manager Recommended</string> <string name="app_welcome">Parasitic Manager Recommended</string>