From fdb58046f4f292ce5be9b7014ecd3e4c11d4a87b Mon Sep 17 00:00:00 2001 From: El Dainosor Date: Mon, 2 Jan 2023 00:22:37 -0300 Subject: [PATCH] Cherish: Add support for Lockscreen clock fonts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After r16, a commit to cleanup the KeyguardClockSwtich and unify it's structure was merged. Also, this added a new resource into the frameworks core, which allows us to overlay the custom clock font. So, we need to overlays now to customize this. This makes me really happy because it removes the ugly method that we were doing years ago. [nurkeinneid]: - adapt to our ThemeUtils - restore original copyright header - crdroid did nothing here Change-Id: I70590910144141a534b926f884e9f08e4e3af5bc Signed-off-by: NurKeinNeid Signed-off-by: Hưng Phan --- res/layout/lock_clock_fonts_option.xml | 50 ++++ res/values/cherish_strings.xml | 4 + res/xml/cherish_settings_theme.xml | 6 + .../settings/fragments/ui/LockClockFonts.java | 235 ++++++++++++++++++ 4 files changed, 295 insertions(+) create mode 100644 res/layout/lock_clock_fonts_option.xml create mode 100644 src/com/cherish/settings/fragments/ui/LockClockFonts.java diff --git a/res/layout/lock_clock_fonts_option.xml b/res/layout/lock_clock_fonts_option.xml new file mode 100644 index 0000000..2c9344d --- /dev/null +++ b/res/layout/lock_clock_fonts_option.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index abd33b1..4aed1d6 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -148,6 +148,10 @@ Set custom signal icon style WiFi icon style Set custom wifi icon style + + + Lockscreen clock font + Set LS clock font style Signal diff --git a/res/xml/cherish_settings_theme.xml b/res/xml/cherish_settings_theme.xml index 97c3b42..918cfe1 100644 --- a/res/xml/cherish_settings_theme.xml +++ b/res/xml/cherish_settings_theme.xml @@ -92,6 +92,12 @@ android:title="@string/theme_customization_ui_style_title" android:summary="@string/theme_customization_ui_style_summary" android:fragment="com.cherish.settings.fragments.ui.UIStyles"/> + + mPkgs; + + private ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + private Handler mHandler = new Handler(); + private final AtomicBoolean mApplyingOverlays = new AtomicBoolean(false); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActivity().setTitle(R.string.theme_customization_lock_clock_title); + + mHandler = new Handler(); + 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.lock_clock_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.setTextSize(24); + holder.title.setTypeface(getTypeface(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 Typeface getTypeface(Context context, String pkg) { + try { + PackageManager pm = context.getPackageManager(); + Resources res = pkg.equals("android") ? Resources.getSystem() + : pm.getResourcesForApplication(pkg); + return Typeface.create(res.getString( + res.getIdentifier("config_clockFontFamily", + "string", pkg)), Typeface.NORMAL); + } + catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return null; + } + + 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)); + mHandler.post(() -> mApplyingOverlays.set(false)); + }); + } +}