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}