diff options
author | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2013-02-13 14:24:59 +0000 |
---|---|---|
committer | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2013-02-15 00:30:09 +0000 |
commit | 4815d6e5a658bb1b301f7724c8e8fff6bc764bba (patch) | |
tree | 66f6e6484d239545197d73bcca8ad2505246c981 /packages/SystemUI/src/com/android/systemui/statusbar | |
parent | eaa7d1835c8691dd656fea99ae3d61b039ebe1b7 (diff) | |
parent | 763ef60466ac752a3031719fb86b08486c9946b1 (diff) | |
download | frameworks_base-4815d6e5a658bb1b301f7724c8e8fff6bc764bba.zip frameworks_base-4815d6e5a658bb1b301f7724c8e8fff6bc764bba.tar.gz frameworks_base-4815d6e5a658bb1b301f7724c8e8fff6bc764bba.tar.bz2 |
Merge commit 'android-4.2.2_r1' into mr1.1-staging
Conflicts:
core/java/android/os/Trace.java
core/java/android/widget/Toast.java
core/res/res/values-cs/strings.xml
core/res/res/values-el/strings.xml
core/res/res/values-iw/strings.xml
core/res/res/values/config.xml
core/res/res/values/symbols.xml
media/java/android/media/AudioService.java
packages/SystemUI/res/values-sv/strings.xml
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
policy/src/com/android/internal/policy/impl/keyguard/KeyguardMessageArea.java
policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java
policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
services/java/com/android/server/NotificationManagerService.java
services/java/com/android/server/power/ElectronBeam.java
Change-Id: I60b8ddf20a1d7bcf9dc7b1a4ed841aaa4d953294
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/statusbar')
7 files changed, 189 insertions, 22 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 19e8956..b46aa3d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -38,7 +38,7 @@ public class NotificationPanelView extends PanelView { private static final float STATUS_BAR_SWIPE_MOVE_PERCENTAGE = 0.2f; private Drawable mHandleBar; - private float mHandleBarHeight; + private int mHandleBarHeight; private View mHandleView; private int mFingers; private PhoneStatusBar mStatusBar; @@ -65,7 +65,7 @@ public class NotificationPanelView extends PanelView { Resources resources = getContext().getResources(); mHandleBar = resources.getDrawable(R.drawable.status_bar_close); - mHandleBarHeight = resources.getDimension(R.dimen.close_handle_height); + mHandleBarHeight = resources.getDimensionPixelSize(R.dimen.close_handle_height); mHandleView = findViewById(R.id.handle); setContentDescription(resources.getString(R.string.accessibility_desc_notification_shade)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 7035006..5d9c7bc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -16,6 +16,10 @@ package com.android.systemui.statusbar.phone; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Iterator; + import android.animation.ObjectAnimator; import android.animation.TimeAnimator; import android.animation.TimeAnimator.TimeListener; @@ -73,7 +77,93 @@ public class PanelView extends FrameLayout { private TimeAnimator mTimeAnimator; private ObjectAnimator mPeekAnimator; - private VelocityTracker mVelocityTracker; + private FlingTracker mVelocityTracker; + + /** + * A very simple low-pass velocity filter for motion events; not nearly as sophisticated as + * VelocityTracker but optimized for the kinds of gestures we expect to see in status bar + * panels. + */ + private static class FlingTracker { + static final boolean DEBUG = false; + final int MAX_EVENTS = 8; + final float DECAY = 0.75f; + ArrayDeque<MotionEventCopy> mEventBuf = new ArrayDeque<MotionEventCopy>(MAX_EVENTS); + float mVX, mVY = 0; + private static class MotionEventCopy { + public MotionEventCopy(float x2, float y2, long eventTime) { + this.x = x2; + this.y = y2; + this.t = eventTime; + } + public float x, y; + public long t; + } + public FlingTracker() { + } + public void addMovement(MotionEvent event) { + if (mEventBuf.size() == MAX_EVENTS) { + mEventBuf.remove(); + } + mEventBuf.add(new MotionEventCopy(event.getX(), event.getY(), event.getEventTime())); + } + public void computeCurrentVelocity(long timebase) { + if (FlingTracker.DEBUG) { + Slog.v("FlingTracker", "computing velocities for " + mEventBuf.size() + " events"); + } + mVX = mVY = 0; + MotionEventCopy last = null; + int i = 0; + float totalweight = 0f; + float weight = 10f; + for (final Iterator<MotionEventCopy> iter = mEventBuf.descendingIterator(); + iter.hasNext();) { + final MotionEventCopy event = iter.next(); + if (last != null) { + final float dt = (float) (event.t - last.t) / timebase; + final float dx = (event.x - last.x); + final float dy = (event.y - last.y); + if (FlingTracker.DEBUG) { + Slog.v("FlingTracker", String.format(" [%d] dx=%.1f dy=%.1f dt=%.0f vx=%.1f vy=%.1f", + i, + dx, dy, dt, + (dx/dt), + (dy/dt) + )); + } + mVX += weight * dx / dt; + mVY += weight * dy / dt; + totalweight += weight; + weight *= DECAY; + } + last = event; + i++; + } + mVX /= totalweight; + mVY /= totalweight; + + if (FlingTracker.DEBUG) { + Slog.v("FlingTracker", "computed: vx=" + mVX + " vy=" + mVY); + } + } + public float getXVelocity() { + return mVX; + } + public float getYVelocity() { + return mVY; + } + public void recycle() { + mEventBuf.clear(); + } + + static FlingTracker sTracker; + static FlingTracker obtain() { + if (sTracker == null) { + sTracker = new FlingTracker(); + } + return sTracker; + } + } private int[] mAbsPos = new int[2]; PanelBar mBar; @@ -268,7 +358,7 @@ public class PanelView extends FrameLayout { mHandleView.setPressed(true); postInvalidate(); // catch the press state change mInitialTouchY = y; - mVelocityTracker = VelocityTracker.obtain(); + mVelocityTracker = FlingTracker.obtain(); trackMovement(event); mTimeAnimator.cancel(); // end any outstanding animations mBar.onTrackingStarted(PanelView.this); 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 b7116b8..58d41ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -376,7 +376,7 @@ public class PhoneStatusBar extends BaseStatusBar { if (MULTIUSER_DEBUG) Slog.d(TAG, String.format("User setup changed: " + "selfChange=%s userSetup=%s mUserSetup=%s", selfChange, userSetup, mUserSetup)); - if (mSettingsButton != null && !mHasSettingsPanel) { + if (mSettingsButton != null && mHasFlipSettings) { mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE); } if (mSettingsPanel != null) { @@ -1655,6 +1655,9 @@ public class PhoneStatusBar extends BaseStatusBar { return; } + // Settings are not available in setup + if (!mUserSetup) return; + if (mHasFlipSettings) { mNotificationPanel.expand(); if (mFlipSettingsView.getVisibility() != View.VISIBLE) { @@ -1668,6 +1671,9 @@ public class PhoneStatusBar extends BaseStatusBar { } public void switchToSettings() { + // Settings are not available in setup + if (!mUserSetup) return; + mFlipSettingsView.setScaleX(1f); mFlipSettingsView.setVisibility(View.VISIBLE); mSettingsButton.setVisibility(View.GONE); @@ -1724,6 +1730,9 @@ public class PhoneStatusBar extends BaseStatusBar { } public void flipToSettings() { + // Settings are not available in setup + if (!mUserSetup) return; + if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); if (mScrollViewAnim != null) mScrollViewAnim.cancel(); if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java index 4fb732a..9e22567 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -55,6 +55,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LevelListDrawable; import android.hardware.display.DisplayManager; import android.hardware.display.WifiDisplayStatus; +import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.os.Handler; import android.os.RemoteException; @@ -85,6 +86,8 @@ class QuickSettings { private static final String TAG = "QuickSettings"; public static final boolean SHOW_IME_TILE = false; + public static final boolean LONG_PRESS_TOGGLES = true; + private Context mContext; private PanelBar mBar; private QuickSettingsModel mModel; @@ -94,6 +97,8 @@ class QuickSettings { private WifiDisplayStatus mWifiDisplayStatus; private PhoneStatusBar mStatusBarService; private BluetoothState mBluetoothState; + private BluetoothAdapter mBluetoothAdapter; + private WifiManager mWifiManager; private BrightnessController mBrightnessController; private BluetoothController mBluetoothController; @@ -131,6 +136,9 @@ class QuickSettings { mModel = new QuickSettingsModel(context); mWifiDisplayStatus = new WifiDisplayStatus(); mBluetoothState = new QuickSettingsModel.BluetoothState(); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + mHandler = new Handler(); Resources r = mContext.getResources(); @@ -297,8 +305,7 @@ class QuickSettings { (UserManager) mContext.getSystemService(Context.USER_SERVICE); if (um.getUsers(true).size() > 1) { try { - WindowManagerGlobal.getWindowManagerService().lockNow( - LockPatternUtils.USER_SWITCH_LOCK_OPTIONS); + WindowManagerGlobal.getWindowManagerService().lockNow(null); } catch (RemoteException e) { Log.e(TAG, "Couldn't show user switcher", e); } @@ -391,7 +398,7 @@ class QuickSettings { private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) { // Wi-fi - QuickSettingsTileView wifiTile = (QuickSettingsTileView) + final QuickSettingsTileView wifiTile = (QuickSettingsTileView) inflater.inflate(R.layout.quick_settings_tile, parent, false); wifiTile.setContent(R.layout.quick_settings_tile_wifi, inflater); wifiTile.setOnClickListener(new View.OnClickListener() { @@ -400,6 +407,30 @@ class QuickSettings { startSettingsActivity(android.provider.Settings.ACTION_WIFI_SETTINGS); } }); + if (LONG_PRESS_TOGGLES) { + wifiTile.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + final boolean enable = + (mWifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLED); + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... args) { + // Disable tethering if enabling Wifi + final int wifiApState = mWifiManager.getWifiApState(); + if (enable && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || + (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) { + mWifiManager.setWifiApEnabled(null, false); + } + + mWifiManager.setWifiEnabled(enable); + return null; + } + }.execute(); + wifiTile.setPressed(false); + return true; + }} ); + } mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() { @Override public void refreshView(QuickSettingsTileView view, State state) { @@ -415,7 +446,7 @@ class QuickSettings { }); parent.addView(wifiTile); - if (mModel.deviceSupportsTelephony()) { + if (mModel.deviceHasMobileData()) { // RSSI QuickSettingsTileView rssiTile = (QuickSettingsTileView) inflater.inflate(R.layout.quick_settings_tile, parent, false); @@ -538,7 +569,7 @@ class QuickSettings { // Bluetooth if (mModel.deviceSupportsBluetooth()) { - QuickSettingsTileView bluetoothTile = (QuickSettingsTileView) + final QuickSettingsTileView bluetoothTile = (QuickSettingsTileView) inflater.inflate(R.layout.quick_settings_tile, parent, false); bluetoothTile.setContent(R.layout.quick_settings_tile_bluetooth, inflater); bluetoothTile.setOnClickListener(new View.OnClickListener() { @@ -547,6 +578,19 @@ class QuickSettings { startSettingsActivity(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS); } }); + if (LONG_PRESS_TOGGLES) { + bluetoothTile.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (mBluetoothAdapter.isEnabled()) { + mBluetoothAdapter.disable(); + } else { + mBluetoothAdapter.enable(); + } + bluetoothTile.setPressed(false); + return true; + }}); + } mModel.addBluetoothTile(bluetoothTile, new QuickSettingsModel.RefreshCallback() { @Override public void refreshView(QuickSettingsTileView view, State state) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java index 4db5019..72938c4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java @@ -30,7 +30,9 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.drawable.Drawable; import android.hardware.display.WifiDisplayStatus; +import android.net.ConnectivityManager; import android.os.Handler; +import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.text.TextUtils; @@ -118,7 +120,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, public void startObserving() { final ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver( - Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED), false, this); + Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED), false, this, + UserHandle.USER_ALL); } } @@ -169,6 +172,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, private final BugreportObserver mBugreportObserver; private final BrightnessObserver mBrightnessObserver; + private final boolean mHasMobileData; + private QuickSettingsTileView mUserTile; private RefreshCallback mUserCallback; private UserState mUserState = new UserState(); @@ -247,6 +252,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, mBrightnessObserver = new BrightnessObserver(mHandler); mBrightnessObserver.startObserving(); + ConnectivityManager cm = (ConnectivityManager) + context.getSystemService(Context.CONNECTIVITY_SERVICE); + mHasMobileData = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); + IntentFilter alarmIntentFilter = new IntentFilter(); alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED); context.registerReceiver(mAlarmIntentReceiver, alarmIntentFilter); @@ -302,8 +311,15 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, mAlarmCallback.refreshView(mAlarmTile, mAlarmState); } void onNextAlarmChanged() { - mAlarmState.label = Settings.System.getString(mContext.getContentResolver(), - Settings.System.NEXT_ALARM_FORMATTED); + final String alarmText = Settings.System.getStringForUser(mContext.getContentResolver(), + Settings.System.NEXT_ALARM_FORMATTED, + UserHandle.USER_CURRENT); + mAlarmState.label = alarmText; + + // When switching users, this is the only clue we're going to get about whether the + // alarm is actually set, since we won't get the ACTION_ALARM_CHANGED broadcast + mAlarmState.enabled = ! TextUtils.isEmpty(alarmText); + mAlarmCallback.refreshView(mAlarmTile, mAlarmState); } @@ -401,22 +417,22 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, mWifiCallback.refreshView(mWifiTile, mWifiState); } + boolean deviceHasMobileData() { + return mHasMobileData; + } + // RSSI void addRSSITile(QuickSettingsTileView view, RefreshCallback cb) { mRSSITile = view; mRSSICallback = cb; mRSSICallback.refreshView(mRSSITile, mRSSIState); } - boolean deviceSupportsTelephony() { - PackageManager pm = mContext.getPackageManager(); - return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); - } // NetworkSignalChanged callback @Override public void onMobileDataSignalChanged( boolean enabled, int mobileSignalIconId, String signalContentDescription, int dataTypeIconId, String dataContentDescription, String enabledDesc) { - if (deviceSupportsTelephony()) { + if (deviceHasMobileData()) { // TODO: If view is in awaiting state, disable Resources r = mContext.getResources(); mRSSIState.signalIconId = enabled && (mobileSignalIconId > 0) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java index 40cd49e..a3a0ea8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java @@ -36,7 +36,7 @@ public class SettingsPanelView extends PanelView { private QuickSettingsContainerView mQSContainer; Drawable mHandleBar; - float mHandleBarHeight; + int mHandleBarHeight; View mHandleView; public SettingsPanelView(Context context, AttributeSet attrs) { @@ -51,7 +51,7 @@ public class SettingsPanelView extends PanelView { Resources resources = getContext().getResources(); mHandleBar = resources.getDrawable(R.drawable.status_bar_close); - mHandleBarHeight = resources.getDimension(R.dimen.close_handle_height); + mHandleBarHeight = resources.getDimensionPixelSize(R.dimen.close_handle_height); mHandleView = findViewById(R.id.handle); setContentDescription(resources.getString(R.string.accessibility_desc_quick_settings)); 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 cc071ee..2b7360c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -43,17 +43,18 @@ import com.android.internal.R; import java.text.SimpleDateFormat; import java.util.Calendar; +import java.util.Locale; import java.util.TimeZone; /** - * This widget display an analogic clock with two hands for hours and - * minutes. + * Digital clock for the status bar. */ public class Clock extends TextView implements OnClickListener, OnLongClickListener { private boolean mAttached; private Calendar mCalendar; private String mClockFormatString; private SimpleDateFormat mClockFormat; + private Locale mLocale; private static final int AM_PM_STYLE_NORMAL = 0; private static final int AM_PM_STYLE_SMALL = 1; @@ -115,6 +116,7 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + filter.addAction(Intent.ACTION_USER_SWITCHED); getContext().registerReceiver(mIntentReceiver, filter, null, getHandler()); } @@ -148,6 +150,12 @@ public class Clock extends TextView implements OnClickListener, OnLongClickListe if (mClockFormat != null) { mClockFormat.setTimeZone(mCalendar.getTimeZone()); } + } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) { + final Locale newLocale = getResources().getConfiguration().locale; + if (! newLocale.equals(mLocale)) { + mLocale = newLocale; + mClockFormatString = ""; // force refresh + } } updateClock(); } |