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