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