Update app

This commit is contained in:
vvb2060 2022-12-03 01:25:46 +08:00 committed by LoveSy
parent 2aec14482b
commit b0bf38a8aa
9 changed files with 187 additions and 96 deletions

View File

@ -134,18 +134,27 @@ public class ConfigManager {
return list;
}
public static boolean isAddShortcut() {
public static Intent getLaunchIntentForManager() {
try {
return LSPManagerServiceHolder.getService().isAddShortcut();
return LSPManagerServiceHolder.getService().getLaunchIntentForManager();
} catch (RemoteException e) {
Log.e(App.TAG, Log.getStackTraceString(e));
return null;
}
}
public static boolean enableStatusNotification() {
try {
return LSPManagerServiceHolder.getService().enableStatusNotification();
} catch (RemoteException e) {
Log.e(App.TAG, Log.getStackTraceString(e));
return false;
}
}
public static boolean setAddShortcut(boolean enabled) {
public static boolean setEnableStatusNotification(boolean enabled) {
try {
LSPManagerServiceHolder.getService().setAddShortcut(enabled);
LSPManagerServiceHolder.getService().setEnableStatusNotification(enabled);
return true;
} catch (RemoteException e) {
Log.e(App.TAG, Log.getStackTraceString(e));

View File

@ -1,63 +0,0 @@
/*
* This file is part of LSPosed.
*
* LSPosed 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.
*
* LSPosed 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 LSPosed. If not, see <https://www.gnu.org/licenses/>.
*
* Copyright (C) 2021 LSPosed Contributors
*/
package org.lsposed.manager.ui.dialog;
import android.app.Dialog;
import android.os.Bundle;
import android.os.RemoteException;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import org.lsposed.manager.App;
import org.lsposed.manager.ConfigManager;
import org.lsposed.manager.R;
import org.lsposed.manager.receivers.LSPManagerServiceHolder;
public class ShortcutDialog extends DialogFragment {
private static boolean shown = false;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
return new BlurBehindDialogBuilder(requireContext(), R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons)
.setTitle(R.string.parasitic_recommend)
.setMessage(R.string.parasitic_recommend_summary)
.setNegativeButton(R.string.never_show, (dialog, which) ->
App.getPreferences().edit().putBoolean("never_show_shortcut", true).apply())
.setNeutralButton(R.string.create_shortcut, (dialog, which) -> {
try {
LSPManagerServiceHolder.getService().createShortcut();
} catch (RemoteException ignored) {
}
})
.setPositiveButton(android.R.string.ok, null).create();
}
public static void showIfNeed(FragmentManager fm) {
if (App.isParasitic() || !ConfigManager.isBinderAlive()) return;
if (App.getPreferences().getBoolean("never_show_shortcut", false)) return;
if (shown) return;
shown = true;
new ShortcutDialog().show(fm, "shortcut");
}
}

View File

@ -0,0 +1,60 @@
package org.lsposed.manager.ui.dialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import org.lsposed.manager.App;
import org.lsposed.manager.ConfigManager;
import org.lsposed.manager.R;
import org.lsposed.manager.util.ShortcutUtil;
public class WelcomeDialog extends DialogFragment {
private static boolean shown = false;
private Dialog parasiticDialog(BlurBehindDialogBuilder builder) {
return builder
.setTitle(R.string.parasitic_welcome)
.setMessage(R.string.parasitic_welcome_summary)
.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())
.setPositiveButton(android.R.string.ok, null)
.create();
}
private Dialog appDialog(BlurBehindDialogBuilder builder) {
return builder
.setTitle(R.string.app_welcome)
.setMessage(R.string.app_welcome_summary)
.setNegativeButton(R.string.never_show, (d, w) ->
App.getPreferences().edit().putBoolean("never_show_welcome", true).apply())
.setPositiveButton(android.R.string.ok, null)
.create();
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
var builder = new BlurBehindDialogBuilder(requireContext(),
R.style.ThemeOverlay_MaterialAlertDialog_Centered_FullWidthButtons);
if (App.isParasitic()) {
return parasiticDialog(builder);
} else {
return appDialog(builder);
}
}
public static void showIfNeed(FragmentManager fm) {
if (shown) return;
if (!ConfigManager.isBinderAlive()) return;
if (App.getPreferences().getBoolean("never_show_welcome", false)) return;
new WelcomeDialog().show(fm, "welcome");
shown = true;
}
}

View File

@ -42,7 +42,7 @@ import org.lsposed.manager.databinding.DialogAboutBinding;
import org.lsposed.manager.databinding.FragmentHomeBinding;
import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder;
import org.lsposed.manager.ui.dialog.FlashDialogBuilder;
import org.lsposed.manager.ui.dialog.ShortcutDialog;
import org.lsposed.manager.ui.dialog.WelcomeDialog;
import org.lsposed.manager.util.NavUtil;
import org.lsposed.manager.util.Telemetry;
import org.lsposed.manager.util.UpdateUtil;
@ -61,7 +61,7 @@ public class HomeFragment extends BaseFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ShortcutDialog.showIfNeed(getChildFragmentManager());
WelcomeDialog.showIfNeed(getChildFragmentManager());
}
@Override

View File

@ -36,9 +36,6 @@ import androidx.annotation.Nullable;
import androidx.core.text.HtmlCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import rikka.material.preference.MaterialSwitchPreference;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.color.DynamicColors;
@ -48,12 +45,12 @@ import org.lsposed.manager.BuildConfig;
import org.lsposed.manager.ConfigManager;
import org.lsposed.manager.R;
import org.lsposed.manager.databinding.FragmentSettingsBinding;
import org.lsposed.manager.receivers.LSPManagerServiceHolder;
import org.lsposed.manager.repo.RepoLoader;
import org.lsposed.manager.ui.activity.MainActivity;
import org.lsposed.manager.util.BackupUtils;
import org.lsposed.manager.util.LangList;
import org.lsposed.manager.util.NavUtil;
import org.lsposed.manager.util.ShortcutUtil;
import org.lsposed.manager.util.ThemeUtil;
import java.time.LocalDateTime;
@ -63,6 +60,7 @@ import java.util.Locale;
import rikka.core.util.ResourceUtils;
import rikka.material.app.DayNightDelegate;
import rikka.material.app.LocaleDelegate;
import rikka.material.preference.MaterialSwitchPreference;
import rikka.preference.SimpleMenuPreference;
import rikka.recyclerview.RecyclerViewKt;
import rikka.widget.borderview.BorderRecyclerView;
@ -159,26 +157,31 @@ public class SettingsFragment extends BaseFragment {
});
}
MaterialSwitchPreference prefEnableShortcut = findPreference("enable_auto_add_shortcut");
if (prefEnableShortcut != null) {
prefEnableShortcut.setEnabled(installed);
prefEnableShortcut.setVisible(!App.isParasitic());
prefEnableShortcut.setChecked(installed && ConfigManager.isAddShortcut());
prefEnableShortcut.setOnPreferenceChangeListener((preference, newValue) -> ConfigManager.setAddShortcut((boolean) newValue));
}
Preference shortcut = findPreference("add_shortcut");
if (shortcut != null) {
shortcut.setEnabled(installed);
shortcut.setVisible(App.isParasitic());
shortcut.setEnabled(!ShortcutUtil.isLaunchShortcutPinned());
shortcut.setOnPreferenceClickListener(preference -> {
try {
LSPManagerServiceHolder.getService().createShortcut();
} catch (Throwable ignored) {
}
ShortcutUtil.requestPinLaunchShortcut();
return true;
});
}
MaterialSwitchPreference notification = findPreference("enable_status_notification");
if (notification != null) {
if (App.isParasitic() && !ShortcutUtil.isLaunchShortcutPinned()) {
var s = notification.getContext().getString(R.string.disable_status_notification_error);
notification.setSummaryOn(notification.getSummary() + "\n" + s);
notification.setEnabled(false);
} else {
notification.setEnabled(installed);
}
notification.setChecked(installed && ConfigManager.enableStatusNotification());
notification.setOnPreferenceChangeListener((p, v) ->
ConfigManager.setEnableStatusNotification((boolean) v)
);
}
Preference backup = findPreference("backup");
if (backup != null) {
backup.setEnabled(installed);

View File

@ -0,0 +1,65 @@
package org.lsposed.manager.util;
import android.content.Context;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.graphics.drawable.LayerDrawable;
import org.lsposed.manager.App;
import org.lsposed.manager.ConfigManager;
import org.lsposed.manager.R;
public class ShortcutUtil {
private static final String SHORTCUT_ID = "org.lsposed.manager.shortcut";
private static Bitmap getBitmap(Context context, int id) {
var r = context.getResources();
var res = r.getDrawable(id, r.newTheme());
if (res instanceof BitmapDrawable) {
return ((BitmapDrawable) res).getBitmap();
} else {
if (res instanceof AdaptiveIconDrawable) {
var layers = new Drawable[]{((AdaptiveIconDrawable) res).getBackground(),
((AdaptiveIconDrawable) res).getForeground()};
res = new LayerDrawable(layers);
}
var bitmap = Bitmap.createBitmap(res.getIntrinsicWidth(),
res.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
var canvas = new Canvas(bitmap);
res.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
res.draw(canvas);
return bitmap;
}
}
public static void requestPinLaunchShortcut() {
var context= App.getInstance();
var intent = ConfigManager.getLaunchIntentForManager();
var info = new ShortcutInfo.Builder(context, SHORTCUT_ID)
.setShortLabel(context.getString(R.string.app_name))
.setIntent(intent)
.setIcon(Icon.createWithAdaptiveBitmap(getBitmap(context, R.drawable.ic_launcher)))
.build();
var sm = context.getSystemService(ShortcutManager.class);
sm.requestPinShortcut(info, null);
}
public static boolean isLaunchShortcutPinned() {
var context= App.getInstance();
var sm = context.getSystemService(ShortcutManager.class);
boolean pinned = false;
for (var info : sm.getPinnedShortcuts()) {
if (SHORTCUT_ID.equals(info.getId())) {
pinned = true;
break;
}
}
return pinned;
}
}

View File

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,16L5.17,16l-0.59,0.59 -0.58,0.58L4,4h16v12zM6,12h2v2L6,14zM6,9h2v2L6,11zM6,6h2v2L6,8zM10,12h5v2h-5zM10,9h8v2h-8zM10,6h8v2h-8z" />
</vector>

View File

@ -73,13 +73,17 @@
<string name="mount_failed">Mount failed</string>
<string name="selinux_permissive">SELinux is permissive</string>
<string name="sepolicy_incorrect">SELinux policy is incorrect</string>
<string name="parasitic_recommend">Parasitic Manager Recommended</string>
<string name="parasitic_recommend_summary">LSPosed now supports system parasitization to avoid detection. You can safely uninstall the manager after successfully creating a shortcut of the parasitic manager. In any case you can install the manager back from /data/adb/lspd/manager.apk.</string>
<string name="create_shortcut">Create shortcut</string>
<string name="never_show">Never show</string>
<string name="update_lsposed">Update LSPosed</string>
<string name="update_lsposed_msg">Confirm to update LSPosed? This device will reboot after update completion</string>
<!-- WelcomeDialog -->
<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="create_shortcut">Create shortcut</string>
<string name="never_show">Never show</string>
<string name="app_welcome">Parasitic Manager Recommended</string>
<string name="app_welcome_summary">LSPosed now supports system parasitization to avoid detection, you can open parasitic manager from notification. It is recommended to uninstall the current application.</string>
<!-- LogsActivity -->
<string name="menuSaveToSd">Save</string>
<string name="nav_item_logs_verbose">Verbose Logs</string>
@ -190,9 +194,11 @@
<string name="settings_translation_contributors">Translation contributors</string>
<string name="settings_translation">Participate in translation</string>
<string name="settings_translation_summary">Help us translate %s into your language</string>
<string name="pref_title_enable_auto_add_shortcut">Automatically add a shortcut</string>
<string name="create_shortcut_summary">Manually create parasitic manager shortcut</string>
<string name="settings_enable_auto_add_shortcut_summary">No new shortcuts will be added when disabled in the non-parasitic manager</string>
<string name="open_parasitic_summary">Recommended use parasitic manager</string>
<string name="settings_enable_status_notification">Status Notification</string>
<string name="settings_enable_status_notification_summary">Show a notification that can open parasitic manager</string>
<string name="disable_status_notification_error">No shortcut, cannot disable notification</string>
<string name="settings_update_channel">Update channel</string>
<string name="update_channel_stable">Stable</string>
<string name="update_channel_bate">Beta</string>

View File

@ -106,11 +106,11 @@
<rikka.material.preference.MaterialSwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_outline_add_to_home_screen_24"
android:key="enable_auto_add_shortcut"
android:icon="@drawable/ic_outline_speaker_notes_24"
android:key="enable_status_notification"
android:persistent="false"
android:summary="@string/settings_enable_auto_add_shortcut_summary"
android:title="@string/pref_title_enable_auto_add_shortcut" />
android:summary="@string/settings_enable_status_notification_summary"
android:title="@string/settings_enable_status_notification" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/settings_group_repo">