Merge "Fix bug 7138446: Icon blips in during Recents animation" into jb-mr1-dev

This commit is contained in:
Michael Jurka
2012-10-02 12:28:37 -07:00
committed by Android (Google) Code Review
7 changed files with 105 additions and 9 deletions

View File

@@ -24,13 +24,16 @@
android:layout_width="wrap_content"
android:paddingLeft="@dimen/status_bar_recents_item_padding"
android:paddingRight="@dimen/status_bar_recents_item_padding"
android:importantForAccessibility="no">
android:importantForAccessibility="no"
android:clipChildren="false">
<RelativeLayout android:id="@+id/recent_item"
android:layout_gravity="center_vertical"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingTop="@*android:dimen/status_bar_height">
android:paddingTop="@*android:dimen/status_bar_height"
android:clipChildren="false"
android:clipToPadding="false">
<FrameLayout android:id="@+id/app_thumbnail"
android:layout_width="wrap_content"

View File

@@ -24,12 +24,14 @@
android:layout_width="match_parent"
android:paddingTop="@dimen/status_bar_recents_item_padding"
android:paddingBottom="@dimen/status_bar_recents_item_padding"
android:clipChildren="false"
android:importantForAccessibility="no">
<RelativeLayout android:id="@+id/recent_item"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
android:layout_width="wrap_content"
android:clipChildren="false">
<TextView android:id="@+id/app_label"
android:layout_width="@dimen/status_bar_recents_app_label_width"

View File

@@ -50,6 +50,10 @@
<dimen name="status_bar_recents_app_label_left_margin">0dip</dimen>
<!-- Padding between recents items -->
<dimen name="status_bar_recents_item_padding">0dip</dimen>
<!-- When recents first appears, how far the icon and label of the primary activity
travel -->
<dimen name="status_bar_recents_app_icon_translate_distance">100dp</dimen>
<!-- Where to place the app icon over the thumbnail -->
<dimen name="status_bar_recents_app_icon_left_margin">0dp</dimen>
<dimen name="status_bar_recents_app_icon_top_margin">8dp</dimen>

View File

@@ -19,9 +19,12 @@ package com.android.systemui;
import android.app.Application;
import com.android.systemui.recent.RecentTasksLoader;
import com.android.systemui.recent.RecentsActivity;
public class SystemUIApplication extends Application {
private RecentTasksLoader mRecentTasksLoader;
private boolean mWaitingForWinAnimStart;
private RecentsActivity.WindowAnimationStartListener mWinAnimStartListener;
public RecentTasksLoader getRecentTasksLoader() {
if (mRecentTasksLoader == null) {
@@ -29,4 +32,28 @@ public class SystemUIApplication extends Application {
}
return mRecentTasksLoader;
}
public void setWaitingForWinAnimStart(boolean waiting) {
mWaitingForWinAnimStart = waiting;
}
public void setWindowAnimationStartListener(
RecentsActivity.WindowAnimationStartListener startListener) {
mWinAnimStartListener = startListener;
}
public RecentsActivity.WindowAnimationStartListener getWindowAnimationListener() {
return mWinAnimStartListener;
}
public void onWindowAnimationStart() {
if (mWinAnimStartListener != null) {
mWinAnimStartListener.onWindowAnimationStart();
}
mWaitingForWinAnimStart = false;
}
public boolean isWaitingForWindowAnimationStart() {
return mWaitingForWinAnimStart;
}
}

View File

@@ -51,6 +51,10 @@ public class RecentsActivity extends Activity {
}
};
public static interface WindowAnimationStartListener {
void onWindowAnimationStart();
}
public class TouchOutsideListener implements View.OnTouchListener {
private StatusBarPanel mPanel;
@@ -88,15 +92,15 @@ public class RecentsActivity extends Activity {
@Override
public void onStart() {
mShowing = true;
if (mRecentsPanel != null) {
mRecentsPanel.refreshViews();
}
super.onStart();
}
@Override
public void onResume() {
mForeground = true;
if (mRecentsPanel != null) {
mRecentsPanel.refreshViews();
}
super.onResume();
}
@@ -150,6 +154,7 @@ public class RecentsActivity extends Activity {
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(CLOSE_RECENTS_INTENT);
registerReceiver(mIntentReceiver, mIntentFilter);
app.setWindowAnimationStartListener(mRecentsPanel);
super.onCreate(savedInstanceState);
}
@@ -164,6 +169,7 @@ public class RecentsActivity extends Activity {
final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
recentTasksLoader.setRecentsPanel(null, mRecentsPanel);
unregisterReceiver(mIntentReceiver);
app.setWindowAnimationStartListener(null);
super.onDestroy();
}

View File

@@ -18,12 +18,15 @@ package com.android.systemui.recent;
import android.animation.Animator;
import android.animation.LayoutTransition;
import android.animation.TimeInterpolator;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.ActivityOptions;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
@@ -45,6 +48,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
@@ -55,6 +59,7 @@ import android.widget.PopupMenu;
import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.SystemUIApplication;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.tablet.StatusBarPanel;
@@ -63,7 +68,7 @@ import com.android.systemui.statusbar.tablet.TabletStatusBar;
import java.util.ArrayList;
public class RecentsPanelView extends FrameLayout implements OnItemClickListener, RecentsCallback,
StatusBarPanel, Animator.AnimatorListener {
StatusBarPanel, Animator.AnimatorListener, RecentsActivity.WindowAnimationStartListener {
static final String TAG = "RecentsPanelView";
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
private PopupMenu mPopup;
@@ -75,6 +80,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
private boolean mShowing;
private boolean mWaitingToShow;
private int mNumItemsWaitingForThumbnailsAndIcons;
private ViewHolder mItemToAnimateInWhenWindowAnimationIsFinished;
private RecentTasksLoader mRecentTasksLoader;
private ArrayList<TaskDescription> mRecentTaskDescriptions;
@@ -109,6 +115,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
ImageView iconView;
TextView labelView;
TextView descriptionView;
View calloutLine;
TaskDescription taskDescription;
boolean loadedThumbnailAndIcon;
}
@@ -148,6 +155,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
holder.iconView.setImageBitmap(mRecentTasksLoader.getDefaultIcon());
}
holder.labelView = (TextView) convertView.findViewById(R.id.app_label);
holder.calloutLine = convertView.findViewById(R.id.recents_callout_line);
holder.descriptionView = (TextView) convertView.findViewById(R.id.app_description);
convertView.setTag(holder);
@@ -173,6 +181,28 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
updateIcon(holder, td.getIcon(), true, false);
mNumItemsWaitingForThumbnailsAndIcons--;
}
if (index == 0) {
final Activity activity = (Activity) RecentsPanelView.this.getContext();
final SystemUIApplication app = (SystemUIApplication) activity.getApplication();
if (app.isWaitingForWindowAnimationStart()) {
mItemToAnimateInWhenWindowAnimationIsFinished = holder;
final int translation = -getResources().getDimensionPixelSize(
R.dimen.status_bar_recents_app_icon_translate_distance);
final Configuration config = getResources().getConfiguration();
if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
for (View v :
new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
if (v != null) {
v.setAlpha(0f);
v.setTranslationX(translation);
}
}
} else {
holder.iconView.setAlpha(0f);
holder.iconView.setTranslationY(translation);
}
}
}
holder.thumbnailView.setTag(td);
holder.thumbnailView.setOnLongClickListener(new OnLongClickDelegate(convertView));
@@ -506,6 +536,23 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
return null;
}
public void onWindowAnimationStart() {
if (mItemToAnimateInWhenWindowAnimationIsFinished != null) {
final int startDelay = 100;
final int duration = 250;
final ViewHolder holder = mItemToAnimateInWhenWindowAnimationIsFinished;
final TimeInterpolator cubic = new DecelerateInterpolator(1.5f);
for (View v :
new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
if (v != null) {
v.animate().translationX(0).translationY(0).alpha(1f).setStartDelay(startDelay)
.setDuration(duration).setInterpolator(cubic);
}
}
mItemToAnimateInWhenWindowAnimationIsFinished = null;
}
}
public void clearRecentTasksList() {
// Clear memory used by screenshots
if (mRecentTaskDescriptions != null) {

View File

@@ -544,7 +544,7 @@ public abstract class BaseStatusBar extends SystemUI implements
- p.getFontMetricsInt().top;
float descriptionTextSize = res
.getDimensionPixelSize(R.dimen.status_bar_recents_app_description_text_size);
p.setTextSize(labelTextSize);
p.setTextSize(descriptionTextSize);
float descriptionTextHeight = p.getFontMetricsInt().bottom
- p.getFontMetricsInt().top;
@@ -567,10 +567,17 @@ public abstract class BaseStatusBar extends SystemUI implements
+ recentsItemTopPadding + thumbBgPadding + statusBarHeight);
}
final SystemUIApplication app =
(SystemUIApplication) ((Service) mContext).getApplication();
app.setWaitingForWinAnimStart(true);
ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(
getStatusBarView(),
first, x, y,
null);
new ActivityOptions.OnAnimationStartedListener() {
public void onAnimationStarted() {
app.onWindowAnimationStart();
}
});
mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
UserHandle.USER_CURRENT));
}