From 23adcb544b2976565ec8dd1209b67f9c23d3a178 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 7 Nov 2016 21:06:18 +0800 Subject: [PATCH] MagiskHide Fragment complete refactor --- app/build.gradle | 9 +- .../com/topjohnwu/magisk/AboutActivity.java | 16 +- .../{RowItem.java => AboutCardRow.java} | 14 +- .../topjohnwu/magisk/ApplicationAdapter.java | 99 ++++++++ .../com/topjohnwu/magisk/MagiskFragment.java | 5 +- .../topjohnwu/magisk/MagiskHideFragment.java | 216 ++++-------------- .../com/topjohnwu/magisk/ModulesFragment.java | 5 +- .../com/topjohnwu/magisk/ReposAdapter.java | 3 +- .../com/topjohnwu/magisk/ReposFragment.java | 3 +- .../topjohnwu/magisk/SettingsFragment.java | 118 ---------- .../com/topjohnwu/magisk/SplashActivity.java | 28 +-- .../magisk/utils/ApplicationAdapter.java | 116 ---------- .../com/topjohnwu/magisk/utils/Async.java | 61 ++++- .../com/topjohnwu/magisk/utils/Utils.java | 1 - .../main/res/drawable/ic_autoroot_white.xml | 4 - app/src/main/res/layout/activity_about.xml | 14 +- .../main/res/layout/auto_root_fragment.xml | 14 -- app/src/main/res/layout/list_item_app.xml | 7 +- .../main/res/layout/magisk_hide_fragment.xml | 28 +++ app/src/main/res/values/attrs.xml | 2 +- app/src/main/res/values/strings.xml | 2 - app/src/main/res/xml/accessibilityservice.xml | 11 - 22 files changed, 274 insertions(+), 502 deletions(-) rename app/src/main/java/com/topjohnwu/magisk/{RowItem.java => AboutCardRow.java} (83%) create mode 100644 app/src/main/java/com/topjohnwu/magisk/ApplicationAdapter.java delete mode 100644 app/src/main/java/com/topjohnwu/magisk/SettingsFragment.java delete mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java delete mode 100644 app/src/main/res/drawable/ic_autoroot_white.xml delete mode 100644 app/src/main/res/layout/auto_root_fragment.xml create mode 100644 app/src/main/res/layout/magisk_hide_fragment.xml delete mode 100644 app/src/main/res/xml/accessibilityservice.xml diff --git a/app/build.gradle b/app/build.gradle index 6678996e3..35532630f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,14 +2,14 @@ apply plugin: 'com.android.application' android { compileSdkVersion 25 - buildToolsVersion "25.0.0" + buildToolsVersion "24.0.2" defaultConfig { applicationId "com.topjohnwu.magisk" minSdkVersion 21 targetSdkVersion 25 - versionCode 6 - versionName "2.1" + versionCode 7 + versionName "2.5" jackOptions { enabled true } @@ -24,6 +24,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + dexOptions { + preDexLibraries = false + } } repositories { jcenter() diff --git a/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java b/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java index d099a742f..9314ef79c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java @@ -25,19 +25,19 @@ import java.io.InputStream; import butterknife.BindView; import butterknife.ButterKnife; -public class AboutActivity extends AppCompatActivity { +public class AboutActivity extends AppCompatActivity { private static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/MagiskManager"; private static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3432382"; private static final String DONATION_URL = "http://topjohnwu.github.io/donate"; @BindView(R.id.toolbar) Toolbar toolbar; - @BindView(R.id.app_version_info) RowItem appVersionInfo; - @BindView(R.id.app_changelog) RowItem appChangelog; - @BindView(R.id.app_developers) RowItem appDevelopers; - @BindView(R.id.app_translators) RowItem appTranslators; - @BindView(R.id.app_source_code) RowItem appSourceCode; - @BindView(R.id.support_thread) RowItem supportThread; - @BindView(R.id.donation) RowItem donation; + @BindView(R.id.app_version_info) AboutCardRow appVersionInfo; + @BindView(R.id.app_changelog) AboutCardRow appChangelog; + @BindView(R.id.app_developers) AboutCardRow appDevelopers; + @BindView(R.id.app_translators) AboutCardRow appTranslators; + @BindView(R.id.app_source_code) AboutCardRow appSourceCode; + @BindView(R.id.support_thread) AboutCardRow supportThread; + @BindView(R.id.donation) AboutCardRow donation; private AlertDialog.Builder builder; @Override diff --git a/app/src/main/java/com/topjohnwu/magisk/RowItem.java b/app/src/main/java/com/topjohnwu/magisk/AboutCardRow.java similarity index 83% rename from app/src/main/java/com/topjohnwu/magisk/RowItem.java rename to app/src/main/java/com/topjohnwu/magisk/AboutCardRow.java index 54f9820d7..41372a505 100644 --- a/app/src/main/java/com/topjohnwu/magisk/RowItem.java +++ b/app/src/main/java/com/topjohnwu/magisk/AboutCardRow.java @@ -29,7 +29,7 @@ import android.widget.TextView; /** * @author dvdandroid */ -public class RowItem extends LinearLayout { +public class AboutCardRow extends LinearLayout { private final String title; private final Drawable icon; @@ -40,22 +40,22 @@ public class RowItem extends LinearLayout { private final View mView; - public RowItem(Context context) { + public AboutCardRow(Context context) { this(context, null); } - public RowItem(Context context, AttributeSet attrs) { + public AboutCardRow(Context context, AttributeSet attrs) { this(context, attrs, 0); } - public RowItem(Context context, AttributeSet attrs, int defStyleAttr) { + public AboutCardRow(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); LayoutInflater.from(context).inflate(R.layout.info_item_row, this); - TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.RowItem, 0, 0); + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AboutCardRow, 0, 0); try { - title = a.getString(R.styleable.RowItem_text); - icon = a.getDrawable(R.styleable.RowItem_icon); + title = a.getString(R.styleable.AboutCardRow_text); + icon = a.getDrawable(R.styleable.AboutCardRow_icon); } finally { a.recycle(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/ApplicationAdapter.java b/app/src/main/java/com/topjohnwu/magisk/ApplicationAdapter.java new file mode 100644 index 000000000..77bf4c02a --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ApplicationAdapter.java @@ -0,0 +1,99 @@ +package com.topjohnwu.magisk; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.TextView; + +import com.topjohnwu.magisk.utils.Async; + +import java.util.Arrays; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class ApplicationAdapter extends RecyclerView.Adapter { + + private List mList; + private List mHideList; + private Context context; + private PackageManager packageManager; + + // Don't show in list... + private static final String[] blackList = { + "com.topjohnwu.magisk", + "com.google.android.gms" + }; + + public ApplicationAdapter(List list, List hideList) { + mList = list; + mHideList = hideList; + List bl = Arrays.asList(blackList); + for (int i = 0; i < mList.size(); ++i) + if (bl.contains(mList.get(i).packageName)) + mList.remove(i); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_app, parent, false); + context = parent.getContext(); + packageManager = context.getPackageManager(); + ButterKnife.bind(this, mView); + return new ViewHolder(mView); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + ApplicationInfo info = mList.get(position); + holder.appIcon.setImageDrawable(info.loadIcon(packageManager)); + holder.appName.setText(info.loadLabel(packageManager)); + holder.appPackage.setText(info.packageName); + holder.checkBox.setChecked(false); + for (String hidePackage : mHideList) { + if (info.packageName.contains(hidePackage)) { + holder.checkBox.setChecked(true); + break; + } + } + holder.checkBox.setOnCheckedChangeListener((compoundButton, b) -> { + Async.MagiskHide mh = new Async.MagiskHide(); + if (b) { + mh.add(info.packageName); + } else { + mh.rm(info.packageName); + } + }); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class ViewHolder extends RecyclerView.ViewHolder { + + @BindView(R.id.app_icon) ImageView appIcon; + @BindView(R.id.app_name) TextView appName; + @BindView(R.id.app_package) TextView appPackage; + @BindView(R.id.checkbox) CheckBox checkBox; + + public ViewHolder(View itemView) { + super(itemView); + WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + ButterKnife.bind(this, itemView); + DisplayMetrics dimension = new DisplayMetrics(); + windowmanager.getDefaultDisplay().getMetrics(dimension); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java index 061364e66..ffd61a7b0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java @@ -4,7 +4,6 @@ import android.app.Fragment; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; @@ -88,7 +87,7 @@ public class MagiskFragment extends Fragment { Shell.su("setprop magisk.version " + String.valueOf(remoteMagiskVersion)); super.done(); } - }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + }.exec(); } }, magiskLink, @@ -141,7 +140,7 @@ public class MagiskFragment extends Fragment { appCheckUpdatesProgress.setVisibility(View.VISIBLE); magiskCheckUpdatesProgress.setVisibility(View.VISIBLE); - new Async.CheckUpdates(prefs).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new Async.CheckUpdates(prefs).exec(); }); if (prefs.getBoolean("update_check_done", false)) { diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java index ff2354ace..b75303ac4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java @@ -1,208 +1,80 @@ package com.topjohnwu.magisk; -import android.app.ListFragment; -import android.app.ProgressDialog; -import android.content.SharedPreferences; +import android.app.Fragment; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.os.AsyncTask; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.annotation.Nullable; -import android.util.TypedValue; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ListView; -import com.topjohnwu.magisk.utils.ApplicationAdapter; -import com.topjohnwu.magisk.utils.Logger; +import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Shell; -import com.topjohnwu.magisk.utils.Utils; -import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import static com.topjohnwu.magisk.utils.Utils.WhichHide; +import butterknife.BindView; +import butterknife.ButterKnife; -public class MagiskHideFragment extends ListFragment { - private PackageManager packageManager = null; - private List applist = null; - private ApplicationAdapter listadaptor = null; - public ListView listView; - public SharedPreferences prefs; - private int hideVersion; - List arrayBlackList; +public class MagiskHideFragment extends Fragment { + @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; + @BindView(R.id.recyclerView) RecyclerView recyclerView; + + private PackageManager packageManager; + private View mView; + private ApplicationAdapter appAdapter; + + @Nullable @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - View view = inflater.inflate(R.layout.auto_root_fragment, container, false); - int horizontalMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()); - int verticalMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()); - TypedValue tv = new TypedValue(); - int actionBarHeight = 130; - if (getActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { - actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics()); - } + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mView = inflater.inflate(R.layout.magisk_hide_fragment, container, false); + ButterKnife.bind(this, mView); - view.setPadding(horizontalMargin, actionBarHeight, horizontalMargin, verticalMargin); - hideVersion = WhichHide(getActivity()); - return view; - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); + packageManager = getActivity().getPackageManager(); + mSwipeRefreshLayout.setRefreshing(true); + mSwipeRefreshLayout.setOnRefreshListener(() -> { + recyclerView.setVisibility(View.GONE); + new LoadApps().exec(); + }); + new LoadApps().exec(); + return mView; } @Override public void onResume() { super.onResume(); - initializeElements(); - super.onResume(); - getActivity().setTitle(R.string.magiskhide); - hideVersion = WhichHide(getActivity()); - + mView = this.getView(); } - private void initializeElements() { - listView = getListView(); - packageManager = getActivity().getPackageManager(); - new LoadApplications().execute(); - } - - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - Logger.dev("Click"); - super.onListItemClick(l, v, position, id); - ApplicationInfo app = applist.get(position); - ToggleApp(app.packageName, position, v); - - } - - private void ToggleApp(String appToCheck, int position, View v) { - Logger.dev("Magisk", "MagiskHideFragment: ToggleApp called for " + appToCheck); - Set blackListSet = prefs.getStringSet("auto_blacklist", null); - assert blackListSet != null; - arrayBlackList = new ArrayList<>(blackListSet); - String UID = Utils.getAppUID(appToCheck); - if (!arrayBlackList.contains(appToCheck)) { - arrayBlackList.add(appToCheck); - switch (hideVersion) { - case 1 : - Shell.su("/magisk/.core/magiskhide/add " + appToCheck); - break; - case 2 : - Shell.su("/su/suhide/add " + UID); - break; - case 3 : - Shell.su("/su/suhide/add " + UID + "&& /magisk/.core/magiskhide/add " + appToCheck); - break; - default : - break; - - } - - - - } else { - for (int i = 0; i < arrayBlackList.size(); i++) { - if (appToCheck.equals(arrayBlackList.get(i))) { - arrayBlackList.remove(i); - } - } - switch (hideVersion) { - case 1 : - Shell.su("/magisk/.core/magiskhide/rm " + appToCheck); - break; - case 2 : - Shell.su("/su/suhide/rm " + UID); - break; - case 3 : - Shell.su("/su/suhide/rm " + UID + "&& /magisk/.core/magiskhide/rm " + appToCheck); - break; - default : - break; - - } - - } - Logger.dev("Committing set, value is: " + arrayBlackList.toString()); - SharedPreferences.Editor editor = prefs.edit(); - editor.putStringSet("auto_blacklist", new HashSet<>(arrayBlackList)); - editor.apply(); - listadaptor.UpdateRootStatusView(position, v); - - } - - - - private List checkForLaunchIntent(List list) { - ArrayList applist = new ArrayList<>(); - for (ApplicationInfo info : list) { - try { - if (null != packageManager.getLaunchIntentForPackage(info.packageName)) { - if (!info.packageName.contains("magisk")) { - applist.add(info); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - Collections.sort(applist, new CustomComparator()); - - return applist; - } - - public class CustomComparator implements Comparator { + private class LoadApps extends Async.RootTask { @Override - public int compare(ApplicationInfo o1, ApplicationInfo o2) { - return o1.loadLabel(packageManager).toString().compareToIgnoreCase(o2.loadLabel(packageManager).toString()); - } - } - - private class LoadApplications extends AsyncTask { - private ProgressDialog progress = null; - - @Override - protected Void doInBackground(Void... params) { - applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA)); - listadaptor = new ApplicationAdapter(getActivity(), - R.layout.list_item_app, applist); - + protected Void doInBackground(Void... voids) { + List listApps = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); + Collections.sort(listApps, (a, b) -> a.loadLabel(packageManager).toString().toLowerCase() + .compareTo(b.loadLabel(packageManager).toString().toLowerCase())); + List hideList = Shell.su(Async.MAGISK_HIDE_PATH + "list"); + appAdapter = new ApplicationAdapter(listApps, hideList); return null; } @Override - protected void onCancelled() { - super.onCancelled(); - } - - @Override - protected void onPostExecute(Void result) { - setListAdapter(listadaptor); - progress.dismiss(); - super.onPostExecute(result); - } - - @Override - protected void onPreExecute() { - progress = ProgressDialog.show(getActivity(), null, - "Loading application info..."); - super.onPreExecute(); - } - - @Override - protected void onProgressUpdate(Void... values) { - super.onProgressUpdate(values); + protected void onPostExecute(Void aVoid) { + super.onPostExecute(aVoid); + updateUI(); } } + + private void updateUI() { + recyclerView.setAdapter(appAdapter); + recyclerView.setVisibility(View.VISIBLE); + mSwipeRefreshLayout.setRefreshing(false); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index 1399cf85c..6a138319c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -4,7 +4,6 @@ import android.app.Fragment; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; @@ -59,7 +58,7 @@ public class ModulesFragment extends Fragment { mSwipeRefreshLayout.setOnRefreshListener(() -> { recyclerView.setVisibility(View.GONE); prefs.edit().putBoolean("module_done", false).apply(); - new Async.LoadModules(prefs).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + new Async.LoadModules(prefs).exec(); }); if (prefs.getBoolean("module_done", false)) { @@ -84,7 +83,7 @@ public class ModulesFragment extends Fragment { // Get the URI of the selected file final Uri uri = data.getData(); // Get the file path from the URI - new Async.FlashZIP(getActivity(), uri).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + new Async.FlashZIP(getActivity(), uri).exec(); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ReposAdapter.java b/app/src/main/java/com/topjohnwu/magisk/ReposAdapter.java index 87c55ec32..33c8708c7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ReposAdapter.java +++ b/app/src/main/java/com/topjohnwu/magisk/ReposAdapter.java @@ -6,7 +6,6 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.AsyncTask; import android.preference.PreferenceManager; import android.support.v7.app.AlertDialog; import android.support.v7.widget.RecyclerView; @@ -126,7 +125,7 @@ public class ReposAdapter extends RecyclerView.Adapter "rm -rf ../install" ); } - }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + }.exec(); } }, repo.getZipUrl(), diff --git a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java index c0273b1f3..f320c73c9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java @@ -2,7 +2,6 @@ package com.topjohnwu.magisk; import android.app.Fragment; import android.content.SharedPreferences; -import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; @@ -67,7 +66,7 @@ public class ReposFragment extends Fragment { mSwipeRefreshLayout.setOnRefreshListener(() -> { recyclerView.setVisibility(View.GONE); prefs.edit().putBoolean("repo_done", false).apply(); - new Async.LoadRepos(getActivity()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new Async.LoadRepos(getActivity()).exec(); }); if (prefs.getBoolean("repo_done", false)) { diff --git a/app/src/main/java/com/topjohnwu/magisk/SettingsFragment.java b/app/src/main/java/com/topjohnwu/magisk/SettingsFragment.java deleted file mode 100644 index d53d26cb0..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/SettingsFragment.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.topjohnwu.magisk; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.AsyncTask; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.util.TypedValue; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Toast; - -import com.topjohnwu.magisk.utils.Async; -import com.topjohnwu.magisk.utils.Logger; -import com.topjohnwu.magisk.utils.Utils; - -import butterknife.ButterKnife; - -public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { - private ListPreference themePreference; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.app_settings); - PreferenceManager.setDefaultValues(getActivity(), R.xml.app_settings, false); - } - - @Override - public void onResume() { - super.onResume(); - getActivity().setTitle(R.string.settings); - PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); - - } - - @Override - public void onDestroy() { - super.onDestroy(); - PreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(this); - - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = super.onCreateView(inflater, container, savedInstanceState); - themePreference = (ListPreference) findPreference("theme"); - CheckBoxPreference busyboxPreference = (CheckBoxPreference) findPreference("busybox"); - CheckBoxPreference quickTilePreference = (CheckBoxPreference) findPreference("enable_quicktile"); - busyboxPreference.setChecked(Utils.commandExists("unzip")); - PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); - CheckBoxPreference keepRootOffPreference = (CheckBoxPreference) findPreference("keep_root_off"); - CheckBoxPreference hideRootNotificationPreference = (CheckBoxPreference) findPreference("hide_root_notification"); - themePreference.setSummary(themePreference.getValue()); - if (MagiskFragment.magiskVersion == -1) { - quickTilePreference.setEnabled(false); - keepRootOffPreference.setEnabled(false); - hideRootNotificationPreference.setEnabled(false); - busyboxPreference.setEnabled(false); - } else { - quickTilePreference.setEnabled(true); - keepRootOffPreference.setEnabled(true); - hideRootNotificationPreference.setEnabled(true); - busyboxPreference.setEnabled(true); - } - - // calculate margins - int horizontalMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()); - int verticalMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()); - TypedValue tv = new TypedValue(); - int actionBarHeight = 130; - if (getActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { - actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics()); - } - - view.setPadding(horizontalMargin, actionBarHeight, horizontalMargin, verticalMargin); - - return view; - - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - Logger.dev("Settings: NewValue is " + key); - - if (key.equals("theme")) { - String pref = sharedPreferences.getString(key, ""); - - themePreference.setSummary(pref); - if (pref.equals("Dark")) { - getActivity().getApplication().setTheme(R.style.AppTheme_dh); - } else { - getActivity().getApplication().setTheme(R.style.AppTheme); - } - Intent intent = new Intent(getActivity(), MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra("Relaunch", "Settings"); - startActivity(intent); - - Logger.dev("SettingsFragment: theme is " + pref); - - } else if (key.equals("busybox")) { - boolean checked = sharedPreferences.getBoolean("busybox", false); - new Async.LinkBusyBox(checked).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); - } else if (key.equals("developer_logging")) { - Logger.devLog = sharedPreferences.getBoolean("developer_logging", false); - } else if (key.equals("shell_logging")) { - Logger.logShell = sharedPreferences.getBoolean("shell_logging", false); - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java b/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java index 6685b48e3..5bb78b64e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java @@ -2,10 +2,8 @@ package com.topjohnwu.magisk; import android.content.Intent; import android.content.SharedPreferences; -import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import com.topjohnwu.magisk.utils.Async; @@ -13,9 +11,7 @@ import com.topjohnwu.magisk.utils.Logger; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; -import java.util.Collection; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -45,20 +41,20 @@ public class SplashActivity extends AppCompatActivity { .putBoolean("update_check_done", false) .apply(); - new Async.CheckUpdates(prefs).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - new Async.constructEnv(getApplicationInfo()).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + new Async.CheckUpdates(prefs).exec(); + new Async.constructEnv(getApplicationInfo()).exec(); new Async.LoadModules(prefs) { @Override protected void onPostExecute(Void v) { super.onPostExecute(v); - new Async.LoadRepos(getApplicationContext()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new Async.LoadRepos(getApplicationContext()).exec(); // Start main activity Intent intent = new Intent(getApplicationContext(), MainActivity.class); startActivity(intent); finish(); } - }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + }.exec(); } @@ -67,7 +63,7 @@ public class SplashActivity extends AppCompatActivity { Set set = new HashSet<>(); Set setOriginal = null; List hideList = null; - List addList = null; +// List addList = null; String listCmd, addCmd, addCmd2, rmCmd, rmCmd2; // Build list of apps currently listed, add to preferences @@ -108,13 +104,13 @@ public class SplashActivity extends AppCompatActivity { } setOriginal = prefs.getStringSet("auto_blacklist", set); - if (hideList != null) { - for (String item : hideList) { - if (!(setOriginal.contains(item))) { - addList.add(item); - } - } - } +// if (hideList != null) { +// for (String item : hideList) { +// if (!(setOriginal.contains(item))) { +// addList.add(item); +// } +// } +// } SharedPreferences.Editor editor = prefs.edit(); editor.putStringSet("auto_blacklist", set); diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java b/app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java deleted file mode 100644 index 6c3684580..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.topjohnwu.magisk.utils; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.preference.PreferenceManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.TextView; - -import com.topjohnwu.magisk.R; - -import java.util.List; -import java.util.Set; - -public class ApplicationAdapter extends ArrayAdapter { - private List appsList = null; - private Context context; - private PackageManager packageManager; - public SharedPreferences prefs; - - public ApplicationAdapter(Context context, int textViewResourceId, - List appsList) { - super(context, textViewResourceId, appsList); - this.context = context; - this.appsList = appsList; - packageManager = context.getPackageManager(); - } - - @Override - public int getCount() { - return ((null != appsList) ? appsList.size() : 0); - } - - @Override - public ApplicationInfo getItem(int position) { - return ((null != appsList) ? appsList.get(position) : null); - } - - @Override - public long getItemId(int position) { - return position; - } - - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View view = convertView; - - prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - if (null == view) { - LayoutInflater layoutInflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = layoutInflater.inflate(R.layout.list_item_app, null); - } - - ApplicationInfo applicationInfo = appsList.get(position); - if (null != applicationInfo) { - TextView appName = (TextView) view.findViewById(R.id.app_name); - TextView packageName = (TextView) view.findViewById(R.id.app_paackage); - ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); - CheckBox statusview = (CheckBox) view.findViewById(R.id.checkbox); - appName.setText(applicationInfo.loadLabel(packageManager)); - packageName.setText(applicationInfo.packageName); - iconview.setImageDrawable(applicationInfo.loadIcon(packageManager)); - if (CheckApp(applicationInfo.packageName)) { - statusview.setChecked(true); - } else { - statusview.setChecked(false); - } - } - return view; - } - - public void UpdateRootStatusView(int position, View convertView) { - View view = convertView; - if (null == view) { - LayoutInflater layoutInflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = layoutInflater.inflate(R.layout.list_item_app, null); - } - ApplicationInfo applicationInfo = appsList.get(position); - if (null != applicationInfo) { - CheckBox statusview = (CheckBox) view.findViewById(R.id.checkbox); - if (CheckApp(applicationInfo.packageName)) { - statusview.setChecked(true); - } else { - statusview.setChecked(false); - } - } - - } - - - - private boolean CheckApp(String appToCheck) { - boolean starter = false; - Set set = prefs.getStringSet("auto_blacklist", null); - if (set != null) { - for (String string : set) { - if (string.contains(appToCheck)) { - starter = true; - } - } - } - - return starter; - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Async.java b/app/src/main/java/com/topjohnwu/magisk/utils/Async.java index 4398f3f2e..cc549659b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Async.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Async.java @@ -31,9 +31,24 @@ import java.util.List; public class Async { - public static final String UPDATE_JSON = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/updates/magisk_update.json"; + public abstract static class RootTask extends AsyncTask { + @SafeVarargs + public final void exec(Params... params) { + executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params); + } + } - public static class constructEnv extends AsyncTask { + public abstract static class NormalTask extends AsyncTask { + @SafeVarargs + public final void exec(Params... params) { + executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); + } + } + + public static final String UPDATE_JSON = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/updates/magisk_update.json"; + public static final String MAGISK_HIDE_PATH = "/magisk/.core/magiskhide/"; + + public static class constructEnv extends NormalTask { ApplicationInfo mInfo; @@ -59,12 +74,23 @@ public class Async { "ln -s " + zip + " zip" ); } - Shell.su("PATH=" + toolPath + ":$PATH"); return null; } + + @Override + protected void onPostExecute(Void aVoid) { + super.onPostExecute(aVoid); + new RootTask() { + @Override + protected Void doInBackground(Void... voids) { + Shell.su("PATH=" + mInfo.dataDir + "/tools:$PATH"); + return null; + } + }.exec(); + } } - public static class CheckUpdates extends AsyncTask { + public static class CheckUpdates extends NormalTask { private SharedPreferences mPrefs; @@ -102,7 +128,7 @@ public class Async { } } - public static class LoadModules extends AsyncTask { + public static class LoadModules extends RootTask { private SharedPreferences mPrefs; @@ -122,7 +148,7 @@ public class Async { } } - public static class LoadRepos extends AsyncTask { + public static class LoadRepos extends NormalTask { private Context mContext; @@ -143,7 +169,7 @@ public class Async { } } - public static class FlashZIP extends AsyncTask { + public static class FlashZIP extends RootTask { protected Uri mUri; protected File mFile, sdFile; @@ -306,7 +332,7 @@ public class Async { protected void done() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); prefs.edit().putBoolean("module_done", false).putBoolean("update_check_done", true).apply(); - new LoadModules(prefs).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + new LoadModules(prefs).exec(); AlertDialog.Builder builder; String theme = prefs.getString("theme", ""); @@ -345,4 +371,23 @@ public class Async { return null; } } + + public static class MagiskHide extends RootTask { + @Override + protected Void doInBackground(Object... params) { + boolean add = (boolean) params[0]; + String packageName = (String) params[1]; + Shell.su(MAGISK_HIDE_PATH + (add ? "add " : "rm ") + packageName); + return null; + } + + public void add(CharSequence packageName) { + exec(true, packageName); + } + + public void rm(CharSequence packageName) { + exec(false, packageName); + } + + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java index 7b55ba96a..dd1a226b9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -21,7 +21,6 @@ import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; -import java.util.ArrayList; import java.util.List; import javax.crypto.BadPaddingException; diff --git a/app/src/main/res/drawable/ic_autoroot_white.xml b/app/src/main/res/drawable/ic_autoroot_white.xml deleted file mode 100644 index ec532328f..000000000 --- a/app/src/main/res/drawable/ic_autoroot_white.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 828892bb6..994da063e 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -57,35 +57,35 @@ android:textAppearance="@style/TextAppearance.AppCompat.Headline"/> - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_app.xml b/app/src/main/res/layout/list_item_app.xml index b3402a2fb..4b7d3b9f4 100644 --- a/app/src/main/res/layout/list_item_app.xml +++ b/app/src/main/res/layout/list_item_app.xml @@ -45,14 +45,13 @@ android:id="@+id/app_name" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:layout_alignParentEnd="false" android:layout_weight="1" android:paddingEnd="3dp" android:paddingStart="3dp" android:textStyle="bold"/> + android:src="@drawable/ic_menu_overflow_material" + android:checked="false" /> diff --git a/app/src/main/res/layout/magisk_hide_fragment.xml b/app/src/main/res/layout/magisk_hide_fragment.xml new file mode 100644 index 000000000..30a51f5d5 --- /dev/null +++ b/app/src/main/res/layout/magisk_hide_fragment.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index f7927ac95..881387a64 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -17,7 +17,7 @@ - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1297a73c7..9c4e5adcf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,7 +43,6 @@ Save to SD Send Reload - SD card not found or not writable Clear log now Log successfully cleared Could not clear the log: @@ -66,7 +65,6 @@ This feature will not work without permission to write external storage. No root access, functionality limited No thanks - Accessibility service required for Magisk auto-unroot feature %1$s Update! New version v%2$s of %1$s is available!\nChangelog:\n%3$s Install %1$s diff --git a/app/src/main/res/xml/accessibilityservice.xml b/app/src/main/res/xml/accessibilityservice.xml deleted file mode 100644 index 08bf96e91..000000000 --- a/app/src/main/res/xml/accessibilityservice.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file