Merge "Update immersive cling visuals"

This commit is contained in:
Adrian Roos
2015-03-04 16:30:18 +00:00
committed by Android (Google) Code Review
9 changed files with 201 additions and 79 deletions

View 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>

View 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>

View 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"/>

View File

@@ -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

View File

@@ -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;
}