diff options
-rw-r--r-- | core/res/res/drawable/ic_expand_more_48dp.xml | 27 | ||||
-rw-r--r-- | core/res/res/drawable/immersive_cling_bg_circ.xml | 26 | ||||
-rw-r--r-- | core/res/res/drawable/immersive_cling_light_bg_circ.xml | 26 | ||||
-rw-r--r-- | core/res/res/layout/immersive_mode_cling.xml | 111 | ||||
-rw-r--r-- | core/res/res/values/strings.xml | 10 | ||||
-rw-r--r-- | core/res/res/values/styles.xml | 6 | ||||
-rwxr-xr-x | core/res/res/values/symbols.xml | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java | 68 | ||||
-rw-r--r-- | services/core/java/com/android/server/policy/PhoneWindowManager.java | 4 |
9 files changed, 201 insertions, 79 deletions
diff --git a/core/res/res/drawable/ic_expand_more_48dp.xml b/core/res/res/drawable/ic_expand_more_48dp.xml new file mode 100644 index 0000000..11323e3 --- /dev/null +++ b/core/res/res/drawable/ic_expand_more_48dp.xml @@ -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> diff --git a/core/res/res/drawable/immersive_cling_bg_circ.xml b/core/res/res/drawable/immersive_cling_bg_circ.xml new file mode 100644 index 0000000..4731bbd --- /dev/null +++ b/core/res/res/drawable/immersive_cling_bg_circ.xml @@ -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> diff --git a/core/res/res/drawable/immersive_cling_light_bg_circ.xml b/core/res/res/drawable/immersive_cling_light_bg_circ.xml new file mode 100644 index 0000000..df5d5ad --- /dev/null +++ b/core/res/res/drawable/immersive_cling_light_bg_circ.xml @@ -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> diff --git a/core/res/res/layout/immersive_mode_cling.xml b/core/res/res/layout/immersive_mode_cling.xml index c0cd93d..28fbea5 100644 --- a/core/res/res/layout/immersive_mode_cling.xml +++ b/core/res/res/layout/immersive_mode_cling.xml @@ -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: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:layout_gravity="center_horizontal" - android:src="@drawable/cling_arrow_up" - /> - <FrameLayout + 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: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_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>
\ No newline at end of file diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index d93d2c8..7c745ac 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -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> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index c520a46..cc64b43 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -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> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 86e46f6..e17f5fc 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -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"/> diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index e511346..e720f3e 100644 --- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -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(); - - 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() { + final View cling = mClingLayout; + cling.setAlpha(0f); + cling.setTranslationY(-OFFSET_DP * density); + + 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 diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 5185cf6..9746142 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -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; } |