Update immersive cling visuals
Also enables the swipe from top gesture for revealing the navigation bar, even if the status bar is visible. Bug: 19282730 Change-Id: I7b562c2f0f00ff3f05b8b1e44657efe79b45f9c7
This commit is contained in:
27
core/res/res/drawable/ic_expand_more_48dp.xml
Normal file
27
core/res/res/drawable/ic_expand_more_48dp.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<!--
|
||||
Copyright (C) 2015 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.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48.0dp"
|
||||
android:height="48.0dp"
|
||||
android:viewportWidth="48.0"
|
||||
android:viewportHeight="48.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M33.17,17.17L24.0,26.34l-9.17,-9.17L12.0,20.0l12.0,12.0 12.0,-12.0z"/>
|
||||
<path
|
||||
android:pathData="M0 0h48v48H0z"
|
||||
android:fillColor="#00000000"/>
|
||||
</vector>
|
||||
26
core/res/res/drawable/immersive_cling_bg_circ.xml
Normal file
26
core/res/res/drawable/immersive_cling_bg_circ.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2015 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
|
||||
-->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval" >
|
||||
|
||||
<solid android:color="@color/white" />
|
||||
|
||||
<size
|
||||
android:height="56dp"
|
||||
android:width="56dp" />
|
||||
|
||||
</shape>
|
||||
26
core/res/res/drawable/immersive_cling_light_bg_circ.xml
Normal file
26
core/res/res/drawable/immersive_cling_light_bg_circ.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2015 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
|
||||
-->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval" >
|
||||
|
||||
<solid android:color="#80ffffff" />
|
||||
|
||||
<size
|
||||
android:height="76dp"
|
||||
android:width="76dp" />
|
||||
|
||||
</shape>
|
||||
@@ -13,55 +13,80 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="12dp"
|
||||
>
|
||||
<LinearLayout
|
||||
android:id="@+id/text"
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginTop="4dp"
|
||||
android:padding="1dp"
|
||||
>
|
||||
android:background="#ff009688"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingBottom="24dp">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/immersive_cling_chevron"
|
||||
android:layout_width="76dp"
|
||||
android:layout_height="76dp"
|
||||
android:layout_marginTop="-24dp"
|
||||
android:layout_centerHorizontal="true">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:src="@drawable/cling_arrow_up"
|
||||
/>
|
||||
<FrameLayout
|
||||
android:id="@+id/immersive_cling_back_bg_light"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="center"
|
||||
android:src="@drawable/immersive_cling_light_bg_circ" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/immersive_cling_back_bg"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="center"
|
||||
android:src="@drawable/immersive_cling_bg_circ" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="8dp"
|
||||
android:scaleType="center"
|
||||
android:src="@drawable/ic_expand_more_48dp"
|
||||
android:tint="#ff009688"/>
|
||||
</FrameLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/immersive_cling_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/cling_bg"
|
||||
android:paddingStart="14dp"
|
||||
android:paddingEnd="14dp"
|
||||
android:paddingTop="24dp"
|
||||
android:paddingBottom="24dp">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/immersive_mode_confirmation"
|
||||
android:textColor="#80000000"
|
||||
android:textSize="16sp"
|
||||
/>
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
android:layout_below="@id/immersive_cling_chevron"
|
||||
android:paddingEnd="48dp"
|
||||
android:paddingStart="48dp"
|
||||
android:paddingTop="40dp"
|
||||
android:text="@string/immersive_cling_title"
|
||||
android:textColor="@color/primary_text_default_material_light"
|
||||
android:textSize="24sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/immersive_cling_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/immersive_cling_title"
|
||||
android:paddingEnd="48dp"
|
||||
android:paddingStart="48dp"
|
||||
android:paddingTop="12.6dp"
|
||||
android:text="@string/immersive_cling_description"
|
||||
android:textColor="@color/primary_text_default_material_light"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/ok"
|
||||
android:layout_width="160sp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="right"
|
||||
android:layout_marginTop="18dp"
|
||||
android:gravity="center"
|
||||
android:text="@string/ok"
|
||||
android:background="@drawable/cling_button"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
android:id="@+id/ok"
|
||||
style="@style/Widget.Material.Button.Borderless"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_below="@+id/immersive_cling_description"
|
||||
android:layout_marginEnd="40dp"
|
||||
android:layout_marginTop="18dp"
|
||||
android:paddingEnd="8dp"
|
||||
android:paddingStart="8dp"
|
||||
android:text="@string/immersive_cling_positive"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -4983,8 +4983,14 @@
|
||||
<!-- 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 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>
|
||||
<!-- Cling help message title when hiding the navigation bar entering immersive mode [CHAR LIMIT=none] -->
|
||||
<string name="immersive_cling_title">Viewing full screen</string>
|
||||
|
||||
<!-- Cling help message description when hiding the navigation bar entering immersive mode [CHAR LIMIT=none] -->
|
||||
<string name="immersive_cling_description">To exit, swipe down from the top.</string>
|
||||
|
||||
<!-- Cling help message confirmation button when hiding the navigation bar entering immersive mode [CHAR LIMIT=30] -->
|
||||
<string name="immersive_cling_positive">Got it</string>
|
||||
|
||||
<!-- Label for button to confirm chosen date or time [CHAR LIMIT=30] -->
|
||||
<string name="done_label">Done</string>
|
||||
|
||||
@@ -237,6 +237,12 @@ please see styles_device_defaults.xml.
|
||||
<item name="windowExitAnimation">@anim/fade_out</item>
|
||||
</style>
|
||||
|
||||
<!-- Window animations used for immersive mode confirmation. -->
|
||||
<style name="Animation.ImmersiveModeConfirmation">
|
||||
<item name="windowEnterAnimation">@null</item>
|
||||
<item name="windowExitAnimation">@anim/fast_fade_out</item>
|
||||
</style>
|
||||
|
||||
<!-- Window animations for screen savers. {@hide} -->
|
||||
<style name="Animation.Dream">
|
||||
<item name="windowEnterAnimation">@anim/slow_fade_in</item>
|
||||
|
||||
@@ -2147,6 +2147,8 @@
|
||||
|
||||
<java-symbol type="integer" name="config_defaultNightMode" />
|
||||
|
||||
<java-symbol type="style" name="Animation.ImmersiveModeConfirmation" />
|
||||
|
||||
<java-symbol type="integer" name="config_screen_magnification_multi_tap_adjustment" />
|
||||
<java-symbol type="dimen" name="config_screen_magnification_scaling_threshold" />
|
||||
<java-symbol type="dimen" name="timepicker_selector_stroke"/>
|
||||
|
||||
@@ -40,6 +40,7 @@ import android.view.WindowManager;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.view.animation.Interpolator;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
@@ -170,7 +171,7 @@ public class ImmersiveModeConfirmation {
|
||||
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
WindowManager.LayoutParams.TYPE_TOAST,
|
||||
WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
|
||||
0
|
||||
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
|
||||
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||
@@ -179,8 +180,7 @@ public class ImmersiveModeConfirmation {
|
||||
PixelFormat.TRANSLUCENT);
|
||||
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
|
||||
lp.setTitle("ImmersiveModeConfirmation");
|
||||
lp.windowAnimations = com.android.internal.R.style.Animation_RecentApplications;
|
||||
lp.gravity = Gravity.FILL;
|
||||
lp.windowAnimations = com.android.internal.R.style.Animation_ImmersiveModeConfirmation;
|
||||
return lp;
|
||||
}
|
||||
|
||||
@@ -194,10 +194,12 @@ public class ImmersiveModeConfirmation {
|
||||
|
||||
private class ClingWindowView extends FrameLayout {
|
||||
private static final int BGCOLOR = 0x80000000;
|
||||
private static final int OFFSET_DP = 48;
|
||||
private static final int OFFSET_DP = 96;
|
||||
private static final int ANIMATION_DURATION = 250;
|
||||
|
||||
private final Runnable mConfirm;
|
||||
private final ColorDrawable mColor = new ColorDrawable(0);
|
||||
private final Interpolator mInterpolator;
|
||||
private ValueAnimator mColorAnim;
|
||||
private ViewGroup mClingLayout;
|
||||
|
||||
@@ -222,8 +224,10 @@ public class ImmersiveModeConfirmation {
|
||||
public ClingWindowView(Context context, Runnable confirm) {
|
||||
super(context);
|
||||
mConfirm = confirm;
|
||||
setClickable(true);
|
||||
setBackground(mColor);
|
||||
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
|
||||
mInterpolator = AnimationUtils
|
||||
.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -248,40 +252,40 @@ public class ImmersiveModeConfirmation {
|
||||
addView(mClingLayout, getBubbleLayoutParams());
|
||||
|
||||
if (ActivityManager.isHighEndGfx()) {
|
||||
final View bubble = mClingLayout.findViewById(R.id.text);
|
||||
bubble.setAlpha(0f);
|
||||
bubble.setTranslationY(-OFFSET_DP*density);
|
||||
bubble.animate()
|
||||
.alpha(1f)
|
||||
.translationY(0)
|
||||
.setDuration(300)
|
||||
.setInterpolator(new DecelerateInterpolator())
|
||||
.start();
|
||||
final View cling = mClingLayout;
|
||||
cling.setAlpha(0f);
|
||||
cling.setTranslationY(-OFFSET_DP * density);
|
||||
|
||||
ok.setAlpha(0f);
|
||||
ok.setTranslationY(-OFFSET_DP*density);
|
||||
ok.animate().alpha(1f)
|
||||
.translationY(0)
|
||||
.setDuration(300)
|
||||
.setStartDelay(200)
|
||||
.setInterpolator(new DecelerateInterpolator())
|
||||
.start();
|
||||
|
||||
mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, BGCOLOR);
|
||||
mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
|
||||
postOnAnimation(new Runnable() {
|
||||
@Override
|
||||
public void onAnimationUpdate(ValueAnimator animation) {
|
||||
final int c = (Integer) animation.getAnimatedValue();
|
||||
mColor.setColor(c);
|
||||
public void run() {
|
||||
cling.animate()
|
||||
.alpha(1f)
|
||||
.translationY(0)
|
||||
.setDuration(ANIMATION_DURATION)
|
||||
.setInterpolator(mInterpolator)
|
||||
.withLayer()
|
||||
.start();
|
||||
|
||||
mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, BGCOLOR);
|
||||
mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
|
||||
@Override
|
||||
public void onAnimationUpdate(ValueAnimator animation) {
|
||||
final int c = (Integer) animation.getAnimatedValue();
|
||||
mColor.setColor(c);
|
||||
}
|
||||
});
|
||||
mColorAnim.setDuration(ANIMATION_DURATION);
|
||||
mColorAnim.setInterpolator(mInterpolator);
|
||||
mColorAnim.start();
|
||||
}
|
||||
});
|
||||
mColorAnim.setDuration(1000);
|
||||
mColorAnim.start();
|
||||
} else {
|
||||
mColor.setColor(BGCOLOR);
|
||||
}
|
||||
|
||||
mContext.registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
|
||||
mContext.registerReceiver(mReceiver,
|
||||
new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5032,8 +5032,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
boolean sb = mStatusBarController.checkShowTransientBarLw();
|
||||
boolean nb = mNavigationBarController.checkShowTransientBarLw();
|
||||
if (sb || nb) {
|
||||
WindowState barTarget = sb ? mStatusBar : mNavigationBar;
|
||||
if (sb ^ nb && barTarget != swipeTarget) {
|
||||
// Don't show status bar when swiping on already visible navigation bar
|
||||
if (!nb && swipeTarget == mNavigationBar) {
|
||||
if (DEBUG) Slog.d(TAG, "Not showing transient bar, wrong swipe target");
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user