1818
1919import android .animation .Animator ;
2020import android .animation .LayoutTransition ;
21+ import android .animation .TimeInterpolator ;
22+ import android .app .Activity ;
2123import android .app .ActivityManager ;
2224import android .app .ActivityManagerNative ;
2325import android .app .ActivityOptions ;
2426import android .app .TaskStackBuilder ;
2527import android .content .Context ;
2628import android .content .Intent ;
29+ import android .content .res .Configuration ;
2730import android .content .res .Resources ;
2831import android .content .res .TypedArray ;
2932import android .graphics .Bitmap ;
4548import android .view .ViewGroup ;
4649import android .view .accessibility .AccessibilityEvent ;
4750import android .view .animation .AnimationUtils ;
51+ import android .view .animation .DecelerateInterpolator ;
4852import android .widget .AdapterView ;
4953import android .widget .AdapterView .OnItemClickListener ;
5054import android .widget .BaseAdapter ;
5559import android .widget .TextView ;
5660
5761import com .android .systemui .R ;
62+ import com .android .systemui .SystemUIApplication ;
5863import com .android .systemui .statusbar .BaseStatusBar ;
5964import com .android .systemui .statusbar .phone .PhoneStatusBar ;
6065import com .android .systemui .statusbar .tablet .StatusBarPanel ;
6368import java .util .ArrayList ;
6469
6570public 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 ) {
0 commit comments