From 61a294ed027ce0b9585ef35525dc713321520d3a Mon Sep 17 00:00:00 2001 From: TherayTharow Date: Sun, 8 Sep 2024 19:25:57 +0000 Subject: [PATCH 1/5] Added Lineage and motorola settings database sections TODO: hide Unavailable Settings Databases Manifest Lists Used queries --- app/src/main/AndroidManifest.xml | 11 +++++++++++ .../muntashirakon/setedit/EditorUtils.java | 12 ++++++++++++ .../muntashirakon/setedit/SettingsType.java | 17 +++++++++++++---- .../github/muntashirakon/setedit/TableType.java | 12 +++++++++--- .../muntashirakon/setedit/TableTypeInt.java | 6 ++++++ .../setedit/adapters/AdapterProvider.java | 12 ++++++++++++ .../adapters/SettingsRecyclerAdapter.java | 14 +++++++++++++- .../setedit/utils/SettingsUtils.java | 4 ++-- app/src/main/res/values/arrays.xml | 6 ++++++ app/src/main/res/values/strings.xml | 6 ++++++ 10 files changed, 90 insertions(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0fffc13..631bedd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,18 +10,29 @@ + + + + + + + + + + + @string/linux_environment @string/boot_items @string/shortcuts + @string/moto_system_table + @string/moto_secure_table + @string/moto_global_table + @string/lineage_system_table + @string/lineage_secure_table + @string/lineage_global_table @string/create_new_shortcut diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e0bb7b..cfc981f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,12 @@ System Table Secure Table Global Table + Moto System Table + Moto Secure Table + Moto Global Table + Lineage System Table + Lineage Secure Table + Lineage Global Table Android Properties Java Properties Linux Environments From beb98de61eb5839ec04dfe9c1c9807105b11ca35 Mon Sep 17 00:00:00 2001 From: TherayTharow Date: Sun, 8 Sep 2024 22:32:43 +0000 Subject: [PATCH 2/5] Null Fix Permission is required next --- .../setedit/adapters/SettingsRecyclerAdapter.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java b/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java index b663523..4134e7b 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java @@ -235,9 +235,11 @@ protected FilterResults performFiltering(CharSequence constraint) { @Override protected void publishResults(CharSequence constraint, FilterResults results) { - //noinspection unchecked - AdapterUtils.notifyDataSetChanged(SettingsRecyclerAdapter.this, mMatchedPositions, - (List) results.values); + if (results.values!=null) { + //noinspection unchecked + AdapterUtils.notifyDataSetChanged(SettingsRecyclerAdapter.this, mMatchedPositions, + (List) results.values); + } } }; } From 7f9eb361f69ff510bdc5b1b750cb7748ddf08a9a Mon Sep 17 00:00:00 2001 From: TherayTharow Date: Mon, 9 Sep 2024 05:18:30 +0000 Subject: [PATCH 3/5] Permissions Fix, And Command Fix --- app/src/main/AndroidManifest.xml | 2 -- .../muntashirakon/setedit/EditorActivity.java | 2 +- .../muntashirakon/setedit/EditorUtils.java | 24 +++++++++++++++---- .../setedit/utils/SettingsUtils.java | 22 +++++++++++++---- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 631bedd..31436ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,8 +27,6 @@ android:name="android.hardware.touchscreen" android:required="false" /> - - diff --git a/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java b/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java index 7b3efb0..bae942b 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java @@ -155,7 +155,7 @@ public void onCreate(Bundle bundle) { if (isGranted) { addNewItemDialog(); } else { - EditorUtils.displayGrantPermissionMessage(this); + EditorUtils.displayGrantPermissionMessage(this, ((SettingsRecyclerAdapter) adapter).getSettingsType()); } } }); diff --git a/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java b/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java index 63c0d4c..9ad5749 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java @@ -34,8 +34,8 @@ public class EditorUtils { */ @Nullable public static Boolean checkSettingsPermission(@NonNull Context context, @SettingsType String settingsType) { - String permission = SettingsType.SYSTEM_SETTINGS.equals(settingsType) - ? Manifest.permission.WRITE_SETTINGS : Manifest.permission.WRITE_SECURE_SETTINGS; + String permission = requiredPermission(settingsType); + if (SettingsType.SYSTEM_SETTINGS.equals(settingsType)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.System.canWrite(context)) { if (Boolean.TRUE.equals(Shell.isAppGrantedRoot())) { @@ -60,10 +60,10 @@ public static Boolean checkSettingsPermission(@NonNull Context context, @Setting } @SuppressLint({"InflateParams", "SetTextI18n"}) - public static void displayGrantPermissionMessage(@NonNull Context context) { + public static void displayGrantPermissionMessage(@NonNull Context context, @SettingsType String settingsType) { View view = LayoutInflater.from(context).inflate(R.layout.dialog_unsupported, null); TextView tv = view.findViewById(R.id.txt); - tv.setText("pm grant " + BuildConfig.APPLICATION_ID + " " + Manifest.permission.WRITE_SECURE_SETTINGS); + tv.setText("pm grant " + BuildConfig.APPLICATION_ID + " " + requiredPermission(settingsType)); tv.setKeyListener(null); tv.setSelectAllOnFocus(true); tv.requestFocus(); @@ -72,6 +72,22 @@ public static void displayGrantPermissionMessage(@NonNull Context context) { .setNegativeButton(R.string.close, null) .show(); } + @NonNull + private static String requiredPermission(@SettingsType String settingsType) { + switch (settingsType) { + case SettingsType.SYSTEM_SETTINGS: return Manifest.permission.WRITE_SETTINGS; + case SettingsType.SECURE_SETTINGS: + case SettingsType.GLOBAL_SETTINGS: return Manifest.permission.WRITE_SECURE_SETTINGS; + case SettingsType.MOTO_GLOBAL_SETTINGS: + case SettingsType.MOTO_SECURE_SETTINGS: + case SettingsType.MOTO_SYSTEM_SETTINGS: return "com.motorola.permission.WRITE_SECURE_SETTINGS"; + case SettingsType.LINEAGE_GLOBAL_SETTINGS: + case SettingsType.LINEAGE_SECURE_SETTINGS: + case SettingsType.LINEAGE_SYSTEM_SETTINGS: return "lineageos.permission.WRITE_SETTINGS"; + default: + throw new UnsupportedOperationException("Unexpected Value: " + settingsType); + } + } @NonNull public static String getJson(@NonNull List> items, @Nullable String settingsType) diff --git a/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java b/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java index 9aef595..9d342c8 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java @@ -30,7 +30,7 @@ public static ActionResult update(@NonNull Context context, @SettingsType String public static ActionResult delete(@NonNull Context context, @SettingsType String settingsType, @NonNull String keyName) { if (Boolean.TRUE.equals(Shell.isAppGrantedRoot())) { - Shell.Result result = Shell.cmd("settings delete " + settingsType + " " + keyName).exec(); + Shell.Result result = Shell.cmd(commandBuilder(settingsType) +" delete " + settingsType + " " + keyName).exec(); ActionResult r = new ActionResult(ActionResult.TYPE_DELETE, result.isSuccess()); r.setLogs(TextUtils.join("\n", result.getErr())); return r; @@ -38,7 +38,7 @@ public static ActionResult delete(@NonNull Context context, @SettingsType String Boolean isGranted = EditorUtils.checkSettingsPermission(context, settingsType); if (isGranted == null) return new ActionResult(ActionResult.TYPE_DELETE, false); if (!isGranted) { - EditorUtils.displayGrantPermissionMessage(context); + EditorUtils.displayGrantPermissionMessage(context, settingsType); return new ActionResult(ActionResult.TYPE_DELETE, false); } ContentResolver contentResolver = context.getContentResolver(); @@ -59,7 +59,7 @@ private static ActionResult updateInternal(@NonNull Context context, @SettingsTy @NonNull String keyName, @NonNull String newValue, @ActionResult.ActionType int actionType) { if (Boolean.TRUE.equals(Shell.isAppGrantedRoot())) { - Shell.Result result = Shell.cmd("settings put " + settingsType + " " + keyName + " \"" + newValue + "\"").exec(); + Shell.Result result = Shell.cmd(commandBuilder(settingsType) + " put " + settingsType + " " + keyName + " \"" + newValue + "\"").exec(); ActionResult r = new ActionResult(actionType, result.isSuccess()); r.setLogs(TextUtils.join("\n", result.getErr())); return r; @@ -67,7 +67,7 @@ private static ActionResult updateInternal(@NonNull Context context, @SettingsTy Boolean isGranted = EditorUtils.checkSettingsPermission(context, settingsType); if (isGranted == null) return new ActionResult(actionType, false); if (!isGranted) { - EditorUtils.displayGrantPermissionMessage(context); + EditorUtils.displayGrantPermissionMessage(context, settingsType); return new ActionResult(actionType, false); } ContentResolver contentResolver = context.getContentResolver(); @@ -84,4 +84,18 @@ private static ActionResult updateInternal(@NonNull Context context, @SettingsTy return r; } } + + private static String commandBuilder(@SettingsType String settingsType) { + switch (settingsType) { + case SettingsType.GLOBAL_SETTINGS: + case SettingsType.SYSTEM_SETTINGS: + case SettingsType.SECURE_SETTINGS: + return "settings"; + case SettingsType.MOTO_GLOBAL_SETTINGS: + case SettingsType.MOTO_SYSTEM_SETTINGS: + case SettingsType.MOTO_SECURE_SETTINGS: + return "motsettings"; + default: return null; + } + } } From 37b460d816dd670e48ef5780ae9c97c0f1c5f08c Mon Sep 17 00:00:00 2001 From: Theray Tharow Date: Thu, 17 Oct 2024 17:52:21 -0400 Subject: [PATCH 4/5] Remove spaces from AndroidManifest.xml Found and implemented LOS settings command in SettingsUtils.java Further edits made to inform user of root requirements for motorola table. Signed-off-by: Theray Tharow --- app/src/main/AndroidManifest.xml | 2 -- .../muntashirakon/setedit/EditorActivity.java | 5 +++-- .../muntashirakon/setedit/EditorUtils.java | 20 +++++++++++++++---- .../setedit/utils/SettingsUtils.java | 4 ++++ .../main/res/layout/dialog_unsupported.xml | 3 ++- app/src/main/res/values/strings.xml | 1 + 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31436ab..56072fa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,8 +18,6 @@ - - diff --git a/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java b/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java index bae942b..57009a8 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/EditorActivity.java @@ -150,12 +150,13 @@ public void onCreate(Bundle bundle) { addNewItem = findViewById(R.id.efab); addNewItem.setOnClickListener(v -> { if (adapter instanceof SettingsRecyclerAdapter) { - Boolean isGranted = EditorUtils.checkSettingsPermission(this, ((SettingsRecyclerAdapter) adapter).getSettingsType()); + @SettingsType String settingsType = ((SettingsRecyclerAdapter) adapter).getSettingsType(); + Boolean isGranted = EditorUtils.checkSettingsPermission(this, settingsType); if (isGranted == null) return; if (isGranted) { addNewItemDialog(); } else { - EditorUtils.displayGrantPermissionMessage(this, ((SettingsRecyclerAdapter) adapter).getSettingsType()); + EditorUtils.displayGrantPermissionMessage(this, settingsType); } } }); diff --git a/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java b/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java index 9ad5749..df91225 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java @@ -63,10 +63,22 @@ public static Boolean checkSettingsPermission(@NonNull Context context, @Setting public static void displayGrantPermissionMessage(@NonNull Context context, @SettingsType String settingsType) { View view = LayoutInflater.from(context).inflate(R.layout.dialog_unsupported, null); TextView tv = view.findViewById(R.id.txt); - tv.setText("pm grant " + BuildConfig.APPLICATION_ID + " " + requiredPermission(settingsType)); - tv.setKeyListener(null); - tv.setSelectAllOnFocus(true); - tv.requestFocus(); + TextView errorTv = view.findViewById(R.id.error_txt); + + switch (settingsType) { + case SettingsType.MOTO_GLOBAL_SETTINGS: + case SettingsType.MOTO_SECURE_SETTINGS: + case SettingsType.MOTO_SYSTEM_SETTINGS: { + tv.setVisibility(View.INVISIBLE); + errorTv.setText(R.string.motorola_settings_error); + } + default: { + tv.setText("pm grant " + BuildConfig.APPLICATION_ID + " " + requiredPermission(settingsType)); + tv.setKeyListener(null); + tv.setSelectAllOnFocus(true); + tv.requestFocus(); + } + } new MaterialAlertDialogBuilder(context) .setView(view) .setNegativeButton(R.string.close, null) diff --git a/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java b/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java index 9d342c8..4f1a1d7 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/utils/SettingsUtils.java @@ -95,6 +95,10 @@ private static String commandBuilder(@SettingsType String settingsType) { case SettingsType.MOTO_SYSTEM_SETTINGS: case SettingsType.MOTO_SECURE_SETTINGS: return "motsettings"; + case SettingsType.LINEAGE_GLOBAL_SETTINGS: + case SettingsType.LINEAGE_SECURE_SETTINGS: + case SettingsType.LINEAGE_SYSTEM_SETTINGS: + return "settings --lineage"; default: return null; } } diff --git a/app/src/main/res/layout/dialog_unsupported.xml b/app/src/main/res/layout/dialog_unsupported.xml index 9fb79da..9d9e811 100644 --- a/app/src/main/res/layout/dialog_unsupported.xml +++ b/app/src/main/res/layout/dialog_unsupported.xml @@ -10,10 +10,11 @@ android:paddingEnd="16dp"> + android:text="@string/error_no_support" /> Settings Database Editor Save SetEdit does not currently support editing this table. To enable editing, run the following command in a root or ADB shell: + SetEdit: does not currently support editing this table. To enable editing allow SetEdit root access Unexpected failure: Delete Get help From b4414034b69153f3264eb2adf34a403ae7641d19 Mon Sep 17 00:00:00 2001 From: Theray Tharow Date: Sun, 3 Nov 2024 18:35:19 -0500 Subject: [PATCH 5/5] Couldn't get ask for root popup to work without crashing So canEdit is false for the motorola table unless the the user somehow has access. in the similar way to the AndroidPropertiesRecyclerAdapter.java Signed-off-by: Theray Tharow --- .../muntashirakon/setedit/EditorUtils.java | 21 +++++------------ .../adapters/SettingsRecyclerAdapter.java | 23 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 - 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java b/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java index df91225..dd8770c 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java @@ -63,27 +63,18 @@ public static Boolean checkSettingsPermission(@NonNull Context context, @Setting public static void displayGrantPermissionMessage(@NonNull Context context, @SettingsType String settingsType) { View view = LayoutInflater.from(context).inflate(R.layout.dialog_unsupported, null); TextView tv = view.findViewById(R.id.txt); - TextView errorTv = view.findViewById(R.id.error_txt); + tv.setText("pm grant " + BuildConfig.APPLICATION_ID + " " + requiredPermission(settingsType)); + tv.setKeyListener(null); + tv.setSelectAllOnFocus(true); + tv.requestFocus(); + - switch (settingsType) { - case SettingsType.MOTO_GLOBAL_SETTINGS: - case SettingsType.MOTO_SECURE_SETTINGS: - case SettingsType.MOTO_SYSTEM_SETTINGS: { - tv.setVisibility(View.INVISIBLE); - errorTv.setText(R.string.motorola_settings_error); - } - default: { - tv.setText("pm grant " + BuildConfig.APPLICATION_ID + " " + requiredPermission(settingsType)); - tv.setKeyListener(null); - tv.setSelectAllOnFocus(true); - tv.requestFocus(); - } - } new MaterialAlertDialogBuilder(context) .setView(view) .setNegativeButton(R.string.close, null) .show(); } + @NonNull private static String requiredPermission(@SettingsType String settingsType) { switch (settingsType) { diff --git a/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java b/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java index 4134e7b..b2214ec 100644 --- a/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java +++ b/app/src/main/java/io/github/muntashirakon/setedit/adapters/SettingsRecyclerAdapter.java @@ -14,11 +14,14 @@ import androidx.core.util.Pair; import androidx.fragment.app.FragmentActivity; +import com.topjohnwu.superuser.Shell; + import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; +import io.github.muntashirakon.setedit.EditorUtils; import io.github.muntashirakon.setedit.R; import io.github.muntashirakon.setedit.SettingsType; import io.github.muntashirakon.setedit.TableTypeInt; @@ -94,29 +97,39 @@ public int getListType() { @Override public boolean canSetOnReboot() { - return true; + return canEdit(); } @Override public boolean canCreateShortcut() { - return true; + return canEdit(); } @Override public boolean canCreate() { - return true; + return canEdit(); } @Override public boolean canEdit() { - return true; + switch (mSettingsType) { + case SettingsType.MOTO_GLOBAL_SETTINGS: + case SettingsType.MOTO_SECURE_SETTINGS: + case SettingsType.MOTO_SYSTEM_SETTINGS: + return Boolean.TRUE.equals(Shell.isAppGrantedRoot()) || + Boolean.TRUE.equals(EditorUtils.checkSettingsPermission(context, mSettingsType)); + default: + return true; + } } @Override public boolean canDelete() { - return true; + return canEdit(); } + + @Override public void create(String keyName, String newValue) { ActionResult result = SettingsUtils.create(context, mSettingsType, keyName, newValue); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e146dbb..cfc981f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,7 +3,6 @@ Settings Database Editor Save SetEdit does not currently support editing this table. To enable editing, run the following command in a root or ADB shell: - SetEdit: does not currently support editing this table. To enable editing allow SetEdit root access Unexpected failure: Delete Get help