2 * Copyright (C) 2011 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.google.android.test.activity;
19 import java.util.ArrayList;
20 import java.util.List;
22 import android.app.Activity;
23 import android.app.ActivityManager;
24 import android.app.AlertDialog;
25 import android.content.ActivityNotFoundException;
26 import android.content.BroadcastReceiver;
27 import android.content.ComponentName;
28 import android.content.ContentProviderClient;
29 import android.content.Intent;
30 import android.content.ServiceConnection;
31 import android.os.Bundle;
32 import android.os.IBinder;
33 import android.os.RemoteException;
34 import android.os.UserHandle;
35 import android.os.UserManager;
36 import android.graphics.Bitmap;
37 import android.widget.ImageView;
38 import android.widget.LinearLayout;
39 import android.widget.TextView;
40 import android.widget.ScrollView;
41 import android.widget.Toast;
42 import android.view.Menu;
43 import android.view.MenuItem;
44 import android.view.View;
45 import android.content.Context;
46 import android.content.pm.UserInfo;
47 import android.content.res.Configuration;
48 import android.util.Log;
50 public class ActivityTestMain extends Activity {
51 static final String TAG = "ActivityTest";
53 static final String KEY_CONFIGURATION = "configuration";
56 Configuration mOverrideConfig;
59 ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>();
61 class BroadcastResultReceiver extends BroadcastReceiver {
63 public void onReceive(Context context, Intent intent) {
64 Bundle res = getResultExtras(true);
65 int user = res.getInt("user", -1);
66 Toast.makeText(ActivityTestMain.this,
67 "Receiver executed as user "
68 + (user >= 0 ? Integer.toString(user) : "unknown"),
69 Toast.LENGTH_LONG).show();
73 private void addThumbnail(LinearLayout container, Bitmap bm,
74 final ActivityManager.RecentTaskInfo task,
75 final ActivityManager.TaskThumbnails thumbs, final int subIndex) {
76 ImageView iv = new ImageView(this);
78 iv.setImageBitmap(bm);
80 iv.setBackgroundResource(android.R.drawable.gallery_thumb);
81 int w = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_width);
82 int h = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_height);
83 container.addView(iv, new LinearLayout.LayoutParams(w, h));
85 iv.setOnClickListener(new View.OnClickListener() {
87 public void onClick(View v) {
88 if (task.id >= 0 && thumbs != null) {
89 if (subIndex < (thumbs.numSubThumbbails-1)) {
90 mAm.removeSubTask(task.id, subIndex+1);
92 mAm.moveTaskToFront(task.id, ActivityManager.MOVE_TASK_WITH_HOME);
95 startActivity(task.baseIntent);
96 } catch (ActivityNotFoundException e) {
97 Log.w("foo", "Unable to start task: " + e);
103 iv.setOnLongClickListener(new View.OnLongClickListener() {
105 public boolean onLongClick(View v) {
106 if (task.id >= 0 && thumbs != null) {
108 mAm.removeTask(task.id, ActivityManager.REMOVE_TASK_KILL_PROCESS);
110 mAm.removeSubTask(task.id, subIndex);
121 protected void onCreate(Bundle savedInstanceState) {
122 super.onCreate(savedInstanceState);
124 mAm = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
125 if (savedInstanceState != null) {
126 mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION);
127 if (mOverrideConfig != null) {
128 applyOverrideConfiguration(mOverrideConfig);
132 UserManager um = (UserManager)getSystemService(Context.USER_SERVICE);
133 List<UserInfo> users = um.getUsers();
134 mSecondUser = Integer.MAX_VALUE;
135 for (UserInfo ui : users) {
136 if (ui.id != 0 && mSecondUser > ui.id) {
143 public boolean onCreateOptionsMenu(Menu menu) {
144 menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
145 @Override public boolean onMenuItemClick(MenuItem item) {
146 AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this,
148 builder.setTitle("This is a title");
153 menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
154 @Override public boolean onMenuItemClick(MenuItem item) {
155 Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
156 ServiceConnection conn = new ServiceConnection() {
158 public void onServiceConnected(ComponentName name, IBinder service) {
159 Log.i(TAG, "Service connected " + name + " " + service);
162 public void onServiceDisconnected(ComponentName name) {
163 Log.i(TAG, "Service disconnected " + name);
166 if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
167 mConnections.add(conn);
169 Toast.makeText(ActivityTestMain.this, "Failed to bind",
170 Toast.LENGTH_LONG).show();
175 menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
176 @Override public boolean onMenuItemClick(MenuItem item) {
177 Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
178 startService(intent);
182 menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
183 @Override public boolean onMenuItemClick(MenuItem item) {
184 Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class);
185 sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(),
186 null, Activity.RESULT_OK, null, null);
190 menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
191 @Override public boolean onMenuItemClick(MenuItem item) {
192 ContentProviderClient cpl = getContentResolver().acquireContentProviderClient(
193 SingleUserProvider.AUTHORITY);
196 res = cpl.call("getuser", null, null);
197 } catch (RemoteException e) {
199 int user = res != null ? res.getInt("user", -1) : -1;
200 Toast.makeText(ActivityTestMain.this,
201 "Provider executed as user "
202 + (user >= 0 ? Integer.toString(user) : "unknown"),
203 Toast.LENGTH_LONG).show();
208 menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
209 @Override public boolean onMenuItemClick(MenuItem item) {
210 Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
211 sendOrderedBroadcastAsUser(intent, new UserHandle(0), null,
212 new BroadcastResultReceiver(),
213 null, Activity.RESULT_OK, null, null);
217 menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener(
218 new MenuItem.OnMenuItemClickListener() {
219 @Override public boolean onMenuItemClick(MenuItem item) {
220 Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
221 sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null,
222 new BroadcastResultReceiver(),
223 null, Activity.RESULT_OK, null, null);
227 menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
228 @Override public boolean onMenuItemClick(MenuItem item) {
229 Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
230 ServiceConnection conn = new ServiceConnection() {
232 public void onServiceConnected(ComponentName name, IBinder service) {
233 Log.i(TAG, "Service connected " + name + " " + service);
236 public void onServiceDisconnected(ComponentName name) {
237 Log.i(TAG, "Service disconnected " + name);
240 if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.OWNER)) {
241 mConnections.add(conn);
243 Toast.makeText(ActivityTestMain.this, "Failed to bind",
244 Toast.LENGTH_LONG).show();
249 menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener(
250 new MenuItem.OnMenuItemClickListener() {
251 @Override public boolean onMenuItemClick(MenuItem item) {
252 Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
253 ServiceConnection conn = new ServiceConnection() {
255 public void onServiceConnected(ComponentName name, IBinder service) {
256 Log.i(TAG, "Service connected " + name + " " + service);
259 public void onServiceDisconnected(ComponentName name) {
260 Log.i(TAG, "Service disconnected " + name);
263 if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE,
264 new UserHandle(mSecondUser))) {
265 mConnections.add(conn);
267 Toast.makeText(ActivityTestMain.this, "Failed to bind",
268 Toast.LENGTH_LONG).show();
273 menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
274 @Override public boolean onMenuItemClick(MenuItem item) {
275 if (mOverrideConfig == null) {
276 mOverrideConfig = new Configuration();
278 if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) {
279 mOverrideConfig.densityDpi = (getApplicationContext().getResources()
280 .getConfiguration().densityDpi*2)/3;
282 mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED;
292 protected void onStart() {
298 protected void onSaveInstanceState(Bundle outState) {
299 super.onSaveInstanceState(outState);
300 if (mOverrideConfig != null) {
301 outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig);
306 protected void onStop() {
308 for (ServiceConnection conn : mConnections) {
311 mConnections.clear();
314 private View scrollWrap(View view) {
315 ScrollView scroller = new ScrollView(this);
316 scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
317 ScrollView.LayoutParams.MATCH_PARENT));
321 private void buildUi() {
322 LinearLayout top = new LinearLayout(this);
323 top.setOrientation(LinearLayout.VERTICAL);
325 List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10,
326 ActivityManager.RECENT_WITH_EXCLUDED);
327 if (recents != null) {
328 for (int i=0; i<recents.size(); i++) {
329 ActivityManager.RecentTaskInfo r = recents.get(i);
330 ActivityManager.TaskThumbnails tt = mAm.getTaskThumbnails(r.persistentId);
331 TextView tv = new TextView(this);
332 tv.setText(r.baseIntent.getComponent().flattenToShortString());
333 top.addView(tv, new LinearLayout.LayoutParams(
334 LinearLayout.LayoutParams.WRAP_CONTENT,
335 LinearLayout.LayoutParams.WRAP_CONTENT));
336 LinearLayout item = new LinearLayout(this);
337 item.setOrientation(LinearLayout.HORIZONTAL);
338 addThumbnail(item, tt != null ? tt.mainThumbnail : null, r, tt, -1);
339 for (int j=0; j<tt.numSubThumbbails; j++) {
340 addThumbnail(item, tt.getSubThumbnail(j), r, tt, j);
342 top.addView(item, new LinearLayout.LayoutParams(
343 LinearLayout.LayoutParams.WRAP_CONTENT,
344 LinearLayout.LayoutParams.WRAP_CONTENT));
348 setContentView(scrollWrap(top));