Fix possible crash & layout adjustments & transparent status bar

This commit is contained in:
NekoInverter 2020-02-07 11:56:04 +08:00
parent fac904009d
commit 6adf2bc14d
16 changed files with 124 additions and 78 deletions

View File

@ -7,8 +7,8 @@ android {
applicationId "org.meowcat.edxposed.manager" applicationId "org.meowcat.edxposed.manager"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 27 targetSdkVersion 27
versionCode 45405 versionCode 45406
versionName "4.5.4.1" versionName "4.5.4.2"
} }
buildTypes { buildTypes {
release { release {
@ -34,7 +34,7 @@ dependencies {
implementation 'com.google.android.material:material:1.2.0-alpha04' implementation 'com.google.android.material:material:1.2.0-alpha04'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation "com.github.topjohnwu.libsu:core:2.5.0" implementation "com.github.topjohnwu.libsu:core:2.5.1"
implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.browser:browser:1.2.0'
implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar' implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
implementation 'com.takisoft.preferencex:preferencex:1.1.0' implementation 'com.takisoft.preferencex:preferencex:1.1.0'

View File

@ -21,6 +21,7 @@ import androidx.annotation.StyleRes;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@ -85,6 +86,13 @@ public class BaseActivity extends AppCompatActivity {
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (!(this instanceof MainActivity) && !XposedApp.getPreferences().getBoolean("black_dark_theme", false)) {
if (XposedApp.getPreferences().getBoolean("transparent_status_bar", false)) {
getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorActionBar));
} else {
getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));
}
}
if (!Objects.equals(mTheme, getTheme(this))) { if (!Objects.equals(mTheme, getTheme(this))) {
recreate(); recreate();
} }

View File

@ -177,8 +177,10 @@ public class DownloadActivity extends BaseActivity implements RepoLoader.RepoLis
} }
private void reloadItems() { private void reloadItems() {
mAdapter.swapCursor(RepoDb.queryModuleOverview(mSortingOrder, mFilterText)); runOnUiThread(() -> {
mAdapter.notifyDataSetChanged(); mAdapter.swapCursor(RepoDb.queryModuleOverview(mSortingOrder, mFilterText));
mAdapter.notifyDataSetChanged();
});
} }
@Override @Override

View File

@ -54,10 +54,12 @@ import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
@ -72,7 +74,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
private SearchView mSearchView; private SearchView mSearchView;
private SearchView.OnQueryTextListener mSearchListener; private SearchView.OnQueryTextListener mSearchListener;
private PackageManager mPm; private PackageManager mPm;
private DateFormat dateformat = DateFormat.getDateInstance(DateFormat.SHORT); private DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
private ModuleUtil mModuleUtil; private ModuleUtil mModuleUtil;
private ModuleAdapter mAdapter = null; private ModuleAdapter mAdapter = null;
private MenuItem mClickedMenuItem = null; private MenuItem mClickedMenuItem = null;

View File

@ -1,6 +1,7 @@
package org.meowcat.edxposed.manager; package org.meowcat.edxposed.manager;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -16,6 +17,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.SwitchPreference; import androidx.preference.SwitchPreference;
@ -321,6 +323,20 @@ public class SettingsActivity extends BaseActivity {
return (enabled == mDisableResourcesFlag.exists()); return (enabled == mDisableResourcesFlag.exists());
}); });
SwitchPreference transparent_status_bar = findPreference("transparent_status_bar");
Objects.requireNonNull(transparent_status_bar).setOnPreferenceChangeListener((preference, newValue) -> {
boolean enabled = (Boolean) newValue;
Activity activity = getActivity();
if (activity != null && !XposedApp.getPreferences().getBoolean("black_dark_theme", false)) {
if (enabled) {
Objects.requireNonNull(getActivity()).getWindow().setStatusBarColor(ContextCompat.getColor(activity, R.color.colorActionBar));
} else {
Objects.requireNonNull(getActivity()).getWindow().setStatusBarColor(ContextCompat.getColor(activity, R.color.colorPrimaryDark));
}
}
return true;
});
Preference compat_mode = findPreference("compat_mode"); Preference compat_mode = findPreference("compat_mode");
if (compat_mode != null) { if (compat_mode != null) {
compat_mode.setOnPreferenceClickListener(preference -> { compat_mode.setOnPreferenceClickListener(preference -> {

View File

@ -191,7 +191,7 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem
@SuppressWarnings("JavaReflectionMemberAccess") @SuppressWarnings("JavaReflectionMemberAccess")
@SuppressLint({"PrivateApi", "NewApi"}) @SuppressLint({"PrivateApi", "NewApi"})
private void createDirectories() { private void createDirectories() {
//FileUtils.setPermissions(BASE_DIR, 00777, -1, -1); FileUtils.setPermissions(BASE_DIR, 00777, -1, -1);
mkdirAndChmod("conf", 00777); mkdirAndChmod("conf", 00777);
mkdirAndChmod("log", 00777); mkdirAndChmod("log", 00777);
@ -212,7 +212,6 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem
runOnUiThread(() -> { runOnUiThread(() -> {
synchronized (XposedApp.this) { synchronized (XposedApp.this) {
if (mCurrentActivity != null) { if (mCurrentActivity != null) {
mCurrentActivity.setProgressBarIndeterminateVisibility(isLoading);
if (refreshLayout != null) if (refreshLayout != null)
refreshLayout.setRefreshing(isLoading); refreshLayout.setRefreshing(isLoading);
} }
@ -222,8 +221,9 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem
@Override @Override
public synchronized void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) { public synchronized void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {
if (mIsUiLoaded) if (mIsUiLoaded) {
return; return;
}
RepoLoader.getInstance().triggerFirstLoadIfNecessary(); RepoLoader.getInstance().triggerFirstLoadIfNecessary();
mIsUiLoaded = true; mIsUiLoaded = true;
@ -242,7 +242,6 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem
@Override @Override
public synchronized void onActivityPaused(Activity activity) { public synchronized void onActivityPaused(Activity activity) {
activity.setProgressBarIndeterminateVisibility(false);
mCurrentActivity = null; mCurrentActivity = null;
} }

View File

@ -22,11 +22,13 @@ import org.meowcat.edxposed.manager.XposedApp;
import org.meowcat.edxposed.manager.util.InstallApkUtil; import org.meowcat.edxposed.manager.util.InstallApkUtil;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> { public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> {
@ -34,7 +36,7 @@ public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> {
private final ApplicationInfo.DisplayNameComparator displayNameComparator; private final ApplicationInfo.DisplayNameComparator displayNameComparator;
private Callback callback; private Callback callback;
private List<ApplicationInfo> fullList, showList; private List<ApplicationInfo> fullList, showList;
private DateFormat dateformat = DateFormat.getDateInstance(DateFormat.SHORT); private DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
private List<String> checkedList; private List<String> checkedList;
private PackageManager pm; private PackageManager pm;
private ApplicationFilter filter; private ApplicationFilter filter;

View File

@ -15,8 +15,8 @@
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_centerInParent="true"
android:layout_centerInParent="true"> android:orientation="vertical">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/warning_crash" android:id="@+id/warning_crash"

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -8,9 +9,9 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false"
android:orientation="vertical" android:orientation="vertical"
android:padding="8dp" android:padding="8dp"
android:paddingEnd="?android:attr/scrollbarSize"
tools:ignore="RtlSymmetry"> tools:ignore="RtlSymmetry">
<TextView <TextView
@ -34,13 +35,21 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" /> android:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout <com.google.android.material.card.MaterialCardView
android:id="@+id/download_moreinfo_container" android:id="@+id/activity_main_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:orientation="vertical" /> android:layout_marginBottom="10dp"
app:cardCornerRadius="8dp">
<LinearLayout
android:id="@+id/download_moreinfo_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp" />
</com.google.android.material.card.MaterialCardView>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -1,8 +1,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical">
android:padding="8dp">
<TextView <TextView
android:id="@android:id/title" android:id="@android:id/title"

View File

@ -5,74 +5,74 @@
android:layout_gravity="center" android:layout_gravity="center"
android:background="?selectableItemBackground" android:background="?selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true">
android:minHeight="?android:attr/listPreferredItemHeight">
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight" android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="8dp" android:padding="8dp"
android:paddingStart="18dp"
android:paddingEnd="12dp"> android:paddingEnd="12dp">
<ImageView
android:id="@+id/app_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentTop="true"
tools:ignore="ContentDescription" />
<LinearLayout <LinearLayout
android:id="@+id/linear"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_marginStart="8dp"
android:layout_toEndOf="@id/app_icon">
<TextView
android:id="@+id/app_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:singleLine="false"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textIsSelectable="false" />
<TextView
android:id="@+id/version_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:ellipsize="marquee"
android:gravity="end"
android:marqueeRepeatLimit="marquee_forever"
android:maxWidth="100dp"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textIsSelectable="false"
tools:ignore="RtlHardcoded" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/linear"
android:layout_marginStart="8dp"
android:layout_toStartOf="@id/checkbox" android:layout_toStartOf="@id/checkbox"
android:layout_toEndOf="@id/app_icon"
android:orientation="vertical"> android:orientation="vertical">
<RelativeLayout <TextView
android:layout_width="match_parent" android:id="@+id/package_name"
android:layout_height="48dp"> android:layout_width="wrap_content"
android:layout_height="wrap_content"
<ImageView android:ellipsize="end"
android:id="@+id/app_icon" android:singleLine="true"
android:layout_width="48dp" android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_height="48dp" android:textIsSelectable="false" />
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/app_icon"
android:layout_marginStart="8dp"
android:layout_toEndOf="@id/app_icon"
android:singleLine="false"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textIsSelectable="false" />
<TextView
android:id="@+id/version_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/app_name"
android:layout_marginStart="4dip"
android:layout_toEndOf="@id/app_name"
android:ellipsize="marquee"
android:maxWidth="100dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/tertiary_text_dark"
android:textIsSelectable="false"
tools:ignore="RtlHardcoded" />
<TextView
android:id="@+id/package_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/app_name"
android:layout_alignBottom="@id/app_icon"
android:layout_marginStart="8dp"
android:layout_toEndOf="@id/app_icon"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textIsSelectable="false" />
</RelativeLayout>
<TextView <TextView
android:id="@+id/timestamps" android:id="@+id/timestamps"

View File

@ -293,8 +293,9 @@
<string name="pref_disable_modules_log_summary">模块抛出的的异常堆栈仍将正常抓取</string> <string name="pref_disable_modules_log_summary">模块抛出的的异常堆栈仍将正常抓取</string>
<string name="follow_system">跟随系统</string> <string name="follow_system">跟随系统</string>
<string name="pure_black_dark_theme">使用纯黑深色主题</string>> <string name="pure_black_dark_theme">使用纯黑深色主题</string>>
<string name="install_timestamps">安装于 %1$s \u00b7 更新于 %2$s</string> <string name="install_timestamps">安装于 %1$s\n更新于 %2$s</string>
<string name="pref_compat_mode_summary">兼容模式应用列表</string> <string name="pref_compat_mode_summary">兼容模式应用列表</string>
<string name="pref_compat_mode_title">兼容模式</string> <string name="pref_compat_mode_title">兼容模式</string>
<string name="xposed_not_active">EdXposed 框架未安装或未激活, 您可在设置中关闭状态检查</string> <string name="xposed_not_active">EdXposed 框架未安装或未激活, 您可在设置中关闭状态检查</string>
<string name="transparent_status_bar">透明状态栏</string>
</resources> </resources>

View File

@ -293,8 +293,9 @@
<string name="pref_disable_modules_log_summary">模塊拋出的的異常堆棧仍將正常抓取</string> <string name="pref_disable_modules_log_summary">模塊拋出的的異常堆棧仍將正常抓取</string>
<string name="follow_system">跟隨系統</string> <string name="follow_system">跟隨系統</string>
<string name="pure_black_dark_theme">使用純黑深色主題</string>> <string name="pure_black_dark_theme">使用純黑深色主題</string>>
<string name="install_timestamps">安裝於 %1$s \u00b7 更新於 %2$s</string> <string name="install_timestamps">安裝於 %1$s\n更新於 %2$s</string>
<string name="pref_compat_mode_summary">兼容模式應用列表</string> <string name="pref_compat_mode_summary">兼容模式應用列表</string>
<string name="pref_compat_mode_title">兼容模式</string> <string name="pref_compat_mode_title">兼容模式</string>
<string name="xposed_not_active">EdXposed 框架未安裝或未啟用, 您可在設定中關閉狀態檢查</string> <string name="xposed_not_active">EdXposed 框架未安裝或未啟用, 您可在設定中關閉狀態檢查</string>
<string name="transparent_status_bar">透明狀態欄</string>
</resources> </resources>

View File

@ -293,8 +293,9 @@
<string name="pref_disable_modules_log_summary">模組丟擲的的異常堆疊仍將正常抓取</string> <string name="pref_disable_modules_log_summary">模組丟擲的的異常堆疊仍將正常抓取</string>
<string name="follow_system">跟隨系統</string> <string name="follow_system">跟隨系統</string>
<string name="pure_black_dark_theme">使用純黑深色主題</string>> <string name="pure_black_dark_theme">使用純黑深色主題</string>>
<string name="install_timestamps">安裝於 %1$s \u00b7 更新於 %2$s</string> <string name="install_timestamps">安裝於 %1$s\n更新於 %2$s</string>
<string name="pref_compat_mode_summary">相容模式應用列表</string> <string name="pref_compat_mode_summary">相容模式應用列表</string>
<string name="pref_compat_mode_title">相容模式</string> <string name="pref_compat_mode_title">相容模式</string>
<string name="xposed_not_active">EdXposed 框架未安裝或未啟用, 您可在設定中關閉狀態檢查</string> <string name="xposed_not_active">EdXposed 框架未安裝或未啟用, 您可在設定中關閉狀態檢查</string>
<string name="transparent_status_bar">透明狀態列</string>
</resources> </resources>

View File

@ -88,7 +88,7 @@
<string name="download_status_installed">Installed (version %s)</string> <string name="download_status_installed">Installed (version %s)</string>
<string name="download_status_update_available">Update available (version %1$s \u2192 %2$s)</string> <string name="download_status_update_available">Update available (version %1$s \u2192 %2$s)</string>
<string name="download_timestamps">Added on %1$s \u00b7 Updated on %2$s</string> <string name="download_timestamps">Added on %1$s \u00b7 Updated on %2$s</string>
<string name="install_timestamps">Installed on %1$s \nUpdated on %2$s</string> <string name="install_timestamps">Installed on %1$s\nUpdated on %2$s</string>
<string name="download_sorting_title">Sorting order</string> <string name="download_sorting_title">Sorting order</string>
<string name="download_sorting_status">Sort by status</string> <string name="download_sorting_status">Sort by status</string>
<string name="download_sorting_updated">Sort by last update</string> <string name="download_sorting_updated">Sort by last update</string>
@ -331,4 +331,5 @@
<string name="pref_compat_mode_title">Compat List</string> <string name="pref_compat_mode_title">Compat List</string>
<string name="pref_compat_mode_summary">Compat mode app list</string> <string name="pref_compat_mode_summary">Compat mode app list</string>
<string name="xposed_not_active">EdXposed Framework is not currently installed or active\nYou can close status check in settings</string> <string name="xposed_not_active">EdXposed Framework is not currently installed or active\nYou can close status check in settings</string>
<string name="transparent_status_bar">Transparent status bar</string>
</resources> </resources>

View File

@ -19,6 +19,11 @@
android:title="@string/pure_black_dark_theme" android:title="@string/pure_black_dark_theme"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<SwitchPreference
android:key="transparent_status_bar"
android:title="@string/transparent_status_bar"
app:iconSpaceReserved="false" />
<SwitchPreference <SwitchPreference
android:defaultValue="true" android:defaultValue="true"
android:key="confirm_reboots" android:key="confirm_reboots"