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