diff --git a/res/drawable/ic_gaming_mode.xml b/res/drawable/ic_gaming_mode.xml
new file mode 100644
index 0000000..fd0e3aa
--- /dev/null
+++ b/res/drawable/ic_gaming_mode.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/ic_menu_add_white.xml b/res/drawable/ic_menu_add_white.xml
new file mode 100644
index 0000000..b7b57b5
--- /dev/null
+++ b/res/drawable/ic_menu_add_white.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/res/values-vi/cherish_strings.xml b/res/values-vi/cherish_strings.xml
index fb298f8..cdbc23e 100644
--- a/res/values-vi/cherish_strings.xml
+++ b/res/values-vi/cherish_strings.xml
@@ -179,8 +179,6 @@
Tắt
Bật
Đã bật (biểu tượng bên trong)
- Đã bật (ước tính)
- Đã bật (phần trăm | ước tính)
Hiển thị tốc độ mạng
Tùy chỉnh chỉ số lưu lượng mạng
@@ -393,4 +391,37 @@
Buộc mở rộng thông báo
Chỉ có sẵn cho các ứng dụng hỗ trợ thông báo mở rộng
+
+ Chuyển đổi ngoại hình
+ Mặc định
+ Material Design 2
+ OnePlus
+ Hẹp
+ Bộ chứa
+ Retro
+ Stockish
+
+ Chế độ chơi game
+ Tùy chỉnh tùy chọn chế độ trò chơi
+ Tự động bật cho các ứng dụng này
+ Thêm ứng dụng cho chế độ chơi game
+ Chế độ chơi game sẽ tự động bật tắt đối với các ứng dụng này
+ Chặn thông báo
+ Chặn tất cả các thông báo nổi ngoại trừ cuộc gọi
+ Khóa phím
+ Vô hiệu hóa phím cứng khi chế độ trò chơi được bật
+ Vô hiệu hóa độ sáng tự động
+ Khóa độ sáng màn hình khi chế độ trò chơi được bật
+ Chuông trong chế độ trò chơi
+ Không thay đổi
+ Rung
+ Không làm phiền
+ Im lặng
+ Thông báo chế độ chơi game
+ Đã tắt
+ Hiển thị thông báo
+ Hiện thông báo nhanh
+ Hiện thông báo nhanh và thông báo
+ Chế độ động
+ Tự động phát hiện và thêm trò chơi
diff --git a/res/values/cherish_arrays.xml b/res/values/cherish_arrays.xml
index 57cf9b4..36fc5fe 100644
--- a/res/values/cherish_arrays.xml
+++ b/res/values/cherish_arrays.xml
@@ -373,4 +373,31 @@
- 5
- 6
+
+
+
+ - @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 177e591..3105eed 100644
--- a/res/values/cherish_strings.xml
+++ b/res/values/cherish_strings.xml
@@ -450,5 +450,30 @@
Contained
Retro
Stockish
+
+
+ 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_gaming_mode.xml b/res/xml/cherish_settings_gaming_mode.xml
new file mode 100644
index 0000000..f6745b6
--- /dev/null
+++ b/res/xml/cherish_settings_gaming_mode.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/cherish_settings_misc.xml b/res/xml/cherish_settings_misc.xml
index 756539d..30b6c63 100644
--- a/res/xml/cherish_settings_misc.xml
+++ b/res/xml/cherish_settings_misc.xml
@@ -18,6 +18,14 @@
android:title="@string/misc_title"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+
+
mGamingPackages;
+ private Context mContext;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // Get launch-able applications
+ addPreferencesFromResource(R.xml.cherish_settings_gaming_mode);
+
+ 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/fragments/GamingModeReceiver.java b/src/com/cherish/settings/fragments/GamingModeReceiver.java
new file mode 100644
index 0000000..abf08d2
--- /dev/null
+++ b/src/com/cherish/settings/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);
+ }
+ }
+}
diff --git a/src/com/cherish/settings/fragments/MiscSettings.java b/src/com/cherish/settings/fragments/MiscSettings.java
index 0fc2aee..2189ff9 100644
--- a/src/com/cherish/settings/fragments/MiscSettings.java
+++ b/src/com/cherish/settings/fragments/MiscSettings.java
@@ -2,44 +2,65 @@ package com.cherish.settings.fragments;
import com.android.internal.logging.nano.MetricsProto;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.ContentResolver;
-import android.content.DialogInterface;
-import android.content.res.Resources;
import android.os.Bundle;
-import android.os.SystemProperties;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.os.UserHandle;
+import android.content.ContentResolver;
+import android.content.res.Resources;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.SwitchPreference;
+import com.cherish.settings.preferences.CustomSeekBarPreference;
import android.provider.Settings;
import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import java.util.Locale;
+import android.text.TextUtils;
+import android.view.View;
+import java.util.List;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashSet;
import com.android.settings.SettingsPreferenceFragment;
+import com.cherish.settings.preferences.SystemSettingMasterSwitchPreference;
public class MiscSettings extends SettingsPreferenceFragment implements
OnPreferenceChangeListener {
+ private static final String GAMING_MODE_ENABLED = "gaming_mode_enabled";
+
+ private SystemSettingMasterSwitchPreference mGamingMode;
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ ContentResolver resolver = getActivity().getContentResolver();
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();
+ if (preference == mGamingMode) {
+ boolean value = (Boolean) objValue;
+ Settings.System.putInt(getActivity().getContentResolver(),
+ Settings.System.GAMING_MODE_ENABLED, value ? 1 : 0);
+ return true;
+ }
return false;
}