ActivityTestMain.java revision e4de5a0d3b6e0c897c1cea0912b58e11db962365
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
17package com.google.android.test.activity;
18
19import java.util.ArrayList;
20import java.util.List;
21
22import android.app.Activity;
23import android.app.ActivityManager;
24import android.app.ActivityOptions;
25import android.app.AlarmManager;
26import android.app.AlertDialog;
27import android.app.PendingIntent;
28import android.content.ActivityNotFoundException;
29import android.content.BroadcastReceiver;
30import android.content.ComponentName;
31import android.content.ContentProviderClient;
32import android.content.Intent;
33import android.content.ServiceConnection;
34import android.graphics.BitmapFactory;
35import android.net.Uri;
36import android.os.Bundle;
37import android.os.Handler;
38import android.os.IBinder;
39import android.os.Message;
40import android.os.PowerManager;
41import android.os.RemoteException;
42import android.os.SystemClock;
43import android.os.UserHandle;
44import android.os.UserManager;
45import android.graphics.Bitmap;
46import android.provider.Settings;
47import android.widget.ImageView;
48import android.widget.LinearLayout;
49import android.widget.TextView;
50import android.widget.ScrollView;
51import android.widget.Toast;
52import android.view.Menu;
53import android.view.MenuItem;
54import android.view.View;
55import android.content.Context;
56import android.content.pm.UserInfo;
57import android.content.res.Configuration;
58import android.util.Log;
59
60
61public 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