1 /*
2  * Copyright (C) 2010 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.systemui.statusbar.policy;
18 
19 import static com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule.DEVICE_STATE_ROTATION_LOCK_DEFAULTS;
20 
21 import android.os.UserHandle;
22 
23 import androidx.annotation.NonNull;
24 
25 import com.android.internal.view.RotationPolicy.RotationPolicyListener;
26 import com.android.systemui.dagger.SysUISingleton;
27 import com.android.systemui.util.wrapper.RotationPolicyWrapper;
28 
29 import java.util.concurrent.CopyOnWriteArrayList;
30 
31 import javax.inject.Inject;
32 import javax.inject.Named;
33 
34 /** Platform implementation of the rotation lock controller. **/
35 @SysUISingleton
36 public final class RotationLockControllerImpl implements RotationLockController {
37     private final CopyOnWriteArrayList<RotationLockControllerCallback> mCallbacks =
38             new CopyOnWriteArrayList<>();
39 
40     private final RotationPolicyListener mRotationPolicyListener =
41             new RotationPolicyListener() {
42         @Override
43         public void onChange() {
44             notifyChanged();
45         }
46     };
47 
48     private final RotationPolicyWrapper mRotationPolicy;
49     private final DeviceStateRotationLockSettingController
50             mDeviceStateRotationLockSettingController;
51     private final boolean mIsPerDeviceStateRotationLockEnabled;
52 
53     @Inject
RotationLockControllerImpl( RotationPolicyWrapper rotationPolicyWrapper, DeviceStateRotationLockSettingController deviceStateRotationLockSettingController, @Named(DEVICE_STATE_ROTATION_LOCK_DEFAULTS) String[] deviceStateRotationLockDefaults )54     public RotationLockControllerImpl(
55             RotationPolicyWrapper rotationPolicyWrapper,
56             DeviceStateRotationLockSettingController deviceStateRotationLockSettingController,
57             @Named(DEVICE_STATE_ROTATION_LOCK_DEFAULTS) String[] deviceStateRotationLockDefaults
58     ) {
59         mRotationPolicy = rotationPolicyWrapper;
60         mDeviceStateRotationLockSettingController = deviceStateRotationLockSettingController;
61         mIsPerDeviceStateRotationLockEnabled = deviceStateRotationLockDefaults.length > 0;
62         if (mIsPerDeviceStateRotationLockEnabled) {
63             deviceStateRotationLockSettingController.initialize();
64             mCallbacks.add(mDeviceStateRotationLockSettingController);
65         }
66 
67         setListening(true);
68     }
69 
70     @Override
addCallback(@onNull RotationLockControllerCallback callback)71     public void addCallback(@NonNull RotationLockControllerCallback callback) {
72         mCallbacks.add(callback);
73         notifyChanged(callback);
74     }
75 
76     @Override
removeCallback(@onNull RotationLockControllerCallback callback)77     public void removeCallback(@NonNull RotationLockControllerCallback callback) {
78         mCallbacks.remove(callback);
79     }
80 
getRotationLockOrientation()81     public int getRotationLockOrientation() {
82         return mRotationPolicy.getRotationLockOrientation();
83     }
84 
isRotationLocked()85     public boolean isRotationLocked() {
86         return mRotationPolicy.isRotationLocked();
87     }
88 
setRotationLocked(boolean locked)89     public void setRotationLocked(boolean locked) {
90         mRotationPolicy.setRotationLock(locked);
91     }
92 
setRotationLockedAtAngle(boolean locked, int rotation)93     public void setRotationLockedAtAngle(boolean locked, int rotation){
94         mRotationPolicy.setRotationLockAtAngle(locked, rotation);
95     }
96 
isRotationLockAffordanceVisible()97     public boolean isRotationLockAffordanceVisible() {
98         return mRotationPolicy.isRotationLockToggleVisible();
99     }
100 
101     @Override
setListening(boolean listening)102     public void setListening(boolean listening) {
103         if (listening) {
104             mRotationPolicy.registerRotationPolicyListener(mRotationPolicyListener,
105                     UserHandle.USER_ALL);
106         } else {
107             mRotationPolicy.unregisterRotationPolicyListener(mRotationPolicyListener);
108         }
109         if (mIsPerDeviceStateRotationLockEnabled) {
110             mDeviceStateRotationLockSettingController.setListening(listening);
111         }
112     }
113 
notifyChanged()114     private void notifyChanged() {
115         for (RotationLockControllerCallback callback : mCallbacks) {
116             notifyChanged(callback);
117         }
118     }
119 
notifyChanged(RotationLockControllerCallback callback)120     private void notifyChanged(RotationLockControllerCallback callback) {
121         callback.onRotationLockStateChanged(mRotationPolicy.isRotationLocked(),
122                 mRotationPolicy.isRotationLockToggleVisible());
123     }
124 }
125