Allow activity to delegate onActivityResult to fragments
Change-Id: Iac388f1726269239313d666f3123f28348e0c90a
Fixes: 111531567
Test: rototests
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index cafe5cf..cacd04e 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -46,6 +46,7 @@
import com.android.settings.Settings.WifiSettingsActivity;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.backup.BackupSettingsActivity;
+import com.android.settings.core.OnActivityResultListener;
import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.gateway.SettingsGateway;
@@ -64,6 +65,7 @@
import java.util.ArrayList;
import java.util.List;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -375,6 +377,19 @@
}
}
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ final List<Fragment> fragments = getSupportFragmentManager().getFragments();
+ if (fragments != null) {
+ for (Fragment fragment : fragments) {
+ if (fragment instanceof OnActivityResultListener) {
+ fragment.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+ }
+ }
+
@VisibleForTesting
void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
if (!mIsShowingDashboard && initialFragmentName != null) {
diff --git a/src/com/android/settings/core/OnActivityResultListener.java b/src/com/android/settings/core/OnActivityResultListener.java
new file mode 100644
index 0000000..5832c7f
--- /dev/null
+++ b/src/com/android/settings/core/OnActivityResultListener.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import android.app.Activity;
+import android.content.Intent;
+
+/**
+ * This interface marks a class that it wants to listen to
+ * {@link Activity#onActivityResult(int, int, Intent)}.
+ *
+ * Whenever {@link com.android.settings.SettingsActivity} receives an activity result, it will
+ * propagate the data to this interface so it has a chance to inspect and handle activity results.
+ */
+public interface OnActivityResultListener {
+}
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index 2b5a8ab..7120cf6 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -27,6 +27,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.RingtonePreference;
+import com.android.settings.core.OnActivityResultListener;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -44,7 +45,8 @@
import androidx.preference.Preference;
@SearchIndexable
-public class ConfigureNotificationSettings extends DashboardFragment {
+public class ConfigureNotificationSettings extends DashboardFragment implements
+ OnActivityResultListener {
private static final String TAG = "ConfigNotiSettings";
@VisibleForTesting
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index dafc538..cc3b7c9 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -31,6 +31,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.RingtonePreference;
+import com.android.settings.core.OnActivityResultListener;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.sound.HandsFreeProfileOutputPreferenceController;
@@ -51,7 +52,7 @@
import androidx.preference.Preference;
@SearchIndexable
-public class SoundSettings extends DashboardFragment {
+public class SoundSettings extends DashboardFragment implements OnActivityResultListener {
private static final String TAG = "SoundSettings";
private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index 1966467..d1033ea 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -16,6 +16,7 @@
package com.android.settings;
+import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -26,6 +27,7 @@
import android.app.ActivityManager;
import android.content.Intent;
+import com.android.settings.core.OnActivityResultListener;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -35,6 +37,10 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
@@ -65,9 +71,34 @@
}
@Test
- public void testSetTaskDescription_IconChanged() {
+ public void setTaskDescription_shouldUpdateIcon() {
mActivity.setTaskDescription(mTaskDescription);
verify(mTaskDescription).setIcon(anyInt());
}
+
+ @Test
+ public void onActivityResult_shouldDelegateToListener() {
+ final List<Fragment> fragments = new ArrayList<>();
+ fragments.add(new Fragment());
+ fragments.add(new ListenerFragment());
+
+ final FragmentManager manager = mock(FragmentManager.class);
+ when(mActivity.getSupportFragmentManager()).thenReturn(manager);
+ when(manager.getFragments()).thenReturn(fragments);
+
+ mActivity.onActivityResult(0, 0, new Intent());
+
+ assertThat(((ListenerFragment) fragments.get(1)).mOnActivityResultCalled).isTrue();
+ }
+
+ public static class ListenerFragment extends Fragment implements OnActivityResultListener {
+
+ public boolean mOnActivityResultCalled;
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ mOnActivityResultCalled = true;
+ }
+ }
}