Update app
This commit is contained in:
parent
2aec14482b
commit
b0bf38a8aa
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Reference in New Issue