1 /* 2 * Copyright (C) 2016 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 android.app.cts; 17 18 import static org.mockito.Mockito.*; 19 20 import android.app.Activity; 21 import android.app.Fragment; 22 import android.app.PendingIntent; 23 import android.app.stubs.FragmentResultActivity; 24 import android.app.stubs.FragmentTestActivity; 25 import android.app.stubs.R; 26 import android.content.Intent; 27 import android.content.IntentSender; 28 import android.test.ActivityInstrumentationTestCase2; 29 import android.test.suitebuilder.annotation.SmallTest; 30 31 import org.mockito.ArgumentCaptor; 32 33 /** 34 * Tests Fragment's startActivityForResult and startIntentSenderForResult. 35 */ 36 public class FragmentReceiveResultTest extends 37 ActivityInstrumentationTestCase2<FragmentTestActivity> { 38 39 private FragmentTestActivity mActivity; 40 private Fragment mFragment; 41 FragmentReceiveResultTest()42 public FragmentReceiveResultTest() { 43 super(FragmentTestActivity.class); 44 } 45 46 @Override setUp()47 protected void setUp() throws Exception { 48 super.setUp(); 49 mActivity = getActivity(); 50 mFragment = attachTestFragment(); 51 } 52 53 @SmallTest testStartActivityForResultOk()54 public void testStartActivityForResultOk() { 55 startActivityForResult(10, Activity.RESULT_OK, "content 10"); 56 57 ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); 58 verify(mFragment, times(1)) 59 .onActivityResult(eq(10), eq(Activity.RESULT_OK), captor.capture()); 60 final String data = captor.getValue() 61 .getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT); 62 assertEquals("content 10", data); 63 } 64 65 @SmallTest testStartActivityForResultCanceled()66 public void testStartActivityForResultCanceled() { 67 startActivityForResult(20, Activity.RESULT_CANCELED, "content 20"); 68 69 ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); 70 verify(mFragment, times(1)) 71 .onActivityResult(eq(20), eq(Activity.RESULT_CANCELED), captor.capture()); 72 final String data = captor.getValue() 73 .getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT); 74 assertEquals("content 20", data); 75 } 76 77 @SmallTest testStartIntentSenderForResultOk()78 public void testStartIntentSenderForResultOk() { 79 startIntentSenderForResult(30, Activity.RESULT_OK, "content 30"); 80 81 ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); 82 verify(mFragment, times(1)) 83 .onActivityResult(eq(30), eq(Activity.RESULT_OK), captor.capture()); 84 final String data = captor.getValue() 85 .getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT); 86 assertEquals("content 30", data); 87 } 88 89 @SmallTest testStartIntentSenderForResultCanceled()90 public void testStartIntentSenderForResultCanceled() { 91 startIntentSenderForResult(40, Activity.RESULT_CANCELED, "content 40"); 92 93 ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class); 94 verify(mFragment, times(1)) 95 .onActivityResult(eq(40), eq(Activity.RESULT_CANCELED), captor.capture()); 96 final String data = captor.getValue() 97 .getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT); 98 assertEquals("content 40", data); 99 } 100 attachTestFragment()101 private Fragment attachTestFragment() { 102 final Fragment fragment = spy(new Fragment()); 103 getInstrumentation().waitForIdleSync(); 104 getInstrumentation().runOnMainSync(new Runnable() { 105 @Override 106 public void run() { 107 mActivity.getFragmentManager().beginTransaction() 108 .add(R.id.content, fragment) 109 .addToBackStack(null) 110 .commitAllowingStateLoss(); 111 mActivity.getFragmentManager().executePendingTransactions(); 112 } 113 }); 114 getInstrumentation().waitForIdleSync(); 115 return fragment; 116 } 117 startActivityForResult(final int requestCode, final int resultCode, final String content)118 private void startActivityForResult(final int requestCode, final int resultCode, 119 final String content) { 120 getInstrumentation().runOnMainSync(new Runnable() { 121 @Override 122 public void run() { 123 Intent intent = new Intent(mActivity, FragmentResultActivity.class); 124 intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode); 125 intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content); 126 127 mFragment.startActivityForResult(intent, requestCode); 128 } 129 }); 130 getInstrumentation().waitForIdleSync(); 131 } 132 startIntentSenderForResult(final int requestCode, final int resultCode, final String content)133 private void startIntentSenderForResult(final int requestCode, final int resultCode, 134 final String content) { 135 getInstrumentation().runOnMainSync(new Runnable() { 136 @Override 137 public void run() { 138 Intent intent = new Intent(mActivity, FragmentResultActivity.class); 139 intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode); 140 intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content); 141 142 PendingIntent pendingIntent = PendingIntent.getActivity(mActivity, 143 requestCode, intent, 0); 144 145 try { 146 mFragment.startIntentSenderForResult(pendingIntent.getIntentSender(), 147 requestCode, null, 0, 0, 0, null); 148 } catch (IntentSender.SendIntentException e) { 149 fail("IntentSender failed"); 150 } 151 } 152 }); 153 getInstrumentation().waitForIdleSync(); 154 } 155 156 } 157