ActivityTestMain.java revision f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccda
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;
248a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.app.AlertDialog;
250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.content.ActivityNotFoundException;
267d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.BroadcastReceiver;
27b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.ComponentName;
287d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.ContentProviderClient;
29b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.Intent;
30b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.ServiceConnection;
31f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.os.Bundle;
32b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.os.IBinder;
337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.os.RemoteException;
3479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackbornimport android.os.UserHandle;
353992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport android.os.UserManager;
36f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.graphics.Bitmap;
37f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.ImageView;
38f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.LinearLayout;
39f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.TextView;
40f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.ScrollView;
417d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.widget.Toast;
428a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.view.Menu;
438a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.view.MenuItem;
44f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.view.View;
45f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.content.Context;
463992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport android.content.pm.UserInfo;
47756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration;
48f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.util.Log;
49f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
50f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornpublic class ActivityTestMain extends Activity {
51b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn    static final String TAG = "ActivityTest";
52b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn
53756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    static final String KEY_CONFIGURATION = "configuration";
54756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn
550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    ActivityManager mAm;
56756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    Configuration mOverrideConfig;
573992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    int mSecondUser;
583992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn
593992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>();
600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    class BroadcastResultReceiver extends BroadcastReceiver {
627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        @Override
637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        public void onReceive(Context context, Intent intent) {
647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            Bundle res = getResultExtras(true);
657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            int user = res.getInt("user", -1);
667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            Toast.makeText(ActivityTestMain.this,
677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    "Receiver executed as user "
687d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    + (user >= 0 ? Integer.toString(user) : "unknown"),
697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    Toast.LENGTH_LONG).show();
707d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private void addThumbnail(LinearLayout container, Bitmap bm,
740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            final ActivityManager.RecentTaskInfo task,
750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            final ActivityManager.TaskThumbnails thumbs, final int subIndex) {
76f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        ImageView iv = new ImageView(this);
77f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        if (bm != null) {
78f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            iv.setImageBitmap(bm);
79f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        }
80f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        iv.setBackgroundResource(android.R.drawable.gallery_thumb);
81f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        int w = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_width);
82f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        int h = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_height);
83f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        container.addView(iv, new LinearLayout.LayoutParams(w, h));
840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        iv.setOnClickListener(new View.OnClickListener() {
860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            @Override
870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            public void onClick(View v) {
880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                if (task.id >= 0 && thumbs != null) {
890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (subIndex < (thumbs.numSubThumbbails-1)) {
900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        mAm.removeSubTask(task.id, subIndex+1);
910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    mAm.moveTaskToFront(task.id, ActivityManager.MOVE_TASK_WITH_HOME);
930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                } else {
940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    try {
950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        startActivity(task.baseIntent);
960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    } catch (ActivityNotFoundException e) {
970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        Log.w("foo", "Unable to start task: " + e);
980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
1000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                buildUi();
1010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
1020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        });
1030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        iv.setOnLongClickListener(new View.OnLongClickListener() {
1040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            @Override
1050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            public boolean onLongClick(View v) {
1060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                if (task.id >= 0 && thumbs != null) {
1070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (subIndex < 0) {
1080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        mAm.removeTask(task.id, ActivityManager.REMOVE_TASK_KILL_PROCESS);
1090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    } else {
1100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        mAm.removeSubTask(task.id, subIndex);
1110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
1120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    buildUi();
1130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    return true;
1140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
1150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return false;
1160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
1170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        });
118f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    }
119f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
120f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    @Override
121f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
122f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        super.onCreate(savedInstanceState);
123f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
1240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mAm = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
125756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        if (savedInstanceState != null) {
126756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION);
127756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            if (mOverrideConfig != null) {
128756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                applyOverrideConfiguration(mOverrideConfig);
129756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            }
130756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        }
1313992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn
1323992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        UserManager um = (UserManager)getSystemService(Context.USER_SERVICE);
1333992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        List<UserInfo> users = um.getUsers();
1343992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        mSecondUser = Integer.MAX_VALUE;
1353992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        for (UserInfo ui : users) {
1363992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            if (ui.id != 0 && mSecondUser > ui.id) {
1373992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                mSecondUser = ui.id;
1383992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
1393992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        }
1400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
1410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
1420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    @Override
1438a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn    public boolean onCreateOptionsMenu(Menu menu) {
1448a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn        menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
1458a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
1468a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this,
1478a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                        R.style.SlowDialog);
1488a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                builder.setTitle("This is a title");
1498a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                builder.show();
1508a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                return true;
1518a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn            }
1528a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn        });
153b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
154b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
155b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
156b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                ServiceConnection conn = new ServiceConnection() {
157b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    @Override
158b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
159b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                        Log.i(TAG, "Service connected " + name + " " + service);
160b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    }
161b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    @Override
162b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
163b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                        Log.i(TAG, "Service disconnected " + name);
164b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    }
165b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                };
1663992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
1673992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    mConnections.add(conn);
1683992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                } else {
1693992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
1703992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                            Toast.LENGTH_LONG).show();
1713992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                }
172b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                return true;
173b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            }
174b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        });
175b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
176b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
177b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
178b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                startService(intent);
179b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                return true;
180b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            }
181b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        });
182b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
183b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
1847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class);
185f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(),
1867d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        null, Activity.RESULT_OK, null, null);
1877d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                return true;
1887d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
1897d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        });
1907d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
1917d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
1927d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                ContentProviderClient cpl = getContentResolver().acquireContentProviderClient(
1937d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        SingleUserProvider.AUTHORITY);
1947d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Bundle res = null;
1957d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                try {
1967d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    res = cpl.call("getuser", null, null);
1977d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                } catch (RemoteException e) {
1987d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
1997d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                int user = res != null ? res.getInt("user", -1) : -1;
2007d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Toast.makeText(ActivityTestMain.this,
2017d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        "Provider executed as user "
2027d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        + (user >= 0 ? Integer.toString(user) : "unknown"),
2037d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        Toast.LENGTH_LONG).show();
2047d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                cpl.release();
2057d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                return true;
2067d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
2077d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        });
2083992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2093992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2103992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
2113992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                sendOrderedBroadcastAsUser(intent, new UserHandle(0), null,
2123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        new BroadcastResultReceiver(),
2133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        null, Activity.RESULT_OK, null, null);
2143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                return true;
2153992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
2163992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        });
2173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener(
2183992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                new MenuItem.OnMenuItemClickListener() {
2197d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
220b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
2213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null,
2225ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn                        new BroadcastResultReceiver(),
2237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        null, Activity.RESULT_OK, null, null);
224b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                return true;
225b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            }
226b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        });
2273992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2283992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2293992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
2303992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                ServiceConnection conn = new ServiceConnection() {
2313992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
2323992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
2333992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service connected " + name + " " + service);
2343992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
2353992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
2363992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
2373992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service disconnected " + name);
2383992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
2393992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                };
24045c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani                if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.OWNER)) {
2413992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    mConnections.add(conn);
2423992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                } else {
2433992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
2443992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                            Toast.LENGTH_LONG).show();
2453992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                }
2463992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                return true;
2473992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
2483992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        });
2493992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener(
2503992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                new MenuItem.OnMenuItemClickListener() {
2513992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2523992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
2533992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                ServiceConnection conn = new ServiceConnection() {
2543992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
2553992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
2563992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service connected " + name + " " + service);
2573992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
2583992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
2593992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
2603992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service disconnected " + name);
2613992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
2623992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                };
26345c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani                if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE,
26445c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani                        new UserHandle(mSecondUser))) {
2653992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    mConnections.add(conn);
2663992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                } else {
2673992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
2683992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                            Toast.LENGTH_LONG).show();
2693992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                }
2703992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                return true;
2713992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
2723992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        });
273756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
274756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
275756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                if (mOverrideConfig == null) {
276756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                    mOverrideConfig = new Configuration();
277756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                }
278756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) {
279756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                    mOverrideConfig.densityDpi = (getApplicationContext().getResources()
280756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                            .getConfiguration().densityDpi*2)/3;
281756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                } else {
282756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                    mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED;
283756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                }
284756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                recreate();
285756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                return true;
286756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            }
287756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        });
288f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        menu.add("HashArray").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
289f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
290f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                ArrayMapTests.run();
291f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return true;
292f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
293f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        });
2948a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn        return true;
2958a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn    }
2968a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn
2978a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn    @Override
2980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    protected void onStart() {
2990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        super.onStart();
3000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        buildUi();
3010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
3020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
303756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    @Override
304756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
305756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        super.onSaveInstanceState(outState);
306756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        if (mOverrideConfig != null) {
307756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig);
308756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        }
309756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    }
310756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn
3113992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    @Override
3123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    protected void onStop() {
3133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        super.onStop();
3143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        for (ServiceConnection conn : mConnections) {
3153992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            unbindService(conn);
3163992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        }
3173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        mConnections.clear();
3183992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    }
3193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn
3200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private View scrollWrap(View view) {
3210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ScrollView scroller = new ScrollView(this);
3220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
3230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ScrollView.LayoutParams.MATCH_PARENT));
3240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return scroller;
3250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
326f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
3270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private void buildUi() {
328f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        LinearLayout top = new LinearLayout(this);
329f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        top.setOrientation(LinearLayout.VERTICAL);
330f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
3310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10,
332f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                ActivityManager.RECENT_WITH_EXCLUDED);
333f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        if (recents != null) {
334f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            for (int i=0; i<recents.size(); i++) {
335f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                ActivityManager.RecentTaskInfo r = recents.get(i);
3360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityManager.TaskThumbnails tt = mAm.getTaskThumbnails(r.persistentId);
337f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                TextView tv = new TextView(this);
338f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                tv.setText(r.baseIntent.getComponent().flattenToShortString());
339f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                top.addView(tv, new LinearLayout.LayoutParams(
340f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT,
341f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT));
342f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                LinearLayout item = new LinearLayout(this);
343f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                item.setOrientation(LinearLayout.HORIZONTAL);
3440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                addThumbnail(item, tt != null ? tt.mainThumbnail : null, r, tt, -1);
345f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                for (int j=0; j<tt.numSubThumbbails; j++) {
3460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    addThumbnail(item, tt.getSubThumbnail(j), r, tt, j);
347f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                }
348f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                top.addView(item, new LinearLayout.LayoutParams(
349f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT,
350f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT));
351f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            }
352f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        }
353f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
354f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        setContentView(scrollWrap(top));
355f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    }
356f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn}
357