diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 4de4154..cb9d7a5 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -44,6 +44,7 @@ QS category Navigation bar Volume keys + UDFPS OK @@ -513,5 +514,9 @@ Enable custom UDFPS Icon from files Select Custom UDFPS Icon Select custom image from your saved files or gallery + + + Udfps pressed color + Choose your favorite udfps pressed color diff --git a/res/xml/cherish_settings_udfps.xml b/res/xml/cherish_settings_udfps.xml index 69b4bf2..78838ad 100644 --- a/res/xml/cherish_settings_udfps.xml +++ b/res/xml/cherish_settings_udfps.xml @@ -44,6 +44,12 @@ android:summary="@string/udfps_recog_animation_effect_summary" android:fragment="com.cherish.settings.fragments.UdfpsAnimation" /> + + diff --git a/src/com/cherish/settings/fragments/LockScreenSettings.java b/src/com/cherish/settings/fragments/LockScreenSettings.java index f5cc3d7..cb429cd 100644 --- a/src/com/cherish/settings/fragments/LockScreenSettings.java +++ b/src/com/cherish/settings/fragments/LockScreenSettings.java @@ -52,8 +52,19 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; import android.provider.SearchIndexableResource; -import java.util.ArrayList; import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; +import java.io.FileDescriptor; +import java.util.Arrays; +import org.json.JSONException; +import org.json.JSONObject; +import static android.os.UserHandle.USER_SYSTEM; +import android.os.RemoteException; +import android.os.ServiceManager; +import static android.os.UserHandle.USER_CURRENT; @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class LockScreenSettings extends SettingsPreferenceFragment implements @@ -70,10 +81,8 @@ public class LockScreenSettings extends SettingsPreferenceFragment implements public void onCreate(Bundle icicle) { super.onCreate(icicle); addPreferencesFromResource(R.xml.cherish_settings_lockscreen); - - ContentResolver resolver = getActivity().getContentResolver(); - PreferenceScreen prefScreen = getPreferenceScreen(); - Resources resources = getResources(); + final ContentResolver resolver = getActivity().getContentResolver(); + final PreferenceScreen prefSet = getPreferenceScreen(); Resources res = null; Context ctx = getContext(); diff --git a/src/com/cherish/settings/fragments/ui/UdfpsAnimation.java b/src/com/cherish/settings/fragments/UdfpsAnimation.java similarity index 100% rename from src/com/cherish/settings/fragments/ui/UdfpsAnimation.java rename to src/com/cherish/settings/fragments/UdfpsAnimation.java diff --git a/src/com/cherish/settings/fragments/ui/UdfpsIconPicker.java b/src/com/cherish/settings/fragments/UdfpsIconPicker.java similarity index 100% rename from src/com/cherish/settings/fragments/ui/UdfpsIconPicker.java rename to src/com/cherish/settings/fragments/UdfpsIconPicker.java diff --git a/src/com/cherish/settings/fragments/UdfpsPressedIconPicker.java b/src/com/cherish/settings/fragments/UdfpsPressedIconPicker.java new file mode 100644 index 0000000..f788dcc --- /dev/null +++ b/src/com/cherish/settings/fragments/UdfpsPressedIconPicker.java @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2021 AospExtended ROM Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.cherish.settings.fragments; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.net.Uri; +import android.provider.SearchIndexableResource; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.res.ResourcesCompat; +import androidx.preference.Preference.OnPreferenceChangeListener; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.PreferenceViewHolder; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.Indexable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONObject; + +public class UdfpsPressedIconPicker extends SettingsPreferenceFragment { + + private RecyclerView mRecyclerView; + + private Resources udfpsRes; + + private String mPkg = "com.cherish.udfps.resources"; + + private String[] mIcons; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getActivity().setTitle(R.string.udfps_pressed_color_title); + + loadResources(); + } + + private void loadResources() { + try { + PackageManager pm = getActivity().getPackageManager(); + udfpsRes = pm.getResourcesForApplication(mPkg); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + + mIcons = udfpsRes.getStringArray(udfpsRes.getIdentifier("udfps_pressedicons", + "array", mPkg)); + } + + @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(), 3); + mRecyclerView.setLayoutManager(gridLayoutManager); + UdfpsPressedIconAdapter mUdfpsPressedIconAdapter = new UdfpsPressedIconAdapter(getActivity()); + mRecyclerView.setAdapter(mUdfpsPressedIconAdapter); + + return view; + } + + @Override + public int getMetricsCategory() { + return MetricsEvent.CHERISH_SETTINGS; + } + + @Override + public void onResume() { + super.onResume(); + } + + public class UdfpsPressedIconAdapter extends RecyclerView.Adapter { + Context context; + String mSelectedIcon; + String mAppliedIcon; + + public UdfpsPressedIconAdapter(Context context) { + this.context = context; + } + + @Override + public UdfpsPressedIconViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_option, parent, false); + UdfpsPressedIconViewHolder vh = new UdfpsPressedIconViewHolder(v); + return vh; + } + + @Override + public void onBindViewHolder(UdfpsPressedIconViewHolder holder, final int position) { + String iconRes = mIcons[position]; + + Glide.with(holder.image.getContext()) + .load("") + .placeholder(getDrawable(holder.image.getContext(), mIcons[position])) + .into(holder.image); + + holder.image.setPadding(20,20,20,20); + + holder.name.setVisibility(View.GONE); + + if (position == Settings.System.getInt(context.getContentResolver(), + Settings.System.UDFPS_COLOR, 0)) { + mAppliedIcon = iconRes; + if (mSelectedIcon == null) { + mSelectedIcon = iconRes; + } + } + holder.itemView.setActivated(iconRes == mSelectedIcon); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + updateActivatedStatus(mSelectedIcon, false); + updateActivatedStatus(iconRes, true); + mSelectedIcon = iconRes; + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.UDFPS_COLOR, position); + } + }); + } + + @Override + public int getItemCount() { + return mIcons.length; + } + + public class UdfpsPressedIconViewHolder extends RecyclerView.ViewHolder { + TextView name; + ImageView image; + public UdfpsPressedIconViewHolder(View itemView) { + super(itemView); + name = (TextView) itemView.findViewById(R.id.option_label); + image = (ImageView) itemView.findViewById(R.id.option_thumbnail); + } + } + + private void updateActivatedStatus(String icon, boolean isActivated) { + int index = Arrays.asList(mIcons).indexOf(icon); + if (index < 0) { + return; + } + RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(index); + if (holder != null && holder.itemView != null) { + holder.itemView.setActivated(isActivated); + } + } + } + + public Drawable getDrawable(Context context, String drawableName) { + try { + PackageManager pm = context.getPackageManager(); + Resources res = pm.getResourcesForApplication(mPkg); + Context ctx = context.createPackageContext( + mPkg, Context.CONTEXT_IGNORE_SECURITY); + return ctx.getDrawable(res.getIdentifier(drawableName, "drawable", mPkg)); + } + catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return null; + } +}