diff options
18 files changed, 341 insertions, 319 deletions
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java index 8cd63efd414f..f9ef3c53644f 100644 --- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java @@ -19,6 +19,7 @@ package com.android.internal.widget.multiwaveview; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; @@ -27,6 +28,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.RectF; +import android.graphics.drawable.Drawable; import android.os.Vibrator; import android.text.TextUtils; import android.util.AttributeSet; @@ -52,10 +54,11 @@ public class MultiWaveView extends View { // Wave state machine private static final int STATE_IDLE = 0; - private static final int STATE_FIRST_TOUCH = 1; - private static final int STATE_TRACKING = 2; - private static final int STATE_SNAP = 3; - private static final int STATE_FINISH = 4; + private static final int STATE_START = 1; + private static final int STATE_FIRST_TOUCH = 2; + private static final int STATE_TRACKING = 3; + private static final int STATE_SNAP = 4; + private static final int STATE_FINISH = 5; // Animation properties. private static final float SNAP_MARGIN_DEFAULT = 20.0f; // distance to ring before we snap to it @@ -74,17 +77,18 @@ public class MultiWaveView extends View { private static final int CHEVRON_INCREMENTAL_DELAY = 160; private static final int CHEVRON_ANIMATION_DURATION = 850; private static final int RETURN_TO_HOME_DELAY = 1200; - private static final int RETURN_TO_HOME_DURATION = 300; + private static final int RETURN_TO_HOME_DURATION = 200; private static final int HIDE_ANIMATION_DELAY = 200; private static final int HIDE_ANIMATION_DURATION = 200; private static final int SHOW_ANIMATION_DURATION = 200; private static final int SHOW_ANIMATION_DELAY = 50; + private static final int INITIAL_SHOW_HANDLE_DURATION = 200; + private static final float TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED = 1.3f; - private static final float TARGET_SCALE_SELECTED = 0.8f; - private static final long INITIAL_SHOW_HANDLE_DURATION = 200; - private static final float TARGET_SCALE_UNSELECTED = 1.0f; - private static final float RING_SCALE_UNSELECTED = 0.5f; - private static final float RING_SCALE_SELECTED = 1.5f; + private static final float TARGET_SCALE_EXPANDED = 1.0f; + private static final float TARGET_SCALE_COLLAPSED = 0.8f; + private static final float RING_SCALE_EXPANDED = 1.0f; + private static final float RING_SCALE_COLLAPSED = 0.5f; private TimeInterpolator mChevronAnimationInterpolator = Ease.Quad.easeOut; @@ -182,7 +186,7 @@ public class MultiWaveView extends View { if (mNewTargetResources != 0) { internalSetTargetResources(mNewTargetResources); mNewTargetResources = 0; - hideTargets(false); + hideTargets(false, false); } mAnimatingTargets = false; } @@ -195,6 +199,7 @@ public class MultiWaveView extends View { private int mVerticalInset; private int mGravity = Gravity.TOP; private boolean mInitialLayout = true; + private Tweener mBackgroundAnimator; public MultiWaveView(Context context) { this(context, null); @@ -358,14 +363,21 @@ public class MultiWaveView extends View { switch (state) { case STATE_IDLE: deactivateTargets(); + hideTargets(true, false); + startBackgroundAnimation(0, 0.0f); mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE); break; + case STATE_START: + deactivateHandle(0, 0, 1.0f, null); + startBackgroundAnimation(0, 0.0f); + break; + case STATE_FIRST_TOUCH: - stopHandleAnimation(); deactivateTargets(); showTargets(true); - activateHandle(); + mHandleDrawable.setState(TargetDrawable.STATE_ACTIVE); + startBackgroundAnimation(INITIAL_SHOW_HANDLE_DURATION, 1.0f); setGrabbedState(OnTriggerListener.CENTER_HANDLE); if (AccessibilityManager.getInstance(mContext).isEnabled()) { announceTargets(); @@ -384,17 +396,29 @@ public class MultiWaveView extends View { } } - private void activateHandle() { - mHandleDrawable.setState(TargetDrawable.STATE_ACTIVE); - if (mAlwaysTrackFinger) { - mHandleAnimations.stop(); - mHandleDrawable.setAlpha(0.0f); - mHandleAnimations.add(Tweener.to(mHandleDrawable, INITIAL_SHOW_HANDLE_DURATION, - "ease", Ease.Cubic.easeIn, - "alpha", 1.0f, - "onUpdate", mUpdateListener)); - mHandleAnimations.start(); - } + private void activateHandle(int duration, int delay, float finalAlpha, + AnimatorListener finishListener) { + mHandleAnimations.cancel(); + mHandleAnimations.add(Tweener.to(mHandleDrawable, duration, + "ease", Ease.Cubic.easeIn, + "delay", delay, + "alpha", finalAlpha, + "onUpdate", mUpdateListener, + "onComplete", finishListener)); + mHandleAnimations.start(); + } + + private void deactivateHandle(int duration, int delay, float finalAlpha, + AnimatorListener finishListener) { + mHandleAnimations.cancel(); + mHandleAnimations.add(Tweener.to(mHandleDrawable, duration, + "ease", Ease.Quart.easeOut, + "delay", delay, + "alpha", finalAlpha, + "x", 0, + "y", 0, + "onUpdate", mUpdateListener, + "onComplete", finishListener)); } /** @@ -441,14 +465,6 @@ public class MultiWaveView extends View { mChevronAnimations.start(); } - private void stopChevronAnimation() { - mChevronAnimations.stop(); - } - - private void stopHandleAnimation() { - mHandleAnimations.stop(); - } - private void deactivateTargets() { final int count = mTargetDrawables.size(); for (int i = 0; i < count; i++) { @@ -493,39 +509,33 @@ public class MultiWaveView extends View { private void doFinish() { final int activeTarget = mActiveTarget; - boolean targetHit = activeTarget != -1; - - // Hide unselected targets - hideTargets(true); + final boolean targetHit = activeTarget != -1; - // Highlight the selected one - mHandleAnimations.cancel(); if (targetHit) { - mHandleDrawable.setAlpha(0.0f); - mTargetDrawables.get(activeTarget).setState(TargetDrawable.STATE_ACTIVE); - hideUnselected(activeTarget); + if (DEBUG) Log.v(TAG, "Finish with target hit = " + targetHit); + + highlightSelected(activeTarget); // Inform listener of any active targets. Typically only one will be active. - if (DEBUG) Log.v(TAG, "Finish with target hit = " + targetHit); + deactivateHandle(RETURN_TO_HOME_DURATION, RETURN_TO_HOME_DELAY, 0.0f, mResetListener); dispatchTriggerEvent(activeTarget); + } else { + // Animate handle back to the center based on current state. + deactivateHandle(HIDE_ANIMATION_DURATION, HIDE_ANIMATION_DELAY, 1.0f, + mResetListenerWithPing); + hideTargets(true, false); + mHandleAnimations.start(); } - // Animate handle back to the center based on current state. - int delay = targetHit ? RETURN_TO_HOME_DELAY : 0; - int duration = RETURN_TO_HOME_DURATION; - mHandleAnimations.add(Tweener.to(mHandleDrawable, duration, - "ease", Ease.Quart.easeOut, - "delay", delay, - "alpha", mAlwaysTrackFinger ? 0.0f : 1.0f, - "x", 0, - "y", 0, - "onUpdate", mUpdateListener, - "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener)); - mHandleAnimations.start(); - setGrabbedState(OnTriggerListener.NO_HANDLE); } + private void highlightSelected(int activeTarget) { + // Highlight the given target and fade others + mTargetDrawables.get(activeTarget).setState(TargetDrawable.STATE_ACTIVE); + hideUnselected(activeTarget); + } + private void hideUnselected(int active) { for (int i = 0; i < mTargetDrawables.size(); i++) { if (i != active) { @@ -535,16 +545,15 @@ public class MultiWaveView extends View { mOuterRing.setAlpha(0.0f); } - private void hideTargets(boolean animate) { + private void hideTargets(boolean animate, boolean expanded) { mTargetAnimations.cancel(); // Note: these animations should complete at the same time so that we can swap out // the target assets asynchronously from the setTargetResources() call. mAnimatingTargets = animate; final int duration = animate ? HIDE_ANIMATION_DURATION : 0; final int delay = animate ? HIDE_ANIMATION_DELAY : 0; - final boolean targetSelected = mActiveTarget != -1; - final float targetScale = targetSelected ? TARGET_SCALE_SELECTED : TARGET_SCALE_UNSELECTED; + final float targetScale = expanded ? TARGET_SCALE_EXPANDED : TARGET_SCALE_COLLAPSED; final int length = mTargetDrawables.size(); for (int i = 0; i < length; i++) { TargetDrawable target = mTargetDrawables.get(i); @@ -558,7 +567,7 @@ public class MultiWaveView extends View { "onUpdate", mUpdateListener)); } - final float ringScaleTarget = targetSelected ? RING_SCALE_SELECTED : RING_SCALE_UNSELECTED; + final float ringScaleTarget = expanded ? RING_SCALE_EXPANDED : RING_SCALE_COLLAPSED; mTargetAnimations.add(Tweener.to(mOuterRing, duration, "ease", Ease.Cubic.easeOut, "alpha", 0.0f, @@ -580,8 +589,6 @@ public class MultiWaveView extends View { for (int i = 0; i < length; i++) { TargetDrawable target = mTargetDrawables.get(i); target.setState(TargetDrawable.STATE_INACTIVE); - target.setScaleX(TARGET_SCALE_SELECTED); - target.setScaleY(TARGET_SCALE_SELECTED); mTargetAnimations.add(Tweener.to(target, duration, "ease", Ease.Cubic.easeOut, "alpha", 1.0f, @@ -732,17 +739,30 @@ public class MultiWaveView extends View { * @param animate */ public void reset(boolean animate) { - stopChevronAnimation(); - stopHandleAnimation(); + mChevronAnimations.stop(); + mHandleAnimations.stop(); mTargetAnimations.stop(); + startBackgroundAnimation(0, 0.0f); hideChevrons(); - hideTargets(animate); - mHandleDrawable.setX(0); - mHandleDrawable.setY(0); - mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE); + hideTargets(animate, false); + deactivateHandle(0, 0, 1.0f, null); Tweener.reset(); } + private void startBackgroundAnimation(int duration, float alpha) { + Drawable background = getBackground(); + if (mAlwaysTrackFinger && background != null) { + if (mBackgroundAnimator != null) { + mBackgroundAnimator.animator.end(); + } + mBackgroundAnimator = Tweener.to(background, duration, + "ease", Ease.Cubic.easeIn, + "alpha", new int[] {0, (int)(255.0f * alpha)}, + "delay", SHOW_ANIMATION_DELAY); + mBackgroundAnimator.animator.start(); + } + } + @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); @@ -784,7 +804,10 @@ public class MultiWaveView extends View { } private void handleDown(MotionEvent event) { - if (!trySwitchToFirstTouchState(event.getX(), event.getY())) { + float eventX = event.getX(); + float eventY = event.getY(); + switchToState(STATE_START, eventX, eventY); + if (!trySwitchToFirstTouchState(eventX, eventY)) { mDragging = false; mTargetAnimations.cancel(); ping(); @@ -830,7 +853,9 @@ public class MultiWaveView extends View { if (!mDragging) { trySwitchToFirstTouchState(eventX, eventY); - } else { + } + + if (mDragging) { if (singleTarget) { // Snap to outer ring if there's only one target float snapRadius = mOuterRadius - mSnapMargin; @@ -865,17 +890,11 @@ public class MultiWaveView extends View { if (activeTarget != -1) { switchToState(STATE_SNAP, x,y); TargetDrawable target = targets.get(activeTarget); - float newX = singleTarget ? x : target.getX(); - float newY = singleTarget ? y : target.getY(); + final float newX = singleTarget ? x : target.getX(); + final float newY = singleTarget ? y : target.getY(); moveHandleTo(newX, newY, false); - mHandleAnimations.cancel(); - mHandleDrawable.setAlpha(0.0f); } else { switchToState(STATE_TRACKING, x, y); - if (mActiveTarget != -1) { - mHandleAnimations.cancel(); - mHandleDrawable.setAlpha(1.0f); - } moveHandleTo(x, y, false); } @@ -900,6 +919,9 @@ public class MultiWaveView extends View { String targetContentDescription = getTargetDescription(activeTarget); announceText(targetContentDescription); } + activateHandle(0, 0, 0.0f, null); + } else { + activateHandle(0, 0, 1.0f, null); } } mActiveTarget = activeTarget; @@ -1021,7 +1043,7 @@ public class MultiWaveView extends View { if (mInitialLayout) { hideChevrons(); - hideTargets(false); + hideTargets(false, false); moveHandleTo(0, 0, false); mInitialLayout = false; } diff --git a/core/java/com/android/internal/widget/multiwaveview/Tweener.java b/core/java/com/android/internal/widget/multiwaveview/Tweener.java index 1d502ba5c4ea..d559d9dae2b3 100644 --- a/core/java/com/android/internal/widget/multiwaveview/Tweener.java +++ b/core/java/com/android/internal/widget/multiwaveview/Tweener.java @@ -83,6 +83,9 @@ class Tweener { } else if (value instanceof float[]) { props.add(PropertyValuesHolder.ofFloat(key, ((float[])value)[0], ((float[])value)[1])); + } else if (value instanceof int[]) { + props.add(PropertyValuesHolder.ofInt(key, + ((int[])value)[0], ((int[])value)[1])); } else if (value instanceof Number) { float floatValue = ((Number)value).floatValue(); props.add(PropertyValuesHolder.ofFloat(key, floatValue)); diff --git a/core/res/res/values-large/config.xml b/core/res/res/values-large/config.xml index 932720089075..d1ec4efc9a02 100644 --- a/core/res/res/values-large/config.xml +++ b/core/res/res/values-large/config.xml @@ -24,9 +24,6 @@ <dimen name="config_prefDialogWidth">440dp</dimen> <!-- see comment in values/config.xml --> - <integer name="config_longPressOnPowerBehavior">2</integer> - - <!-- see comment in values/config.xml --> <integer name="config_longPressOnHomeBehavior">0</integer> </resources> diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml index b54e9d19ac85..1486d9c9ad33 100644 --- a/core/res/res/values-sw600dp/config.xml +++ b/core/res/res/values-sw600dp/config.xml @@ -20,9 +20,6 @@ <!-- These resources are around just to allow their values to be customized for different hardware and product builds. --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- see comment in values/config.xml --> - <integer name="config_longPressOnPowerBehavior">2</integer> - <!-- Enable lockscreen rotation --> <bool name="config_enableLockScreenRotation">true</bool> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index b67751334dbf..f24733cb3ebd 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -551,13 +551,13 @@ <enum name="sensorLandscape" value="6" /> <!-- Would like to have the screen in portrait orientation, but can use the sensor to change which direction the screen is facing. --> - <enum name="sensorPortait" value="7" /> + <enum name="sensorPortrait" value="7" /> <!-- Would like to have the screen in landscape orientation, turned in the opposite direction from normal landscape. --> <enum name="reverseLandscape" value="8" /> <!-- Would like to have the screen in portrait orientation, turned in the opposite direction from normal portrait. --> - <enum name="reversePortait" value="9" /> + <enum name="reversePortrait" value="9" /> <!-- Orientation is determined by a physical orientation sensor: the display will rotate based on how the user moves the device. This allows any of the 4 possible rotations, regardless of what diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index a143feb39448..5d8ddc9a912c 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1303,6 +1303,9 @@ <java-symbol type="string" name="global_actions_airplane_mode_off_status" /> <java-symbol type="string" name="global_actions_airplane_mode_on_status" /> <java-symbol type="string" name="global_actions_toggle_airplane_mode" /> + <java-symbol type="string" name="global_action_silent_mode_off_status" /> + <java-symbol type="string" name="global_action_silent_mode_on_status" /> + <java-symbol type="string" name="global_action_toggle_silent_mode" /> <java-symbol type="string" name="invalidPuk" /> <java-symbol type="string" name="keyguard_password_enter_pin_code" /> <java-symbol type="string" name="keyguard_password_enter_puk_code" /> diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml index 4da05d953935..74a15f22aefd 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml @@ -22,53 +22,26 @@ xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/search_panel_container" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:paddingBottom="0dip"> - - <RelativeLayout - android:id="@+id/search_bg_protect" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <RelativeLayout - android:id="@+id/search_panel_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_centerHorizontal="true"> - - <View - android:layout_width="0dip" - android:layout_height="0dip" - android:layout_alignTop="@id/multi_wave_view" - android:layout_alignLeft="@id/multi_wave_view" - android:layout_alignRight="@id/multi_wave_view" - android:layout_alignBottom="@id/multi_wave_view" - android:layout_marginBottom="@dimen/navigation_bar_size" - android:background="@drawable/navbar_search_bg_scrim"/> - - <com.android.internal.widget.multiwaveview.MultiWaveView - android:id="@+id/multi_wave_view" - android:orientation="horizontal" - android:layout_width="wrap_content" - android:layout_height="@dimen/navbar_search_panel_height" - android:layout_alignParentBottom="true" - android:gravity="top" - - prvandroid:targetDrawables="@array/navbar_search_targets" - prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" - prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" - prvandroid:handleDrawable="@drawable/navbar_search_handle" - prvandroid:waveDrawable="@drawable/navbar_search_outerring" - prvandroid:snapMargin="@dimen/navbar_search_snap_margin" - prvandroid:hitRadius="@dimen/navbar_search_hit_radius" - prvandroid:feedbackCount="0" - prvandroid:vibrationDuration="@integer/config_vibration_duration" - prvandroid:alwaysTrackFinger="true"/> - - </RelativeLayout> - - </RelativeLayout> + android:layout_height="match_parent" + android:layout_width="match_parent"> + + <com.android.internal.widget.multiwaveview.MultiWaveView + android:id="@+id/multi_wave_view" + android:layout_width="wrap_content" + android:layout_height="@dimen/navbar_search_panel_height" + android:layout_gravity="center_horizontal|bottom" + android:gravity="center_horizontal|top" + android:background="@drawable/navbar_search_bg_scrim" + + prvandroid:targetDrawables="@array/navbar_search_targets" + prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" + prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" + prvandroid:handleDrawable="@drawable/navbar_search_handle" + prvandroid:waveDrawable="@drawable/navbar_search_outerring" + prvandroid:snapMargin="@dimen/navbar_search_snap_margin" + prvandroid:hitRadius="@dimen/navbar_search_hit_radius" + prvandroid:feedbackCount="0" + prvandroid:vibrationDuration="@integer/config_vibration_duration" + prvandroid:alwaysTrackFinger="true"/> </com.android.systemui.SearchPanelView> diff --git a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml index 1ae8a694f877..2a97307a7428 100644 --- a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml @@ -22,53 +22,27 @@ xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/search_panel_container" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:paddingBottom="0dip"> - - <RelativeLayout - android:id="@+id/search_bg_protect" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <RelativeLayout - android:id="@+id/search_panel_container" - android:layout_width="wrap_content" - android:layout_height="@dimen/navbar_search_panel_height" - android:layout_alignParentBottom="true" - android:layout_alignParentLeft="true" - android:layout_marginLeft="-120dip"> - - <View - android:layout_width="0dip" - android:layout_height="0dip" - android:layout_alignTop="@id/multi_wave_view" - android:layout_alignLeft="@id/multi_wave_view" - android:layout_alignRight="@id/multi_wave_view" - android:layout_alignBottom="@id/multi_wave_view" - android:layout_marginBottom="@dimen/navigation_bar_size" - android:background="@drawable/navbar_search_bg_scrim"/> - - <com.android.internal.widget.multiwaveview.MultiWaveView - android:id="@+id/multi_wave_view" - android:orientation="horizontal" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_alignParentBottom="true" - - prvandroid:targetDrawables="@array/navbar_search_targets" - prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" - prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" - prvandroid:handleDrawable="@drawable/navbar_search_handle" - prvandroid:waveDrawable="@drawable/navbar_search_outerring" - prvandroid:snapMargin="@dimen/navbar_search_snap_margin" - prvandroid:hitRadius="@dimen/navbar_search_hit_radius" - prvandroid:feedbackCount="0" - prvandroid:vibrationDuration="@integer/config_vibration_duration" - prvandroid:alwaysTrackFinger="true"/> - - </RelativeLayout> - - </RelativeLayout> + android:layout_height="match_parent" + android:layout_width="match_parent"> + + <com.android.internal.widget.multiwaveview.MultiWaveView + android:id="@+id/multi_wave_view" + android:layout_width="wrap_content" + android:layout_height="@dimen/navbar_search_panel_height" + android:layout_gravity="left|bottom" + android:gravity="top|right" + android:layout_marginLeft="-150dip" + android:background="@drawable/navbar_search_bg_scrim" + + prvandroid:targetDrawables="@array/navbar_search_targets" + prvandroid:targetDescriptions="@array/navbar_search_target_descriptions" + prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" + prvandroid:handleDrawable="@drawable/navbar_search_handle" + prvandroid:waveDrawable="@drawable/navbar_search_outerring" + prvandroid:snapMargin="@dimen/navbar_search_snap_margin" + prvandroid:hitRadius="@dimen/navbar_search_hit_radius" + prvandroid:feedbackCount="0" + prvandroid:vibrationDuration="@integer/config_vibration_duration" + prvandroid:alwaysTrackFinger="true"/> </com.android.systemui.SearchPanelView> diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index a6e4487e9c33..060d08e090ad 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -27,7 +27,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.util.AttributeSet; -import android.util.Log; import android.util.Slog; import android.view.MotionEvent; import android.view.View; @@ -38,7 +37,6 @@ import android.widget.FrameLayout; import com.android.internal.widget.multiwaveview.MultiWaveView; import com.android.internal.widget.multiwaveview.MultiWaveView.OnTriggerListener; -import com.android.server.am.ActivityManagerService; import com.android.systemui.R; import com.android.systemui.recent.StatusBarTouchProxy; import com.android.systemui.statusbar.BaseStatusBar; @@ -47,7 +45,8 @@ import com.android.systemui.statusbar.tablet.StatusBarPanel; import com.android.systemui.statusbar.tablet.TabletStatusBar; public class SearchPanelView extends FrameLayout implements - StatusBarPanel, Animator.AnimatorListener { + StatusBarPanel { + private static final int SEARCH_PANEL_HOLD_DURATION = 500; static final String TAG = "SearchPanelView"; static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false; private Context mContext; @@ -123,7 +122,7 @@ public class SearchPanelView extends FrameLayout implements final MultiWaveView.OnTriggerListener mMultiWaveViewListener = new MultiWaveView.OnTriggerListener() { - private int mTarget = -1; + private boolean mWaitingForLaunch; public void onGrabbed(View v, int handle) { } @@ -132,26 +131,28 @@ public class SearchPanelView extends FrameLayout implements } public void onGrabbedStateChange(View v, int handle) { - if (mTarget == -1 && OnTriggerListener.NO_HANDLE == handle) { + if (!mWaitingForLaunch && OnTriggerListener.NO_HANDLE == handle) { mBar.hideSearchPanel(); } } - public void onTrigger(View v, int target) { - mTarget = target; + public void onTrigger(View v, final int target) { + final int resId = mMultiWaveView.getResourceIdForTarget(target); + switch (resId) { + case com.android.internal.R.drawable.ic_lockscreen_search: + mWaitingForLaunch = true; + startAssistActivity(); + postDelayed(new Runnable() { + public void run() { + mWaitingForLaunch = false; + mBar.hideSearchPanel(); + } + }, SEARCH_PANEL_HOLD_DURATION); + break; + } } public void onFinishFinalAnimation() { - if (mTarget != -1) { - final int resId = mMultiWaveView.getResourceIdForTarget(mTarget); - mTarget = -1; // a safety to make sure we never launch w/o prior call to onTrigger - switch (resId) { - case com.android.internal.R.drawable.ic_lockscreen_search: - startAssistActivity(); - break; - } - mBar.hideSearchPanel(); - } } }; @@ -194,15 +195,11 @@ public class SearchPanelView extends FrameLayout implements }; public void show(final boolean show, boolean animate) { - if (animate) { - if (mShowing != show) { - mShowing = show; - // TODO: start animating ring - } - } else { - mShowing = show; - onAnimationEnd(null); + if (!show) { + final LayoutTransition transitioner = animate ? createLayoutTransitioner() : null; + ((ViewGroup)mSearchTargetsContainer).setLayoutTransition(transitioner); } + mShowing = show; if (show) { if (getVisibility() != View.VISIBLE) { setVisibility(View.VISIBLE); @@ -228,25 +225,6 @@ public class SearchPanelView extends FrameLayout implements } } - public void onAnimationCancel(Animator animation) { - } - - public void onAnimationEnd(Animator animation) { - if (mShowing) { - final LayoutTransition transitioner = new LayoutTransition(); - ((ViewGroup)mSearchTargetsContainer).setLayoutTransition(transitioner); - createCustomAnimations(transitioner); - } else { - ((ViewGroup)mSearchTargetsContainer).setLayoutTransition(null); - } - } - - public void onAnimationRepeat(Animator animation) { - } - - public void onAnimationStart(Animator animation) { - } - /** * We need to be aligned at the bottom. LinearLayout can't do this, so instead, * let LinearLayout do all the hard work, and then shift everything down to the bottom. @@ -293,9 +271,11 @@ public class SearchPanelView extends FrameLayout implements } } - private void createCustomAnimations(LayoutTransition transitioner) { + private LayoutTransition createLayoutTransitioner() { + LayoutTransition transitioner = new LayoutTransition(); transitioner.setDuration(200); transitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0); transitioner.setAnimator(LayoutTransition.DISAPPEARING, null); + return transitioner; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index b9dd32fa7b3c..344411bf6088 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -483,7 +483,14 @@ public class PhoneStatusBar extends BaseStatusBar { @Override public void showSearchPanel() { - super.showSearchPanel(); + // XXX This is a bit of a hack. Since navbar is no longer slippery, we use the + // gesture to dismiss the expanded statusbar. + if (mExpanded) { + animateCollapse(); + return; + } else { + super.showSearchPanel(); + } WindowManager.LayoutParams lp = (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams(); lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; @@ -506,7 +513,7 @@ public class PhoneStatusBar extends BaseStatusBar { public int getStatusBarHeight() { if (mNaturalBarHeight < 0) { final Resources res = mContext.getResources(); - mNaturalBarHeight = + mNaturalBarHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); } return mNaturalBarHeight; @@ -526,7 +533,9 @@ public class PhoneStatusBar extends BaseStatusBar { public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: - showSearchPanel(); + if (!shouldDisableNavbarGestures()) { + showSearchPanel(); + } break; } return false; @@ -674,9 +683,9 @@ public class PhoneStatusBar extends BaseStatusBar { if (INTRUDER_ALERT_DECAY_MS > 0) { mHandler.sendEmptyMessageDelayed(MSG_HIDE_INTRUDER, INTRUDER_ALERT_DECAY_MS); } - } else + } else */ - + if (notification.notification.fullScreenIntent != null) { // not immersive & a full-screen alert should be shown Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent"); @@ -906,7 +915,7 @@ public class PhoneStatusBar extends BaseStatusBar { flagdbg.append(((diff & StatusBarManager.DISABLE_CLOCK) != 0) ? "* " : " "); flagdbg.append(">"); Slog.d(TAG, flagdbg.toString()); - + if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) { mIcons.animate().cancel(); if ((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) { @@ -1016,7 +1025,7 @@ public class PhoneStatusBar extends BaseStatusBar { if (mExpandedVisible) { return; } - + mExpandedVisible = true; mNotificationPanel.setVisibility(View.VISIBLE); @@ -1213,7 +1222,7 @@ public class PhoneStatusBar extends BaseStatusBar { //Slog.d(TAG, "y=" + y + " v=" + v + " a=" + a + " t=" + t + " mAnimY=" + mAnimY // + " mAnimAccel=" + mAnimAccel); } - + void doRevealAnimation(long frameTimeNanos) { if (SPEW) { Slog.d(TAG, "doRevealAnimation: dt=" + (frameTimeNanos - mAnimLastTimeNanos)); @@ -1465,11 +1474,11 @@ public class PhoneStatusBar extends BaseStatusBar { mTicker.halt(); } } - + if (mNavigationBarView != null) { mNavigationBarView.setLowProfile(lightsOut); } - + setStatusBarLowProfile(lightsOut); } @@ -1494,7 +1503,7 @@ public class PhoneStatusBar extends BaseStatusBar { ObjectAnimator.ofFloat(clock, View.ALPHA, 0.5f) ); mLightsOutAnimation.setDuration(750); - + mLightsOnAnimation = new AnimatorSet(); mLightsOnAnimation.playTogether( ObjectAnimator.ofFloat(notifications, View.ALPHA, 1), @@ -1505,7 +1514,7 @@ public class PhoneStatusBar extends BaseStatusBar { ); mLightsOnAnimation.setDuration(250); } - + mLightsOutAnimation.cancel(); mLightsOnAnimation.cancel(); @@ -1518,7 +1527,7 @@ public class PhoneStatusBar extends BaseStatusBar { private boolean areLightsOn() { return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE); } - + public void setLightsOn(boolean on) { Log.v(TAG, "setLightsOn(" + on + ")"); if (on) { @@ -1622,7 +1631,7 @@ public class PhoneStatusBar extends BaseStatusBar { protected void tick(IBinder key, StatusBarNotification n, boolean firstTime) { // no ticking in lights-out mode if (!areLightsOn()) return; - + // Show the ticker if one is requested. Also don't do this // until status bar window is attached to the window manager, // because... well, what's the point otherwise? And trying to @@ -1822,7 +1831,6 @@ public class PhoneStatusBar extends BaseStatusBar { } int panelh = 0; - final int disph = getExpandedViewMaxHeight(); // If the expanded view is not visible, make sure they're still off screen. @@ -2039,7 +2047,7 @@ public class PhoneStatusBar extends BaseStatusBar { try { mBarService.onNotificationClear( mCurrentlyIntrudingNotification.pkg, - mCurrentlyIntrudingNotification.tag, + mCurrentlyIntrudingNotification.tag, mCurrentlyIntrudingNotification.id); } catch (android.os.RemoteException ex) { // oh well @@ -2095,14 +2103,14 @@ public class PhoneStatusBar extends BaseStatusBar { mCollapseAccelPx = res.getDimension(R.dimen.collapse_accel); mFlingGestureMaxXVelocityPx = res.getDimension(R.dimen.fling_gesture_max_x_velocity); - + mNotificationPanelMarginBottomPx = (int) res.getDimension(R.dimen.notification_panel_margin_bottom); mNotificationPanelMarginLeftPx = (int) res.getDimension(R.dimen.notification_panel_margin_left); mNotificationPanelGravity = res.getInteger(R.integer.notification_panel_layout_gravity); if (mNotificationPanelGravity <= 0) { - mNotificationPanelGravity = Gravity.CENTER_VERTICAL | Gravity.TOP; + mNotificationPanelGravity = Gravity.CENTER_VERTICAL | Gravity.TOP; } if (false) Slog.v(TAG, "updateResources"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index c65f581f200c..584a69e48210 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -1000,7 +1000,7 @@ public class NetworkController extends BroadcastReceiver { mContentDescriptionPhoneSignal = mContext.getString( R.string.accessibility_airplane_mode); mAirplaneIconId = R.drawable.stat_sys_signal_flightmode; - mDataTypeIconId = 0; + mPhoneSignalIconId = mDataSignalIconId = mDataTypeIconId = 0; // combined values from connected wifi take precedence over airplane mode if (mWifiConnected) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index c627d47020f9..c0ac50e1ade1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -192,7 +192,9 @@ public class TabletStatusBar extends BaseStatusBar implements public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: - showSearchPanel(); + if (!shouldDisableNavbarGestures()) { + showSearchPanel(); + } break; } return false; @@ -254,12 +256,12 @@ public class TabletStatusBar extends BaseStatusBar implements // network icons: either a combo icon that switches between mobile and data, or distinct // mobile and data icons - final ImageView mobileRSSI = + final ImageView mobileRSSI = (ImageView)mNotificationPanel.findViewById(R.id.mobile_signal); if (mobileRSSI != null) { mNetworkController.addPhoneSignalIconView(mobileRSSI); } - final ImageView wifiRSSI = + final ImageView wifiRSSI = (ImageView)mNotificationPanel.findViewById(R.id.wifi_signal); if (wifiRSSI != null) { mNetworkController.addWifiIconView(wifiRSSI); @@ -493,7 +495,7 @@ public class TabletStatusBar extends BaseStatusBar implements mBluetoothController.addIconView((ImageView)sb.findViewById(R.id.bluetooth)); mNetworkController = new NetworkController(mContext); - final SignalClusterView signalCluster = + final SignalClusterView signalCluster = (SignalClusterView)sb.findViewById(R.id.signal_cluster); mNetworkController.addSignalCluster(signalCluster); @@ -1061,7 +1063,7 @@ public class TabletStatusBar extends BaseStatusBar implements if (0 != (diff & View.SYSTEM_UI_FLAG_LOW_PROFILE)) { mHandler.removeMessages(MSG_HIDE_CHROME); mHandler.removeMessages(MSG_SHOW_CHROME); - mHandler.sendEmptyMessage(0 == (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) + mHandler.sendEmptyMessage(0 == (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) ? MSG_SHOW_CHROME : MSG_HIDE_CHROME); } diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index aa73de43a84b..fc187ce1de6b 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -28,7 +28,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.UserInfo; +import android.database.ContentObserver; import android.media.AudioManager; +import android.net.ConnectivityManager; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -73,7 +75,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac private ArrayList<Action> mItems; private AlertDialog mDialog; - private SilentModeAction mSilentModeAction; + private Action mSilentModeAction; private ToggleAction mAirplaneModeOn; private MyAdapter mAdapter; @@ -82,6 +84,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac private boolean mDeviceProvisioned = false; private ToggleAction.State mAirplaneState = ToggleAction.State.Off; private boolean mIsWaitingForEcmExit = false; + private boolean mHasTelephony; + private boolean mHasVibrator; private IWindowManager mIWindowManager; @@ -104,6 +108,14 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); + ConnectivityManager cm = (ConnectivityManager) + context.getSystemService(Context.CONNECTIVITY_SERVICE); + mHasTelephony = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON), true, + mAirplaneModeObserver); + Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibrator = vibrator != null && vibrator.hasVibrator(); } /** @@ -130,13 +142,18 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mDialog.show(); mDialog.getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_EXPAND); } + /** * Create the global actions dialog. * @return A new dialog. */ private AlertDialog createDialog() { - mSilentModeAction = new SilentModeAction(mContext, mAudioManager, mHandler); - + // Simple toggle style if there's no vibrator, otherwise use a tri-state + if (!mHasVibrator) { + mSilentModeAction = new SilentModeToggleAction(); + } else { + mSilentModeAction = new SilentModeTriStateAction(mContext, mAudioManager, mHandler); + } mAirplaneModeOn = new ToggleAction( R.drawable.ic_lock_airplane_mode, R.drawable.ic_lock_airplane_mode_off, @@ -145,7 +162,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac R.string.global_actions_airplane_mode_off_status) { void onToggle(boolean on) { - if (Boolean.parseBoolean( + if (mHasTelephony && Boolean.parseBoolean( SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) { mIsWaitingForEcmExit = true; // Launch ECM exit dialog @@ -160,6 +177,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac @Override protected void changeStateFromPress(boolean buttonOn) { + if (!mHasTelephony) return; + // In ECM mode airplane state cannot be changed if (!(Boolean.parseBoolean( SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))) { @@ -176,6 +195,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac return false; } }; + onAirplaneModeChanged(); mItems = new ArrayList<Action>(); @@ -247,6 +267,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mItems.add(switchToUser); } } + mAdapter = new MyAdapter(); final AlertDialog.Builder ab = new AlertDialog.Builder(mContext); @@ -273,8 +294,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } private void prepareDialog() { - final boolean silentModeOn = - mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; + refreshSilentMode(); mAirplaneModeOn.updateState(mAirplaneState); mAdapter.notifyDataSetChanged(); if (mKeyguardShowing) { @@ -288,6 +308,15 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } } + private void refreshSilentMode() { + if (!mHasVibrator) { + final boolean silentModeOn = + mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; + ((ToggleAction)mSilentModeAction).updateState( + silentModeOn ? ToggleAction.State.On : ToggleAction.State.Off); + } + } + /** {@inheritDoc} */ public void onDismiss(DialogInterface dialog) { if (SHOW_SILENT_TOGGLE) { @@ -297,7 +326,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac /** {@inheritDoc} */ public void onClick(DialogInterface dialog, int which) { - if (!(mAdapter.getItem(which) instanceof SilentModeAction)) { + if (!(mAdapter.getItem(which) instanceof SilentModeTriStateAction)) { dialog.dismiss(); } mAdapter.getItem(which).onPress(); @@ -495,12 +524,12 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac */ public ToggleAction(int enabledIconResId, int disabledIconResid, - int essage, + int message, int enabledStatusMessageResId, int disabledStatusMessageResId) { mEnabledIconResId = enabledIconResId; mDisabledIconResid = disabledIconResid; - mMessageResId = essage; + mMessageResId = message; mEnabledStatusMessageResId = enabledStatusMessageResId; mDisabledStatusMessageResId = disabledStatusMessageResId; } @@ -583,21 +612,44 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } } - private static class SilentModeAction implements Action, View.OnClickListener { + private class SilentModeToggleAction extends ToggleAction { + public SilentModeToggleAction() { + super(R.drawable.ic_audio_vol_mute, + R.drawable.ic_audio_vol, + R.string.global_action_toggle_silent_mode, + R.string.global_action_silent_mode_on_status, + R.string.global_action_silent_mode_off_status); + } + + void onToggle(boolean on) { + if (on) { + mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); + } else { + mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); + } + } + + public boolean showDuringKeyguard() { + return true; + } + + public boolean showBeforeProvisioning() { + return false; + } + } + + private static class SilentModeTriStateAction implements Action, View.OnClickListener { private final int[] ITEM_IDS = { R.id.option1, R.id.option2, R.id.option3 }; private final AudioManager mAudioManager; private final Handler mHandler; - private final boolean mHasVibrator; private final Context mContext; - SilentModeAction(Context context, AudioManager audioManager, Handler handler) { + SilentModeTriStateAction(Context context, AudioManager audioManager, Handler handler) { mAudioManager = audioManager; mHandler = handler; mContext = context; - Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); - mHasVibrator = vibrator != null && vibrator.hasVibrator(); } private int ringerModeToIndex(int ringerMode) { @@ -621,9 +673,6 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac // Set up click handler itemView.setTag(i); itemView.setOnClickListener(this); - if (itemView.getId() == R.id.option2 && !mHasVibrator) { - itemView.setVisibility(View.GONE); - } } return v; } @@ -683,6 +732,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac PhoneStateListener mPhoneStateListener = new PhoneStateListener() { @Override public void onServiceStateChanged(ServiceState serviceState) { + if (!mHasTelephony) return; final boolean inAirplaneMode = serviceState.getState() == ServiceState.STATE_POWER_OFF; mAirplaneState = inAirplaneMode ? ToggleAction.State.On : ToggleAction.State.Off; mAirplaneModeOn.updateState(mAirplaneState); @@ -699,6 +749,13 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } }; + private ContentObserver mAirplaneModeObserver = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + onAirplaneModeChanged(); + } + }; + private static final int MESSAGE_DISMISS = 0; private static final int MESSAGE_REFRESH = 1; private static final int MESSAGE_SHOW = 2; @@ -713,6 +770,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } break; case MESSAGE_REFRESH: + refreshSilentMode(); mAdapter.notifyDataSetChanged(); break; case MESSAGE_SHOW: @@ -722,6 +780,18 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } }; + private void onAirplaneModeChanged() { + // Let the service state callbacks handle the state. + if (mHasTelephony) return; + + boolean airplaneModeOn = Settings.System.getInt( + mContext.getContentResolver(), + Settings.System.AIRPLANE_MODE_ON, + 0) == 1; + mAirplaneState = airplaneModeOn ? ToggleAction.State.On : ToggleAction.State.Off; + mAirplaneModeOn.updateState(mAirplaneState); + } + /** * Change the airplane mode system setting */ @@ -734,6 +804,9 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra("state", on); mContext.sendBroadcast(intent); + if (!mHasTelephony) { + mAirplaneState = on ? ToggleAction.State.On : ToggleAction.State.Off; + } } private IWindowManager getWindowManager() { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index a99ae269e2d9..cce55d5ec7b3 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1798,7 +1798,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } if (down) { - if (!mHomePressed) { + if (!mHomePressed && mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) { try { mStatusBarService.preloadRecentApps(); } catch (RemoteException e) { diff --git a/services/java/com/android/server/wm/AppWindowAnimator.java b/services/java/com/android/server/wm/AppWindowAnimator.java index de756b178492..1953ad77823c 100644 --- a/services/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/java/com/android/server/wm/AppWindowAnimator.java @@ -79,12 +79,9 @@ public class AppWindowAnimator { } public void setDummyAnimation() { - if (animation == null) { - if (WindowManagerService.localLOGV) Slog.v( - TAG, "Setting dummy animation in " + mAppToken); - animation = sDummyAnimation; - animInitialized = false; - } + if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting dummy animation in " + mAppToken); + animation = sDummyAnimation; + animInitialized = false; hasTransformation = true; transformation.clear(); transformation.setAlpha(mAppToken.reportedVisible ? 1 : 0); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index b1612a159af7..4ce8c97541d7 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -1638,7 +1638,7 @@ public class WindowManagerService extends IWindowManager.Stub // it is of no interest to us. if (w.mAppToken.hidden && w.mAppToken.mAppAnimator.animation == null) { if (DEBUG_WALLPAPER) Slog.v(TAG, - "Skipping not hidden or animating token: " + w); + "Skipping hidden and not animating token: " + w); continue; } } @@ -3544,7 +3544,8 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.groupId = groupId; wtoken.appFullscreen = fullscreen; wtoken.requestedOrientation = requestedOrientation; - if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken); + if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken + + " at " + addPos); mAppTokens.add(addPos, wtoken); addAppTokenToAnimating(addPos, wtoken); mTokenMap.put(token.asBinder(), wtoken); @@ -3864,6 +3865,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_APP_TRANSITIONS) Slog.v( TAG, "Prepare app transition: transit=" + transit + " mNextAppTransition=" + mNextAppTransition + + " alwaysKeepCurrent=" + alwaysKeepCurrent + " Callers=" + Debug.getCallers(3)); if (okToDisplay()) { if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET @@ -3933,6 +3935,15 @@ public class WindowManagerService extends IWindowManager.Stub } } + private void cancelWindowAnimations(final AppWindowToken wtoken) { + for (int i = wtoken.windows.size() - 1; i >= 0; i--) { + final WindowStateAnimator winAnimator = wtoken.windows.get(i).mWinAnimator; + if (winAnimator.isAnimating()) { + winAnimator.clearAnimation(); + } + } + } + public void executeAppTransition() { if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, "executeAppTransition()")) { @@ -3948,6 +3959,12 @@ public class WindowManagerService extends IWindowManager.Stub } if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { mAppTransitionReady = true; + for (int i = mOpeningApps.size() - 1; i >= 0; i--) { + cancelWindowAnimations(mOpeningApps.get(i)); + } + for (int i = mClosingApps.size() - 1; i >= 0; i--) { + cancelWindowAnimations(mClosingApps.get(i)); + } final long origId = Binder.clearCallingIdentity(); performLayoutAndPlaceSurfacesLocked(); Binder.restoreCallingIdentity(origId); @@ -4295,6 +4312,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_APP_TRANSITIONS) Slog.v( TAG, "Setting dummy animation on: " + wtoken); + cancelWindowAnimations(wtoken); wtoken.mAppAnimator.setDummyAnimation(); mOpeningApps.remove(wtoken); mClosingApps.remove(wtoken); @@ -4816,8 +4834,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET - && !mAppTransitionRunning) { + if (!mAppTransitionRunning) { mAnimatingAppTokens.clear(); mAnimatingAppTokens.addAll(mAppTokens); moveAppWindowsLocked(tokens, mAppTokens.size()); @@ -4836,8 +4853,7 @@ public class WindowManagerService extends IWindowManager.Stub final long origId = Binder.clearCallingIdentity(); synchronized(mWindowMap) { final int N = tokens.size(); - if (N > 0 && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET - && !mAppTransitionRunning) { + if (N > 0 && !mAppTransitionRunning) { // animating towards back, hang onto old list for duration of animation. mAnimatingAppTokens.clear(); mAnimatingAppTokens.addAll(mAppTokens); @@ -4857,8 +4873,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET - && !mAppTransitionRunning) { + if (!mAppTransitionRunning) { mAnimatingAppTokens.clear(); mAnimatingAppTokens.addAll(mAppTokens); moveAppWindowsLocked(tokens, 0); @@ -5321,7 +5336,8 @@ public class WindowManagerService extends IWindowManager.Stub // the background..) if (on) { boolean isVisible = false; - for (WindowState ws : mWindows) { + for (int i = mWindows.size() - 1; i >= 0; i--) { + final WindowState ws = mWindows.get(i); if (ws.mSession.mPid == pid && ws.isVisibleLw()) { isVisible = true; break; @@ -6439,7 +6455,10 @@ public class WindowManagerService extends IWindowManager.Stub int keyboardPresence = 0; int navigationPresence = 0; - for (InputDevice device : mInputManager.getInputDevices()) { + final InputDevice[] devices = mInputManager.getInputDevices(); + final int len = devices.length; + for (int i = 0; i < len; i++) { + InputDevice device = devices[i]; if (!device.isVirtual()) { final int sources = device.getSources(); final int presenceFlag = device.isExternal() ? @@ -7948,7 +7967,7 @@ public class WindowManagerService extends IWindowManager.Stub for (i=0; i<NN && goodToGo; i++) { AppWindowToken wtoken = mOpeningApps.get(i); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "Check opening app" + wtoken + ": allDrawn=" + "Check opening app=" + wtoken + ": allDrawn=" + wtoken.allDrawn + " startingDisplayed=" + wtoken.startingDisplayed + " startingMoved=" + wtoken.startingMoved); @@ -8058,7 +8077,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + transit); - } else if (oldWallpaper != null) { + } else if ((oldWallpaper != null) && (oldWallpaper != mWallpaperTarget)) { // We are transitioning from an activity with // a wallpaper to one without. transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE; diff --git a/telephony/java/com/android/internal/telephony/SMSDispatcher.java b/telephony/java/com/android/internal/telephony/SMSDispatcher.java index 28b729d962b0..41125dd119bd 100644 --- a/telephony/java/com/android/internal/telephony/SMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/SMSDispatcher.java @@ -78,6 +78,10 @@ public abstract class SMSDispatcher extends Handler { public static final String RECEIVE_EMERGENCY_BROADCAST_PERMISSION = "android.permission.RECEIVE_EMERGENCY_BROADCAST"; + /** Permission required to send SMS to short codes without user confirmation. */ + private static final String SEND_SMS_NO_CONFIRMATION_PERMISSION = + "android.permission.SEND_SMS_NO_CONFIRMATION"; + /** Query projection for checking for duplicate message segments. */ private static final String[] PDU_PROJECTION = new String[] { "pdu" @@ -944,7 +948,8 @@ public abstract class SMSDispatcher extends Handler { * @return true if the destination is approved; false if user confirmation event was sent */ boolean checkDestination(SmsTracker tracker) { - if (mUsageMonitor.isApprovedShortCodeSender(tracker.mAppPackage)) { + if (mContext.checkCallingOrSelfPermission(SEND_SMS_NO_CONFIRMATION_PERMISSION) + == PackageManager.PERMISSION_GRANTED) { return true; // app is pre-approved to send to short codes } else { String countryIso = mTelephonyManager.getSimCountryIso(); diff --git a/telephony/java/com/android/internal/telephony/SmsUsageMonitor.java b/telephony/java/com/android/internal/telephony/SmsUsageMonitor.java index f40958dfb899..1804d97dee59 100644 --- a/telephony/java/com/android/internal/telephony/SmsUsageMonitor.java +++ b/telephony/java/com/android/internal/telephony/SmsUsageMonitor.java @@ -81,12 +81,6 @@ public class SmsUsageMonitor { private final HashMap<String, ArrayList<Long>> mSmsStamp = new HashMap<String, ArrayList<Long>>(); - /** - * Hash of package names that are allowed to send to short codes. - * TODO: persist this across reboots. - */ - private final HashSet<String> mApprovedShortCodeSenders = new HashSet<String>(); - /** Context for retrieving regexes from XML resource. */ private final Context mContext; @@ -248,9 +242,6 @@ public class SmsUsageMonitor { DEFAULT_SMS_CHECK_PERIOD); mSettingsObserverHandler = new SettingsObserverHandler(); - - // system MMS app is always allowed to send to short codes - mApprovedShortCodeSenders.add("com.android.mms"); } /** @@ -358,28 +349,6 @@ public class SmsUsageMonitor { } /** - * Return whether the app is approved to send to any short code. - * @param appName the package name of the app requesting to send an SMS - * @return true if the app is approved; false if we need to confirm short code destinations - */ - public boolean isApprovedShortCodeSender(String appName) { - synchronized (mApprovedShortCodeSenders) { - return mApprovedShortCodeSenders.contains(appName); - } - } - - /** - * Add app package name to the list of approved short code senders. - * @param appName the package name of the app to add - */ - public void addApprovedShortCodeSender(String appName) { - if (DBG) log("Adding " + appName + " to list of approved short code senders."); - synchronized (mApprovedShortCodeSenders) { - mApprovedShortCodeSenders.add(appName); - } - } - - /** * Check if the destination is a possible premium short code. * NOTE: the caller is expected to strip non-digits from the destination number with * {@link PhoneNumberUtils#extractNetworkPortion} before calling this method. |