Update app
This commit is contained in:
parent
2aec14482b
commit
b0bf38a8aa
|
|
@ -134,18 +134,27 @@ public class ConfigManager {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isAddShortcut() {
|
public static Intent getLaunchIntentForManager() {
|
||||||
try {
|
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) {
|
} catch (RemoteException e) {
|
||||||
Log.e(App.TAG, Log.getStackTraceString(e));
|
Log.e(App.TAG, Log.getStackTraceString(e));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean setAddShortcut(boolean enabled) {
|
public static boolean setEnableStatusNotification(boolean enabled) {
|
||||||
try {
|
try {
|
||||||
LSPManagerServiceHolder.getService().setAddShortcut(enabled);
|
LSPManagerServiceHolder.getService().setEnableStatusNotification(enabled);
|
||||||
return true;
|
return true;
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(App.TAG, Log.getStackTraceString(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.databinding.FragmentHomeBinding;
|
||||||
import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder;
|
import org.lsposed.manager.ui.dialog.BlurBehindDialogBuilder;
|
||||||
import org.lsposed.manager.ui.dialog.FlashDialogBuilder;
|
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.NavUtil;
|
||||||
import org.lsposed.manager.util.Telemetry;
|
import org.lsposed.manager.util.Telemetry;
|
||||||
import org.lsposed.manager.util.UpdateUtil;
|
import org.lsposed.manager.util.UpdateUtil;
|
||||||
|
|
@ -61,7 +61,7 @@ public class HomeFragment extends BaseFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
ShortcutDialog.showIfNeed(getChildFragmentManager());
|
WelcomeDialog.showIfNeed(getChildFragmentManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -36,9 +36,6 @@ import androidx.annotation.Nullable;
|
||||||
import androidx.core.text.HtmlCompat;
|
import androidx.core.text.HtmlCompat;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
import rikka.material.preference.MaterialSwitchPreference;
|
|
||||||
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.color.DynamicColors;
|
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.ConfigManager;
|
||||||
import org.lsposed.manager.R;
|
import org.lsposed.manager.R;
|
||||||
import org.lsposed.manager.databinding.FragmentSettingsBinding;
|
import org.lsposed.manager.databinding.FragmentSettingsBinding;
|
||||||
import org.lsposed.manager.receivers.LSPManagerServiceHolder;
|
|
||||||
import org.lsposed.manager.repo.RepoLoader;
|
import org.lsposed.manager.repo.RepoLoader;
|
||||||
import org.lsposed.manager.ui.activity.MainActivity;
|
import org.lsposed.manager.ui.activity.MainActivity;
|
||||||
import org.lsposed.manager.util.BackupUtils;
|
import org.lsposed.manager.util.BackupUtils;
|
||||||
import org.lsposed.manager.util.LangList;
|
import org.lsposed.manager.util.LangList;
|
||||||
import org.lsposed.manager.util.NavUtil;
|
import org.lsposed.manager.util.NavUtil;
|
||||||
|
import org.lsposed.manager.util.ShortcutUtil;
|
||||||
import org.lsposed.manager.util.ThemeUtil;
|
import org.lsposed.manager.util.ThemeUtil;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
@ -63,6 +60,7 @@ import java.util.Locale;
|
||||||
import rikka.core.util.ResourceUtils;
|
import rikka.core.util.ResourceUtils;
|
||||||
import rikka.material.app.DayNightDelegate;
|
import rikka.material.app.DayNightDelegate;
|
||||||
import rikka.material.app.LocaleDelegate;
|
import rikka.material.app.LocaleDelegate;
|
||||||
|
import rikka.material.preference.MaterialSwitchPreference;
|
||||||
import rikka.preference.SimpleMenuPreference;
|
import rikka.preference.SimpleMenuPreference;
|
||||||
import rikka.recyclerview.RecyclerViewKt;
|
import rikka.recyclerview.RecyclerViewKt;
|
||||||
import rikka.widget.borderview.BorderRecyclerView;
|
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");
|
Preference shortcut = findPreference("add_shortcut");
|
||||||
if (shortcut != null) {
|
if (shortcut != null) {
|
||||||
shortcut.setEnabled(installed);
|
shortcut.setVisible(App.isParasitic());
|
||||||
|
shortcut.setEnabled(!ShortcutUtil.isLaunchShortcutPinned());
|
||||||
shortcut.setOnPreferenceClickListener(preference -> {
|
shortcut.setOnPreferenceClickListener(preference -> {
|
||||||
try {
|
ShortcutUtil.requestPinLaunchShortcut();
|
||||||
LSPManagerServiceHolder.getService().createShortcut();
|
|
||||||
} catch (Throwable ignored) {
|
|
||||||
}
|
|
||||||
return true;
|
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");
|
Preference backup = findPreference("backup");
|
||||||
if (backup != null) {
|
if (backup != null) {
|
||||||
backup.setEnabled(installed);
|
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="mount_failed">Mount failed</string>
|
||||||
<string name="selinux_permissive">SELinux is permissive</string>
|
<string name="selinux_permissive">SELinux is permissive</string>
|
||||||
<string name="sepolicy_incorrect">SELinux policy is incorrect</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">Update LSPosed</string>
|
||||||
<string name="update_lsposed_msg">Confirm to update LSPosed? This device will reboot after update completion</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 -->
|
<!-- LogsActivity -->
|
||||||
<string name="menuSaveToSd">Save</string>
|
<string name="menuSaveToSd">Save</string>
|
||||||
<string name="nav_item_logs_verbose">Verbose Logs</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_contributors">Translation contributors</string>
|
||||||
<string name="settings_translation">Participate in translation</string>
|
<string name="settings_translation">Participate in translation</string>
|
||||||
<string name="settings_translation_summary">Help us translate %s into your language</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="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="settings_update_channel">Update channel</string>
|
||||||
<string name="update_channel_stable">Stable</string>
|
<string name="update_channel_stable">Stable</string>
|
||||||
<string name="update_channel_bate">Beta</string>
|
<string name="update_channel_bate">Beta</string>
|
||||||
|
|
|
||||||
|
|
@ -106,11 +106,11 @@
|
||||||
|
|
||||||
<rikka.material.preference.MaterialSwitchPreference
|
<rikka.material.preference.MaterialSwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:icon="@drawable/ic_outline_add_to_home_screen_24"
|
android:icon="@drawable/ic_outline_speaker_notes_24"
|
||||||
android:key="enable_auto_add_shortcut"
|
android:key="enable_status_notification"
|
||||||
android:persistent="false"
|
android:persistent="false"
|
||||||
android:summary="@string/settings_enable_auto_add_shortcut_summary"
|
android:summary="@string/settings_enable_status_notification_summary"
|
||||||
android:title="@string/pref_title_enable_auto_add_shortcut" />
|
android:title="@string/settings_enable_status_notification" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory android:title="@string/settings_group_repo">
|
<PreferenceCategory android:title="@string/settings_group_repo">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue