ColorInversionTile.java revision c247b8f7270dd70ecc36977fcc0530217879f665
1/*
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
19import android.provider.Settings.Secure;
20
21import com.android.systemui.R;
22import com.android.systemui.qs.QSTile;
23import com.android.systemui.qs.SecureSetting;
24import com.android.systemui.qs.UsageTracker;
25
26/** Quick settings tile: Invert colors **/
27public class ColorInversionTile extends QSTile<QSTile.BooleanState> {
28
29    private final AnimationIcon mEnable
30            = new AnimationIcon(R.drawable.ic_invert_colors_enable_animation);
31    private final AnimationIcon mDisable
32            = new AnimationIcon(R.drawable.ic_invert_colors_disable_animation);
33    private final SecureSetting mSetting;
34    private final UsageTracker mUsageTracker;
35
36    private boolean mListening;
37
38    public ColorInversionTile(Host host) {
39        super(host);
40
41        mSetting = new SecureSetting(mContext, mHandler,
42                Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) {
43            @Override
44            protected void handleValueChanged(int value) {
45                mUsageTracker.trackUsage();
46                if (mListening) {
47                    handleRefreshState(value);
48                }
49            }
50        };
51        mUsageTracker = new UsageTracker(host.getContext(), ColorInversionTile.class,
52                R.integer.days_to_show_color_inversion_tile);
53        if (mSetting.getValue() != 0 && !mUsageTracker.isRecentlyUsed()) {
54            mUsageTracker.trackUsage();
55        }
56        mUsageTracker.setListening(true);
57        mSetting.setListening(true);
58    }
59
60    @Override
61    protected void handleDestroy() {
62        super.handleDestroy();
63        mUsageTracker.setListening(false);
64        mSetting.setListening(false);
65    }
66
67    @Override
68    protected BooleanState newTileState() {
69        return new BooleanState();
70    }
71
72    @Override
73    public void setListening(boolean listening) {
74        mListening = listening;
75    }
76
77    @Override
78    protected void handleUserSwitch(int newUserId) {
79        mSetting.setUserId(newUserId);
80        handleRefreshState(mSetting.getValue());
81    }
82
83    @Override
84    protected void handleClick() {
85        mSetting.setValue(mState.value ? 0 : 1);
86        mEnable.setAllowAnimation(true);
87        mDisable.setAllowAnimation(true);
88    }
89
90    @Override
91    protected void handleLongClick() {
92        if (mState.value) return;  // don't allow usage reset if inversion is active
93        final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title,
94                mState.label);
95        mUsageTracker.showResetConfirmation(title, new Runnable() {
96            @Override
97            public void run() {
98                refreshState();
99            }
100        });
101    }
102
103    @Override
104    protected void handleUpdateState(BooleanState state, Object arg) {
105        final int value = arg instanceof Integer ? (Integer) arg : mSetting.getValue();
106        final boolean enabled = value != 0;
107        state.visible = enabled || mUsageTracker.isRecentlyUsed();
108        state.value = enabled;
109        state.label = mContext.getString(R.string.quick_settings_inversion_label);
110        state.icon = enabled ? mEnable : mDisable;
111    }
112
113    @Override
114    protected String composeChangeAnnouncement() {
115        if (mState.value) {
116            return mContext.getString(
117                    R.string.accessibility_quick_settings_color_inversion_changed_on);
118        } else {
119            return mContext.getString(
120                    R.string.accessibility_quick_settings_color_inversion_changed_off);
121        }
122    }
123}
124