Low profile mode ("lights out") for phone status bar.

Also changes NAVIGATION_HIDDEN to remove the hide animation,
hopefully reducing the number of jarring transitions when
apps want to enable super-ultra-full-screen mode.

Bug: 5052456
Bug: 5146960
Change-Id: I5f5ebb23add81243dc8861b65d8f15ca4d9ce0d2
This commit is contained in:
Daniel Sandler
2011-08-17 16:47:19 -04:00
parent e644b64783
commit e137a1ea99
3 changed files with 179 additions and 13 deletions

View File

@@ -23,12 +23,12 @@
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="#FF000000"
>
<FrameLayout android:id="@+id/rot0"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="#FF000000"
>
<LinearLayout
@@ -98,6 +98,51 @@
/>
</LinearLayout>
<!-- lights out layout to match exactly -->
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal"
android:id="@+id/lights_out"
android:visibility="gone"
>
<ImageView
android:layout_width="80dp"
android:layout_height="match_parent"
android:layout_marginLeft="40dp"
android:src="@drawable/ic_sysbar_lights_out_dot_small"
android:scaleType="center"
android:layout_weight="0"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="invisible"
/>
<ImageView
android:layout_width="80dp"
android:layout_height="match_parent"
android:src="@drawable/ic_sysbar_lights_out_dot_large"
android:scaleType="center"
android:layout_weight="0"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:visibility="invisible"
/>
<ImageView
android:layout_width="80dp"
android:layout_marginRight="40dp"
android:layout_height="match_parent"
android:src="@drawable/ic_sysbar_lights_out_dot_small"
android:scaleType="center"
android:layout_weight="0"
/>
</LinearLayout>
<View android:id="@+id/deadzone"
android:layout_height="@dimen/navigation_bar_deadzone_size"
android:layout_width="match_parent"
@@ -109,7 +154,6 @@
<FrameLayout android:id="@+id/rot90"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="#FF000000"
android:visibility="gone"
android:paddingTop="24dp"
>
@@ -131,6 +175,8 @@
systemui:keyCode="82"
android:layout_weight="0"
android:visibility="invisible"
android:contentDescription="@string/accessibility_menu"
systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
/>
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"
android:layout_height="80dp"
@@ -171,15 +217,56 @@
android:contentDescription="@string/accessibility_back"
systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
/>
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
<View
android:layout_height="40dp"
android:layout_width="match_parent"
android:src="@drawable/ic_sysbar_menu_land"
systemui:keyCode="82"
android:layout_weight="0"
android:visibility="invisible"
android:contentDescription="@string/accessibility_menu"
systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
/>
</LinearLayout>
<!-- lights out layout to match exactly -->
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/lights_out"
android:visibility="gone"
>
<ImageView
android:layout_height="80dp"
android:layout_marginTop="40dp"
android:layout_width="match_parent"
android:src="@drawable/ic_sysbar_lights_out_dot_small"
android:scaleType="center"
android:layout_weight="0"
/>
<View
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_weight="1"
android:visibility="invisible"
/>
<ImageView
android:layout_height="80dp"
android:layout_width="match_parent"
android:src="@drawable/ic_sysbar_lights_out_dot_large"
android:scaleType="center"
android:layout_weight="0"
/>
<View
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_weight="1"
android:visibility="invisible"
/>
<ImageView
android:layout_height="80dp"
android:layout_marginBottom="40dp"
android:layout_width="match_parent"
android:src="@drawable/ic_sysbar_lights_out_dot_small"
android:scaleType="center"
android:layout_weight="0"
/>
</LinearLayout>

View File

@@ -25,6 +25,7 @@ import android.content.res.Resources;
import android.os.ServiceManager;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.animation.AccelerateInterpolator;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -47,6 +48,8 @@ public class NavigationBarView extends LinearLayout {
final static boolean NAVBAR_ALWAYS_AT_RIGHT = true;
final static boolean ANIMATE_HIDE_TRANSITION = false; // turned off because it introduces unsightly delay when videos goes to full screen
protected IStatusBarService mBarService;
final Display mDisplay;
View mCurrentView = null;
@@ -56,7 +59,7 @@ public class NavigationBarView extends LinearLayout {
int mBarSize;
boolean mVertical;
boolean mHidden;
boolean mHidden, mLowProfile;
boolean mEnabled = true;
public View getRecentsButton() {
@@ -87,6 +90,65 @@ public class NavigationBarView extends LinearLayout {
mCurrentView.setVisibility(enable ? View.VISIBLE : View.INVISIBLE);
}
View.OnTouchListener mLightsOutListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// even though setting the systemUI visibility below will turn these views
// on, we need them to come up faster so that they can catch this motion
// event
setLowProfile(false, false);
try {
mBarService.setSystemUiVisibility(0);
} catch (android.os.RemoteException ex) {
}
}
return false;
}
};
public void setLowProfile(final boolean lightsOut) {
setLowProfile(lightsOut, true);
}
public void setLowProfile(final boolean lightsOut, final boolean animate) {
if (lightsOut == mLowProfile) return;
mLowProfile = lightsOut;
if (DEBUG) Slog.d(TAG, "setting lights " + (lightsOut?"out":"on"));
final View navButtons = mCurrentView.findViewById(R.id.nav_buttons);
final View lowLights = mCurrentView.findViewById(R.id.lights_out);
if (!animate) {
lowLights.setVisibility(View.GONE);
navButtons.setAlpha(1f);
} else {
navButtons.animate()
.alpha(lightsOut ? 0f : 1f)
.setDuration(lightsOut ? 600 : 200)
.start();
lowLights.setOnTouchListener(mLightsOutListener);
lowLights.setAlpha(0f);
lowLights.setVisibility(View.VISIBLE);
lowLights.animate()
.alpha(lightsOut ? 1f : 0f)
.setStartDelay(lightsOut ? 500 : 0)
.setDuration(lightsOut ? 1000 : 300)
.setInterpolator(new AccelerateInterpolator(2.0f))
.setListener(lightsOut ? null : new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator _a) {
lowLights.setVisibility(View.GONE);
}
})
.start();
}
}
public void setHidden(final boolean hide) {
if (hide == mHidden) return;
@@ -94,6 +156,14 @@ public class NavigationBarView extends LinearLayout {
Slog.d(TAG,
(hide ? "HIDING" : "SHOWING") + " navigation bar");
// bring up the lights no matter what
setLowProfile(false);
if (!ANIMATE_HIDE_TRANSITION) {
setVisibility(hide ? View.GONE : View.VISIBLE);
return;
}
float oldAlpha = mCurrentView.getAlpha();
if (DEBUG) {
Slog.d(TAG, "animating alpha: " + oldAlpha + " -> "
@@ -147,8 +217,10 @@ public class NavigationBarView extends LinearLayout {
@Override
public boolean onTouchEvent(MotionEvent ev) {
// immediately bring up the lights
setHidden(false);
try {
mBarService.setSystemUiVisibility(0);
} catch (android.os.RemoteException ex) {
}
return false; // pass it on
}

View File

@@ -1494,11 +1494,18 @@ public class PhoneStatusBar extends StatusBar {
@Override // CommandQueue
public void setSystemUiVisibility(int vis) {
if (vis != mSystemUiVisibility) {
final int old = mSystemUiVisibility;
final int diff = vis ^ old;
if (diff != 0) {
mSystemUiVisibility = vis;
if (0 != (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE)) {
animateCollapse();
if (0 != (diff & View.SYSTEM_UI_FLAG_LOW_PROFILE)) {
final boolean lightsOut = (0 != (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE));
if (lightsOut) {
animateCollapse();
}
mNavigationBarView.setLowProfile(lightsOut);
}
notifyUiVisibilityChanged();