From d788bd8323eacc1827433a264a7323a0d052fd35 Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Thu, 29 Sep 2016 22:18:41 +0200 Subject: [PATCH] UI Fixes + Adjusted dark theme colors + Moved setting to an activity + Code format + Changed some icons + Minor fixes --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 12 +- .../com/topjohnwu/magisk/AboutActivity.java | 24 +-- .../com/topjohnwu/magisk/LogFragment.java | 22 +-- .../com/topjohnwu/magisk/MagiskFragment.java | 45 +++--- .../com/topjohnwu/magisk/MainActivity.java | 34 +---- .../com/topjohnwu/magisk/ModulesFragment.java | 3 - .../com/topjohnwu/magisk/ReposFragment.java | 9 +- .../com/topjohnwu/magisk/RootFragment.java | 26 +--- .../topjohnwu/magisk/SettingsActivity.java | 143 ++++++++++++++++++ .../topjohnwu/magisk/SettingsFragment.java | 110 -------------- .../com/topjohnwu/magisk/module/Module.java | 18 ++- .../magisk/receivers/DownloadReceiver.java | 2 +- .../com/topjohnwu/magisk/utils/Async.java | 4 +- .../com/topjohnwu/magisk/utils/Utils.java | 3 - app/src/main/res/drawable-nodpi/logo.png | Bin 0 -> 55732 bytes app/src/main/res/drawable/ic_author.xml | 5 - app/src/main/res/drawable/ic_changelog.xml | 12 +- .../main/res/drawable/ic_splash_activity.xml | 5 +- app/src/main/res/drawable/ic_support.xml | 4 - .../main/res/layout/activity_container.xml | 16 ++ app/src/main/res/layout/list_item_repo.xml | 42 ++--- app/src/main/res/layout/toolbar.xml | 3 +- app/src/main/res/menu/drawer.xml | 24 +-- app/src/main/res/values/colors.xml | 8 +- app/src/main/res/values/styles.xml | 17 +-- 26 files changed, 287 insertions(+), 308 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java delete mode 100644 app/src/main/java/com/topjohnwu/magisk/SettingsFragment.java create mode 100644 app/src/main/res/drawable-nodpi/logo.png delete mode 100644 app/src/main/res/drawable/ic_author.xml delete mode 100644 app/src/main/res/drawable/ic_support.xml create mode 100644 app/src/main/res/layout/activity_container.xml diff --git a/app/build.gradle b/app/build.gradle index f8e519b2c..fd1c04d48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 24 - buildToolsVersion "24.0.2" + buildToolsVersion "24.0.3" defaultConfig { applicationId "com.topjohnwu.magisk" @@ -32,13 +32,11 @@ repositories { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:recyclerview-v7:24.2.1' compile 'com.android.support:cardview-v7:24.2.1' compile 'com.android.support:design:24.2.1' compile 'com.jakewharton:butterknife:8.4.0' compile 'com.github.michalis-vitos:aFileChooser:master' compile 'com.google.code.gson:gson:2.7' - compile 'com.android.support:support-v4:24.2.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index efcf4940c..b4d7d9ffe 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ - + @@ -24,6 +25,7 @@ android:name=".MainActivity" android:configChanges="orientation|screenSize" android:exported="true"/> + - @@ -65,6 +66,9 @@ + = Build.VERSION_CODES.M) { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - } ButterKnife.bind(this); setSupportActionBar(toolbar); @@ -83,7 +77,7 @@ public class AboutActivity extends AppCompatActivity { appChangelog.removeSummary(); if (theme.equals("Dark")) { - builder = new AlertDialog.Builder(this,R.style.AlertDialog_dh); + builder = new AlertDialog.Builder(this, R.style.AlertDialog_dh); } else { builder = new AlertDialog.Builder(this); } @@ -92,7 +86,7 @@ public class AboutActivity extends AppCompatActivity { } else { Spanned result; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { - result = Html.fromHtml(changes,Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE); + result = Html.fromHtml(changes, Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE); } else { result = Html.fromHtml(changes); } @@ -114,7 +108,7 @@ public class AboutActivity extends AppCompatActivity { appDevelopers.setOnClickListener(view -> { Spanned result; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { - result = Html.fromHtml(getString(R.string.app_developers_),Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE); + result = Html.fromHtml(getString(R.string.app_developers_), Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE); } else { result = Html.fromHtml(getString(R.string.app_developers_)); } @@ -148,8 +142,6 @@ public class AboutActivity extends AppCompatActivity { setFloating(); } - - public void setFloating() { boolean isTablet = getResources().getBoolean(R.bool.isTablet); if (isTablet) { @@ -164,12 +156,4 @@ public class AboutActivity extends AppCompatActivity { } } - @Override - protected void onResume() { - super.onResume(); - - setTitle("About"); - - - } } diff --git a/app/src/main/java/com/topjohnwu/magisk/LogFragment.java b/app/src/main/java/com/topjohnwu/magisk/LogFragment.java index 8d66223f3..903ab1ef2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/LogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/LogFragment.java @@ -49,20 +49,6 @@ public class LogFragment extends Fragment { private MenuItem mClickedMenuItem; - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - setHasOptionsMenu(true); - } - - @Override - public void onResume() { - super.onResume(); - getActivity().setTitle("Log"); - setHasOptionsMenu(true); - reloadErrorLog(); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.log_fragment, container, false); @@ -72,10 +58,16 @@ public class LogFragment extends Fragment { reloadErrorLog(); - setHasOptionsMenu(true); return view; } + @Override + public void onResume() { + super.onResume(); + setHasOptionsMenu(true); + reloadErrorLog(); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_log, menu); diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java index bd4c61750..148d9814b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java @@ -3,13 +3,13 @@ package com.topjohnwu.magisk; import android.app.Fragment; import android.content.Intent; import android.content.SharedPreferences; -import android.content.res.TypedArray; -import android.graphics.Color; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; +import android.support.graphics.drawable.animated.BuildConfig; import android.support.v4.content.FileProvider; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AlertDialog; @@ -55,12 +55,16 @@ public class MagiskFragment extends Fragment { @BindView(R.id.magisk_check_updates_status) TextView magiskCheckUpdatesStatus; @BindView(R.id.magisk_check_updates_progress) ProgressBar magiskCheckUpdatesProgress; - @BindColor(R.color.grey500) int grey500; + @BindColor(R.color.green500) int colorOK; + @BindColor(R.color.yellow500) int colorWarn; + @BindColor(R.color.grey500) int colorNeutral; + @BindColor(R.color.blue500) int colorInfo; + @BindColor(android.R.color.transparent) int trans; - private int colorOK, colorWarn, colorNeutral; int statusOK = R.drawable.ic_check_circle; int statusUnknown = R.drawable.ic_help; + private AlertDialog.Builder builder; private SharedPreferences prefs; @@ -71,24 +75,12 @@ public class MagiskFragment extends Fragment { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.magisk_fragment, container, false); ButterKnife.bind(this, v); - int[] attrs0 = {R.attr.ColorOK}; - int[] attrs1 = {R.attr.ColorWarn}; - int[] attrs2 = {R.attr.ColorNeutral}; - TypedArray ta0 = getActivity().obtainStyledAttributes(attrs0); - TypedArray ta1 = getActivity().obtainStyledAttributes(attrs1); - TypedArray ta2 = getActivity().obtainStyledAttributes(attrs2); - colorOK = ta0.getColor(0, Color.GRAY); - colorWarn = ta1.getColor(0, Color.GRAY); - colorNeutral = ta2.getColor(0, Color.GRAY); - ta0.recycle(); - ta1.recycle(); - ta2.recycle(); if (magiskVersion == -1) { - magiskStatusContainer.setBackgroundColor(grey500); + magiskStatusContainer.setBackgroundColor(colorNeutral); magiskStatusIcon.setImageResource(statusUnknown); - magiskVersionText.setTextColor(grey500); + magiskVersionText.setTextColor(colorNeutral); magiskVersionText.setText(R.string.magisk_version_error); } else { magiskStatusContainer.setBackgroundColor(colorOK); @@ -137,7 +129,6 @@ public class MagiskFragment extends Fragment { @Override public void onResume() { super.onResume(); - getActivity().setTitle(R.string.magisk); prefs.registerOnSharedPreferenceChangeListener(listener); } @@ -169,10 +160,10 @@ public class MagiskFragment extends Fragment { magiskCheckUpdatesStatus.setTextColor(colorWarn); } else { if (remoteMagiskVersion > magiskVersion) { - magiskCheckUpdatesContainer.setBackgroundColor(colorNeutral); + magiskCheckUpdatesContainer.setBackgroundColor(colorInfo); magiskCheckUpdatesIcon.setImageResource(R.drawable.ic_file_download); magiskCheckUpdatesStatus.setText(getString(R.string.magisk_update_available, String.valueOf(remoteMagiskVersion))); - magiskCheckUpdatesStatus.setTextColor(colorNeutral); + magiskCheckUpdatesStatus.setTextColor(colorInfo); magiskUpdateView.setOnClickListener(view -> builder .setTitle(getString(R.string.update_title, getString(R.string.magisk))) .setMessage(getString(R.string.update_msg, getString(R.string.magisk), String.valueOf(remoteMagiskVersion), magiskChangelog)) @@ -213,11 +204,17 @@ public class MagiskFragment extends Fragment { .show()); } - if (remoteAppVersionCode > BuildConfig.VERSION_CODE) { - appCheckUpdatesContainer.setBackgroundColor(colorNeutral); + int appVersionCode = 0; + try { + appVersionCode = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0).versionCode; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (remoteAppVersionCode > appVersionCode) { + appCheckUpdatesContainer.setBackgroundColor(colorInfo); appCheckUpdatesIcon.setImageResource(R.drawable.ic_file_download); appCheckUpdatesStatus.setText(getString(R.string.app_update_available, remoteAppVersion)); - appCheckUpdatesStatus.setTextColor(colorNeutral); + appCheckUpdatesStatus.setTextColor(colorInfo); appUpdateView.setOnClickListener(view -> builder .setTitle(getString(R.string.update_title, getString(R.string.app_name))) .setMessage(getString(R.string.update_msg, getString(R.string.app_name), remoteAppVersion, appChangelog)) diff --git a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java index 3b7f91416..98acc843e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java @@ -33,7 +33,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID"; private final Handler mDrawerHandler = new Handler(); - private String currentTitle; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.drawer_layout) DrawerLayout drawer; @@ -85,22 +84,13 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On mSelectedId = savedInstanceState == null ? mSelectedId : savedInstanceState.getInt(SELECTED_ITEM_ID); navigationView.setCheckedItem(mSelectedId); + if (savedInstanceState == null) { + mDrawerHandler.removeCallbacksAndMessages(null); + mDrawerHandler.postDelayed(() -> navigate(mSelectedId), 250); + } navigationView.setNavigationItemSelectedListener(this); - Bundle extras = getIntent().getExtras(); - if (extras != null) { - String toLaunch = ""; - toLaunch = getIntent().getExtras().getString("Relaunch"); - if (toLaunch.equals("Settings")) { - Logger.dev("MainActivity: Intent has extras " + getIntent().getExtras().getString("Relaunch")); - mSelectedId = R.id.settings; - } - - } - - mDrawerHandler.removeCallbacksAndMessages(null); - navigate(mSelectedId); } @Override @@ -130,12 +120,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On return true; } - @Override - protected void onResume() { - super.onResume(); - setTitle(currentTitle); - } - public void navigate(final int itemId) { Fragment navFragment = null; String tag = ""; @@ -166,9 +150,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On navFragment = new LogFragment(); break; case R.id.settings: - setTitle(R.string.settings); - tag = "settings"; - navFragment = new SettingsFragment(); + startActivity(new Intent(this, SettingsActivity.class)); break; case R.id.app_about: startActivity(new Intent(this, AboutActivity.class)); @@ -176,14 +158,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } if (navFragment != null) { - FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); try { - toolbar.setElevation(navFragment instanceof ModulesFragment ? 0 : 10); - currentTitle = getTitle().toString(); - - transaction.replace(R.id.content_frame, navFragment, tag).addToBackStack(currentTitle).commit(); + transaction.replace(R.id.content_frame, navFragment, tag).commit(); } catch (IllegalStateException ignored) { } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index b8b9e4201..30430147f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -47,8 +47,6 @@ public class ModulesFragment extends Fragment { mView = inflater.inflate(R.layout.modules_fragment, container, false); ButterKnife.bind(this, mView); - mSwipeRefreshLayout.setRefreshing(true); - fabio.setOnClickListener(v -> { Intent getContentIntent = FileUtils.createGetContentIntent(null); getContentIntent.setType("application/zip"); @@ -95,7 +93,6 @@ public class ModulesFragment extends Fragment { public void onResume() { super.onResume(); mView = this.getView(); - getActivity().setTitle(R.string.modules); prefs.registerOnSharedPreferenceChangeListener(listener); } diff --git a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java index 1f1263b58..3b66a86e2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java @@ -26,15 +26,13 @@ import butterknife.ButterKnife; public class ReposFragment extends Fragment { + @BindView(R.id.recyclerView) RecyclerView recyclerView; + @BindView(R.id.empty_rv) TextView emptyTv; + @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; private List mListRepos = new ArrayList<>(); private List mUpdateRepos = new ArrayList<>(); private List mInstalledRepos = new ArrayList<>(); private List mOthersRepos = new ArrayList<>(); - - @BindView(R.id.recyclerView) RecyclerView recyclerView; - @BindView(R.id.empty_rv) TextView emptyTv; - @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; - private SharedPreferences.OnSharedPreferenceChangeListener listener; private SharedPreferences prefs; @@ -79,7 +77,6 @@ public class ReposFragment extends Fragment { @Override public void onResume() { super.onResume(); - getActivity().setTitle(R.string.downloads); prefs.registerOnSharedPreferenceChangeListener(listener); } diff --git a/app/src/main/java/com/topjohnwu/magisk/RootFragment.java b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java index 12d4a7fac..179c87ca3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/RootFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java @@ -2,7 +2,6 @@ package com.topjohnwu.magisk; import android.app.Fragment; import android.content.SharedPreferences; -import android.content.res.TypedArray; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; @@ -24,6 +23,7 @@ import com.topjohnwu.magisk.utils.Utils; import java.io.File; import java.util.List; +import butterknife.BindColor; import butterknife.BindView; import butterknife.ButterKnife; @@ -52,8 +52,11 @@ public class RootFragment extends Fragment { int statusError = R.drawable.ic_error; int statusUnknown = R.drawable.ic_help; - private int colorOK, colorFail, colorNeutral, colorWarn; - //private boolean autoRootStatus; + @BindColor(R.color.green500) int colorOK; + @BindColor(R.color.yellow500) int colorWarn; + @BindColor(R.color.grey500) int colorNeutral; + @BindColor(R.color.red500) int colorFail; + private SharedPreferences.OnSharedPreferenceChangeListener listener; @Nullable @@ -61,22 +64,6 @@ public class RootFragment extends Fragment { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.root_fragment, container, false); ButterKnife.bind(this, view); - int[] attrs0 = {R.attr.ColorOK}; - int[] attrs1 = {R.attr.ColorFail}; - int[] attrs2 = {R.attr.ColorNeutral}; - int[] attrs3 = {R.attr.ColorWarn}; - TypedArray ta0 = getActivity().obtainStyledAttributes(attrs0); - TypedArray ta1 = getActivity().obtainStyledAttributes(attrs1); - TypedArray ta2 = getActivity().obtainStyledAttributes(attrs2); - TypedArray ta3 = getActivity().obtainStyledAttributes(attrs3); - colorOK = ta0.getColor(0, Color.GRAY); - colorFail = ta1.getColor(0, Color.GRAY); - colorNeutral = ta2.getColor(0, Color.GRAY); - colorWarn = ta2.getColor(0, Color.GRAY); - ta0.recycle(); - ta1.recycle(); - ta2.recycle(); - ta3.recycle(); prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); @@ -115,7 +102,6 @@ public class RootFragment extends Fragment { @Override public void onResume() { super.onResume(); - getActivity().setTitle(R.string.root); listener = (pref, key) -> { if ((key.contains("autoRootEnable")) || (key.equals("root"))) { Logger.dev("RootFragmnet, keychange detected for " + key); diff --git a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java new file mode 100644 index 000000000..c91ecefea --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java @@ -0,0 +1,143 @@ +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.PreferenceFragment; +import android.preference.PreferenceManager; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.WindowManager; +import android.widget.Toast; + +import com.topjohnwu.magisk.utils.Async; +import com.topjohnwu.magisk.utils.Logger; +import com.topjohnwu.magisk.utils.Utils; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class SettingsActivity extends AppCompatActivity { + + @BindView(R.id.toolbar) Toolbar toolbar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + String theme = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("theme", ""); + Logger.dev("AboutActivity: Theme is " + theme); + if (theme.equals("Dark")) { + setTheme(R.style.AppTheme_dh); + } + + setContentView(R.layout.activity_container); + ButterKnife.bind(this); + + setSupportActionBar(toolbar); + + toolbar.setNavigationOnClickListener(view -> finish()); + + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setTitle(R.string.settings); + ab.setDisplayHomeAsUpEnabled(true); + } + + setFloating(); + + if (savedInstanceState == null) { + getFragmentManager().beginTransaction().add(R.id.container, new SettingsFragment()).commit(); + } + + } + + public void setFloating() { + boolean isTablet = getResources().getBoolean(R.bool.isTablet); + if (isTablet) { + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = getResources().getDimensionPixelSize(R.dimen.floating_height); + params.width = getResources().getDimensionPixelSize(R.dimen.floating_width); + params.alpha = 1.0f; + params.dimAmount = 0.6f; + params.flags |= 2; + getWindow().setAttributes(params); + setFinishOnTouchOutside(true); + } + } + + public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + + private ListPreference themePreference; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.uisettings); + PreferenceManager.setDefaultValues(getActivity(), R.xml.uisettings, false); + + themePreference = (ListPreference) findPreference("theme"); + CheckBoxPreference busyboxPreference = (CheckBoxPreference) findPreference("busybox"); + busyboxPreference.setChecked(Utils.commandExists("unzip")); + + PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); + + themePreference.setSummary(themePreference.getValue()); + + if (MagiskFragment.magiskVersion == -1) { + busyboxPreference.setEnabled(false); + } else { + busyboxPreference.setEnabled(true); + } + } + + @Override + public void onResume() { + super.onResume(); + PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); + } + + @Override + public void onDestroy() { + super.onDestroy(); + PreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(this); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + Logger.dev("Settings: Prefs change " + key); + + switch (key) { + case "theme": + String theme = sharedPreferences.getString(key, ""); + + themePreference.setSummary(theme); + if (theme.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); + startActivity(intent); + break; + case "busybox": + boolean checked = sharedPreferences.getBoolean("busybox", false); + new Async.LinkBusyBox(checked).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); + break; + case "developer_logging": + Logger.devLog = sharedPreferences.getBoolean("developer_logging", false); + break; + case "shell_logging": + Logger.logShell = sharedPreferences.getBoolean("shell_logging", false); + break; + } + + } + } + +} 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 7aa8254e5..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/SettingsFragment.java +++ /dev/null @@ -1,110 +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.PreferenceFragment; -import android.preference.PreferenceManager; -import android.util.TypedValue; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.topjohnwu.magisk.utils.Async; -import com.topjohnwu.magisk.utils.Logger; -import com.topjohnwu.magisk.utils.Utils; - -public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { - private ListPreference themePreference; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.uisettings); - PreferenceManager.setDefaultValues(getActivity(), R.xml.uisettings, 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"); - busyboxPreference.setChecked(Utils.commandExists("unzip")); - PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); - themePreference.setSummary(themePreference.getValue()); - if (MagiskFragment.magiskVersion == -1) { - busyboxPreference.setEnabled(false); - } else { - 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); - - switch (key) { - case "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); - - break; - case "busybox": - boolean checked = sharedPreferences.getBoolean("busybox", false); - new Async.LinkBusyBox(checked).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); - break; - case "developer_logging": - Logger.devLog = sharedPreferences.getBoolean("developer_logging", false); - break; - case "shell_logging": - Logger.logShell = sharedPreferences.getBoolean("shell_logging", false); - break; - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/module/Module.java b/app/src/main/java/com/topjohnwu/magisk/module/Module.java index 31b89a6c2..c87ff59ec 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/Module.java @@ -28,9 +28,21 @@ public class Module extends BaseModule { Logger.dev("Creating Module, id: " + mId); - mEnable = !Utils.itemExist(mDisableFile); - mRemove = Utils.itemExist(mRemoveFile); - mUpdated = Utils.itemExist(mUpdateFile); + try { + mEnable = !Utils.itemExist(mDisableFile); + } catch (Exception e) { + mEnable = false; + } + try { + mRemove = Utils.itemExist(mRemoveFile); + } catch (Exception e) { + mRemove = false; + } + try { + mUpdated = Utils.itemExist(mUpdateFile); + } catch (Exception e) { + mUpdated = false; + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java b/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java index 6039f1991..d82dfb1d5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java +++ b/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java @@ -12,8 +12,8 @@ import com.topjohnwu.magisk.R; public abstract class DownloadReceiver extends BroadcastReceiver { public Context mContext; - long downloadID; public String mName; + long downloadID; public DownloadReceiver() {} 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 41e4c10d3..d969565cd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Async.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Async.java @@ -149,10 +149,10 @@ public class Async { public static class FlashZIP extends AsyncTask { - private String mName; protected Uri mUri; - private ProgressDialog progress; protected File mFile, sdFile; + private String mName; + private ProgressDialog progress; private Context mContext; private boolean copyToSD; 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 5881aefcd..2cbc67b11 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -91,9 +91,6 @@ public class Utils { } else { Shell.su("rm -rf /magisk/.core/bin", "setprop magisk.root 0"); } -// if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enable_quicktile", false)) { -// setupQuickSettingsTile(context); -// } PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("root", b).apply(); } } diff --git a/app/src/main/res/drawable-nodpi/logo.png b/app/src/main/res/drawable-nodpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..78b12a5099c494e8ac9bb0e3619191cc651f8fd5 GIT binary patch literal 55732 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

O}Qc=ukc*rb&n_s1%7 z5ukwCGUe0BY^PgMJhAM@5W4GgoH+}r^}J*p3tYJecPlQHkVxRFe1!J|m>8Ie z*ZqW|_GxwkT+OuAW_nl#btuP>j_UWsoVE9m&y^Y2&yrtcu zg(wFyy>zvaTkg3iO!%r&F@^jC29r9WFw^3Yramu8&3F5JuyBQ{OHP^tMG~@eh-z>N zjww+%h9k|3yiRJzFDY0j9=~E}fQwzwv&_GNwB#M8G9#Pe#Muoq@#rXCqMqkOJ%(2p zcE%<4KaWvGxN`&*2^Isu47^qx3Z-d@Hj*K;YCgc)o$CLT=(2DaF z^j}pAZMDd6aH)!TWbTD_v-bbo43`YN5W^|*_?ATx-*iBYw!5|Dx9#>VisvbR{aI58kmA^J&FTTk^D0 z(=LZ-z$08f^>AvpBPMbd9o;wedrUWeIu8rY4{J5+AMxS*FG}wj;R7`|aJ&8^P&AaNsP>Jz`~f_Q){QKVQn->+ zOMc15x&b=FJQnSOZvCy8Op+P?UW*oGI{8ZQ1TT%VR2kFbQ`niYC*DmdYCeodU7~i% z(~qon!T_L`?3z7P{qWQN8IC)RrnMVe1Q1jCo^#@DWiI#=t8twFz^Ta}RKyJd$$;s6 zluATwMEUAcaM~hV!cxXP?e`#rxOzDw%U$%HW)JiZQo$W3`BST&2r>; zWK4p|#WD>N4T|xkmbofFMQwFGH#p4A--;3yVr{d`zU0eyZNP&6rO(2E;I^^Nd2_!~ z#<;hYD#}#om;0svWc9~huYN%F0>j4wEIUE`a8u#ZxF~|9G7>0f&(6)99M6Pi9e#<0 z{Y;3EwL&X?Wk${G7nE~@J@)BuFL>SRCk7P1QLOOo8F*&w;(_^pF8~J(sNyw zy4?(%OZ^mkggozeP;>$_)th0Um-cp&4+$-v?4w)h{HXW#v=0nOkJ8=(1^NqFtA)qa zH!W`SjFb6-T9OOnU?m6U9v1jL^C_;X1{Z&nqfXSBSUe9{nUw+6S{E!Xp!Kb5ztUac z4K2HrK4?F@&o2IP@JTP-#Z-dPhy%Z|A&sQ4oI?#hZAow;K~#gjSfN{~rWDBYBv+%2 zkXf>rm;O*ZJ~fo;<%vr_)Z3J=?7w|r`ACjh1J3N_&w)TOyWOT4&JLhL_EMyxEl(=U ze#mfQIf-`b^i_(ux#!ge$*=;&%aA2(VkOWjbPO$0ITj0C^?g7i{cP{v2#Ih()!*u9 zwoVR$o*8C)1T34bPdqBJ2`FFz6O%KC@u1?Lz`*(N^Du=$=SZNMY~Glr=ef=WP&eTr z!qPN?C_u_G3x*2Vw3VNog%f^KkC-qxIEM%biRcM)>&4Xv_Apq9A+(a7B&uex{%xI; z*Yks3q~TyzA#xYL0Mal@Z{zIOLbyFw)9BK~wK0pl&d{QMirpv)j=%R0>*l&$*?A3= z_Y#_;?cBkJZb=!7r@<0i0L>_{x=4GXRsVaJ)0L-{^1$38`$ul;Mw-2D|lJUh0cY; z47Rlbb9(?hywBC8TBxM;ZGGL)Jmc!#F8QyRR(G+*jSuDbY#Qh6Zc;HjyjlhxJ1u%5ST`bdpQuHHM`fr@~FIj zQJk%{>50tQbYQ2DxS?WVDfk89tbRaK@q5FMMAl1k>2ugSf)}6wGRzA} z-)j`}lOk+#QEL{O9$)O$3XcfZQ4)62{n04_)rJo8s^?WG6XrHC_}esc)B^qbdlsZccc zB_*D|Z5pC`V{NB*AT2vzL}61@_Lr(`Q+?CG__loBL;sk61VVSTZ1Oc=%!Tti_;=FF z(3jA1<-vuW=xHpPk+ya`Q=`g3titah_53nzl+% zbvpkc1ec>6U_V|JI%XPIdN4|M^@-NBngD>|4KPONZ$5+dy2EvYK%BbvXg=|4rYz(j z(%+ZW-*{Usl!a*5Xmc4c-hOPj-8S&u*c?nIRJ_oi&`kqJ*EoNmH5C{Fif3~(nabC) z_P8Gyj8AT>e!2kVGR;~TJ$w8sZ6qkU@XMm)VGg50)@_sVMY$6Y(1eYSRb?Wt2|Qx;U8q#G1~f)DM~f~XqT`mDn1 z3}s&{lGi;~(O7_pAy*i11HWn-W0{I@xSh*(5vzuf-k?7vF#z-@#P(S?i6sFKYjOXD36?bCSO4jm7R5#vSw?l$sfGzu82cl(4*Jv#8H0zTKk zz91)NWZS!fF4RAi^>=ccFtV}seeO5`Iiz1dEc%2V-@1K*2D!!ale?77b_G!b~&90=_wiK zhuB0>*=>K?Q-_INaoW>gymErUlv`tOpM;n{iqt3d8el^c8GpO=6+ z-qtOqU&N~pplFqF3;7q{I8Run64bfK)kIsUgk|Mvk-NA4H8-qxp5@Aw+XPu?^G|qAksk+(fS3L`Aaxz`Hhs#Qf(M+?yVA!0a zLR+Y{>pN>L@7}Z!RF#=lK4E8InRk=&cY**U@NfFlRIDC5Rpj_x*8Yap8u9-AhCAc) z!@#PntO!F!4O=JX$!`u~!LoA0-3Xa8W3&m*Zx*{*8%?8jq=w!iG`{8zpQOHyFk1)8}*T7 zMwHL|>#}OIJGM0`!{l~tn5&G~dg$YAAb}Cvu9=gS5<2E#Yer=a>@UR$P{20c51b~; zt3ePnB$+$hFNJ142Di_Z`nUJ!9Xub3Xf0NqYBFB{;rS|_>{>(7D})=Qg>?N#*46A0 zGOEloU^Q_xEA=Q}@nnK0IgAuqTciv#6@oHhT1`&X)4y%C) zXfS-J5r~5^n54x7O#klZcgGuEYZS1}Oc_36a21-vYN0$}+(4~nP6#MZ8){0qjW=i# zb8_YyewDRa3QLC!lm?V`>pbfOR~GO#y%$)Qj1#=1a818gKQ+`WPr$mye|5Y*M-RfS z^=$AMv(&Q03A33-cNVXL(SLWS1+{~b4b;i4eF6w6u^}hhZnEi`Q711@I$UH8bT3Qu zgI&rv*=7OmP7sA^rrQ6`^p2ioaji(a{D=BNv`EsEQ#+yF^{qlDv5V?f-%Ti#YC(fOMx z2r8DXMaMMxvjce|I`{bfBy;s1<9AA5x_b2I_EQQVj@b5p-J?8Ix~g5kbHrk$bT4j( z#>W44z-tnxvDbSXb~-bB0&k@L=b+$^30O^{>G6SXr{WRdZmhdew|F$ zqZ^|i85khEcR=62TU_wvG<~;6`(sJ^gAHLM z#UE~O(uK99o9Bxd(y=Y2{u;($87i%t6Z&D+PrGCzGBAEUeL0QBcl6C^A|r$3yo$TM z_LA1Z6~hCSn4K7Myd>lmw_eVUWDs4v)av3m{%2?I?bu>rE=t<%8+gM3BG9=2mk1x@ z6UjLCrggVoDd)D*;%!`+IIE)~=s&ai=8w#-)1KN`(=k*90D#ApxkfG>tcJDz%PrFx} zCClZABP?*%u6?u26VI?QLnc^V6JO12A*6Pgn_9NyG`e+`9@))JU&%g=ut5ZJ)lbVn z+IuIFckjHKUOLyGoU;n5dK1RKlV`jj+|RuQdudFStT9M94bga$QT5T^?pwi3;Ot_s z*s>YV^4zR7yXPC(5+@-J2mq(#gT!1E*Z-m4Ke|?ur2FB#NH$C)8>d^SQ_x`@a4@24 z;4n38^VJ%D#S*dUb*HN06B4SwR<-sgm?pzr6krqoAaU~k1_+RjE76a*>Kk`Z2vu?Q z$GNJibSpapjlV3cA1hb5R^v!BD&lL-uF@V_-dBwxicpf#nlzp}Nzuw4uosSwjKwfHCw z-@7k$xLnHRo_X?gb^bJzZPqzEo}-XwPd>hKTAw0Dv~}Lq1OZxy39H@W@d^Otgm{2> zfNR|LWMuiq|IHn!5tDlt;d9;-qho?i;OcUd$KWFL&7RjNJ0O@6IJX>Y+k})v;c~mk zKx10ySx8|16{?E`5?ER)7nFsNm6hp`r0Ze6l@h7>h@(Bo;`m1OwdP;OP#Vr-o3vCa z*P<7o)Qr#Y`fZR#R^69+0P zum9M$LZ#tA($`ayGn@{aB`BbN^XC+av0iCG>%EhXZDG3T1LAFA+7AByCS4MpAo2>4 zdPlvMo#r@X7)bx9{A^s4^ddvW(Ne3_)X-XhQ(I`sFZY~(wreCeO|YI>yGD2iZQF#c z>-Iuh`sC+?me#DskHgF@iXat(1an*$Y7{7_ek@&7pjk9^Nzl!ZcW|g^+W7oc!?UBR z){?H}v8j5wtMnfh59Ngo3MxS%?$Pk79U=o$E7!DJ*FmiZXQ)yImREBBRI>6RIR{V%C$}2z$h@K=rcl%G#YwWus7)NIfP81`yxd~aPLw?^_vj$PfwD`+(q z=|{LI40$UUXNgt*lxj~d8w&8Q>zTfLP+{n{xV?wtv;*a(l(cXm{C0Z2YKZ#LUuQF4 zLzQz-l1QAye1YI?G97~88STv`_$RBY3-jO|OcFXl!`#Ym_$&xtVqy^tYuO;7J=M@` ze%Tb>!MTd6q3KxlY(0DIg9v5^4rul`t%>|yf#vE64$1RM(lEN1+q8;6|Bwoi-JD7Z z+_6dznIN#|`zq&rn&~Pl#Vltsz;KwJOr4{7{~*Khhkwq&!c}C?_vhHrFwkCq68yIc z&j|bloYJqJug7=6CaDFO%wS9Lj&1iK^UtPYs zGXX~4bb3)beCU$jC_^EXGR{^nqeT|{P+B)>f8p?0X{VB^Im6=EW6S{3m%B6{=A*P7 z&sCx5M`^NAjH`&zj;p>>r9RXWu>}Ik6`CYgiRBlF>gM;as@m0G{E{B3n&TJ32ehZV zBnH)rx7RBt%y3!XYC5BxDL%if+Rs`O(w3T8f!CjKK>l(pMB^D1;ni4i2>Eo}@+lko z+LqkvHQgtU)uHChRvDU}9$rqqlJGKE?P(WV7@OG0bU+)(U6wykQ|gXeS_(DhtSoIb zGd~Yv(_~Aqzt1K^SmWYEI9atI{V4J6gcW)v1DJ>_zH7PE@P5E6I7y~(f7Vp0e4N88 zOHt3vR$hYtqqatjgM8t4k2UH39JoZncaoT9Bjx_UVMU~INr==`F*Jg=md~r%9yxSD z`|xh=ovkVs*|+_gkC`Z;N@TWA_L++d=Jpd?@x|f7M1-@1(PaA-Iz4W24{smxKlGqA8KoBE6sA9#3h*&&=NU*YoaZTfNn@n% zIf|e&US8!4bJU3y0~$CssM*D9CcPzi?-iW zw_!RXD9!X+A~13R<`9|tN^JVCpr*r_H;?Cs3swS&oAX(D{pj3qyeg)Hk!Hm4U?^v{ z&e1N>T&tDhK>naK=r|h)Q0*`>Cc(yj!al#i*<@D5m-QKe{&n{heCfGgxx=9jm^fDR zof9l>i2|0}WwGfnE|!uXN%73L;dmZ|BkqUjoy`}ak1QM-eA0i}A4p&Gm8ypU6f&m0 zy^X0j1TP+8Sgm+tZ9$}{|KL)#-h4?rBS?2^D(@n8q-eTlC7&2#WS)|%y%qIhfmIlI zTGU9BZTJcf;9cFRGu+0Z1bxfFbXo5;g_<;3%psRJHVa)jVBZr|@+(l!X*gx~j@%|I z?(1Ce4ZOzNh`Tp>y1k2KC8Au~ExTt#)pBqM$uv2Y^x<`mj*D)^4pA_t6REf31r1Dw zafQD6TgoCl`OjL_@|<0NOY-Zs5Z z0zVG2PCP|ERk6~x=(L-fN!9B2(}ji^X{R+{h>@=HSmgeWk`v|PhYt4*2HMz(P_aKa z{He%XI^E~nI};+Le5>hrCAA6p85ti|#SUIQ&braS=cR8-am*_b}pQwS6!s#W1?OX`9x& zhWrD)5eJl-35UPw=yJ-4aoQ*q^+&xA*VojgA_%Rj+#-MUn?Tv{8l5kWyuc*8G~#+) zDHUUEZ`BFxajRuuulz!{G~rI=3qFW3Om2bzkQO)@m#4KV0)~U+ z2grWJ76u@`hgxLl-)rDdNYs(%;KNZ<7G(tbixqo6pI|#Xo{TEl=?}IN*rm;}7Dc`4 z%7R(D?qh+P3Mi#0lFNu!dn&kqAWshq>m&9KU2IAxpL{z0?06MF48f$8H#440X4QNN zzhJh*ToudZyWhPG9l@+2UszU77Dn-&T?+ znpOiDE{uG7rd8889L`U#j)?J#PPd1O6xjKGKU{cFa#Fz2eDC5dyzzv39N0Lmw5zJ| zt_KD3Hw06GdP4Cg&PNkSN$q?}F63a>*&jC@!^1HaY6m;g%-U%9Q8m#Mx$jN`EX#`n zHRoB8TYv@07dalzvi$n{S+FwIT_{IR$XFIy%@oP*sLhjPK+0Mc!JSR3NCWez0jnrs za=uFMbjI%VLqL>V^bJyArn*|;2xxC#7r#OZ^D5z<_r}FvW>-)IG@~F705T46bbsb z3k(VgGpJ}xH?9j~Lvh;6%*uua^dTpTR%cgue0{kxB^T{0rR=v?7QeqNi?`wN-?Va=&wnip$Mj4%85<1OMbL$DW-SOV|=z_u8AyR-g zaF8iUd3?oivi)V68P=QVrFh$H8Z7Kb-j@B-`uMNI#D}O*>sD@nT`5Uwy%fw!u?Wl_ zzggntc07l?<|`_xBQ1{DA^pM29Ye!-mC@MB7-n-j6?l(LHOkhpP|(Pnc&mAT8E3+& z`3UW~KV2OuSKttAcDu+Gap)iBLiv^&TJsqyb<2@`|y6OJJw1rsY9zs;}>- zS44;sNwboce>sIKp92S)-B7D;AZ~=YKB;5JEHOGAlIy-{>AMq^#-vEJom}nm(kWnTDVysyI2#)20| zNc<8#{U%*=wi@*ykpv9-mOs^cutwR0ReFXB5`(h{HVrwp%=Fu|mYy*901gz$HTVwF zyuDA)0_l9L+r)x~y{^>IhPcQfuC9Kz|COz77&7m)8sK!Z>(1^r_GP)fYX5vKc| zL67>tII5&V#02t;%2>z>Hwdux1m`00#$m*Vjs}zF74uJ)!JMW$)2?`A>9O)w zKMXg|YrE^zt~9|t{Mc1}?bWUkfmeRfTULt|5bO@e^EVO|I#HbD)PkhohlV92Wyu8z=~9~S_4zNJ`|G{u%$YMY=bZO@ z?rY|Jx;nJWo8bHUbNQEODty#%xuM_A?&QwYSDM1LLV~qBiqD4km8WuCH*WU(dB2Ap zzwKXe9Xz`iUZI$FXrf6IfN(z62(#^muHtn;TWHeL=;o~njO;&eyzO%ndSDz{oL1m? z|L|N`VLl*EWy>4{v)oAh{HbP#BE{?93 zMKr&3FnEOHuz3BKmdXwJKYM%Sqc=JIaV7%ZsIg+wg(51t{MASceg3(vrR0K*i}czA z$pqV#s`7r_Qu?)P-^lv%| zb>qO|7L1zKD#YZiQ0m;dAVq$}@SO6Y(M8d;jH}@O79L&w&hClofk*~n1llo$1OD_q zYl;qNi|K=7?zvs*7CaAzA`$gv=4EjSV|}fZ$hJ72u@y^4fmdp#3Iy?LP+jzT5z?B# ztH$xu(9X@xF#o()xmmt*d9Drs_8vb#JUeQ*=_x?{5#gb4|K0M8l>BlHmCL5-cYMr$ z17+cZ*+AY&k(OD|S7G4(EnRU(2KT-XeI+2fxBuB#*;T5pZOXW zObuU}*!DS-A?y~)~VCQxX z(f0b5x1~XdsEqqG$*(CP4a(*xw>VvNV$Z{O{!Yi9=t~?k+xkM#5?BV#tPvq4PD>+4 z8|;{)lSYK#Dm`kXi{nc89LS=YtG=xU_P^?J<6aPFx9Q1_gh{bR0?E3v6nz+m-} zXZ8;v^&8D&tZa_Csct*8&a|IjSQKh185HFvBd>lXk5!J4kf&e6ypuQlRHx!Q)#-M#+wEllo$0u*U)H zyVlYvXdh0=&4QK9nJf0{`1AJfN$x!r1OQ+b6Yr%qg&HW1g8R16bY*3TEBTw@+Gh*T z!oS|Qe`rNC5sLg~|7~z))|gM}sfFyOA2>g;*Sw+-anJf1J?6aW+Li3r0uY?&F(nv{PJfzqKx;y84HRWMm zo)hqKymB)CTMWM!GhqauQyE)ut^M_Kga*{|=VklPA1(Qfit0y86?`-3m-P)&B2)Q* zK{&~`Ig43Jki}8z%tq{A-`63ak6fFySB?-ew)wr$P3trQJD4|>l+gs|66F(^K67T!g1V>IJE!S(yH5+iO+9ue=tUw z0^kL;6mc;qFoP89x*eEOAe|UFZ)lL0A^L#Ojp+o4p9W6tU4@53Eh*O@|0mfM5|-$$ zb!B=cPCN}L`-GbvUM9?zhO|_yK;M4S#_;@D(7RV)m1$58}qNO+EJx>k_^BoEXA#6BmUg9z#(;in|^ z1mE9p3*>CjoZgmY!C$AE3^)ZY8D|*A-t7wWB^$*P03kv#s=X6|mfy;9R7h}yx*vn2 zR`ZwPjpXAU`DutnrhTiL7nv1t-~XtJX2=4-!_9ky7*Q0Avj@!+tB_$BF_bg6bZ7mX z3A*hx$6<(tTKFV~)ov)o)E@k^>JpYz)>e2Ui1!a1AATv0X9A ztHfN&0%QPSz9$qpdw=`yR&h1VgF~8Ug@F*j_6%NE4#K_Udk`r8F>B}LOow@Jx`|Wd zoF~?^!A^!Im|Py!{UaDaGvpAAjX^wRK5TE`5mmZ7wqSzH^8qa%Qr(Vu6%%jzMW=-9Is_s!9%0fz zN}rtYp$i*EJh7%vh`z>wdvhz*p4ckVkQxBqzOv(A(Zp;_zva{Evq^+Z|D3Arw7p@IyENh%(2-H>+o&uyYF!K424f7f<$0$ce|}I$O?SyOlOo zpA^M0eR-$0+6iMCG*Q@cx04`&{O$mD0wl$K$jM*OlBv^|ZRdkvjH70z zwH=BdeNO;#A%gx{b~E1Y^KSQb?4ol2)B-?=A$`r$7pf2QrJACdqe_RAB^Zl5Ky zv;L9atNo~SjG^_I6EVp%TG^mOv4bXuSrYs@NLOAd39fv4Jn&CKB4EH();UJ0EQ_3; z18O-oJ}MJ5EvNcw?`Us#(`e8-kSprKB+ju)jnG;WCJe3;w~(rHdO!W{9XHI+jP<#( zvKPyGr)lkS#H2dDA)W7qN9uh4YXJYj6Rek9O+eQFacBf%?iM8bzJ)7XAfbAD%cb03 zUk7uWTT!bq>@~R##BWEdHE$;nt5~O|$>jM%IN-KBl=;%Z4yrflc(=N zoob9RRu{y6W$sWuR~P;yNs>_?g+j{j5N3vGD$&(DRDekL;8qer~dr96OTD%5ySro^EF6wOb`s?es&V$UwX zR-LXV-NT%pLD3?r3d9F#N$I(gYCgu@`15i~@pJ}PhmwEaLLo#9Zc>v0jW zl21s7O_kMrmGqbOl3|ka?_MDs@5jl1+}AT-)sRA-H)oVddd{m0fL=HJ=x=y7kel`r zHUVdDd##CTDqdy>H%S_P0eMrMS5ApMak!grQq`;rVd7y`s#O0c;*NImz^9jr$p)2a zBG4?W+dNK{%Rv}VwFO1Z}mNF}!)(zVL$#l4pCFtMj?2rsPgLS5ro+7u^AqEk(w@TxkZ3oZy5f%bqG5w=E z8ci$l4uo<6aTVD`lDM09z#!77ELE-$s4^ZWi3zegXs7b-_%Ys)Vry!`?5JBJxDp(i zLJq?5#e0t@QbG0vDYq*k@X=9dbLivN1^Ob$vCT7H6kPKNC`VZ1b8|4u-zTZyR?xM_ zM84o&N#W!ND+syF0&>NH*NH=YET1{K-1{$B5mX|PyT&ieS$R)LPA?`Pgv4aqAz(77apK)bke-)$38CQiLg`j+OuEnnsgyw96J2(jQcqw(ZT zV`CTsdMd|}CtzUja>=i%Ysn8&U~{F7`T6@19MUw-uMT3bSnrFAD8*W{gLuKuTm%}cN~;lE|shHFgFm2&Xbm&AAhru`TX2S*T|%xd%}d@3M}C@lZolp7uC=Uw3KWo|BBdaw`AWTtR;7e7 z0YJ+=9tt*wT3gJsCk%xX3ax~(qf5@nw8QAGm0v5lYM=@#8!N+-pdThb?5AwkA-B5~Kor|o^bBB{(mVEUPPAI(S-#s@E**Bwk? z(s{Ev;%3NgK}{ImGe+^tnqbX9A*V`R04#1Koey>v;uw($l^W9KS7qUe*zo!$*-*KD zRl*_NgM_`&`=DJc@`2-(Zq|>U+0F-3CqMp5O+sd8kM49ipsZ8p0pIHlPj^P_iLNp3 zgQ{0!nVF+cvi_2EtHKXzGw{P;dd?-PA@h-1rf2Nc^^v_TI*Zix<4O9sdoAz9$encY z6mn8V2ms8G)Yk_)+^b&JCB^PyufA$e-1T1#BLsI4!S%+oCwIvIV-|7{48nJzyl;+_U-=Ru#T8K=&fODPh()Jca$Z1}mu7&qpoA+X& zA6&G=cYF?fz9n|_m>jTjnC?ZVlB9uI?EljfvNm;1q%TGSH?E0F{Aaj^nyzZ)<5yw- E1Dq3%F#rGn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_author.xml b/app/src/main/res/drawable/ic_author.xml deleted file mode 100644 index 81cffc428..000000000 --- a/app/src/main/res/drawable/ic_author.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_changelog.xml b/app/src/main/res/drawable/ic_changelog.xml index f4b1dd42b..df99d5310 100644 --- a/app/src/main/res/drawable/ic_changelog.xml +++ b/app/src/main/res/drawable/ic_changelog.xml @@ -1,4 +1,10 @@ - - + + + diff --git a/app/src/main/res/drawable/ic_splash_activity.xml b/app/src/main/res/drawable/ic_splash_activity.xml index fbc416e10..c7e7bd75e 100644 --- a/app/src/main/res/drawable/ic_splash_activity.xml +++ b/app/src/main/res/drawable/ic_splash_activity.xml @@ -1,13 +1,12 @@ - + + android:src="@drawable/logo"/> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_support.xml b/app/src/main/res/drawable/ic_support.xml deleted file mode 100644 index 6ab452192..000000000 --- a/app/src/main/res/drawable/ic_support.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/app/src/main/res/layout/activity_container.xml b/app/src/main/res/layout/activity_container.xml new file mode 100644 index 000000000..593b14b38 --- /dev/null +++ b/app/src/main/res/layout/activity_container.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_repo.xml b/app/src/main/res/layout/list_item_repo.xml index f8ae2c526..762172a50 100644 --- a/app/src/main/res/layout/list_item_repo.xml +++ b/app/src/main/res/layout/list_item_repo.xml @@ -1,6 +1,6 @@ - + card_view:cardElevation="@dimen/card_elevation" + card_view:cardUseCompatPadding="true"> + android:textStyle="bold|italic"/> @@ -68,9 +68,9 @@ android:layout_alignParentStart="true" android:layout_below="@id/author" android:layout_gravity="center_vertical" - android:textAppearance="?android:attr/textAppearanceSmall" android:text="@string/no_info_provided" - android:textIsSelectable="false" /> + android:textAppearance="?android:attr/textAppearanceSmall" + android:textIsSelectable="false"/> + android:gravity="end"/> - + android:orientation="horizontal"> + android:background="?android:attr/selectableItemBackground" + android:padding="15dp" + android:src="@drawable/ic_changelog" + android:tint="@color/icon_grey"/> + android:background="?android:attr/selectableItemBackground" + android:padding="15dp" + android:src="@drawable/ic_person" + android:tint="@color/icon_grey"/> + android:background="?android:attr/selectableItemBackground" + android:padding="15dp" + android:src="@drawable/ic_help" + android:tint="@color/icon_grey"/> @@ -143,7 +147,7 @@ android:layout_marginStart="@dimen/card_imageview_margin" android:focusable="false" android:gravity="end" - android:visibility="gone" /> + android:visibility="gone"/> diff --git a/app/src/main/res/layout/toolbar.xml b/app/src/main/res/layout/toolbar.xml index 427d51b45..f7311d812 100644 --- a/app/src/main/res/layout/toolbar.xml +++ b/app/src/main/res/layout/toolbar.xml @@ -4,5 +4,4 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" - - /> \ No newline at end of file + android:elevation="4dp"/> diff --git a/app/src/main/res/menu/drawer.xml b/app/src/main/res/menu/drawer.xml index ed0f83634..65910a30b 100644 --- a/app/src/main/res/menu/drawer.xml +++ b/app/src/main/res/menu/drawer.xml @@ -20,26 +20,30 @@ android:icon="@drawable/ic_cloud_download" android:title="@string/downloads"/> - - + + + + + + - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 542a451e3..21e346955 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,9 +5,11 @@ #00796B #FFC107 #757575 + #F44336 #4CAF50 #9E9E9E + #2196F3 #FFC107 #3F51B5 @@ -17,9 +19,5 @@ #dedede #dedede #313131 - #FF9800 - @color/dh_accent - @color/red500 - - + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e46416ae9..c97efd694 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -11,10 +11,6 @@ false true @android:color/transparent - @color/green500 - @color/yellow500 - @color/red500 - @color/grey500 - - -