Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aea085bc authored by jackqdyulei's avatar jackqdyulei
Browse files

Create BatterySaverReceiver

This cl elicits BatterySaverReceiver that listen to the change about
battery state and battery saver state.

BatterySaverController and BatterySaverSettings will use this receiver
to update the UI.

Bug: 32410757
Test: RunSettingsRoboTests
Change-Id: Ia92c6776985b89fe6a8d5b8d80898e502942b9b5
Merged-In: Ia92c6776985b89fe6a8d5b8d80898e502942b9b5
parent 24ba2fbd
Loading
Loading
Loading
Loading
+13 −46
Original line number Diff line number Diff line
@@ -15,19 +15,14 @@
 */
package com.android.settings.fuelgauge;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.PowerManager;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceController;
@@ -39,15 +34,12 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING;

public class BatterySaverController extends PreferenceController implements
        Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop {
        Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop,
        BatterySaverReceiver.BatterySaverListener {
    private static final String KEY_BATTERY_SAVER = "battery_saver_summary";
    private static final String TAG = "BatterySaverController";
    private static final boolean DEBUG = false;

    private final BatteryStateChangeReceiver mBatteryStateChangeReceiver;
    private final BatterySaverReceiver mBatteryStateChangeReceiver;
    private final PowerManager mPowerManager;
    private MasterSwitchPreference mBatterySaverPref;

@@ -56,7 +48,8 @@ public class BatterySaverController extends PreferenceController implements

        lifecycle.addObserver(this);
        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mBatteryStateChangeReceiver = new BatteryStateChangeReceiver();
        mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
        mBatteryStateChangeReceiver.setBatterySaverListener(this);
    }

    @Override
@@ -137,40 +130,14 @@ public class BatterySaverController extends PreferenceController implements
        }
    };

    private final class BatteryStateChangeReceiver extends BroadcastReceiver {
        private boolean mRegistered;

    @Override
        public void onReceive(Context context, Intent intent) {
            if (DEBUG) {
                Log.d(TAG, "Received " + intent.getAction());
            }
            final String action = intent.getAction();
            if (action.equals(ACTION_POWER_SAVE_MODE_CHANGING)) {
    public void onPowerSaveModeChanged() {
        mBatterySaverPref.setChecked(mPowerManager.isPowerSaveMode());
        updateSummary();
            } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                // disable BSM switch if phone is plugged in or at 100% while plugged in
                final boolean enabled = !(status == BatteryManager.BATTERY_STATUS_CHARGING
                        || status == BatteryManager.BATTERY_STATUS_FULL);

                mBatterySaverPref.setSwitchEnabled(enabled);
            }
        }

        public void setListening(boolean listening) {
            if (listening && !mRegistered) {
                final IntentFilter ifilter = new IntentFilter();
                ifilter.addAction(Intent.ACTION_BATTERY_CHANGED);
                ifilter.addAction(ACTION_POWER_SAVE_MODE_CHANGING);
                mContext.registerReceiver(this, ifilter);
                mRegistered = true;
            } else if (!listening && mRegistered) {
                mContext.unregisterReceiver(this);
                mRegistered = false;
            }
    }

    @Override
    public void onBatteryChanged(boolean pluggedIn) {
        mBatterySaverPref.setSwitchEnabled(!pluggedIn);
    }
}
+76 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source 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.android.settings.fuelgauge;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.PowerManager;
import android.util.Log;

public class BatterySaverReceiver extends BroadcastReceiver {
    private static final String TAG = "BatterySaverReceiver";
    private static final boolean DEBUG = false;
    private boolean mRegistered;
    private Context mContext;
    private BatterySaverListener mBatterySaverListener;

    public BatterySaverReceiver(Context context) {
        mContext = context;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (DEBUG) Log.d(TAG, "Received " + intent.getAction());
        String action = intent.getAction();
        if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
            if (mBatterySaverListener != null) {
                mBatterySaverListener.onPowerSaveModeChanged();
            }
        } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
            // disable BSM switch if phone is plugged in
            if (mBatterySaverListener != null) {
                final boolean pluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
                mBatterySaverListener.onBatteryChanged(pluggedIn);
            }
        }
    }

    public void setListening(boolean listening) {
        if (listening && !mRegistered) {
            final IntentFilter ifilter = new IntentFilter();
            ifilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
            ifilter.addAction(Intent.ACTION_BATTERY_CHANGED);
            mContext.registerReceiver(this, ifilter);
            mRegistered = true;
        } else if (!listening && mRegistered) {
            mContext.unregisterReceiver(this);
            mRegistered = false;
        }
    }

    public void setBatterySaverListener(BatterySaverListener lsn) {
        mBatterySaverListener = lsn;
    }

    interface BatterySaverListener {
        void onPowerSaveModeChanged();
        void onBatteryChanged(boolean pluggedIn);
    }
}
+14 −39
Original line number Diff line number Diff line
@@ -16,20 +16,17 @@

package com.android.settings.fuelgauge;

import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.provider.Settings.Global;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
import android.widget.Switch;

@@ -43,10 +40,8 @@ import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.notification.SettingPref;
import com.android.settings.widget.SwitchBar;

import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING;

public class BatterySaverSettings extends SettingsPreferenceFragment
        implements SwitchBar.OnSwitchChangeListener {
        implements SwitchBar.OnSwitchChangeListener, BatterySaverReceiver.BatterySaverListener {
    private static final String TAG = "BatterySaverSettings";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
    private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically";
@@ -54,15 +49,16 @@ public class BatterySaverSettings extends SettingsPreferenceFragment

    private final Handler mHandler = new Handler();
    private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler);
    private final Receiver mReceiver = new Receiver();

    @VisibleForTesting
    SwitchBar mSwitchBar;
    private Context mContext;
    private boolean mCreated;
    private SettingPref mTriggerPref;
    private SwitchBar mSwitchBar;
    private Switch mSwitch;
    private boolean mValidListener;
    private PowerManager mPowerManager;
    private BatterySaverReceiver mReceiver;

    @Override
    public int getMetricsCategory() {
@@ -101,6 +97,8 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
        mTriggerPref.init(this);

        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mReceiver = new BatterySaverReceiver(mContext);
        mReceiver.setBatterySaverListener(this);
    }

    @Override
@@ -187,37 +185,14 @@ public class BatterySaverSettings extends SettingsPreferenceFragment
        }
    };

    private final class Receiver extends BroadcastReceiver {

        private boolean mRegistered;

    @Override
        public void onReceive(Context context, Intent intent) {
            if (DEBUG) Log.d(TAG, "Received " + intent.getAction());
            String action = intent.getAction();
            if (action.equals(ACTION_POWER_SAVE_MODE_CHANGING)) {
    public void onPowerSaveModeChanged() {
        mHandler.post(mUpdateSwitch);
            } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                // disable BSM switch if phone is plugged in or at 100% while plugged in
                mSwitchBar.setEnabled(
                        !(status == BatteryManager.BATTERY_STATUS_CHARGING
                                || status == BatteryManager.BATTERY_STATUS_FULL));
            }
        }
        public void setListening(boolean listening) {
            if (listening && !mRegistered) {
                final IntentFilter ifilter = new IntentFilter();
                ifilter.addAction(ACTION_POWER_SAVE_MODE_CHANGING);
                ifilter.addAction(Intent.ACTION_BATTERY_CHANGED);
                mContext.registerReceiver(this, ifilter);
                mRegistered = true;
            } else if (!listening && mRegistered) {
                mContext.unregisterReceiver(this);
                mRegistered = false;
            }
    }

    @Override
    public void onBatteryChanged(boolean pluggedIn) {
        mSwitchBar.setEnabled(!pluggedIn);
    }

    private final class SettingsObserver extends ContentObserver {
+16 −0
Original line number Diff line number Diff line
@@ -17,10 +17,12 @@ package com.android.settings.fuelgauge;

import android.content.Context;
import android.os.PowerManager;

import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.widget.MasterSwitchPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -77,6 +79,20 @@ public class BatterySaverControllerTest {
        testUpdateStateInner(false);
    }

    @Test
    public void testOnBatteryChanged_pluggedIn_setDisable() {
        mBatterySaverController.onBatteryChanged(true /* pluggedIn */);

        verify(mBatterySaverPref).setSwitchEnabled(false);
    }

    @Test
    public void testOnBatteryChanged_notPluggedIn_setEnable() {
        mBatterySaverController.onBatteryChanged(false /* pluggedIn */);

        verify(mBatterySaverPref).setSwitchEnabled(true);
    }

    private void testOnPreferenceChangeInner(final boolean saverOn) {
        when(mPowerManager.setPowerSaveMode(saverOn)).thenReturn(true);
        when(mPowerManager.isPowerSaveMode()).thenReturn(!saverOn);
+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source 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.android.settings.fuelgauge;

import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.os.PowerManager;

import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class BatterySaverReceiverTest {
    @Mock
    private BatterySaverReceiver.BatterySaverListener mBatterySaverListener;
    @Mock
    private Context mContext;
    private BatterySaverReceiver mBatterySaverReceiver;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mBatterySaverReceiver = new BatterySaverReceiver(mContext);
        mBatterySaverReceiver.setBatterySaverListener(mBatterySaverListener);
    }

    @Test
    public void testOnReceive_devicePluggedIn_pluggedInTrue() {
        Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
        intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_AC);

        mBatterySaverReceiver.onReceive(mContext, intent);

        verify(mBatterySaverListener).onBatteryChanged(true);
    }

    @Test
    public void testOnReceive_deviceNotPluggedIn_pluggedInFalse() {
        Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
        intent.putExtra(BatteryManager.EXTRA_PLUGGED, 0);

        mBatterySaverReceiver.onReceive(mContext, intent);

        verify(mBatterySaverListener).onBatteryChanged(false);
    }

    @Test
    public void testOnReceive_powerSaveModeChanged_invokeCallback() {
        Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);

        mBatterySaverReceiver.onReceive(mContext, intent);

        verify(mBatterySaverListener).onPowerSaveModeChanged();
    }

}
Loading