blob: 1e00894483acd5ce85b63f4eab354780ec693fe9 [file] [log] [blame]
John Spurlockaf8d6c42014-05-07 17:49:08 -04001/*
2 * Copyright (C) 2014 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
17package com.android.systemui.qs.tiles;
18
Jason Monk3e189872016-01-12 09:10:34 -050019import android.content.Context;
Jason Monk76c67aa2016-02-19 14:49:42 -050020import android.content.Intent;
John Spurlockaf8d6c42014-05-07 17:49:08 -040021import android.content.res.Configuration;
Chris Wrenf6e9228b2016-01-26 18:04:35 -050022
Jason Monk76c67aa2016-02-19 14:49:42 -050023import android.provider.Settings;
Jason Monk32508852017-01-18 09:17:13 -050024import android.service.quicksettings.Tile;
Julia Reynolds20aef8a2016-05-04 16:44:08 -040025import android.widget.Switch;
26
Chris Wren457a21c2015-05-06 17:50:34 -040027import com.android.internal.logging.MetricsLogger;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +010028import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Jason Monk9c7844c2017-01-18 15:21:53 -050029import com.android.systemui.Dependency;
John Spurlockaf8d6c42014-05-07 17:49:08 -040030import com.android.systemui.R;
Jason Monk702e2eb2017-03-03 16:53:44 -050031import com.android.systemui.qs.QSHost;
32import com.android.systemui.plugins.qs.QSTile.BooleanState;
33import com.android.systemui.qs.tileimpl.QSTileImpl;
John Spurlockaf8d6c42014-05-07 17:49:08 -040034import com.android.systemui.statusbar.policy.RotationLockController;
35import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback;
36
37/** Quick settings tile: Rotation **/
Jason Monk702e2eb2017-03-03 16:53:44 -050038public class RotationLockTile extends QSTileImpl<BooleanState> {
John Spurlockc6df3cf2014-11-04 19:36:44 -050039 private final AnimationIcon mPortraitToAuto
Jason Monk1aec93f2016-03-01 09:39:30 -050040 = new AnimationIcon(R.drawable.ic_portrait_to_auto_rotate_animation,
41 R.drawable.ic_portrait_from_auto_rotate);
John Spurlockc6df3cf2014-11-04 19:36:44 -050042 private final AnimationIcon mAutoToPortrait
Jason Monk1aec93f2016-03-01 09:39:30 -050043 = new AnimationIcon(R.drawable.ic_portrait_from_auto_rotate_animation,
44 R.drawable.ic_portrait_to_auto_rotate);
John Spurlock2d695812014-10-30 13:25:21 -040045
John Spurlockc6df3cf2014-11-04 19:36:44 -050046 private final AnimationIcon mLandscapeToAuto
Jason Monk1aec93f2016-03-01 09:39:30 -050047 = new AnimationIcon(R.drawable.ic_landscape_to_auto_rotate_animation,
48 R.drawable.ic_landscape_from_auto_rotate);
John Spurlockc6df3cf2014-11-04 19:36:44 -050049 private final AnimationIcon mAutoToLandscape
Jason Monk1aec93f2016-03-01 09:39:30 -050050 = new AnimationIcon(R.drawable.ic_landscape_from_auto_rotate_animation,
51 R.drawable.ic_landscape_to_auto_rotate);
John Spurlockaf8d6c42014-05-07 17:49:08 -040052
53 private final RotationLockController mController;
54
Jason Monk702e2eb2017-03-03 16:53:44 -050055 public RotationLockTile(QSHost host) {
John Spurlockaf8d6c42014-05-07 17:49:08 -040056 super(host);
Jason Monk9c7844c2017-01-18 15:21:53 -050057 mController = Dependency.get(RotationLockController.class);
John Spurlockaf8d6c42014-05-07 17:49:08 -040058 }
59
60 @Override
Jason Monk62b63a02016-02-02 15:15:31 -050061 public BooleanState newTileState() {
John Spurlockaf8d6c42014-05-07 17:49:08 -040062 return new BooleanState();
63 }
64
Jason Monk1c6116c2017-09-06 17:33:01 -040065 public void handleSetListening(boolean listening) {
John Spurlockaf8d6c42014-05-07 17:49:08 -040066 if (mController == null) return;
John Spurlockccb6b9a2014-05-17 15:54:40 -040067 if (listening) {
Jason Monk88529052016-11-04 13:29:58 -040068 mController.addCallback(mCallback);
John Spurlockccb6b9a2014-05-17 15:54:40 -040069 } else {
Jason Monk88529052016-11-04 13:29:58 -040070 mController.removeCallback(mCallback);
John Spurlockccb6b9a2014-05-17 15:54:40 -040071 }
John Spurlockaf8d6c42014-05-07 17:49:08 -040072 }
73
74 @Override
Jason Monk76c67aa2016-02-19 14:49:42 -050075 public Intent getLongClickIntent() {
76 return new Intent(Settings.ACTION_DISPLAY_SETTINGS);
77 }
78
79 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -040080 protected void handleClick() {
81 if (mController == null) return;
John Spurlock2d695812014-10-30 13:25:21 -040082 final boolean newState = !mState.value;
Julia Reynolds68221f52016-06-14 16:47:53 -040083 mController.setRotationLocked(!newState);
Jason Monk66239fb2015-12-21 14:27:00 -050084 refreshState(newState);
John Spurlockaf8d6c42014-05-07 17:49:08 -040085 }
86
87 @Override
Jason Monk39c98e62016-03-16 09:18:35 -040088 public CharSequence getTileLabel() {
89 return getState().label;
90 }
91
92 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -040093 protected void handleUpdateState(BooleanState state, Object arg) {
94 if (mController == null) return;
Julia Reynolds68221f52016-06-14 16:47:53 -040095 final boolean rotationLocked = mController.isRotationLocked();
Jason Monkba2318e2015-12-08 09:04:23 -050096 // TODO: Handle accessibility rotation lock and whatnot.
Julia Reynolds68221f52016-06-14 16:47:53 -040097
98 state.value = !rotationLocked;
Jason Monk3e189872016-01-12 09:10:34 -050099 final boolean portrait = isCurrentOrientationLockPortrait(mController, mContext);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400100 if (rotationLocked) {
John Spurlock1a462c12014-07-14 10:52:01 -0400101 final int label = portrait ? R.string.quick_settings_rotation_locked_portrait_label
102 : R.string.quick_settings_rotation_locked_landscape_label;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400103 state.label = mContext.getString(label);
Jason Monk66239fb2015-12-21 14:27:00 -0500104 state.icon = portrait ? mAutoToPortrait : mAutoToLandscape;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400105 } else {
John Spurlockaf8d6c42014-05-07 17:49:08 -0400106 state.label = mContext.getString(R.string.quick_settings_rotation_unlocked_label);
Jason Monk66239fb2015-12-21 14:27:00 -0500107 state.icon = portrait ? mPortraitToAuto : mLandscapeToAuto;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400108 }
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400109 state.contentDescription = getAccessibilityString(rotationLocked);
Jason Monk702e2eb2017-03-03 16:53:44 -0500110 state.expandedAccessibilityClassName = Switch.class.getName();
Jason Monk32508852017-01-18 09:17:13 -0500111 state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
Selim Cinek4fda7b22014-08-18 22:07:25 +0200112 }
113
Jason Monk3e189872016-01-12 09:10:34 -0500114 public static boolean isCurrentOrientationLockPortrait(RotationLockController controller,
115 Context context) {
116 int lockOrientation = controller.getRotationLockOrientation();
Adrian Roos26098832015-07-14 16:41:57 -0700117 if (lockOrientation == Configuration.ORIENTATION_UNDEFINED) {
118 // Freely rotating device; use current rotation
Jason Monk3e189872016-01-12 09:10:34 -0500119 return context.getResources().getConfiguration().orientation
Adrian Roos26098832015-07-14 16:41:57 -0700120 != Configuration.ORIENTATION_LANDSCAPE;
121 } else {
122 return lockOrientation != Configuration.ORIENTATION_LANDSCAPE;
123 }
124 }
125
Chris Wren457a21c2015-05-06 17:50:34 -0400126 @Override
127 public int getMetricsCategory() {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500128 return MetricsEvent.QS_ROTATIONLOCK;
Chris Wren457a21c2015-05-06 17:50:34 -0400129 }
130
Selim Cinek4fda7b22014-08-18 22:07:25 +0200131 /**
132 * Get the correct accessibility string based on the state
133 *
John Spurlock2d695812014-10-30 13:25:21 -0400134 * @param locked Whether or not rotation is locked.
Selim Cinek4fda7b22014-08-18 22:07:25 +0200135 */
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400136 private String getAccessibilityString(boolean locked) {
John Spurlock2d695812014-10-30 13:25:21 -0400137 if (locked) {
Jason Monk92de7192017-03-23 10:05:18 -0400138 return mContext.getString(R.string.accessibility_quick_settings_rotation_value,
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400139 isCurrentOrientationLockPortrait(mController, mContext)
140 ? mContext.getString(
141 R.string.quick_settings_rotation_locked_portrait_label)
142 : mContext.getString(
Jason Monk92de7192017-03-23 10:05:18 -0400143 R.string.quick_settings_rotation_locked_landscape_label))
144 + "," + mContext.getString(R.string.accessibility_quick_settings_rotation);
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400145
Selim Cinek4fda7b22014-08-18 22:07:25 +0200146 } else {
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400147 return mContext.getString(R.string.accessibility_quick_settings_rotation);
Selim Cinek4fda7b22014-08-18 22:07:25 +0200148 }
Selim Cinek4fda7b22014-08-18 22:07:25 +0200149 }
150
151 @Override
152 protected String composeChangeAnnouncement() {
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400153 return getAccessibilityString(mState.value);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400154 }
155
156 private final RotationLockControllerCallback mCallback = new RotationLockControllerCallback() {
157 @Override
158 public void onRotationLockStateChanged(boolean rotationLocked, boolean affordanceVisible) {
Jason Monk66239fb2015-12-21 14:27:00 -0500159 refreshState(rotationLocked);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400160 }
161 };
162}