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));
+ });
+ }
+}