diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index cafe5cf9472..cacd04e535c 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -46,6 +46,7 @@ import com.android.internal.util.ArrayUtils; 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 com.android.settingslib.utils.ThreadUtils; 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 @@ public class SettingsActivity extends SettingsBaseActivity } } + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + final List 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 00000000000..5832c7f892f --- /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 2b5a8abc9df..7120cf61306 100644 --- a/src/com/android/settings/notification/ConfigureNotificationSettings.java +++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java @@ -27,6 +27,7 @@ import android.provider.SearchIndexableResource; 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.fragment.app.Fragment; 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 dafc5389074..cc3b7c9f7dc 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; 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.ListPreference; 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 1966467a356..d1033eabcd2 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 static org.mockito.Mockito.when; 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.Mock; 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 @@ public class SettingsActivityTest { } @Test - public void testSetTaskDescription_IconChanged() { + public void setTaskDescription_shouldUpdateIcon() { mActivity.setTaskDescription(mTaskDescription); verify(mTaskDescription).setIcon(anyInt()); } + + @Test + public void onActivityResult_shouldDelegateToListener() { + final List 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; + } + } }