ColorInversionTile.java revision 395617fd35ef0e712945359a760a00eb1aaf7475
1d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca/* 2d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * Copyright (C) 2014 The Android Open Source Project 3d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * 4d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * Licensed under the Apache License, Version 2.0 (the "License"); 5d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * you may not use this file except in compliance with the License. 6d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * You may obtain a copy of the License at 7d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * 8d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * http://www.apache.org/licenses/LICENSE-2.0 9d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * 10d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * Unless required by applicable law or agreed to in writing, software 11d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * distributed under the License is distributed on an "AS IS" BASIS, 12d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * See the License for the specific language governing permissions and 14d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca * limitations under the License. 15d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca */ 16d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 17d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecapackage com.android.systemui.qs.tiles; 18d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 19d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport android.content.Intent; 20d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport android.provider.Settings; 21d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport android.provider.Settings.Secure; 22d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport android.service.quicksettings.Tile; 23d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport android.widget.Switch; 24d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 25d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.internal.logging.MetricsLogger; 26d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 27d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.systemui.R; 28d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.systemui.R.drawable; 29d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.systemui.qs.QSHost; 30d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.systemui.plugins.qs.QSTile.BooleanState; 31d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.systemui.qs.tileimpl.QSTileImpl; 32d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecaimport com.android.systemui.qs.SecureSetting; 33d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 34d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca/** Quick settings tile: Invert colors **/ 35d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonsecapublic class ColorInversionTile extends QSTileImpl<BooleanState> { 36d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 37d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca private final Icon mIcon = ResourceIcon.get(drawable.ic_invert_colors_disable); 38d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca private final SecureSetting mSetting; 39d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 40d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca private boolean mListening; 41d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 42d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca public ColorInversionTile(QSHost host) { 43d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca super(host); 44d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 45d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca mSetting = new SecureSetting(mContext, mHandler, 46d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) { 47d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 48d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca protected void handleValueChanged(int value, boolean observedChange) { 49d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca handleRefreshState(value); 50d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 51d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca }; 52d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 53d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 5491332e455a530b86f897874919da29efa563fdf3José Fonseca @Override 55d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca protected void handleDestroy() { 56d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca super.handleDestroy(); 57d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca mSetting.setListening(false); 581a840cc5925f52079916feb2c456816a7a91d627Marek Olšák } 591a840cc5925f52079916feb2c456816a7a91d627Marek Olšák 60c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák @Override 611a840cc5925f52079916feb2c456816a7a91d627Marek Olšák public BooleanState newTileState() { 621a840cc5925f52079916feb2c456816a7a91d627Marek Olšák return new BooleanState(); 63d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 64e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák 65d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 66d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca public void setListening(boolean listening) { 67d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca mSetting.setListening(listening); 68d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 69d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 70d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 71d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca protected void handleUserSwitch(int newUserId) { 72d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca mSetting.setUserId(newUserId); 73d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca handleRefreshState(mSetting.getValue()); 74d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 75d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 76d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 77d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca public Intent getLongClickIntent() { 78d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca return new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); 79d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 80d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 81d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 82d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca protected void handleClick() { 83d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca mSetting.setValue(mState.value ? 0 : 1); 84d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 85d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 86d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 87d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca public CharSequence getTileLabel() { 88d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca return mContext.getString(R.string.quick_settings_inversion_label); 89d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 90d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 91d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 92b56b853ab3937d6144597f490bb38e2532d0cee2Brian Paul protected void handleUpdateState(BooleanState state, Object arg) { 93d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca final int value = arg instanceof Integer ? (Integer) arg : mSetting.getValue(); 94d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca final boolean enabled = value != 0; 95d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca if (state.slash == null) { 96d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.slash = new SlashState(); 97d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 98d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.value = enabled; 99d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.slash.isSlashed = !state.value; 100d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; 101d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.label = mContext.getString(R.string.quick_settings_inversion_label); 102d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.icon = mIcon; 103d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.expandedAccessibilityClassName = Switch.class.getName(); 104d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca state.contentDescription = state.label; 105d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 106d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 107d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca @Override 108d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca public int getMetricsCategory() { 109d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca return MetricsEvent.QS_COLORINVERSION; 110d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 111d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca 112598cc1f74d7ae924e84dee801b456ab7b0b22f84Marek Olšák @Override 113d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca protected String composeChangeAnnouncement() { 114d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca if (mState.value) { 115d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca return mContext.getString( 116d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca R.string.accessibility_quick_settings_color_inversion_changed_on); 117d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } else { 118d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca return mContext.getString( 119d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca R.string.accessibility_quick_settings_color_inversion_changed_off); 120d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 121d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca } 122d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca} 123d35d3d612acef1612aaab9a923b8814d4dbb4d9cJosé Fonseca