133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 290651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 36fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richardimport android.app.PendingIntent; 490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport android.content.Context; 508df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richardimport android.graphics.Bitmap; 690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport android.view.View; 708df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richardimport android.widget.ImageView; 890651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport android.widget.RemoteViews; 990651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport android.widget.TextView; 1022c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 1122c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 1270650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwinimport com.xtremelabs.robolectric.res.ResourceLoader; 1390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 1490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport java.util.ArrayList; 1590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport java.util.List; 1690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 1759d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/** 1859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow for {@code RemoteViews} that simulates its implementation. Supports pending intents for events, changing 1959d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * visibility, setting text, updating etc... 2059d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */ 2190651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard@SuppressWarnings({"UnusedDeclaration"}) 2290651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard@Implements(RemoteViews.class) 23afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowRemoteViews { 2419703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams private String packageName; 2519703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams private int layoutId; 2690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard private List<ViewUpdater> viewUpdaters = new ArrayList<ViewUpdater>(); 2790651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 2819703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams public void __constructor__(String packageName, int layoutId) { 2919703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams this.packageName = packageName; 3019703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams this.layoutId = layoutId; 3119703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams } 3219703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams 3319703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams @Implementation 3419703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams public String getPackage() { 3519703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams return packageName; 3619703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams } 3719703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams 3819703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams @Implementation 3919703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams public int getLayoutId() { 4019703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams return layoutId; 4119703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams } 4219703163acfe16b7bcdfd6a7345a2e0b7406ada6Christian Williams 4390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard @Implementation 4490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard public void setTextViewText(int viewId, final CharSequence text) { 4590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard viewUpdaters.add(new ViewUpdater(viewId) { 46c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong @Override 47c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong public void doUpdate(View view) { 4890651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard ((TextView) view).setText(text); 4990651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard } 5090651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard }); 5190651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard } 5290651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 5390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard @Implementation 546fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard public void setOnClickPendingIntent(int viewId, final PendingIntent pendingIntent) { 556fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard viewUpdaters.add(new ViewUpdater(viewId) { 56adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams @Override void doUpdate(final View view) { 576fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard view.setOnClickListener(new View.OnClickListener() { 58c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong @Override 59c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong public void onClick(View v) { 606fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard try { 616fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard pendingIntent.send(view.getContext(), 0, null); 626fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard } catch (PendingIntent.CanceledException e) { 636fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard throw new RuntimeException(e); 646fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard } 656fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard } 666fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard }); 676fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard } 686fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard }); 696fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard } 706fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard 716fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard @Implementation 7208df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard public void setViewVisibility(int viewId, final int visibility) { 7308df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard viewUpdaters.add(new ViewUpdater(viewId) { 74c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong @Override 75c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong public void doUpdate(View view) { 7608df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard view.setVisibility(visibility); 7708df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard } 7808df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard }); 7990651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard } 8090651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 81459c3a5d411cad24ba7a6b35196cd8663e77bc9eChee Wong & Ryan Richard @Implementation 82c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong public void setImageViewResource(int viewId, final int resourceId) { 83c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong viewUpdaters.add(new ViewUpdater(viewId) { 84c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong @Override 85c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong public void doUpdate(View view) { 86c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong ((ImageView) view).setImageResource(resourceId); 87c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong } 88c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong }); 89c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong } 90c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong 91c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong @Implementation 9208df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard public void setImageViewBitmap(int viewId, final Bitmap bitmap) { 93459c3a5d411cad24ba7a6b35196cd8663e77bc9eChee Wong & Ryan Richard viewUpdaters.add(new ViewUpdater(viewId) { 94c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong @Override 95c3a8d5432e2edbee4d57d6b5c838ca6f794fbcdfChee Wong public void doUpdate(View view) { 9608df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard ((ImageView) view).setImageBitmap(bitmap); 97459c3a5d411cad24ba7a6b35196cd8663e77bc9eChee Wong & Ryan Richard } 98459c3a5d411cad24ba7a6b35196cd8663e77bc9eChee Wong & Ryan Richard }); 99459c3a5d411cad24ba7a6b35196cd8663e77bc9eChee Wong & Ryan Richard } 100459c3a5d411cad24ba7a6b35196cd8663e77bc9eChee Wong & Ryan Richard 10108df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard @Implementation 10208df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard public void reapply(Context context, View v) { 10308df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard for (ViewUpdater viewUpdater : viewUpdaters) { 10408df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard viewUpdater.update(v); 10508df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard } 10608df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard } 10708df5995780aa574e2d6c2fb9a52fde7c82f4265Joe Moore & Ryan Richard 10890651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard private abstract class ViewUpdater { 10990651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard private int viewId; 11090651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 11190651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard public ViewUpdater(int viewId) { 11290651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard this.viewId = viewId; 11390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard } 11490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 11590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard final void update(View parent) { 11670650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin 11770650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin View view = parent.findViewById(viewId); 11870650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin if (view == null) { 11970650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin throw new NullPointerException("couldn't find view " + viewId 12070650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin + " (" + ResourceLoader.getFrom(parent.getContext()).getNameForId(viewId) + ")"); 12170650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin } 12270650f03fb9161ce77255654517d34b67232588eChristian Williams & Phil Goodwin doUpdate(view); 12390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard } 12490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard 12590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard abstract void doUpdate(View view); 12690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard } 12790651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard} 128