diff --git a/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java b/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java deleted file mode 100644 index 08a08032..00000000 --- a/app/src/main/java/io/github/lsposed/manager/adapters/AppAdapter.java +++ /dev/null @@ -1,318 +0,0 @@ -package io.github.lsposed.manager.adapters; - -import android.annotation.SuppressLint; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.os.AsyncTask; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CompoundButton; -import android.widget.Filter; -import android.widget.Filterable; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.SwitchCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.request.target.CustomTarget; -import com.bumptech.glide.request.transition.Transition; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Locale; - -import io.github.lsposed.manager.App; -import io.github.lsposed.manager.R; -import io.github.lsposed.manager.ui.activity.AppListActivity; -import io.github.lsposed.manager.util.GlideApp; - -public class AppAdapter extends RecyclerView.Adapter implements Filterable { - - protected AppListActivity activity; - protected List fullList, showList; - private final DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); - private List checkedList; - private final PackageManager pm; - private final ApplicationFilter filter; - private final SharedPreferences preferences; - - AppAdapter(AppListActivity activity) { - this.activity = activity; - preferences = App.getPreferences(); - fullList = showList = Collections.emptyList(); - checkedList = Collections.emptyList(); - filter = new ApplicationFilter(); - pm = activity.getPackageManager(); - refresh(); - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View v = LayoutInflater.from(activity).inflate(R.layout.item_module, parent, false); - return new ViewHolder(v); - } - - private void loadApps() { - checkedList = generateCheckedList(); - fullList = pm.getInstalledPackages(PackageManager.GET_META_DATA); - List rmList = new ArrayList<>(); - for (PackageInfo info : fullList) { - if (info.packageName.equals(((ScopeAdapter) this).modulePackageName)) { - rmList.add(info); - continue; - } - if (checkedList.contains(info.packageName)) { - continue; - } - if (!preferences.getBoolean("show_modules", false)) { - if (info.applicationInfo.metaData != null && info.applicationInfo.metaData.containsKey("xposedmodule")) { - rmList.add(info); - continue; - } - } - if (!preferences.getBoolean("show_games", false)) { - if (info.applicationInfo.category == ApplicationInfo.CATEGORY_GAME) { - rmList.add(info); - continue; - } - //noinspection deprecation - if ((info.applicationInfo.flags & ApplicationInfo.FLAG_IS_GAME) != 0) { - rmList.add(info); - continue; - } - } - if ((info.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) == 0 && !info.packageName.equals("android")) { - rmList.add(info); - continue; - } - if (!preferences.getBoolean("show_system_apps", false) && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - rmList.add(info); - } - } - if (rmList.size() > 0) { - fullList.removeAll(rmList); - } - sortApps(); - showList = fullList; - if (activity != null) { - activity.onDataReady(); - } - } - - /** - * Called during {@link #loadApps()} in non-UI thread. - * - * @return list of package names which should be checked when shown - */ - protected List generateCheckedList() { - return Collections.emptyList(); - } - - private void sortApps() { - Comparator cmp = AppHelper.getAppListComparator(preferences.getInt("list_sort", 0), pm); - fullList.sort((a, b) -> { - boolean aChecked = checkedList.contains(a.packageName); - boolean bChecked = checkedList.contains(b.packageName); - if (aChecked == bChecked) { - return cmp.compare(a, b); - } else if (aChecked) { - return -1; - } else { - return 1; - } - - }); - } - - @SuppressLint("NonConstantResourceId") - public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.item_show_system) { - item.setChecked(!item.isChecked()); - preferences.edit().putBoolean("show_system_apps", item.isChecked()).apply(); - } else if (itemId == R.id.item_show_games) { - item.setChecked(!item.isChecked()); - preferences.edit().putBoolean("show_games", item.isChecked()).apply(); - } else if (itemId == R.id.item_show_modules) { - item.setChecked(!item.isChecked()); - preferences.edit().putBoolean("show_modules", item.isChecked()).apply(); - } else if (!AppHelper.onOptionsItemSelected(item, preferences)) { - return false; - } - refresh(); - return true; - } - - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.menu_app_list, menu); - menu.findItem(R.id.item_show_system).setChecked(preferences.getBoolean("show_system_apps", false)); - menu.findItem(R.id.item_show_games).setChecked(preferences.getBoolean("show_games", false)); - menu.findItem(R.id.item_show_modules).setChecked(preferences.getBoolean("show_modules", false)); - switch (preferences.getInt("list_sort", 0)) { - case 7: - menu.findItem(R.id.item_sort_by_update_time_reverse).setChecked(true); - break; - case 6: - menu.findItem(R.id.item_sort_by_update_time).setChecked(true); - break; - case 5: - menu.findItem(R.id.item_sort_by_install_time_reverse).setChecked(true); - break; - case 4: - menu.findItem(R.id.item_sort_by_install_time).setChecked(true); - break; - case 3: - menu.findItem(R.id.item_sort_by_package_name_reverse).setChecked(true); - break; - case 2: - menu.findItem(R.id.item_sort_by_package_name).setChecked(true); - break; - case 1: - menu.findItem(R.id.item_sort_by_name_reverse).setChecked(true); - break; - case 0: - menu.findItem(R.id.item_sort_by_name).setChecked(true); - break; - } - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - PackageInfo info = showList.get(position); - holder.appName.setText(getAppLabel(info.applicationInfo, pm)); - try { - PackageInfo packageInfo = pm.getPackageInfo(info.packageName, 0); - GlideApp.with(holder.appIcon) - .load(packageInfo) - .into(new CustomTarget() { - @Override - public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { - holder.appIcon.setImageDrawable(resource); - } - - @Override - public void onLoadCleared(@Nullable Drawable placeholder) { - - } - }); - holder.appVersion.setText(packageInfo.versionName); - holder.appVersion.setSelected(true); - String creationDate = dateformat.format(new Date(packageInfo.firstInstallTime)); - String updateDate = dateformat.format(new Date(packageInfo.lastUpdateTime)); - holder.timestamps.setText(holder.itemView.getContext().getString(R.string.install_timestamps, creationDate, updateDate)); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - holder.appPackage.setText(info.packageName); - - holder.mSwitch.setOnCheckedChangeListener(null); - holder.mSwitch.setChecked(checkedList.contains(info.packageName)); - if (this instanceof ScopeAdapter) { - holder.mSwitch.setEnabled(((ScopeAdapter) this).enabled); - } else { - holder.mSwitch.setEnabled(true); - } - holder.mSwitch.setOnCheckedChangeListener((v, isChecked) -> - onCheckedChange(v, isChecked, info.packageName)); - holder.itemView.setOnClickListener(v -> AppHelper.showMenu(activity, activity.getSupportFragmentManager(), v, info.applicationInfo)); - } - - @Override - public long getItemId(int position) { - return showList.get(position).packageName.hashCode(); - } - - @Override - public Filter getFilter() { - return new ApplicationFilter(); - } - - @Override - public int getItemCount() { - return showList.size(); - } - - public void filter(String constraint) { - filter.filter(constraint); - } - - public void refresh() { - //noinspection deprecation - AsyncTask.THREAD_POOL_EXECUTOR.execute(this::loadApps); - } - - protected void onCheckedChange(CompoundButton buttonView, boolean isChecked, String packageName) { - // override this to implements your functions - } - - static class ViewHolder extends RecyclerView.ViewHolder { - - ImageView appIcon; - TextView appName; - TextView appPackage; - TextView appVersion; - TextView timestamps; - SwitchCompat mSwitch; - - ViewHolder(View itemView) { - super(itemView); - appIcon = itemView.findViewById(R.id.app_icon); - appName = itemView.findViewById(R.id.app_name); - appPackage = itemView.findViewById(R.id.package_name); - appVersion = itemView.findViewById(R.id.version_name); - timestamps = itemView.findViewById(R.id.timestamps); - mSwitch = itemView.findViewById(R.id.checkbox); - } - } - - private class ApplicationFilter extends Filter { - - private boolean lowercaseContains(String s, CharSequence filter) { - return !TextUtils.isEmpty(s) && s.toLowerCase().contains(filter); - } - - @Override - protected FilterResults performFiltering(CharSequence constraint) { - if (constraint.toString().isEmpty()) { - showList = fullList; - } else { - ArrayList filtered = new ArrayList<>(); - String filter = constraint.toString().toLowerCase(); - for (PackageInfo info : fullList) { - if (lowercaseContains(getAppLabel(info.applicationInfo, pm), filter) - || lowercaseContains(info.packageName, filter)) { - filtered.add(info); - } - } - showList = filtered; - } - return null; - } - - @Override - protected void publishResults(CharSequence constraint, FilterResults results) { - notifyDataSetChanged(); - } - } - - public static String getAppLabel(ApplicationInfo info, PackageManager pm) { - return info.loadLabel(pm).toString(); - } -} diff --git a/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java index 53a626e2..69901507 100644 --- a/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java @@ -1,27 +1,71 @@ package io.github.lsposed.manager.adapters; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import android.widget.CompoundButton; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SwitchCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; import com.google.android.material.snackbar.Snackbar; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; import java.util.List; +import java.util.Locale; +import io.github.lsposed.manager.App; import io.github.lsposed.manager.R; import io.github.lsposed.manager.ui.activity.AppListActivity; import io.github.lsposed.manager.ui.widget.MasterSwitch; +import io.github.lsposed.manager.util.GlideApp; import io.github.lsposed.manager.util.ModuleUtil; -public class ScopeAdapter extends AppAdapter { +public class ScopeAdapter extends RecyclerView.Adapter implements Filterable { - protected final String modulePackageName; - protected boolean enabled = true; - private List checkedList; + private final AppListActivity activity; + private final DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + private final PackageManager pm; + private final ApplicationFilter filter; + private final SharedPreferences preferences; + private final String modulePackageName; private final MasterSwitch masterSwitch; + private List fullList, showList; + private List checkedList; + private boolean enabled = true; public ScopeAdapter(AppListActivity activity, String modulePackageName, MasterSwitch masterSwitch) { - super(activity); + this.activity = activity; this.modulePackageName = modulePackageName; this.masterSwitch = masterSwitch; + preferences = App.getPreferences(); + fullList = showList = Collections.emptyList(); + checkedList = Collections.emptyList(); + filter = new ApplicationFilter(); + pm = activity.getPackageManager(); masterSwitch.setOnCheckedChangedListener(new MasterSwitch.OnCheckedChangeListener() { @Override public void onCheckedChanged(boolean checked) { @@ -30,31 +74,258 @@ public class ScopeAdapter extends AppAdapter { notifyDataSetChanged(); } }); + refresh(); } + @NonNull @Override - public List generateCheckedList() { - checkedList = AppHelper.getScopeList(modulePackageName); + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(activity).inflate(R.layout.item_module, parent, false); + return new ViewHolder(v); + } + + private void loadApps() { enabled = ModuleUtil.getInstance().isModuleEnabled(modulePackageName); activity.runOnUiThread(() -> masterSwitch.setChecked(enabled)); - return checkedList; + checkedList = AppHelper.getScopeList(modulePackageName); + fullList = pm.getInstalledPackages(PackageManager.GET_META_DATA); + List installedList = new ArrayList<>(); + List rmList = new ArrayList<>(); + for (PackageInfo info : fullList) { + installedList.add(info.packageName); + if (info.packageName.equals(((ScopeAdapter) this).modulePackageName)) { + rmList.add(info); + continue; + } + if (checkedList.contains(info.packageName)) { + continue; + } + if (!preferences.getBoolean("show_modules", false)) { + if (info.applicationInfo.metaData != null && info.applicationInfo.metaData.containsKey("xposedmodule")) { + rmList.add(info); + continue; + } + } + if (!preferences.getBoolean("show_games", false)) { + if (info.applicationInfo.category == ApplicationInfo.CATEGORY_GAME) { + rmList.add(info); + continue; + } + //noinspection deprecation + if ((info.applicationInfo.flags & ApplicationInfo.FLAG_IS_GAME) != 0) { + rmList.add(info); + continue; + } + } + if ((info.applicationInfo.flags & ApplicationInfo.FLAG_HAS_CODE) == 0 && !info.packageName.equals("android")) { + rmList.add(info); + continue; + } + if (!preferences.getBoolean("show_system_apps", false) && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + rmList.add(info); + } + } + checkedList.retainAll(installedList); + if (rmList.size() > 0) { + fullList.removeAll(rmList); + } + sortApps(); + showList = fullList; + activity.onDataReady(); + } + + private void sortApps() { + Comparator cmp = AppHelper.getAppListComparator(preferences.getInt("list_sort", 0), pm); + fullList.sort((a, b) -> { + boolean aChecked = checkedList.contains(a.packageName); + boolean bChecked = checkedList.contains(b.packageName); + if (aChecked == bChecked) { + return cmp.compare(a, b); + } else if (aChecked) { + return -1; + } else { + return 1; + } + + }); + } + + public boolean onOptionsItemSelected(MenuItem item) { + int itemId = item.getItemId(); + if (itemId == R.id.item_show_system) { + item.setChecked(!item.isChecked()); + preferences.edit().putBoolean("show_system_apps", item.isChecked()).apply(); + } else if (itemId == R.id.item_show_games) { + item.setChecked(!item.isChecked()); + preferences.edit().putBoolean("show_games", item.isChecked()).apply(); + } else if (itemId == R.id.item_show_modules) { + item.setChecked(!item.isChecked()); + preferences.edit().putBoolean("show_modules", item.isChecked()).apply(); + } else if (!AppHelper.onOptionsItemSelected(item, preferences)) { + return false; + } + refresh(); + return true; + } + + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_app_list, menu); + menu.findItem(R.id.item_show_system).setChecked(preferences.getBoolean("show_system_apps", false)); + menu.findItem(R.id.item_show_games).setChecked(preferences.getBoolean("show_games", false)); + menu.findItem(R.id.item_show_modules).setChecked(preferences.getBoolean("show_modules", false)); + switch (preferences.getInt("list_sort", 0)) { + case 7: + menu.findItem(R.id.item_sort_by_update_time_reverse).setChecked(true); + break; + case 6: + menu.findItem(R.id.item_sort_by_update_time).setChecked(true); + break; + case 5: + menu.findItem(R.id.item_sort_by_install_time_reverse).setChecked(true); + break; + case 4: + menu.findItem(R.id.item_sort_by_install_time).setChecked(true); + break; + case 3: + menu.findItem(R.id.item_sort_by_package_name_reverse).setChecked(true); + break; + case 2: + menu.findItem(R.id.item_sort_by_package_name).setChecked(true); + break; + case 1: + menu.findItem(R.id.item_sort_by_name_reverse).setChecked(true); + break; + case 0: + menu.findItem(R.id.item_sort_by_name).setChecked(true); + break; + } } @Override - protected void onCheckedChange(CompoundButton view, boolean isChecked, String packageName) { + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + PackageInfo info = showList.get(position); + holder.appName.setText(getAppLabel(info.applicationInfo, pm)); + GlideApp.with(holder.appIcon) + .load(info) + .into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { + holder.appIcon.setImageDrawable(resource); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + holder.appVersion.setText(info.versionName); + holder.appVersion.setSelected(true); + String creationDate = dateformat.format(new Date(info.firstInstallTime)); + String updateDate = dateformat.format(new Date(info.lastUpdateTime)); + holder.timestamps.setText(holder.itemView.getContext().getString(R.string.install_timestamps, creationDate, updateDate)); + holder.appPackage.setText(info.packageName); + + holder.mSwitch.setOnCheckedChangeListener(null); + holder.mSwitch.setChecked(checkedList.contains(info.packageName)); + + holder.mSwitch.setEnabled(((ScopeAdapter) this).enabled); + holder.mSwitch.setOnCheckedChangeListener((v, isChecked) -> + onCheckedChange(v, isChecked, info.packageName)); + holder.itemView.setOnClickListener(v -> AppHelper.showMenu(activity, activity.getSupportFragmentManager(), v, info.applicationInfo)); + } + + @Override + public long getItemId(int position) { + return showList.get(position).packageName.hashCode(); + } + + @Override + public Filter getFilter() { + return new ApplicationFilter(); + } + + @Override + public int getItemCount() { + return showList.size(); + } + + public void filter(String constraint) { + filter.filter(constraint); + } + + public void refresh() { + //noinspection deprecation + AsyncTask.THREAD_POOL_EXECUTOR.execute(this::loadApps); + } + + protected void onCheckedChange(CompoundButton buttonView, boolean isChecked, String packageName) { if (isChecked) { checkedList.add(packageName); } else { checkedList.remove(packageName); } if (!AppHelper.saveScopeList(modulePackageName, checkedList)) { - activity.makeSnackBar(R.string.add_package_failed, Snackbar.LENGTH_SHORT); + activity.makeSnackBar(R.string.failed_to_save_scope_list, Snackbar.LENGTH_SHORT); if (!isChecked) { checkedList.add(packageName); } else { checkedList.remove(packageName); } - view.setChecked(!isChecked); + buttonView.setChecked(!isChecked); } } + + static class ViewHolder extends RecyclerView.ViewHolder { + + ImageView appIcon; + TextView appName; + TextView appPackage; + TextView appVersion; + TextView timestamps; + SwitchCompat mSwitch; + + ViewHolder(View itemView) { + super(itemView); + appIcon = itemView.findViewById(R.id.app_icon); + appName = itemView.findViewById(R.id.app_name); + appPackage = itemView.findViewById(R.id.package_name); + appVersion = itemView.findViewById(R.id.version_name); + timestamps = itemView.findViewById(R.id.timestamps); + mSwitch = itemView.findViewById(R.id.checkbox); + } + } + + private class ApplicationFilter extends Filter { + + private boolean lowercaseContains(String s, CharSequence filter) { + return !TextUtils.isEmpty(s) && s.toLowerCase().contains(filter); + } + + @Override + protected FilterResults performFiltering(CharSequence constraint) { + if (constraint.toString().isEmpty()) { + showList = fullList; + } else { + ArrayList filtered = new ArrayList<>(); + String filter = constraint.toString().toLowerCase(); + for (PackageInfo info : fullList) { + if (lowercaseContains(getAppLabel(info.applicationInfo, pm), filter) + || lowercaseContains(info.packageName, filter)) { + filtered.add(info); + } + } + showList = filtered; + } + return null; + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + notifyDataSetChanged(); + } + } + + public static String getAppLabel(ApplicationInfo info, PackageManager pm) { + return info.loadLabel(pm).toString(); + } } 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 8b1d8555..5f0f7994 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 @@ -6,7 +6,6 @@ import android.view.View; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatDelegate; -import io.github.lsposed.manager.BuildConfig; import io.github.lsposed.manager.R; import io.github.lsposed.manager.databinding.ActivityAboutBinding; import io.github.lsposed.manager.util.NavUtil; 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 b1bf279d..75609dc8 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 @@ -3,10 +3,8 @@ package io.github.lsposed.manager.ui.activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; @@ -20,7 +18,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.snackbar.Snackbar; import io.github.lsposed.manager.R; -import io.github.lsposed.manager.adapters.AppAdapter; import io.github.lsposed.manager.adapters.AppHelper; import io.github.lsposed.manager.adapters.ScopeAdapter; import io.github.lsposed.manager.databinding.ActivityAppListBinding; @@ -30,7 +27,7 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder; public class AppListActivity extends BaseActivity { private SearchView searchView; - private AppAdapter appAdapter; + private ScopeAdapter scopeAdapter; private SearchView.OnQueryTextListener searchListener; private ActivityAppListBinding binding; @@ -55,13 +52,11 @@ public class AppListActivity extends BaseActivity { ActionBar bar = getSupportActionBar(); assert bar != null; bar.setDisplayHomeAsUpEnabled(true); - if (!TextUtils.isEmpty(modulePackageName)) { - bar.setTitle(R.string.menu_scope); - bar.setSubtitle(moduleName); - appAdapter = new ScopeAdapter(this, modulePackageName, binding.masterSwitch); - } - appAdapter.setHasStableIds(true); - binding.recyclerView.setAdapter(appAdapter); + bar.setTitle(R.string.menu_scope); + bar.setSubtitle(moduleName); + scopeAdapter = new ScopeAdapter(this, modulePackageName, binding.masterSwitch); + scopeAdapter.setHasStableIds(true); + binding.recyclerView.setAdapter(scopeAdapter); binding.recyclerView.setLayoutManager(new LinearLayoutManagerFix(this)); FastScrollerBuilder fastScrollerBuilder = new FastScrollerBuilder(binding.recyclerView); if (!preferences.getBoolean("md2", true)) { @@ -73,18 +68,18 @@ public class AppListActivity extends BaseActivity { } fastScrollerBuilder.build(); handler.postDelayed(runnable, 300); - binding.swipeRefreshLayout.setOnRefreshListener(appAdapter::refresh); + binding.swipeRefreshLayout.setOnRefreshListener(scopeAdapter::refresh); searchListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { - appAdapter.filter(query); + scopeAdapter.filter(query); return false; } @Override public boolean onQueryTextChange(String newText) { - appAdapter.filter(newText); + scopeAdapter.filter(newText); return false; } }; @@ -92,7 +87,7 @@ public class AppListActivity extends BaseActivity { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (!appAdapter.onOptionsItemSelected(item)) { + if (!scopeAdapter.onOptionsItemSelected(item)) { return super.onOptionsItemSelected(item); } return true; @@ -100,7 +95,7 @@ public class AppListActivity extends BaseActivity { @Override public boolean onCreateOptionsMenu(@NonNull Menu menu) { - appAdapter.onCreateOptionsMenu(menu, getMenuInflater()); + scopeAdapter.onCreateOptionsMenu(menu, getMenuInflater()); searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setOnQueryTextListener(searchListener); return super.onCreateOptionsMenu(menu); @@ -110,7 +105,7 @@ public class AppListActivity extends BaseActivity { handler.removeCallbacks(runnable); binding.swipeRefreshLayout.setRefreshing(false); String queryStr = searchView != null ? searchView.getQuery().toString() : ""; - runOnUiThread(() -> appAdapter.getFilter().filter(queryStr)); + runOnUiThread(() -> scopeAdapter.getFilter().filter(queryStr)); } @Override diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/CrashReportActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/CrashReportActivity.java index 0b293bdc..325f5ff7 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/CrashReportActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/CrashReportActivity.java @@ -14,10 +14,6 @@ import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.snackbar.Snackbar; -import io.github.lsposed.manager.BuildConfig; -import io.github.lsposed.manager.R; -import io.github.lsposed.manager.databinding.ActivityCrashReportBinding; - import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -25,6 +21,10 @@ import java.util.Locale; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import io.github.lsposed.manager.BuildConfig; +import io.github.lsposed.manager.R; +import io.github.lsposed.manager.databinding.ActivityCrashReportBinding; + public class CrashReportActivity extends AppCompatActivity { ActivityCrashReportBinding binding; 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 7abcf7b1..4f4b7a24 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 @@ -26,14 +26,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayout; -import io.github.lsposed.manager.BuildConfig; -import io.github.lsposed.manager.Constants; -import io.github.lsposed.manager.R; -import io.github.lsposed.manager.databinding.ActivityLogsBinding; -import io.github.lsposed.manager.databinding.DialogInstallWarningBinding; -import io.github.lsposed.manager.databinding.ItemLogBinding; -import io.github.lsposed.manager.util.LinearLayoutManagerFix; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -46,6 +38,14 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Scanner; +import io.github.lsposed.manager.BuildConfig; +import io.github.lsposed.manager.Constants; +import io.github.lsposed.manager.R; +import io.github.lsposed.manager.databinding.ActivityLogsBinding; +import io.github.lsposed.manager.databinding.DialogInstallWarningBinding; +import io.github.lsposed.manager.databinding.ItemLogBinding; +import io.github.lsposed.manager.util.LinearLayoutManagerFix; + public class LogsActivity extends BaseActivity { private boolean allLog = false; private final File fileErrorLog = new File(Constants.getBaseDir() + "log/error.log"); diff --git a/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java b/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java index 75cbc851..6f118d0a 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/activity/MainActivity.java @@ -14,7 +14,6 @@ import java.util.Locale; 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.ActivityMainBinding; import io.github.lsposed.manager.ui.fragment.StatusDialogBuilder; import io.github.lsposed.manager.util.GlideHelper; 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 cb388dfd..f762cd1e 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 @@ -46,8 +46,8 @@ import io.github.lsposed.manager.App; import io.github.lsposed.manager.BuildConfig; import io.github.lsposed.manager.Constants; import io.github.lsposed.manager.R; -import io.github.lsposed.manager.adapters.AppAdapter; import io.github.lsposed.manager.adapters.AppHelper; +import io.github.lsposed.manager.adapters.ScopeAdapter; import io.github.lsposed.manager.databinding.ActivityModulesBinding; import io.github.lsposed.manager.util.GlideApp; import io.github.lsposed.manager.util.LinearLayoutManagerFix; @@ -80,7 +80,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi showList = new ArrayList<>(); String filter = queryStr.toLowerCase(); for (ModuleUtil.InstalledModule info : fullList) { - if (lowercaseContains(AppAdapter.getAppLabel(info.app, pm), filter) + if (lowercaseContains(ScopeAdapter.getAppLabel(info.app, pm), filter) || lowercaseContains(info.packageName, filter)) { showList.add(info); } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9cd2b761..b9ed027c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -98,7 +98,6 @@ 此处仅显示 LSPosed 及模块相关日志信息\n如果您想抓取系统日志, 可以尝试我们的 Log Catcher Magisk 模块 - 修改失败, 一个或多个设置阻止你继续修改 取消优化 以 Speed 模式优化应用 以 Dexopt 模式优化应用 @@ -119,8 +118,6 @@ 停止 优化失败或返回值为空 优化失败: - 强制添加模块 - 强制将模块添加进白名单\n关闭此选项并不会移除已勾选的应用标识 未安装 重启至系统 禁用模块日志 @@ -154,4 +151,7 @@ 排序… 启用模块 未选择任何应用。继续? + 游戏 + 模块 + 作用域列表保存失败 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index e2927521..e9fb9275 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -97,7 +97,6 @@ 此處僅顯示 LSPosed 及模塊相關日誌信息\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模塊 - 修改失敗, 一個或多個設置阻止你繼續修改 取消優化 以 Speed 模式優化應用 以 Dexopt 模式優化應用 @@ -117,8 +116,6 @@ 運行 停止 優化失敗或返回值為空 - 強制添加模塊 - 強制將模塊添加進白名單\n關閉此選項並不會移除已勾選的應用標識 未安裝 重啟至系統 禁用模塊日誌 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 906e5e3a..3a26b113 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -97,7 +97,6 @@ 此處僅顯示 LSPosed 及模組相關日誌資訊\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模組 - 修改失敗, 一個或多個設定阻止你繼續修改 取消優化 以 Speed 模式優化 App 以 Dexopt 模式優化 App @@ -117,8 +116,6 @@ 執行 停止 優化失敗或返回值為空 - 強制新增模組 - 強制將模組新增進白允許名單\n關閉此選項並不會移除已勾選的 App 標識 未安裝 重啟至系統 禁用模組日誌 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3e7501c7..1813f536 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -112,7 +112,6 @@ Verified Boot is active - Failed to edit, one or more settings prevent you from editing. De-optimize Optimize with Speed mode Optimize with Dexopt mode @@ -130,8 +129,6 @@ Stop it Optimization failed or return value is empty Optimization failed: - Force hook modules - Force add modules to white list\nClosing this option does not remove added modules from white list Not installed Reboot to System Disable modules logs @@ -164,4 +161,5 @@ You did not select any app. Continue? Games Modules + Failed save scope list