summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2012-05-14 12:53:36 +0200
committerDanny Baumann <dannybaumann@web.de>2012-05-20 13:44:06 +0200
commit4c113489d4ef8db98cce2ae02bb8a7906199311b (patch)
tree2cc7453b00c174aeed4ef1d5f795624a4ca5f02c
parent29aa7d1a1fd42157aaebf9eb157ed4d7e9f3cd7e (diff)
downloadframeworks_base-4c113489d4ef8db98cce2ae02bb8a7906199311b.zip
frameworks_base-4c113489d4ef8db98cce2ae02bb8a7906199311b.tar.gz
frameworks_base-4c113489d4ef8db98cce2ae02bb8a7906199311b.tar.bz2
Manage buttons inside of PowerWidget instead of a static map.
Fixes disappearing widgets on theme change due to clashing accesses to the static map by the old and the new widget instance. Also convert static to member variables at a few other places. Change-Id: I42b4ad02c4eb8b57a2f4cf51a31148c4b0546b81
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java68
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java296
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java170
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java58
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java2
7 files changed, 267 insertions, 350 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java
index 8783a85..69fac7b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java
@@ -429,7 +429,6 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
mLatestTitle.setVisibility(View.GONE);
mPowerWidget = (PowerWidget)expanded.findViewById(R.id.exp_power_stat);
- mPowerWidget.setupSettingsObserver(mHandler);
mPowerWidget.setGlobalButtonOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(Settings.System.getInt(getContentResolver(),
@@ -917,7 +916,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks
mExpandedVisible = true;
visibilityChanged(true);
- mPowerWidget.updateWidget();
+ mPowerWidget.updateAllButtons();
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java
index 562ac2d..7dd1c7b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/MobileDataButton.java
@@ -14,22 +14,14 @@ import com.android.internal.telephony.Phone;
public class MobileDataButton extends PowerButton {
- public static final String MOBILE_DATA_CHANGED = "com.android.internal.telephony.MOBILE_DATA_CHANGED";
-
public static final String ACTION_MODIFY_NETWORK_MODE = "com.android.internal.telephony.MODIFY_NETWORK_MODE";
-
public static final String EXTRA_NETWORK_MODE = "networkMode";
- public static boolean STATE_CHANGE_REQUEST = false;
-
public MobileDataButton() { mType = BUTTON_MOBILEDATA; }
@Override
protected void updateState() {
- if (STATE_CHANGE_REQUEST) {
- mIcon = R.drawable.stat_data_on;
- mState = STATE_INTERMEDIATE;
- } else if (getDataState(mView.getContext())) {
+ if (getDataState(mView.getContext())) {
mIcon = R.drawable.stat_data_on;
mState = STATE_ENABLED;
} else {
@@ -97,14 +89,4 @@ public class MobileDataButton extends PowerButton {
.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getMobileDataEnabled();
}
-
- public void networkModeChanged(Context context, int networkMode) {
- if (STATE_CHANGE_REQUEST) {
- ConnectivityManager cm = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- cm.setMobileDataEnabled(true);
- STATE_CHANGE_REQUEST=false;
- }
- }
-
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java
index 8aa5e5c..53a4e79 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/NetworkModeButton.java
@@ -36,16 +36,16 @@ public class NetworkModeButton extends PowerButton{
private static final int CM_MODE_3GONLY = 1;
private static final int CM_MODE_BOTH = 2;
- private static int NETWORK_MODE = NO_NETWORK_MODE_YET;
- private static int INTENDED_NETWORK_MODE = NO_NETWORK_MODE_YET;
- private static int CURRENT_INTERNAL_STATE = STATE_INTERMEDIATE;
+ private int mMode = NO_NETWORK_MODE_YET;
+ private int mIntendedMode = NO_NETWORK_MODE_YET;
+ private int mInternalState = STATE_INTERMEDIATE;
public NetworkModeButton() { mType = BUTTON_NETWORKMODE; }
@Override
protected void updateState() {
Context context = mView.getContext();
- NETWORK_MODE = get2G3G(context);
+ mMode = get2G3G(context);
mState = networkModeToState(context);
switch (mState) {
@@ -53,7 +53,7 @@ public class NetworkModeButton extends PowerButton{
mIcon = R.drawable.stat_2g3g_off;
break;
case STATE_ENABLED:
- if (NETWORK_MODE == Phone.NT_MODE_WCDMA_ONLY) {
+ if (mMode == Phone.NT_MODE_WCDMA_ONLY) {
mIcon = R.drawable.stat_3g_on;
} else {
mIcon = R.drawable.stat_2g3g_on;
@@ -65,8 +65,8 @@ public class NetworkModeButton extends PowerButton{
// the top dark-gray-or-bright-white logo shows the
// user's intent. This is much easier to see in
// sunlight.
- if (CURRENT_INTERNAL_STATE == STATE_TURNING_ON) {
- if (INTENDED_NETWORK_MODE == Phone.NT_MODE_WCDMA_ONLY) {
+ if (mInternalState == STATE_TURNING_ON) {
+ if (mIntendedMode == Phone.NT_MODE_WCDMA_ONLY) {
mIcon = R.drawable.stat_3g_on;
} else {
mIcon = R.drawable.stat_2g3g_on;
@@ -84,38 +84,38 @@ public class NetworkModeButton extends PowerButton{
int currentMode = getCurrentCMMode(context);
Intent intent = new Intent(ACTION_MODIFY_NETWORK_MODE);
- switch (NETWORK_MODE) {
+ switch (mMode) {
case Phone.NT_MODE_WCDMA_PREF:
case Phone.NT_MODE_GSM_UMTS:
intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_GSM_ONLY);
- CURRENT_INTERNAL_STATE = STATE_TURNING_OFF;
- INTENDED_NETWORK_MODE=Phone.NT_MODE_GSM_ONLY;
+ mInternalState = STATE_TURNING_OFF;
+ mIntendedMode = Phone.NT_MODE_GSM_ONLY;
break;
case Phone.NT_MODE_WCDMA_ONLY:
- if(currentMode == CM_MODE_3GONLY) {
+ if (currentMode == CM_MODE_3GONLY) {
intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_GSM_ONLY);
- CURRENT_INTERNAL_STATE = STATE_TURNING_OFF;
- INTENDED_NETWORK_MODE = Phone.NT_MODE_GSM_ONLY;
+ mInternalState = STATE_TURNING_OFF;
+ mIntendedMode = Phone.NT_MODE_GSM_ONLY;
} else {
intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_WCDMA_PREF);
- CURRENT_INTERNAL_STATE = STATE_TURNING_ON;
- INTENDED_NETWORK_MODE = Phone.NT_MODE_WCDMA_PREF;
+ mInternalState = STATE_TURNING_ON;
+ mIntendedMode = Phone.NT_MODE_WCDMA_PREF;
}
break;
case Phone.NT_MODE_GSM_ONLY:
- if(currentMode == CM_MODE_3GONLY || currentMode == CM_MODE_BOTH) {
+ if (currentMode == CM_MODE_3GONLY || currentMode == CM_MODE_BOTH) {
intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_WCDMA_ONLY);
- CURRENT_INTERNAL_STATE = STATE_TURNING_ON;
- INTENDED_NETWORK_MODE = Phone.NT_MODE_WCDMA_ONLY;
+ mInternalState = STATE_TURNING_ON;
+ mIntendedMode = Phone.NT_MODE_WCDMA_ONLY;
} else {
intent.putExtra(EXTRA_NETWORK_MODE, Phone.NT_MODE_WCDMA_PREF);
- CURRENT_INTERNAL_STATE = STATE_TURNING_ON;
- INTENDED_NETWORK_MODE = Phone.NT_MODE_WCDMA_PREF;
+ mInternalState = STATE_TURNING_ON;
+ mIntendedMode = Phone.NT_MODE_WCDMA_PREF;
}
break;
}
- NETWORK_MODE = NETWORK_MODE_UNKNOWN;
+ mMode = NETWORK_MODE_UNKNOWN;
context.sendBroadcast(intent);
}
@@ -133,22 +133,14 @@ public class NetworkModeButton extends PowerButton{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getExtras() != null) {
- NETWORK_MODE = intent.getExtras().getInt(EXTRA_NETWORK_MODE);
+ mMode = intent.getExtras().getInt(EXTRA_NETWORK_MODE);
//Update to actual state
- INTENDED_NETWORK_MODE = NETWORK_MODE;
+ mIntendedMode = mMode;
}
//need to clear intermediate states
- CURRENT_INTERNAL_STATE = STATE_ENABLED;
-
- int widgetState = networkModeToState(context);
- CURRENT_INTERNAL_STATE = widgetState;
- if (widgetState == STATE_ENABLED) {
- MobileDataButton mdb = (MobileDataButton)getLoadedButton(BUTTON_MOBILEDATA);
- if(mdb != null) {
- mdb.networkModeChanged(context, NETWORK_MODE);
- }
- }
+ mInternalState = STATE_ENABLED;
+ mInternalState = networkModeToState(context);
}
@Override
@@ -173,12 +165,12 @@ public class NetworkModeButton extends PowerButton{
return state;
}
- private static int networkModeToState(Context context) {
- if (CURRENT_INTERNAL_STATE == STATE_TURNING_ON ||
- CURRENT_INTERNAL_STATE == STATE_TURNING_OFF)
+ private int networkModeToState(Context context) {
+ if (mInternalState == STATE_TURNING_ON || mInternalState == STATE_TURNING_OFF) {
return STATE_INTERMEDIATE;
+ }
- switch(NETWORK_MODE) {
+ switch (mMode) {
case Phone.NT_MODE_WCDMA_PREF:
case Phone.NT_MODE_WCDMA_ONLY:
case Phone.NT_MODE_GSM_UMTS:
@@ -190,7 +182,7 @@ public class NetworkModeButton extends PowerButton{
case Phone.NT_MODE_EVDO_NO_CDMA:
case Phone.NT_MODE_GLOBAL:
// need to check wtf is going on
- Log.d(TAG, "Unexpected network mode (" + NETWORK_MODE + ")");
+ Log.d(TAG, "Unexpected network mode (" + mMode + ")");
return STATE_DISABLED;
}
return STATE_INTERMEDIATE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java
index dd1eb19..fe96309 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerButton.java
@@ -2,6 +2,7 @@ package com.android.systemui.statusbar.powerwidget;
import com.android.systemui.R;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -18,9 +19,7 @@ import android.provider.Settings;
import android.view.View;
import android.provider.Settings;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
public abstract class PowerButton {
public static final String TAG = "PowerButton";
@@ -55,85 +54,53 @@ public abstract class PowerButton {
private static final Mode MASK_MODE = Mode.SCREEN;
- // this is a list of all of our buttons and their corresponding classes
- private static final HashMap<String, Class<? extends PowerButton>> BUTTONS = new HashMap<String, Class<? extends PowerButton>>();
- static {
- BUTTONS.put(BUTTON_WIFI, WifiButton.class);
- BUTTONS.put(BUTTON_GPS, GPSButton.class);
- BUTTONS.put(BUTTON_BLUETOOTH, BluetoothButton.class);
- BUTTONS.put(BUTTON_BRIGHTNESS, BrightnessButton.class);
- BUTTONS.put(BUTTON_SOUND, SoundButton.class);
- BUTTONS.put(BUTTON_SYNC, SyncButton.class);
- BUTTONS.put(BUTTON_WIFIAP, WifiApButton.class);
- BUTTONS.put(BUTTON_SCREENTIMEOUT, ScreenTimeoutButton.class);
- BUTTONS.put(BUTTON_MOBILEDATA, MobileDataButton.class);
- BUTTONS.put(BUTTON_LOCKSCREEN, LockScreenButton.class);
- BUTTONS.put(BUTTON_NETWORKMODE, NetworkModeButton.class);
- BUTTONS.put(BUTTON_AUTOROTATE, AutoRotateButton.class);
- BUTTONS.put(BUTTON_AIRPLANE, AirplaneButton.class);
- BUTTONS.put(BUTTON_FLASHLIGHT, FlashlightButton.class);
- BUTTONS.put(BUTTON_SLEEP, SleepButton.class);
- BUTTONS.put(BUTTON_MEDIA_PLAY_PAUSE, MediaPlayPauseButton.class);
- BUTTONS.put(BUTTON_MEDIA_PREVIOUS, MediaPreviousButton.class);
- BUTTONS.put(BUTTON_MEDIA_NEXT, MediaNextButton.class);
- BUTTONS.put(BUTTON_WIMAX, WimaxButton.class);
- }
- // this is a list of our currently loaded buttons
- private static final HashMap<String, PowerButton> BUTTONS_LOADED = new HashMap<String, PowerButton>();
-
protected int mIcon;
protected int mState;
protected View mView;
protected String mType = BUTTON_UNKNOWN;
- // a static onclicklistener that can be set to register a callback when ANY button is clicked
- private static View.OnClickListener GLOBAL_ON_CLICK_LISTENER = null;
+ private ImageView mIconView;
+ private ImageView mIndicatorView;
- // a static onlongclicklistener that can be set to register a callback when ANY button is long clicked
- private static View.OnLongClickListener GLOBAL_ON_LONG_CLICK_LISTENER = null;
+ private View.OnClickListener mExternalClickListener;
+ private View.OnLongClickListener mExternalLongClickListener;
// we use this to ensure we update our views on the UI thread
private Handler mViewUpdateHandler = new Handler() {
- public void handleMessage(Message msg) {
- // this is only used to update the view, so do it
- if(mView != null) {
- Context context = mView.getContext();
- Resources res = context.getResources();
- int buttonLayer = R.id.power_widget_button;
- int buttonIcon = R.id.power_widget_button_image;
- int buttonState = R.id.power_widget_button_indic;
- ImageView indic = (ImageView)mView.findViewById(R.id.power_widget_button_indic);
- if ((Settings.System.getInt(context.getContentResolver(),Settings.System.EXPANDED_HIDE_INDICATOR, 0)) == 1){
- indic.setVisibility(8);
- }else{
- indic.setVisibility(0);
- }
- updateImageView(buttonIcon, mIcon);
-
- int sColorMaskBase = Settings.System.getInt(context.getContentResolver(),
- Settings.System.EXPANDED_VIEW_WIDGET_COLOR, 0xFF8DE20D);
- int sColorMaskOn = (sColorMaskBase & 0x00FFFFFF) | 0xA0000000;
- int sColorMaskOff = (sColorMaskBase & 0x00FFFFFF) | 0x33000000;
- int sColorMaskInter = (sColorMaskBase & 0x00FFFFFF) | 0x60000000;
-
- /* Button State */
- switch(mState) {
- case STATE_ENABLED:
- updateImageView(buttonState,
- res.getDrawable(R.drawable.stat_bgon_custom, sColorMaskOn, MASK_MODE));
- break;
- case STATE_DISABLED:
- updateImageView(buttonState,
- res.getDrawable(R.drawable.stat_bgon_custom, sColorMaskOff, MASK_MODE));
- break;
- default:
- updateImageView(buttonState,
- res.getDrawable(R.drawable.stat_bgon_custom, sColorMaskInter, MASK_MODE));
- break;
- }
+ @Override
+ public void handleMessage(Message msg) {
+ if (mIconView != null) {
+ mIconView.setImageResource(mIcon);
+ }
+ if (mIndicatorView != null) {
+ Context context = mIndicatorView.getContext();
+ ContentResolver cr = context.getContentResolver();
+
+ boolean visible = Settings.System.getInt(cr,
+ Settings.System.EXPANDED_HIDE_INDICATOR, 0) != 1;
+ int colorMaskBase = Settings.System.getInt(cr,
+ Settings.System.EXPANDED_VIEW_WIDGET_COLOR, 0xFF8DE20D);
+ int colorMask;
+
+ mIndicatorView.setVisibility(visible ? View.VISIBLE : View.GONE);
+
+ switch (mState) {
+ case STATE_ENABLED:
+ colorMask = (colorMaskBase & 0x00FFFFFF) | 0xA0000000;
+ break;
+ case STATE_DISABLED:
+ colorMask = (colorMaskBase & 0x00FFFFFF) | 0x33000000;
+ break;
+ default:
+ colorMask = (colorMaskBase & 0x00FFFFFF) | 0x60000000;
+ break;
}
+
+ mIndicatorView.setImageDrawable(context.getResources().getDrawable(
+ R.drawable.stat_bgon_custom, colorMask, MASK_MODE));
}
- };
+ }
+ };
protected abstract void updateState();
protected abstract void toggleState();
@@ -164,10 +131,16 @@ public abstract class PowerButton {
protected void setupButton(View view) {
mView = view;
- if(mView != null) {
+ if (mView != null) {
mView.setTag(mType);
mView.setOnClickListener(mClickListener);
mView.setOnLongClickListener(mLongClickListener);
+
+ mIconView = (ImageView) mView.findViewById(R.id.power_widget_button_image);
+ mIndicatorView = (ImageView) mView.findViewById(R.id.power_widget_button_indic);
+ } else {
+ mIconView = null;
+ mIndicatorView = null;
}
}
@@ -175,193 +148,32 @@ public abstract class PowerButton {
mViewUpdateHandler.sendEmptyMessage(0);
}
- private void updateImageView(int id, int resId) {
- ImageView imageIcon = (ImageView)mView.findViewById(id);
- imageIcon.setImageResource(resId);
- }
-
- private void updateImageView(int id, Drawable resDraw) {
- ImageView imageIcon = (ImageView)mView.findViewById(id);
- imageIcon.setImageResource(R.drawable.stat_bgon_custom);
- imageIcon.setImageDrawable(resDraw);
- }
-
private View.OnClickListener mClickListener = new View.OnClickListener() {
public void onClick(View v) {
- String type = (String)v.getTag();
+ toggleState();
- for(Map.Entry<String, PowerButton> entry : BUTTONS_LOADED.entrySet()) {
- if(entry.getKey().equals(type)) {
- entry.getValue().toggleState();
- break;
- }
- }
-
- // call our static listener if it's set
- if(GLOBAL_ON_CLICK_LISTENER != null) {
- GLOBAL_ON_CLICK_LISTENER.onClick(v);
+ if (mExternalClickListener != null) {
+ mExternalClickListener.onClick(v);
}
}
};
private View.OnLongClickListener mLongClickListener = new View.OnLongClickListener() {
public boolean onLongClick(View v) {
- boolean result = false;
- String type = (String)v.getTag();
- for (Map.Entry<String, PowerButton> entry : BUTTONS_LOADED.entrySet()) {
- if(entry.getKey().endsWith(type)) {
- result = entry.getValue().handleLongClick();
- break;
- }
- }
+ boolean result = handleLongClick();
- if(result && GLOBAL_ON_LONG_CLICK_LISTENER != null) {
- GLOBAL_ON_LONG_CLICK_LISTENER.onLongClick(v);
+ if (result && mExternalLongClickListener != null) {
+ mExternalLongClickListener.onLongClick(v);
}
return result;
}
};
- public static boolean loadButton(String key, View view) {
- // first make sure we have a valid button
- if(BUTTONS.containsKey(key) && view != null) {
- synchronized (BUTTONS_LOADED) {
- if(BUTTONS_LOADED.containsKey(key)) {
- // setup the button again
- BUTTONS_LOADED.get(key).setupButton(view);
- } else {
- try {
- // we need to instantiate a new button and add it
- PowerButton pb = BUTTONS.get(key).newInstance();
- // set it up
- pb.setupButton(view);
- // save it
- BUTTONS_LOADED.put(key, pb);
- } catch(Exception e) {
- Log.e(TAG, "Error loading button: " + key, e);
- }
- }
- }
- return true;
- } else {
- return false;
- }
- }
-
- public static void unloadButton(String key) {
- synchronized (BUTTONS_LOADED) {
- // first make sure we have a valid button
- if(BUTTONS_LOADED.containsKey(key)) {
- // wipe out the button view
- BUTTONS_LOADED.get(key).setupButton(null);
- // remove the button from our list of loaded ones
- BUTTONS_LOADED.remove(key);
- }
- }
+ void setExternalClickListener(View.OnClickListener listener) {
+ mExternalClickListener = listener;
}
- public static void unloadAllButtons() {
- synchronized (BUTTONS_LOADED) {
- // cycle through setting the buttons to null
- for(PowerButton pb : BUTTONS_LOADED.values()) {
- pb.setupButton(null);
- }
-
- // clear our list
- BUTTONS_LOADED.clear();
- }
- }
-
- public static void updateAllButtons() {
- synchronized (BUTTONS_LOADED) {
- // cycle through our buttons and update them
- for(PowerButton pb : BUTTONS_LOADED.values()) {
- pb.update();
- }
- }
- }
-
- // glue for broadcast receivers
- public static IntentFilter getAllBroadcastIntentFilters() {
- IntentFilter filter = new IntentFilter();
-
- synchronized(BUTTONS_LOADED) {
- for(PowerButton button : BUTTONS_LOADED.values()) {
- IntentFilter tmp = button.getBroadcastIntentFilter();
-
- // cycle through these actions, and see if we need them
- int num = tmp.countActions();
- for(int i = 0; i < num; i++) {
- String action = tmp.getAction(i);
- if(!filter.hasAction(action)) {
- filter.addAction(action);
- }
- }
- }
- }
-
- // return our merged filter
- return filter;
- }
-
- // glue for content observation
- public static List<Uri> getAllObservedUris() {
- List<Uri> uris = new ArrayList<Uri>();
-
- synchronized(BUTTONS_LOADED) {
- for(PowerButton button : BUTTONS_LOADED.values()) {
- List<Uri> tmp = button.getObservedUris();
-
- for(Uri uri : tmp) {
- if(!uris.contains(uri)) {
- uris.add(uri);
- }
- }
- }
- }
-
- return uris;
- }
-
- public static void handleOnReceive(Context context, Intent intent) {
- String action = intent.getAction();
-
- // cycle through power buttons
- synchronized(BUTTONS_LOADED) {
- for(PowerButton button : BUTTONS_LOADED.values()) {
- // call "onReceive" on those that matter
- if(button.getBroadcastIntentFilter().hasAction(action)) {
- button.onReceive(context, intent);
- }
- }
- }
- }
-
- public static void handleOnChangeUri(Uri uri) {
- synchronized(BUTTONS_LOADED) {
- for(PowerButton button : BUTTONS_LOADED.values()) {
- if(button.getObservedUris().contains(uri)) {
- button.onChangeUri(uri);
- }
- }
- }
- }
-
- public static void setGlobalOnClickListener(View.OnClickListener listener) {
- GLOBAL_ON_CLICK_LISTENER = listener;
- }
-
- public static void setGlobalOnLongClickListener(View.OnLongClickListener listener) {
- GLOBAL_ON_LONG_CLICK_LISTENER = listener;
- }
-
- protected static PowerButton getLoadedButton(String key) {
- synchronized(BUTTONS_LOADED) {
- if(BUTTONS_LOADED.containsKey(key)) {
- return BUTTONS_LOADED.get(key);
- } else {
- return null;
- }
- }
+ void setExternalLongClickListener(View.OnLongClickListener listener) {
+ mExternalLongClickListener = listener;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java
index b51ff3d..c82fc86 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/PowerWidget.java
@@ -41,6 +41,8 @@ import com.android.systemui.R;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
public class PowerWidget extends FrameLayout {
private static final String TAG = "PowerWidget";
@@ -65,7 +67,40 @@ public class PowerWidget extends FrameLayout {
private static final int LAYOUT_SCROLL_BUTTON_THRESHOLD = 6;
+ // this is a list of all possible buttons and their corresponding classes
+ private static final HashMap<String, Class<? extends PowerButton>> sPossibleButtons =
+ new HashMap<String, Class<? extends PowerButton>>();
+
+ static {
+ sPossibleButtons.put(PowerButton.BUTTON_WIFI, WifiButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_GPS, GPSButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_BLUETOOTH, BluetoothButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_BRIGHTNESS, BrightnessButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_SOUND, SoundButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_SYNC, SyncButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_WIFIAP, WifiApButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_SCREENTIMEOUT, ScreenTimeoutButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_MOBILEDATA, MobileDataButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_LOCKSCREEN, LockScreenButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_NETWORKMODE, NetworkModeButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_AUTOROTATE, AutoRotateButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_AIRPLANE, AirplaneButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_FLASHLIGHT, FlashlightButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_SLEEP, SleepButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_MEDIA_PLAY_PAUSE, MediaPlayPauseButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_MEDIA_PREVIOUS, MediaPreviousButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_MEDIA_NEXT, MediaNextButton.class);
+ sPossibleButtons.put(PowerButton.BUTTON_WIMAX, WimaxButton.class);
+ }
+
+ // this is a list of our currently loaded buttons
+ private final HashMap<String, PowerButton> mButtons = new HashMap<String, PowerButton>();
+
+ private View.OnClickListener mAllButtonClickListener;
+ private View.OnLongClickListener mAllButtonLongClickListener;
+
private Context mContext;
+ private Handler mHandler;
private LayoutInflater mInflater;
private WidgetBroadcastReceiver mBroadcastReceiver = null;
private WidgetSettingsObserver mObserver = null;
@@ -76,6 +111,7 @@ public class PowerWidget extends FrameLayout {
super(context, attrs);
mContext = context;
+ mHandler = new Handler();
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// get an initial width
@@ -101,7 +137,7 @@ public class PowerWidget extends FrameLayout {
}
// clear the button instances
- PowerButton.unloadAllButtons();
+ unloadAllButtons();
}
@@ -132,7 +168,7 @@ public class PowerWidget extends FrameLayout {
// inflate our button, we don't add it to a parent and don't do any layout shit yet
View buttonView = mInflater.inflate(R.layout.power_widget_button, null, false);
- if(PowerButton.loadButton(button, buttonView)) {
+ if (loadButton(button, buttonView)) {
// add the button here
ll.addView(buttonView, BUTTON_LAYOUT_PARAMS);
buttonCount++;
@@ -161,7 +197,7 @@ public class PowerWidget extends FrameLayout {
// set up a broadcast receiver for our intents, based off of what our power buttons have been loaded
setupBroadcastReceiver();
- IntentFilter filter = PowerButton.getAllBroadcastIntentFilters();
+ IntentFilter filter = getMergedBroadcastIntentFilter();
// we add this so we can update views and such if the settings for our widget change
filter.addAction(Settings.SETTINGS_CHANGED);
// we need to detect orientation changes and update the static button width value appropriately
@@ -169,27 +205,114 @@ public class PowerWidget extends FrameLayout {
// register the receiver
mContext.registerReceiver(mBroadcastReceiver, filter);
// register our observer
- if(mObserver != null) {
- mObserver.observe();
+ mObserver = new WidgetSettingsObserver(mHandler);
+ mObserver.observe();
+ }
+
+ private boolean loadButton(String key, View view) {
+ // first make sure we have a valid button
+ if (!sPossibleButtons.containsKey(key) || view == null) {
+ return false;
+ }
+
+ if (mButtons.containsKey(key)) {
+ // setup the button again
+ mButtons.get(key).setupButton(view);
+ return true;
}
+
+ try {
+ // we need to instantiate a new button and add it
+ PowerButton pb = sPossibleButtons.get(key).newInstance();
+ // set it up
+ pb.setupButton(view);
+ pb.setExternalClickListener(mAllButtonClickListener);
+ pb.setExternalLongClickListener(mAllButtonLongClickListener);
+ // save it
+ mButtons.put(key, pb);
+ } catch(Exception e) {
+ Log.e(TAG, "Error loading button: " + key, e);
+ return false;
+ }
+
+ return true;
}
- public void updateWidget() {
- PowerButton.updateAllButtons();
+ private void unloadButton(String key) {
+ // first make sure we have a valid button
+ if (mButtons.containsKey(key)) {
+ // wipe out the button view
+ mButtons.get(key).setupButton(null);
+ // remove the button from our list of loaded ones
+ mButtons.remove(key);
+ }
}
- public void setupSettingsObserver(Handler handler) {
- if(mObserver == null) {
- mObserver = new WidgetSettingsObserver(handler);
+ private void unloadAllButtons() {
+ // cycle through setting the buttons to null
+ for (PowerButton pb : mButtons.values()) {
+ pb.setupButton(null);
}
+
+ // clear our list
+ mButtons.clear();
+ }
+
+ public void updateAllButtons() {
+ // cycle through our buttons and update them
+ for (PowerButton pb : mButtons.values()) {
+ pb.update();
+ }
+ }
+
+ private IntentFilter getMergedBroadcastIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+
+ for (PowerButton button : mButtons.values()) {
+ IntentFilter tmp = button.getBroadcastIntentFilter();
+
+ // cycle through these actions, and see if we need them
+ int num = tmp.countActions();
+ for (int i = 0; i < num; i++) {
+ String action = tmp.getAction(i);
+ if(!filter.hasAction(action)) {
+ filter.addAction(action);
+ }
+ }
+ }
+
+ // return our merged filter
+ return filter;
+ }
+
+ private List<Uri> getAllObservedUris() {
+ List<Uri> uris = new ArrayList<Uri>();
+
+ for (PowerButton button : mButtons.values()) {
+ List<Uri> tmp = button.getObservedUris();
+
+ for (Uri uri : tmp) {
+ if (!uris.contains(uri)) {
+ uris.add(uri);
+ }
+ }
+ }
+
+ return uris;
}
public void setGlobalButtonOnClickListener(View.OnClickListener listener) {
- PowerButton.setGlobalOnClickListener(listener);
+ mAllButtonClickListener = listener;
+ for (PowerButton pb : mButtons.values()) {
+ pb.setExternalClickListener(listener);
+ }
}
public void setGlobalButtonOnLongClickListener(View.OnLongClickListener listener) {
- PowerButton.setGlobalOnLongClickListener(listener);
+ mAllButtonLongClickListener = listener;
+ for (PowerButton pb : mButtons.values()) {
+ pb.setExternalLongClickListener(listener);
+ }
}
private void setupBroadcastReceiver() {
@@ -224,16 +347,23 @@ public class PowerWidget extends FrameLayout {
// our own broadcast receiver :D
private class WidgetBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
- if(intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
+ String action = intent.getAction();
+
+ if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
updateButtonLayoutWidth();
setupWidget();
} else {
// handle the intent through our power buttons
- PowerButton.handleOnReceive(context, intent);
+ for (PowerButton button : mButtons.values()) {
+ // call "onReceive" on those that matter
+ if (button.getBroadcastIntentFilter().hasAction(action)) {
+ button.onReceive(context, intent);
+ }
+ }
}
// update our widget
- updateWidget();
+ updateAllButtons();
}
};
@@ -272,7 +402,7 @@ public class PowerWidget extends FrameLayout {
false, this);
// watch for power-button specifc stuff that has been loaded
- for(Uri uri : PowerButton.getAllObservedUris()) {
+ for(Uri uri : getAllObservedUris()) {
resolver.registerContentObserver(uri, false, this);
}
}
@@ -300,10 +430,14 @@ public class PowerWidget extends FrameLayout {
}
// do whatever the individual buttons must
- PowerButton.handleOnChangeUri(uri);
+ for (PowerButton button : mButtons.values()) {
+ if (button.getObservedUris().contains(uri)) {
+ button.onChangeUri(uri);
+ }
+ }
// something happened so update the widget
- updateWidget();
+ updateAllButtons();
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java
index acac53e..632e16a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/ScreenTimeoutButton.java
@@ -26,7 +26,7 @@ public class ScreenTimeoutButton extends PowerButton {
private static final int CM_MODE_15_60_300 = 0;
private static final int CM_MODE_30_120_300 = 1;
- private static Toast TOAST = null;
+ private Toast mToast = null;
private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
static {
@@ -37,7 +37,7 @@ public class ScreenTimeoutButton extends PowerButton {
@Override
protected void updateState() {
- int timeout=getScreenTtimeout(mView.getContext());
+ int timeout = getScreenTimeout(mView.getContext());
if (timeout <= SCREEN_TIMEOUT_LOW) {
mIcon = R.drawable.stat_screen_timeout_off;
@@ -54,57 +54,55 @@ public class ScreenTimeoutButton extends PowerButton {
@Override
protected void toggleState() {
Context context = mView.getContext();
- int screentimeout = getScreenTtimeout(context);
+ int screenTimeout = getScreenTimeout(context);
int currentMode = getCurrentCMMode(context);
- if (screentimeout < SCREEN_TIMEOUT_MIN) {
+ if (screenTimeout < SCREEN_TIMEOUT_MIN) {
if (currentMode == CM_MODE_15_60_300) {
- screentimeout = SCREEN_TIMEOUT_MIN;
+ screenTimeout = SCREEN_TIMEOUT_MIN;
} else {
- screentimeout = SCREEN_TIMEOUT_LOW;
+ screenTimeout = SCREEN_TIMEOUT_LOW;
}
- } else if (screentimeout < SCREEN_TIMEOUT_LOW) {
+ } else if (screenTimeout < SCREEN_TIMEOUT_LOW) {
if (currentMode == CM_MODE_15_60_300) {
- screentimeout = SCREEN_TIMEOUT_NORMAL;
+ screenTimeout = SCREEN_TIMEOUT_NORMAL;
} else {
- screentimeout = SCREEN_TIMEOUT_LOW;
+ screenTimeout = SCREEN_TIMEOUT_LOW;
}
- } else if (screentimeout < SCREEN_TIMEOUT_NORMAL) {
+ } else if (screenTimeout < SCREEN_TIMEOUT_NORMAL) {
if (currentMode == CM_MODE_15_60_300) {
- screentimeout = SCREEN_TIMEOUT_NORMAL;
+ screenTimeout = SCREEN_TIMEOUT_NORMAL;
} else {
- screentimeout = SCREEN_TIMEOUT_HIGH;
+ screenTimeout = SCREEN_TIMEOUT_HIGH;
}
- } else if (screentimeout < SCREEN_TIMEOUT_HIGH) {
+ } else if (screenTimeout < SCREEN_TIMEOUT_HIGH) {
if (currentMode == CM_MODE_15_60_300) {
- screentimeout = SCREEN_TIMEOUT_MAX;
+ screenTimeout = SCREEN_TIMEOUT_MAX;
} else {
- screentimeout = SCREEN_TIMEOUT_HIGH;
+ screenTimeout = SCREEN_TIMEOUT_HIGH;
}
- } else if (screentimeout < SCREEN_TIMEOUT_MAX) {
- screentimeout = SCREEN_TIMEOUT_MAX;
+ } else if (screenTimeout < SCREEN_TIMEOUT_MAX) {
+ screenTimeout = SCREEN_TIMEOUT_MAX;
} else if (currentMode == CM_MODE_30_120_300) {
- screentimeout = SCREEN_TIMEOUT_LOW;
+ screenTimeout = SCREEN_TIMEOUT_LOW;
} else {
- screentimeout = SCREEN_TIMEOUT_MIN;
+ screenTimeout = SCREEN_TIMEOUT_MIN;
}
Settings.System.putInt(
context.getContentResolver(),
- Settings.System.SCREEN_OFF_TIMEOUT, screentimeout);
-
- // create our toast
- if(TOAST == null) {
- TOAST = Toast.makeText(context, "", Toast.LENGTH_LONG);
- }
+ Settings.System.SCREEN_OFF_TIMEOUT, screenTimeout);
// cancel any previous toast
- TOAST.cancel();
+ if (mToast != null) {
+ mToast.cancel();
+ }
// inform users of how long the timeout is now
- TOAST.setText("Screen timeout set to: " + timeoutToString(screentimeout));
- TOAST.setGravity(Gravity.CENTER, TOAST.getXOffset() / 2, TOAST.getYOffset() / 2);
- TOAST.show();
+ mToast = Toast.makeText(context, "Screen timeout set to: " + timeoutToString(screenTimeout),
+ Toast.LENGTH_LONG);
+ mToast.setGravity(Gravity.CENTER, mToast.getXOffset() / 2, mToast.getYOffset() / 2);
+ mToast.show();
}
@Override
@@ -121,7 +119,7 @@ public class ScreenTimeoutButton extends PowerButton {
return true;
}
- private static int getScreenTtimeout(Context context) {
+ private static int getScreenTimeout(Context context) {
return Settings.System.getInt(
context.getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java
index 81167c2..ffb5877 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/powerwidget/SyncButton.java
@@ -92,7 +92,7 @@ public class SyncButton extends PowerButton {
private static boolean getBackgroundDataState(Context context) {
ConnectivityManager connManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
return connManager.getBackgroundDataSetting();
}