Home | History | Annotate | Download | only in activity
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.android.test.activity;
     18 
     19 import java.util.ArrayList;
     20 import java.util.List;
     21 
     22 import android.app.Activity;
     23 import android.app.ActivityManager;
     24 import android.app.ActivityOptions;
     25 import android.app.AlarmManager;
     26 import android.app.AlertDialog;
     27 import android.app.PendingIntent;
     28 import android.content.ActivityNotFoundException;
     29 import android.content.BroadcastReceiver;
     30 import android.content.ComponentName;
     31 import android.content.ContentProviderClient;
     32 import android.content.Intent;
     33 import android.content.ServiceConnection;
     34 import android.graphics.BitmapFactory;
     35 import android.net.Uri;
     36 import android.os.Bundle;
     37 import android.os.Handler;
     38 import android.os.IBinder;
     39 import android.os.Message;
     40 import android.os.PowerManager;
     41 import android.os.RemoteException;
     42 import android.os.SystemClock;
     43 import android.os.UserHandle;
     44 import android.os.UserManager;
     45 import android.graphics.Bitmap;
     46 import android.provider.Settings;
     47 import android.widget.ImageView;
     48 import android.widget.LinearLayout;
     49 import android.widget.TextView;
     50 import android.widget.ScrollView;
     51 import android.widget.Toast;
     52 import android.view.Menu;
     53 import android.view.MenuItem;
     54 import android.view.View;
     55 import android.content.Context;
     56 import android.content.pm.UserInfo;
     57 import android.content.res.Configuration;
     58 import android.util.Log;
     59 
     60 
     61 public class ActivityTestMain extends Activity {
     62     static final String TAG = "ActivityTest";
     63 
     64     static final String KEY_CONFIGURATION = "configuration";
     65 
     66     ActivityManager mAm;
     67     PowerManager mPower;
     68     AlarmManager mAlarm;
     69     Configuration mOverrideConfig;
     70     int mSecondUser;
     71 
     72     ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>();
     73 
     74     ServiceConnection mIsolatedConnection;
     75 
     76     static final int MSG_SPAM = 1;
     77     static final int MSG_SPAM_ALARM = 2;
     78 
     79     final Handler mHandler = new Handler() {
     80         @Override
     81         public void handleMessage(Message msg) {
     82             switch (msg.what) {
     83                 case MSG_SPAM: {
     84                     boolean fg = msg.arg1 != 0;
     85                     Intent intent = new Intent(ActivityTestMain.this, SpamActivity.class);
     86                     Bundle options = null;
     87                     if (fg) {
     88                         ActivityOptions opts = ActivityOptions.makeTaskLaunchBehind();
     89                         options = opts.toBundle();
     90                     }
     91                     startActivity(intent, options);
     92                     scheduleSpam(!fg);
     93                 } break;
     94                 case MSG_SPAM_ALARM: {
     95                     long when = SystemClock.elapsedRealtime();
     96                     Intent intent = new Intent(ActivityTestMain.this, AlarmSpamReceiver.class);
     97                     intent.setAction("com.example.SPAM_ALARM=" + when);
     98                     PendingIntent pi = PendingIntent.getBroadcast(ActivityTestMain.this,
     99                             0, intent, 0);
    100                     mAlarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, when+(30*1000), pi);
    101                     scheduleSpamAlarm(30*1000);
    102                 } break;
    103             }
    104             super.handleMessage(msg);
    105         }
    106     };
    107 
    108     class BroadcastResultReceiver extends BroadcastReceiver {
    109         @Override
    110         public void onReceive(Context context, Intent intent) {
    111             Bundle res = getResultExtras(true);
    112             int user = res.getInt("user", -1);
    113             Toast.makeText(ActivityTestMain.this,
    114                     "Receiver executed as user "
    115                     + (user >= 0 ? Integer.toString(user) : "unknown"),
    116                     Toast.LENGTH_LONG).show();
    117         }
    118     }
    119 
    120     private void addThumbnail(LinearLayout container, Bitmap bm,
    121             final ActivityManager.RecentTaskInfo task,
    122             final ActivityManager.TaskThumbnail thumbs) {
    123         ImageView iv = new ImageView(this);
    124         if (bm != null) {
    125             iv.setImageBitmap(bm);
    126         }
    127         iv.setBackgroundResource(android.R.drawable.gallery_thumb);
    128         int w = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_width);
    129         int h = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_height);
    130         container.addView(iv, new LinearLayout.LayoutParams(w, h));
    131 
    132         iv.setOnClickListener(new View.OnClickListener() {
    133             @Override
    134             public void onClick(View v) {
    135                 if (task.id >= 0 && thumbs != null) {
    136                     mAm.moveTaskToFront(task.id, ActivityManager.MOVE_TASK_WITH_HOME);
    137                 } else {
    138                     try {
    139                         startActivity(task.baseIntent);
    140                     } catch (ActivityNotFoundException e) {
    141                         Log.w("foo", "Unable to start task: " + e);
    142                     }
    143                 }
    144                 buildUi();
    145             }
    146         });
    147         iv.setOnLongClickListener(new View.OnLongClickListener() {
    148             @Override
    149             public boolean onLongClick(View v) {
    150                 if (task.id >= 0 && thumbs != null) {
    151                     mAm.removeTask(task.id);
    152                     buildUi();
    153                     return true;
    154                 }
    155                 return false;
    156             }
    157         });
    158     }
    159 
    160     @Override
    161     protected void onCreate(Bundle savedInstanceState) {
    162         super.onCreate(savedInstanceState);
    163 
    164         Log.i(TAG, "Referrer: " + getReferrer());
    165 
    166         mAm = getSystemService(ActivityManager.class);
    167         mPower = getSystemService(PowerManager.class);
    168         mAlarm = getSystemService(AlarmManager.class);
    169         if (savedInstanceState != null) {
    170             mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION);
    171             if (mOverrideConfig != null) {
    172                 applyOverrideConfiguration(mOverrideConfig);
    173             }
    174         }
    175 
    176         UserManager um = (UserManager)getSystemService(Context.USER_SERVICE);
    177         List<UserInfo> users = um.getUsers();
    178         mSecondUser = Integer.MAX_VALUE;
    179         for (UserInfo ui : users) {
    180             if (ui.id != 0 && mSecondUser > ui.id) {
    181                 mSecondUser = ui.id;
    182             }
    183         }
    184 
    185         /*
    186         AlertDialog ad = new AlertDialog.Builder(this).setTitle("title").setMessage("message").create();
    187         ad.getWindow().getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    188         ad.show();
    189         */
    190     }
    191 
    192     @Override
    193     public boolean onCreateOptionsMenu(Menu menu) {
    194         menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    195             @Override
    196             public boolean onMenuItemClick(MenuItem item) {
    197                 AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this,
    198                         R.style.SlowDialog);
    199                 builder.setTitle("This is a title");
    200                 builder.show();
    201                 return true;
    202             }
    203         });
    204         menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    205             @Override public boolean onMenuItemClick(MenuItem item) {
    206                 Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
    207                 ServiceConnection conn = new ServiceConnection() {
    208                     @Override
    209                     public void onServiceConnected(ComponentName name, IBinder service) {
    210                         Log.i(TAG, "Service connected " + name + " " + service);
    211                     }
    212                     @Override
    213                     public void onServiceDisconnected(ComponentName name) {
    214                         Log.i(TAG, "Service disconnected " + name);
    215                     }
    216                 };
    217                 if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
    218                     mConnections.add(conn);
    219                 } else {
    220                     Toast.makeText(ActivityTestMain.this, "Failed to bind",
    221                             Toast.LENGTH_LONG).show();
    222                 }
    223                 return true;
    224             }
    225         });
    226         menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    227             @Override public boolean onMenuItemClick(MenuItem item) {
    228                 Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
    229                 startService(intent);
    230                 return true;
    231             }
    232         });
    233         menu.add("Rebind Isolated!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    234             @Override public boolean onMenuItemClick(MenuItem item) {
    235                 Intent intent = new Intent(ActivityTestMain.this, IsolatedService.class);
    236                 ServiceConnection conn = new ServiceConnection() {
    237                     @Override
    238                     public void onServiceConnected(ComponentName name, IBinder service) {
    239                         Log.i(TAG, "Isolated service connected " + name + " " + service);
    240                     }
    241                     @Override
    242                     public void onServiceDisconnected(ComponentName name) {
    243                         Log.i(TAG, "Isolated service disconnected " + name);
    244                     }
    245                 };
    246                 if (mIsolatedConnection != null) {
    247                     Log.i(TAG, "Unbinding existing service: " + mIsolatedConnection);
    248                     unbindService(mIsolatedConnection);
    249                     mIsolatedConnection = null;
    250                 }
    251                 Log.i(TAG, "Binding new service: " + conn);
    252                 if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
    253                     mIsolatedConnection = conn;
    254                 } else {
    255                     Toast.makeText(ActivityTestMain.this, "Failed to bind",
    256                             Toast.LENGTH_LONG).show();
    257                 }
    258                 return true;
    259             }
    260         });
    261         menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    262             @Override public boolean onMenuItemClick(MenuItem item) {
    263                 Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class);
    264                 sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(),
    265                         null, Activity.RESULT_OK, null, null);
    266                 return true;
    267             }
    268         });
    269         menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    270             @Override public boolean onMenuItemClick(MenuItem item) {
    271                 ContentProviderClient cpl = getContentResolver().acquireContentProviderClient(
    272                         SingleUserProvider.AUTHORITY);
    273                 Bundle res = null;
    274                 try {
    275                     res = cpl.call("getuser", null, null);
    276                 } catch (RemoteException e) {
    277                 }
    278                 int user = res != null ? res.getInt("user", -1) : -1;
    279                 Toast.makeText(ActivityTestMain.this,
    280                         "Provider executed as user "
    281                         + (user >= 0 ? Integer.toString(user) : "unknown"),
    282                         Toast.LENGTH_LONG).show();
    283                 cpl.release();
    284                 return true;
    285             }
    286         });
    287         menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    288             @Override public boolean onMenuItemClick(MenuItem item) {
    289                 Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
    290                 sendOrderedBroadcastAsUser(intent, new UserHandle(0), null,
    291                         new BroadcastResultReceiver(),
    292                         null, Activity.RESULT_OK, null, null);
    293                 return true;
    294             }
    295         });
    296         menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener(
    297                 new MenuItem.OnMenuItemClickListener() {
    298             @Override public boolean onMenuItemClick(MenuItem item) {
    299                 Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
    300                 sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null,
    301                         new BroadcastResultReceiver(),
    302                         null, Activity.RESULT_OK, null, null);
    303                 return true;
    304             }
    305         });
    306         menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    307             @Override public boolean onMenuItemClick(MenuItem item) {
    308                 Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
    309                 ServiceConnection conn = new ServiceConnection() {
    310                     @Override
    311                     public void onServiceConnected(ComponentName name, IBinder service) {
    312                         Log.i(TAG, "Service connected " + name + " " + service);
    313                     }
    314                     @Override
    315                     public void onServiceDisconnected(ComponentName name) {
    316                         Log.i(TAG, "Service disconnected " + name);
    317                     }
    318                 };
    319                 if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
    320                     mConnections.add(conn);
    321                 } else {
    322                     Toast.makeText(ActivityTestMain.this, "Failed to bind",
    323                             Toast.LENGTH_LONG).show();
    324                 }
    325                 return true;
    326             }
    327         });
    328         menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener(
    329                 new MenuItem.OnMenuItemClickListener() {
    330             @Override public boolean onMenuItemClick(MenuItem item) {
    331                 Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
    332                 ServiceConnection conn = new ServiceConnection() {
    333                     @Override
    334                     public void onServiceConnected(ComponentName name, IBinder service) {
    335                         Log.i(TAG, "Service connected " + name + " " + service);
    336                     }
    337                     @Override
    338                     public void onServiceDisconnected(ComponentName name) {
    339                         Log.i(TAG, "Service disconnected " + name);
    340                     }
    341                 };
    342                 if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE,
    343                         new UserHandle(mSecondUser))) {
    344                     mConnections.add(conn);
    345                 } else {
    346                     Toast.makeText(ActivityTestMain.this, "Failed to bind",
    347                             Toast.LENGTH_LONG).show();
    348                 }
    349                 return true;
    350             }
    351         });
    352         menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    353             @Override public boolean onMenuItemClick(MenuItem item) {
    354                 if (mOverrideConfig == null) {
    355                     mOverrideConfig = new Configuration();
    356                 }
    357                 if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) {
    358                     mOverrideConfig.densityDpi = (getApplicationContext().getResources()
    359                             .getConfiguration().densityDpi*2)/3;
    360                 } else {
    361                     mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED;
    362                 }
    363                 recreate();
    364                 return true;
    365             }
    366         });
    367         menu.add("HashArray").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    368             @Override public boolean onMenuItemClick(MenuItem item) {
    369                 ArrayMapTests.run();
    370                 return true;
    371             }
    372         });
    373         menu.add("Add App Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    374             @Override public boolean onMenuItemClick(MenuItem item) {
    375                 addAppRecents(1);
    376                 return true;
    377             }
    378         });
    379         menu.add("Add App 10x Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    380             @Override public boolean onMenuItemClick(MenuItem item) {
    381                 addAppRecents(10);
    382                 return true;
    383             }
    384         });
    385         menu.add("Exclude!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    386             @Override public boolean onMenuItemClick(MenuItem item) {
    387                 setExclude(true);
    388                 return true;
    389             }
    390         });
    391         menu.add("Include!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    392             @Override public boolean onMenuItemClick(MenuItem item) {
    393                 setExclude(false);
    394                 return true;
    395             }
    396         });
    397         menu.add("Open Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    398             @Override public boolean onMenuItemClick(MenuItem item) {
    399                 ActivityManager.AppTask task = findDocTask();
    400                 if (task == null) {
    401                     Intent intent = new Intent(ActivityTestMain.this, DocActivity.class);
    402                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT
    403                             | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
    404                             | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
    405                     startActivity(intent);
    406                 } else {
    407                     task.moveToFront();
    408                 }
    409                 return true;
    410             }
    411         });
    412         menu.add("Stack Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    413             @Override public boolean onMenuItemClick(MenuItem item) {
    414                 ActivityManager.AppTask task = findDocTask();
    415                 if (task != null) {
    416                     ActivityManager.RecentTaskInfo recent = task.getTaskInfo();
    417                     Intent intent = new Intent(ActivityTestMain.this, DocActivity.class);
    418                     if (recent.id >= 0) {
    419                         // Stack on top.
    420                         intent.putExtra(DocActivity.LABEL, "Stacked");
    421                     } else {
    422                         // Start root activity.
    423                         intent.putExtra(DocActivity.LABEL, "New Root");
    424                     }
    425                     task.startActivity(ActivityTestMain.this, intent, null);
    426                 }
    427                 return true;
    428             }
    429         });
    430         menu.add("Spam!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    431             @Override public boolean onMenuItemClick(MenuItem item) {
    432                 scheduleSpam(false);
    433                 return true;
    434             }
    435         });
    436         menu.add("Track time").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    437             @Override public boolean onMenuItemClick(MenuItem item) {
    438                 Intent intent = new Intent(Intent.ACTION_SEND);
    439                 intent.setType("text/plain");
    440                 intent.putExtra(Intent.EXTRA_TEXT, "We are sharing this with you!");
    441                 ActivityOptions options = ActivityOptions.makeBasic();
    442                 Intent receiveIntent = new Intent(ActivityTestMain.this, TrackTimeReceiver.class);
    443                 receiveIntent.putExtra("something", "yeah, this is us!");
    444                 options.requestUsageTimeReport(PendingIntent.getBroadcast(ActivityTestMain.this,
    445                         0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
    446                 startActivity(Intent.createChooser(intent, "Who do you love?"), options.toBundle());
    447                 return true;
    448             }
    449         });
    450         menu.add("Transaction fail").setOnMenuItemClickListener(
    451                 new MenuItem.OnMenuItemClickListener() {
    452             @Override public boolean onMenuItemClick(MenuItem item) {
    453                 Intent intent = new Intent(Intent.ACTION_MAIN);
    454                 intent.putExtra("gulp", new int[1024 * 1024]);
    455                 startActivity(intent);
    456                 return true;
    457             }
    458         });
    459         menu.add("Spam idle alarm").setOnMenuItemClickListener(
    460                 new MenuItem.OnMenuItemClickListener() {
    461             @Override public boolean onMenuItemClick(MenuItem item) {
    462                 scheduleSpamAlarm(0);
    463                 return true;
    464             }
    465         });
    466         menu.add("Ignore battery optimizations").setOnMenuItemClickListener(
    467                 new MenuItem.OnMenuItemClickListener() {
    468             @Override public boolean onMenuItemClick(MenuItem item) {
    469                 Intent intent;
    470                 if (!mPower.isIgnoringBatteryOptimizations(getPackageName())) {
    471                     intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    472                     intent.setData(Uri.fromParts("package", getPackageName(), null));
    473                 } else {
    474                     intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    475                 }
    476                 startActivity(intent);
    477                 return true;
    478             }
    479         });
    480         return true;
    481     }
    482 
    483     @Override
    484     protected void onStart() {
    485         super.onStart();
    486         buildUi();
    487     }
    488 
    489     @Override
    490     protected void onPause() {
    491         super.onPause();
    492         Log.i(TAG, "I'm such a slooow poor loser");
    493         try {
    494             Thread.sleep(500);
    495         } catch (InterruptedException e) {
    496         }
    497         Log.i(TAG, "See?");
    498     }
    499 
    500     @Override
    501     protected void onSaveInstanceState(Bundle outState) {
    502         super.onSaveInstanceState(outState);
    503         if (mOverrideConfig != null) {
    504             outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig);
    505         }
    506     }
    507 
    508     @Override
    509     protected void onStop() {
    510         super.onStop();
    511         mHandler.removeMessages(MSG_SPAM_ALARM);
    512         for (ServiceConnection conn : mConnections) {
    513             unbindService(conn);
    514         }
    515         mConnections.clear();
    516         if (mIsolatedConnection != null) {
    517             unbindService(mIsolatedConnection);
    518             mIsolatedConnection = null;
    519         }
    520     }
    521 
    522     @Override
    523     protected void onDestroy() {
    524         super.onDestroy();
    525         mHandler.removeMessages(MSG_SPAM);
    526     }
    527 
    528     void addAppRecents(int count) {
    529         ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    530         Intent intent = new Intent(Intent.ACTION_MAIN);
    531         intent.addCategory(Intent.CATEGORY_LAUNCHER);
    532         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
    533         intent.setComponent(new ComponentName(this, ActivityTestMain.class));
    534         for (int i=0; i<count; i++) {
    535             ActivityManager.TaskDescription desc = new ActivityManager.TaskDescription();
    536             desc.setLabel("Added #" + i);
    537             Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    538             if ((i&1) == 0) {
    539                 desc.setIcon(bitmap);
    540             }
    541             int taskId = am.addAppTask(this, intent, desc, bitmap);
    542             Log.i(TAG, "Added new task id #" + taskId);
    543         }
    544     }
    545 
    546     void setExclude(boolean exclude) {
    547         ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    548         List<ActivityManager.AppTask> tasks = am.getAppTasks();
    549         int taskId = getTaskId();
    550         for (int i=0; i<tasks.size(); i++) {
    551             ActivityManager.AppTask task = tasks.get(i);
    552             if (task.getTaskInfo().id == taskId) {
    553                 task.setExcludeFromRecents(exclude);
    554             }
    555         }
    556     }
    557 
    558     ActivityManager.AppTask findDocTask() {
    559         ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    560         List<ActivityManager.AppTask> tasks = am.getAppTasks();
    561         if (tasks != null) {
    562             for (int i=0; i<tasks.size(); i++) {
    563                 ActivityManager.AppTask task = tasks.get(i);
    564                 ActivityManager.RecentTaskInfo recent = task.getTaskInfo();
    565                 if (recent.baseIntent != null
    566                         && recent.baseIntent.getComponent().getClassName().equals(
    567                                 DocActivity.class.getCanonicalName())) {
    568                     return task;
    569                 }
    570             }
    571         }
    572         return null;
    573     }
    574 
    575     void scheduleSpam(boolean fg) {
    576         mHandler.removeMessages(MSG_SPAM);
    577         Message msg = mHandler.obtainMessage(MSG_SPAM, fg ? 1 : 0, 0);
    578         mHandler.sendMessageDelayed(msg, 500);
    579     }
    580 
    581     void scheduleSpamAlarm(long delay) {
    582         mHandler.removeMessages(MSG_SPAM_ALARM);
    583         Message msg = mHandler.obtainMessage(MSG_SPAM_ALARM);
    584         mHandler.sendMessageDelayed(msg, delay);
    585     }
    586 
    587     private View scrollWrap(View view) {
    588         ScrollView scroller = new ScrollView(this);
    589         scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
    590                 ScrollView.LayoutParams.MATCH_PARENT));
    591         return scroller;
    592     }
    593 
    594     private void buildUi() {
    595         LinearLayout top = new LinearLayout(this);
    596         top.setOrientation(LinearLayout.VERTICAL);
    597 
    598         List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10,
    599                 ActivityManager.RECENT_WITH_EXCLUDED);
    600         if (recents != null) {
    601             for (int i=0; i<recents.size(); i++) {
    602                 ActivityManager.RecentTaskInfo r = recents.get(i);
    603                 ActivityManager.TaskThumbnail tt = mAm.getTaskThumbnail(r.persistentId);
    604                 TextView tv = new TextView(this);
    605                 tv.setText(r.baseIntent.getComponent().flattenToShortString());
    606                 top.addView(tv, new LinearLayout.LayoutParams(
    607                         LinearLayout.LayoutParams.WRAP_CONTENT,
    608                         LinearLayout.LayoutParams.WRAP_CONTENT));
    609                 LinearLayout item = new LinearLayout(this);
    610                 item.setOrientation(LinearLayout.HORIZONTAL);
    611                 addThumbnail(item, tt != null ? tt.mainThumbnail : null, r, tt);
    612                 top.addView(item, new LinearLayout.LayoutParams(
    613                         LinearLayout.LayoutParams.WRAP_CONTENT,
    614                         LinearLayout.LayoutParams.WRAP_CONTENT));
    615             }
    616         }
    617 
    618         setContentView(scrollWrap(top));
    619     }
    620 }
    621