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