From 7df8e095affd620a8c8701d258e00e6461562833 Mon Sep 17 00:00:00 2001 From: El Dainosor Date: Tue, 23 Aug 2022 02:38:17 -0300 Subject: [PATCH] Cherish: Add support for UI Styles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Not a great previewer but for now it'll do the work [nurkeinneid]: - adapt to our ThemeUtils - restore original copyright header - crdroid did nothing here Change-Id: I432578a4b3c652d7ad3e00a93e11bfb3e199b4a5 Signed-off-by: NurKeinNeid Signed-off-by: Hưng Phan --- res/values/cherish_strings.xml | 4 + res/xml/cherish_settings_theme.xml | 6 + .../settings/fragments/ui/UIStyles.java | 264 ++++++++++++++++++ 3 files changed, 274 insertions(+) create mode 100644 src/com/cherish/settings/fragments/ui/UIStyles.java diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 1613971..7f971f8 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -802,4 +802,8 @@ Click to partial screenshot Short click Volume Down and Power to take partial screenshot + + + UI Style + Set custom style for your interface diff --git a/res/xml/cherish_settings_theme.xml b/res/xml/cherish_settings_theme.xml index 93f723d..14f518d 100644 --- a/res/xml/cherish_settings_theme.xml +++ b/res/xml/cherish_settings_theme.xml @@ -59,6 +59,12 @@ android:summary="@string/dark_ui_mode_summary" android:fragment="com.android.settings.display.darkmode.DarkModeSettingsFragment" settings:controller="com.android.settings.display.DarkUIPreferenceController" /> + + mPkgs; + + private ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + private Handler mHandler = new Handler(); + private final AtomicBoolean mApplyingOverlays = new AtomicBoolean(false); + + Map overlayMap = new HashMap(); + { + overlayMap.put("com.android.settings", "android.theme.customization.style.settings"); + overlayMap.put("com.android.systemui", "android.theme.customization.style.systemui"); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActivity().setTitle(R.string.theme_customization_ui_style_title); + + mThemeUtils = new ThemeUtils(getActivity()); + mPkgs = mThemeUtils.getOverlayPackagesForCategory(mCategory, "android"); + Collections.sort(mPkgs); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate( + R.layout.item_view, container, false); + + mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); + GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 1); + mRecyclerView.setLayoutManager(gridLayoutManager); + Adapter mAdapter = new Adapter(getActivity()); + mRecyclerView.setAdapter(mAdapter); + + return view; + } + + @Override + public int getMetricsCategory() { + return MetricsEvent.CHERISH_SETTINGS; + } + + @Override + public void onResume() { + super.onResume(); + } + + public class Adapter extends RecyclerView.Adapter { + Context context; + String mSelectedPkg; + String mAppliedPkg; + + public Adapter(Context context) { + this.context = context; + } + + @Override + public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fonts_option, parent, false); + CustomViewHolder vh = new CustomViewHolder(v); + return vh; + } + + @Override + public void onBindViewHolder(CustomViewHolder holder, final int position) { + String pkg = mPkgs.get(position); + String label = getLabel(holder.itemView.getContext(), pkg); + + String currentPackageName = mThemeUtils.getOverlayInfos(mCategory).stream() + .filter(info -> info.isEnabled()) + .map(info -> info.packageName) + .findFirst() + .orElse("android"); + + holder.title.setText("android".equals(pkg) ? "Default" : label); + holder.title.setTextSize(20); + holder.title.setBackgroundColor(getStyleColor(holder.title.getContext(), pkg)); + holder.name.setVisibility(View.GONE); + + if (currentPackageName.equals(pkg)) { + mAppliedPkg = pkg; + if (mSelectedPkg == null) { + mSelectedPkg = pkg; + } + } + + holder.itemView.setActivated(pkg == mSelectedPkg); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mApplyingOverlays.get()) return; + updateActivatedStatus(mSelectedPkg, false); + updateActivatedStatus(pkg, true); + mSelectedPkg = pkg; + enableOverlays(position); + } + }); + } + + @Override + public int getItemCount() { + return mPkgs.size(); + } + + public class CustomViewHolder extends RecyclerView.ViewHolder { + TextView name; + TextView title; + public CustomViewHolder(View itemView) { + super(itemView); + title = (TextView) itemView.findViewById(R.id.option_title); + name = (TextView) itemView.findViewById(R.id.option_label); + } + } + + private void updateActivatedStatus(String pkg, boolean isActivated) { + int index = mPkgs.indexOf(pkg); + if (index < 0) { + return; + } + RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(index); + if (holder != null && holder.itemView != null) { + holder.itemView.setActivated(isActivated); + } + } + } + + public @ColorInt int getStyleColor(Context context, String pkg) { + try { + PackageManager pm = context.getPackageManager(); + Resources res = pkg.equals("android") ? Resources.getSystem() + : pm.getResourcesForApplication(pkg); + Configuration configuration = context.getResources().getConfiguration(); + boolean nightMode = (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) + == Configuration.UI_MODE_NIGHT_YES ? true : false; + @ColorInt int styleColor = nightMode ? res.getColor(res.getIdentifier( + "system_neutral1_900", "color", pkg), null) : res.getColor( + res.getIdentifier( + "system_neutral1_100", "color", pkg), null); + return styleColor; + } + catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) { + e.printStackTrace(); + } + return Color.TRANSPARENT; + } + + public String getLabel(Context context, String pkg) { + PackageManager pm = context.getPackageManager(); + try { + return pm.getApplicationInfo(pkg, 0) + .loadLabel(pm).toString(); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return pkg; + } + + public void enableOverlays(int position) { + mApplyingOverlays.set(true); + mExecutor.execute(() -> { + mThemeUtils.setOverlayEnabled(mCategory, mPkgs.get(position)); + String pattern = "android".equals(mPkgs.get(position)) ? "" + : mPkgs.get(position).split("\\.")[4]; + for (Map.Entry entry : overlayMap.entrySet()) { + enableOverlay(entry.getValue(), entry.getKey(), pattern); + } + mHandler.post(() -> mApplyingOverlays.set(false)); + }); + } + + public void enableOverlay(String category, String target, String pattern) { + if (pattern.isEmpty()) { + mThemeUtils.setOverlayEnabled(category, "android"); + return; + } + for (String pkg: mThemeUtils.getOverlayPackagesForCategory(category, target)) { + if (pkg.contains(pattern)) { + mThemeUtils.setOverlayEnabled(category, pkg); + } + } + } +}