Merge "Implement new SYSTEM_UI_FLAG_IMMERSIVE_STICKY." into klp-dev

This commit is contained in:
John Spurlock
2013-10-14 17:21:33 +00:00
committed by Android (Google) Code Review
19 changed files with 81 additions and 267 deletions

View File

@ -4379,7 +4379,7 @@ public final class Settings {
public static final String BAR_SERVICE_COMPONENT = "bar_service_component";
/** @hide */
public static final String TRANSIENT_NAV_CONFIRMATIONS = "transient_nav_confirmations";
public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations";
/**
* This is the query URI for finding a print service to install.

View File

@ -75,9 +75,6 @@ public class Toast {
*/
public static final int LENGTH_LONG = 1;
/** @hide */
public static final int LENGTH_INFINITE = 2;
final Context mContext;
final TN mTN;
int mDuration;
@ -294,61 +291,6 @@ public class Toast {
tv.setText(s);
}
/** @hide */
public static Toast makeBar(Context context, int resId, int duration) {
return makeBar(context, context.getResources().getText(resId), duration);
}
/** @hide */
public static Toast makeBar(Context context, CharSequence text, int duration) {
Toast result = new Toast(context);
LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.toast_bar, null);
((TextView)v.findViewById(android.R.id.message)).setText(text);
v.findViewById(android.R.id.button1).setVisibility(View.GONE);
result.mNextView = v;
result.mDuration = duration;
result.mTN.mParams.alpha = 0.9f;
result.mTN.mParams.windowAnimations = com.android.internal.R.style.Animation_ToastBar;
return result;
}
/** @hide */
public Toast setAction(int resId, Runnable action) {
return setAction(mContext.getResources().getText(resId), action);
}
/** @hide */
public Toast setAction(CharSequence actionText, final Runnable action) {
if (mNextView != null) {
TextView text1 = (TextView)mNextView.findViewById(android.R.id.text1);
View button1 = mNextView.findViewById(android.R.id.button1);
if (text1 != null && button1 != null) {
text1.setText(actionText);
button1.setVisibility(View.VISIBLE);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (action != null) {
action.run();
}
}});
return setInteractive(true);
}
}
throw new RuntimeException("This Toast was not created with Toast.makeBar()");
}
/** @hide */
public Toast setInteractive(boolean interactive) {
mTN.setInteractive(interactive);
return this;
}
// =======================================================================================
// All the gunk below is the interaction with the Notification Service, which handles
// the proper ordering of these system-wide.
@ -405,16 +347,9 @@ public class Toast {
params.windowAnimations = com.android.internal.R.style.Animation_Toast;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
params.setTitle("Toast");
setInteractive(false);
}
private void setInteractive(boolean interactive) {
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| (interactive
? (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH)
: WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
}
/**

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright 2013, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromYDelta="10%" android:toYDelta="0"
android:interpolator="@interpolator/decelerate_quint"
android:duration="@android:integer/config_shortAnimTime"/>
<alpha android:fromAlpha="0.5" android:toAlpha="1.0"
android:interpolator="@interpolator/decelerate_cubic"
android:duration="@android:integer/config_shortAnimTime" />
</set>

View File

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright 2013, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromYDelta="0" android:toYDelta="10%"
android:interpolator="@interpolator/accelerate_quint"
android:duration="@android:integer/config_shortAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:interpolator="@interpolator/accelerate_cubic"
android:duration="@android:integer/config_shortAnimTime"/>
</set>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 814 B

View File

@ -44,7 +44,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/transient_navigation_confirmation"
android:text="@string/immersive_mode_confirmation"
android:textColor="#80000000"
android:textSize="16sp"
/>

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:background="@drawable/toast_bar_bg"
android:layout_height="50dp"
android:layout_width="match_parent">
<TextView
android:id="@android:id/message"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="@android:color/white"
android:textSize="14sp" />
<LinearLayout
android:id="@android:id/button1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground"
android:clickable="true">
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginRight="12dp"
android:layout_marginTop="10dp"
android:background="#aaaaaa" />
<TextView
android:id="@android:id/text1"
android:textSize="12sp"
android:textColor="#aaaaaa"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingLeft="8dp"
android:paddingRight="20dp"
android:textAllCaps="true" />
</LinearLayout>
</LinearLayout>
</FrameLayout>

View File

@ -61,6 +61,6 @@
Landscape's layout allows this to be smaller than for portrait. -->
<dimen name="kg_squashed_layout_threshold">400dp</dimen>
<!-- width of TransientNavigationConfirmation (-1 for match_parent) -->
<!-- width of ImmersiveModeConfirmation (-1 for match_parent) -->
<dimen name="immersive_mode_cling_width">380dp</dimen>
</resources>

View File

@ -113,6 +113,6 @@
<!-- Margin around the various security views -->
<dimen name="keyguard_muliuser_selector_margin">12dp</dimen>
<!-- width of TransientNavigationConfirmation (-1 for match_parent) -->
<!-- width of ImmersiveModeConfirmation (-1 for match_parent) -->
<dimen name="immersive_mode_cling_width">380dp</dimen>
</resources>

View File

@ -1259,8 +1259,8 @@
</string-array>
<!-- Threshold (in ms) under which a screen off / screen on will be considered a reset of the
transient navigation confirmation prompt.-->
<integer name="config_transient_navigation_confirmation_panic">5000</integer>
immersive mode confirmation prompt.-->
<integer name="config_immersive_mode_confirmation_panic">5000</integer>
<!-- For some operators, PDU has garbages. To fix it, need to use valid index -->
<integer name="config_valid_wappush_index">-1</integer>

View File

@ -356,6 +356,6 @@
<!-- Outline width for video subtitles. -->
<dimen name="subtitle_outline_width">2dp</dimen>
<!-- width of TransientNavigationConfirmation (-1 for match_parent) -->
<!-- width of ImmersiveModeConfirmation (-1 for match_parent) -->
<dimen name="immersive_mode_cling_width">-1px</dimen>
</resources>

View File

@ -4486,7 +4486,7 @@
<!-- PIN entry dialog tells the user to not enter a PIN for a while. [CHAR LIMIT=none] -->
<string name="restr_pin_try_later">Try again later</string>
<!-- Cling help message when hiding the transient navigation bar [CHAR LIMIT=none] -->
<string name="transient_navigation_confirmation">Swipe down from the top to exit full screen.</string>
<!-- Cling help message when hiding the navigation bar entering immersive mode [CHAR LIMIT=none] -->
<string name="immersive_mode_confirmation" msgid="8554991488096662508">Swipe down from the top to exit full screen.</string>
</resources>

View File

@ -138,12 +138,6 @@ please see styles_device_defaults.xml.
<item name="windowExitAnimation">@anim/submenu_exit</item>
</style>
<!-- {@hide} -->
<style name="Animation.ToastBar">
<item name="windowEnterAnimation">@anim/toast_bar_enter</item>
<item name="windowExitAnimation">@anim/toast_bar_exit</item>
</style>
<style name="Animation.TypingFilter">
<item name="windowEnterAnimation">@anim/grow_fade_in_center</item>
<item name="windowExitAnimation">@anim/shrink_fade_out_center</item>

View File

@ -292,6 +292,7 @@
<java-symbol type="integer" name="config_cursorWindowSize" />
<java-symbol type="integer" name="config_extraFreeKbytesAdjust" />
<java-symbol type="integer" name="config_extraFreeKbytesAbsolute" />
<java-symbol type="integer" name="config_immersive_mode_confirmation_panic" />
<java-symbol type="integer" name="config_longPressOnPowerBehavior" />
<java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" />
<java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" />
@ -302,7 +303,6 @@
<java-symbol type="integer" name="config_ntpThreshold" />
<java-symbol type="integer" name="config_ntpTimeout" />
<java-symbol type="integer" name="config_toastDefaultGravity" />
<java-symbol type="integer" name="config_transient_navigation_confirmation_panic" />
<java-symbol type="integer" name="config_wifi_framework_scan_interval" />
<java-symbol type="integer" name="config_wifi_supplicant_scan_interval" />
<java-symbol type="integer" name="config_wifi_scan_interval_p2p_connected" />
@ -1083,7 +1083,6 @@
<java-symbol type="drawable" name="text_select_handle_left" />
<java-symbol type="drawable" name="text_select_handle_middle" />
<java-symbol type="drawable" name="text_select_handle_right" />
<java-symbol type="drawable" name="toast_bar_bg" />
<java-symbol type="drawable" name="unknown_image" />
<java-symbol type="drawable" name="unlock_default" />
<java-symbol type="drawable" name="unlock_halo" />
@ -1175,7 +1174,6 @@
<java-symbol type="layout" name="textview_hint" />
<java-symbol type="layout" name="time_picker" />
<java-symbol type="layout" name="time_picker_dialog" />
<java-symbol type="layout" name="toast_bar" />
<java-symbol type="layout" name="transient_notification" />
<java-symbol type="layout" name="volume_adjust" />
<java-symbol type="layout" name="volume_adjust_item" />
@ -1202,7 +1200,7 @@
<java-symbol type="layout" name="app_not_authorized" />
<java-symbol type="layout" name="restrictions_pin_challenge" />
<java-symbol type="layout" name="restrictions_pin_setup" />
<java-symbol type="layout" name="transient_navigation_cling" />
<java-symbol type="layout" name="immersive_mode_cling" />
<java-symbol type="anim" name="slide_in_child_bottom" />
<java-symbol type="anim" name="slide_in_right" />
@ -1232,7 +1230,6 @@
<java-symbol type="style" name="Animation.DropDownUp" />
<java-symbol type="style" name="Animation.DropDownDown" />
<java-symbol type="style" name="Animation.PopupWindow" />
<java-symbol type="style" name="Animation.ToastBar" />
<java-symbol type="style" name="Animation.TypingFilter" />
<java-symbol type="style" name="Animation.TypingFilterRestore" />
<java-symbol type="style" name="Animation.Dream" />

View File

@ -49,11 +49,11 @@ import com.android.internal.R;
import java.util.Arrays;
/**
* Helper to manage showing/hiding a confirmation prompt when the transient navigation bar
* is hidden.
* Helper to manage showing/hiding a confirmation prompt when the navigation bar is hidden
* entering immersive mode.
*/
public class TransientNavigationConfirmation {
private static final String TAG = "TransientNavigationConfirmation";
public class ImmersiveModeConfirmation {
private static final String TAG = "ImmersiveModeConfirmation";
private static final boolean DEBUG = false;
private static final boolean DEBUG_SHOW_EVERY_TIME = false; // super annoying, use with caution
@ -70,12 +70,12 @@ public class TransientNavigationConfirmation {
private String mPanicPackage;
private WindowManager mWindowManager;
public TransientNavigationConfirmation(Context context) {
public ImmersiveModeConfirmation(Context context) {
mContext = context;
mHandler = new H();
mShowDelayMs = getNavBarExitDuration() * 3;
mPanicThresholdMs = context.getResources()
.getInteger(R.integer.config_transient_navigation_confirmation_panic);
.getInteger(R.integer.config_immersive_mode_confirmation_panic);
mWindowManager = (WindowManager)
mContext.getSystemService(Context.WINDOW_SERVICE);
}
@ -91,7 +91,7 @@ public class TransientNavigationConfirmation {
String packages = null;
try {
packages = Settings.Secure.getStringForUser(mContext.getContentResolver(),
Settings.Secure.TRANSIENT_NAV_CONFIRMATIONS,
Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
UserHandle.USER_CURRENT);
if (packages != null) {
mConfirmedPackages.addAll(Arrays.asList(packages.split(",")));
@ -107,7 +107,7 @@ public class TransientNavigationConfirmation {
try {
final String packages = TextUtils.join(",", mConfirmedPackages);
Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.TRANSIENT_NAV_CONFIRMATIONS,
Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
packages,
UserHandle.USER_CURRENT);
if (DEBUG) Slog.d(TAG, "Saved packages=" + packages);
@ -116,12 +116,12 @@ public class TransientNavigationConfirmation {
}
}
public void transientNavigationChanged(String pkg, boolean isNavTransient) {
public void immersiveModeChanged(String pkg, boolean isImmersiveMode) {
if (pkg == null) {
return;
}
mHandler.removeMessages(H.SHOW);
if (isNavTransient) {
if (isImmersiveMode) {
mLastPackage = pkg;
if (DEBUG_SHOW_EVERY_TIME || !mConfirmedPackages.contains(pkg)) {
mHandler.sendMessageDelayed(mHandler.obtainMessage(H.SHOW, pkg), mShowDelayMs);
@ -132,13 +132,13 @@ public class TransientNavigationConfirmation {
}
}
public void onPowerKeyDown(boolean isScreenOn, long time, boolean transientNavigationAllowed) {
public void onPowerKeyDown(boolean isScreenOn, long time, boolean inImmersiveMode) {
if (mPanicPackage != null && !isScreenOn && (time - mPanicTime < mPanicThresholdMs)) {
// turning the screen back on within the panic threshold
unconfirmPackage(mPanicPackage);
}
if (isScreenOn && transientNavigationAllowed) {
// turning the screen off, remember if we were hiding the transient nav
if (isScreenOn && inImmersiveMode) {
// turning the screen off, remember if we were in immersive mode
mPanicTime = time;
mPanicPackage = mLastPackage;
} else {
@ -153,7 +153,7 @@ public class TransientNavigationConfirmation {
private void unconfirmPackage(String pkg) {
if (pkg != null) {
if (DEBUG) Slog.d(TAG, "Unconfirming transient navigation for " + pkg);
if (DEBUG) Slog.d(TAG, "Unconfirming immersive mode confirmation for " + pkg);
mConfirmedPackages.remove(pkg);
saveSetting();
}
@ -161,8 +161,7 @@ public class TransientNavigationConfirmation {
private void handleHide() {
if (mClingWindow != null) {
if (DEBUG) Slog.d(TAG,
"Hiding transient navigation confirmation for " + mPromptPackage);
if (DEBUG) Slog.d(TAG, "Hiding immersive mode confirmation for " + mPromptPackage);
mWindowManager.removeView(mClingWindow);
mClingWindow = null;
}
@ -179,7 +178,7 @@ public class TransientNavigationConfirmation {
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
,
PixelFormat.TRANSLUCENT);
lp.setTitle("TransientNavigationConfirmation");
lp.setTitle("ImmersiveModeConfirmation");
lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications;
lp.gravity = Gravity.FILL;
return lp;
@ -230,7 +229,7 @@ public class TransientNavigationConfirmation {
// create the confirmation cling
mClingLayout = (ViewGroup)
View.inflate(getContext(), R.layout.transient_navigation_cling, null);
View.inflate(getContext(), R.layout.immersive_mode_cling, null);
final Button ok = (Button) mClingLayout.findViewById(R.id.ok);
ok.setOnClickListener(new OnClickListener() {
@ -292,7 +291,7 @@ public class TransientNavigationConfirmation {
private void handleShow(String pkg) {
mPromptPackage = pkg;
if (DEBUG) Slog.d(TAG, "Showing transient navigation confirmation for " + pkg);
if (DEBUG) Slog.d(TAG, "Showing immersive mode confirmation for " + pkg);
mClingWindow = new ClingWindowView(mContext, confirmAction(pkg));
@ -311,7 +310,7 @@ public class TransientNavigationConfirmation {
@Override
public void run() {
if (pkg != null && !mConfirmedPackages.contains(pkg)) {
if (DEBUG) Slog.d(TAG, "Confirming transient navigation for " + pkg);
if (DEBUG) Slog.d(TAG, "Confirming immersive mode for " + pkg);
mConfirmedPackages.add(pkg);
saveSetting();
}

View File

@ -532,7 +532,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Settings.Secure.DEFAULT_INPUT_METHOD), false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.Secure.TRANSIENT_NAV_CONFIRMATIONS), false, this,
Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS), false, this,
UserHandle.USER_ALL);
updateSettings();
}
@ -570,7 +570,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
StatusBarManager.WINDOW_NAVIGATION_BAR,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
private TransientNavigationConfirmation mTransientNavigationConfirmation;
private ImmersiveModeConfirmation mImmersiveModeConfirmation;
private SystemGesturesPointerEventListener mSystemGestures;
@ -953,7 +953,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// no-op
}
});
mTransientNavigationConfirmation = new TransientNavigationConfirmation(mContext);
mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext);
mWindowManagerFuncs.registerPointerEventListener(mSystemGestures);
mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
@ -1169,8 +1169,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mHasSoftInput = hasSoftInput;
updateRotation = true;
}
if (mTransientNavigationConfirmation != null) {
mTransientNavigationConfirmation.loadSetting();
if (mImmersiveModeConfirmation != null) {
mImmersiveModeConfirmation.loadSetting();
}
}
if (updateRotation) {
@ -2699,15 +2699,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
final int sysui = mLastSystemUiFlags;
boolean navVisible = (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
boolean navTranslucent = (sysui & View.NAVIGATION_BAR_TRANSLUCENT) != 0;
boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
navTranslucent &= !transientAllowed; // transient trumps translucent
boolean immersive = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
boolean immersiveSticky = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0;
boolean navAllowedHidden = immersive || immersiveSticky;
navTranslucent &= !immersiveSticky; // transient trumps translucent
navTranslucent &= isTranslucentNavigationAllowed();
// When the navigation bar isn't visible, we put up a fake
// input window to catch all touch events. This way we can
// detect when the user presses anywhere to bring back the nav
// bar and ensure the application doesn't see the event.
if (navVisible || transientAllowed) {
if (navVisible || navAllowedHidden) {
if (mHideNavFakeWindow != null) {
mHideNavFakeWindow.dismiss();
mHideNavFakeWindow = null;
@ -3945,8 +3947,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case KeyEvent.KEYCODE_POWER: {
result &= ~ACTION_PASS_TO_USER;
if (down) {
mTransientNavigationConfirmation.onPowerKeyDown(isScreenOn, event.getDownTime(),
isTransientNavigationAllowed(mLastSystemUiFlags));
mImmersiveModeConfirmation.onPowerKeyDown(isScreenOn, event.getDownTime(),
isImmersiveMode(mLastSystemUiFlags));
if (isScreenOn && !mPowerKeyTriggered
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
mPowerKeyTriggered = true;
@ -4225,7 +4227,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if (sb) mStatusBarController.showTransient();
if (nb) mNavigationBarController.showTransient();
mTransientNavigationConfirmation.confirmCurrentPrompt();
mImmersiveModeConfirmation.confirmCurrentPrompt();
updateSystemUiVisibilityLw();
}
}
@ -5108,6 +5110,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.STATUS_BAR_TRANSLUCENT
| View.NAVIGATION_BAR_TRANSLUCENT;
vis = (vis & ~flags) | (oldVis & flags);
@ -5118,53 +5121,64 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
// update status bar
boolean transientAllowed =
(vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
boolean immersiveSticky =
(vis & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0;
boolean hideStatusBarWM =
mTopFullscreenOpaqueWindowState != null &&
(mTopFullscreenOpaqueWindowState.getAttrs().flags
& WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
boolean hideStatusBarSysui =
(vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;
boolean hideNavBarSysui =
(vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0;
boolean transientStatusBarAllowed =
mStatusBar != null && (
hideStatusBarWM
|| (hideStatusBarSysui && transientAllowed)
|| (hideStatusBarSysui && immersiveSticky)
|| statusBarHasFocus);
if (mStatusBarController.isTransientShowing()
&& !transientStatusBarAllowed && hideStatusBarSysui) {
boolean transientNavBarAllowed =
mNavigationBar != null &&
hideNavBarSysui && immersiveSticky;
boolean denyTransientStatus = mStatusBarController.isTransientShowing()
&& !transientStatusBarAllowed && hideStatusBarSysui;
boolean denyTransientNav = mNavigationBarController.isTransientShowing()
&& !transientNavBarAllowed;
if (denyTransientStatus || denyTransientNav) {
// clear the clearable flags instead
int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS;
if (newVal != mResettingSystemUiFlags) {
mResettingSystemUiFlags = newVal;
mWindowManagerFuncs.reevaluateStatusBarVisibility();
}
clearClearableFlagsLw();
}
vis = mStatusBarController.updateVisibilityLw(transientStatusBarAllowed, oldVis, vis);
// update navigation bar
boolean oldTransientNav = isTransientNavigationAllowed(oldVis);
boolean isTransientNav = isTransientNavigationAllowed(vis);
if (win != null && oldTransientNav != isTransientNav) {
boolean oldImmersiveMode = isImmersiveMode(oldVis);
boolean newImmersiveMode = isImmersiveMode(vis);
if (win != null && oldImmersiveMode != newImmersiveMode) {
final String pkg = win.getOwningPackage();
mTransientNavigationConfirmation.transientNavigationChanged(pkg, isTransientNav);
mImmersiveModeConfirmation.immersiveModeChanged(pkg, newImmersiveMode);
}
vis = mNavigationBarController.updateVisibilityLw(isTransientNav, oldVis, vis);
// don't send low profile updates if the system bars are hidden
if (mStatusBarController.isHidden() && mNavigationBarController.isHidden()) {
vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
vis = mNavigationBarController.updateVisibilityLw(transientNavBarAllowed, oldVis, vis);
return vis;
}
private boolean isTransientNavigationAllowed(int vis) {
private void clearClearableFlagsLw() {
int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS;
if (newVal != mResettingSystemUiFlags) {
mResettingSystemUiFlags = newVal;
mWindowManagerFuncs.reevaluateStatusBarVisibility();
}
}
private boolean isImmersiveMode(int vis) {
final int flags = View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
return mNavigationBar != null
&& (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0
&& (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
&& (vis & flags) != 0;
}
/**

View File

@ -1550,11 +1550,9 @@ public class NotificationManagerService extends INotificationManager.Stub
private void scheduleTimeoutLocked(ToastRecord r)
{
mHandler.removeCallbacksAndMessages(r);
if (r.duration != Toast.LENGTH_INFINITE) {
Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);
long delay = r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY;
mHandler.sendMessageDelayed(m, delay);
}
Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);
long delay = r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY;
mHandler.sendMessageDelayed(m, delay);
}
private void handleTimeout(ToastRecord record)