1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.cts.deviceandprofileowner;
17 
18 import android.content.BroadcastReceiver;
19 import android.content.ComponentName;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.os.SystemClock;
24 
25 public class PersistentIntentResolvingTest extends BaseDeviceAdminTest {
26     static final String EXAMPLE_ACTION = "com.android.cts.deviceandprofileowner.EXAMPLE_ACTION";
27 
28     private boolean mReceivedConfirmationFrom1;
29     private boolean mReceivedConfirmationFrom2;
30     private BroadcastReceiver mReceiver;
31 
32     @Override
setUp()33     protected void setUp() throws Exception {
34         super.setUp();
35 
36         IntentFilter filter = new IntentFilter();
37         filter.addAction(ExampleIntentReceivingActivity1.CONFIRM_ACTION);
38         filter.addAction(ExampleIntentReceivingActivity2.CONFIRM_ACTION);
39 
40         mReceiver = new ConfirmReceiver();
41         mContext.registerReceiver(mReceiver, filter);
42 
43         synchronized(this) {
44             mReceivedConfirmationFrom1 = false;
45             mReceivedConfirmationFrom2 = false;
46         }
47     }
48 
49     @Override
tearDown()50     protected void tearDown() throws Exception {
51         mDevicePolicyManager.clearPackagePersistentPreferredActivities(ADMIN_RECEIVER_COMPONENT,
52                 PACKAGE_NAME);
53         mContext.unregisterReceiver(mReceiver);
54 
55         super.tearDown();
56     }
57 
testNoPersistentPreferredActivityYieldsResolverActivity()58     public void testNoPersistentPreferredActivityYieldsResolverActivity() {
59         sendExampleIntent();
60         SystemClock.sleep(5000);
61 
62         // Default behavior: intent results in resolver activity, since there are two potential
63         // receivers. No intent is received.
64         synchronized(this) {
65             assertFalse(mReceivedConfirmationFrom1);
66             assertFalse(mReceivedConfirmationFrom2);
67         }
68     }
69 
testAddPersistentPreferredActivityYieldsReceptionAtTarget()70     public void testAddPersistentPreferredActivityYieldsReceptionAtTarget() {
71         addPersistentPreferredActivity();
72         sendExampleIntent();
73         SystemClock.sleep(5000);
74 
75         // Persistent preferred activity present: intent should be received by activity 2.
76         synchronized(this) {
77             assertFalse(mReceivedConfirmationFrom1);
78             assertTrue(mReceivedConfirmationFrom2);
79         }
80     }
81 
testAddAndClearPersistentPreferredActivitiesYieldsResolverActivity()82     public void testAddAndClearPersistentPreferredActivitiesYieldsResolverActivity() {
83         addPersistentPreferredActivity();
84         mDevicePolicyManager.clearPackagePersistentPreferredActivities(ADMIN_RECEIVER_COMPONENT,
85                 PACKAGE_NAME);
86 
87         sendExampleIntent();
88         SystemClock.sleep(5000);
89 
90         // Default behavior: intent results in resolver activity, since there are two potential
91         // receivers. No intent is received.
92         synchronized(this) {
93             assertFalse(mReceivedConfirmationFrom1);
94             assertFalse(mReceivedConfirmationFrom2);
95         }
96     }
97 
98     public class ConfirmReceiver extends BroadcastReceiver {
99         @Override
onReceive(Context context, Intent intent)100         public void onReceive(Context context, Intent intent) {
101             if (intent.getAction().equals(ExampleIntentReceivingActivity1.CONFIRM_ACTION)) {
102                 synchronized (PersistentIntentResolvingTest.this) {
103                     mReceivedConfirmationFrom1 = true;
104                 }
105             } else if (intent.getAction().equals(ExampleIntentReceivingActivity2
106                             .CONFIRM_ACTION)) {
107                 synchronized (PersistentIntentResolvingTest.this) {
108                     mReceivedConfirmationFrom2 = true;
109                 }
110             }
111         }
112     }
113 
sendExampleIntent()114     private void sendExampleIntent() {
115         Intent exampleIntent = new Intent(EXAMPLE_ACTION);
116         exampleIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
117         mContext.startActivity(exampleIntent);
118     }
119 
addPersistentPreferredActivity()120     private void addPersistentPreferredActivity() {
121         IntentFilter filter = new IntentFilter();
122         filter.addAction(EXAMPLE_ACTION);
123         filter.addCategory(Intent.CATEGORY_DEFAULT);
124         ComponentName targetComponent = new ComponentName(PACKAGE_NAME,
125                 ExampleIntentReceivingActivity2.class.getName());
126         mDevicePolicyManager.addPersistentPreferredActivity(ADMIN_RECEIVER_COMPONENT, filter,
127                 targetComponent);
128     }
129 }
130