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