Forward wallpaper activity results to the caller.

- Added Activity.FLAG_ACTIVITY_FORWARD_RESULT to the intent that
launches the wallpaper activities.
- WallpaperSuggestionActivity also finishes itself after launching
intent.

Bug: 65691577
Test: Added robolectric test. Also verified manually that result code is
being forwarded
Change-Id: I2f8b0fac7a35c38e14c4a733b7552fd2e58dd0db
This commit is contained in:
Ajay Nadathur
2017-11-07 13:38:50 -08:00
parent 2260321fd8
commit d473e38c74
5 changed files with 114 additions and 5 deletions

View File

@@ -504,6 +504,26 @@ public final class Utils extends com.android.settingslib.Utils {
metricsCategory); metricsCategory);
} }
/**
* Start a new instance of the activity, showing only the given fragment.
* When launched in this mode, the given preference fragment will be instantiated and fill the
* entire activity.
*
* @param context The context.
* @param fragmentName The name of the fragment to display.
* @param titleResId resource id for the String to display for the title of this set
* of preferences.
* @param metricsCategory The current metricsCategory for logging source when fragment starts
* @param intentFlags flag that should be added to the intent.
*/
public static void startWithFragment(Context context, String fragmentName, int titleResId,
int metricsCategory, int intentFlags) {
startWithFragment(context, fragmentName, null, null, 0,
null /* titleResPackageName */, titleResId, null, false /* not a shortcut */,
metricsCategory, intentFlags);
}
/** /**
* Start a new instance of the activity, showing only the given fragment. * Start a new instance of the activity, showing only the given fragment.
* When launched in this mode, the given preference fragment will be instantiated and fill the * When launched in this mode, the given preference fragment will be instantiated and fill the
@@ -544,8 +564,17 @@ public final class Utils extends com.android.settingslib.Utils {
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId, Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title, boolean isShortcut, int metricsCategory) { CharSequence title, boolean isShortcut, int metricsCategory) {
startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
titleResPackageName, titleResId, title, isShortcut, metricsCategory, 0);
}
public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title, boolean isShortcut, int metricsCategory, int flags) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName, Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName,
titleResId, title, isShortcut, metricsCategory); titleResId, title, isShortcut, metricsCategory);
intent.addFlags(flags);
if (resultTo == null) { if (resultTo == null) {
context.startActivity(intent); context.startActivity(intent);
} else { } else {

View File

@@ -51,9 +51,9 @@ public class WallpaperSuggestionActivity extends Activity {
@VisibleForTesting @VisibleForTesting
void startFallbackSuggestion() { void startFallbackSuggestion() {
// fall back to default wallpaper picker // fall back to default wallpaper picker
Utils.startWithFragment(this, WallpaperTypeSettings.class.getName(), null, null, 0, Utils.startWithFragment(this, WallpaperTypeSettings.class.getName(),
R.string.wallpaper_suggestion_title, null, R.string.wallpaper_suggestion_title, MetricsProto.MetricsEvent.DASHBOARD_SUMMARY,
MetricsProto.MetricsEvent.DASHBOARD_SUMMARY); Intent.FLAG_ACTIVITY_FORWARD_RESULT);
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -16,6 +16,7 @@
package com.android.settings.wallpaper; package com.android.settings.wallpaper;
import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -67,7 +68,7 @@ public class WallpaperTypeSettings extends SettingsPreferenceFragment implements
// Add Preference items for each of the matching activities // Add Preference items for each of the matching activities
for (ResolveInfo info : rList) { for (ResolveInfo info : rList) {
Preference pref = new Preference(getPrefContext()); Preference pref = new Preference(getPrefContext());
Intent prefIntent = new Intent(intent); Intent prefIntent = new Intent(intent).addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
prefIntent.setComponent(new ComponentName( prefIntent.setComponent(new ComponentName(
info.activityInfo.packageName, info.activityInfo.name)); info.activityInfo.packageName, info.activityInfo.name));
pref.setIntent(prefIntent); pref.setIntent(prefIntent);
@@ -79,6 +80,16 @@ public class WallpaperTypeSettings extends SettingsPreferenceFragment implements
} }
} }
@Override
public boolean onPreferenceTreeClick(Preference preference) {
if (preference.getIntent() == null) {
return super.onPreferenceTreeClick(preference);
}
startActivity(preference.getIntent());
finish();
return true;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override

View File

@@ -42,7 +42,7 @@ import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowActivity; import org.robolectric.shadows.ShadowActivity;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O,
shadows = { shadows = {
WallpaperSuggestionActivityTest.ShadowWallpaperManagerWrapper.class WallpaperSuggestionActivityTest.ShadowWallpaperManagerWrapper.class
}) })
@@ -67,6 +67,8 @@ public class WallpaperSuggestionActivityTest {
final Intent intent = activity.getNextStartedActivity(); final Intent intent = activity.getNextStartedActivity();
assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName()); assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
assertThat(intent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
assertThat(activity.isFinishing()).isTrue();
} }
@Test @Test

View File

@@ -0,0 +1,67 @@
package com.android.settings.wallpaper;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.robolectric.RuntimeEnvironment.application;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.preference.Preference;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O)
public class WallpaperTypeSettingsTest {
private Preference mPreference;
private Intent mIntent;
@Before
public void setUp() {
mIntent = new Intent();
mPreference = new Preference(application);
}
@Test
public void testOnPreferenceTreeClick_intentNull_shouldDoNothing() {
Activity activity = Robolectric.setupActivity(Activity.class);
WallpaperTypeSettings fragment = spy(new WallpaperTypeSettings());
doReturn(activity).when(fragment).getActivity();
boolean handled = fragment.onPreferenceTreeClick(mPreference);
assertThat(handled).isFalse();
}
@Test
public void testOnPreferenceTreeClick_shouldLaunchIntentAndFinish() {
Activity activity = Robolectric.setupActivity(Activity.class);
WallpaperTypeSettings fragment = spy(new WallpaperTypeSettings());
doReturn(activity).when(fragment).getActivity();
mPreference.setIntent(mIntent);
doNothing().when(fragment).finish();
ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
doNothing().when(fragment).startActivity(intent.capture());
boolean handled = fragment.onPreferenceTreeClick(mPreference);
assertThat(handled).isTrue();
verify(fragment, times(1)).finish();
assertThat(intent.getValue()).isSameAs(mIntent);
}
}