• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.shadows;
2 
3 import android.os.Binder;
4 import android.os.Parcel;
5 import android.os.RemoteException;
6 import org.robolectric.annotation.Implementation;
7 import org.robolectric.annotation.Implements;
8 import org.robolectric.annotation.RealObject;
9 import org.robolectric.annotation.Resetter;
10 
11 @Implements(Binder.class)
12 public class ShadowBinder {
13   @RealObject
14   Binder realObject;
15 
16   private static Integer callingUid;
17   private static Integer callingPid;
18 
19   @Implementation
transact(int code, Parcel data, Parcel reply, int flags)20   protected boolean transact(int code, Parcel data, Parcel reply, int flags)
21       throws RemoteException {
22    if (data != null) {
23      data.setDataPosition(0);
24    }
25 
26    boolean result;
27    try {
28      result = new ShadowBinderBridge(realObject).onTransact(code, data, reply, flags);
29    } catch (Exception e) {
30      result = true;
31      if (reply != null) {
32        reply.writeException(e);
33      }
34    }
35 
36    if (reply != null) {
37      reply.setDataPosition(0);
38    }
39    return result;
40   }
41 
42   @Implementation
getCallingPid()43   protected static final int getCallingPid() {
44     if (callingPid != null) {
45       return callingPid;
46     }
47     return android.os.Process.myPid();
48   }
49 
50   @Implementation
getCallingUid()51   protected static final int getCallingUid() {
52     if (callingUid != null) {
53       return callingUid;
54     }
55     return android.os.Process.myUid();
56   }
57 
setCallingPid(int pid)58   public static void setCallingPid(int pid) {
59     ShadowBinder.callingPid = pid;
60   }
61 
setCallingUid(int uid)62   public static void setCallingUid(int uid) {
63     ShadowBinder.callingUid = uid;
64   }
65 
66   @Resetter
reset()67   public static void reset() {
68     ShadowBinder.callingPid = null;
69     ShadowBinder.callingUid = null;
70   }
71 }
72