summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2013-04-30 13:06:04 +0200
committerDanny Baumann <dannybaumann@web.de>2013-04-30 13:08:34 +0200
commit9975780f073b29fbb85b0ee1cd700f1828f783c7 (patch)
tree6f35b734cc50ed9843b5fb4983d66b3746665e3d
parentc926976008af16ab5e3a0bb532aeeb69565e3429 (diff)
downloadframeworks_base-9975780f073b29fbb85b0ee1cd700f1828f783c7.zip
frameworks_base-9975780f073b29fbb85b0ee1cd700f1828f783c7.tar.gz
frameworks_base-9975780f073b29fbb85b0ee1cd700f1828f783c7.tar.bz2
Fix SystemUI memory leaks on theme changes.
ContentObserver and BroadcastReceiver instances were dangling after the status bar was recreated. Change-Id: I0ef7ef134029e5deec066d405545b8d9ec58d76b
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/AirplaneModeTile.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/BatteryTile.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/BluetoothTile.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/DockBatteryTile.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTile.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTypeTile.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/QuickSettingsTile.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/quicksettings/WiFiTile.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterTextView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsController.java47
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java4
18 files changed, 166 insertions, 60 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/AirplaneModeTile.java
index ef51648..60c6796 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/AirplaneModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/AirplaneModeTile.java
@@ -14,12 +14,14 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
public class AirplaneModeTile extends QuickSettingsTile implements NetworkSignalChangedCallback{
-
+ private NetworkController mController;
private boolean enabled = false;
- public AirplaneModeTile(Context context, QuickSettingsController qsc) {
+ public AirplaneModeTile(Context context, QuickSettingsController qsc, NetworkController controller) {
super(context, qsc);
+ mController = controller;
+
mOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -45,13 +47,18 @@ public class AirplaneModeTile extends QuickSettingsTile implements NetworkSignal
@Override
void onPostCreate() {
- NetworkController controller = new NetworkController(mContext);
- controller.addNetworkSignalChangedCallback(this);
+ mController.addNetworkSignalChangedCallback(this);
updateTile();
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeNetworkSignalChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void updateResources() {
updateTile();
super.updateResources();
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/BatteryTile.java
index 02a915c..2c9af05 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/BatteryTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/BatteryTile.java
@@ -16,6 +16,7 @@ import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
public class BatteryTile extends QuickSettingsTile implements BatteryStateChangeCallback{
+ private BatteryController mController;
private boolean charging = false;
private int batteryLevel = 0;
@@ -24,9 +25,11 @@ public class BatteryTile extends QuickSettingsTile implements BatteryStateChange
private LevelListDrawable batteryLevels;
private LevelListDrawable chargingBatteryLevels;
- public BatteryTile(Context context, QuickSettingsController qsc) {
+ public BatteryTile(Context context, QuickSettingsController qsc, BatteryController controller) {
super(context, qsc, R.layout.quick_settings_tile_battery);
+ mController = controller;
+
mOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -38,12 +41,17 @@ public class BatteryTile extends QuickSettingsTile implements BatteryStateChange
@Override
void onPostCreate() {
updateTile();
- BatteryController controller = new BatteryController(mContext, false);
- controller.addStateChangedCallback(this);
+ mController.addStateChangedCallback(this);
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeStateChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void onBatteryLevelChanged(int level, boolean pluggedIn) {
batteryLevel = level;
charging = pluggedIn;
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/BluetoothTile.java
index 2dd5173..f0d6fce 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/BluetoothTile.java
@@ -19,10 +19,12 @@ public class BluetoothTile extends QuickSettingsTile implements BluetoothStateCh
private boolean enabled = false;
private boolean connected = false;
private BluetoothAdapter mBluetoothAdapter;
+ private BluetoothController mController;
- public BluetoothTile(Context context, QuickSettingsController qsc) {
+ public BluetoothTile(Context context, QuickSettingsController qsc, BluetoothController controller) {
super(context, qsc);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ mController = controller;
enabled = mBluetoothAdapter.isEnabled();
connected = mBluetoothAdapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED;
@@ -101,12 +103,17 @@ public class BluetoothTile extends QuickSettingsTile implements BluetoothStateCh
void onPostCreate() {
checkBluetoothState();
updateTile();
- BluetoothController controller = new BluetoothController(mContext);
- controller.addStateChangedCallback(this);
+ mController.addStateChangedCallback(this);
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeStateChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void onBluetoothStateChange(boolean on) {
this.enabled = on;
updateResources();
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/DockBatteryTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/DockBatteryTile.java
index dde5ac3..4b09fd7 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/DockBatteryTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/DockBatteryTile.java
@@ -16,7 +16,7 @@ import com.android.systemui.statusbar.policy.DockBatteryController;
import com.android.systemui.statusbar.policy.DockBatteryController.DockBatteryStateChangeCallback;
public class DockBatteryTile extends QuickSettingsTile implements DockBatteryStateChangeCallback {
-
+ private DockBatteryController mController;
private boolean mPresent = false;
private boolean mCharging = false;
private int mDockBatteryLevel = 0;
@@ -25,9 +25,11 @@ public class DockBatteryTile extends QuickSettingsTile implements DockBatterySta
private LevelListDrawable mDockBatteryLevels;
private LevelListDrawable mChargingDockBatteryLevels;
- public DockBatteryTile(Context context, QuickSettingsController qsc) {
+ public DockBatteryTile(Context context, QuickSettingsController qsc, DockBatteryController controller) {
super(context, qsc, R.layout.quick_settings_tile_dock_battery);
+ mController = controller;
+
mOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -39,12 +41,17 @@ public class DockBatteryTile extends QuickSettingsTile implements DockBatterySta
@Override
void onPostCreate() {
updateTile();
- DockBatteryController controller = new DockBatteryController(mContext);
- controller.addStateChangedCallback(this);
+ mController.addStateChangedCallback(this);
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeStateChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void onDockBatteryLevelChanged(int level, boolean present, boolean pluggedIn) {
mDockBatteryLevel = level;
mCharging = pluggedIn;
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTile.java
index 5bcd54b..be502af 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTile.java
@@ -25,6 +25,7 @@ public class MobileNetworkTile extends QuickSettingsTile implements NetworkSigna
private static final int NO_OVERLAY = 0;
private static final int DISABLED_OVERLAY = -1;
+ private NetworkController mController;
private boolean mEnabled;
private String mDescription;
private int mDataTypeIconId = NO_OVERLAY;
@@ -34,9 +35,10 @@ public class MobileNetworkTile extends QuickSettingsTile implements NetworkSigna
private ConnectivityManager mCm;
- public MobileNetworkTile(Context context, QuickSettingsController qsc) {
+ public MobileNetworkTile(Context context, QuickSettingsController qsc, NetworkController controller) {
super(context, qsc, R.layout.quick_settings_tile_rssi);
+ mController = controller;
mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
mOnClick = new View.OnClickListener() {
@@ -67,13 +69,18 @@ public class MobileNetworkTile extends QuickSettingsTile implements NetworkSigna
@Override
void onPostCreate() {
- NetworkController controller = new NetworkController(mContext);
- controller.addNetworkSignalChangedCallback(this);
+ mController.addNetworkSignalChangedCallback(this);
updateTile();
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeNetworkSignalChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void updateResources() {
updateTile();
super.updateResources();
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTypeTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTypeTile.java
index a3f14c1..bcb15aa 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTypeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/MobileNetworkTypeTile.java
@@ -38,15 +38,17 @@ public class MobileNetworkTypeTile extends QuickSettingsTile implements NetworkS
private static final int CM_MODE_3GONLY = 1;
private static final int CM_MODE_BOTH = 2;
+ private NetworkController mController;
private int mMode = NO_NETWORK_MODE_YET;
private int mIntendedMode = NO_NETWORK_MODE_YET;
private int mInternalState = STATE_INTERMEDIATE;
private int mState;
- public MobileNetworkTypeTile(Context context,
- QuickSettingsController qsc) {
+ public MobileNetworkTypeTile(Context context, QuickSettingsController qsc, NetworkController controller) {
super(context, qsc);
+ mController = controller;
+
mOnClick = new OnClickListener() {
@Override
public void onClick(View v) {
@@ -118,13 +120,18 @@ public class MobileNetworkTypeTile extends QuickSettingsTile implements NetworkS
@Override
void onPostCreate() {
- NetworkController controller = new NetworkController(mContext);
- controller.addNetworkSignalChangedCallback(this);
+ mController.addNetworkSignalChangedCallback(this);
updateTile();
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeNetworkSignalChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void updateResources() {
updateTile();
super.updateResources();
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/QuickSettingsTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/QuickSettingsTile.java
index 39cc552..fbba6d0 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/QuickSettingsTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/QuickSettingsTile.java
@@ -59,6 +59,8 @@ public class QuickSettingsTile implements OnClickListener {
void onPostCreate(){}
+ public void onDestroy() {}
+
public void onReceive(Context context, Intent intent) {}
public void onChangeUri(ContentResolver resolver, Uri uri) {}
diff --git a/packages/SystemUI/src/com/android/systemui/quicksettings/WiFiTile.java b/packages/SystemUI/src/com/android/systemui/quicksettings/WiFiTile.java
index f10225e..da012d2 100644
--- a/packages/SystemUI/src/com/android/systemui/quicksettings/WiFiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/quicksettings/WiFiTile.java
@@ -13,14 +13,17 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
public class WiFiTile extends QuickSettingsTile implements NetworkSignalChangedCallback{
-
+ private NetworkController mController;
private boolean mWifiConnected;
private boolean mWifiNotConnected;
private int mWifiSignalIconId;
private String mDescription;
- public WiFiTile(Context context, QuickSettingsController qsc) {
+ public WiFiTile(Context context, QuickSettingsController qsc, NetworkController controller) {
super(context, qsc);
+
+ mController = controller;
+
mOnClick = new View.OnClickListener() {
@Override
@@ -41,13 +44,18 @@ public class WiFiTile extends QuickSettingsTile implements NetworkSignalChangedC
@Override
void onPostCreate() {
- NetworkController controller = new NetworkController(mContext);
- controller.addNetworkSignalChangedCallback(this);
+ mController.addNetworkSignalChangedCallback(this);
updateTile();
super.onPostCreate();
}
@Override
+ public void onDestroy() {
+ mController.removeNetworkSignalChangedCallback(this);
+ super.onDestroy();
+ }
+
+ @Override
public void updateResources() {
updateTile();
super.updateResources();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterTextView.java
index 8d9dcfd..b4e3572 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterTextView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterTextView.java
@@ -39,7 +39,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
-import com.android.systemui.statusbar.SignalClusterView.SettingsObserver;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.R;
@@ -62,6 +61,7 @@ public class SignalClusterTextView
TextView mMobileSignalText;
Handler mHandler;
+ SettingsObserver mObserver;
int dBm = 0;
@@ -76,6 +76,10 @@ public class SignalClusterTextView
Settings.System.STATUS_BAR_SIGNAL_TEXT), false, this);
}
+ void unobserve() {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+
@Override public void onChange(boolean selfChange) {
updateSettings();
}
@@ -93,9 +97,7 @@ public class SignalClusterTextView
super(context, attrs, defStyle);
mHandler = new Handler();
-
- SettingsObserver settingsObserver = new SettingsObserver(mHandler);
- settingsObserver.observe();
+ mObserver = new SettingsObserver(mHandler);
}
@Override
@@ -111,6 +113,7 @@ public class SignalClusterTextView
mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
+ mObserver.observe();
updateSettings();
}
}
@@ -118,6 +121,7 @@ public class SignalClusterTextView
@Override
protected void onDetachedFromWindow() {
if (mAttached) {
+ mObserver.unobserve();
mAttached = false;
}
super.onDetachedFromWindow();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 01815a6..f59f2ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -42,6 +42,7 @@ public class SignalClusterView
static final String TAG = "SignalClusterView";
NetworkController mNC;
+ private SettingsObserver mObserver;
private static final int SIGNAL_CLUSTER_STYLE_NORMAL = 0;
@@ -71,6 +72,10 @@ public class SignalClusterView
Settings.System.STATUS_BAR_SIGNAL_TEXT), false, this);
}
+ void unobserve() {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+
@Override
public void onChange(boolean selfChange) {
updateSettings();
@@ -90,8 +95,7 @@ public class SignalClusterView
mHandler = new Handler();
- SettingsObserver settingsObserver = new SettingsObserver(mHandler);
- settingsObserver.observe();
+ mObserver = new SettingsObserver(mHandler);
}
public void setNetworkController(NetworkController nc) {
@@ -103,6 +107,8 @@ public class SignalClusterView
protected void onAttachedToWindow() {
super.onAttachedToWindow();
+ mObserver.observe();
+
mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo);
mWifi = (ImageView) findViewById(R.id.wifi_signal);
mWifiActivity = (ImageView) findViewById(R.id.wifi_inout);
@@ -118,6 +124,8 @@ public class SignalClusterView
@Override
protected void onDetachedFromWindow() {
+ mObserver.unobserve();
+
mWifiGroup = null;
mWifi = null;
mWifiActivity = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index a620f61..b3c1f07 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -695,6 +695,11 @@ public class PhoneStatusBar extends BaseStatusBar {
}
}
+ if (mQS != null) {
+ mQS.shutdown();
+ mQS = null;
+ }
+
// wherever you find it, Quick Settings needs a container to survive
mSettingsContainer = (QuickSettingsContainerView)
mStatusBarWindow.findViewById(R.id.quick_settings_container);
@@ -713,11 +718,10 @@ public class PhoneStatusBar extends BaseStatusBar {
mQS.setupQuickSettings();
// Start observing for changes
- mTilesChangedObserver = new TilesChangedObserver(mHandler);
- mTilesChangedObserver.startObserving();
-
- } else {
- mQS = null; // fly away, be free
+ if (mTilesChangedObserver == null) {
+ mTilesChangedObserver = new TilesChangedObserver(mHandler);
+ mTilesChangedObserver.startObserving();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsController.java
index 15860c9..834dfd4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsController.java
@@ -188,15 +188,15 @@ public class QuickSettingsController {
if (tile.equals(TILE_USER)) {
qs = new UserTile(mContext, this);
} else if (tile.equals(TILE_BATTERY)) {
- qs = new BatteryTile(mContext, this);
+ qs = new BatteryTile(mContext, this, mStatusBarService.mBatteryController);
} else if (tile.equals(TILE_SETTINGS)) {
qs = new PreferencesTile(mContext, this);
} else if (tile.equals(TILE_WIFI)) {
- qs = new WiFiTile(mContext, this);
+ qs = new WiFiTile(mContext, this, mStatusBarService.mNetworkController);
} else if (tile.equals(TILE_GPS)) {
qs = new GPSTile(mContext, this);
} else if (tile.equals(TILE_BLUETOOTH) && bluetoothSupported) {
- qs = new BluetoothTile(mContext, this);
+ qs = new BluetoothTile(mContext, this, mStatusBarService.mBluetoothController);
} else if (tile.equals(TILE_BRIGHTNESS)) {
qs = new BrightnessTile(mContext, this, mHandler);
} else if (tile.equals(TILE_RINGER)) {
@@ -208,15 +208,15 @@ public class QuickSettingsController {
} else if (tile.equals(TILE_SCREENTIMEOUT)) {
qs = new ScreenTimeoutTile(mContext, this);
} else if (tile.equals(TILE_MOBILEDATA) && mobileDataSupported) {
- qs = new MobileNetworkTile(mContext, this);
+ qs = new MobileNetworkTile(mContext, this, mStatusBarService.mNetworkController);
} else if (tile.equals(TILE_LOCKSCREEN)) {
qs = new ToggleLockscreenTile(mContext, this);
} else if (tile.equals(TILE_NETWORKMODE) && mobileDataSupported) {
- qs = new MobileNetworkTypeTile(mContext, this);
+ qs = new MobileNetworkTypeTile(mContext, this, mStatusBarService.mNetworkController);
} else if (tile.equals(TILE_AUTOROTATE)) {
qs = new AutoRotateTile(mContext, this, mHandler);
} else if (tile.equals(TILE_AIRPLANE)) {
- qs = new AirplaneModeTile(mContext, this);
+ qs = new AirplaneModeTile(mContext, this, mStatusBarService.mNetworkController);
} else if (tile.equals(TILE_TORCH)) {
qs = new TorchTile(mContext, this, mHandler);
} else if (tile.equals(TILE_SLEEP)) {
@@ -291,27 +291,36 @@ public class QuickSettingsController {
}
private void loadDockBatteryTile(final ContentResolver resolver, final LayoutInflater inflater) {
- if (deviceSupportsDockBattery(mContext) && Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_DOCK_BATTERY, 1) == 1) {
- QuickSettingsTile qs = new DockBatteryTile(mContext, this);
- qs.setupQuickSettingsTile(inflater, mContainerView);
- mQuickSettingsTiles.add(qs);
+ if (!deviceSupportsDockBattery(mContext)) {
+ return;
+ }
+ if (Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_DOCK_BATTERY, 1) == 0) {
+ return;
}
+
+ QuickSettingsTile qs = new DockBatteryTile(mContext, this, mStatusBarService.mDockBatteryController);
+ qs.setupQuickSettingsTile(inflater, mContainerView);
+ mQuickSettingsTiles.add(qs);
}
- protected void setupQuickSettings() {
- mQuickSettingsTiles.clear();
- mContainerView.removeAllViews();
- // Clear out old receiver
+ public void shutdown() {
+ if (mObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mObserver);
+ }
if (mReceiver != null) {
mContext.unregisterReceiver(mReceiver);
}
+ for (QuickSettingsTile qs : mQuickSettingsTiles) {
+ qs.onDestroy();
+ }
+ mQuickSettingsTiles.clear();
+ mContainerView.removeAllViews();
+ }
+
+ protected void setupQuickSettings() {
+ shutdown();
mReceiver = new QSBroadcastReceiver();
mReceiverMap.clear();
- ContentResolver resolver = mContext.getContentResolver();
- // Clear out old observer
- if (mObserver != null) {
- resolver.unregisterContentObserver(mObserver);
- }
mObserver = new QuickSettingsObserver(mHandler);
mObserverMap.clear();
mTileStatusUris.clear();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index a2b425b..6cb5adb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -120,6 +120,10 @@ public class BatteryController extends BroadcastReceiver {
mChangeCallbacks.add(cb);
}
+ public void removeStateChangedCallback(BatteryStateChangeCallback cb) {
+ mChangeCallbacks.remove(cb);
+ }
+
// Allow override battery icons
public int getIconStyleUnknown() {
return R.drawable.stat_sys_battery;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
index fece57e..4d5383d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
@@ -73,6 +73,10 @@ public class BluetoothController extends BroadcastReceiver {
mChangeCallbacks.add(cb);
}
+ public void removeStateChangedCallback(BluetoothStateChangeCallback cb) {
+ mChangeCallbacks.remove(cb);
+ }
+
public Set<BluetoothDevice> getBondedBluetoothDevices() {
return mBondedDevices;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java
index 01178c0..9aeb200 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CircleBattery.java
@@ -54,6 +54,7 @@ public class CircleBattery extends ImageView {
private Handler mHandler;
private Context mContext;
private BatteryReceiver mBatteryReceiver = null;
+ private SettingsObserver mObserver;
// state variables
private boolean mAttached; // whether or not attached to a window
@@ -100,6 +101,10 @@ public class CircleBattery extends ImageView {
onChange(true);
}
+ public void unobserve() {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+
@Override
public void onChange(boolean selfChange) {
int batteryStyle = (Settings.System.getInt(mContext.getContentResolver(),
@@ -190,8 +195,7 @@ public class CircleBattery extends ImageView {
mContext = context;
mHandler = new Handler();
- SettingsObserver settingsObserver = new SettingsObserver(mHandler);
- settingsObserver.observe();
+ mObserver = new SettingsObserver(mHandler);
mBatteryReceiver = new BatteryReceiver(mContext);
// initialize and setup all paint variables
@@ -260,6 +264,7 @@ public class CircleBattery extends ImageView {
super.onAttachedToWindow();
if (!mAttached) {
mAttached = true;
+ mObserver.observe();
mBatteryReceiver.updateRegistration();
mHandler.postDelayed(mInvalidate, 250);
}
@@ -270,6 +275,7 @@ public class CircleBattery extends ImageView {
super.onDetachedFromWindow();
if (mAttached) {
mAttached = false;
+ mObserver.unobserve();
mBatteryReceiver.updateRegistration();
mRectLeft = null; // makes sure, size based variables get
// recalculated on next attach
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index 2b7360c..7779b1f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -55,6 +55,7 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe
private String mClockFormatString;
private SimpleDateFormat mClockFormat;
private Locale mLocale;
+ private SettingsObserver mObserver;
private static final int AM_PM_STYLE_NORMAL = 0;
private static final int AM_PM_STYLE_SMALL = 1;
@@ -78,6 +79,10 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe
Settings.System.STATUS_BAR_CLOCK), false, this);
}
+ void unobserve() {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+
@Override public void onChange(boolean selfChange) {
updateSettings();
}
@@ -95,9 +100,8 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe
super(context, attrs, defStyle);
mHandler = new Handler();
- SettingsObserver settingsObserver = new SettingsObserver(mHandler);
- settingsObserver.observe();
- if(isClickable()){
+ mObserver = new SettingsObserver(mHandler);
+ if (isClickable()) {
setOnClickListener(this);
setOnLongClickListener(this);
}
@@ -119,6 +123,7 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe
filter.addAction(Intent.ACTION_USER_SWITCHED);
getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
+ mObserver.observe();
}
// NOTE: It's safe to do these after registering the receiver since the receiver always runs
@@ -136,6 +141,7 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe
super.onDetachedFromWindow();
if (mAttached) {
getContext().unregisterReceiver(mIntentReceiver);
+ mObserver.unobserve();
mAttached = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
index 83639ee..cf0a3bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
@@ -76,6 +76,10 @@ public class DockBatteryController extends BatteryController {
mChangeCallbacks.add(cb);
}
+ public void removeStateChangedCallback(DockBatteryStateChangeCallback cb) {
+ mChangeCallbacks.remove(cb);
+ }
+
@Override
public int getIconStyleUnknown() {
return R.drawable.stat_sys_kb_battery_unknown;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 19d9f8c..1a4718e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -314,6 +314,10 @@ public class NetworkController extends BroadcastReceiver {
notifySignalsChangedCallbacks(cb);
}
+ public void removeNetworkSignalChangedCallback(NetworkSignalChangedCallback cb) {
+ mSignalsChangedCallbacks.remove(cb);
+ }
+
public void refreshSignalCluster(SignalCluster cluster) {
cluster.setWifiIndicators(
// only show wifi in the cluster if connected or if wifi-only