diff --git a/res/color/master_setting_switch_bar_bg.xml b/res/color/master_setting_switch_bar_bg.xml new file mode 100644 index 0000000..5a38517 --- /dev/null +++ b/res/color/master_setting_switch_bar_bg.xml @@ -0,0 +1,17 @@ + + + + + + + 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/drawable/ic_settings_lockscreen.xml b/res/drawable/ic_settings_lockscreen.xml new file mode 100644 index 0000000..2606b31 --- /dev/null +++ b/res/drawable/ic_settings_lockscreen.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/res/drawable/master_setting_switchbar_background.xml b/res/drawable/master_setting_switchbar_background.xml new file mode 100644 index 0000000..e9992ca --- /dev/null +++ b/res/drawable/master_setting_switchbar_background.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/res/layout/applist_preference_icon.xml b/res/layout/applist_preference_icon.xml new file mode 100644 index 0000000..e2e94e2 --- /dev/null +++ b/res/layout/applist_preference_icon.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + diff --git a/res/layout/master_setting_switch.xml b/res/layout/master_setting_switch.xml new file mode 100644 index 0000000..5ab875a --- /dev/null +++ b/res/layout/master_setting_switch.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/res/layout/master_setting_switch_bar.xml b/res/layout/master_setting_switch_bar.xml new file mode 100644 index 0000000..f0f316c --- /dev/null +++ b/res/layout/master_setting_switch_bar.xml @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/res/values/one_arrays.xml b/res/values/one_arrays.xml index 4e2cea9..3d3d5b9 100644 --- a/res/values/one_arrays.xml +++ b/res/values/one_arrays.xml @@ -15,4 +15,53 @@ 300 600 + + + + @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 + + + + + @string/network_traffic_statusbar + @string/network_traffic_qs_header + + + 0 + 1 + + + + @string/network_traffic_dynamic + @string/network_traffic_download + @string/network_traffic_upload + + + 0 + 1 + 2 + + diff --git a/res/values/one_strings.xml b/res/values/one_strings.xml index a94ba90..1c75c27 100644 --- a/res/values/one_strings.xml +++ b/res/values/one_strings.xml @@ -19,6 +19,7 @@ Miscellaneous Status bar About + Lock Screen OK @@ -27,9 +28,58 @@ Save - Network traffic - Show net activity in statusbar - Net activity autohide threshold (KB/s) + Network + Network speed + Show network speed in the status bar + Location + Status bar + QS header + Display mode + Dynamic + Download + Upload + Auto-hide threshold + Refresh interval + + + Screen off FOD + Use fingerprint reader also when the screen is off + Show icon + Show fingerprint icon when the screen is off + + + New Brightness slider (beta) + Shows brightness slider below qs panel + Brightness slider at bottom + Show a brightness slider on bottom quick settings + + + 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 + Choose app + Delete + Remove selected item? Swipe to screenshot @@ -47,12 +97,12 @@ Developers Support Team - • Co-Founder \n• Core Developer \n• UI/UX Designer\n• Maintainer - • Founder \n• Core Developer\n• Maintainer + • Founder \n• Core Developer \n• UI/UX Designer\n• Maintainer + • Co-Founder \n• Core Developer\n• Maintainer • The One whos Effort made this - • Teams Inspiration • Feature Hungry - • Support Group Moderator + • Feature Bringer + Device Support Links Announcements Official announcements channel diff --git a/res/xml/config_center_about.xml b/res/xml/config_center_about.xml index 5e6dd3c..568ab16 100644 --- a/res/xml/config_center_about.xml +++ b/res/xml/config_center_about.xml @@ -53,34 +53,54 @@ - + android:data="https://github.com/prathameshdhawale"/> - + - + android:data="https://github.com/AbShaheen184"/> + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/network_traffic.xml b/res/xml/network_traffic.xml new file mode 100644 index 0000000..a8ce6aa --- /dev/null +++ b/res/xml/network_traffic.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + diff --git a/res/xml/one_settings.xml b/res/xml/one_settings.xml index 27301ea..32d322b 100644 --- a/res/xml/one_settings.xml +++ b/res/xml/one_settings.xml @@ -39,4 +39,19 @@ android:fragment="com.teamone.OneCustoms.fragments.About" android:icon="@drawable/ic_settings_about"/> + + + + + + + diff --git a/res/xml/one_settings_gestures.xml b/res/xml/one_settings_gestures.xml index 0e017e7..2c30048 100644 --- a/res/xml/one_settings_gestures.xml +++ b/res/xml/one_settings_gestures.xml @@ -18,12 +18,6 @@ android:title="@string/gestures_title" xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"> - - + + + + + + + diff --git a/res/xml/one_settings_misc.xml b/res/xml/one_settings_misc.xml new file mode 100644 index 0000000..4398040 --- /dev/null +++ b/res/xml/one_settings_misc.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/res/xml/one_settings_statusbar.xml b/res/xml/one_settings_statusbar.xml index 16db322..bdad8fb 100644 --- a/res/xml/one_settings_statusbar.xml +++ b/res/xml/one_settings_statusbar.xml @@ -18,18 +18,19 @@ android:title="@string/statusbar_title" xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"> - - - + + + + + + diff --git a/src/com/teamone/OneCustoms/fragments/GamingMode.java b/src/com/teamone/OneCustoms/fragments/GamingMode.java new file mode 100644 index 0000000..014cfe3 --- /dev/null +++ b/src/com/teamone/OneCustoms/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.teamone.OneCustoms.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.teamone.OneCustoms.preferences.PackageListAdapter; +import com.teamone.OneCustoms.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.ONE_MODS; + } + + @Override + public int getDialogMetricsCategory(int dialogId) { + if (dialogId == DIALOG_GAMING_APPS) { + return MetricsProto.MetricsEvent.ONE_MODS; + } + 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/teamone/OneCustoms/fragments/GamingModeReceiver.java b/src/com/teamone/OneCustoms/fragments/GamingModeReceiver.java new file mode 100644 index 0000000..b347512 --- /dev/null +++ b/src/com/teamone/OneCustoms/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.teamone.OneCustoms.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/teamone/OneCustoms/fragments/LockScreen.java b/src/com/teamone/OneCustoms/fragments/LockScreen.java new file mode 100644 index 0000000..3cd0e2e --- /dev/null +++ b/src/com/teamone/OneCustoms/fragments/LockScreen.java @@ -0,0 +1,70 @@ +package com.teamone.OneCustoms.fragments; + +import android.app.Activity; +import android.content.Context; +import android.content.ContentResolver; +import android.content.pm.PackageManager; +import android.content.Intent; +import android.content.res.Resources; +import android.hardware.fingerprint.FingerprintManager; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import androidx.preference.*; + +import com.android.internal.one.app.OneContextConstants; +import com.android.internal.logging.nano.MetricsProto; + +import com.teamone.OneCustoms.preferences.SystemSettingSwitchPreference; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +public class LockScreen extends SettingsPreferenceFragment implements + Preference.OnPreferenceChangeListener { + + private static final String KEY_SCREEN_OFF_FOD = "screen_off_fod"; + private static final String KEY_SCREEN_OFF_FOD_ICON = "screen_off_fod_icon"; + + private SwitchPreference mScreenOffFOD; + private SystemSettingSwitchPreference mScreenOffFODIcon; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.one_settings_lockscreen); + final PreferenceScreen prefScreen = getPreferenceScreen(); + Resources resources = getResources(); + PackageManager packageManager = getPackageManager(); + + boolean mScreenOffFODValue = Settings.System.getInt(getActivity().getContentResolver(), + Settings.System.SCREEN_OFF_FOD, 0) != 0; + + mScreenOffFOD = (SwitchPreference) findPreference(KEY_SCREEN_OFF_FOD); + mScreenOffFOD.setChecked(mScreenOffFODValue); + mScreenOffFOD.setOnPreferenceChangeListener(this); + mScreenOffFODIcon = (SystemSettingSwitchPreference) findPreference(KEY_SCREEN_OFF_FOD_ICON); + + if (!packageManager.hasSystemFeature(OneContextConstants.Features.FOD)) { + mScreenOffFOD.setVisible(false); + mScreenOffFODIcon.setVisible(false); + } + + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + ContentResolver resolver = getActivity().getContentResolver(); + if (preference == mScreenOffFOD) { + int mScreenOffFODValue = (Boolean) newValue ? 1 : 0; + Settings.System.putInt(resolver, Settings.System.SCREEN_OFF_FOD, mScreenOffFODValue); + Settings.Secure.putInt(resolver, Settings.Secure.DOZE_ALWAYS_ON, mScreenOffFODValue); + return true; + } + return false; + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.ONE_MODS; + } +} diff --git a/src/com/teamone/OneCustoms/fragments/MiscSettings.java b/src/com/teamone/OneCustoms/fragments/MiscSettings.java new file mode 100644 index 0000000..2d49b51 --- /dev/null +++ b/src/com/teamone/OneCustoms/fragments/MiscSettings.java @@ -0,0 +1,50 @@ +package com.teamone.OneCustoms.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.os.UserHandle; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.Preference.OnPreferenceChangeListener; +import androidx.preference.SwitchPreference; +import android.provider.Settings; +import com.android.settings.R; + +import java.util.Arrays; +import java.util.HashSet; + +import com.android.settings.SettingsPreferenceFragment; + +public class MiscSettings extends SettingsPreferenceFragment implements + OnPreferenceChangeListener { + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + addPreferencesFromResource(R.xml.one_settings_misc); + + } + + @Override + public boolean onPreferenceChange(Preference preference, Object objValue) { + + return false; + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.ONE_MODS; + } +} diff --git a/src/com/teamone/OneCustoms/fragments/NetworkTraffic.java b/src/com/teamone/OneCustoms/fragments/NetworkTraffic.java new file mode 100644 index 0000000..3c89ef5 --- /dev/null +++ b/src/com/teamone/OneCustoms/fragments/NetworkTraffic.java @@ -0,0 +1,106 @@ +package com.teamone.OneCustoms.fragments; + +import android.os.Bundle; +import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.Switch; +import android.widget.TextView; + +import androidx.preference.Preference; + +import com.android.internal.logging.nano.MetricsProto; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import com.teamone.OneCustoms.preferences.SystemSettingListPreference; +import com.teamone.OneCustoms.preferences.CustomSeekBarPreference; + +public class NetworkTraffic extends SettingsPreferenceFragment implements + Preference.OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener { + + private SystemSettingListPreference mLocation; + private SystemSettingListPreference mIndicatorMode; + private CustomSeekBarPreference mThreshold; + private CustomSeekBarPreference mInterval; + + private TextView mTextView; + private View mSwitchBar; + + @Override + public void onCreate(Bundle savedInstance) { + super.onCreate(savedInstance); + addPreferencesFromResource(R.xml.network_traffic); + + mLocation = (SystemSettingListPreference) findPreference("network_traffic_location"); + mIndicatorMode = (SystemSettingListPreference) findPreference("network_traffic_mode"); + mThreshold = (CustomSeekBarPreference) findPreference("network_traffic_autohide_threshold"); + mInterval = (CustomSeekBarPreference) findPreference("network_traffic_refresh_interval"); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View view = LayoutInflater.from(getContext()).inflate(R.layout.master_setting_switch, container, false); + ((ViewGroup) view).addView(super.onCreateView(inflater, container, savedInstanceState)); + return view; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + boolean enabled = Settings.System.getInt(getContentResolver(), + Settings.System.NETWORK_TRAFFIC_STATE, 0) == 1; + + mTextView = view.findViewById(R.id.switch_text); + mTextView.setText(getString(enabled ? + R.string.switch_on_text : R.string.switch_off_text)); + + mSwitchBar = view.findViewById(R.id.switch_bar); + Switch switchWidget = mSwitchBar.findViewById(android.R.id.switch_widget); + switchWidget.setChecked(enabled); + switchWidget.setOnCheckedChangeListener(this); + mSwitchBar.setActivated(enabled); + mSwitchBar.setOnClickListener(v -> { + switchWidget.setChecked(!switchWidget.isChecked()); + mSwitchBar.setActivated(switchWidget.isChecked()); + }); + + mLocation.setEnabled(enabled); + mIndicatorMode.setEnabled(enabled); + mThreshold.setEnabled(enabled); + mInterval.setEnabled(enabled); + } + + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + Settings.System.putInt(getContentResolver(), + Settings.System.NETWORK_TRAFFIC_STATE, isChecked ? 1 : 0); + mTextView.setText(getString(isChecked ? R.string.switch_on_text : R.string.switch_off_text)); + mSwitchBar.setActivated(isChecked); + + mLocation.setEnabled(isChecked); + mIndicatorMode.setEnabled(isChecked); + mThreshold.setEnabled(isChecked); + mInterval.setEnabled(isChecked); + } + + @Override + public void onResume() { + super.onResume(); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return false; + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.ONE_MODS; + } +} diff --git a/src/com/teamone/OneCustoms/fragments/NetworkTraffic.java.save b/src/com/teamone/OneCustoms/fragments/NetworkTraffic.java.save new file mode 100644 index 0000000..6c209a8 --- /dev/null +++ b/src/com/teamone/OneCustoms/fragments/NetworkTraffic.java.save @@ -0,0 +1,111 @@ +package com.teamone.OneCustoms.fragments; + +import android.os.Bundle; +import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.Switch; +import android.widget.TextView; + +import androidx.preference.Preference; + +import com.android.internal.logging.nano.MetricsProto; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import com.teamone.OneCustoms.preferences.SystemSettingListPreference; +import com.teamone.OneCustoms.preferences.CustomSeekBarPreference; + +public class NetworkTraffic extends SettingsPreferenceFragment implements + Preference.OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener { + + private SystemSettingListPreference mLocation; + private SystemSettingListPreference mIndicatorMode; + private CustomSeekBarPreference mThreshold; + private CustomSeekBarPreference mInterval; + + private TextView mTextView; + private View mSwitchBar; + + @Override + public void onCreate(Bundle savedInstance) { + super.onCreate(savedInstance); + addPreferencesFromResource(R.xml.network_traffic); + + mLocation = (SystemSettingListPreference) findPreference("network_traffic_location"); +<<<<<<< HEAD:src/com/teamone/OneCustoms/fragments/NetworkTraffic.java + mThreshold = (CustomSeekBarPreference) findPreference("network_traffic_autohide_threshold"); + mInterval = (CustomSettingSeekBarPreference) findPreference("network_traffic_refresh_interval"); +======= + mIndicatorMode = (SystemSettingListPreference) findPreference("network_traffic_mode"); + mThreshold = (SystemSettingSeekBarPreference) findPreference("network_traffic_autohide_threshold"); + mInterval = (SystemSettingSeekBarPreference) findPreference("network_traffic_refresh_interval"); +>>>>>>> 6ce9851... ConfigCenter: Network Traffic: Allow to choose display mode [1/2]:src/com/havoc/config/center/fragments/NetworkTraffic.java + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View view = LayoutInflater.from(getContext()).inflate(R.layout.master_setting_switch, container, false); + ((ViewGroup) view).addView(super.onCreateView(inflater, container, savedInstanceState)); + return view; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + boolean enabled = Settings.System.getInt(getContentResolver(), + Settings.System.NETWORK_TRAFFIC_STATE, 0) == 1; + + mTextView = view.findViewById(R.id.switch_text); + mTextView.setText(getString(enabled ? + R.string.switch_on_text : R.string.switch_off_text)); + + mSwitchBar = view.findViewById(R.id.switch_bar); + Switch switchWidget = mSwitchBar.findViewById(android.R.id.switch_widget); + switchWidget.setChecked(enabled); + switchWidget.setOnCheckedChangeListener(this); + mSwitchBar.setActivated(enabled); + mSwitchBar.setOnClickListener(v -> { + switchWidget.setChecked(!switchWidget.isChecked()); + mSwitchBar.setActivated(switchWidget.isChecked()); + }); + + mLocation.setEnabled(enabled); + mIndicatorMode.setEnabled(enabled); + mThreshold.setEnabled(enabled); + mInterval.setEnabled(enabled); + } + + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + Settings.System.putInt(getContentResolver(), + Settings.System.NETWORK_TRAFFIC_STATE, isChecked ? 1 : 0); + mTextView.setText(getString(isChecked ? R.string.switch_on_text : R.string.switch_off_text)); + mSwitchBar.setActivated(isChecked); + + mLocation.setEnabled(isChecked); + mIndicatorMode.setEnabled(isChecked); + mThreshold.setEnabled(isChecked); + mInterval.setEnabled(isChecked); + } + + @Override + public void onResume() { + super.onResume(); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return false; + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.ONE_MODS; + } +} diff --git a/src/com/teamone/OneCustoms/fragments/StatusBarSettings.java b/src/com/teamone/OneCustoms/fragments/StatusBarSettings.java index 4ea28b8..0a8061c 100644 --- a/src/com/teamone/OneCustoms/fragments/StatusBarSettings.java +++ b/src/com/teamone/OneCustoms/fragments/StatusBarSettings.java @@ -25,7 +25,6 @@ import android.view.View; import com.android.settings.SettingsPreferenceFragment; -import com.teamone.OneCustoms.preferences.CustomSeekBarPreference; import com.teamone.OneCustoms.preferences.SystemSettingSwitchPreference; import com.android.settings.Utils; import android.util.Log; @@ -39,8 +38,8 @@ public class StatusBarSettings extends SettingsPreferenceFragment implements OnPreferenceChangeListener { - private CustomSeekBarPreference mThreshold; - private SystemSettingSwitchPreference mNetMonitor; + private static final String NETWORK_TRAFFIC = "network_traffic_state"; + private SystemSettingSwitchPreference mNetworkTraffic; @Override public void onCreate(Bundle icicle) { @@ -49,39 +48,21 @@ public void onCreate(Bundle icicle) { addPreferencesFromResource(R.xml.one_settings_statusbar); PreferenceScreen prefSet = getPreferenceScreen(); - final ContentResolver resolver = getActivity().getContentResolver(); - boolean isNetMonitorEnabled = Settings.System.getIntForUser(resolver, - Settings.System.NETWORK_TRAFFIC_STATE, 1, UserHandle.USER_CURRENT) == 1; - mNetMonitor = (SystemSettingSwitchPreference) findPreference("network_traffic_state"); - mNetMonitor.setChecked(isNetMonitorEnabled); - mNetMonitor.setOnPreferenceChangeListener(this); - - int value = Settings.System.getIntForUser(resolver, - Settings.System.NETWORK_TRAFFIC_AUTOHIDE_THRESHOLD, 1, UserHandle.USER_CURRENT); - mThreshold = (CustomSeekBarPreference) findPreference("network_traffic_autohide_threshold"); - mThreshold.setValue(value); - mThreshold.setOnPreferenceChangeListener(this); - mThreshold.setEnabled(isNetMonitorEnabled); + mNetworkTraffic = (SystemSettingSwitchPreference) findPreference(NETWORK_TRAFFIC); + mNetworkTraffic.setChecked((Settings.System.getInt(getActivity().getContentResolver(), + Settings.System.NETWORK_TRAFFIC_STATE, 0) == 1)); + mNetworkTraffic.setOnPreferenceChangeListener(this); } @Override - public boolean onPreferenceChange(Preference preference, Object objValue) { - if (preference == mNetMonitor) { - boolean value = (Boolean) objValue; - Settings.System.putIntForUser(getActivity().getContentResolver(), - Settings.System.NETWORK_TRAFFIC_STATE, value ? 1 : 0, - UserHandle.USER_CURRENT); - mNetMonitor.setChecked(value); - mThreshold.setEnabled(value); - return true; - } else if (preference == mThreshold) { - int val = (Integer) objValue; - Settings.System.putIntForUser(getContentResolver(), - Settings.System.NETWORK_TRAFFIC_AUTOHIDE_THRESHOLD, val, - UserHandle.USER_CURRENT); + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mNetworkTraffic) { + boolean value = (Boolean) newValue; + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.NETWORK_TRAFFIC_STATE, value ? 1 : 0); return true; - } + } return false; } diff --git a/src/com/teamone/OneCustoms/preferences/PackageListAdapter.java b/src/com/teamone/OneCustoms/preferences/PackageListAdapter.java new file mode 100644 index 0000000..603f0c4 --- /dev/null +++ b/src/com/teamone/OneCustoms/preferences/PackageListAdapter.java @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2012-2014 The CyanogenMod 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.teamone.OneCustoms.preferences; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.TreeSet; + +import com.android.settings.R; + +public class PackageListAdapter extends BaseAdapter implements Runnable { + private PackageManager mPm; + private LayoutInflater mInflater; + private List mInstalledPackages = new LinkedList(); + + // Packages which don't have launcher icons, but which we want to show nevertheless + private static final String[] PACKAGE_WHITELIST = new String[] { + "android", /* system server */ + "com.android.systemui", /* system UI */ + "com.android.providers.downloads" /* download provider */ + }; + + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + PackageItem item = (PackageItem) msg.obj; + int index = Collections.binarySearch(mInstalledPackages, item); + if (index < 0) { + mInstalledPackages.add(-index - 1, item); + } else { + mInstalledPackages.get(index).activityTitles.addAll(item.activityTitles); + } + notifyDataSetChanged(); + } + }; + + public static class PackageItem implements Comparable { + public final String packageName; + public final CharSequence title; + private final TreeSet activityTitles = new TreeSet(); + public final Drawable icon; + + PackageItem(String packageName, CharSequence title, Drawable icon) { + this.packageName = packageName; + this.title = title; + this.icon = icon; + } + + @Override + public int compareTo(PackageItem another) { + int result = title.toString().compareToIgnoreCase(another.title.toString()); + return result != 0 ? result : packageName.compareTo(another.packageName); + } + } + + public PackageListAdapter(Context context) { + mPm = context.getPackageManager(); + mInflater = LayoutInflater.from(context); + reloadList(); + } + + @Override + public int getCount() { + synchronized (mInstalledPackages) { + return mInstalledPackages.size(); + } + } + + @Override + public PackageItem getItem(int position) { + synchronized (mInstalledPackages) { + return mInstalledPackages.get(position); + } + } + + @Override + public long getItemId(int position) { + synchronized (mInstalledPackages) { + // packageName is guaranteed to be unique in mInstalledPackages + return mInstalledPackages.get(position).packageName.hashCode(); + } + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + if (convertView != null) { + holder = (ViewHolder) convertView.getTag(); + } else { + convertView = mInflater.inflate(R.layout.applist_preference_icon, null, false); + holder = new ViewHolder(); + convertView.setTag(holder); + holder.title = (TextView) convertView.findViewById(com.android.internal.R.id.title); + holder.summary = (TextView) convertView.findViewById(com.android.internal.R.id.summary); + holder.icon = (ImageView) convertView.findViewById(R.id.icon); + } + + PackageItem applicationInfo = getItem(position); + holder.title.setText(applicationInfo.title); + holder.icon.setImageDrawable(applicationInfo.icon); + + boolean needSummary = applicationInfo.activityTitles.size() > 0; + if (applicationInfo.activityTitles.size() == 1) { + if (TextUtils.equals(applicationInfo.title, applicationInfo.activityTitles.first())) { + needSummary = false; + } + } + + if (needSummary) { + holder.summary.setText(TextUtils.join(", ", applicationInfo.activityTitles)); + holder.summary.setVisibility(View.VISIBLE); + } else { + holder.summary.setVisibility(View.GONE); + } + + return convertView; + } + + private void reloadList() { + mInstalledPackages.clear(); + new Thread(this).start(); + } + + @Override + public void run() { + final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); + mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); + List installedAppsInfo = mPm.queryIntentActivities(mainIntent, 0); + + for (ResolveInfo info : installedAppsInfo) { + ApplicationInfo appInfo = info.activityInfo.applicationInfo; + final PackageItem item = new PackageItem(appInfo.packageName, + appInfo.loadLabel(mPm), appInfo.loadIcon(mPm)); + item.activityTitles.add(info.loadLabel(mPm)); + mHandler.obtainMessage(0, item).sendToTarget(); + } + + for (String packageName : PACKAGE_WHITELIST) { + try { + ApplicationInfo appInfo = mPm.getApplicationInfo(packageName, 0); + final PackageItem item = new PackageItem(appInfo.packageName, + appInfo.loadLabel(mPm), appInfo.loadIcon(mPm)); + mHandler.obtainMessage(0, item).sendToTarget(); + } catch (PackageManager.NameNotFoundException ignored) { + // package not present, so nothing to add -> ignore it + } + } + } + + private static class ViewHolder { + TextView title; + TextView summary; + ImageView icon; + } +} diff --git a/src/com/teamone/OneCustoms/preferences/SwitchPreference.java b/src/com/teamone/OneCustoms/preferences/SwitchPreference.java new file mode 100644 index 0000000..f3f51d1 --- /dev/null +++ b/src/com/teamone/OneCustoms/preferences/SwitchPreference.java @@ -0,0 +1,55 @@ +package com.teamone.OneCustoms.preferences; + +import android.content.Context; +import android.os.VibrationEffect; +import android.os.Vibrator; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; + +import androidx.core.content.res.TypedArrayUtils; +import androidx.preference.R; + +public class SwitchPreference extends androidx.preference.SwitchPreference { + + private final Context mContext; + private final Vibrator mVibrator; + + public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + mContext = context; + mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + } + + public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public SwitchPreference(Context context, AttributeSet attrs) { + this(context, attrs, TypedArrayUtils.getAttr(context, + androidx.preference.R.attr.switchPreferenceStyle, + android.R.attr.switchPreferenceStyle)); + } + + public SwitchPreference(Context context) { + this(context, null); + } + + @Override + protected void performClick(View view) { + super.performClick(view); + + doHapticFeedback(); + } + + private void doHapticFeedback() { + final boolean hapticEnabled = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0; + + if (hapticEnabled) { + mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_CLICK)); + } + } +} diff --git a/src/com/teamone/OneCustoms/preferences/SystemSettingListPreference.java b/src/com/teamone/OneCustoms/preferences/SystemSettingListPreference.java new file mode 100644 index 0000000..5e596fd --- /dev/null +++ b/src/com/teamone/OneCustoms/preferences/SystemSettingListPreference.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2017 AICP + * + * 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.teamone.OneCustoms.preferences; + +import android.content.Context; +import androidx.preference.ListPreference; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.provider.Settings; + +public class SystemSettingListPreference extends ListPreference { + private boolean mAutoSummary = false; + + public SystemSettingListPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver())); + } + + public SystemSettingListPreference(Context context, AttributeSet attrs) { + super(context, attrs); + setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver())); + } + + public SystemSettingListPreference(Context context) { + super(context); + setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver())); + } + + @Override + public void setValue(String value) { + super.setValue(value); + if (mAutoSummary || TextUtils.isEmpty(getSummary())) { + setSummary(getEntry(), true); + } + } + + @Override + public void setSummary(CharSequence summary) { + setSummary(summary, false); + } + + private void setSummary(CharSequence summary, boolean autoSummary) { + mAutoSummary = autoSummary; + super.setSummary(summary); + } + + @Override + protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { + // This is what default ListPreference implementation is doing without respecting + // real default value: + //setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue); + // Instead, we better do + setValue(restoreValue ? getPersistedString((String) defaultValue) : (String) defaultValue); + } +} diff --git a/src/com/teamone/OneCustoms/preferences/SystemSettingsStore.java b/src/com/teamone/OneCustoms/preferences/SystemSettingsStore.java new file mode 100644 index 0000000..15a458b --- /dev/null +++ b/src/com/teamone/OneCustoms/preferences/SystemSettingsStore.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2017 AICP + * + * 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.teamone.OneCustoms.preferences; + +import android.content.ContentResolver; +import android.preference.PreferenceDataStore; +import android.provider.Settings; + +public class SystemSettingsStore extends androidx.preference.PreferenceDataStore + implements PreferenceDataStore { + + private ContentResolver mContentResolver; + + public SystemSettingsStore(ContentResolver contentResolver) { + mContentResolver = contentResolver; + } + + public boolean getBoolean(String key, boolean defValue) { + return getInt(key, defValue ? 1 : 0) != 0; + } + + public float getFloat(String key, float defValue) { + return Settings.System.getFloat(mContentResolver, key, defValue); + } + + public int getInt(String key, int defValue) { + return Settings.System.getInt(mContentResolver, key, defValue); + } + + public long getLong(String key, long defValue) { + return Settings.System.getLong(mContentResolver, key, defValue); + } + + public String getString(String key, String defValue) { + String result = Settings.System.getString(mContentResolver, key); + return result == null ? defValue : result; + } + + public void putBoolean(String key, boolean value) { + putInt(key, value ? 1 : 0); + } + + public void putFloat(String key, float value) { + Settings.System.putFloat(mContentResolver, key, value); + } + + public void putInt(String key, int value) { + Settings.System.putInt(mContentResolver, key, value); + } + + public void putLong(String key, long value) { + Settings.System.putLong(mContentResolver, key, value); + } + + public void putString(String key, String value) { + Settings.System.putString(mContentResolver, key, value); + } + +}