diff --git a/res/drawable/ic_add.xml b/res/drawable/ic_add.xml
new file mode 100644
index 0000000..de9a522
--- /dev/null
+++ b/res/drawable/ic_add.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_gaming_image.xml b/res/drawable/ic_gaming_image.xml
new file mode 100644
index 0000000..218f8a6
--- /dev/null
+++ b/res/drawable/ic_gaming_image.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml
index b2aefce..41b2b27 100644
--- a/res/values/cherish_strings.xml
+++ b/res/values/cherish_strings.xml
@@ -1342,4 +1342,48 @@
Monet Accuracy
The More Accurate the slower (Def 16)
+ Add application
+
+
+ Gaming mode
+ Enable gaming mode
+ Disable automatic brightness
+ Disable auto brightness when entering game mode
+ Notification Danmaku
+ Display the notification content in the form of danmaku in the game
+ Quick Start Apps
+ Choose the application that you want to launch with a floating ball
+
+ Performance
+ Use game driver
+ Use specific drivers for games
+ Performance tuning
+ Adjust performance level when starting game
+ Performance level
+
+ Do not distrub
+ Disable notification alert
+ Do not allow floating notification and conversation bubbles other than incoming calls and alarms
+ No ringing
+ Turn off the ringing of incoming calls and notifications in gaming mode
+ Answering calls automatically
+ Answer calls automatically in the game and hands free when no headphones connected
+
+ prevent accidental touch
+ Disable hardware keys
+ Disable gestures
+
+ Game list
+ Dynamic mode
+ Try detecting and adding gaming apps automatically
+
+ Show danmaku
+ Dynamic filtering notification
+ Automatically filter notifications such as download progress
+ Danmaku size (horizontal)
+ Danmaku size (vertical)
+ Danmaku speed (horizontal)
+ Danmaku speed (vertical)
+ Blacklist
+
diff --git a/res/xml/cherish_settings_gaming.xml b/res/xml/cherish_settings_gaming.xml
new file mode 100644
index 0000000..31ded87
--- /dev/null
+++ b/res/xml/cherish_settings_gaming.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/cherish_settings_gaming_danmaku.xml b/res/xml/cherish_settings_gaming_danmaku.xml
new file mode 100644
index 0000000..b3904e6
--- /dev/null
+++ b/res/xml/cherish_settings_gaming_danmaku.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/cherish_settings_gaming_qs_app.xml b/res/xml/cherish_settings_gaming_qs_app.xml
new file mode 100644
index 0000000..6025d91
--- /dev/null
+++ b/res/xml/cherish_settings_gaming_qs_app.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/cherish_settings_misc.xml b/res/xml/cherish_settings_misc.xml
index 191ac42..255048e 100644
--- a/res/xml/cherish_settings_misc.xml
+++ b/res/xml/cherish_settings_misc.xml
@@ -44,6 +44,13 @@
android:persistent="false" />
+
+
+
mGamingPackages = new ArrayList<>();
+ private ArrayList mRemovedPackages = new ArrayList<>();
+
+ public PackageListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mContext = context;
+
+ mPackageManager = mContext.getPackageManager();
+ mPackageAdapter = new PackageListAdapter(mContext);
+
+ mContentResolver = mContext.getApplicationContext().getContentResolver();
+
+ mAddPackagePref = makeAddPref();
+
+ this.setOrderingAsAdded(false);
+ }
+
+ private Preference makeAddPref() {
+ Preference pref = new Preference(mContext);
+ pref.setTitle(R.string.add_package_to_title);
+ pref.setIcon(R.drawable.ic_add);
+ pref.setPersistent(false);
+ pref.setOnPreferenceClickListener(this);
+ return pref;
+ }
+
+ public void setRemovedListKey(String key) {
+ mRemovedListKey = key;
+ if (isAttached()) {
+ refreshCustomApplicationPrefs();
+ }
+ }
+
+ private ApplicationInfo getAppInfo(String packageName) {
+ try {
+ return mPackageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private void parsePackageList() {
+ mGamingPackages.clear();
+ mRemovedPackages.clear();
+
+ String packageListData = Settings.System.getString(mContentResolver, getKey());
+ if (!TextUtils.isEmpty(packageListData)) {
+ String[] packageListArray = packageListData.split(";");
+ mGamingPackages.addAll(Arrays.asList(packageListArray));
+ }
+ if (!TextUtils.isEmpty(mRemovedListKey)) {
+ String removedPackageListData = Settings.System.getString(mContentResolver, mRemovedListKey);
+ if (!TextUtils.isEmpty(removedPackageListData)) {
+ String[] packageListArray = removedPackageListData.split(";");
+ mRemovedPackages.addAll(Arrays.asList(packageListArray));
+ }
+ }
+ }
+
+ private void refreshCustomApplicationPrefs() {
+ parsePackageList();
+ removeAll();
+ addPreference(mAddPackagePref);
+ for (String pkg : mGamingPackages) {
+ addPackageToPref(pkg);
+ }
+ }
+
+ private void savePackagesList() {
+ String packageListData = String.join(";", mGamingPackages);
+ Settings.System.putString(mContentResolver, getKey(), packageListData);
+ if (!TextUtils.isEmpty(mRemovedListKey)) {
+ String removedPackageListData = String.join(";", mRemovedPackages);
+ Settings.System.putString(mContentResolver, mRemovedListKey, removedPackageListData);
+ }
+ }
+
+ private void addPackageToPref(String packageName) {
+ Preference pref = new Preference(mContext);
+ ApplicationInfo appInfo = getAppInfo(packageName);
+ if (appInfo == null) return;
+ pref.setKey(packageName);
+ pref.setTitle(appInfo.loadLabel(mPackageManager));
+ pref.setIcon(appInfo.loadIcon(mPackageManager));
+ pref.setPersistent(false);
+ pref.setOnPreferenceClickListener(this);
+ addPreference(pref);
+ }
+
+ private void addPackageToList(String packageName) {
+ if (!mGamingPackages.contains(packageName)) {
+ mGamingPackages.add(packageName);
+ addPackageToPref(packageName);
+ }
+ mRemovedPackages.remove(packageName);
+ savePackagesList();
+ }
+
+ private void removePackageFromList(String packageName) {
+ if (!mRemovedPackages.contains(packageName)) {
+ mRemovedPackages.add(packageName);
+ }
+ mGamingPackages.remove(packageName);
+ savePackagesList();
+ }
+
+ @Override
+ public void onAttached() {
+ super.onAttached();
+ refreshCustomApplicationPrefs();
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ if (preference == mAddPackagePref) {
+ ListView appsList = new ListView(mContext);
+ appsList.setAdapter(mPackageAdapter);
+ builder.setTitle(R.string.profile_choose_app);
+ builder.setNegativeButton(android.R.string.cancel, null);
+ builder.setView(appsList);
+ final Dialog dialog = builder.create();
+ appsList.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ PackageItem info = (PackageItem) parent.getItemAtPosition(position);
+ addPackageToList(info.packageName);
+ dialog.cancel();
+ }
+ });
+ dialog.show();
+ } else if (preference == findPreference(preference.getKey())) {
+ builder.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) {
+ removePackageFromList(preference.getKey());
+ removePreference(preference);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null).show();
+ }
+ return true;
+ }
+
+}