Skip to content

Commit f175525

Browse files
mikejurkaAndroid (Google) Code Review
authored andcommitted
Merge "Fix bug 7138446: Icon blips in during Recents animation" into jb-mr1-dev
2 parents 141efcb + 9bdaada commit f175525

File tree

7 files changed

+105
-9
lines changed

7 files changed

+105
-9
lines changed

packages/SystemUI/res/layout-land/status_bar_recent_item.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,16 @@
2424
android:layout_width="wrap_content"
2525
android:paddingLeft="@dimen/status_bar_recents_item_padding"
2626
android:paddingRight="@dimen/status_bar_recents_item_padding"
27-
android:importantForAccessibility="no">
27+
android:importantForAccessibility="no"
28+
android:clipChildren="false">
2829

2930
<RelativeLayout android:id="@+id/recent_item"
3031
android:layout_gravity="center_vertical"
3132
android:layout_height="wrap_content"
3233
android:layout_width="wrap_content"
33-
android:paddingTop="@*android:dimen/status_bar_height">
34+
android:paddingTop="@*android:dimen/status_bar_height"
35+
android:clipChildren="false"
36+
android:clipToPadding="false">
3437

3538
<FrameLayout android:id="@+id/app_thumbnail"
3639
android:layout_width="wrap_content"

packages/SystemUI/res/layout/status_bar_recent_item.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@
2424
android:layout_width="match_parent"
2525
android:paddingTop="@dimen/status_bar_recents_item_padding"
2626
android:paddingBottom="@dimen/status_bar_recents_item_padding"
27+
android:clipChildren="false"
2728
android:importantForAccessibility="no">
2829

2930
<RelativeLayout android:id="@+id/recent_item"
3031
android:layout_gravity="center_horizontal"
3132
android:layout_height="wrap_content"
32-
android:layout_width="wrap_content">
33+
android:layout_width="wrap_content"
34+
android:clipChildren="false">
3335

3436
<TextView android:id="@+id/app_label"
3537
android:layout_width="@dimen/status_bar_recents_app_label_width"

packages/SystemUI/res/values/dimens.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
<dimen name="status_bar_recents_app_label_left_margin">0dip</dimen>
5151
<!-- Padding between recents items -->
5252
<dimen name="status_bar_recents_item_padding">0dip</dimen>
53+
<!-- When recents first appears, how far the icon and label of the primary activity
54+
travel -->
55+
<dimen name="status_bar_recents_app_icon_translate_distance">100dp</dimen>
56+
5357
<!-- Where to place the app icon over the thumbnail -->
5458
<dimen name="status_bar_recents_app_icon_left_margin">0dp</dimen>
5559
<dimen name="status_bar_recents_app_icon_top_margin">8dp</dimen>

packages/SystemUI/src/com/android/systemui/SystemUIApplication.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,41 @@
1919
import android.app.Application;
2020

2121
import com.android.systemui.recent.RecentTasksLoader;
22+
import com.android.systemui.recent.RecentsActivity;
2223

2324
public class SystemUIApplication extends Application {
2425
private RecentTasksLoader mRecentTasksLoader;
26+
private boolean mWaitingForWinAnimStart;
27+
private RecentsActivity.WindowAnimationStartListener mWinAnimStartListener;
2528

2629
public RecentTasksLoader getRecentTasksLoader() {
2730
if (mRecentTasksLoader == null) {
2831
mRecentTasksLoader = new RecentTasksLoader(this);
2932
}
3033
return mRecentTasksLoader;
3134
}
35+
36+
public void setWaitingForWinAnimStart(boolean waiting) {
37+
mWaitingForWinAnimStart = waiting;
38+
}
39+
40+
public void setWindowAnimationStartListener(
41+
RecentsActivity.WindowAnimationStartListener startListener) {
42+
mWinAnimStartListener = startListener;
43+
}
44+
45+
public RecentsActivity.WindowAnimationStartListener getWindowAnimationListener() {
46+
return mWinAnimStartListener;
47+
}
48+
49+
public void onWindowAnimationStart() {
50+
if (mWinAnimStartListener != null) {
51+
mWinAnimStartListener.onWindowAnimationStart();
52+
}
53+
mWaitingForWinAnimStart = false;
54+
}
55+
56+
public boolean isWaitingForWindowAnimationStart() {
57+
return mWaitingForWinAnimStart;
58+
}
3259
}

packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ public void onReceive(Context context, Intent intent) {
5151
}
5252
};
5353

54+
public static interface WindowAnimationStartListener {
55+
void onWindowAnimationStart();
56+
}
57+
5458
public class TouchOutsideListener implements View.OnTouchListener {
5559
private StatusBarPanel mPanel;
5660

@@ -88,15 +92,15 @@ public void onStop() {
8892
@Override
8993
public void onStart() {
9094
mShowing = true;
95+
if (mRecentsPanel != null) {
96+
mRecentsPanel.refreshViews();
97+
}
9198
super.onStart();
9299
}
93100

94101
@Override
95102
public void onResume() {
96103
mForeground = true;
97-
if (mRecentsPanel != null) {
98-
mRecentsPanel.refreshViews();
99-
}
100104
super.onResume();
101105
}
102106

@@ -150,6 +154,7 @@ protected void onCreate(Bundle savedInstanceState) {
150154
mIntentFilter = new IntentFilter();
151155
mIntentFilter.addAction(CLOSE_RECENTS_INTENT);
152156
registerReceiver(mIntentReceiver, mIntentFilter);
157+
app.setWindowAnimationStartListener(mRecentsPanel);
153158
super.onCreate(savedInstanceState);
154159
}
155160

@@ -164,6 +169,7 @@ protected void onDestroy() {
164169
final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
165170
recentTasksLoader.setRecentsPanel(null, mRecentsPanel);
166171
unregisterReceiver(mIntentReceiver);
172+
app.setWindowAnimationStartListener(null);
167173
super.onDestroy();
168174
}
169175

packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@
1818

1919
import android.animation.Animator;
2020
import android.animation.LayoutTransition;
21+
import android.animation.TimeInterpolator;
22+
import android.app.Activity;
2123
import android.app.ActivityManager;
2224
import android.app.ActivityManagerNative;
2325
import android.app.ActivityOptions;
2426
import android.app.TaskStackBuilder;
2527
import android.content.Context;
2628
import android.content.Intent;
29+
import android.content.res.Configuration;
2730
import android.content.res.Resources;
2831
import android.content.res.TypedArray;
2932
import android.graphics.Bitmap;
@@ -45,6 +48,7 @@
4548
import android.view.ViewGroup;
4649
import android.view.accessibility.AccessibilityEvent;
4750
import android.view.animation.AnimationUtils;
51+
import android.view.animation.DecelerateInterpolator;
4852
import android.widget.AdapterView;
4953
import android.widget.AdapterView.OnItemClickListener;
5054
import android.widget.BaseAdapter;
@@ -55,6 +59,7 @@
5559
import android.widget.TextView;
5660

5761
import com.android.systemui.R;
62+
import com.android.systemui.SystemUIApplication;
5863
import com.android.systemui.statusbar.BaseStatusBar;
5964
import com.android.systemui.statusbar.phone.PhoneStatusBar;
6065
import com.android.systemui.statusbar.tablet.StatusBarPanel;
@@ -63,7 +68,7 @@
6368
import java.util.ArrayList;
6469

6570
public class RecentsPanelView extends FrameLayout implements OnItemClickListener, RecentsCallback,
66-
StatusBarPanel, Animator.AnimatorListener {
71+
StatusBarPanel, Animator.AnimatorListener, RecentsActivity.WindowAnimationStartListener {
6772
static final String TAG = "RecentsPanelView";
6873
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
6974
private PopupMenu mPopup;
@@ -75,6 +80,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
7580
private boolean mShowing;
7681
private boolean mWaitingToShow;
7782
private int mNumItemsWaitingForThumbnailsAndIcons;
83+
private ViewHolder mItemToAnimateInWhenWindowAnimationIsFinished;
7884

7985
private RecentTasksLoader mRecentTasksLoader;
8086
private ArrayList<TaskDescription> mRecentTaskDescriptions;
@@ -109,6 +115,7 @@ public boolean onLongClick(View v) {
109115
ImageView iconView;
110116
TextView labelView;
111117
TextView descriptionView;
118+
View calloutLine;
112119
TaskDescription taskDescription;
113120
boolean loadedThumbnailAndIcon;
114121
}
@@ -148,6 +155,7 @@ public View createView(ViewGroup parent) {
148155
holder.iconView.setImageBitmap(mRecentTasksLoader.getDefaultIcon());
149156
}
150157
holder.labelView = (TextView) convertView.findViewById(R.id.app_label);
158+
holder.calloutLine = convertView.findViewById(R.id.recents_callout_line);
151159
holder.descriptionView = (TextView) convertView.findViewById(R.id.app_description);
152160

153161
convertView.setTag(holder);
@@ -173,6 +181,28 @@ public View getView(int position, View convertView, ViewGroup parent) {
173181
updateIcon(holder, td.getIcon(), true, false);
174182
mNumItemsWaitingForThumbnailsAndIcons--;
175183
}
184+
if (index == 0) {
185+
final Activity activity = (Activity) RecentsPanelView.this.getContext();
186+
final SystemUIApplication app = (SystemUIApplication) activity.getApplication();
187+
if (app.isWaitingForWindowAnimationStart()) {
188+
mItemToAnimateInWhenWindowAnimationIsFinished = holder;
189+
final int translation = -getResources().getDimensionPixelSize(
190+
R.dimen.status_bar_recents_app_icon_translate_distance);
191+
final Configuration config = getResources().getConfiguration();
192+
if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
193+
for (View v :
194+
new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
195+
if (v != null) {
196+
v.setAlpha(0f);
197+
v.setTranslationX(translation);
198+
}
199+
}
200+
} else {
201+
holder.iconView.setAlpha(0f);
202+
holder.iconView.setTranslationY(translation);
203+
}
204+
}
205+
}
176206

177207
holder.thumbnailView.setTag(td);
178208
holder.thumbnailView.setOnLongClickListener(new OnLongClickDelegate(convertView));
@@ -506,6 +536,23 @@ public TaskDescription getBottomTask() {
506536
return null;
507537
}
508538

539+
public void onWindowAnimationStart() {
540+
if (mItemToAnimateInWhenWindowAnimationIsFinished != null) {
541+
final int startDelay = 100;
542+
final int duration = 250;
543+
final ViewHolder holder = mItemToAnimateInWhenWindowAnimationIsFinished;
544+
final TimeInterpolator cubic = new DecelerateInterpolator(1.5f);
545+
for (View v :
546+
new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
547+
if (v != null) {
548+
v.animate().translationX(0).translationY(0).alpha(1f).setStartDelay(startDelay)
549+
.setDuration(duration).setInterpolator(cubic);
550+
}
551+
}
552+
mItemToAnimateInWhenWindowAnimationIsFinished = null;
553+
}
554+
}
555+
509556
public void clearRecentTasksList() {
510557
// Clear memory used by screenshots
511558
if (mRecentTaskDescriptions != null) {

packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ protected void toggleRecentsActivity() {
544544
- p.getFontMetricsInt().top;
545545
float descriptionTextSize = res
546546
.getDimensionPixelSize(R.dimen.status_bar_recents_app_description_text_size);
547-
p.setTextSize(labelTextSize);
547+
p.setTextSize(descriptionTextSize);
548548
float descriptionTextHeight = p.getFontMetricsInt().bottom
549549
- p.getFontMetricsInt().top;
550550

@@ -567,10 +567,17 @@ protected void toggleRecentsActivity() {
567567
+ recentsItemTopPadding + thumbBgPadding + statusBarHeight);
568568
}
569569

570+
final SystemUIApplication app =
571+
(SystemUIApplication) ((Service) mContext).getApplication();
572+
app.setWaitingForWinAnimStart(true);
570573
ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(
571574
getStatusBarView(),
572575
first, x, y,
573-
null);
576+
new ActivityOptions.OnAnimationStartedListener() {
577+
public void onAnimationStarted() {
578+
app.onWindowAnimationStart();
579+
}
580+
});
574581
mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
575582
UserHandle.USER_CURRENT));
576583
}

0 commit comments

Comments
 (0)