1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/* 2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2014 The Android Open Source Project 3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * 4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License. 6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at 7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * 8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * 10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software 11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and 14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License. 15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */ 16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.qs.tiles; 18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 19af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.R; 20af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTile; 21657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlockimport com.android.systemui.statusbar.policy.KeyguardMonitor; 22af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.LocationController; 23af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.LocationController.LocationSettingsChangeCallback; 24af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 25af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Quick settings tile: Location **/ 26af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class LocationTile extends QSTile<QSTile.BooleanState> { 27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 28c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock private final AnimationIcon mEnable = 29c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock new AnimationIcon(R.drawable.ic_signal_location_enable_animation); 30c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock private final AnimationIcon mDisable = 31c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock new AnimationIcon(R.drawable.ic_signal_location_disable_animation); 32c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock 33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final LocationController mController; 34657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock private final KeyguardMonitor mKeyguard; 35657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock private final Callback mCallback = new Callback(); 36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public LocationTile(Host host) { 38af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock super(host); 39af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mController = host.getLocationController(); 40657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock mKeyguard = host.getKeyguardMonitor(); 41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 42af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 44af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected BooleanState newTileState() { 45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock return new BooleanState(); 46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 47af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 48ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock @Override 49ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock public void setListening(boolean listening) { 50ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock if (listening) { 51ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock mController.addSettingsChangedCallback(mCallback); 52657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock mKeyguard.addCallback(mCallback); 53ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } else { 54ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock mController.removeSettingsChangedCallback(mCallback); 55657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock mKeyguard.removeCallback(mCallback); 56ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } 57af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 58af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 59af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 60af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected void handleClick() { 61af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock final boolean wasEnabled = (Boolean) mState.value; 62d21df6076fe16c570575b4c24618d0dc50a12d14John Spurlock mController.setLocationEnabled(!wasEnabled); 63c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock mEnable.setAllowAnimation(true); 64c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock mDisable.setAllowAnimation(true); 65af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 66af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected void handleUpdateState(BooleanState state, Object arg) { 69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock final boolean locationEnabled = mController.isLocationEnabled(); 70d528930380e9b0e6ff396d272b6837e24da555b3Tom O'Neill 71d528930380e9b0e6ff396d272b6837e24da555b3Tom O'Neill // Work around for bug 15916487: don't show location tile on top of lock screen. After the 72d528930380e9b0e6ff396d272b6837e24da555b3Tom O'Neill // bug is fixed, this should be reverted to only hiding it on secure lock screens: 73d528930380e9b0e6ff396d272b6837e24da555b3Tom O'Neill // state.visible = !(mKeyguard.isSecure() && mKeyguard.isShowing()); 74d528930380e9b0e6ff396d272b6837e24da555b3Tom O'Neill state.visible = !mKeyguard.isShowing(); 75899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock state.value = locationEnabled; 76af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock if (locationEnabled) { 77c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock state.icon = mEnable; 78af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.label = mContext.getString(R.string.quick_settings_location_label); 79af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.contentDescription = mContext.getString( 804fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek R.string.accessibility_quick_settings_location_on); 81af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } else { 82c6df3cf273a6464005699796d148be0bfdf9e8c3John Spurlock state.icon = mDisable; 83012d4a229c2373519b5ebc3e19d8b27d6ce55843John Spurlock state.label = mContext.getString(R.string.quick_settings_location_label); 84af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.contentDescription = mContext.getString( 854fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek R.string.accessibility_quick_settings_location_off); 864fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek } 874fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek } 884fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek 894fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek @Override 904fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek protected String composeChangeAnnouncement() { 914fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek if (mState.value) { 924fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek return mContext.getString(R.string.accessibility_quick_settings_location_changed_on); 934fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek } else { 944fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek return mContext.getString(R.string.accessibility_quick_settings_location_changed_off); 95af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 98657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock private final class Callback implements LocationSettingsChangeCallback, 99657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock KeyguardMonitor.Callback { 100af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void onLocationSettingsChanged(boolean enabled) { 102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock refreshState(); 103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 104657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock 105657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock @Override 106657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock public void onKeyguardChanged() { 107657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock refreshState(); 108657c62c31ecdade22f67f13102c2fb19765cbe13John Spurlock } 109af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock }; 110af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock} 111