package org.robolectric.shadows;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.TextView;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.R;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.TestRunners;
import java.util.List;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.robolectric.Shadows.shadowOf;
@RunWith(TestRunners.MultiApiSelfTest.class)
public class ShadowAppWidgetManagerTest {
private AppWidgetManager appWidgetManager;
private ShadowAppWidgetManager shadowAppWidgetManager;
@Before
public void setUp() throws Exception {
appWidgetManager = AppWidgetManager.getInstance(RuntimeEnvironment.application);
shadowAppWidgetManager = shadowOf(appWidgetManager);
}
@Test
public void getInstance_shouldReturnSameInstance() throws Exception {
assertNotNull(appWidgetManager);
assertSame(AppWidgetManager.getInstance(RuntimeEnvironment.application), appWidgetManager);
assertSame(AppWidgetManager.getInstance(new ContextWrapper(RuntimeEnvironment.application)), appWidgetManager);
}
@Test
public void createWidget_shouldInflateViewAndAssignId() throws Exception {
int widgetId = shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main);
View widgetView = shadowAppWidgetManager.getViewFor(widgetId);
assertEquals("Hola", ((TextView) widgetView.findViewById(R.id.subtitle)).getText());
}
@Test
public void getViewFor_shouldReturnSameViewEveryTimeForGivenWidgetId() throws Exception {
int widgetId = shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main);
View widgetView = shadowAppWidgetManager.getViewFor(widgetId);
assertNotNull(widgetView);
assertSame(widgetView, shadowAppWidgetManager.getViewFor(widgetId));
}
@Test
public void createWidget_shouldAllowForMultipleInstancesOfWidgets() throws Exception {
int widgetId = shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main);
View widgetView = shadowAppWidgetManager.getViewFor(widgetId);
assertNotSame(widgetId,
shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main));
assertNotSame(widgetView,
shadowAppWidgetManager.getViewFor(shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main)));
}
@Test
public void shouldReplaceLayoutIfAndOnlyIfLayoutIdIsDifferent() throws Exception {
int widgetId = shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main);
View originalWidgetView = shadowAppWidgetManager.getViewFor(widgetId);
assertContains("Main Layout", originalWidgetView);
appWidgetManager.updateAppWidget(widgetId, new RemoteViews(RuntimeEnvironment.application.getPackageName(), R.layout.main));
assertSame(originalWidgetView, shadowAppWidgetManager.getViewFor(widgetId));
appWidgetManager.updateAppWidget(widgetId, new RemoteViews(RuntimeEnvironment.application.getPackageName(), R.layout.media));
assertNotSame(originalWidgetView, shadowAppWidgetManager.getViewFor(widgetId));
View mediaWidgetView = shadowAppWidgetManager.getViewFor(widgetId);
assertContains("Media Layout", mediaWidgetView);
}
@Test
public void getAppWidgetIds() {
int expectedWidgetId = shadowAppWidgetManager.createWidget(SpanishTestAppWidgetProvider.class, R.layout.main);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
new ComponentName(
SpanishTestAppWidgetProvider.class.getPackage().getName(),
SpanishTestAppWidgetProvider.class.getName()));
assertEquals(1, appWidgetIds.length);
assertEquals(expectedWidgetId, appWidgetIds[0]);
}
@Test
public void getAppWidgetInfo_shouldReturnSpecifiedAppWidgetInfo() throws Exception {
AppWidgetProviderInfo expectedWidgetInfo = new AppWidgetProviderInfo();
shadowAppWidgetManager.addBoundWidget(26, expectedWidgetInfo);
assertEquals(expectedWidgetInfo, appWidgetManager.getAppWidgetInfo(26));
assertEquals(null, appWidgetManager.getAppWidgetInfo(27));
}
@Test
public void bindAppWidgetIdIfAllowed_shouldReturnThePresetBoolean() throws Exception {
shadowAppWidgetManager.setAllowedToBindAppWidgets(false);
assertEquals(shadowAppWidgetManager.bindAppWidgetIdIfAllowed(12345, new ComponentName("", "")), false);
shadowAppWidgetManager.setAllowedToBindAppWidgets(true);
assertEquals(shadowAppWidgetManager.bindAppWidgetIdIfAllowed(12345, new ComponentName("", "")), true);
}
@Test
public void bindAppWidgetIdIfAllowed_shouldRecordTheBinding() throws Exception {
ComponentName provider = new ComponentName("A", "B");
appWidgetManager.bindAppWidgetIdIfAllowed(789, provider);
assertArrayEquals(new int[]{789}, appWidgetManager.getAppWidgetIds(provider));
}
@Test
public void bindAppWidgetId_shouldRecordAppWidgetInfo() throws Exception {
ComponentName provider = new ComponentName("abc", "123");
AppWidgetProviderInfo providerInfo = new AppWidgetProviderInfo();
providerInfo.provider = provider;
shadowAppWidgetManager.addInstalledProvider(providerInfo);
appWidgetManager.bindAppWidgetIdIfAllowed(90210, provider);
assertSame(providerInfo, appWidgetManager.getAppWidgetInfo(90210));
}
@Test(expected = IllegalArgumentException.class)
public void bindAppWidgetIdIfAllowed_shouldThrowIllegalArgumentExceptionWhenPrompted() throws Exception {
shadowAppWidgetManager.setValidWidgetProviderComponentName(false);
shadowAppWidgetManager.bindAppWidgetIdIfAllowed(12345, new ComponentName("", ""));
}
@Test
public void getInstalledProviders_returnsWidgetList() throws Exception {
AppWidgetProviderInfo info1 = new AppWidgetProviderInfo();
info1.label = "abc";
AppWidgetProviderInfo info2 = new AppWidgetProviderInfo();
info2.label = "def";
shadowAppWidgetManager.addInstalledProvider(info1);
shadowAppWidgetManager.addInstalledProvider(info2);
List<AppWidgetProviderInfo> installedProviders = appWidgetManager.getInstalledProviders();
assertEquals(2, installedProviders.size());
assertEquals(info1, installedProviders.get(0));
assertEquals(info2, installedProviders.get(1));
}
private void assertContains(String expectedText, View view) {
String actualText = shadowOf(view).innerText();
assertTrue("Expected <" + actualText + "> to contain <" + expectedText + ">", actualText.contains(expectedText));
}
public static class SpanishTestAppWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
remoteViews.setTextViewText(R.id.subtitle, "Hola");
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}
}
}