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