/
ShadowRemoteViews.java
127 lines (110 loc) · 3.77 KB
/
ShadowRemoteViews.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package com.xtremelabs.robolectric.shadows;
import android.app.PendingIntent;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ImageView;
import android.widget.RemoteViews;
import android.widget.TextView;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.res.ResourceLoader;
import java.util.ArrayList;
import java.util.List;
/**
* Shadow for {@code RemoteViews} that simulates its implementation. Supports pending intents for events, changing
* visibility, setting text, updating etc...
*/
@SuppressWarnings({"UnusedDeclaration"})
@Implements(RemoteViews.class)
public class ShadowRemoteViews {
private String packageName;
private int layoutId;
private List<ViewUpdater> viewUpdaters = new ArrayList<ViewUpdater>();
public void __constructor__(String packageName, int layoutId) {
this.packageName = packageName;
this.layoutId = layoutId;
}
@Implementation
public String getPackage() {
return packageName;
}
@Implementation
public int getLayoutId() {
return layoutId;
}
@Implementation
public void setTextViewText(int viewId, final CharSequence text) {
viewUpdaters.add(new ViewUpdater(viewId) {
@Override
public void doUpdate(View view) {
((TextView) view).setText(text);
}
});
}
@Implementation
public void setOnClickPendingIntent(int viewId, final PendingIntent pendingIntent) {
viewUpdaters.add(new ViewUpdater(viewId) {
@Override void doUpdate(final View view) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
pendingIntent.send(view.getContext(), 0, null);
} catch (PendingIntent.CanceledException e) {
throw new RuntimeException(e);
}
}
});
}
});
}
@Implementation
public void setViewVisibility(int viewId, final int visibility) {
viewUpdaters.add(new ViewUpdater(viewId) {
@Override
public void doUpdate(View view) {
view.setVisibility(visibility);
}
});
}
@Implementation
public void setImageViewResource(int viewId, final int resourceId) {
viewUpdaters.add(new ViewUpdater(viewId) {
@Override
public void doUpdate(View view) {
((ImageView) view).setImageResource(resourceId);
}
});
}
@Implementation
public void setImageViewBitmap(int viewId, final Bitmap bitmap) {
viewUpdaters.add(new ViewUpdater(viewId) {
@Override
public void doUpdate(View view) {
((ImageView) view).setImageBitmap(bitmap);
}
});
}
@Implementation
public void reapply(Context context, View v) {
for (ViewUpdater viewUpdater : viewUpdaters) {
viewUpdater.update(v);
}
}
private abstract class ViewUpdater {
private int viewId;
public ViewUpdater(int viewId) {
this.viewId = viewId;
}
final void update(View parent) {
View view = parent.findViewById(viewId);
if (view == null) {
throw new NullPointerException("couldn't find view " + viewId
+ " (" + ResourceLoader.getFrom(parent.getContext()).getNameForId(viewId) + ")");
}
doUpdate(view);
}
abstract void doUpdate(View view);
}
}