Skip to content

Commit

Permalink
Status bar brightness control
Browse files Browse the repository at this point in the history
  • Loading branch information
Danesh authored and rascarlo committed Nov 25, 2014
1 parent 4d7e3d9 commit acbbe06
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 4 deletions.
7 changes: 7 additions & 0 deletions core/java/android/provider/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -2035,6 +2035,13 @@ public static void setShowGTalkServiceStatusForUser(ContentResolver cr, boolean
*/
public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1;

/**
* Whether to control brightness from status bar
*
* @hide
*/
public static final String STATUS_BAR_BRIGHTNESS_CONTROL = "status_bar_brightness_control";

/**
* Control whether the process CPU usage meter should be shown.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
Expand Down Expand Up @@ -68,9 +69,11 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.IPowerManager;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
Expand All @@ -86,9 +89,12 @@
import android.view.HardwareCanvas;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewPropertyAnimator;
Expand Down Expand Up @@ -221,6 +227,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();

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;

public static final int FADE_KEYGUARD_START_DELAY = 100;
public static final int FADE_KEYGUARD_DURATION = 300;

Expand Down Expand Up @@ -341,6 +351,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
int[] mAbsPos = new int[2];
ArrayList<Runnable> mPostCollapseRunnables = new ArrayList<>();

private boolean mBrightnessControl;
private boolean mBrightnessChanged;
private float mScreenWidth;
private int mMinBrightness;
private boolean mJustPeeked;
int mLinger;
int mInitialTouchX;
int mInitialTouchY;

// for disabling the status bar
int mDisabled = 0;

Expand All @@ -356,6 +375,44 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

private int mNavigationIconHints = 0;

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 ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) {
Expand Down Expand Up @@ -580,6 +637,9 @@ public void start() {

addNavigationBar();

SettingsObserver observer = new SettingsObserver(mHandler);
observer.observe();

// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext, mCastController);
mSettingsObserver.onChange(false); // set up
Expand Down Expand Up @@ -613,6 +673,10 @@ protected PhoneStatusBarView makeStatusBarView() {

Resources res = context.getResources();

mScreenWidth = (float) context.getResources().getDisplayMetrics().widthPixels;
mMinBrightness = context.getResources().getInteger(
com.android.internal.R.integer.config_screenBrightnessDim);

updateDisplaySize(); // populates mDisplayMetrics
updateResources();

Expand Down Expand Up @@ -2415,6 +2479,76 @@ void makeExpandedInvisible() {
disable(mDisabledUnmodified, true /* animate */);
}

private void adjustBrightness(int x) {
mBrightnessChanged = true;
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) {
Log.w(TAG, "Setting Brightness failed: " + e);
}
}

private void brightnessControl(MotionEvent event) {
final int action = event.getAction();
final int x = (int) event.getRawX();
final int y = (int) event.getRawY();
if (action == MotionEvent.ACTION_DOWN) {
if (y < mStatusBarHeaderHeight) {
mLinger = 0;
mInitialTouchX = x;
mInitialTouchY = y;
mJustPeeked = true;
mHandler.removeCallbacks(mLongPressBrightnessChange);
mHandler.postDelayed(mLongPressBrightnessChange,
BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT);
}
} else if (action == MotionEvent.ACTION_MOVE) {
if (y < mStatusBarHeaderHeight && mJustPeeked) {
if (mLinger > BRIGHTNESS_CONTROL_LINGER_THRESHOLD) {
adjustBrightness(x);
} else {
final int xDiff = Math.abs(x - mInitialTouchX);
final int yDiff = Math.abs(y - mInitialTouchY);
final int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
if (xDiff > yDiff) {
mLinger++;
}
if (xDiff > touchSlop || yDiff > touchSlop) {
mHandler.removeCallbacks(mLongPressBrightnessChange);
}
}
} else {
if (y > mStatusBarHeaderHeight) {
mJustPeeked = false;
}
mHandler.removeCallbacks(mLongPressBrightnessChange);
}
} else if (action == MotionEvent.ACTION_UP
|| action == MotionEvent.ACTION_CANCEL) {
mHandler.removeCallbacks(mLongPressBrightnessChange);
}
}

public boolean interceptTouchEvent(MotionEvent event) {
if (DEBUG_GESTURES) {
if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
Expand All @@ -2440,16 +2574,29 @@ public boolean interceptTouchEvent(MotionEvent event) {
mGestureRec.add(event);
}

if (mBrightnessControl) {
brightnessControl(event);
if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
return true;
}
}

final boolean upOrCancel =
event.getAction() == MotionEvent.ACTION_UP ||
event.getAction() == MotionEvent.ACTION_CANCEL;
if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
final boolean upOrCancel =
event.getAction() == MotionEvent.ACTION_UP ||
event.getAction() == MotionEvent.ACTION_CANCEL;
if (upOrCancel && !mExpandedVisible) {
setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
} else {
setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
}
}
if (mBrightnessChanged && upOrCancel) {
mBrightnessChanged = false;
if (mJustPeeked && mExpandedVisible) {
mNotificationPanel.fling(10, false);
}
}
return false;
}

Expand Down Expand Up @@ -3239,7 +3386,6 @@ protected void loadDimens() {

mCarrierLabelHeight = res.getDimensionPixelSize(R.dimen.carrier_label_height);
mStatusBarHeaderHeight = res.getDimensionPixelSize(R.dimen.status_bar_header_height);

mNotificationPanelMinHeightFrac = res.getFraction(R.dimen.notification_panel_min_height_frac, 1, 1);
if (mNotificationPanelMinHeightFrac < 0f || mNotificationPanelMinHeightFrac > 1f) {
mNotificationPanelMinHeightFrac = 0f;
Expand Down

0 comments on commit acbbe06

Please sign in to comment.