1f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn/* 2f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * 4f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * you may not use this file except in compliance with the License. 6f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * You may obtain a copy of the License at 7f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * 8f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * 10f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * See the License for the specific language governing permissions and 14f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn * limitations under the License. 15f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn */ 16f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 17f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornpackage com.google.android.test.activity; 18f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport java.util.ArrayList; 20f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport java.util.List; 21f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 22f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.app.Activity; 23f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.app.ActivityManager; 2489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.app.ActivityOptions; 253d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackbornimport android.app.AlarmManager; 268a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.app.AlertDialog; 27b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackbornimport android.app.PendingIntent; 280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.content.ActivityNotFoundException; 297d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.BroadcastReceiver; 30b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.ComponentName; 317d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.ContentProviderClient; 32b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.Intent; 33b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.ServiceConnection; 34aec68bb89fe614181a20eb97340149406218ce2fDianne Hackbornimport android.graphics.BitmapFactory; 351958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackbornimport android.net.Uri; 36f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.os.Bundle; 3789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Handler; 38b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.os.IBinder; 3989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Message; 401958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackbornimport android.os.PowerManager; 417d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.os.RemoteException; 423d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackbornimport android.os.SystemClock; 4379af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackbornimport android.os.UserHandle; 443992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport android.os.UserManager; 45f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.graphics.Bitmap; 461958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackbornimport android.provider.Settings; 47f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.ImageView; 48f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.LinearLayout; 49f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.TextView; 50f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.ScrollView; 517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.widget.Toast; 528a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.view.Menu; 538a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.view.MenuItem; 54f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.view.View; 55f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.content.Context; 563992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport android.content.pm.UserInfo; 57756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration; 58f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.util.Log; 59f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 60f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornpublic class ActivityTestMain extends Activity { 61b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn static final String TAG = "ActivityTest"; 62b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn 63756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn static final String KEY_CONFIGURATION = "configuration"; 64756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityManager mAm; 661958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn PowerManager mPower; 673d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn AlarmManager mAlarm; 68756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn Configuration mOverrideConfig; 693992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn int mSecondUser; 703992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn 713992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>(); 720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 73875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn ServiceConnection mIsolatedConnection; 74875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn 7589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn static final int MSG_SPAM = 1; 763d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn static final int MSG_SPAM_ALARM = 2; 7789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 7889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final Handler mHandler = new Handler() { 7989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override 8089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn public void handleMessage(Message msg) { 8189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn switch (msg.what) { 8289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn case MSG_SPAM: { 8389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn boolean fg = msg.arg1 != 0; 8489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SpamActivity.class); 8589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Bundle options = null; 8689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (fg) { 870321573fa7583cd2ac4ece015c2eb784e3b24eb8Craig Mautner ActivityOptions opts = ActivityOptions.makeTaskLaunchBehind(); 8889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn options = opts.toBundle(); 8989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 9089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn startActivity(intent, options); 9189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn scheduleSpam(!fg); 9289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } break; 933d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn case MSG_SPAM_ALARM: { 943d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn long when = SystemClock.elapsedRealtime(); 953d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, AlarmSpamReceiver.class); 963d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn intent.setAction("com.example.SPAM_ALARM=" + when); 973d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn PendingIntent pi = PendingIntent.getBroadcast(ActivityTestMain.this, 983d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn 0, intent, 0); 993d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mAlarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, when+(30*1000), pi); 1003d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn scheduleSpamAlarm(30*1000); 1013d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn } break; 10289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 10389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn super.handleMessage(msg); 10489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 10589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }; 10689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 1077d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn class BroadcastResultReceiver extends BroadcastReceiver { 1087d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override 1097d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn public void onReceive(Context context, Intent intent) { 1107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Bundle res = getResultExtras(true); 1117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn int user = res.getInt("user", -1); 1127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.makeText(ActivityTestMain.this, 1137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn "Receiver executed as user " 1147d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + (user >= 0 ? Integer.toString(user) : "unknown"), 1157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.LENGTH_LONG).show(); 1167d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 1177d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 1187d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn 1190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private void addThumbnail(LinearLayout container, Bitmap bm, 1200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ActivityManager.RecentTaskInfo task, 121c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner final ActivityManager.TaskThumbnail thumbs) { 122f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ImageView iv = new ImageView(this); 123f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn if (bm != null) { 124f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn iv.setImageBitmap(bm); 125f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 126f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn iv.setBackgroundResource(android.R.drawable.gallery_thumb); 127f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn int w = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_width); 128f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn int h = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_height); 129f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn container.addView(iv, new LinearLayout.LayoutParams(w, h)); 1300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn iv.setOnClickListener(new View.OnClickListener() { 1320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn @Override 1330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public void onClick(View v) { 1340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (task.id >= 0 && thumbs != null) { 1350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn mAm.moveTaskToFront(task.id, ActivityManager.MOVE_TASK_WITH_HOME); 1360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } else { 1370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn try { 1380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn startActivity(task.baseIntent); 1390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } catch (ActivityNotFoundException e) { 1400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Log.w("foo", "Unable to start task: " + e); 1410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn buildUi(); 1440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }); 1460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn iv.setOnLongClickListener(new View.OnLongClickListener() { 1470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn @Override 1480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public boolean onLongClick(View v) { 1490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (task.id >= 0 && thumbs != null) { 150d54b578e47fb410c776bb3a4272c2c523153f657Wale Ogunwale mAm.removeTask(task.id); 1510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn buildUi(); 1520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return true; 1530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return false; 1550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }); 157f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 158f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 159f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn @Override 160f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 161f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn super.onCreate(savedInstanceState); 162f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 16385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn Log.i(TAG, "Referrer: " + getReferrer()); 16485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn 1651958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn mAm = getSystemService(ActivityManager.class); 1661958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn mPower = getSystemService(PowerManager.class); 1671958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn mAlarm = getSystemService(AlarmManager.class); 168756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (savedInstanceState != null) { 169756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION); 170756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig != null) { 171756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn applyOverrideConfiguration(mOverrideConfig); 172756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 173756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 1743992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn 1753992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn UserManager um = (UserManager)getSystemService(Context.USER_SERVICE); 1763992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn List<UserInfo> users = um.getUsers(); 1773992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mSecondUser = Integer.MAX_VALUE; 1783992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn for (UserInfo ui : users) { 1793992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn if (ui.id != 0 && mSecondUser > ui.id) { 1803992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mSecondUser = ui.id; 1813992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 1823992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 18315ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn 18415ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn /* 18515ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn AlertDialog ad = new AlertDialog.Builder(this).setTitle("title").setMessage("message").create(); 18615ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn ad.getWindow().getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 18715ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn ad.show(); 18815ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn */ 1890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn @Override 1928a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn public boolean onCreateOptionsMenu(Menu menu) { 1938a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 19489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override 19589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn public boolean onMenuItemClick(MenuItem item) { 1968a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this, 1978a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn R.style.SlowDialog); 1988a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn builder.setTitle("This is a title"); 1998a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn builder.show(); 2008a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn return true; 2018a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn } 2028a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn }); 203b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 204b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 205b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class); 206b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn ServiceConnection conn = new ServiceConnection() { 207b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override 208b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 209b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Log.i(TAG, "Service connected " + name + " " + service); 210b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 211b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override 212b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn public void onServiceDisconnected(ComponentName name) { 213b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Log.i(TAG, "Service disconnected " + name); 214b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 215b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }; 2163992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) { 2173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.add(conn); 2183992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } else { 2193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 2203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.LENGTH_LONG).show(); 2213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 222b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn return true; 223b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 224b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }); 225b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 226b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 227b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class); 228b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn startService(intent); 229b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn return true; 230b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 231b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }); 232875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn menu.add("Rebind Isolated!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 233875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 234875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, IsolatedService.class); 235875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn ServiceConnection conn = new ServiceConnection() { 236875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn @Override 237875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 238875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Isolated service connected " + name + " " + service); 239875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 240875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn @Override 241875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn public void onServiceDisconnected(ComponentName name) { 242875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Isolated service disconnected " + name); 243875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 244875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn }; 245875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn if (mIsolatedConnection != null) { 246875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Unbinding existing service: " + mIsolatedConnection); 247875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn unbindService(mIsolatedConnection); 248875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn mIsolatedConnection = null; 249875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 250875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Binding new service: " + conn); 251875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) { 252875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn mIsolatedConnection = conn; 253875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } else { 254875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 255875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Toast.LENGTH_LONG).show(); 256875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 257875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn return true; 258875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 259875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn }); 260b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 261b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 2627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class); 263f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(), 2647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn null, Activity.RESULT_OK, null, null); 2657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn return true; 2667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 2677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn }); 2687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 2697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 2707d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ContentProviderClient cpl = getContentResolver().acquireContentProviderClient( 2717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn SingleUserProvider.AUTHORITY); 2727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Bundle res = null; 2737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 2747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn res = cpl.call("getuser", null, null); 2757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (RemoteException e) { 2767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 2777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn int user = res != null ? res.getInt("user", -1) : -1; 2787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.makeText(ActivityTestMain.this, 2797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn "Provider executed as user " 2807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + (user >= 0 ? Integer.toString(user) : "unknown"), 2817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.LENGTH_LONG).show(); 2827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn cpl.release(); 2837d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn return true; 2847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 2857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn }); 2863992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 2873992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 2883992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, UserTarget.class); 2893992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn sendOrderedBroadcastAsUser(intent, new UserHandle(0), null, 2903992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn new BroadcastResultReceiver(), 2913992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn null, Activity.RESULT_OK, null, null); 2923992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn return true; 2933992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 2943992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }); 2953992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener( 2963992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 2977d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 298b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, UserTarget.class); 2993992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null, 300aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn new BroadcastResultReceiver(), 3017d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn null, Activity.RESULT_OK, null, null); 302b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn return true; 303b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 304b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }); 3053992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 3063992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 3073992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class); 3083992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn ServiceConnection conn = new ServiceConnection() { 3093992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3103992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 3113992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service connected " + name + " " + service); 3123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceDisconnected(ComponentName name) { 3153992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service disconnected " + name); 3163992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }; 31845c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.OWNER)) { 3193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.add(conn); 3203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } else { 3213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 3223992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.LENGTH_LONG).show(); 3233992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3243992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn return true; 3253992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3263992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }); 3273992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener( 3283992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 3293992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 3303992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class); 3313992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn ServiceConnection conn = new ServiceConnection() { 3323992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3333992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 3343992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service connected " + name + " " + service); 3353992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3363992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3373992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceDisconnected(ComponentName name) { 3383992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service disconnected " + name); 3393992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3403992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }; 34145c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, 34245c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani new UserHandle(mSecondUser))) { 3433992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.add(conn); 3443992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } else { 3453992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 3463992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.LENGTH_LONG).show(); 3473992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3483992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn return true; 3493992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3503992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }); 351756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 352756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 353756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig == null) { 354756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig = new Configuration(); 355756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 356756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) { 357756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig.densityDpi = (getApplicationContext().getResources() 358756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn .getConfiguration().densityDpi*2)/3; 359756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } else { 360756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED; 361756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 362756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn recreate(); 363756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn return true; 364756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 365756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn }); 366f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn menu.add("HashArray").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 367f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 368f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn ArrayMapTests.run(); 369f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return true; 370f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 371f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn }); 372aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Add App Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 373aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 374aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn addAppRecents(1); 375aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 376aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 377aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 378aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Add App 10x Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 379aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 380aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn addAppRecents(10); 381aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 382aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 383aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 384aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Exclude!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 385aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 386aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn setExclude(true); 387aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 388aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 389aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 390aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Include!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 391aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 392aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn setExclude(false); 393aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 394aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 395aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 39689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn menu.add("Open Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 39789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 39889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask task = findDocTask(); 39989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (task == null) { 40089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, DocActivity.class); 40189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT 40289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn | Intent.FLAG_ACTIVITY_MULTIPLE_TASK 40389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); 40489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn startActivity(intent); 40589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else { 40689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn task.moveToFront(); 40789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 40889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return true; 40989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 41089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }); 41189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn menu.add("Stack Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 41289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 41389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask task = findDocTask(); 41489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (task != null) { 41589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.RecentTaskInfo recent = task.getTaskInfo(); 41689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, DocActivity.class); 41789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (recent.id >= 0) { 41889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Stack on top. 41989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn intent.putExtra(DocActivity.LABEL, "Stacked"); 42089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else { 42189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Start root activity. 42289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn intent.putExtra(DocActivity.LABEL, "New Root"); 42389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 424d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn task.startActivity(ActivityTestMain.this, intent, null); 42589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 42689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return true; 42789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 42889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }); 42989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn menu.add("Spam!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 43089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 43189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn scheduleSpam(false); 43289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return true; 43389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 43489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }); 435b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn menu.add("Track time").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 436b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 437b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn Intent intent = new Intent(Intent.ACTION_SEND); 438b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn intent.setType("text/plain"); 439b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn intent.putExtra(Intent.EXTRA_TEXT, "We are sharing this with you!"); 440b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn ActivityOptions options = ActivityOptions.makeBasic(); 441b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn Intent receiveIntent = new Intent(ActivityTestMain.this, TrackTimeReceiver.class); 442b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn receiveIntent.putExtra("something", "yeah, this is us!"); 443b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn options.requestUsageTimeReport(PendingIntent.getBroadcast(ActivityTestMain.this, 444b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn 0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT)); 445b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn startActivity(Intent.createChooser(intent, "Who do you love?"), options.toBundle()); 446b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn return true; 447b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn } 448b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn }); 449e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn menu.add("Transaction fail").setOnMenuItemClickListener( 450e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 451e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 452e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 4531958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn intent.putExtra("gulp", new int[1024 * 1024]); 454e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn startActivity(intent); 455e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn return true; 456e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn } 457e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn }); 4583d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn menu.add("Spam idle alarm").setOnMenuItemClickListener( 4593d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 4603d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 4613d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn scheduleSpamAlarm(0); 4623d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn return true; 4633d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn } 4643d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn }); 4651958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn menu.add("Ignore battery optimizations").setOnMenuItemClickListener( 4661958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 4671958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 468c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn Intent intent; 4691958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn if (!mPower.isIgnoringBatteryOptimizations(getPackageName())) { 470c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 4711958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn intent.setData(Uri.fromParts("package", getPackageName(), null)); 472c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn } else { 473c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); 4741958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn } 4751958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn startActivity(intent); 4761958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn return true; 4771958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn } 4781958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn }); 4798a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn return true; 4808a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn } 4818a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn 4828a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn @Override 4830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn protected void onStart() { 4840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn super.onStart(); 4850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn buildUi(); 4860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 4870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 488756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn @Override 489a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn protected void onPause() { 490a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn super.onPause(); 491a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Log.i(TAG, "I'm such a slooow poor loser"); 492a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn try { 493a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Thread.sleep(500); 494a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } catch (InterruptedException e) { 495a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 496a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Log.i(TAG, "See?"); 497a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 498a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 499a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn @Override 500756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn protected void onSaveInstanceState(Bundle outState) { 501756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn super.onSaveInstanceState(outState); 502756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig != null) { 503756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig); 504756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 505756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 506756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 5073992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 5083992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn protected void onStop() { 5093992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn super.onStop(); 5103d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mHandler.removeMessages(MSG_SPAM_ALARM); 5113992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn for (ServiceConnection conn : mConnections) { 5123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn unbindService(conn); 5133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 5143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.clear(); 515875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn if (mIsolatedConnection != null) { 516875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn unbindService(mIsolatedConnection); 517875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn mIsolatedConnection = null; 518875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 5193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 5203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn 52189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override 52289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn protected void onDestroy() { 52389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn super.onDestroy(); 52489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn mHandler.removeMessages(MSG_SPAM); 52589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 52689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 527aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn void addAppRecents(int count) { 528aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 529aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 530aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn intent.addCategory(Intent.CATEGORY_LAUNCHER); 531aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); 532aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn intent.setComponent(new ComponentName(this, ActivityTestMain.class)); 533aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn for (int i=0; i<count; i++) { 534aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager.TaskDescription desc = new ActivityManager.TaskDescription(); 535aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn desc.setLabel("Added #" + i); 536aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 537aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn if ((i&1) == 0) { 538aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn desc.setIcon(bitmap); 539aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 540aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn int taskId = am.addAppTask(this, intent, desc, bitmap); 541aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn Log.i(TAG, "Added new task id #" + taskId); 542aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 543aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 544aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn 545aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn void setExclude(boolean exclude) { 546aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 547aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn List<ActivityManager.AppTask> tasks = am.getAppTasks(); 548aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn int taskId = getTaskId(); 549aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn for (int i=0; i<tasks.size(); i++) { 550aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager.AppTask task = tasks.get(i); 551aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn if (task.getTaskInfo().id == taskId) { 552aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn task.setExcludeFromRecents(exclude); 553aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 554aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 555aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 55689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 55789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask findDocTask() { 55889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 55989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn List<ActivityManager.AppTask> tasks = am.getAppTasks(); 56089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (tasks != null) { 56189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int i=0; i<tasks.size(); i++) { 56289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask task = tasks.get(i); 56389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.RecentTaskInfo recent = task.getTaskInfo(); 56489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (recent.baseIntent != null 56589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn && recent.baseIntent.getComponent().getClassName().equals( 56689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn DocActivity.class.getCanonicalName())) { 56789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return task; 56889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 56989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return null; 57289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 57489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn void scheduleSpam(boolean fg) { 57589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn mHandler.removeMessages(MSG_SPAM); 57689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Message msg = mHandler.obtainMessage(MSG_SPAM, fg ? 1 : 0, 0); 57789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn mHandler.sendMessageDelayed(msg, 500); 57889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 5803d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn void scheduleSpamAlarm(long delay) { 5813d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mHandler.removeMessages(MSG_SPAM_ALARM); 5823d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn Message msg = mHandler.obtainMessage(MSG_SPAM_ALARM); 5833d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mHandler.sendMessageDelayed(msg, delay); 5843d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn } 5853d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn 58689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn private View scrollWrap(View view) { 5870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ScrollView scroller = new ScrollView(this); 5880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, 5890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ScrollView.LayoutParams.MATCH_PARENT)); 5900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return scroller; 5910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 592f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 5930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private void buildUi() { 594f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout top = new LinearLayout(this); 595f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn top.setOrientation(LinearLayout.VERTICAL); 596f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 5970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10, 598f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ActivityManager.RECENT_WITH_EXCLUDED); 599f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn if (recents != null) { 600f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn for (int i=0; i<recents.size(); i++) { 601f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ActivityManager.RecentTaskInfo r = recents.get(i); 602c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner ActivityManager.TaskThumbnail tt = mAm.getTaskThumbnail(r.persistentId); 603f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn TextView tv = new TextView(this); 604f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn tv.setText(r.baseIntent.getComponent().flattenToShortString()); 605f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn top.addView(tv, new LinearLayout.LayoutParams( 606f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT, 607f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT)); 608f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout item = new LinearLayout(this); 609f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn item.setOrientation(LinearLayout.HORIZONTAL); 610c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner addThumbnail(item, tt != null ? tt.mainThumbnail : null, r, tt); 611f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn top.addView(item, new LinearLayout.LayoutParams( 612f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT, 613f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT)); 614f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 615f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 616f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 617f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn setContentView(scrollWrap(top)); 618f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 619f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn} 620