From c1e9a0df45cffd7610126d1a263a72e47a7f0bbd Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Sun, 17 Nov 2019 22:47:35 +0530 Subject: [PATCH] Cherish:Bring back Gaming mode [3/3] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4ffb0bdf8453068eb049da4823fea6da33346446 Signed-off-by: DennySPb Signed-off-by: Hưng Phan --- res/values/cherish_arrays.xml | 27 ++ res/values/cherish_strings.xml | 25 ++ res/xml/cherish_settings_misc.xml | 8 + res/xml/gaming_mode_settings.xml | 70 ++++ .../settings/fragments/MiscSettings.java | 16 +- .../preferences/fragments/GamingMode.java | 342 ++++++++++++++++++ .../fragments/GamingModeReceiver.java | 51 +++ 7 files changed, 536 insertions(+), 3 deletions(-) create mode 100644 res/xml/gaming_mode_settings.xml create mode 100644 src/com/cherish/settings/preferences/fragments/GamingMode.java create mode 100644 src/com/cherish/settings/preferences/fragments/GamingModeReceiver.java diff --git a/res/values/cherish_arrays.xml b/res/values/cherish_arrays.xml index 831f3a6..1d7686c 100644 --- a/res/values/cherish_arrays.xml +++ b/res/values/cherish_arrays.xml @@ -975,4 +975,31 @@ 2 3 + + + + @string/gaming_mode_ringer_off_title + @string/gaming_mode_ringer_vibrate_title + @string/gaming_mode_ringer_dnd_title + @string/gaming_mode_ringer_silent_title + + + 0 + 1 + 2 + 3 + + + + @string/gaming_mode_notifications_off_title + @string/gaming_mode_notifications_notif_title + @string/gaming_mode_notifications_toast_title + @string/gaming_mode_notifications_all_title + + + 0 + 1 + 2 + 3 + diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 752e639..fc10c95 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -915,4 +915,29 @@ Cyan Green Yellow + + + Gaming Mode + Customize gaming mode preferences + Automatically turn on for these apps + Add apps for Gaming mode + Gaming mode will turn on automatically when these apps are opened and turn off when they are closed + Block notifications + Block all headsup messages except calls + Lock buttons + Disable hardware buttons when Gaming mode is turned on + Disable automatic brightness + Lock screen brightness when Gaming mode is turned on + Ringer in gaming mode + Do not change + Vibrate + Do Not Disturb + Silent + Gaming mode indication + Disabled + Show notification + Show toasts + Show toasts and notification + Dynamic mode + Try detecting and adding gaming apps automatically diff --git a/res/xml/cherish_settings_misc.xml b/res/xml/cherish_settings_misc.xml index dde60b5..37ed310 100644 --- a/res/xml/cherish_settings_misc.xml +++ b/res/xml/cherish_settings_misc.xml @@ -34,6 +34,14 @@ android:summaryOff="@string/summary_dashboard_suggestions_disabled" android:defaultValue="true"/> + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/cherish/settings/fragments/MiscSettings.java b/src/com/cherish/settings/fragments/MiscSettings.java index b86a342..2522715 100644 --- a/src/com/cherish/settings/fragments/MiscSettings.java +++ b/src/com/cherish/settings/fragments/MiscSettings.java @@ -45,15 +45,25 @@ public class MiscSettings extends SettingsPreferenceFragment implements addPreferencesFromResource(R.xml.cherish_settings_misc); + mGamingMode = (SystemSettingMasterSwitchPreference) findPreference(GAMING_MODE_ENABLED); + mGamingMode.setChecked((Settings.System.getInt(getActivity().getContentResolver(), + Settings.System.GAMING_MODE_ENABLED, 0) == 1)); + mGamingMode.setOnPreferenceChangeListener(this); + } @Override - public boolean onPreferenceChange(Preference preference, Object objValue) { - ContentResolver resolver = getActivity().getContentResolver(); - + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mGamingMode) { + boolean value = (Boolean) newValue; + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.GAMING_MODE_ENABLED, value ? 1 : 0); + return true; + } return false; } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.CHERISH_SETTINGS; diff --git a/src/com/cherish/settings/preferences/fragments/GamingMode.java b/src/com/cherish/settings/preferences/fragments/GamingMode.java new file mode 100644 index 0000000..8a9fbb6 --- /dev/null +++ b/src/com/cherish/settings/preferences/fragments/GamingMode.java @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2019 crDroid Android 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.app.AlertDialog; +import android.app.Dialog; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.UserHandle; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; + +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import com.cherish.settings.preferences.PackageListAdapter; +import com.cherish.settings.preferences.PackageListAdapter.PackageItem; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GamingMode extends SettingsPreferenceFragment + implements Preference.OnPreferenceClickListener { + + private static final int DIALOG_GAMING_APPS = 1; + private static final String GAMING_MODE_HW_KEYS = "gaming_mode_hw_keys_toggle"; + + private SwitchPreference mHardwareKeysDisable; + + private PackageListAdapter mPackageAdapter; + private PackageManager mPackageManager; + private PreferenceGroup mGamingPrefList; + private Preference mAddGamingPref; + + private String mGamingPackageList; + private Map mGamingPackages; + private Context mContext; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Get launch-able applications + addPreferencesFromResource(R.xml.gaming_mode_settings); + + mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.add_gaming_mode_package_summary); + + final PreferenceScreen prefScreen = getPreferenceScreen(); + + mHardwareKeysDisable = (SwitchPreference) findPreference(GAMING_MODE_HW_KEYS); + + mPackageManager = getPackageManager(); + mPackageAdapter = new PackageListAdapter(getActivity()); + + mGamingPrefList = (PreferenceGroup) findPreference("gamingmode_applications"); + mGamingPrefList.setOrderingAsAdded(false); + + mGamingPackages = new HashMap(); + + mAddGamingPref = findPreference("add_gamingmode_packages"); + + mAddGamingPref.setOnPreferenceClickListener(this); + + mContext = getActivity().getApplicationContext(); + + SettingsObserver observer = new SettingsObserver(new Handler(Looper.getMainLooper())); + observer.observe(); + } + + @Override + public void onResume() { + super.onResume(); + refreshCustomApplicationPrefs(); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + + @Override + public int getDialogMetricsCategory(int dialogId) { + if (dialogId == DIALOG_GAMING_APPS) { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + return 0; + } + + /** + * Utility classes and supporting methods + */ + @Override + public Dialog onCreateDialog(int id) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + final Dialog dialog; + final ListView list = new ListView(getActivity()); + list.setAdapter(mPackageAdapter); + + builder.setTitle(R.string.profile_choose_app); + builder.setView(list); + dialog = builder.create(); + + switch (id) { + case DIALOG_GAMING_APPS: + list.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // Add empty application definition, the user will be able to edit it later + PackageItem info = (PackageItem) parent.getItemAtPosition(position); + addCustomApplicationPref(info.packageName, mGamingPackages); + dialog.cancel(); + } + }); + } + return dialog; + } + + class SettingsObserver extends ContentObserver { + SettingsObserver(Handler handler) { + super(handler); + } + + void observe() { + ContentResolver resolver = mContext.getContentResolver(); + + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.GAMING_MODE_ACTIVE), false, this, + UserHandle.USER_ALL); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + if (uri.equals(Settings.System.getUriFor( + Settings.System.GAMING_MODE_ACTIVE))) { + boolean enable = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.GAMING_MODE_ACTIVE, 0) == 1; + } + } + } + + /** + * Application class + */ + private static class Package { + public String name; + /** + * Stores all the application values in one call + * @param name + */ + public Package(String name) { + this.name = name; + } + + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append(name); + return builder.toString(); + } + + public static Package fromString(String value) { + if (TextUtils.isEmpty(value)) { + return null; + } + + try { + Package item = new Package(value); + return item; + } catch (NumberFormatException e) { + return null; + } + } + + }; + + private void refreshCustomApplicationPrefs() { + if (!parsePackageList()) { + return; + } + + // Add the Application Preferences + if (mGamingPrefList != null) { + mGamingPrefList.removeAll(); + + for (Package pkg : mGamingPackages.values()) { + try { + Preference pref = createPreferenceFromInfo(pkg); + mGamingPrefList.addPreference(pref); + } catch (PackageManager.NameNotFoundException e) { + // Do nothing + } + } + } + + // Keep these at the top + mAddGamingPref.setOrder(0); + // Add 'add' options + mGamingPrefList.addPreference(mAddGamingPref); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference == mAddGamingPref) { + showDialog(DIALOG_GAMING_APPS); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.dialog_delete_title) + .setMessage(R.string.dialog_delete_message) + .setIconAttribute(android.R.attr.alertDialogIcon) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (preference == mGamingPrefList.findPreference(preference.getKey())) { + removeApplicationPref(preference.getKey(), mGamingPackages); + } + } + }) + .setNegativeButton(android.R.string.cancel, null); + + builder.show(); + } + return true; + } + + private void addCustomApplicationPref(String packageName, Map map) { + Package pkg = map.get(packageName); + if (pkg == null) { + pkg = new Package(packageName); + map.put(packageName, pkg); + savePackageList(false, map); + refreshCustomApplicationPrefs(); + } + } + + private Preference createPreferenceFromInfo(Package pkg) + throws PackageManager.NameNotFoundException { + PackageInfo info = mPackageManager.getPackageInfo(pkg.name, + PackageManager.GET_META_DATA); + Preference pref = + new Preference(getActivity()); + + pref.setKey(pkg.name); + pref.setTitle(info.applicationInfo.loadLabel(mPackageManager)); + pref.setIcon(info.applicationInfo.loadIcon(mPackageManager)); + pref.setPersistent(false); + pref.setOnPreferenceClickListener(this); + return pref; + } + + private void removeApplicationPref(String packageName, Map map) { + if (map.remove(packageName) != null) { + savePackageList(false, map); + refreshCustomApplicationPrefs(); + } + } + + private boolean parsePackageList() { + boolean parsed = false; + + final String gamingModeString = Settings.System.getString(getContentResolver(), + Settings.System.GAMING_MODE_VALUES); + + if (!TextUtils.equals(mGamingPackageList, gamingModeString)) { + mGamingPackageList = gamingModeString; + mGamingPackages.clear(); + parseAndAddToMap(gamingModeString, mGamingPackages); + parsed = true; + } + + return parsed; + } + + private void parseAndAddToMap(String baseString, Map map) { + if (baseString == null) { + return; + } + + final String[] array = TextUtils.split(baseString, "\\|"); + for (String item : array) { + if (TextUtils.isEmpty(item)) { + continue; + } + Package pkg = Package.fromString(item); + map.put(pkg.name, pkg); + } + } + + + private void savePackageList(boolean preferencesUpdated, Map map) { + String setting = map == mGamingPackages ? Settings.System.GAMING_MODE_VALUES : Settings.System.GAMING_MODE_DUMMY; + + List settings = new ArrayList(); + for (Package app : map.values()) { + settings.add(app.toString()); + } + final String value = TextUtils.join("|", settings); + if (preferencesUpdated) { + if (TextUtils.equals(setting, Settings.System.GAMING_MODE_VALUES)) { + mGamingPackageList = value; + } + } + Settings.System.putString(getContentResolver(), + setting, value); + } +} diff --git a/src/com/cherish/settings/preferences/fragments/GamingModeReceiver.java b/src/com/cherish/settings/preferences/fragments/GamingModeReceiver.java new file mode 100644 index 0000000..abf08d2 --- /dev/null +++ b/src/com/cherish/settings/preferences/fragments/GamingModeReceiver.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019 crDroid Android 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.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.provider.Settings; +import android.util.Log; +import android.text.TextUtils; + +import com.android.settings.R; +import com.android.internal.util.gaming.GamingModeController; + +public class GamingModeReceiver extends BroadcastReceiver { + + private static final String TAG = "GamingModeReceiver"; + private static final boolean DEBUG = false; + + public GamingModeReceiver() { + } + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction() != null && + intent.getAction().equals(GamingModeController.GAMING_MODE_TURN_OFF)) { + if (DEBUG) Log.d(TAG, "Received " + GamingModeController.GAMING_MODE_TURN_OFF); + Settings.System.putInt(context.getContentResolver(), Settings.System.GAMING_MODE_ACTIVE, 0); + } else if (intent.getAction() != null && + intent.getAction().equals(GamingModeController.GAMING_MODE_TURN_ON)) { + if (DEBUG) Log.d(TAG, "Received " + GamingModeController.GAMING_MODE_TURN_ON); + Settings.System.putInt(context.getContentResolver(), Settings.System.GAMING_MODE_ACTIVE, 1); + } + } +}