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 60e4de5a0d3b6e0c897c1cea0912b58e11db962365Xiaohui Chen 61f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornpublic class ActivityTestMain extends Activity { 62b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn static final String TAG = "ActivityTest"; 63b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn 64756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn static final String KEY_CONFIGURATION = "configuration"; 65756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityManager mAm; 671958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn PowerManager mPower; 683d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn AlarmManager mAlarm; 69756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn Configuration mOverrideConfig; 703992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn int mSecondUser; 713992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn 723992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>(); 730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 74875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn ServiceConnection mIsolatedConnection; 75875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn 7689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn static final int MSG_SPAM = 1; 773d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn static final int MSG_SPAM_ALARM = 2; 7889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 7989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final Handler mHandler = new Handler() { 8089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override 8189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn public void handleMessage(Message msg) { 8289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn switch (msg.what) { 8389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn case MSG_SPAM: { 8489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn boolean fg = msg.arg1 != 0; 8589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SpamActivity.class); 8689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Bundle options = null; 8789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (fg) { 880321573fa7583cd2ac4ece015c2eb784e3b24eb8Craig Mautner ActivityOptions opts = ActivityOptions.makeTaskLaunchBehind(); 8989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn options = opts.toBundle(); 9089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 9189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn startActivity(intent, options); 9289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn scheduleSpam(!fg); 9389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } break; 943d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn case MSG_SPAM_ALARM: { 953d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn long when = SystemClock.elapsedRealtime(); 963d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, AlarmSpamReceiver.class); 973d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn intent.setAction("com.example.SPAM_ALARM=" + when); 983d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn PendingIntent pi = PendingIntent.getBroadcast(ActivityTestMain.this, 993d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn 0, intent, 0); 1003d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mAlarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, when+(30*1000), pi); 1013d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn scheduleSpamAlarm(30*1000); 1023d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn } break; 10389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 10489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn super.handleMessage(msg); 10589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 10689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }; 10789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 1087d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn class BroadcastResultReceiver extends BroadcastReceiver { 1097d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override 1107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn public void onReceive(Context context, Intent intent) { 1117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Bundle res = getResultExtras(true); 1127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn int user = res.getInt("user", -1); 1137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.makeText(ActivityTestMain.this, 1147d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn "Receiver executed as user " 1157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + (user >= 0 ? Integer.toString(user) : "unknown"), 1167d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.LENGTH_LONG).show(); 1177d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 1187d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 1197d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn 1200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private void addThumbnail(LinearLayout container, Bitmap bm, 1210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ActivityManager.RecentTaskInfo task, 122c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner final ActivityManager.TaskThumbnail thumbs) { 123f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ImageView iv = new ImageView(this); 124f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn if (bm != null) { 125f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn iv.setImageBitmap(bm); 126f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 127f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn iv.setBackgroundResource(android.R.drawable.gallery_thumb); 128f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn int w = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_width); 129f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn int h = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_height); 130f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn container.addView(iv, new LinearLayout.LayoutParams(w, h)); 1310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn iv.setOnClickListener(new View.OnClickListener() { 1330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn @Override 1340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public void onClick(View v) { 1350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (task.id >= 0 && thumbs != null) { 1360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn mAm.moveTaskToFront(task.id, ActivityManager.MOVE_TASK_WITH_HOME); 1370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } else { 1380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn try { 1390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn startActivity(task.baseIntent); 1400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } catch (ActivityNotFoundException e) { 1410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Log.w("foo", "Unable to start task: " + e); 1420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn buildUi(); 1450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }); 1470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn iv.setOnLongClickListener(new View.OnLongClickListener() { 1480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn @Override 1490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public boolean onLongClick(View v) { 1500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (task.id >= 0 && thumbs != null) { 151d54b578e47fb410c776bb3a4272c2c523153f657Wale Ogunwale mAm.removeTask(task.id); 1520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn buildUi(); 1530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return true; 1540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return false; 1560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }); 158f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 159f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 160f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn @Override 161f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 162f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn super.onCreate(savedInstanceState); 163f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 16485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn Log.i(TAG, "Referrer: " + getReferrer()); 16585d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn 1661958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn mAm = getSystemService(ActivityManager.class); 1671958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn mPower = getSystemService(PowerManager.class); 1681958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn mAlarm = getSystemService(AlarmManager.class); 169756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (savedInstanceState != null) { 170756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION); 171756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig != null) { 172756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn applyOverrideConfiguration(mOverrideConfig); 173756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 174756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 1753992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn 1763992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn UserManager um = (UserManager)getSystemService(Context.USER_SERVICE); 1773992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn List<UserInfo> users = um.getUsers(); 1783992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mSecondUser = Integer.MAX_VALUE; 1793992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn for (UserInfo ui : users) { 1803992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn if (ui.id != 0 && mSecondUser > ui.id) { 1813992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mSecondUser = ui.id; 1823992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 1833992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 18415ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn 18515ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn /* 18615ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn AlertDialog ad = new AlertDialog.Builder(this).setTitle("title").setMessage("message").create(); 18715ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn ad.getWindow().getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 18815ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn ad.show(); 18915ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn */ 1900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 1910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn @Override 1938a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn public boolean onCreateOptionsMenu(Menu menu) { 1948a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 19589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override 19689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn public boolean onMenuItemClick(MenuItem item) { 1978a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this, 1988a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn R.style.SlowDialog); 1998a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn builder.setTitle("This is a title"); 2008a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn builder.show(); 2018a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn return true; 2028a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn } 2038a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn }); 204b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 205b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 206b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class); 207b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn ServiceConnection conn = new ServiceConnection() { 208b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override 209b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 210b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Log.i(TAG, "Service connected " + name + " " + service); 211b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 212b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override 213b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn public void onServiceDisconnected(ComponentName name) { 214b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Log.i(TAG, "Service disconnected " + name); 215b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 216b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }; 2173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) { 2183992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.add(conn); 2193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } else { 2203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 2213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.LENGTH_LONG).show(); 2223992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 223b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn return true; 224b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 225b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }); 226b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 227b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 228b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class); 229b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn startService(intent); 230b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn return true; 231b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 232b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }); 233875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn menu.add("Rebind Isolated!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 234875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 235875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, IsolatedService.class); 236875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn ServiceConnection conn = new ServiceConnection() { 237875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn @Override 238875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 239875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Isolated service connected " + name + " " + service); 240875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 241875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn @Override 242875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn public void onServiceDisconnected(ComponentName name) { 243875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Isolated service disconnected " + name); 244875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 245875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn }; 246875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn if (mIsolatedConnection != null) { 247875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Unbinding existing service: " + mIsolatedConnection); 248875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn unbindService(mIsolatedConnection); 249875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn mIsolatedConnection = null; 250875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 251875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Log.i(TAG, "Binding new service: " + conn); 252875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) { 253875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn mIsolatedConnection = conn; 254875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } else { 255875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 256875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn Toast.LENGTH_LONG).show(); 257875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 258875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn return true; 259875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 260875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn }); 261b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 262b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 2637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class); 264f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(), 2657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn null, Activity.RESULT_OK, null, null); 2667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn return true; 2677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 2687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn }); 2697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 2707d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 2717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ContentProviderClient cpl = getContentResolver().acquireContentProviderClient( 2727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn SingleUserProvider.AUTHORITY); 2737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Bundle res = null; 2747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn try { 2757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn res = cpl.call("getuser", null, null); 2767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } catch (RemoteException e) { 2777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 2787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn int user = res != null ? res.getInt("user", -1) : -1; 2797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.makeText(ActivityTestMain.this, 2807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn "Provider executed as user " 2817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn + (user >= 0 ? Integer.toString(user) : "unknown"), 2827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn Toast.LENGTH_LONG).show(); 2837d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn cpl.release(); 2847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn return true; 2857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn } 2867d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn }); 2873992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 2883992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 2893992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, UserTarget.class); 2903992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn sendOrderedBroadcastAsUser(intent, new UserHandle(0), null, 2913992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn new BroadcastResultReceiver(), 2923992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn null, Activity.RESULT_OK, null, null); 2933992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn return true; 2943992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 2953992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }); 2963992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener( 2973992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 2987d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 299b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, UserTarget.class); 3003992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null, 301aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn new BroadcastResultReceiver(), 3027d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn null, Activity.RESULT_OK, null, null); 303b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn return true; 304b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn } 305b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn }); 3063992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 3073992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 3083992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class); 3093992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn ServiceConnection conn = new ServiceConnection() { 3103992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3113992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 3123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service connected " + name + " " + service); 3133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3153992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceDisconnected(ComponentName name) { 3163992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service disconnected " + name); 3173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3183992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }; 319e4de5a0d3b6e0c897c1cea0912b58e11db962365Xiaohui Chen if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) { 3203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.add(conn); 3213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } else { 3223992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 3233992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.LENGTH_LONG).show(); 3243992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3253992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn return true; 3263992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3273992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }); 3283992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener( 3293992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 3303992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 3313992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class); 3323992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn ServiceConnection conn = new ServiceConnection() { 3333992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3343992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 3353992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service connected " + name + " " + service); 3363992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3373992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 3383992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn public void onServiceDisconnected(ComponentName name) { 3393992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Log.i(TAG, "Service disconnected " + name); 3403992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3413992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }; 34245c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, 34345c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani new UserHandle(mSecondUser))) { 3443992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.add(conn); 3453992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } else { 3463992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.makeText(ActivityTestMain.this, "Failed to bind", 3473992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn Toast.LENGTH_LONG).show(); 3483992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3493992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn return true; 3503992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 3513992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn }); 352756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 353756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 354756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig == null) { 355756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig = new Configuration(); 356756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 357756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) { 358756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig.densityDpi = (getApplicationContext().getResources() 359756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn .getConfiguration().densityDpi*2)/3; 360756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } else { 361756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED; 362756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 363756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn recreate(); 364756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn return true; 365756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 366756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn }); 367f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn menu.add("HashArray").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 368f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 369f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn ArrayMapTests.run(); 370f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn return true; 371f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn } 372f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn }); 373aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Add App Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 374aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 375aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn addAppRecents(1); 376aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 377aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 378aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 379aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Add App 10x Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 380aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 381aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn addAppRecents(10); 382aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 383aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 384aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 385aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Exclude!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 386aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 387aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn setExclude(true); 388aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 389aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 390aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 391aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn menu.add("Include!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 392aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 393aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn setExclude(false); 394aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn return true; 395aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 396aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn }); 39789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn menu.add("Open Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 39889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 39989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask task = findDocTask(); 40089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (task == null) { 40189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, DocActivity.class); 40289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT 40389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn | Intent.FLAG_ACTIVITY_MULTIPLE_TASK 40489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); 40589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn startActivity(intent); 40689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else { 40789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn task.moveToFront(); 40889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 40989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return true; 41089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 41189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }); 41289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn menu.add("Stack Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 41389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 41489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask task = findDocTask(); 41589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (task != null) { 41689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.RecentTaskInfo recent = task.getTaskInfo(); 41789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Intent intent = new Intent(ActivityTestMain.this, DocActivity.class); 41889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (recent.id >= 0) { 41989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Stack on top. 42089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn intent.putExtra(DocActivity.LABEL, "Stacked"); 42189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else { 42289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Start root activity. 42389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn intent.putExtra(DocActivity.LABEL, "New Root"); 42489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 425d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn task.startActivity(ActivityTestMain.this, intent, null); 42689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 42789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return true; 42889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 42989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }); 43089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn menu.add("Spam!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 43189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 43289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn scheduleSpam(false); 43389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return true; 43489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 43589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn }); 436b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn menu.add("Track time").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 437b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 438b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn Intent intent = new Intent(Intent.ACTION_SEND); 439b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn intent.setType("text/plain"); 440b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn intent.putExtra(Intent.EXTRA_TEXT, "We are sharing this with you!"); 441b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn ActivityOptions options = ActivityOptions.makeBasic(); 442b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn Intent receiveIntent = new Intent(ActivityTestMain.this, TrackTimeReceiver.class); 443b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn receiveIntent.putExtra("something", "yeah, this is us!"); 444b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn options.requestUsageTimeReport(PendingIntent.getBroadcast(ActivityTestMain.this, 445b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn 0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT)); 446b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn startActivity(Intent.createChooser(intent, "Who do you love?"), options.toBundle()); 447b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn return true; 448b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn } 449b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn }); 450e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn menu.add("Transaction fail").setOnMenuItemClickListener( 451e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 452e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 453e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 4541958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn intent.putExtra("gulp", new int[1024 * 1024]); 455e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn startActivity(intent); 456e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn return true; 457e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn } 458e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn }); 4593d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn menu.add("Spam idle alarm").setOnMenuItemClickListener( 4603d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 4613d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 4623d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn scheduleSpamAlarm(0); 4633d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn return true; 4643d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn } 4653d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn }); 4661958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn menu.add("Ignore battery optimizations").setOnMenuItemClickListener( 4671958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn new MenuItem.OnMenuItemClickListener() { 4681958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn @Override public boolean onMenuItemClick(MenuItem item) { 469c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn Intent intent; 4701958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn if (!mPower.isIgnoringBatteryOptimizations(getPackageName())) { 471c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 4721958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn intent.setData(Uri.fromParts("package", getPackageName(), null)); 473c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn } else { 474c7b57b1e65b487defad4967cf42cf076b499cbeeDianne Hackborn intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); 4751958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn } 4761958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn startActivity(intent); 4771958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn return true; 4781958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn } 4791958e5e7870579337f1d1d3e6c6fae096ba3abb9Dianne Hackborn }); 4808a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn return true; 4818a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn } 4828a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn 4838a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn @Override 4840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn protected void onStart() { 4850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn super.onStart(); 4860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn buildUi(); 4870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 4880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 489756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn @Override 490a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn protected void onPause() { 491a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn super.onPause(); 492a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Log.i(TAG, "I'm such a slooow poor loser"); 493a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn try { 494a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Thread.sleep(500); 495a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } catch (InterruptedException e) { 496a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 497a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Log.i(TAG, "See?"); 498a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 499a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 500a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn @Override 501756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn protected void onSaveInstanceState(Bundle outState) { 502756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn super.onSaveInstanceState(outState); 503756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn if (mOverrideConfig != null) { 504756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig); 505756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 506756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn } 507756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 5083992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn @Override 5093992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn protected void onStop() { 5103992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn super.onStop(); 5113d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mHandler.removeMessages(MSG_SPAM_ALARM); 5123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn for (ServiceConnection conn : mConnections) { 5133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn unbindService(conn); 5143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 5153992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn mConnections.clear(); 516875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn if (mIsolatedConnection != null) { 517875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn unbindService(mIsolatedConnection); 518875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn mIsolatedConnection = null; 519875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn } 5203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn } 5213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn 52289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn @Override 52389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn protected void onDestroy() { 52489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn super.onDestroy(); 52589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn mHandler.removeMessages(MSG_SPAM); 52689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 52789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 528aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn void addAppRecents(int count) { 529aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 530aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 531aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn intent.addCategory(Intent.CATEGORY_LAUNCHER); 532aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); 533aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn intent.setComponent(new ComponentName(this, ActivityTestMain.class)); 534aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn for (int i=0; i<count; i++) { 535aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager.TaskDescription desc = new ActivityManager.TaskDescription(); 536aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn desc.setLabel("Added #" + i); 537aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 538aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn if ((i&1) == 0) { 539aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn desc.setIcon(bitmap); 540aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 541aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn int taskId = am.addAppTask(this, intent, desc, bitmap); 542aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn Log.i(TAG, "Added new task id #" + taskId); 543aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 544aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 545aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn 546aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn void setExclude(boolean exclude) { 547aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 548aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn List<ActivityManager.AppTask> tasks = am.getAppTasks(); 549aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn int taskId = getTaskId(); 550aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn for (int i=0; i<tasks.size(); i++) { 551aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn ActivityManager.AppTask task = tasks.get(i); 552aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn if (task.getTaskInfo().id == taskId) { 553aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn task.setExcludeFromRecents(exclude); 554aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 555aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 556aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn } 55789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 55889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask findDocTask() { 55989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 56089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn List<ActivityManager.AppTask> tasks = am.getAppTasks(); 56189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (tasks != null) { 56289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int i=0; i<tasks.size(); i++) { 56389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.AppTask task = tasks.get(i); 56489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityManager.RecentTaskInfo recent = task.getTaskInfo(); 56589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (recent.baseIntent != null 56689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn && recent.baseIntent.getComponent().getClassName().equals( 56789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn DocActivity.class.getCanonicalName())) { 56889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return task; 56989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return null; 57389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 57489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 57589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn void scheduleSpam(boolean fg) { 57689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn mHandler.removeMessages(MSG_SPAM); 57789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Message msg = mHandler.obtainMessage(MSG_SPAM, fg ? 1 : 0, 0); 57889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn mHandler.sendMessageDelayed(msg, 500); 57989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 58089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 5813d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn void scheduleSpamAlarm(long delay) { 5823d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mHandler.removeMessages(MSG_SPAM_ALARM); 5833d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn Message msg = mHandler.obtainMessage(MSG_SPAM_ALARM); 5843d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn mHandler.sendMessageDelayed(msg, delay); 5853d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn } 5863d1933c45fe9ba2389ebd166d96abeceab1971d1Dianne Hackborn 58789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn private View scrollWrap(View view) { 5880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ScrollView scroller = new ScrollView(this); 5890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, 5900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ScrollView.LayoutParams.MATCH_PARENT)); 5910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return scroller; 5920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 593f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 5940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private void buildUi() { 595f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout top = new LinearLayout(this); 596f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn top.setOrientation(LinearLayout.VERTICAL); 597f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 5980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10, 599f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ActivityManager.RECENT_WITH_EXCLUDED); 600f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn if (recents != null) { 601f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn for (int i=0; i<recents.size(); i++) { 602f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ActivityManager.RecentTaskInfo r = recents.get(i); 603c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner ActivityManager.TaskThumbnail tt = mAm.getTaskThumbnail(r.persistentId); 604f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn TextView tv = new TextView(this); 605f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn tv.setText(r.baseIntent.getComponent().flattenToShortString()); 606f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn top.addView(tv, new LinearLayout.LayoutParams( 607f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT, 608f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT)); 609f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout item = new LinearLayout(this); 610f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn item.setOrientation(LinearLayout.HORIZONTAL); 611c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner addThumbnail(item, tt != null ? tt.mainThumbnail : null, r, tt); 612f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn top.addView(item, new LinearLayout.LayoutParams( 613f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT, 614f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn LinearLayout.LayoutParams.WRAP_CONTENT)); 615f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 616f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 617f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn 618f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn setContentView(scrollWrap(top)); 619f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn } 620f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn} 621