Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<uses-permission
android:name="android.permission.WRITE_SECURE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="com.motorola.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="lineageos.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Expand All @@ -22,6 +24,11 @@
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<queries>
<provider android:authorities="settings" />
<provider android:authorities="lineagesettings" />
<provider android:authorities="com.motorola.android.provider.settings" />
</queries>

<application
android:name=".App"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
EditorUtils.displayGrantPermissionMessage(this, settingsType);
}
}
});
Expand Down
39 changes: 35 additions & 4 deletions app/src/main/java/io/github/muntashirakon/setedit/EditorUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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())) {
Expand All @@ -60,19 +60,38 @@ 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();


new MaterialAlertDialogBuilder(context)
.setView(view)
.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<Pair<String, String>> items, @Nullable String settingsType)
throws JSONException {
Expand Down Expand Up @@ -105,6 +124,18 @@ public static String toTableType(@TableTypeInt int tableTypeInt) {
return TableType.TABLE_BOOT;
case TableTypeInt.TABLE_SHORTCUTS:
return TableType.TABLE_SHORTCUTS;
case TableTypeInt.TABLE_MOTO_SYSTEM:
return TableType.TABLE_MOTO_SYSTEM;
case TableTypeInt.TABLE_MOTO_SECURE:
return TableType.TABLE_MOTO_SECURE;
case TableTypeInt.TABLE_MOTO_GLOBAL:
return TableType.TABLE_MOTO_GLOBAL;
case TableTypeInt.TABLE_LINEAGE_SYSTEM:
return TableType.TABLE_LINEAGE_SYSTEM;
case TableTypeInt.TABLE_LINEAGE_SECURE:
return TableType.TABLE_LINEAGE_SECURE;
case TableTypeInt.TABLE_LINEAGE_GLOBAL:
return TableType.TABLE_LINEAGE_GLOBAL;
default:
throw new IllegalArgumentException("Invalid table type: " + tableTypeInt);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,19 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@StringDef({SettingsType.SYSTEM_SETTINGS, SettingsType.SECURE_SETTINGS, SettingsType.GLOBAL_SETTINGS})
@StringDef({SettingsType.SYSTEM_SETTINGS, SettingsType.SECURE_SETTINGS, SettingsType.GLOBAL_SETTINGS,
SettingsType.MOTO_SYSTEM_SETTINGS, SettingsType.MOTO_SECURE_SETTINGS, SettingsType.MOTO_GLOBAL_SETTINGS,
SettingsType.LINEAGE_SYSTEM_SETTINGS, SettingsType.LINEAGE_SECURE_SETTINGS, SettingsType.LINEAGE_GLOBAL_SETTINGS})
@Retention(RetentionPolicy.SOURCE)
public @interface SettingsType {
String SYSTEM_SETTINGS = "system";
String SECURE_SETTINGS = "secure";
String GLOBAL_SETTINGS = "global";
String SYSTEM_SETTINGS = "settings/system";
String SECURE_SETTINGS = "settings/secure";
String GLOBAL_SETTINGS = "settings/global";

String MOTO_SYSTEM_SETTINGS = "com.motorola.android.providers.settings/system";
String MOTO_SECURE_SETTINGS = "com.motorola.android.providers.settings/secure";
String MOTO_GLOBAL_SETTINGS = "com.motorola.android.providers.settings/global";
String LINEAGE_SYSTEM_SETTINGS = "lineagesettings/system";
String LINEAGE_SECURE_SETTINGS = "lineagesettings/secure";
String LINEAGE_GLOBAL_SETTINGS = "lineagesettings/global";
}
12 changes: 9 additions & 3 deletions app/src/main/java/io/github/muntashirakon/setedit/TableType.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,18 @@

@Retention(RetentionPolicy.SOURCE)
public @interface TableType {
String TABLE_SYSTEM = "system";
String TABLE_SECURE = "secure";
String TABLE_GLOBAL = "global";
String TABLE_SYSTEM = "settings/system";
String TABLE_SECURE = "settings/secure";
String TABLE_GLOBAL = "settings/global";
String TABLE_PROPERTIES = "property";
String TABLE_JAVA = "java";
String TABLE_ENV = "env";
String TABLE_BOOT = "boot";
String TABLE_SHORTCUTS = "shortcuts";
String TABLE_MOTO_SYSTEM = "com.motorola.android.providers.settings/system";
String TABLE_MOTO_SECURE = "com.motorola.android.providers.settings/secure";
String TABLE_MOTO_GLOBAL = "com.motorola.android.providers.settings/global";
String TABLE_LINEAGE_SYSTEM = "lineagesettings/system";
String TABLE_LINEAGE_SECURE = "lineagesettings/secure";
String TABLE_LINEAGE_GLOBAL = "lineagesettings/global";
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,10 @@
int TABLE_ENV = 5;
int TABLE_BOOT = 6;
int TABLE_SHORTCUTS = 7;
int TABLE_MOTO_SYSTEM = 8;
int TABLE_MOTO_SECURE = 9;
int TABLE_MOTO_GLOBAL = 10;
int TABLE_LINEAGE_SYSTEM = 11;
int TABLE_LINEAGE_SECURE = 12;
int TABLE_LINEAGE_GLOBAL = 13;
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@ public AbsRecyclerAdapter getRecyclerAdapter(@TableTypeInt int position) {
return new BootItemsRecyclerAdapter(context);
case TableTypeInt.TABLE_SHORTCUTS:
return new ShortcutsRecyclerAdapter(context);
case TableTypeInt.TABLE_MOTO_SYSTEM:
return new SettingsRecyclerAdapter(context, SettingsType.MOTO_SYSTEM_SETTINGS);
case TableTypeInt.TABLE_MOTO_SECURE:
return new SettingsRecyclerAdapter(context, SettingsType.MOTO_SECURE_SETTINGS);
case TableTypeInt.TABLE_MOTO_GLOBAL:
return new SettingsRecyclerAdapter(context, SettingsType.MOTO_GLOBAL_SETTINGS);
case TableTypeInt.TABLE_LINEAGE_SYSTEM:
return new SettingsRecyclerAdapter(context, SettingsType.LINEAGE_SYSTEM_SETTINGS);
case TableTypeInt.TABLE_LINEAGE_SECURE:
return new SettingsRecyclerAdapter(context, SettingsType.LINEAGE_SECURE_SETTINGS);
case TableTypeInt.TABLE_LINEAGE_GLOBAL:
return new SettingsRecyclerAdapter(context, SettingsType.LINEAGE_GLOBAL_SETTINGS);
default:
throw new IllegalArgumentException("Invalid position " + position);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -77,34 +80,56 @@ public int getListType() {
return TableTypeInt.TABLE_SECURE;
case SettingsType.GLOBAL_SETTINGS:
return TableTypeInt.TABLE_GLOBAL;
case SettingsType.MOTO_SYSTEM_SETTINGS:
return TableTypeInt.TABLE_MOTO_SYSTEM;
case SettingsType.MOTO_SECURE_SETTINGS:
return TableTypeInt.TABLE_MOTO_SECURE;
case SettingsType.MOTO_GLOBAL_SETTINGS:
return TableTypeInt.TABLE_MOTO_GLOBAL;
case SettingsType.LINEAGE_SYSTEM_SETTINGS:
return TableTypeInt.TABLE_LINEAGE_SYSTEM;
case SettingsType.LINEAGE_SECURE_SETTINGS:
return TableTypeInt.TABLE_LINEAGE_SECURE;
case SettingsType.LINEAGE_GLOBAL_SETTINGS:
return TableTypeInt.TABLE_LINEAGE_GLOBAL;
}
}

@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);
Expand Down Expand Up @@ -223,9 +248,11 @@ protected FilterResults performFiltering(CharSequence constraint) {

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//noinspection unchecked
AdapterUtils.notifyDataSetChanged(SettingsRecyclerAdapter.this, mMatchedPositions,
(List<Integer>) results.values);
if (results.values!=null) {
//noinspection unchecked
AdapterUtils.notifyDataSetChanged(SettingsRecyclerAdapter.this, mMatchedPositions,
(List<Integer>) results.values);
}
}
};
}
Expand All @@ -237,7 +264,7 @@ private static Cursor getCursor(Context context, String settingsType) {
try {
ContentResolver contentResolver = context.getContentResolver();
@Nullable
Cursor query = contentResolver.query(Uri.parse("content://settings/" + settingsType),
Cursor query = contentResolver.query(Uri.parse("content://" + settingsType),
columns, null, null, null);
return new SettingsCursor(query);
} catch (Throwable th) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,21 @@ 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;
}
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();
try {
String[] strArr = {keyName};
contentResolver.delete(Uri.parse("content://settings/" + settingsType), "name = ?", strArr);
contentResolver.delete(Uri.parse("content://" + settingsType), "name = ?", strArr);
return new ActionResult(ActionResult.TYPE_DELETE, true);
} catch (Throwable th) {
th.printStackTrace();
Expand All @@ -59,23 +59,23 @@ 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;
}
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();
try {
ContentValues contentValues = new ContentValues(2);
contentValues.put("name", keyName);
contentValues.put("value", newValue);
contentResolver.insert(Uri.parse("content://settings/" + settingsType), contentValues);
contentResolver.insert(Uri.parse("content://" + settingsType), contentValues);
return new ActionResult(actionType, true);
} catch (Throwable th) {
th.printStackTrace();
Expand All @@ -84,4 +84,22 @@ 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";
case SettingsType.LINEAGE_GLOBAL_SETTINGS:
case SettingsType.LINEAGE_SECURE_SETTINGS:
case SettingsType.LINEAGE_SYSTEM_SETTINGS:
return "settings --lineage";
default: return null;
}
}
}
3 changes: 2 additions & 1 deletion app/src/main/res/layout/dialog_unsupported.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@
android:paddingEnd="16dp">

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/error_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp"
android:text="@string/error_no_support"/>
android:text="@string/error_no_support" />

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txt"
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/arrays.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
<item>@string/linux_environment</item>
<item>@string/boot_items</item>
<item>@string/shortcuts</item>
<item>@string/moto_system_table</item>
<item>@string/moto_secure_table</item>
<item>@string/moto_global_table</item>
<item>@string/lineage_system_table</item>
<item>@string/lineage_secure_table</item>
<item>@string/lineage_global_table</item>
</string-array>
<string-array name="shortcut_choices">
<item>@string/create_new_shortcut</item>
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
<string name="system_table">System Table</string>
<string name="secure_table">Secure Table</string>
<string name="global_table">Global Table</string>
<string name="moto_system_table">Moto System Table</string>
<string name="moto_secure_table">Moto Secure Table</string>
<string name="moto_global_table">Moto Global Table</string>
<string name="lineage_system_table">Lineage System Table</string>
<string name="lineage_secure_table">Lineage Secure Table</string>
<string name="lineage_global_table">Lineage Global Table</string>
<string name="android_properties">Android Properties</string>
<string name="java_properties">Java Properties</string>
<string name="linux_environment">Linux Environments</string>
Expand Down