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