1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.display;
18 
19 import static com.android.settings.display.SmartAutoRotateController.isRotationResolverServiceAvailable;
20 
21 import android.content.BroadcastReceiver;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.os.PowerManager;
26 
27 import androidx.annotation.VisibleForTesting;
28 import androidx.preference.Preference;
29 import androidx.preference.PreferenceScreen;
30 
31 import com.android.settings.R;
32 import com.android.settings.core.BasePreferenceController;
33 import com.android.settingslib.core.lifecycle.LifecycleObserver;
34 import com.android.settingslib.core.lifecycle.events.OnStart;
35 import com.android.settingslib.core.lifecycle.events.OnStop;
36 import com.android.settingslib.widget.BannerMessagePreference;
37 
38 /**
39  * The controller of camera based rotate battery saver warning preference. The preference appears
40  * when battery saver mode is enabled.
41  */
42 public class SmartAutoRotateBatterySaverController extends BasePreferenceController implements
43         LifecycleObserver, OnStart, OnStop {
44 
45     private Preference mPreference;
46     private final PowerManager mPowerManager;
47     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
48         @Override
49         public void onReceive(Context context, Intent intent) {
50             if (mPreference == null) {
51                 return;
52             }
53             mPreference.setVisible(isAvailable());
54             updateState(mPreference);
55         }
56     };
57 
SmartAutoRotateBatterySaverController(Context context, String key)58     public SmartAutoRotateBatterySaverController(Context context, String key) {
59         super(context, key);
60         mPowerManager = context.getSystemService(PowerManager.class);
61     }
62 
63     @VisibleForTesting
isPowerSaveMode()64     boolean isPowerSaveMode() {
65         return mPowerManager.isPowerSaveMode();
66     }
67 
68     @Override
displayPreference(PreferenceScreen screen)69     public void displayPreference(PreferenceScreen screen) {
70         super.displayPreference(screen);
71         mPreference = screen.findPreference(getPreferenceKey());
72         ((BannerMessagePreference) mPreference)
73                 .setPositiveButtonText(R.string.ambient_camera_battery_saver_off)
74                 .setPositiveButtonOnClickListener(v -> {
75                     mPowerManager.setPowerSaveModeEnabled(false);
76                 });
77     }
78 
79     @Override
onStart()80     public void onStart() {
81         mContext.registerReceiver(mReceiver,
82                 new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
83     }
84 
85     @Override
onStop()86     public void onStop() {
87         mContext.unregisterReceiver(mReceiver);
88     }
89 
90     @Override
91     @AvailabilityStatus
getAvailabilityStatus()92     public int getAvailabilityStatus() {
93         return isRotationResolverServiceAvailable(mContext)
94                 && isPowerSaveMode() ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE;
95     }
96 }
97