QuickSettingsModel.java revision e641b6a99cabad7076e10694a5b1b30f449de462
1/*
2 * Copyright (C) 2012 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.statusbar.phone;
18
19import android.bluetooth.BluetoothAdapter;
20import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
21import android.content.BroadcastReceiver;
22import android.content.ContentResolver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.content.res.Resources;
27import android.database.ContentObserver;
28import android.hardware.display.WifiDisplayStatus;
29import android.os.Handler;
30import android.provider.Settings;
31import android.view.View;
32
33import com.android.systemui.R;
34import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
35import com.android.systemui.statusbar.policy.LocationController.LocationGpsStateChangeCallback;
36import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
37
38
39class QuickSettingsModel implements BluetoothStateChangeCallback,
40        NetworkSignalChangedCallback,
41        BatteryStateChangeCallback,
42        LocationGpsStateChangeCallback {
43
44    /** Represents the state of a given attribute. */
45    static class State {
46        int iconId;
47        String label;
48        boolean enabled = false;
49    }
50    static class BatteryState extends State {
51        int batteryLevel;
52        boolean pluggedIn;
53    }
54
55    /** The callback to update a given tile. */
56    interface RefreshCallback {
57        public void refreshView(QuickSettingsTileView view, State state);
58    }
59
60    /** Broadcast receive to determine if there is an alarm set. */
61    private BroadcastReceiver mAlarmIntentReceiver = new BroadcastReceiver() {
62        @Override
63        public void onReceive(Context context, Intent intent) {
64            String action = intent.getAction();
65            if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
66                onAlarmChanged(intent);
67                onNextAlarmChanged();
68            }
69        }
70    };
71
72    /** ContentObserver to determine the next alarm */
73    private class NextAlarmObserver extends ContentObserver {
74        public NextAlarmObserver(Handler handler) {
75            super(handler);
76        }
77
78        @Override public void onChange(boolean selfChange) {
79            onNextAlarmChanged();
80        }
81
82        public void startObserving() {
83            final ContentResolver cr = mContext.getContentResolver();
84            cr.registerContentObserver(
85                    Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED), false, this);
86        }
87    }
88
89    private Context mContext;
90    private Handler mHandler;
91    private NextAlarmObserver mNextAlarmObserver;
92
93    private QuickSettingsTileView mUserTile;
94    private RefreshCallback mUserCallback;
95    private State mUserState = new State();
96
97    private QuickSettingsTileView mTimeTile;
98    private RefreshCallback mTimeAlarmCallback;
99    private State mTimeAlarmState = new State();
100
101    private QuickSettingsTileView mAirplaneModeTile;
102    private RefreshCallback mAirplaneModeCallback;
103    private State mAirplaneModeState = new State();
104
105    private QuickSettingsTileView mWifiTile;
106    private RefreshCallback mWifiCallback;
107    private State mWifiState = new State();
108
109    private QuickSettingsTileView mWifiDisplayTile;
110    private RefreshCallback mWifiDisplayCallback;
111    private State mWifiDisplayState = new State();
112
113    private QuickSettingsTileView mRSSITile;
114    private RefreshCallback mRSSICallback;
115    private State mRSSIState = new State();
116
117    private QuickSettingsTileView mBluetoothTile;
118    private RefreshCallback mBluetoothCallback;
119    private State mBluetoothState = new State();
120
121    private QuickSettingsTileView mBatteryTile;
122    private RefreshCallback mBatteryCallback;
123    private BatteryState mBatteryState = new BatteryState();
124
125    private QuickSettingsTileView mLocationTile;
126    private RefreshCallback mLocationCallback;
127    private State mLocationState = new State();
128
129    public QuickSettingsModel(Context context) {
130        mContext = context;
131        mHandler = new Handler();
132        mNextAlarmObserver = new NextAlarmObserver(mHandler);
133        mNextAlarmObserver.startObserving();
134
135        IntentFilter alarmIntentFilter = new IntentFilter();
136        alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED);
137        context.registerReceiver(mAlarmIntentReceiver, alarmIntentFilter);
138    }
139
140    // User
141    void addUserTile(QuickSettingsTileView view, RefreshCallback cb) {
142        mUserTile = view;
143        mUserCallback = cb;
144        mUserCallback.refreshView(mUserTile, mUserState);
145    }
146    void setUserTileInfo(String name) {
147        mUserState.label = name;
148        mUserCallback.refreshView(mUserTile, mUserState);
149    }
150
151    // Time
152    void addTimeTile(QuickSettingsTileView view, RefreshCallback cb) {
153        mTimeTile = view;
154        mTimeAlarmCallback = cb;
155        mTimeAlarmCallback.refreshView(view, mTimeAlarmState);
156    }
157    void onAlarmChanged(Intent intent) {
158        mTimeAlarmState.enabled = intent.getBooleanExtra("alarmSet", false);
159        System.out.println("ALARM ENABLED: " + mTimeAlarmState.enabled);
160        mTimeAlarmCallback.refreshView(mTimeTile, mTimeAlarmState);
161    }
162    void onNextAlarmChanged() {
163        mTimeAlarmState.label = Settings.System.getString(mContext.getContentResolver(),
164                Settings.System.NEXT_ALARM_FORMATTED);
165        System.out.println("ALARM LABEL: " + mTimeAlarmState.label);
166        mTimeAlarmCallback.refreshView(mTimeTile, mTimeAlarmState);
167    }
168
169    // Airplane Mode
170    void addAirplaneModeTile(QuickSettingsTileView view, RefreshCallback cb) {
171        mAirplaneModeTile = view;
172        mAirplaneModeTile.setOnClickListener(new View.OnClickListener() {
173            @Override
174            public void onClick(View v) {
175                if (mAirplaneModeState.enabled) {
176                    setAirplaneModeState(false);
177                } else {
178                    setAirplaneModeState(true);
179                }
180            }
181        });
182        mAirplaneModeCallback = cb;
183        mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
184    }
185    private void setAirplaneModeState(boolean enabled) {
186        // TODO: Sets the view to be "awaiting" if not already awaiting
187
188        // Change the system setting
189        Settings.System.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
190                                enabled ? 1 : 0);
191
192        // Post the intent
193        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
194        intent.putExtra("state", enabled);
195        mContext.sendBroadcast(intent);
196    }
197    // NetworkSignalChanged callback
198    @Override
199    public void onAirplaneModeChanged(boolean enabled) {
200        // TODO: If view is in awaiting state, disable
201        Resources r = mContext.getResources();
202        mAirplaneModeState.enabled = enabled;
203        mAirplaneModeState.iconId = (enabled ?
204                R.drawable.ic_qs_airplane_enabled :
205                R.drawable.ic_qs_airplane_normal);
206        mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
207    }
208
209    // Wifi
210    void addWifiTile(QuickSettingsTileView view, RefreshCallback cb) {
211        mWifiTile = view;
212        mWifiCallback = cb;
213        mWifiCallback.refreshView(mWifiTile, mWifiState);
214    }
215    // NetworkSignalChanged callback
216    @Override
217    public void onWifiSignalChanged(boolean enabled, String description) {
218        // TODO: If view is in awaiting state, disable
219        Resources r = mContext.getResources();
220        // TODO: Check if wifi is enabled
221        mWifiState.enabled = enabled;
222        mWifiState.iconId = (enabled ?
223                R.drawable.ic_qs_wifi_enabled :
224                R.drawable.ic_qs_wifi_normal);
225        mWifiState.label = (enabled ?
226                description :
227                r.getString(R.string.quick_settings_wifi_no_network));
228        mWifiCallback.refreshView(mWifiTile, mWifiState);
229    }
230
231    // RSSI
232    void addRSSITile(QuickSettingsTileView view, RefreshCallback cb) {
233        mRSSITile = view;
234        mRSSICallback = cb;
235        mRSSICallback.refreshView(mRSSITile, mRSSIState);
236    }
237    // NetworkSignalChanged callback
238    @Override
239    public void onMobileDataSignalChanged(boolean enabled, String description) {
240        // TODO: If view is in awaiting state, disable
241        Resources r = mContext.getResources();
242        // TODO: Check if RSSI is enabled
243        mRSSIState.enabled = enabled;
244        mRSSIState.iconId = (enabled ?
245                R.drawable.ic_qs_rssi_enabled :
246                R.drawable.ic_qs_rssi_normal);
247        mRSSIState.label = (enabled ?
248                description :
249                r.getString(R.string.quick_settings_rssi_emergency_only));
250        mRSSICallback.refreshView(mRSSITile, mRSSIState);
251    }
252
253    // Bluetooth
254    void addBluetoothTile(QuickSettingsTileView view, RefreshCallback cb) {
255        mBluetoothTile = view;
256        mBluetoothCallback = cb;
257
258        final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
259        onBluetoothStateChange(adapter.isEnabled());
260    }
261    // BluetoothController callback
262    @Override
263    public void onBluetoothStateChange(boolean on) {
264        // TODO: If view is in awaiting state, disable
265        Resources r = mContext.getResources();
266        mBluetoothState.enabled = on;
267        if (on) {
268            mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_enabled;
269        } else {
270            mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_normal;
271        }
272        mBluetoothCallback.refreshView(mBluetoothTile, mBluetoothState);
273    }
274
275    // Battery
276    void addBatteryTile(QuickSettingsTileView view, RefreshCallback cb) {
277        mBatteryTile = view;
278        mBatteryCallback = cb;
279        mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
280    }
281    // BatteryController callback
282    @Override
283    public void onBatteryLevelChanged(int level, boolean pluggedIn) {
284        mBatteryState.batteryLevel = level;
285        mBatteryState.pluggedIn = pluggedIn;
286        mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
287    }
288
289    // Location
290    void addLocationTile(QuickSettingsTileView view, RefreshCallback cb) {
291        mLocationTile = view;
292        mLocationCallback = cb;
293        mLocationCallback.refreshView(mLocationTile, mLocationState);
294    }
295    // LocationController callback
296    @Override
297    public void onLocationGpsStateChanged(boolean inUse, String description) {
298        mLocationState.enabled = inUse;
299        mLocationState.label = description;
300        mLocationCallback.refreshView(mLocationTile, mLocationState);
301    }
302
303    // Wifi Display
304    void addWifiDisplayTile(QuickSettingsTileView view, RefreshCallback cb) {
305        mWifiDisplayTile = view;
306        mWifiDisplayCallback = cb;
307    }
308    public void onWifiDisplayStateChanged(WifiDisplayStatus status) {
309        mWifiDisplayState.enabled = status.isEnabled();
310        if (status.getActiveDisplay() != null) {
311            mWifiDisplayState.label = status.getActiveDisplay().getDeviceName();
312        } else {
313            mWifiDisplayState.label = mContext.getString(
314                    R.string.quick_settings_wifi_display_no_connection_label);
315        }
316        mWifiDisplayCallback.refreshView(mWifiDisplayTile, mWifiDisplayState);
317
318    }
319
320}