blob: 0f4960887a33fac1a7b81e02f814dea8459eb808 [file] [log] [blame]
Dianne Hackbornf26fd992011-04-08 18:14:09 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.android.test.activity;
18
Dianne Hackborn39926452012-09-25 14:53:52 -070019import java.util.ArrayList;
Dianne Hackbornf26fd992011-04-08 18:14:09 -070020import java.util.List;
21
22import android.app.Activity;
23import android.app.ActivityManager;
Dianne Hackborn89ad4562014-08-24 16:45:38 -070024import android.app.ActivityOptions;
Dianne Hackborn3d1933c42015-06-10 16:25:57 -070025import android.app.AlarmManager;
Dianne Hackborn8a59b7f2012-01-09 12:05:26 -080026import android.app.AlertDialog;
Dianne Hackbornb5a380d2015-05-20 18:18:46 -070027import android.app.PendingIntent;
Dianne Hackborn0c5001d2011-04-12 18:16:08 -070028import android.content.ActivityNotFoundException;
Dianne Hackborn7d19e022012-08-07 19:12:33 -070029import android.content.BroadcastReceiver;
Dianne Hackbornb4163a62012-08-02 18:31:26 -070030import android.content.ComponentName;
Dianne Hackborn7d19e022012-08-07 19:12:33 -070031import android.content.ContentProviderClient;
Dianne Hackbornb4163a62012-08-02 18:31:26 -070032import android.content.Intent;
33import android.content.ServiceConnection;
Dianne Hackbornaec68bb2014-08-20 15:25:13 -070034import android.graphics.BitmapFactory;
Dianne Hackborn1958e5e2015-06-12 18:11:41 -070035import android.net.Uri;
Dianne Hackbornf26fd992011-04-08 18:14:09 -070036import android.os.Bundle;
Dianne Hackborn89ad4562014-08-24 16:45:38 -070037import android.os.Handler;
Dianne Hackbornb4163a62012-08-02 18:31:26 -070038import android.os.IBinder;
Dianne Hackborn89ad4562014-08-24 16:45:38 -070039import android.os.Message;
Dianne Hackborn1958e5e2015-06-12 18:11:41 -070040import android.os.PowerManager;
Dianne Hackborn7d19e022012-08-07 19:12:33 -070041import android.os.RemoteException;
Dianne Hackborn3d1933c42015-06-10 16:25:57 -070042import android.os.SystemClock;
Dianne Hackborn79af1dd2012-08-16 16:42:52 -070043import android.os.UserHandle;
Dianne Hackborn39926452012-09-25 14:53:52 -070044import android.os.UserManager;
Dianne Hackbornf26fd992011-04-08 18:14:09 -070045import android.graphics.Bitmap;
Dianne Hackborn1958e5e2015-06-12 18:11:41 -070046import android.provider.Settings;
Dianne Hackbornf26fd992011-04-08 18:14:09 -070047import android.widget.ImageView;
48import android.widget.LinearLayout;
49import android.widget.TextView;
50import android.widget.ScrollView;
Dianne Hackborn7d19e022012-08-07 19:12:33 -070051import android.widget.Toast;
Dianne Hackborn8a59b7f2012-01-09 12:05:26 -080052import android.view.Menu;
53import android.view.MenuItem;
Dianne Hackbornf26fd992011-04-08 18:14:09 -070054import android.view.View;
55import android.content.Context;
Dianne Hackborn39926452012-09-25 14:53:52 -070056import android.content.pm.UserInfo;
Dianne Hackborn756220b2012-08-14 16:45:30 -070057import android.content.res.Configuration;
Dianne Hackbornf26fd992011-04-08 18:14:09 -070058import android.util.Log;
59
Xiaohui Chene4de5a02015-09-22 15:33:31 -070060
Dianne Hackbornf26fd992011-04-08 18:14:09 -070061public class ActivityTestMain extends Activity {
Dianne Hackbornb4163a62012-08-02 18:31:26 -070062 static final String TAG = "ActivityTest";
63
Dianne Hackborn756220b2012-08-14 16:45:30 -070064 static final String KEY_CONFIGURATION = "configuration";
65
Dianne Hackborn0c5001d2011-04-12 18:16:08 -070066 ActivityManager mAm;
Dianne Hackborn1958e5e2015-06-12 18:11:41 -070067 PowerManager mPower;
Dianne Hackborn3d1933c42015-06-10 16:25:57 -070068 AlarmManager mAlarm;
Dianne Hackborn756220b2012-08-14 16:45:30 -070069 Configuration mOverrideConfig;
Dianne Hackborn39926452012-09-25 14:53:52 -070070 int mSecondUser;
71
72 ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>();
Dianne Hackborn0c5001d2011-04-12 18:16:08 -070073
Dianne Hackborn875e4642014-12-01 16:22:14 -080074 ServiceConnection mIsolatedConnection;
75
Dianne Hackborn89ad4562014-08-24 16:45:38 -070076 static final int MSG_SPAM = 1;
Dianne Hackborn3d1933c42015-06-10 16:25:57 -070077 static final int MSG_SPAM_ALARM = 2;
Dianne Hackborn89ad4562014-08-24 16:45:38 -070078
79 final Handler mHandler = new Handler() {
80 @Override
81 public void handleMessage(Message msg) {
82 switch (msg.what) {
83 case MSG_SPAM: {
84 boolean fg = msg.arg1 != 0;
85 Intent intent = new Intent(ActivityTestMain.this, SpamActivity.class);
86 Bundle options = null;
87 if (fg) {
Craig Mautner03215732014-09-09 08:53:56 -070088 ActivityOptions opts = ActivityOptions.makeTaskLaunchBehind();
Dianne Hackborn89ad4562014-08-24 16:45:38 -070089 options = opts.toBundle();
90 }
91 startActivity(intent, options);
92 scheduleSpam(!fg);
93 } break;
Dianne Hackborn3d1933c42015-06-10 16:25:57 -070094 case MSG_SPAM_ALARM: {
95 long when = SystemClock.elapsedRealtime();
96 Intent intent = new Intent(ActivityTestMain.this, AlarmSpamReceiver.class);
97 intent.setAction("com.example.SPAM_ALARM=" + when);
98 PendingIntent pi = PendingIntent.getBroadcast(ActivityTestMain.this,
99 0, intent, 0);
100 mAlarm.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, when+(30*1000), pi);
101 scheduleSpamAlarm(30*1000);
102 } break;
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700103 }
104 super.handleMessage(msg);
105 }
106 };
107
Dianne Hackborn7d19e022012-08-07 19:12:33 -0700108 class BroadcastResultReceiver extends BroadcastReceiver {
109 @Override
110 public void onReceive(Context context, Intent intent) {
111 Bundle res = getResultExtras(true);
112 int user = res.getInt("user", -1);
113 Toast.makeText(ActivityTestMain.this,
114 "Receiver executed as user "
115 + (user >= 0 ? Integer.toString(user) : "unknown"),
116 Toast.LENGTH_LONG).show();
117 }
118 }
119
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700120 @Override
121 protected void onCreate(Bundle savedInstanceState) {
122 super.onCreate(savedInstanceState);
123
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800124 Log.i(TAG, "Referrer: " + getReferrer());
125
Dianne Hackborn1958e5e2015-06-12 18:11:41 -0700126 mAm = getSystemService(ActivityManager.class);
127 mPower = getSystemService(PowerManager.class);
128 mAlarm = getSystemService(AlarmManager.class);
Dianne Hackborn756220b2012-08-14 16:45:30 -0700129 if (savedInstanceState != null) {
130 mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION);
131 if (mOverrideConfig != null) {
132 applyOverrideConfiguration(mOverrideConfig);
133 }
134 }
Dianne Hackborn39926452012-09-25 14:53:52 -0700135
136 UserManager um = (UserManager)getSystemService(Context.USER_SERVICE);
137 List<UserInfo> users = um.getUsers();
138 mSecondUser = Integer.MAX_VALUE;
139 for (UserInfo ui : users) {
140 if (ui.id != 0 && mSecondUser > ui.id) {
141 mSecondUser = ui.id;
142 }
143 }
Dianne Hackborn15ed2752014-08-18 15:08:33 -0700144
145 /*
146 AlertDialog ad = new AlertDialog.Builder(this).setTitle("title").setMessage("message").create();
147 ad.getWindow().getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
148 ad.show();
149 */
Dianne Hackborn0c5001d2011-04-12 18:16:08 -0700150 }
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700151
Dianne Hackborn0c5001d2011-04-12 18:16:08 -0700152 @Override
Dianne Hackborn8a59b7f2012-01-09 12:05:26 -0800153 public boolean onCreateOptionsMenu(Menu menu) {
154 menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700155 @Override
156 public boolean onMenuItemClick(MenuItem item) {
Dianne Hackborn8a59b7f2012-01-09 12:05:26 -0800157 AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this,
158 R.style.SlowDialog);
159 builder.setTitle("This is a title");
160 builder.show();
161 return true;
162 }
163 });
Dianne Hackbornb4163a62012-08-02 18:31:26 -0700164 menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
165 @Override public boolean onMenuItemClick(MenuItem item) {
166 Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
167 ServiceConnection conn = new ServiceConnection() {
168 @Override
169 public void onServiceConnected(ComponentName name, IBinder service) {
170 Log.i(TAG, "Service connected " + name + " " + service);
171 }
172 @Override
173 public void onServiceDisconnected(ComponentName name) {
174 Log.i(TAG, "Service disconnected " + name);
175 }
176 };
Dianne Hackborn39926452012-09-25 14:53:52 -0700177 if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
178 mConnections.add(conn);
179 } else {
180 Toast.makeText(ActivityTestMain.this, "Failed to bind",
181 Toast.LENGTH_LONG).show();
182 }
Dianne Hackbornb4163a62012-08-02 18:31:26 -0700183 return true;
184 }
185 });
186 menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
187 @Override public boolean onMenuItemClick(MenuItem item) {
188 Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
189 startService(intent);
190 return true;
191 }
192 });
Dianne Hackborn875e4642014-12-01 16:22:14 -0800193 menu.add("Rebind Isolated!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
194 @Override public boolean onMenuItemClick(MenuItem item) {
195 Intent intent = new Intent(ActivityTestMain.this, IsolatedService.class);
196 ServiceConnection conn = new ServiceConnection() {
197 @Override
198 public void onServiceConnected(ComponentName name, IBinder service) {
199 Log.i(TAG, "Isolated service connected " + name + " " + service);
200 }
201 @Override
202 public void onServiceDisconnected(ComponentName name) {
203 Log.i(TAG, "Isolated service disconnected " + name);
204 }
205 };
206 if (mIsolatedConnection != null) {
207 Log.i(TAG, "Unbinding existing service: " + mIsolatedConnection);
208 unbindService(mIsolatedConnection);
209 mIsolatedConnection = null;
210 }
211 Log.i(TAG, "Binding new service: " + conn);
212 if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
213 mIsolatedConnection = conn;
214 } else {
215 Toast.makeText(ActivityTestMain.this, "Failed to bind",
216 Toast.LENGTH_LONG).show();
217 }
218 return true;
219 }
220 });
Dianne Hackbornb4163a62012-08-02 18:31:26 -0700221 menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
222 @Override public boolean onMenuItemClick(MenuItem item) {
Dianne Hackborn7d19e022012-08-07 19:12:33 -0700223 Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class);
Dianne Hackbornf4bf0ae2013-05-20 18:42:16 -0700224 sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(),
Dianne Hackborn7d19e022012-08-07 19:12:33 -0700225 null, Activity.RESULT_OK, null, null);
226 return true;
227 }
228 });
229 menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
230 @Override public boolean onMenuItemClick(MenuItem item) {
231 ContentProviderClient cpl = getContentResolver().acquireContentProviderClient(
232 SingleUserProvider.AUTHORITY);
233 Bundle res = null;
234 try {
235 res = cpl.call("getuser", null, null);
236 } catch (RemoteException e) {
237 }
238 int user = res != null ? res.getInt("user", -1) : -1;
239 Toast.makeText(ActivityTestMain.this,
240 "Provider executed as user "
241 + (user >= 0 ? Integer.toString(user) : "unknown"),
242 Toast.LENGTH_LONG).show();
243 cpl.release();
244 return true;
245 }
246 });
Dianne Hackborn39926452012-09-25 14:53:52 -0700247 menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
Dianne Hackborn7d19e022012-08-07 19:12:33 -0700248 @Override public boolean onMenuItemClick(MenuItem item) {
Dianne Hackbornb4163a62012-08-02 18:31:26 -0700249 Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
Dianne Hackborn39926452012-09-25 14:53:52 -0700250 sendOrderedBroadcastAsUser(intent, new UserHandle(0), null,
251 new BroadcastResultReceiver(),
252 null, Activity.RESULT_OK, null, null);
253 return true;
254 }
255 });
256 menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener(
257 new MenuItem.OnMenuItemClickListener() {
258 @Override public boolean onMenuItemClick(MenuItem item) {
259 Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
260 sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null,
Dianne Hackbornaec68bb2014-08-20 15:25:13 -0700261 new BroadcastResultReceiver(),
Dianne Hackborn7d19e022012-08-07 19:12:33 -0700262 null, Activity.RESULT_OK, null, null);
Dianne Hackbornb4163a62012-08-02 18:31:26 -0700263 return true;
264 }
265 });
Dianne Hackborn39926452012-09-25 14:53:52 -0700266 menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
267 @Override public boolean onMenuItemClick(MenuItem item) {
268 Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
269 ServiceConnection conn = new ServiceConnection() {
270 @Override
271 public void onServiceConnected(ComponentName name, IBinder service) {
272 Log.i(TAG, "Service connected " + name + " " + service);
273 }
274 @Override
275 public void onServiceDisconnected(ComponentName name) {
276 Log.i(TAG, "Service disconnected " + name);
277 }
278 };
Xiaohui Chene4de5a02015-09-22 15:33:31 -0700279 if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
Dianne Hackborn39926452012-09-25 14:53:52 -0700280 mConnections.add(conn);
281 } else {
282 Toast.makeText(ActivityTestMain.this, "Failed to bind",
283 Toast.LENGTH_LONG).show();
284 }
285 return true;
286 }
287 });
288 menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener(
289 new MenuItem.OnMenuItemClickListener() {
290 @Override public boolean onMenuItemClick(MenuItem item) {
291 Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
292 ServiceConnection conn = new ServiceConnection() {
293 @Override
294 public void onServiceConnected(ComponentName name, IBinder service) {
295 Log.i(TAG, "Service connected " + name + " " + service);
296 }
297 @Override
298 public void onServiceDisconnected(ComponentName name) {
299 Log.i(TAG, "Service disconnected " + name);
300 }
301 };
Amith Yamasani45c09242013-01-16 16:04:00 -0800302 if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE,
303 new UserHandle(mSecondUser))) {
Dianne Hackborn39926452012-09-25 14:53:52 -0700304 mConnections.add(conn);
305 } else {
306 Toast.makeText(ActivityTestMain.this, "Failed to bind",
307 Toast.LENGTH_LONG).show();
308 }
309 return true;
310 }
311 });
Dianne Hackborn756220b2012-08-14 16:45:30 -0700312 menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
313 @Override public boolean onMenuItemClick(MenuItem item) {
314 if (mOverrideConfig == null) {
315 mOverrideConfig = new Configuration();
316 }
317 if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) {
318 mOverrideConfig.densityDpi = (getApplicationContext().getResources()
319 .getConfiguration().densityDpi*2)/3;
320 } else {
321 mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED;
322 }
323 recreate();
324 return true;
325 }
326 });
Dianne Hackbornf4bf0ae2013-05-20 18:42:16 -0700327 menu.add("HashArray").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
328 @Override public boolean onMenuItemClick(MenuItem item) {
329 ArrayMapTests.run();
330 return true;
331 }
332 });
Dianne Hackbornaec68bb2014-08-20 15:25:13 -0700333 menu.add("Add App Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
334 @Override public boolean onMenuItemClick(MenuItem item) {
335 addAppRecents(1);
336 return true;
337 }
338 });
339 menu.add("Add App 10x Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
340 @Override public boolean onMenuItemClick(MenuItem item) {
341 addAppRecents(10);
342 return true;
343 }
344 });
345 menu.add("Exclude!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
346 @Override public boolean onMenuItemClick(MenuItem item) {
347 setExclude(true);
348 return true;
349 }
350 });
351 menu.add("Include!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
352 @Override public boolean onMenuItemClick(MenuItem item) {
353 setExclude(false);
354 return true;
355 }
356 });
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700357 menu.add("Open Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
358 @Override public boolean onMenuItemClick(MenuItem item) {
359 ActivityManager.AppTask task = findDocTask();
360 if (task == null) {
361 Intent intent = new Intent(ActivityTestMain.this, DocActivity.class);
362 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT
363 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
364 | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
365 startActivity(intent);
366 } else {
367 task.moveToFront();
368 }
369 return true;
370 }
371 });
372 menu.add("Stack Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
373 @Override public boolean onMenuItemClick(MenuItem item) {
374 ActivityManager.AppTask task = findDocTask();
375 if (task != null) {
376 ActivityManager.RecentTaskInfo recent = task.getTaskInfo();
377 Intent intent = new Intent(ActivityTestMain.this, DocActivity.class);
378 if (recent.id >= 0) {
379 // Stack on top.
380 intent.putExtra(DocActivity.LABEL, "Stacked");
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700381 } else {
382 // Start root activity.
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700383 intent.putExtra(DocActivity.LABEL, "New Root");
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700384 }
Dianne Hackbornd7c92892014-08-27 16:44:24 -0700385 task.startActivity(ActivityTestMain.this, intent, null);
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700386 }
387 return true;
388 }
389 });
390 menu.add("Spam!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
391 @Override public boolean onMenuItemClick(MenuItem item) {
392 scheduleSpam(false);
393 return true;
394 }
395 });
Dianne Hackbornb5a380d2015-05-20 18:18:46 -0700396 menu.add("Track time").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
397 @Override public boolean onMenuItemClick(MenuItem item) {
398 Intent intent = new Intent(Intent.ACTION_SEND);
399 intent.setType("text/plain");
400 intent.putExtra(Intent.EXTRA_TEXT, "We are sharing this with you!");
401 ActivityOptions options = ActivityOptions.makeBasic();
402 Intent receiveIntent = new Intent(ActivityTestMain.this, TrackTimeReceiver.class);
403 receiveIntent.putExtra("something", "yeah, this is us!");
404 options.requestUsageTimeReport(PendingIntent.getBroadcast(ActivityTestMain.this,
405 0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
406 startActivity(Intent.createChooser(intent, "Who do you love?"), options.toBundle());
407 return true;
408 }
409 });
Dianne Hackborne5c42622015-05-19 16:04:04 -0700410 menu.add("Transaction fail").setOnMenuItemClickListener(
411 new MenuItem.OnMenuItemClickListener() {
412 @Override public boolean onMenuItemClick(MenuItem item) {
413 Intent intent = new Intent(Intent.ACTION_MAIN);
Dianne Hackborn1958e5e2015-06-12 18:11:41 -0700414 intent.putExtra("gulp", new int[1024 * 1024]);
Dianne Hackborne5c42622015-05-19 16:04:04 -0700415 startActivity(intent);
416 return true;
417 }
418 });
Dianne Hackborn3d1933c42015-06-10 16:25:57 -0700419 menu.add("Spam idle alarm").setOnMenuItemClickListener(
420 new MenuItem.OnMenuItemClickListener() {
421 @Override public boolean onMenuItemClick(MenuItem item) {
422 scheduleSpamAlarm(0);
423 return true;
424 }
425 });
Dianne Hackborn1958e5e2015-06-12 18:11:41 -0700426 menu.add("Ignore battery optimizations").setOnMenuItemClickListener(
427 new MenuItem.OnMenuItemClickListener() {
428 @Override public boolean onMenuItemClick(MenuItem item) {
Dianne Hackbornc7b57b12015-08-10 14:52:52 -0700429 Intent intent;
Dianne Hackborn1958e5e2015-06-12 18:11:41 -0700430 if (!mPower.isIgnoringBatteryOptimizations(getPackageName())) {
Dianne Hackbornc7b57b12015-08-10 14:52:52 -0700431 intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
Dianne Hackborn1958e5e2015-06-12 18:11:41 -0700432 intent.setData(Uri.fromParts("package", getPackageName(), null));
Dianne Hackbornc7b57b12015-08-10 14:52:52 -0700433 } else {
434 intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
Dianne Hackborn1958e5e2015-06-12 18:11:41 -0700435 }
436 startActivity(intent);
437 return true;
438 }
439 });
Dianne Hackborn8a59b7f2012-01-09 12:05:26 -0800440 return true;
441 }
442
443 @Override
Dianne Hackborn0c5001d2011-04-12 18:16:08 -0700444 protected void onStart() {
445 super.onStart();
446 buildUi();
447 }
448
Dianne Hackborn756220b2012-08-14 16:45:30 -0700449 @Override
Dianne Hackborna4e102e2014-09-04 22:52:27 -0700450 protected void onPause() {
451 super.onPause();
452 Log.i(TAG, "I'm such a slooow poor loser");
453 try {
454 Thread.sleep(500);
455 } catch (InterruptedException e) {
456 }
457 Log.i(TAG, "See?");
458 }
459
460 @Override
Dianne Hackborn756220b2012-08-14 16:45:30 -0700461 protected void onSaveInstanceState(Bundle outState) {
462 super.onSaveInstanceState(outState);
463 if (mOverrideConfig != null) {
464 outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig);
465 }
466 }
467
Dianne Hackborn39926452012-09-25 14:53:52 -0700468 @Override
469 protected void onStop() {
470 super.onStop();
Dianne Hackborn3d1933c42015-06-10 16:25:57 -0700471 mHandler.removeMessages(MSG_SPAM_ALARM);
Dianne Hackborn39926452012-09-25 14:53:52 -0700472 for (ServiceConnection conn : mConnections) {
473 unbindService(conn);
474 }
475 mConnections.clear();
Dianne Hackborn875e4642014-12-01 16:22:14 -0800476 if (mIsolatedConnection != null) {
477 unbindService(mIsolatedConnection);
478 mIsolatedConnection = null;
479 }
Dianne Hackborn39926452012-09-25 14:53:52 -0700480 }
481
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700482 @Override
483 protected void onDestroy() {
484 super.onDestroy();
485 mHandler.removeMessages(MSG_SPAM);
486 }
487
Dianne Hackbornaec68bb2014-08-20 15:25:13 -0700488 void addAppRecents(int count) {
489 ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
490 Intent intent = new Intent(Intent.ACTION_MAIN);
491 intent.addCategory(Intent.CATEGORY_LAUNCHER);
492 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
493 intent.setComponent(new ComponentName(this, ActivityTestMain.class));
494 for (int i=0; i<count; i++) {
495 ActivityManager.TaskDescription desc = new ActivityManager.TaskDescription();
496 desc.setLabel("Added #" + i);
497 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
498 if ((i&1) == 0) {
499 desc.setIcon(bitmap);
500 }
501 int taskId = am.addAppTask(this, intent, desc, bitmap);
502 Log.i(TAG, "Added new task id #" + taskId);
503 }
504 }
505
506 void setExclude(boolean exclude) {
507 ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
508 List<ActivityManager.AppTask> tasks = am.getAppTasks();
509 int taskId = getTaskId();
510 for (int i=0; i<tasks.size(); i++) {
511 ActivityManager.AppTask task = tasks.get(i);
512 if (task.getTaskInfo().id == taskId) {
513 task.setExcludeFromRecents(exclude);
514 }
515 }
516 }
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700517
518 ActivityManager.AppTask findDocTask() {
519 ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
520 List<ActivityManager.AppTask> tasks = am.getAppTasks();
521 if (tasks != null) {
522 for (int i=0; i<tasks.size(); i++) {
523 ActivityManager.AppTask task = tasks.get(i);
524 ActivityManager.RecentTaskInfo recent = task.getTaskInfo();
525 if (recent.baseIntent != null
526 && recent.baseIntent.getComponent().getClassName().equals(
527 DocActivity.class.getCanonicalName())) {
528 return task;
529 }
530 }
531 }
532 return null;
533 }
534
535 void scheduleSpam(boolean fg) {
536 mHandler.removeMessages(MSG_SPAM);
537 Message msg = mHandler.obtainMessage(MSG_SPAM, fg ? 1 : 0, 0);
538 mHandler.sendMessageDelayed(msg, 500);
539 }
540
Dianne Hackborn3d1933c42015-06-10 16:25:57 -0700541 void scheduleSpamAlarm(long delay) {
542 mHandler.removeMessages(MSG_SPAM_ALARM);
543 Message msg = mHandler.obtainMessage(MSG_SPAM_ALARM);
544 mHandler.sendMessageDelayed(msg, delay);
545 }
546
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700547 private View scrollWrap(View view) {
Dianne Hackborn0c5001d2011-04-12 18:16:08 -0700548 ScrollView scroller = new ScrollView(this);
549 scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
550 ScrollView.LayoutParams.MATCH_PARENT));
551 return scroller;
552 }
553
554 private void buildUi() {
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700555 LinearLayout top = new LinearLayout(this);
556 top.setOrientation(LinearLayout.VERTICAL);
557
Dianne Hackborn0c5001d2011-04-12 18:16:08 -0700558 List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10,
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700559 ActivityManager.RECENT_WITH_EXCLUDED);
560 if (recents != null) {
561 for (int i=0; i<recents.size(); i++) {
562 ActivityManager.RecentTaskInfo r = recents.get(i);
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700563 TextView tv = new TextView(this);
564 tv.setText(r.baseIntent.getComponent().flattenToShortString());
565 top.addView(tv, new LinearLayout.LayoutParams(
566 LinearLayout.LayoutParams.WRAP_CONTENT,
567 LinearLayout.LayoutParams.WRAP_CONTENT));
568 LinearLayout item = new LinearLayout(this);
569 item.setOrientation(LinearLayout.HORIZONTAL);
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700570 top.addView(item, new LinearLayout.LayoutParams(
571 LinearLayout.LayoutParams.WRAP_CONTENT,
572 LinearLayout.LayoutParams.WRAP_CONTENT));
573 }
574 }
575
576 setContentView(scrollWrap(top));
577 }
Dianne Hackbornf26fd992011-04-08 18:14:09 -0700578}