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