Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +136 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import android.graphics.drawable.Drawable; import android.inputmethodservice.InputMethodService; import android.os.Handler; import android.os.IBinder; import android.os.IPowerManager; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; Loading @@ -63,9 +64,11 @@ import android.util.Pair; import android.util.Slog; import android.view.Display; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewPropertyAnimator; Loading Loading @@ -134,6 +137,10 @@ public class PhoneStatusBar extends BaseStatusBar { private static final int NOTIFICATION_PRIORITY_MULTIPLIER = 10; // see NotificationManagerService private static final int HIDE_ICONS_BELOW_SCORE = Notification.PRIORITY_LOW * NOTIFICATION_PRIORITY_MULTIPLIER; private static final float BRIGHTNESS_CONTROL_PADDING = 0.15f; private static final int BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT = 750; // ms private static final int BRIGHTNESS_CONTROL_LINGER_THRESHOLD = 20; // fling gesture tuning parameters, scaled to display density private float mSelfExpandVelocityPx; // classic value: 2000px/s private float mSelfCollapseVelocityPx; // classic value: 2000px/s (will be negated to collapse "up") Loading Loading @@ -280,6 +287,13 @@ public class PhoneStatusBar extends BaseStatusBar { CustomTheme mCurrentTheme; private boolean mRecreating = false; private boolean mBrightnessControl = true; private float mScreenWidth; private int mMinBrightness; int mLinger; int mInitialTouchX; int mInitialTouchY; // for disabling the status bar int mDisabled = 0; Loading @@ -305,6 +319,45 @@ public class PhoneStatusBar extends BaseStatusBar { } }; Runnable mLongPressBrightnessChange = new Runnable() { @Override public void run() { mStatusBarView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); adjustBrightness(mInitialTouchX); mLinger = BRIGHTNESS_CONTROL_LINGER_THRESHOLD + 1; } }; class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.STATUS_BAR_BRIGHTNESS_CONTROL), false, this); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_BRIGHTNESS_MODE), false, this); update(); } @Override public void onChange(boolean selfChange) { update(); } public void update() { ContentResolver resolver = mContext.getContentResolver(); boolean autoBrightness = Settings.System.getInt( resolver, Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; mBrightnessControl = !autoBrightness && Settings.System.getInt( resolver, Settings.System.STATUS_BAR_BRIGHTNESS_CONTROL, 0) == 1; } } // ensure quick settings is disabled until the current user makes it through the setup wizard private boolean mUserSetup = false; private final ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) { Loading Loading @@ -351,6 +404,9 @@ public class PhoneStatusBar extends BaseStatusBar { if (ENABLE_INTRUDERS) addIntruderView(); SettingsObserver observer = new SettingsObserver(mHandler); observer.observe(); // Lastly, call to the icon policy to install/update all the icons. mIconPolicy = new PhoneStatusBarPolicy(mContext); } Loading @@ -363,6 +419,10 @@ public class PhoneStatusBar extends BaseStatusBar { Resources res = context.getResources(); mScreenWidth = (float) context.getResources().getDisplayMetrics().widthPixels; mMinBrightness = context.getResources().getInteger( com.android.internal.R.integer.config_screenBrightnessDim); updateDisplaySize(); // populates mDisplayMetrics loadDimens(); Loading Loading @@ -671,6 +731,8 @@ public class PhoneStatusBar extends BaseStatusBar { mPowerWidget.setupWidget(); mPowerWidget.updateVisibility(); mVelocityTracker = VelocityTracker.obtain(); return mStatusBarView; } Loading Loading @@ -1823,6 +1885,78 @@ public class PhoneStatusBar extends BaseStatusBar { animateExpandNotificationsPanel(); } private void adjustBrightness(int x) { float raw = ((float) x) / mScreenWidth; // Add a padding to the brightness control on both sides to // make it easier to reach min/max brightness float padded = Math.min(1.0f - BRIGHTNESS_CONTROL_PADDING, Math.max(BRIGHTNESS_CONTROL_PADDING, raw)); float value = (padded - BRIGHTNESS_CONTROL_PADDING) / (1 - (2.0f * BRIGHTNESS_CONTROL_PADDING)); int newBrightness = mMinBrightness + (int) Math.round(value * (android.os.PowerManager.BRIGHTNESS_ON - mMinBrightness)); newBrightness = Math.min(newBrightness, android.os.PowerManager.BRIGHTNESS_ON); newBrightness = Math.max(newBrightness, mMinBrightness); try { IPowerManager power = IPowerManager.Stub.asInterface( ServiceManager.getService("power")); if (power != null) { power.setTemporaryScreenBrightnessSettingOverride(newBrightness); Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, newBrightness); } } catch (RemoteException e) { Slog.w(TAG, "Setting Brightness failed: " + e); } } private void brightnessControl(MotionEvent event) { if (mBrightnessControl) { final int action = event.getAction(); final int x = (int)event.getRawX(); final int y = (int)event.getRawY(); if (action == MotionEvent.ACTION_DOWN) { mLinger = 0; mInitialTouchX = x; mInitialTouchY = y; mHandler.removeCallbacks(mLongPressBrightnessChange); if ((y + mViewDelta) < mNotificationHeaderHeight) { mHandler.postDelayed(mLongPressBrightnessChange, BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT); } } else if (action == MotionEvent.ACTION_MOVE) { if ((y + mViewDelta) < mNotificationHeaderHeight) { mVelocityTracker.computeCurrentVelocity(1000); float yVel = mVelocityTracker.getYVelocity(); yVel = Math.abs(yVel); if (yVel < 50.0f) { if (mLinger > BRIGHTNESS_CONTROL_LINGER_THRESHOLD) { adjustBrightness(x); } else { mLinger++; } } int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); if (Math.abs(x - mInitialTouchX) > touchSlop || Math.abs(y - mInitialTouchY) > touchSlop) { mHandler.removeCallbacks(mLongPressBrightnessChange); } } else { mHandler.removeCallbacks(mLongPressBrightnessChange); } } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { mHandler.removeCallbacks(mLongPressBrightnessChange); mLinger = 0; } } } public boolean interceptTouchEvent(MotionEvent event) { if (SPEW) { Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled=" Loading @@ -1840,6 +1974,8 @@ public class PhoneStatusBar extends BaseStatusBar { mGestureRec.add(event); } brightnessControl(event); // Cling (first-run help) handling. // The cling is supposed to show the first time you drag, or even tap, the status bar. // It should show the notification panel, then fade in after half a second, giving you Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +136 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import android.graphics.drawable.Drawable; import android.inputmethodservice.InputMethodService; import android.os.Handler; import android.os.IBinder; import android.os.IPowerManager; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; Loading @@ -63,9 +64,11 @@ import android.util.Pair; import android.util.Slog; import android.view.Display; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewPropertyAnimator; Loading Loading @@ -134,6 +137,10 @@ public class PhoneStatusBar extends BaseStatusBar { private static final int NOTIFICATION_PRIORITY_MULTIPLIER = 10; // see NotificationManagerService private static final int HIDE_ICONS_BELOW_SCORE = Notification.PRIORITY_LOW * NOTIFICATION_PRIORITY_MULTIPLIER; private static final float BRIGHTNESS_CONTROL_PADDING = 0.15f; private static final int BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT = 750; // ms private static final int BRIGHTNESS_CONTROL_LINGER_THRESHOLD = 20; // fling gesture tuning parameters, scaled to display density private float mSelfExpandVelocityPx; // classic value: 2000px/s private float mSelfCollapseVelocityPx; // classic value: 2000px/s (will be negated to collapse "up") Loading Loading @@ -280,6 +287,13 @@ public class PhoneStatusBar extends BaseStatusBar { CustomTheme mCurrentTheme; private boolean mRecreating = false; private boolean mBrightnessControl = true; private float mScreenWidth; private int mMinBrightness; int mLinger; int mInitialTouchX; int mInitialTouchY; // for disabling the status bar int mDisabled = 0; Loading @@ -305,6 +319,45 @@ public class PhoneStatusBar extends BaseStatusBar { } }; Runnable mLongPressBrightnessChange = new Runnable() { @Override public void run() { mStatusBarView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); adjustBrightness(mInitialTouchX); mLinger = BRIGHTNESS_CONTROL_LINGER_THRESHOLD + 1; } }; class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.STATUS_BAR_BRIGHTNESS_CONTROL), false, this); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_BRIGHTNESS_MODE), false, this); update(); } @Override public void onChange(boolean selfChange) { update(); } public void update() { ContentResolver resolver = mContext.getContentResolver(); boolean autoBrightness = Settings.System.getInt( resolver, Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; mBrightnessControl = !autoBrightness && Settings.System.getInt( resolver, Settings.System.STATUS_BAR_BRIGHTNESS_CONTROL, 0) == 1; } } // ensure quick settings is disabled until the current user makes it through the setup wizard private boolean mUserSetup = false; private final ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) { Loading Loading @@ -351,6 +404,9 @@ public class PhoneStatusBar extends BaseStatusBar { if (ENABLE_INTRUDERS) addIntruderView(); SettingsObserver observer = new SettingsObserver(mHandler); observer.observe(); // Lastly, call to the icon policy to install/update all the icons. mIconPolicy = new PhoneStatusBarPolicy(mContext); } Loading @@ -363,6 +419,10 @@ public class PhoneStatusBar extends BaseStatusBar { Resources res = context.getResources(); mScreenWidth = (float) context.getResources().getDisplayMetrics().widthPixels; mMinBrightness = context.getResources().getInteger( com.android.internal.R.integer.config_screenBrightnessDim); updateDisplaySize(); // populates mDisplayMetrics loadDimens(); Loading Loading @@ -671,6 +731,8 @@ public class PhoneStatusBar extends BaseStatusBar { mPowerWidget.setupWidget(); mPowerWidget.updateVisibility(); mVelocityTracker = VelocityTracker.obtain(); return mStatusBarView; } Loading Loading @@ -1823,6 +1885,78 @@ public class PhoneStatusBar extends BaseStatusBar { animateExpandNotificationsPanel(); } private void adjustBrightness(int x) { float raw = ((float) x) / mScreenWidth; // Add a padding to the brightness control on both sides to // make it easier to reach min/max brightness float padded = Math.min(1.0f - BRIGHTNESS_CONTROL_PADDING, Math.max(BRIGHTNESS_CONTROL_PADDING, raw)); float value = (padded - BRIGHTNESS_CONTROL_PADDING) / (1 - (2.0f * BRIGHTNESS_CONTROL_PADDING)); int newBrightness = mMinBrightness + (int) Math.round(value * (android.os.PowerManager.BRIGHTNESS_ON - mMinBrightness)); newBrightness = Math.min(newBrightness, android.os.PowerManager.BRIGHTNESS_ON); newBrightness = Math.max(newBrightness, mMinBrightness); try { IPowerManager power = IPowerManager.Stub.asInterface( ServiceManager.getService("power")); if (power != null) { power.setTemporaryScreenBrightnessSettingOverride(newBrightness); Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, newBrightness); } } catch (RemoteException e) { Slog.w(TAG, "Setting Brightness failed: " + e); } } private void brightnessControl(MotionEvent event) { if (mBrightnessControl) { final int action = event.getAction(); final int x = (int)event.getRawX(); final int y = (int)event.getRawY(); if (action == MotionEvent.ACTION_DOWN) { mLinger = 0; mInitialTouchX = x; mInitialTouchY = y; mHandler.removeCallbacks(mLongPressBrightnessChange); if ((y + mViewDelta) < mNotificationHeaderHeight) { mHandler.postDelayed(mLongPressBrightnessChange, BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT); } } else if (action == MotionEvent.ACTION_MOVE) { if ((y + mViewDelta) < mNotificationHeaderHeight) { mVelocityTracker.computeCurrentVelocity(1000); float yVel = mVelocityTracker.getYVelocity(); yVel = Math.abs(yVel); if (yVel < 50.0f) { if (mLinger > BRIGHTNESS_CONTROL_LINGER_THRESHOLD) { adjustBrightness(x); } else { mLinger++; } } int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); if (Math.abs(x - mInitialTouchX) > touchSlop || Math.abs(y - mInitialTouchY) > touchSlop) { mHandler.removeCallbacks(mLongPressBrightnessChange); } } else { mHandler.removeCallbacks(mLongPressBrightnessChange); } } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { mHandler.removeCallbacks(mLongPressBrightnessChange); mLinger = 0; } } } public boolean interceptTouchEvent(MotionEvent event) { if (SPEW) { Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled=" Loading @@ -1840,6 +1974,8 @@ public class PhoneStatusBar extends BaseStatusBar { mGestureRec.add(event); } brightnessControl(event); // Cling (first-run help) handling. // The cling is supposed to show the first time you drag, or even tap, the status bar. // It should show the notification panel, then fade in after half a second, giving you Loading