summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanesh M <daneshm90@gmail.com>2012-12-16 14:34:03 -0800
committerGerrit Code Review <gerrit@review.cyanogenmod.com>2012-12-16 14:34:03 -0800
commit385ad47ef699e05ad7450805b3f90db14761b64d (patch)
treeb8d0f367a5730b6fe30ecd7d8d078e8c9066a9f4
parent752d3871426b250739545fdaf8a799d8819bdf46 (diff)
parentb4c4c050cd8d4d9184e7bc86dfb421a4b66abd60 (diff)
downloadframeworks_base-385ad47ef699e05ad7450805b3f90db14761b64d.zip
frameworks_base-385ad47ef699e05ad7450805b3f90db14761b64d.tar.gz
frameworks_base-385ad47ef699e05ad7450805b3f90db14761b64d.tar.bz2
Merge "Status bar brightness control from CM10 (1/2)" into cm-10.1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java136
1 files changed, 136 insertions, 0 deletions
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 91a499a..afde7f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -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;
@@ -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;
@@ -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")
@@ -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;
@@ -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()) {
@@ -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);
}
@@ -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();
@@ -671,6 +731,8 @@ public class PhoneStatusBar extends BaseStatusBar {
mPowerWidget.setupWidget();
mPowerWidget.updateVisibility();
+ mVelocityTracker = VelocityTracker.obtain();
+
return mStatusBarView;
}
@@ -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="
@@ -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