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.content.BroadcastReceiver; 20import android.content.Context; 21import android.content.Intent; 22import android.content.IntentFilter; 23import android.net.ConnectivityManager; 24import android.provider.Settings; 25import android.provider.Settings.Global; 26import android.service.quicksettings.Tile; 27import android.widget.Switch; 28 29import com.android.internal.logging.MetricsLogger; 30import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 31import com.android.systemui.R; 32import com.android.systemui.qs.GlobalSetting; 33import com.android.systemui.qs.QSHost; 34import com.android.systemui.plugins.qs.QSTile.BooleanState; 35import com.android.systemui.qs.tileimpl.QSTileImpl; 36 37/** Quick settings tile: Airplane mode **/ 38public class AirplaneModeTile extends QSTileImpl<BooleanState> { 39 private final AnimationIcon mEnable = 40 new AnimationIcon(R.drawable.ic_signal_airplane_enable_animation, 41 R.drawable.ic_signal_airplane_disable); 42 private final AnimationIcon mDisable = 43 new AnimationIcon(R.drawable.ic_signal_airplane_disable_animation, 44 R.drawable.ic_signal_airplane_enable); 45 private final GlobalSetting mSetting; 46 47 private boolean mListening; 48 49 public AirplaneModeTile(QSHost host) { 50 super(host); 51 52 mSetting = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) { 53 @Override 54 protected void handleValueChanged(int value) { 55 handleRefreshState(value); 56 } 57 }; 58 } 59 60 @Override 61 public BooleanState newTileState() { 62 return new BooleanState(); 63 } 64 65 @Override 66 public void handleClick() { 67 MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); 68 setEnabled(!mState.value); 69 } 70 71 private void setEnabled(boolean enabled) { 72 final ConnectivityManager mgr = 73 (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 74 mgr.setAirplaneMode(enabled); 75 } 76 77 @Override 78 public Intent getLongClickIntent() { 79 return new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS); 80 } 81 82 @Override 83 public CharSequence getTileLabel() { 84 return mContext.getString(R.string.airplane_mode); 85 } 86 87 @Override 88 protected void handleUpdateState(BooleanState state, Object arg) { 89 final int value = arg instanceof Integer ? (Integer)arg : mSetting.getValue(); 90 final boolean airplaneMode = value != 0; 91 state.value = airplaneMode; 92 state.label = mContext.getString(R.string.airplane_mode); 93 if (airplaneMode) { 94 state.icon = mEnable; 95 } else { 96 state.icon = mDisable; 97 } 98 state.state = airplaneMode ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; 99 state.contentDescription = state.label; 100 state.expandedAccessibilityClassName = Switch.class.getName(); 101 } 102 103 @Override 104 public int getMetricsCategory() { 105 return MetricsEvent.QS_AIRPLANEMODE; 106 } 107 108 @Override 109 protected String composeChangeAnnouncement() { 110 if (mState.value) { 111 return mContext.getString(R.string.accessibility_quick_settings_airplane_changed_on); 112 } else { 113 return mContext.getString(R.string.accessibility_quick_settings_airplane_changed_off); 114 } 115 } 116 117 public void setListening(boolean listening) { 118 if (mListening == listening) return; 119 mListening = listening; 120 if (listening) { 121 final IntentFilter filter = new IntentFilter(); 122 filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 123 mContext.registerReceiver(mReceiver, filter); 124 } else { 125 mContext.unregisterReceiver(mReceiver); 126 } 127 mSetting.setListening(listening); 128 } 129 130 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 131 @Override 132 public void onReceive(Context context, Intent intent) { 133 if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) { 134 refreshState(); 135 } 136 } 137 }; 138} 139