17e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri/* 2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project 37e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * 47e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * Licensed under the Apache License, Version 2.0 (the "License"); 57e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * you may not use this file except in compliance with the License. 67e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * You may obtain a copy of the License at 77e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * 87e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * http://www.apache.org/licenses/LICENSE-2.0 97e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * 107e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * Unless required by applicable law or agreed to in writing, software 117e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * distributed under the License is distributed on an "AS IS" BASIS, 127e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * See the License for the specific language governing permissions and 147e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * limitations under the License. 157e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.fragment.app; 177e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 18fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertEquals; 19fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertTrue; 20fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.fail; 217e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.ArgumentMatchers.eq; 227e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.ArgumentMatchers.same; 237e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.Mockito.mock; 247e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.Mockito.verify; 257e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Liimport static org.mockito.Mockito.verifyNoMoreInteractions; 267e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li 277e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.app.Activity; 287e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.app.PendingIntent; 297e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.content.Intent; 307e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.content.IntentSender; 317e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.support.test.InstrumentationRegistry; 32754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest; 33c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikasimport android.support.test.rule.ActivityTestRule; 347e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport android.support.test.runner.AndroidJUnit4; 35320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikas 36ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.core.app.ActivityCompat; 37ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.fragment.app.test.FragmentResultActivity; 38ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.fragment.app.test.FragmentTestActivity; 39320113721c2e14bbc2403809046fa2959a665c11Aurimas Liutikasimport androidx.fragment.test.R; 407e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 417e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport org.junit.Before; 42c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikasimport org.junit.Rule; 437e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport org.junit.Test; 447e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarriimport org.junit.runner.RunWith; 457e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 464285a0db794444695fd0752e7bbc2ad95082043cGeorge Mountimport java.util.concurrent.CountDownLatch; 474285a0db794444695fd0752e7bbc2ad95082043cGeorge Mountimport java.util.concurrent.TimeUnit; 484285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount 497e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri/** 507e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri * Tests for Fragment startActivityForResult and startIntentSenderForResult. 517e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri */ 527e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri@RunWith(AndroidJUnit4.class) 53c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikaspublic class FragmentReceiveResultTest { 54c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas @Rule 55c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public ActivityTestRule<FragmentTestActivity> mActivityRule = 56c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas new ActivityTestRule<FragmentTestActivity>(FragmentTestActivity.class); 57c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas 587e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri private FragmentTestActivity mActivity; 597e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri private TestFragment mFragment; 607e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 617e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 627e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Before 63c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void setup() throws Throwable { 64c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivity = mActivityRule.getActivity(); 657e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mFragment = attachTestFragment(); 667e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 677e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 687e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Test 697e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @SmallTest 70c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testStartActivityForResultOk() throws Throwable { 717e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri startActivityForResult(10, Activity.RESULT_OK, "content 10"); 727e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 737e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertTrue("Fragment should receive result", mFragment.mHasResult); 747e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(10, mFragment.mRequestCode); 757e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(Activity.RESULT_OK, mFragment.mResultCode); 767e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals("content 10", mFragment.mResultContent); 777e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 787e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 797e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Test 807e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @SmallTest 81c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testStartActivityForResultCanceled() throws Throwable { 827e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri startActivityForResult(20, Activity.RESULT_CANCELED, "content 20"); 837e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 847e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertTrue("Fragment should receive result", mFragment.mHasResult); 857e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(20, mFragment.mRequestCode); 867e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode); 877e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals("content 20", mFragment.mResultContent); 887e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 897e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 907e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Test 917e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @SmallTest 92c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testStartIntentSenderForResultOk() throws Throwable { 937e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri startIntentSenderForResult(30, Activity.RESULT_OK, "content 30"); 947e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 957e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertTrue("Fragment should receive result", mFragment.mHasResult); 967e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(30, mFragment.mRequestCode); 977e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(Activity.RESULT_OK, mFragment.mResultCode); 987e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals("content 30", mFragment.mResultContent); 997e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1007e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1017e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Test 1027e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @SmallTest 103c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testStartIntentSenderForResultCanceled() throws Throwable { 1047e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri startIntentSenderForResult(40, Activity.RESULT_CANCELED, "content 40"); 1057e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1067e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertTrue("Fragment should receive result", mFragment.mHasResult); 1077e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(40, mFragment.mRequestCode); 1087e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode); 1097e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri assertEquals("content 40", mFragment.mResultContent); 1107e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1117e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1127e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li @Test 1137e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li @SmallTest 1147e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li public void testActivityResult_withDelegate() { 1157e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li ActivityCompat.PermissionCompatDelegate 1167e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li delegate = mock(ActivityCompat.PermissionCompatDelegate.class); 1177e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li 1187e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li Intent data = new Intent(); 1197e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li ActivityCompat.setPermissionCompatDelegate(delegate); 1207e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li 1217e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li mActivityRule.getActivity().onActivityResult(42, 43, data); 1227e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li 1237e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li verify(delegate).onActivityResult(same(mActivityRule.getActivity()), eq(42), eq(43), 1247e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li same(data)); 1257e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li 1267e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li ActivityCompat.setPermissionCompatDelegate(null); 1277e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li mActivityRule.getActivity().onActivityResult(42, 43, data); 1287e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li verifyNoMoreInteractions(delegate); 1297e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li } 1307e83cb69be885deb27fc4d5c45df61a24a16a3afJichao Li 131c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas private TestFragment attachTestFragment() throws Throwable { 1327e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri final TestFragment fragment = new TestFragment(); 133c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 1347e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Override 1357e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri public void run() { 1367e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 1377e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri .add(R.id.content, fragment) 1387e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri .addToBackStack(null) 1397e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri .commitAllowingStateLoss(); 1407e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mActivity.getFragmentManager().executePendingTransactions(); 1417e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1427e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri }); 1437e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 1447e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri return fragment; 1457e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1467e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1477e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri private void startActivityForResult(final int requestCode, final int resultCode, 148c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas final String content) throws Throwable { 149c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 1507e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Override 1517e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri public void run() { 1527e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri Intent intent = new Intent(mActivity, FragmentResultActivity.class); 1537e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode); 1547e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content); 1557e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1567e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mFragment.startActivityForResult(intent, requestCode); 1577e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1587e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri }); 1594285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount assertTrue(mFragment.mResultReceiveLatch.await(1, TimeUnit.SECONDS)); 1607e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 1617e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1627e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1637e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri private void startIntentSenderForResult(final int requestCode, final int resultCode, 164c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas final String content) throws Throwable { 165c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 1667e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Override 1677e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri public void run() { 1687e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri Intent intent = new Intent(mActivity, FragmentResultActivity.class); 1697e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode); 1707e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content); 1717e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1727e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri PendingIntent pendingIntent = PendingIntent.getActivity(mActivity, 1737e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri requestCode, intent, 0); 1747e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1757e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri try { 1767e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mFragment.startIntentSenderForResult(pendingIntent.getIntentSender(), 1777e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri requestCode, null, 0, 0, 0, null); 1787e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } catch (IntentSender.SendIntentException e) { 1797e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri fail("IntentSender failed"); 1807e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1817e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1827e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri }); 1834285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount assertTrue(mFragment.mResultReceiveLatch.await(1, TimeUnit.SECONDS)); 1847e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 1857e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 1867e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 187af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public static class TestFragment extends Fragment { 1887e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri boolean mHasResult = false; 1897e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri int mRequestCode = -1; 1907e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri int mResultCode = 100; 1917e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri String mResultContent; 1924285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount final CountDownLatch mResultReceiveLatch = new CountDownLatch(1); 1937e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri 1947e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri @Override 1957e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri public void onActivityResult(int requestCode, int resultCode, Intent data) { 1967e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mHasResult = true; 1977e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mRequestCode = requestCode; 1987e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mResultCode = resultCode; 1997e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri mResultContent = data.getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT); 2004285a0db794444695fd0752e7bbc2ad95082043cGeorge Mount mResultReceiveLatch.countDown(); 2017e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 2027e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri } 2037e866aba6258c1c7c2e0e9b303d065f3ed88e841Clara Bayarri} 204