133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
26fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard
36fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richardimport android.app.PendingIntent;
41c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackersederimport android.app.PendingIntent.CanceledException;
56fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richardimport android.content.Context;
66fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richardimport android.content.Intent;
7270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwinimport android.content.IntentSender;
8270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwinimport android.content.TestIntentSender;
96fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xuimport android.os.Parcel;
106fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
11345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
1222c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
146fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard
1559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/**
1659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow of {@code PendingIntent} that creates and sends {@code Intent}s appropriately.
1759d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */
186fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard@Implements(PendingIntent.class)
19afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowPendingIntent {
206fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard    private Intent savedIntent;
21c3a77ee8b44242fa9c9d1bda2bbf09a6a6291ce7Michael Portuesi    private Context savedContext;
221c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    private boolean isActivityIntent;
231c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    private boolean isBroadcastIntent;
246fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard    private boolean isServiceIntent;
25c0a2238031376a03d5ea16bdeb56642d540833c4Glenn Jahnke & Phil Goodwin    private int requestCode;
266fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard
276fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard    @Implementation
28586fa30bd1ac8214f23b5e217710682d049e84beChristian Williams & Ryan Richard    public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags) {
291c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        return create(context, intent, true, false, false, requestCode);
30586fa30bd1ac8214f23b5e217710682d049e84beChristian Williams & Ryan Richard    }
31586fa30bd1ac8214f23b5e217710682d049e84beChristian Williams & Ryan Richard
32586fa30bd1ac8214f23b5e217710682d049e84beChristian Williams & Ryan Richard    @Implementation
33aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags) {
341c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        return create(context, intent, false, true, false, requestCode);
35aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    }
36aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh
37aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    @Implementation
386fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard    public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags) {
391c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        return create(context, intent, false, false, true, requestCode);
40c3a77ee8b44242fa9c9d1bda2bbf09a6a6291ce7Michael Portuesi    }
41aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh
42c3a77ee8b44242fa9c9d1bda2bbf09a6a6291ce7Michael Portuesi    @Implementation
431c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    public void send() throws CanceledException {
441c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        send(savedContext, 0, savedIntent);
45586fa30bd1ac8214f23b5e217710682d049e84beChristian Williams & Ryan Richard    }
46586fa30bd1ac8214f23b5e217710682d049e84beChristian Williams & Ryan Richard
476fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard    @Implementation
481c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    public void send(Context context, int code, Intent intent) throws CanceledException {
491c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        savedIntent.fillIn(intent, 0 );
501c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        if (isActivityIntent) {
516fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu            context.startActivity(savedIntent);
521c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        } else if (isBroadcastIntent) {
531c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder            context.sendBroadcast(savedIntent);
541c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        } else if (isServiceIntent) {
556fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard            context.startService(savedIntent);
566fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard        }
576fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard    }
5859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin
59270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin    @Implementation
60270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin    public IntentSender getIntentSender() {
61270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin        TestIntentSender testIntentSender = new TestIntentSender();
62270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin        testIntentSender.intent = savedIntent;
63270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin        return testIntentSender;
64270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin    }
65270250ac4b8bdaa50c8a44998229eb260f5c075cGlenn Jahnke & Phil Goodwin
666fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Implementation
676fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    public static void writePendingIntentOrNullToParcel(PendingIntent sender, Parcel out) {
682a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (sender == null) {
692a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            out.writeInt(0);
702a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            return;
712a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
722a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        sender.writeToParcel(out, 0);
736fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
746fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
756fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Implementation
766fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    public static PendingIntent readPendingIntentOrNullFromParcel(Parcel in) {
772a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (in.readInt() == 0) {
782a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            return null;
792a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
802a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        boolean isActivity = readBooleanFromParcel(in);
812a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        boolean isBroadcast = readBooleanFromParcel(in);
822a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        boolean isService = readBooleanFromParcel(in);
832a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        int requestCode = in.readInt();
842a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        Intent intent = null;
852a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (in.readInt() != 0) {
862a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            intent = new Intent();
872a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            intent.readFromParcel(in);
882a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
892a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        return create(null, intent, isActivity, isBroadcast, isService, requestCode);
906fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
916fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
926fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Implementation
936fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    public void writeToParcel(Parcel out, int flags) {
946fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu        out.writeInt(1);
952a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        writeBooleanToParcel(isActivityIntent, out);
962a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        writeBooleanToParcel(isBroadcastIntent, out);
972a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        writeBooleanToParcel(isServiceIntent, out);
982a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        out.writeInt(requestCode);
992a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (savedIntent != null) {
1002a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            out.writeInt(1);
1012a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            savedIntent.writeToParcel(out, flags);
1022a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        } else {
1032a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            out.writeInt(0);
1042a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
1056fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
1066fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1076fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Override
1086fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Implementation
1096fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    public int hashCode() {
1102a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        final int prime = 31;
1112a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        int result = 1;
1122a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        result = prime * result + (isActivityIntent ? 1231 : 1237);
1132a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        result = prime * result + (isBroadcastIntent ? 1231 : 1237);
1142a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        result = prime * result + (isServiceIntent ? 1231 : 1237);
1152a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        result = prime * result + requestCode;
1162a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        result = prime * result + ((savedIntent == null) ? 0 : savedIntent.hashCode());
1172a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        return result;
1186fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
1196fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1206fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Override
1216fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    @Implementation
1226fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    public boolean equals(Object obj) {
1232a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (obj == null) {
1242a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            return false;
1252a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
1262a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (obj instanceof PendingIntent) {
1272a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            return shadowEquals(Robolectric.shadowOf((PendingIntent) obj));
1282a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
1296fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu        return false;
130f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu    }
1316fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1326fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    private boolean shadowEquals(ShadowPendingIntent other) {
1332a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (isActivityIntent != other.isActivityIntent) {
1342a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            return false;
1352a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
1362a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        if (isBroadcastIntent != other.isBroadcastIntent) {
1372a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen            return false;
1382a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        }
139f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        if (isServiceIntent != other.isServiceIntent) {
140f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu            return false;
1416fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu        }
142f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        if (requestCode != other.requestCode) {
143f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu            return false;
144f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        }
145f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        if (savedIntent == null) {
146f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu            if (other.savedIntent != null) {
147f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu            return false;
148f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu            }
149f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        } else if (!savedIntent.equals(other.savedIntent)) {
150f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu            return false;
151f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        }
152f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        return true;
1536fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
1546fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1551c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    public boolean isActivityIntent() {
1561c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        return isActivityIntent;
1571c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    }
1586fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1591c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    public boolean isBroadcastIntent() {
1601c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        return isBroadcastIntent;
1611c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    }
1626fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
163aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    public boolean isServiceIntent() {
164aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh        return isServiceIntent;
165aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    }
166aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh
167aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    public Context getSavedContext() {
168aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh        return savedContext;
169aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    }
170aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh
171aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    public Intent getSavedIntent() {
172aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh        return savedIntent;
173aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh    }
174aece4c2cce3461515d053a46549c27c38b6ddc82David Farber, Joe Moore & Lowell Kirsh
175c0a2238031376a03d5ea16bdeb56642d540833c4Glenn Jahnke & Phil Goodwin    public int getRequestCode() {
176c0a2238031376a03d5ea16bdeb56642d540833c4Glenn Jahnke & Phil Goodwin        return requestCode;
177c0a2238031376a03d5ea16bdeb56642d540833c4Glenn Jahnke & Phil Goodwin    }
178c0a2238031376a03d5ea16bdeb56642d540833c4Glenn Jahnke & Phil Goodwin
1791c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder    private static PendingIntent create(Context context, Intent intent, boolean isActivity, boolean isBroadcast, boolean isService, int requestCode) {
18059d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin        PendingIntent pendingIntent = Robolectric.newInstanceOf(PendingIntent.class);
1812a6e5df32946f94d05e679c77fa4feec129ac11bJon Boekenoogen        ShadowPendingIntent shadowPendingIntent = Robolectric.shadowOf(pendingIntent);
18259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin        shadowPendingIntent.savedIntent = intent;
1831c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        shadowPendingIntent.isActivityIntent = isActivity;
1841c798e029f4dbce77554b8ec9e5ea03a746374acChristian Rackerseder        shadowPendingIntent.isBroadcastIntent = isBroadcast;
18559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin        shadowPendingIntent.isServiceIntent = isService;
186c3a77ee8b44242fa9c9d1bda2bbf09a6a6291ce7Michael Portuesi        shadowPendingIntent.savedContext = context;
187c0a2238031376a03d5ea16bdeb56642d540833c4Glenn Jahnke & Phil Goodwin        shadowPendingIntent.requestCode = requestCode;
18859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin        return pendingIntent;
18959d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin    }
1906fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1916fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    private static void writeBooleanToParcel(boolean b, Parcel out) {
192f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        out.writeInt(b ? 1 : 0);
1936fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
1946fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu
1956fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    private static boolean readBooleanFromParcel(Parcel in) {
196f139aa4fee979823b0a806347f64a08a6a2477bbZhihong Xu        return in.readInt() != 0;
1976fb5d4828313a611b33b9bdd0cc6152d51b67347Zhihong Xu    }
1986fb1776c3dd0820074e31a750d991ce69a0597d2Christian Williams & Ryan Richard}
199