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