diff options
| author | Danesh M <daneshm90@gmail.com> | 2012-12-16 14:34:03 -0800 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@review.cyanogenmod.com> | 2012-12-16 14:34:03 -0800 |
| commit | 385ad47ef699e05ad7450805b3f90db14761b64d (patch) | |
| tree | b8d0f367a5730b6fe30ecd7d8d078e8c9066a9f4 /packages/SystemUI/src | |
| parent | 752d3871426b250739545fdaf8a799d8819bdf46 (diff) | |
| parent | b4c4c050cd8d4d9184e7bc86dfb421a4b66abd60 (diff) | |
| download | frameworks_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
Diffstat (limited to 'packages/SystemUI/src')
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java | 136 |
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 |
