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