Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.

Commit 2753d39

Browse files
committed
Merge pull request #1380 from WonderCsabo/1377_specialServiceInjections
Handle special case when injecting AppWidgetManager with @SystemService
2 parents f699ebf + d8557a2 commit 2753d39

5 files changed

Lines changed: 101 additions & 52 deletions

File tree

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SystemServiceHandler.java‎

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,27 @@
1515
*/
1616
package org.androidannotations.handler;
1717

18+
import static com.sun.codemodel.JExpr.assign;
1819
import static com.sun.codemodel.JExpr.cast;
1920
import static com.sun.codemodel.JExpr.ref;
2021

2122
import javax.annotation.processing.ProcessingEnvironment;
2223
import javax.lang.model.element.Element;
24+
import javax.lang.model.element.TypeElement;
2325
import javax.lang.model.type.TypeMirror;
2426

2527
import org.androidannotations.annotations.SystemService;
28+
import org.androidannotations.helper.CanonicalNameConstants;
2629
import org.androidannotations.holder.EComponentHolder;
2730
import org.androidannotations.model.AnnotationElements;
2831
import org.androidannotations.process.IsValid;
2932

3033
import com.sun.codemodel.JBlock;
34+
import com.sun.codemodel.JClass;
35+
import com.sun.codemodel.JConditional;
3136
import com.sun.codemodel.JFieldRef;
37+
import com.sun.codemodel.JInvocation;
38+
import com.sun.codemodel.JStatement;
3239

3340
public class SystemServiceHandler extends BaseAnnotationHandler<EComponentHolder> {
3441

@@ -56,6 +63,45 @@ public void process(Element element, EComponentHolder holder) {
5663

5764
JBlock methodBody = holder.getInitBody();
5865

59-
methodBody.assign(ref(fieldName), cast(refClass(fieldTypeQualifiedName), holder.getContextRef().invoke("getSystemService").arg(serviceRef)));
66+
if (CanonicalNameConstants.APP_WIDGET_MANAGER.equals(fieldTypeQualifiedName)) {
67+
createSpecialInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody, 21, "LOLLIPOP", holder.classes().APP_WIDGET_MANAGER, "getInstance", true);
68+
} else {
69+
methodBody.add(createNormalInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody));
70+
}
71+
}
72+
73+
@SuppressWarnings("checkstyle:parameternumber")
74+
private void createSpecialInjection(EComponentHolder holder, String fieldName, String fieldTypeQualifiedName, JFieldRef serviceRef, JBlock methodBody, int apiLevel, String apiLevelName, JClass serviceClass, String injectionMethodName, boolean contextNeeded) {
75+
if (androidManifest.getMinSdkVersion() >= apiLevel) {
76+
methodBody.add(createNormalInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody));
77+
} else {
78+
JInvocation injectionMethodInvokation = serviceClass.staticInvoke(injectionMethodName);
79+
if (contextNeeded) {
80+
injectionMethodInvokation.arg(holder.getContextRef());
81+
}
82+
JStatement oldInjection = (JStatement) assign(ref(fieldName), injectionMethodInvokation);
83+
84+
if (isApiOnClasspath(apiLevelName)) {
85+
JConditional conditional = methodBody._if(holder.classes().BUILD_VERSION.staticRef("SDK_INT").gte(holder.classes().BUILD_VERSION_CODES.staticRef(apiLevelName)));
86+
conditional._then().add(createNormalInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody));
87+
conditional._else().add(oldInjection);
88+
} else {
89+
methodBody.add(oldInjection);
90+
}
91+
}
92+
}
93+
94+
private JStatement createNormalInjection(EComponentHolder holder, String fieldName, String fieldTypeQualifiedName, JFieldRef serviceRef, JBlock methodBody) {
95+
return (JStatement) assign(ref(fieldName), cast(refClass(fieldTypeQualifiedName), holder.getContextRef().invoke("getSystemService").arg(serviceRef)));
96+
}
97+
98+
private boolean isApiOnClasspath(String apiName) {
99+
TypeElement typeElement = processingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.BUILD_VERSION_CODES);
100+
for (Element element : typeElement.getEnclosedElements()) {
101+
if (element.getSimpleName().contentEquals(apiName)) {
102+
return true;
103+
}
104+
}
105+
return false;
60106
}
61107
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public final class CanonicalNameConstants {
115115
public static final String PREFERENCE = "android.preference.Preference";
116116
public static final String PREFERENCE_CHANGE_LISTENER = "android.preference.Preference.OnPreferenceChangeListener";
117117
public static final String PREFERENCE_CLICK_LISTENER = "android.preference.Preference.OnPreferenceClickListener";
118+
public static final String APP_WIDGET_MANAGER = "android.appwidget.AppWidgetManager";
118119

119120
/*
120121
* Android permission

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ProcessHolder.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public class Classes {
122122
public final JClass BUILD_VERSION = refClass(CanonicalNameConstants.BUILD_VERSION);
123123
public final JClass BUILD_VERSION_CODES = refClass(CanonicalNameConstants.BUILD_VERSION_CODES);
124124
public final JClass ACTIVITY_COMPAT = refClass(CanonicalNameConstants.ACTIVITY_COMPAT);
125+
public final JClass APP_WIDGET_MANAGER = refClass(CanonicalNameConstants.APP_WIDGET_MANAGER);
125126

126127
public final JClass PREFERENCE = refClass(CanonicalNameConstants.PREFERENCE);
127128
public final JClass PREFERENCE_CHANGE_LISTENER = refClass(CanonicalNameConstants.PREFERENCE_CHANGE_LISTENER);

‎AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ActivityWithServices.java‎

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import android.app.UiModeManager;
3030
import android.app.WallpaperManager;
3131
import android.app.admin.DevicePolicyManager;
32+
import android.appwidget.AppWidgetManager;
3233
import android.hardware.SensorManager;
3334
import android.hardware.usb.UsbManager;
3435
import android.location.LocationManager;
@@ -55,76 +56,76 @@
5556
public class ActivityWithServices extends Activity {
5657

5758
// in alphabetical order
58-
59+
5960
@SystemService
6061
AccessibilityManager accessibilityManager;
61-
62+
6263
@SystemService
6364
AccountManager accountManager;
64-
65+
6566
@SystemService
6667
ActivityManager activityManager;
67-
68+
6869
@SystemService
6970
AlarmManager alarmManager;
70-
71+
7172
// TODO API 19
7273
// @SystemService
7374
// AppOpsManager appOpsManager;
74-
75-
// @SystemService
76-
// AppWidgetManager appWidgetManager; // hidden API
77-
75+
76+
@SystemService
77+
AppWidgetManager appWidgetManager;
78+
7879
@SystemService
7980
AudioManager audioManager;
80-
81+
8182
// @SystemService
8283
// IBackupManager backupManager; // hidden API
83-
84+
8485
// TODO API 21
8586
// @SystemService
8687
// BatteryManager natteryManager;
8788

8889
// TODO API 18
8990
// @SystemService
9091
// BluetoothManager bluetoothManager;
91-
92+
9293
// @SystemService
9394
// CameraManager cameraManager; // hidden API
94-
95+
9596
// TODO API 19
9697
// @SystemService
9798
// CaptioningManager captioningManager;
98-
99+
99100
@SystemService
100101
android.content.ClipboardManager contentClipboardManager;
101-
102+
102103
@SystemService
103104
android.text.ClipboardManager textClipboardManager;
104-
105+
105106
@SystemService
106107
ConnectivityManager connectivityManager;
107-
108+
108109
// TODO API 19
109110
// @SystemService
110111
// ConsumerIrManager consumerIrManager;
111-
112+
112113
// @SystemService
113114
// CountryDetector countryDetector; // hidden API
114-
115+
115116
@SystemService
116117
DevicePolicyManager devicePolicyManager;
117-
118+
118119
// TODO API 17
119120
// @SystemService
120121
// DisplayManager displayManager;
121-
122+
122123
@SystemService
123124
DownloadManager downloadManager;
124-
125+
125126
@SystemService
126127
DropBoxManager dropBoxManager;
127-
128+
128129
// @SystemService
129130
// EthernetManager ethernetManager; // hidden API
130131

@@ -137,34 +138,34 @@ public class ActivityWithServices extends Activity {
137138
// TODO no support yet in Robolectric
138139
// @SystemService
139140
// InputManager inputManager;
140-
141+
141142
@SystemService
142143
InputMethodManager inputMethodManager;
143-
144+
144145
// TODO API 21
145146
// @SystemService
146147
// JobScheduler jobScheduler;
147148

148149
@SystemService
149150
KeyguardManager keyguardManager;
150-
151+
151152
// TODO API 21
152153
// @SystemService
153154
// LauncherApps launcherApps;
154155

155156
@SystemService
156157
LayoutInflater layoutInflater;
157-
158+
158159
@SystemService
159160
LocationManager locationManager;
160-
161+
161162
// TODO API 21
162163
// @SystemService
163164
// MediaProjectionManager mediaProjectionManager;
164165

165166
@SystemService
166167
MediaRouter mediaRouter;
167-
168+
168169
// TODO API 21
169170
// @SystemService
170171
// MediaSessionManager mediaSessionManager;
@@ -174,16 +175,16 @@ public class ActivityWithServices extends Activity {
174175

175176
// @SystemService
176177
// NetworkManagementService networkManagementService; // hidden API
177-
178+
178179
// @SystemService
179180
// NetworkPolicyManager networkPolicyManager; // hidden API
180-
181+
181182
// @SystemService
182183
// NetworkStatsService networkStatsService; // hidden API
183-
184+
184185
@SystemService
185186
NfcManager nfcManager;
186-
187+
187188
@SystemService
188189
NotificationManager notificationManager;
189190

@@ -196,32 +197,32 @@ public class ActivityWithServices extends Activity {
196197
// TODO API 19
197198
// @SystemService
198199
// PrintManager printManager;
199-
200+
200201
@SystemService
201202
PowerManager powerManager;
202-
203+
203204
// TODO API 21
204205
// @SystemService
205206
// RestrictionsManager restrictionsManager;
206207

207208
@SystemService
208209
SearchManager searchManager;
209-
210+
210211
@SystemService
211212
SensorManager sensorManager;
212-
213+
213214
// @SystemService
214215
// SerialManager serialManager; // hidden API
215-
216+
216217
// @SystemService
217218
// SipManager sipManager; // hidden API
218-
219+
219220
// @SystemService
220221
// StatusBarManager statusBarManager; // hidden API
221-
222+
222223
@SystemService
223224
StorageManager storageManager;
224-
225+
225226
// TODO API 22
226227
// @SystemService
227228
// SubscriptionManager subscriptionManager;
@@ -232,40 +233,40 @@ public class ActivityWithServices extends Activity {
232233

233234
@SystemService
234235
TelephonyManager telephonyManager;
235-
236+
236237
@SystemService
237238
TextServicesManager textServicesManager;
238239

239240
// @SystemService
240241
// ThrottleManager throttleManager; // hidden API
241-
242+
242243
// TODO API 21
243244
// @SystemService
244245
// TvInputManager tvInputManager;
245246

246247
@SystemService
247248
UiModeManager uiModeManager;
248-
249+
249250
// @SystemService
250251
// IUpdateLock updateLock; // hidden API
251-
252+
252253
// TODO API 21
253254
// @SystemService
254255
// UsageStatsManager usageStatsManager;
255256

256257
@SystemService
257258
UsbManager usbManager;
258-
259+
259260
// TODO API 19
260261
// @SystemService
261262
// UserManager userManager;
262263

263264
@SystemService
264265
Vibrator vibrator;
265-
266+
266267
@SystemService
267268
WallpaperManager wallpaperManager;
268-
269+
269270
@SystemService
270271
WifiManager wifiManager;
271272

@@ -274,8 +275,8 @@ public class ActivityWithServices extends Activity {
274275

275276
@SystemService
276277
WifiP2pManager wifiP2pManager;
277-
278+
278279
@SystemService
279280
WindowManager windowManager;
280-
281+
281282
}

‎AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/ServiceInjectionTest.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public void servicesAreInjected() {
3636
assertThat(activity.activityManager).isNotNull();
3737
assertThat(activity.alarmManager).isNotNull();
3838
// assertThat(activity.appOpsManager).isNotNull(); // TODO API 19
39-
// assertThat(activity.appWidgetManager).isNotNull(); // hidden API
39+
assertThat(activity.appWidgetManager).isNotNull();
4040
assertThat(activity.audioManager).isNotNull();
4141
// assertThat(activity.backupManager).isNotNull(); // hidden API
4242
// assertThat(activity.batteryManager).isNotNull(); // TODO API 21

0 commit comments

Comments
 (0)