ActivityTestMain.java revision b5a380d409a1431a38db978864b9d85b689e3cce
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;
258a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.app.AlertDialog;
26b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackbornimport android.app.PendingIntent;
270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.content.ActivityNotFoundException;
287d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.BroadcastReceiver;
29b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.ComponentName;
307d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.ContentProviderClient;
31b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.Intent;
32b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.content.ServiceConnection;
33aec68bb89fe614181a20eb97340149406218ce2fDianne Hackbornimport android.graphics.BitmapFactory;
34f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.os.Bundle;
3589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Handler;
36b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackbornimport android.os.IBinder;
3789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Message;
387d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.os.RemoteException;
3979af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackbornimport android.os.UserHandle;
403992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport android.os.UserManager;
41f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.graphics.Bitmap;
42f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.ImageView;
43f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.LinearLayout;
44f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.TextView;
45f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.widget.ScrollView;
467d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.widget.Toast;
478a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.view.Menu;
488a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackbornimport android.view.MenuItem;
49f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.view.View;
50f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.content.Context;
513992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackbornimport android.content.pm.UserInfo;
52756220bd1912535840388a6743830d2e59ad4964Dianne Hackbornimport android.content.res.Configuration;
53f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornimport android.util.Log;
54f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
55f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackbornpublic class ActivityTestMain extends Activity {
56b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn    static final String TAG = "ActivityTest";
57b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn
58756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    static final String KEY_CONFIGURATION = "configuration";
59756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn
600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    ActivityManager mAm;
61756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    Configuration mOverrideConfig;
623992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    int mSecondUser;
633992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn
643992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    ArrayList<ServiceConnection> mConnections = new ArrayList<ServiceConnection>();
650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
66875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn    ServiceConnection mIsolatedConnection;
67875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn
6889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static final int MSG_SPAM = 1;
6989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
7089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    final Handler mHandler = new Handler() {
7189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        @Override
7289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        public void handleMessage(Message msg) {
7389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            switch (msg.what) {
7489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                case MSG_SPAM: {
7589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    boolean fg = msg.arg1 != 0;
7689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    Intent intent = new Intent(ActivityTestMain.this, SpamActivity.class);
7789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    Bundle options = null;
7889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    if (fg) {
790321573fa7583cd2ac4ece015c2eb784e3b24eb8Craig Mautner                        ActivityOptions opts = ActivityOptions.makeTaskLaunchBehind();
8089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        options = opts.toBundle();
8189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    }
8289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    startActivity(intent, options);
8389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    scheduleSpam(!fg);
8489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                } break;
8589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
8689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            super.handleMessage(msg);
8789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
8889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    };
8989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
907d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    class BroadcastResultReceiver extends BroadcastReceiver {
917d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        @Override
927d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        public void onReceive(Context context, Intent intent) {
937d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            Bundle res = getResultExtras(true);
947d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            int user = res.getInt("user", -1);
957d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            Toast.makeText(ActivityTestMain.this,
967d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    "Receiver executed as user "
977d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    + (user >= 0 ? Integer.toString(user) : "unknown"),
987d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    Toast.LENGTH_LONG).show();
997d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
1007d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    }
1017d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn
1020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private void addThumbnail(LinearLayout container, Bitmap bm,
1030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            final ActivityManager.RecentTaskInfo task,
104c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner            final ActivityManager.TaskThumbnail thumbs) {
105f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        ImageView iv = new ImageView(this);
106f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        if (bm != null) {
107f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            iv.setImageBitmap(bm);
108f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        }
109f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        iv.setBackgroundResource(android.R.drawable.gallery_thumb);
110f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        int w = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_width);
111f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        int h = getResources().getDimensionPixelSize(android.R.dimen.thumbnail_height);
112f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        container.addView(iv, new LinearLayout.LayoutParams(w, h));
1130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
1140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        iv.setOnClickListener(new View.OnClickListener() {
1150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            @Override
1160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            public void onClick(View v) {
1170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                if (task.id >= 0 && thumbs != null) {
1180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    mAm.moveTaskToFront(task.id, ActivityManager.MOVE_TASK_WITH_HOME);
1190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                } else {
1200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    try {
1210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        startActivity(task.baseIntent);
1220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    } catch (ActivityNotFoundException e) {
1230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        Log.w("foo", "Unable to start task: " + e);
1240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
1250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
1260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                buildUi();
1270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
1280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        });
1290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        iv.setOnLongClickListener(new View.OnLongClickListener() {
1300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            @Override
1310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            public boolean onLongClick(View v) {
1320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                if (task.id >= 0 && thumbs != null) {
133d54b578e47fb410c776bb3a4272c2c523153f657Wale Ogunwale                    mAm.removeTask(task.id);
1340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    buildUi();
1350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    return true;
1360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
1370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return false;
1380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
1390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        });
140f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    }
141f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
142f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    @Override
143f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
144f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        super.onCreate(savedInstanceState);
145f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
14685d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn        Log.i(TAG, "Referrer: " + getReferrer());
14785d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn
1480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mAm = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
149756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        if (savedInstanceState != null) {
150756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION);
151756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            if (mOverrideConfig != null) {
152756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                applyOverrideConfiguration(mOverrideConfig);
153756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            }
154756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        }
1553992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn
1563992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        UserManager um = (UserManager)getSystemService(Context.USER_SERVICE);
1573992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        List<UserInfo> users = um.getUsers();
1583992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        mSecondUser = Integer.MAX_VALUE;
1593992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        for (UserInfo ui : users) {
1603992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            if (ui.id != 0 && mSecondUser > ui.id) {
1613992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                mSecondUser = ui.id;
1623992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
1633992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        }
16415ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn
16515ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn        /*
16615ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn        AlertDialog ad = new AlertDialog.Builder(this).setTitle("title").setMessage("message").create();
16715ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn        ad.getWindow().getAttributes().type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
16815ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn        ad.show();
16915ed2754a308546a54ab1061b4e365d6fe9b898dDianne Hackborn        */
1700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
1710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
1720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    @Override
1738a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn    public boolean onCreateOptionsMenu(Menu menu) {
1748a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn        menu.add("Animate!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
17589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            @Override
17689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            public boolean onMenuItemClick(MenuItem item) {
1778a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                AlertDialog.Builder builder = new AlertDialog.Builder(ActivityTestMain.this,
1788a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                        R.style.SlowDialog);
1798a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                builder.setTitle("This is a title");
1808a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                builder.show();
1818a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn                return true;
1828a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn            }
1838a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn        });
184b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        menu.add("Bind!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
185b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
186b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
187b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                ServiceConnection conn = new ServiceConnection() {
188b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    @Override
189b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
190b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                        Log.i(TAG, "Service connected " + name + " " + service);
191b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    }
192b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    @Override
193b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
194b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                        Log.i(TAG, "Service disconnected " + name);
195b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                    }
196b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                };
1973992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
1983992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    mConnections.add(conn);
1993992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                } else {
2003992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
2013992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                            Toast.LENGTH_LONG).show();
2023992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                }
203b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                return true;
204b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            }
205b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        });
206b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        menu.add("Start!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
207b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
208b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, SingleUserService.class);
209b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                startService(intent);
210b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                return true;
211b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            }
212b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        });
213875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn        menu.add("Rebind Isolated!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
214875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
215875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, IsolatedService.class);
216875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                ServiceConnection conn = new ServiceConnection() {
217875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    @Override
218875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
219875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                        Log.i(TAG, "Isolated service connected " + name + " " + service);
220875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    }
221875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    @Override
222875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
223875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                        Log.i(TAG, "Isolated service disconnected " + name);
224875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    }
225875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                };
226875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                if (mIsolatedConnection != null) {
227875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    Log.i(TAG, "Unbinding existing service: " + mIsolatedConnection);
228875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    unbindService(mIsolatedConnection);
229875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    mIsolatedConnection = null;
230875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                }
231875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                Log.i(TAG, "Binding new service: " + conn);
232875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                if (bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
233875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    mIsolatedConnection = conn;
234875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                } else {
235875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
236875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                            Toast.LENGTH_LONG).show();
237875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                }
238875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn                return true;
239875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn            }
240875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn        });
241b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        menu.add("Send!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
242b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2437d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, SingleUserReceiver.class);
244f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                sendOrderedBroadcast(intent, null, new BroadcastResultReceiver(),
2457d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        null, Activity.RESULT_OK, null, null);
2467d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                return true;
2477d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
2487d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        });
2497d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        menu.add("Call!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                ContentProviderClient cpl = getContentResolver().acquireContentProviderClient(
2527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        SingleUserProvider.AUTHORITY);
2537d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Bundle res = null;
2547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                try {
2557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    res = cpl.call("getuser", null, null);
2567d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                } catch (RemoteException e) {
2577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
2587d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                int user = res != null ? res.getInt("user", -1) : -1;
2597d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Toast.makeText(ActivityTestMain.this,
2607d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        "Provider executed as user "
2617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        + (user >= 0 ? Integer.toString(user) : "unknown"),
2627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        Toast.LENGTH_LONG).show();
2637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                cpl.release();
2647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                return true;
2657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
2667d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        });
2673992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Send to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2683992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2693992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
2703992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                sendOrderedBroadcastAsUser(intent, new UserHandle(0), null,
2713992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        new BroadcastResultReceiver(),
2723992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        null, Activity.RESULT_OK, null, null);
2733992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                return true;
2743992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
2753992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        });
2763992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Send to user " + mSecondUser + "!").setOnMenuItemClickListener(
2773992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                new MenuItem.OnMenuItemClickListener() {
2787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
279b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, UserTarget.class);
2803992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                sendOrderedBroadcastAsUser(intent, new UserHandle(mSecondUser), null,
281aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                        new BroadcastResultReceiver(),
2827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        null, Activity.RESULT_OK, null, null);
283b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn                return true;
284b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn            }
285b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        });
2863992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Bind to user 0!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
2873992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
2883992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
2893992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                ServiceConnection conn = new ServiceConnection() {
2903992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
2913992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
2923992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service connected " + name + " " + service);
2933992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
2943992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
2953992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
2963992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service disconnected " + name);
2973992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
2983992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                };
29945c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani                if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE, UserHandle.OWNER)) {
3003992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    mConnections.add(conn);
3013992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                } else {
3023992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
3033992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                            Toast.LENGTH_LONG).show();
3043992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                }
3053992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                return true;
3063992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
3073992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        });
3083992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        menu.add("Bind to user " + mSecondUser + "!").setOnMenuItemClickListener(
3093992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                new MenuItem.OnMenuItemClickListener() {
3103992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
3113992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                Intent intent = new Intent(ActivityTestMain.this, ServiceUserTarget.class);
3123992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                ServiceConnection conn = new ServiceConnection() {
3133992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
3143992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceConnected(ComponentName name, IBinder service) {
3153992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service connected " + name + " " + service);
3163992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
3173992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    @Override
3183992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    public void onServiceDisconnected(ComponentName name) {
3193992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                        Log.i(TAG, "Service disconnected " + name);
3203992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    }
3213992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                };
32245c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani                if (bindServiceAsUser(intent, conn, Context.BIND_AUTO_CREATE,
32345c0924fbbb2bdd38b5d154e2bc440abda4381c4Amith Yamasani                        new UserHandle(mSecondUser))) {
3243992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    mConnections.add(conn);
3253992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                } else {
3263992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                    Toast.makeText(ActivityTestMain.this, "Failed to bind",
3273992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                            Toast.LENGTH_LONG).show();
3283992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                }
3293992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn                return true;
3303992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            }
3313992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        });
332756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        menu.add("Density!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
333756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
334756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                if (mOverrideConfig == null) {
335756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                    mOverrideConfig = new Configuration();
336756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                }
337756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                if (mOverrideConfig.densityDpi == Configuration.DENSITY_DPI_UNDEFINED) {
338756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                    mOverrideConfig.densityDpi = (getApplicationContext().getResources()
339756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                            .getConfiguration().densityDpi*2)/3;
340756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                } else {
341756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                    mOverrideConfig.densityDpi = Configuration.DENSITY_DPI_UNDEFINED;
342756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                }
343756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                recreate();
344756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn                return true;
345756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            }
346756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        });
347f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        menu.add("HashArray").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
348f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
349f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                ArrayMapTests.run();
350f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                return true;
351f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
352f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        });
353aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        menu.add("Add App Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
354aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
355aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                addAppRecents(1);
356aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                return true;
357aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            }
358aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        });
359aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        menu.add("Add App 10x Recent").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
360aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
361aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                addAppRecents(10);
362aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                return true;
363aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            }
364aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        });
365aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        menu.add("Exclude!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
366aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
367aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                setExclude(true);
368aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                return true;
369aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            }
370aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        });
371aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        menu.add("Include!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
372aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
373aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                setExclude(false);
374aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                return true;
375aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            }
376aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        });
37789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        menu.add("Open Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
37889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
37989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                ActivityManager.AppTask task = findDocTask();
38089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (task == null) {
38189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    Intent intent = new Intent(ActivityTestMain.this, DocActivity.class);
38289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT
38389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                            | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
38489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                            | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
38589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    startActivity(intent);
38689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                } else {
38789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    task.moveToFront();
38889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
38989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return true;
39089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
39189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        });
39289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        menu.add("Stack Doc").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
39389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
39489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                ActivityManager.AppTask task = findDocTask();
39589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (task != null) {
39689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    ActivityManager.RecentTaskInfo recent = task.getTaskInfo();
39789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    Intent intent = new Intent(ActivityTestMain.this, DocActivity.class);
39889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    if (recent.id >= 0) {
39989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        // Stack on top.
40089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        intent.putExtra(DocActivity.LABEL, "Stacked");
40189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    } else {
40289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        // Start root activity.
40389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        intent.putExtra(DocActivity.LABEL, "New Root");
40489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    }
405d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    task.startActivity(ActivityTestMain.this, intent, null);
40689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
40789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return true;
40889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
40989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        });
41089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        menu.add("Spam!").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
41189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
41289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                scheduleSpam(false);
41389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return true;
41489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
41589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        });
416b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn        menu.add("Track time").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
417b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn            @Override public boolean onMenuItemClick(MenuItem item) {
418b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                Intent intent = new Intent(Intent.ACTION_SEND);
419b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                intent.setType("text/plain");
420b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                intent.putExtra(Intent.EXTRA_TEXT, "We are sharing this with you!");
421b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                ActivityOptions options = ActivityOptions.makeBasic();
422b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                Intent receiveIntent = new Intent(ActivityTestMain.this, TrackTimeReceiver.class);
423b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                receiveIntent.putExtra("something", "yeah, this is us!");
424b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                options.requestUsageTimeReport(PendingIntent.getBroadcast(ActivityTestMain.this,
425b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                        0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
426b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                startActivity(Intent.createChooser(intent, "Who do you love?"), options.toBundle());
427b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn                return true;
428b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn            }
429b5a380d409a1431a38db978864b9d85b689e3cceDianne Hackborn        });
4308a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn        return true;
4318a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn    }
4328a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn
4338a59b7f95f84ecc1f961a57d013ac68743c35d74Dianne Hackborn    @Override
4340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    protected void onStart() {
4350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        super.onStart();
4360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        buildUi();
4370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
4380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
439756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    @Override
440a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    protected void onPause() {
441a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        super.onPause();
442a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        Log.i(TAG, "I'm such a slooow poor loser");
443a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        try {
444a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            Thread.sleep(500);
445a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        } catch (InterruptedException e) {
446a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        }
447a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        Log.i(TAG, "See?");
448a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    }
449a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
450a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    @Override
451756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
452756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        super.onSaveInstanceState(outState);
453756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        if (mOverrideConfig != null) {
454756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn            outState.putParcelable(KEY_CONFIGURATION, mOverrideConfig);
455756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn        }
456756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn    }
457756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn
4583992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    @Override
4593992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    protected void onStop() {
4603992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        super.onStop();
4613992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        for (ServiceConnection conn : mConnections) {
4623992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn            unbindService(conn);
4633992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        }
4643992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn        mConnections.clear();
465875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn        if (mIsolatedConnection != null) {
466875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn            unbindService(mIsolatedConnection);
467875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn            mIsolatedConnection = null;
468875e464e362c1e5527c5830c107c7ef84ecfbf0dDianne Hackborn        }
4693992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn    }
4703992645bf333c56669ef2fa19c26b2947884a4f3Dianne Hackborn
47189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    @Override
47289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    protected void onDestroy() {
47389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        super.onDestroy();
47489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        mHandler.removeMessages(MSG_SPAM);
47589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
47689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
477aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn    void addAppRecents(int count) {
478aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
479aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        Intent intent = new Intent(Intent.ACTION_MAIN);
480aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        intent.addCategory(Intent.CATEGORY_LAUNCHER);
481aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
482aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        intent.setComponent(new ComponentName(this, ActivityTestMain.class));
483aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        for (int i=0; i<count; i++) {
484aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            ActivityManager.TaskDescription desc = new ActivityManager.TaskDescription();
485aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            desc.setLabel("Added #" + i);
486aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
487aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            if ((i&1) == 0) {
488aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                desc.setIcon(bitmap);
489aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            }
490aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            int taskId = am.addAppTask(this, intent, desc, bitmap);
491aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            Log.i(TAG, "Added new task id #" + taskId);
492aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        }
493aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn    }
494aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn
495aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn    void setExclude(boolean exclude) {
496aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
497aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        List<ActivityManager.AppTask> tasks = am.getAppTasks();
498aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        int taskId = getTaskId();
499aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        for (int i=0; i<tasks.size(); i++) {
500aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            ActivityManager.AppTask task = tasks.get(i);
501aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            if (task.getTaskInfo().id == taskId) {
502aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn                task.setExcludeFromRecents(exclude);
503aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn            }
504aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn        }
505aec68bb89fe614181a20eb97340149406218ce2fDianne Hackborn    }
50689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
50789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    ActivityManager.AppTask findDocTask() {
50889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
50989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        List<ActivityManager.AppTask> tasks = am.getAppTasks();
51089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if (tasks != null) {
51189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            for (int i=0; i<tasks.size(); i++) {
51289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                ActivityManager.AppTask task = tasks.get(i);
51389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                ActivityManager.RecentTaskInfo recent = task.getTaskInfo();
51489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (recent.baseIntent != null
51589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        && recent.baseIntent.getComponent().getClassName().equals(
51689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                                DocActivity.class.getCanonicalName())) {
51789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    return task;
51889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
51989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
52089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
52189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        return null;
52289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
52389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
52489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    void scheduleSpam(boolean fg) {
52589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        mHandler.removeMessages(MSG_SPAM);
52689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        Message msg = mHandler.obtainMessage(MSG_SPAM, fg ? 1 : 0, 0);
52789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        mHandler.sendMessageDelayed(msg, 500);
52889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
52989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
53089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    private View scrollWrap(View view) {
5310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ScrollView scroller = new ScrollView(this);
5320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        scroller.addView(view, new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT,
5330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ScrollView.LayoutParams.MATCH_PARENT));
5340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return scroller;
5350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
536f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
5370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private void buildUi() {
538f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        LinearLayout top = new LinearLayout(this);
539f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        top.setOrientation(LinearLayout.VERTICAL);
540f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
5410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        List<ActivityManager.RecentTaskInfo> recents = mAm.getRecentTasks(10,
542f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                ActivityManager.RECENT_WITH_EXCLUDED);
543f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        if (recents != null) {
544f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            for (int i=0; i<recents.size(); i++) {
545f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                ActivityManager.RecentTaskInfo r = recents.get(i);
546c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner                ActivityManager.TaskThumbnail tt = mAm.getTaskThumbnail(r.persistentId);
547f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                TextView tv = new TextView(this);
548f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                tv.setText(r.baseIntent.getComponent().flattenToShortString());
549f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                top.addView(tv, new LinearLayout.LayoutParams(
550f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT,
551f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT));
552f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                LinearLayout item = new LinearLayout(this);
553f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                item.setOrientation(LinearLayout.HORIZONTAL);
554c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner                addThumbnail(item, tt != null ? tt.mainThumbnail : null, r, tt);
555f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                top.addView(item, new LinearLayout.LayoutParams(
556f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT,
557f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        LinearLayout.LayoutParams.WRAP_CONTENT));
558f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            }
559f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        }
560f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn
561f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        setContentView(scrollWrap(top));
562f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn    }
563f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn}
564