From e39c99844bc25350532a95e3f4e42a95ca16913b Mon Sep 17 00:00:00 2001 From: tehcneko <7764726+tehcneko@users.noreply.github.com> Date: Fri, 12 Feb 2021 21:17:02 +0800 Subject: [PATCH] [app] Use rikka's libraries --- app/build.gradle | 8 ++- .../java/io/github/lsposed/manager/App.java | 3 + .../manager/ui/activity/AboutActivity.java | 2 - .../manager/ui/activity/AppListActivity.java | 15 +--- .../manager/ui/activity/BaseActivity.java | 28 ++------ .../manager/ui/activity/LogsActivity.java | 11 +-- .../manager/ui/activity/ModulesActivity.java | 18 ++--- .../manager/ui/activity/RepoActivity.java | 21 +++--- .../manager/ui/activity/RepoItemActivity.java | 20 ++++-- .../manager/ui/activity/SettingsActivity.java | 57 +++++++-------- .../github/lsposed/manager/util/Version.java | 24 ++++--- app/src/main/res/animator/alpha_animator.xml | 42 +++++++++++ app/src/main/res/drawable/ic_github.xml | 3 +- .../res/drawable/ic_telegram_2019_logo.xml | 6 +- app/src/main/res/layout/activity_about.xml | 60 +++++++++------- app/src/main/res/layout/activity_app_list.xml | 61 ++++++++++------ app/src/main/res/layout/activity_list.xml | 58 +++++++++++++++ app/src/main/res/layout/activity_logs.xml | 72 +++++++++++-------- .../res/layout/activity_module_detail.xml | 58 +++++++-------- app/src/main/res/layout/activity_settings.xml | 18 +++-- app/src/main/res/layout/item_repo_readme.xml | 12 ++-- .../res/layout/item_repo_recyclerview.xml | 8 ++- .../res/layout/preference_recyclerview.xml | 37 ++++++++++ app/src/main/res/values/dimens.xml | 3 +- app/src/main/res/values/styles.xml | 33 ++++++++- app/src/main/res/xml/prefs.xml | 14 ++-- 26 files changed, 449 insertions(+), 243 deletions(-) create mode 100644 app/src/main/res/animator/alpha_animator.xml create mode 100644 app/src/main/res/layout/activity_list.xml create mode 100644 app/src/main/res/layout/preference_recyclerview.xml diff --git a/app/build.gradle b/app/build.gradle index 28e704e4..f6f86603 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,9 +61,10 @@ android { dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.3.0-beta01' + implementation "androidx.activity:activity:1.3.0-alpha02" implementation 'androidx.browser:browser:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation "androidx.fragment:fragment:1.3.0" implementation "androidx.recyclerview:recyclerview:1.1.0" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'com.caverock:androidsvg-aar:1.4' @@ -84,8 +85,12 @@ dependencies { implementation "io.noties.markwon:html:$markwon_version" implementation "io.noties.markwon:image-glide:$markwon_version" implementation "io.noties.markwon:linkify:$markwon_version" + implementation "rikka.appcompat:appcompat:1.2.0-rc01" + implementation "rikka.core:core:1.3.0" implementation 'rikka.insets:insets:1.0.1' + implementation 'rikka.material:material:1.6.0' implementation 'rikka.recyclerview:recyclerview-utils:1.2.0' + implementation "rikka.widget:borderview:1.0.0" implementation "rikka.widget:switchbar:1.0.2" implementation 'rikka.layoutinflater:layoutinflater:1.0.1' implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2' @@ -98,4 +103,5 @@ dependencies { configurations { cleanedAnnotations compile.exclude group: 'org.jetbrains' , module:'annotations' + compile.exclude group: 'androidx.appcompat', module: 'appcompat' } diff --git a/app/src/main/java/io/github/lsposed/manager/App.java b/app/src/main/java/io/github/lsposed/manager/App.java index c99a488e..f773c4cb 100644 --- a/app/src/main/java/io/github/lsposed/manager/App.java +++ b/app/src/main/java/io/github/lsposed/manager/App.java @@ -19,6 +19,7 @@ import io.github.lsposed.manager.ui.activity.CrashReportActivity; import io.github.lsposed.manager.util.DoHDNS; import okhttp3.Cache; import okhttp3.OkHttpClient; +import rikka.material.app.DayNightDelegate; public class App extends Application { public static final String TAG = "LSPosedManager"; @@ -71,6 +72,8 @@ public class App extends Application { instance = this; pref = PreferenceManager.getDefaultSharedPreferences(this); + DayNightDelegate.setApplicationContext(this); + DayNightDelegate.setDefaultNightMode(pref.getInt("theme", -1)); RepoLoader.getInstance().loadRemoteData(); } diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/AboutActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/AboutActivity.java index 5f0f7994..6056eec6 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/AboutActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/AboutActivity.java @@ -4,7 +4,6 @@ import android.os.Bundle; import android.view.View; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatDelegate; import io.github.lsposed.manager.R; import io.github.lsposed.manager.databinding.ActivityAboutBinding; @@ -15,7 +14,6 @@ public class AboutActivity extends BaseActivity { @Override public void onCreate(Bundle savedInstanceState) { - getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES); super.onCreate(savedInstanceState); binding = ActivityAboutBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/AppListActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/AppListActivity.java index 012a810c..e1a59ebb 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/AppListActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/AppListActivity.java @@ -35,12 +35,6 @@ public class AppListActivity extends BaseActivity { private SearchView.OnQueryTextListener searchListener; private ActivityAppListBinding binding; - private final Runnable runnable = new Runnable() { - @Override - public void run() { - binding.swipeRefreshLayout.setRefreshing(true); - } - }; private final Handler handler = new Handler(Looper.getMainLooper()); public ActivityResultLauncher backupLauncher; public ActivityResultLauncher restoreLauncher; @@ -52,9 +46,9 @@ public class AppListActivity extends BaseActivity { String moduleName = getIntent().getStringExtra("moduleName"); binding = ActivityAppListBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); + setAppBar(binding.appBar, binding.toolbar); + binding.appBar.setRaised(true); binding.toolbar.setNavigationOnClickListener(view -> onBackPressed()); - binding.appBar.setLiftOnScroll(false); ActionBar bar = getSupportActionBar(); assert bar != null; bar.setDisplayHomeAsUpEnabled(true); @@ -65,15 +59,12 @@ public class AppListActivity extends BaseActivity { binding.recyclerView.setAdapter(scopeAdapter); binding.recyclerView.setHasFixedSize(true); binding.recyclerView.setLayoutManager(new LinearLayoutManagerFix(this)); - RecyclerViewKt.addFastScroller(binding.recyclerView, binding.swipeRefreshLayout); RecyclerViewKt.fixEdgeEffect(binding.recyclerView, false, true); if (!preferences.getBoolean("md2", true)) { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); binding.recyclerView.addItemDecoration(dividerItemDecoration); } - handler.postDelayed(runnable, 300); - binding.swipeRefreshLayout.setOnRefreshListener(scopeAdapter::refresh); searchListener = new SearchView.OnQueryTextListener() { @Override @@ -161,8 +152,6 @@ public class AppListActivity extends BaseActivity { } public void onDataReady() { - handler.removeCallbacks(runnable); - binding.swipeRefreshLayout.setRefreshing(false); String queryStr = searchView != null ? searchView.getQuery().toString() : ""; runOnUiThread(() -> scopeAdapter.getFilter().filter(queryStr)); } diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/BaseActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/BaseActivity.java index 26c24a2d..9a85eb24 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/BaseActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/BaseActivity.java @@ -6,12 +6,10 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Bundle; -import android.view.LayoutInflater; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StyleRes; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -24,11 +22,11 @@ import io.github.lsposed.manager.Constants; import io.github.lsposed.manager.R; import io.github.lsposed.manager.util.CustomThemeColor; import io.github.lsposed.manager.util.CustomThemeColors; -import io.github.lsposed.manager.util.InsetsViewInflater; import io.github.lsposed.manager.util.NavUtil; import io.github.lsposed.manager.util.Version; +import rikka.material.app.MaterialActivity; -public class BaseActivity extends AppCompatActivity { +public class BaseActivity extends MaterialActivity { private static final String THEME_DEFAULT = "DEFAULT"; private static final String THEME_BLACK = "BLACK"; @@ -43,9 +41,6 @@ public class BaseActivity extends AppCompatActivity { return preferences.getBoolean("black_dark_theme", false); } - private void onInstallViewFactory(LayoutInflater layoutInflater) { - layoutInflater.setFactory2(new InsetsViewInflater(getDelegate())); - } public String getTheme(Context context) { if (isBlackNightTheme() @@ -61,9 +56,6 @@ public class BaseActivity extends AppCompatActivity { @StyleRes public int getThemeStyleRes(Context context) { - if (this instanceof AboutActivity) { - return R.style.ThemeOverlay_Black; - } switch (getTheme(context)) { case THEME_BLACK: return R.style.ThemeOverlay_Black; @@ -98,9 +90,7 @@ public class BaseActivity extends AppCompatActivity { @Override public void onCreate(@Nullable Bundle savedInstanceState) { - onInstallViewFactory(LayoutInflater.from(this)); super.onCreate(savedInstanceState); - AppCompatDelegate.setDefaultNightMode(preferences.getInt("theme", -1)); theme = getTheme(this) + getCustomTheme() + preferences.getBoolean("md2", true); // make sure the versions are consistent @@ -131,22 +121,14 @@ public class BaseActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - if (!(this instanceof MainActivity)) { - if (preferences.getBoolean("transparent_status_bar", false)) { - getWindow().setStatusBarColor(getThemedColor(R.attr.colorActionBar)); - } else { - getWindow().setStatusBarColor(getThemedColor(R.attr.colorPrimaryDark)); - } - } else { - getWindow().setStatusBarColor(0); - } + getWindow().setStatusBarColor(0); if (!Objects.equals(theme, getTheme(this) + getCustomTheme() + preferences.getBoolean("md2", true))) { recreate(); } } @Override - protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { + protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resid, boolean first) { // apply real style and our custom style if (getParent() == null) { theme.applyStyle(resid, true); diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/LogsActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/LogsActivity.java index 5389fce6..55d82312 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/LogsActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/LogsActivity.java @@ -69,13 +69,14 @@ public class LogsActivity extends BaseActivity { super.onCreate(savedInstanceState); binding = ActivityLogsBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); - binding.toolbar.setNavigationOnClickListener(view -> finish()); + setAppBar(binding.appBar, binding.toolbar); + binding.getRoot().bringChildToFront(binding.appBar); + binding.toolbar.setNavigationOnClickListener(view -> onBackPressed()); + binding.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top)); ActionBar bar = getSupportActionBar(); if (bar != null) { bar.setDisplayHomeAsUpEnabled(true); } - if (!preferences.getBoolean("hide_logcat_warning", false)) { DialogInstallWarningBinding binding = DialogInstallWarningBinding.inflate(getLayoutInflater()); new MaterialAlertDialogBuilder(this) @@ -97,9 +98,11 @@ public class LogsActivity extends BaseActivity { try { if (Files.readAllBytes(Paths.get(Constants.getMiscDir(), "disable_verbose_log"))[0] == 49) { binding.slidingTabs.setVisibility(View.GONE); + } else { + RecyclerViewKt.addVerticalPadding(binding.recyclerView, 48, 0); } } catch (Exception e) { - e.printStackTrace(); + binding.slidingTabs.setVisibility(View.GONE); } binding.slidingTabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java index 5e68d8d4..36ee6a3f 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/ModulesActivity.java @@ -44,7 +44,7 @@ import java.util.List; import io.github.lsposed.manager.Constants; import io.github.lsposed.manager.R; import io.github.lsposed.manager.adapters.AppHelper; -import io.github.lsposed.manager.databinding.ActivityAppListBinding; +import io.github.lsposed.manager.databinding.ActivityListBinding; import io.github.lsposed.manager.util.GlideApp; import io.github.lsposed.manager.util.LinearLayoutManagerFix; import io.github.lsposed.manager.util.ModuleUtil; @@ -54,7 +54,7 @@ import static android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS; public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleListener { - ActivityAppListBinding binding; + ActivityListBinding binding; private SearchView searchView; private SearchView.OnQueryTextListener mSearchListener; private PackageManager pm; @@ -65,12 +65,12 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - binding = ActivityAppListBinding.inflate(getLayoutInflater()); + binding = ActivityListBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); + setAppBar(binding.appBar, binding.toolbar); + binding.getRoot().bringChildToFront(binding.appBar); binding.toolbar.setNavigationOnClickListener(view -> onBackPressed()); - binding.appBar.setLiftOnScrollTargetViewId(R.id.recyclerView); - binding.masterSwitch.setVisibility(View.GONE); + binding.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top)); ActionBar bar = getSupportActionBar(); if (bar != null) { bar.setDisplayHomeAsUpEnabled(true); @@ -83,14 +83,14 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi binding.recyclerView.setAdapter(adapter); binding.recyclerView.setHasFixedSize(true); binding.recyclerView.setLayoutManager(new LinearLayoutManagerFix(this)); - RecyclerViewKt.addFastScroller(binding.recyclerView, binding.swipeRefreshLayout); + //RecyclerViewKt.addFastScroller(binding.recyclerView, binding.swipeRefreshLayout); RecyclerViewKt.fixEdgeEffect(binding.recyclerView, false, true); if (!preferences.getBoolean("md2", true)) { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); binding.recyclerView.addItemDecoration(dividerItemDecoration); } - binding.swipeRefreshLayout.setOnRefreshListener(() -> adapter.refresh(true)); + //binding.swipeRefreshLayout.setOnRefreshListener(() -> adapter.refresh(true)); mSearchListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { @@ -310,7 +310,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi } }); showList = fullList; - binding.swipeRefreshLayout.setRefreshing(false); + //binding.swipeRefreshLayout.setRefreshing(false); String queryStr = searchView != null ? searchView.getQuery().toString() : ""; runOnUiThread(() -> getFilter().filter(queryStr)); moduleUtil.updateModulesList(); diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoActivity.java index 86ebc62b..bcc57fdd 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoActivity.java @@ -46,7 +46,7 @@ import java.util.List; import java.util.stream.Collectors; import io.github.lsposed.manager.R; -import io.github.lsposed.manager.databinding.ActivityAppListBinding; +import io.github.lsposed.manager.databinding.ActivityListBinding; import io.github.lsposed.manager.repo.RepoLoader; import io.github.lsposed.manager.repo.model.OnlineModule; import io.github.lsposed.manager.util.LinearLayoutManagerFix; @@ -56,18 +56,18 @@ public class RepoActivity extends BaseActivity implements RepoLoader.Listener { private final RepoLoader repoLoader = RepoLoader.getInstance(); private SearchView searchView; private SearchView.OnQueryTextListener searchListener; - private ActivityAppListBinding binding; + private ActivityListBinding binding; private RepoAdapter adapter; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - binding = ActivityAppListBinding.inflate(getLayoutInflater()); + binding = ActivityListBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); + setAppBar(binding.appBar, binding.toolbar); + binding.getRoot().bringChildToFront(binding.appBar); binding.toolbar.setNavigationOnClickListener(view -> onBackPressed()); - binding.appBar.setLiftOnScrollTargetViewId(R.id.recyclerView); - binding.masterSwitch.setVisibility(View.GONE); + binding.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top)); ActionBar bar = getSupportActionBar(); assert bar != null; bar.setDisplayHomeAsUpEnabled(true); @@ -76,7 +76,6 @@ public class RepoActivity extends BaseActivity implements RepoLoader.Listener { binding.recyclerView.setAdapter(adapter); binding.recyclerView.setHasFixedSize(true); binding.recyclerView.setLayoutManager(new LinearLayoutManagerFix(this)); - RecyclerViewKt.addFastScroller(binding.recyclerView, binding.swipeRefreshLayout); RecyclerViewKt.fixEdgeEffect(binding.recyclerView, false, true); if (!preferences.getBoolean("md2", true)) { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, @@ -84,7 +83,6 @@ public class RepoActivity extends BaseActivity implements RepoLoader.Listener { binding.recyclerView.addItemDecoration(dividerItemDecoration); } repoLoader.addListener(this); - binding.swipeRefreshLayout.setOnRefreshListener(repoLoader::loadRemoteData); searchListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { @@ -114,10 +112,7 @@ public class RepoActivity extends BaseActivity implements RepoLoader.Listener { @Override public void repoLoaded() { - runOnUiThread(() -> { - binding.swipeRefreshLayout.setRefreshing(false); - adapter.setData(repoLoader.getOnlineModules()); - }); + runOnUiThread(() -> adapter.setData(repoLoader.getOnlineModules())); } @Override @@ -178,7 +173,7 @@ public class RepoActivity extends BaseActivity implements RepoLoader.Listener { public void initData() { Collection modules = repoLoader.getOnlineModules(); if (!repoLoader.isRepoLoaded()) { - binding.swipeRefreshLayout.setRefreshing(true); + //binding.swipeRefreshLayout.setRefreshing(true); repoLoader.loadRemoteData(); } else { adapter.setData(modules); diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoItemActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoItemActivity.java index d2a81e69..5d1c1868 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoItemActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/RepoItemActivity.java @@ -73,6 +73,9 @@ import io.noties.markwon.image.glide.GlideImagesPlugin; import io.noties.markwon.linkify.LinkifyPlugin; import io.noties.markwon.utils.NoCopySpannableFactory; import rikka.recyclerview.RecyclerViewKt; +import rikka.widget.borderview.BorderNestedScrollView; +import rikka.widget.borderview.BorderRecyclerView; +import rikka.widget.borderview.BorderViewDelegate; public class RepoItemActivity extends BaseActivity { ActivityModuleDetailBinding binding; @@ -86,7 +89,8 @@ public class RepoItemActivity extends BaseActivity { String modulePackageName = getIntent().getStringExtra("modulePackageName"); String moduleName = getIntent().getStringExtra("moduleName"); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); + setAppBar(binding.appBar, binding.toolbar); + binding.getRoot().bringChildToFront(binding.appBar); binding.toolbar.setNavigationOnClickListener(view -> onBackPressed()); ActionBar bar = getSupportActionBar(); assert bar != null; @@ -107,11 +111,15 @@ public class RepoItemActivity extends BaseActivity { binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { + BorderViewDelegate delegate; if (position == 0) { - binding.appBar.setLiftOnScrollTargetViewId(R.id.scrollView); + BorderNestedScrollView borderNestedScrollView = findViewById(R.id.scrollView); + delegate = borderNestedScrollView.getBorderViewDelegate(); } else { - binding.appBar.setLiftOnScrollTargetViewId(R.id.recyclerView); + BorderRecyclerView borderRecyclerView = findViewById(R.id.recyclerView); + delegate = borderRecyclerView.getBorderViewDelegate(); } + binding.appBar.setRaised(!delegate.isShowingTopBorder()); } }); int[] titles = new int[]{R.string.module_readme, R.string.module_releases, R.string.module_information}; @@ -302,6 +310,7 @@ public class RepoItemActivity extends BaseActivity { switch (position) { case 0: holder.textView.setTransformationMethod(new LinkTransformationMethod(RepoItemActivity.this)); + holder.scrollView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top)); markwon.setMarkdown(holder.textView, module.getReadme()); break; case 1: @@ -312,6 +321,7 @@ public class RepoItemActivity extends BaseActivity { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(RepoItemActivity.this, DividerItemDecoration.VERTICAL); holder.recyclerView.addItemDecoration(dividerItemDecoration); } + holder.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top)); RecyclerViewKt.fixEdgeEffect(holder.recyclerView, false, true); RecyclerViewKt.addFastScroller(holder.recyclerView, holder.itemView); break; @@ -330,12 +340,14 @@ public class RepoItemActivity extends BaseActivity { class ViewHolder extends RecyclerView.ViewHolder { TextView textView; - RecyclerView recyclerView; + BorderNestedScrollView scrollView; + BorderRecyclerView recyclerView; public ViewHolder(@NonNull View itemView, int viewType) { super(itemView); if (viewType == 0) { textView = itemView.findViewById(R.id.readme); + scrollView = itemView.findViewById(R.id.scrollView); } else { recyclerView = itemView.findViewById(R.id.recyclerView); } diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java index 59aa92b0..8fac51dc 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/SettingsActivity.java @@ -4,27 +4,21 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.MotionEvent; -import android.view.View; +import android.view.ViewGroup; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.preference.Preference; -import androidx.preference.SwitchPreferenceCompat; +import androidx.preference.SwitchPreference; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -46,7 +40,9 @@ import io.github.lsposed.manager.databinding.ActivitySettingsBinding; import io.github.lsposed.manager.ui.fragment.StatusDialogBuilder; import io.github.lsposed.manager.ui.widget.IntegerListPreference; import io.github.lsposed.manager.util.BackupUtils; +import rikka.material.app.DayNightDelegate; import rikka.recyclerview.RecyclerViewKt; +import rikka.widget.borderview.BorderRecyclerView; public class SettingsActivity extends BaseActivity { private static final String KEY_PREFIX = SettingsActivity.class.getName() + '.'; @@ -73,7 +69,8 @@ public class SettingsActivity extends BaseActivity { super.onCreate(savedInstanceState); binding = ActivitySettingsBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); + setAppBar(binding.appBar, binding.toolbar); + binding.getRoot().bringChildToFront(binding.appBar); binding.toolbar.setNavigationOnClickListener(view -> finish()); ActionBar bar = getSupportActionBar(); if (bar != null) { @@ -187,7 +184,7 @@ public class SettingsActivity extends BaseActivity { addPreferencesFromResource(R.xml.prefs); boolean installed = Constants.getXposedVersion() != null; - SwitchPreferenceCompat prefVerboseLogs = findPreference("disable_verbose_log"); + SwitchPreference prefVerboseLogs = findPreference("disable_verbose_log"); if (prefVerboseLogs != null) { if (requireActivity().getApplicationInfo().uid / 100000 != 0) { prefVerboseLogs.setVisible(false); @@ -211,7 +208,7 @@ public class SettingsActivity extends BaseActivity { } } - SwitchPreferenceCompat prefEnableResources = findPreference("enable_resources"); + SwitchPreference prefEnableResources = findPreference("enable_resources"); if (prefEnableResources != null) { prefEnableResources.setEnabled(installed); prefEnableResources.setChecked(Files.exists(enableResourcesFlag)); @@ -265,7 +262,7 @@ public class SettingsActivity extends BaseActivity { }); } - SwitchPreferenceCompat transparent = findPreference("transparent_status_bar"); + SwitchPreference transparent = findPreference("transparent_status_bar"); if (transparent != null) { transparent.setOnPreferenceChangeListener((preference, newValue) -> { boolean enabled = (Boolean) newValue; @@ -284,12 +281,18 @@ public class SettingsActivity extends BaseActivity { IntegerListPreference theme = findPreference("theme"); if (theme != null) { theme.setOnPreferenceChangeListener((preference, newValue) -> { - AppCompatDelegate.setDefaultNightMode(Integer.parseInt((String) newValue)); + if (preferences.getInt("theme", -1) != Integer.parseInt((String) newValue)) { + DayNightDelegate.setDefaultNightMode(Integer.parseInt((String) newValue)); + SettingsActivity activity = (SettingsActivity) getActivity(); + if (activity != null) { + activity.restart(); + } + } return true; }); } - SwitchPreferenceCompat black_dark_theme = findPreference("black_dark_theme"); + SwitchPreference black_dark_theme = findPreference("black_dark_theme"); if (black_dark_theme != null) { black_dark_theme.setOnPreferenceChangeListener((preference, newValue) -> { SettingsActivity activity = (SettingsActivity) getActivity(); @@ -333,7 +336,7 @@ public class SettingsActivity extends BaseActivity { }); } - SwitchPreferenceCompat md2 = findPreference("md2"); + SwitchPreference md2 = findPreference("md2"); if (md2 != null) { md2.setOnPreferenceChangeListener((preference, newValue) -> { SettingsActivity activity = (SettingsActivity) getActivity(); @@ -383,18 +386,16 @@ public class SettingsActivity extends BaseActivity { } @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - RecyclerView recyclerView = getListView(); - recyclerView.setClipToPadding(false); - RecyclerViewKt.fixEdgeEffect(recyclerView, false, true); - ViewCompat.setOnApplyWindowInsetsListener(recyclerView, (v, insets) -> { - Insets insets1 = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime()); - v.setPadding(0, 0, 0, insets1.bottom); - return WindowInsetsCompat.CONSUMED; - }); - } + public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { + BorderRecyclerView recyclerView = (BorderRecyclerView) super.onCreateRecyclerView(inflater, parent, savedInstanceState); + RecyclerViewKt.fixEdgeEffect(recyclerView, false, true); + recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> { + SettingsActivity activity = (SettingsActivity) getActivity(); + if (activity != null) { + activity.binding.appBar.setRaised(!top); + } + }); + return recyclerView; } } diff --git a/app/src/main/java/io/github/lsposed/manager/util/Version.java b/app/src/main/java/io/github/lsposed/manager/util/Version.java index 274217a2..49f4135b 100644 --- a/app/src/main/java/io/github/lsposed/manager/util/Version.java +++ b/app/src/main/java/io/github/lsposed/manager/util/Version.java @@ -10,38 +10,40 @@ public class Version implements Comparable { } public Version(String version) { - if(version == null) + if (version == null) throw new IllegalArgumentException("Version can not be null"); - if(!version.matches("v[0-9]+(\\.[0-9]+)*")) + if (!version.matches("v[0-9]+(\\.[0-9]+)*")) throw new IllegalArgumentException("Invalid version format"); this.version = version.substring(1); // v } - @Override public int compareTo(Version that) { - if(that == null) + @Override + public int compareTo(Version that) { + if (that == null) return 1; String[] thisParts = this.get().split("\\."); String[] thatParts = that.get().split("\\."); int length = Math.max(thisParts.length, thatParts.length); - for(int i = 0; i < length; i++) { + for (int i = 0; i < length; i++) { int thisPart = i < thisParts.length ? Integer.parseInt(thisParts[i]) : 0; int thatPart = i < thatParts.length ? Integer.parseInt(thatParts[i]) : 0; - if(thisPart < thatPart) + if (thisPart < thatPart) return -1; - if(thisPart > thatPart) + if (thisPart > thatPart) return 1; } return 0; } - @Override public boolean equals(Object that) { - if(this == that) + @Override + public boolean equals(Object that) { + if (this == that) return true; - if(that == null) + if (that == null) return false; - if(this.getClass() != that.getClass()) + if (this.getClass() != that.getClass()) return false; return this.compareTo((Version) that) == 0; } diff --git a/app/src/main/res/animator/alpha_animator.xml b/app/src/main/res/animator/alpha_animator.xml new file mode 100644 index 00000000..c10dd393 --- /dev/null +++ b/app/src/main/res/animator/alpha_animator.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_github.xml b/app/src/main/res/drawable/ic_github.xml index 028f43f9..947b28b6 100644 --- a/app/src/main/res/drawable/ic_github.xml +++ b/app/src/main/res/drawable/ic_github.xml @@ -3,7 +3,8 @@ android:width="24.0dip" android:height="24.0dip" android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:viewportHeight="24.0" + android:tint="?colorControlNormal"> diff --git a/app/src/main/res/drawable/ic_telegram_2019_logo.xml b/app/src/main/res/drawable/ic_telegram_2019_logo.xml index 52d3c921..fe2db669 100644 --- a/app/src/main/res/drawable/ic_telegram_2019_logo.xml +++ b/app/src/main/res/drawable/ic_telegram_2019_logo.xml @@ -2,11 +2,9 @@ android:viewportHeight="240" android:viewportWidth="240" android:width="24dp" - xmlns:android="http://schemas.android.com/apk/res/android"> + xmlns:android="http://schemas.android.com/apk/res/android" + android:tint="?colorControlNormal"> - diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 43155cf1..66418af3 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -38,38 +38,45 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:layout_height="wrap_content" + app:cardBackgroundColor="#000" + app:cardCornerRadius="0dp"> - - - + - - + android:text="LS" /> + + + + + + + + + + app:fitSystemWindowsInsets="start|end"> - + android:fitsSystemWindows="true"> - + + android:orientation="vertical" + android:paddingTop="?actionBarSize" + app:fitSystemWindowsInsets="top" + tools:ignore="MissingPrefix"> - - - - + android:clipToPadding="false" + app:borderTopVisibility="whenTop" + app:borderTopDrawable="@null" + app:borderBottomVisibility="never" + app:fitSystemWindowsInsets="bottom" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml new file mode 100644 index 00000000..90fe4dd2 --- /dev/null +++ b/app/src/main/res/layout/activity_list.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_logs.xml b/app/src/main/res/layout/activity_logs.xml index 5365c5c8..e819b2cc 100644 --- a/app/src/main/res/layout/activity_logs.xml +++ b/app/src/main/res/layout/activity_logs.xml @@ -4,55 +4,67 @@ android:id="@+id/snackbar" android:layout_width="match_parent" android:layout_height="match_parent" - app:consumeSystemWindowsInsets="top|start|end" + app:consumeSystemWindowsInsets="start|end" app:edgeToEdge="true" - app:fitSystemWindowsInsets="top|start|end"> + app:fitSystemWindowsInsets="start|end"> - + android:fitsSystemWindows="true"> - + android:layout_height="match_parent" + android:orientation="vertical"> - + - + - - + - + + + + + android:scrollbars="none"> - + android:paddingTop="?actionBarSize" + app:borderTopVisibility="whenTop" + app:borderTopDrawable="@null" + app:borderBottomVisibility="never" + app:fitSystemWindowsInsets="top|bottom" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_module_detail.xml b/app/src/main/res/layout/activity_module_detail.xml index d3369f3a..84ef42b1 100644 --- a/app/src/main/res/layout/activity_module_detail.xml +++ b/app/src/main/res/layout/activity_module_detail.xml @@ -22,46 +22,42 @@ android:id="@+id/snackbar" android:layout_width="match_parent" android:layout_height="match_parent" - app:consumeSystemWindowsInsets="top|start|end" + app:consumeSystemWindowsInsets="start|end" app:edgeToEdge="true" - app:fitSystemWindowsInsets="top|start|end"> + app:fitSystemWindowsInsets="start|end"> - + android:fitsSystemWindows="true"> - + android:layout_height="match_parent" + android:orientation="vertical"> - + - + + + - - - - - - - - + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index ef1a99ad..48278a3a 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -4,27 +4,31 @@ android:id="@+id/snackbar" android:layout_width="match_parent" android:layout_height="match_parent" - app:consumeSystemWindowsInsets="top|start|end" + app:consumeSystemWindowsInsets="start|end" app:edgeToEdge="true" - app:fitSystemWindowsInsets="top|start|end"> + app:fitSystemWindowsInsets="start|end"> - + android:fitsSystemWindows="true"> - + + + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_repo_readme.xml b/app/src/main/res/layout/item_repo_readme.xml index d0fdce8a..d04e01ee 100644 --- a/app/src/main/res/layout/item_repo_readme.xml +++ b/app/src/main/res/layout/item_repo_readme.xml @@ -24,17 +24,21 @@ android:layout_height="match_parent" android:clipToPadding="false" android:clipChildren="false" - app:fitSystemWindowsInsets="bottom"> + android:paddingTop="104dp" + app:fitSystemWindowsInsets="top|bottom"> - + android:layout_height="match_parent" + app:borderTopVisibility="whenTop" + app:borderTopDrawable="@null" + app:borderBottomVisibility="never"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/item_repo_recyclerview.xml b/app/src/main/res/layout/item_repo_recyclerview.xml index 6fd08478..ff930305 100644 --- a/app/src/main/res/layout/item_repo_recyclerview.xml +++ b/app/src/main/res/layout/item_repo_recyclerview.xml @@ -18,10 +18,14 @@ ~ Copyright (C) 2021 LSPosed Contributors --> - \ No newline at end of file + android:paddingTop="104dp" + app:borderTopVisibility="whenTop" + app:borderTopDrawable="@null" + app:borderBottomVisibility="never" + app:fitSystemWindowsInsets="top|bottom" /> \ No newline at end of file diff --git a/app/src/main/res/layout/preference_recyclerview.xml b/app/src/main/res/layout/preference_recyclerview.xml new file mode 100644 index 00000000..b6decef5 --- /dev/null +++ b/app/src/main/res/layout/preference_recyclerview.xml @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 1bc08727..b7283362 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,3 +1,4 @@ - 48dp\ + 48dp + 48dp \ 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 13fa40ab..f73e0394 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -7,7 +7,6 @@ @color/colorPrimaryDark @color/colorAccent @color/colorActionBar - @style/ThemeOverlay.MaterialComponents.ActionBar @color/colorBackground @color/colorBackground ?selectableItemBackground @@ -25,6 +24,38 @@ @style/ThemeOverlay.SwitchBar @color/switchbar_background_light @color/switchbar_background_light + @style/Widget.Material.ActionBar.Surface + @style/ThemeOverlay.ActionBar + @style/Widget.Material.Toolbar + @style/Widget.AppBar.Surface.Raisable + + + + + + + + + + +