From 4a3c87d08887276a12c5e1e5732ed017d2225435 Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Sat, 26 Dec 2020 14:55:22 +0000 Subject: [PATCH] samsung: doze: Apply a major refactor * Introduce a main switch to actually enable/disable doze globally * Move preferences handling out of SamsungDozeService class and create Utils class to hold all helper methods. Change-Id: Idb40650296d50352b4a985d2068f14cda6cb4aaf --- doze/Android.mk | 2 + doze/res/color/switch_bar_bg.xml | 20 +++ doze/res/drawable/switchbar_background.xml | 20 +++ doze/res/layout/doze.xml | 28 ++++ doze/res/layout/switch_bar.xml | 49 +++++++ doze/res/values-night/colors.xml | 20 +++ doze/res/values/colors.xml | 21 +++ doze/res/values/styles.xml | 21 ++- doze/res/xml/gesture_panel.xml | 16 +-- .../settings/doze/BootCompletedReceiver.java | 4 +- .../settings/doze/SamsungDozeActivity.java | 2 +- .../settings/doze/SamsungDozeService.java | 59 ++------ .../settings/doze/SamsungDozeSettings.java | 129 ++++++++++++++++++ .../doze/TouchscreenGestureSettings.java | 54 -------- .../org/lineageos/settings/doze/Utils.java | 86 ++++++++++++ 15 files changed, 413 insertions(+), 118 deletions(-) create mode 100644 doze/res/color/switch_bar_bg.xml create mode 100644 doze/res/drawable/switchbar_background.xml create mode 100644 doze/res/layout/doze.xml create mode 100644 doze/res/layout/switch_bar.xml create mode 100644 doze/res/values-night/colors.xml create mode 100644 doze/res/values/colors.xml create mode 100644 doze/src/org/lineageos/settings/doze/SamsungDozeSettings.java delete mode 100644 doze/src/org/lineageos/settings/doze/TouchscreenGestureSettings.java create mode 100644 doze/src/org/lineageos/settings/doze/Utils.java diff --git a/doze/Android.mk b/doze/Android.mk index 39bf2ac8..e4f1f114 100644 --- a/doze/Android.mk +++ b/doze/Android.mk @@ -30,4 +30,6 @@ ifneq ($(INCREMENTAL_BUILDS),) LOCAL_JACK_ENABLED := incremental endif +include frameworks/base/packages/SettingsLib/common.mk + include $(BUILD_PACKAGE) diff --git a/doze/res/color/switch_bar_bg.xml b/doze/res/color/switch_bar_bg.xml new file mode 100644 index 00000000..ca13e3ce --- /dev/null +++ b/doze/res/color/switch_bar_bg.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/doze/res/drawable/switchbar_background.xml b/doze/res/drawable/switchbar_background.xml new file mode 100644 index 00000000..f2107076 --- /dev/null +++ b/doze/res/drawable/switchbar_background.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/doze/res/layout/doze.xml b/doze/res/layout/doze.xml new file mode 100644 index 00000000..941cdf68 --- /dev/null +++ b/doze/res/layout/doze.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/doze/res/layout/switch_bar.xml b/doze/res/layout/switch_bar.xml new file mode 100644 index 00000000..1bf6f6cb --- /dev/null +++ b/doze/res/layout/switch_bar.xml @@ -0,0 +1,49 @@ + + + + + + + + + + diff --git a/doze/res/values-night/colors.xml b/doze/res/values-night/colors.xml new file mode 100644 index 00000000..5aa9c8e2 --- /dev/null +++ b/doze/res/values-night/colors.xml @@ -0,0 +1,20 @@ + + + + + #82000000 + @android:color/black + diff --git a/doze/res/values/colors.xml b/doze/res/values/colors.xml new file mode 100644 index 00000000..bb85f62c --- /dev/null +++ b/doze/res/values/colors.xml @@ -0,0 +1,21 @@ + + + + + @*android:color/material_grey_600 + #BFFFFFFF + @android:color/white + diff --git a/doze/res/values/styles.xml b/doze/res/values/styles.xml index 1ecca6c5..7a7aaa95 100644 --- a/doze/res/values/styles.xml +++ b/doze/res/values/styles.xml @@ -1,6 +1,7 @@ + 0.072727273 + diff --git a/doze/res/xml/gesture_panel.xml b/doze/res/xml/gesture_panel.xml index adbab9f4..4665c3a1 100644 --- a/doze/res/xml/gesture_panel.xml +++ b/doze/res/xml/gesture_panel.xml @@ -17,28 +17,20 @@ - - + android:key="proximity_sensor" + android:title="@string/proximity_sensor_title"> + android:summary="@string/hand_wave_gesture_summary" /> + android:summary="@string/pocket_gesture_summary" /> diff --git a/doze/src/org/lineageos/settings/doze/BootCompletedReceiver.java b/doze/src/org/lineageos/settings/doze/BootCompletedReceiver.java index 8640134f..387f791e 100644 --- a/doze/src/org/lineageos/settings/doze/BootCompletedReceiver.java +++ b/doze/src/org/lineageos/settings/doze/BootCompletedReceiver.java @@ -28,8 +28,8 @@ public class BootCompletedReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { - if (DEBUG) Log.d(TAG, "Starting service"); - context.startService(new Intent(context, SamsungDozeService.class)); + if (DEBUG) Log.d(TAG, "Received boot completed intent"); + Utils.checkDozeService(context); } } diff --git a/doze/src/org/lineageos/settings/doze/SamsungDozeActivity.java b/doze/src/org/lineageos/settings/doze/SamsungDozeActivity.java index 70856b68..a7230548 100644 --- a/doze/src/org/lineageos/settings/doze/SamsungDozeActivity.java +++ b/doze/src/org/lineageos/settings/doze/SamsungDozeActivity.java @@ -26,6 +26,6 @@ public class SamsungDozeActivity extends PreferenceActivity { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, - new TouchscreenGestureSettings(), TAG).commit(); + new SamsungDozeSettings(), TAG).commit(); } } diff --git a/doze/src/org/lineageos/settings/doze/SamsungDozeService.java b/doze/src/org/lineageos/settings/doze/SamsungDozeService.java index 47bc96a4..9a56f818 100644 --- a/doze/src/org/lineageos/settings/doze/SamsungDozeService.java +++ b/doze/src/org/lineageos/settings/doze/SamsungDozeService.java @@ -21,7 +21,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.SharedPreferences; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -29,24 +28,14 @@ import android.hardware.SensorManager; import android.os.IBinder; import android.os.PowerManager; import android.os.UserHandle; -import android.preference.PreferenceManager; -import android.provider.Settings; import android.util.Log; -import java.lang.System; -import java.util.ArrayList; -import java.util.concurrent.TimeUnit; -import java.util.List; - public class SamsungDozeService extends Service { private static final String TAG = "SamsungDozeService"; private static final boolean DEBUG = false; private static final String DOZE_INTENT = "com.android.systemui.doze.pulse"; - private static final String GESTURE_HAND_WAVE_KEY = "gesture_hand_wave"; - private static final String GESTURE_POCKET_KEY = "gesture_pocket"; - private static final int POCKET_DELTA_NS = 1000 * 1000 * 1000; private Context mContext; @@ -64,7 +53,7 @@ public class SamsungDozeService extends Service { private long mInPocketTime = 0; public SamsungProximitySensor(Context context) { - mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); + mSensorManager = context.getSystemService(SensorManager.class); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @@ -89,20 +78,21 @@ public class SamsungDozeService extends Service { private boolean shouldPulse(long timestamp) { long delta = timestamp - mInPocketTime; - if (mHandwaveGestureEnabled && mPocketGestureEnabled) { + if (Utils.isHandwaveGestureEnabled(mContext) && + Utils.isPocketGestureEnabled(mContext)) { return true; - } else if (mHandwaveGestureEnabled && !mPocketGestureEnabled) { + } else if (Utils.isHandwaveGestureEnabled(mContext) && + !Utils.isPocketGestureEnabled(mContext)) { return delta < POCKET_DELTA_NS; - } else if (!mHandwaveGestureEnabled && mPocketGestureEnabled) { + } else if (!Utils.isHandwaveGestureEnabled(mContext) && + Utils.isPocketGestureEnabled(mContext)) { return delta >= POCKET_DELTA_NS; } return false; } - public void testAndEnable() { - if ((isDozeEnabled() && (mHandwaveGestureEnabled || mPocketGestureEnabled)) { - mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); - } + public void enable() { + mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); } public void disable() { @@ -114,13 +104,10 @@ public class SamsungDozeService extends Service { public void onCreate() { if (DEBUG) Log.d(TAG, "SamsungDozeService Started"); mContext = this; - mPowerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); + mPowerManager = getSystemService(PowerManager.class); mSensor = new SamsungProximitySensor(mContext); - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); - loadPreferences(sharedPrefs); - sharedPrefs.registerOnSharedPreferenceChangeListener(mPrefListener); if (!isInteractive()) { - mSensor.testAndEnable(); + mSensor.enable(); } } @@ -147,11 +134,6 @@ public class SamsungDozeService extends Service { return mPowerManager.isInteractive(); } - private boolean isDozeEnabled() { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.DOZE_ENABLED, 1) != 0; - } - private void onDisplayOn() { if (DEBUG) Log.d(TAG, "Display on"); mSensor.disable(); @@ -159,12 +141,7 @@ public class SamsungDozeService extends Service { private void onDisplayOff() { if (DEBUG) Log.d(TAG, "Display off"); - mSensor.testAndEnable(); - } - - private void loadPreferences(SharedPreferences sharedPreferences) { - mHandwaveGestureEnabled = sharedPreferences.getBoolean(GESTURE_HAND_WAVE_KEY, false); - mPocketGestureEnabled = sharedPreferences.getBoolean(GESTURE_POCKET_KEY, false); + mSensor.enable(); } private BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() { @@ -177,16 +154,4 @@ public class SamsungDozeService extends Service { } } }; - - private SharedPreferences.OnSharedPreferenceChangeListener mPrefListener = - new SharedPreferences.OnSharedPreferenceChangeListener() { - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (GESTURE_HAND_WAVE_KEY.equals(key)) { - mHandwaveGestureEnabled = sharedPreferences.getBoolean(GESTURE_HAND_WAVE_KEY, false); - } else if (GESTURE_POCKET_KEY.equals(key)) { - mPocketGestureEnabled = sharedPreferences.getBoolean(GESTURE_POCKET_KEY, false); - } - } - }; } diff --git a/doze/src/org/lineageos/settings/doze/SamsungDozeSettings.java b/doze/src/org/lineageos/settings/doze/SamsungDozeSettings.java new file mode 100644 index 00000000..681ebd23 --- /dev/null +++ b/doze/src/org/lineageos/settings/doze/SamsungDozeSettings.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2015 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 org.lineageos.settings.doze; + +import android.app.ActionBar; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.MenuItem; +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 androidx.preference.PreferenceFragment; +import androidx.preference.SwitchPreference; + +import org.lineageos.internal.util.ScreenType; + +public class SamsungDozeSettings extends PreferenceFragment + implements CompoundButton.OnCheckedChangeListener, Preference.OnPreferenceChangeListener { + + private TextView mTextView; + private View mSwitchBar; + + private SwitchPreference mHandwavePreference; + private SwitchPreference mPocketPreference; + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(R.xml.gesture_panel); + final ActionBar actionBar = getActivity().getActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + + boolean dozeEnabled = Utils.isDozeEnabled(getActivity()); + + mHandwavePreference = findPreference(Utils.GESTURE_HAND_WAVE_KEY); + mHandwavePreference.setEnabled(dozeEnabled); + mHandwavePreference.setOnPreferenceChangeListener(this); + + mPocketPreference = findPreference(Utils.GESTURE_POCKET_KEY); + mPocketPreference.setEnabled(dozeEnabled); + mPocketPreference.setOnPreferenceChangeListener(this); + } + + @Override + public void onResume() { + super.onResume(); + + // If running on a phone, remove padding around the listview + if (!ScreenType.isTablet(getContext())) { + getListView().setPadding(0, 0, 0, 0); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View view = + LayoutInflater.from(getContext()).inflate(R.layout.doze, 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 dozeEnabled = Utils.isDozeEnabled(getActivity()); + + mTextView = view.findViewById(R.id.switch_text); + mTextView.setText(getString(dozeEnabled ? + R.string.switch_bar_on : R.string.switch_bar_off)); + + mSwitchBar = view.findViewById(R.id.switch_bar); + Switch switchWidget = mSwitchBar.findViewById(android.R.id.switch_widget); + switchWidget.setChecked(dozeEnabled); + switchWidget.setOnCheckedChangeListener(this); + mSwitchBar.setActivated(dozeEnabled); + mSwitchBar.setOnClickListener(v -> { + switchWidget.setChecked(!switchWidget.isChecked()); + mSwitchBar.setActivated(switchWidget.isChecked()); + }); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + Utils.enableGesture(getActivity(), preference.getKey(), (Boolean) newValue); + Utils.checkDozeService(getActivity()); + + return true; + } + + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + Utils.enableDoze(getActivity(), isChecked); + Utils.checkDozeService(getActivity()); + + mTextView.setText(getString(isChecked ? R.string.switch_bar_on : R.string.switch_bar_off)); + mSwitchBar.setActivated(isChecked); + + mHandwavePreference.setEnabled(isChecked); + mPocketPreference.setEnabled(isChecked); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + getActivity().onBackPressed(); + return true; + } + return false; + } +} diff --git a/doze/src/org/lineageos/settings/doze/TouchscreenGestureSettings.java b/doze/src/org/lineageos/settings/doze/TouchscreenGestureSettings.java deleted file mode 100644 index 4f57da09..00000000 --- a/doze/src/org/lineageos/settings/doze/TouchscreenGestureSettings.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2015 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 org.lineageos.settings.doze; - -import android.app.ActionBar; -import android.os.Bundle; -import android.view.MenuItem; - -import androidx.preference.PreferenceFragment; - -import org.lineageos.internal.util.ScreenType; - -public class TouchscreenGestureSettings extends PreferenceFragment { - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.gesture_panel); - final ActionBar actionBar = getActivity().getActionBar(); - actionBar.setDisplayHomeAsUpEnabled(true); - } - - @Override - public void onResume() { - super.onResume(); - - // If running on a phone, remove padding around the listview - if (!ScreenType.isTablet(getContext())) { - getListView().setPadding(0, 0, 0, 0); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - getActivity().onBackPressed(); - return true; - } - return false; - } -} diff --git a/doze/src/org/lineageos/settings/doze/Utils.java b/doze/src/org/lineageos/settings/doze/Utils.java new file mode 100644 index 00000000..ee22cc12 --- /dev/null +++ b/doze/src/org/lineageos/settings/doze/Utils.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * 2017-2019 The LineageOS 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 org.lineageos.settings.doze; + +import static android.provider.Settings.Secure.DOZE_ENABLED; + +import android.content.Context; +import android.content.Intent; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.Log; + +import androidx.preference.PreferenceManager; + +public final class Utils { + + private static final String TAG = "DozeUtils"; + private static final boolean DEBUG = false; + + protected static final String GESTURE_HAND_WAVE_KEY = "gesture_hand_wave"; + protected static final String GESTURE_POCKET_KEY = "gesture_pocket"; + + protected static void startService(Context context) { + if (DEBUG) Log.d(TAG, "Starting service"); + context.startServiceAsUser(new Intent(context, SamsungDozeService.class), + UserHandle.CURRENT); + } + + protected static void stopService(Context context) { + if (DEBUG) Log.d(TAG, "Stopping service"); + context.stopServiceAsUser(new Intent(context, SamsungDozeService.class), + UserHandle.CURRENT); + } + + protected static void checkDozeService(Context context) { + if (isDozeEnabled(context) && isAnyGestureEnabled(context)) { + startService(context); + } else { + stopService(context); + } + } + + protected static boolean isDozeEnabled(Context context) { + return Settings.Secure.getInt(context.getContentResolver(), + DOZE_ENABLED, 1) != 0; + } + + protected static boolean enableDoze(Context context, boolean enable) { + return Settings.Secure.putInt(context.getContentResolver(), + DOZE_ENABLED, enable ? 1 : 0); + } + + protected static void enableGesture(Context context, String gesture, boolean enable) { + PreferenceManager.getDefaultSharedPreferences(context).edit() + .putBoolean(gesture, enable).apply(); + } + + protected static boolean isAnyGestureEnabled(Context context) { + return isHandwaveGestureEnabled(context) || isPocketGestureEnabled(context); + } + + protected static boolean isHandwaveGestureEnabled(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(GESTURE_HAND_WAVE_KEY, false); + } + + protected static boolean isPocketGestureEnabled(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(GESTURE_POCKET_KEY, false); + } +}