X Tutup
Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,27 @@
*/
package org.androidannotations.handler;

import static com.sun.codemodel.JExpr.assign;
import static com.sun.codemodel.JExpr.cast;
import static com.sun.codemodel.JExpr.ref;

import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;

import org.androidannotations.annotations.SystemService;
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.holder.EComponentHolder;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JConditional;
import com.sun.codemodel.JFieldRef;
import com.sun.codemodel.JInvocation;
import com.sun.codemodel.JStatement;

public class SystemServiceHandler extends BaseAnnotationHandler<EComponentHolder> {

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

JBlock methodBody = holder.getInitBody();

methodBody.assign(ref(fieldName), cast(refClass(fieldTypeQualifiedName), holder.getContextRef().invoke("getSystemService").arg(serviceRef)));
if (CanonicalNameConstants.APP_WIDGET_MANAGER.equals(fieldTypeQualifiedName)) {
createSpecialInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody, 21, "LOLLIPOP", holder.classes().APP_WIDGET_MANAGER, "getInstance", true);
} else {
methodBody.add(createNormalInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody));
}
}

@SuppressWarnings("checkstyle:parameternumber")
private void createSpecialInjection(EComponentHolder holder, String fieldName, String fieldTypeQualifiedName, JFieldRef serviceRef, JBlock methodBody, int apiLevel, String apiLevelName, JClass serviceClass, String injectionMethodName, boolean contextNeeded) {
if (androidManifest.getMinSdkVersion() >= apiLevel) {
methodBody.add(createNormalInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody));
} else {
JInvocation injectionMethodInvokation = serviceClass.staticInvoke(injectionMethodName);
if (contextNeeded) {
injectionMethodInvokation.arg(holder.getContextRef());
}
JStatement oldInjection = (JStatement) assign(ref(fieldName), injectionMethodInvokation);

if (isApiOnClasspath(apiLevelName)) {
JConditional conditional = methodBody._if(holder.classes().BUILD_VERSION.staticRef("SDK_INT").gte(holder.classes().BUILD_VERSION_CODES.staticRef(apiLevelName)));
conditional._then().add(createNormalInjection(holder, fieldName, fieldTypeQualifiedName, serviceRef, methodBody));
conditional._else().add(oldInjection);
} else {
methodBody.add(oldInjection);
}
}
}

private JStatement createNormalInjection(EComponentHolder holder, String fieldName, String fieldTypeQualifiedName, JFieldRef serviceRef, JBlock methodBody) {
return (JStatement) assign(ref(fieldName), cast(refClass(fieldTypeQualifiedName), holder.getContextRef().invoke("getSystemService").arg(serviceRef)));
}

private boolean isApiOnClasspath(String apiName) {
TypeElement typeElement = processingEnvironment().getElementUtils().getTypeElement(CanonicalNameConstants.BUILD_VERSION_CODES);
for (Element element : typeElement.getEnclosedElements()) {
if (element.getSimpleName().contentEquals(apiName)) {
return true;
}
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ public final class CanonicalNameConstants {
public static final String PREFERENCE = "android.preference.Preference";
public static final String PREFERENCE_CHANGE_LISTENER = "android.preference.Preference.OnPreferenceChangeListener";
public static final String PREFERENCE_CLICK_LISTENER = "android.preference.Preference.OnPreferenceClickListener";
public static final String APP_WIDGET_MANAGER = "android.appwidget.AppWidgetManager";

/*
* Android permission
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ public class Classes {
public final JClass BUILD_VERSION = refClass(CanonicalNameConstants.BUILD_VERSION);
public final JClass BUILD_VERSION_CODES = refClass(CanonicalNameConstants.BUILD_VERSION_CODES);
public final JClass ACTIVITY_COMPAT = refClass(CanonicalNameConstants.ACTIVITY_COMPAT);
public final JClass APP_WIDGET_MANAGER = refClass(CanonicalNameConstants.APP_WIDGET_MANAGER);

public final JClass PREFERENCE = refClass(CanonicalNameConstants.PREFERENCE);
public final JClass PREFERENCE_CHANGE_LISTENER = refClass(CanonicalNameConstants.PREFERENCE_CHANGE_LISTENER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import android.app.UiModeManager;
import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
import android.appwidget.AppWidgetManager;
import android.hardware.SensorManager;
import android.hardware.usb.UsbManager;
import android.location.LocationManager;
Expand All @@ -55,76 +56,76 @@
public class ActivityWithServices extends Activity {

// in alphabetical order

@SystemService
AccessibilityManager accessibilityManager;

@SystemService
AccountManager accountManager;

@SystemService
ActivityManager activityManager;

@SystemService
AlarmManager alarmManager;

// TODO API 19
// @SystemService
// AppOpsManager appOpsManager;
// @SystemService
// AppWidgetManager appWidgetManager; // hidden API

@SystemService
AppWidgetManager appWidgetManager;

@SystemService
AudioManager audioManager;

// @SystemService
// IBackupManager backupManager; // hidden API

// TODO API 21
// @SystemService
// BatteryManager natteryManager;

// TODO API 18
// @SystemService
// BluetoothManager bluetoothManager;

// @SystemService
// CameraManager cameraManager; // hidden API

// TODO API 19
// @SystemService
// CaptioningManager captioningManager;

@SystemService
android.content.ClipboardManager contentClipboardManager;

@SystemService
android.text.ClipboardManager textClipboardManager;

@SystemService
ConnectivityManager connectivityManager;

// TODO API 19
// @SystemService
// ConsumerIrManager consumerIrManager;

// @SystemService
// CountryDetector countryDetector; // hidden API

@SystemService
DevicePolicyManager devicePolicyManager;

// TODO API 17
// @SystemService
// DisplayManager displayManager;

@SystemService
DownloadManager downloadManager;

@SystemService
DropBoxManager dropBoxManager;

// @SystemService
// EthernetManager ethernetManager; // hidden API

Expand All @@ -137,34 +138,34 @@ public class ActivityWithServices extends Activity {
// TODO no support yet in Robolectric
// @SystemService
// InputManager inputManager;

@SystemService
InputMethodManager inputMethodManager;

// TODO API 21
// @SystemService
// JobScheduler jobScheduler;

@SystemService
KeyguardManager keyguardManager;

// TODO API 21
// @SystemService
// LauncherApps launcherApps;

@SystemService
LayoutInflater layoutInflater;

@SystemService
LocationManager locationManager;

// TODO API 21
// @SystemService
// MediaProjectionManager mediaProjectionManager;

@SystemService
MediaRouter mediaRouter;

// TODO API 21
// @SystemService
// MediaSessionManager mediaSessionManager;
Expand All @@ -174,16 +175,16 @@ public class ActivityWithServices extends Activity {

// @SystemService
// NetworkManagementService networkManagementService; // hidden API

// @SystemService
// NetworkPolicyManager networkPolicyManager; // hidden API

// @SystemService
// NetworkStatsService networkStatsService; // hidden API

@SystemService
NfcManager nfcManager;

@SystemService
NotificationManager notificationManager;

Expand All @@ -196,32 +197,32 @@ public class ActivityWithServices extends Activity {
// TODO API 19
// @SystemService
// PrintManager printManager;

@SystemService
PowerManager powerManager;

// TODO API 21
// @SystemService
// RestrictionsManager restrictionsManager;

@SystemService
SearchManager searchManager;

@SystemService
SensorManager sensorManager;

// @SystemService
// SerialManager serialManager; // hidden API

// @SystemService
// SipManager sipManager; // hidden API

// @SystemService
// StatusBarManager statusBarManager; // hidden API

@SystemService
StorageManager storageManager;

// TODO API 22
// @SystemService
// SubscriptionManager subscriptionManager;
Expand All @@ -232,40 +233,40 @@ public class ActivityWithServices extends Activity {

@SystemService
TelephonyManager telephonyManager;

@SystemService
TextServicesManager textServicesManager;

// @SystemService
// ThrottleManager throttleManager; // hidden API

// TODO API 21
// @SystemService
// TvInputManager tvInputManager;

@SystemService
UiModeManager uiModeManager;

// @SystemService
// IUpdateLock updateLock; // hidden API

// TODO API 21
// @SystemService
// UsageStatsManager usageStatsManager;

@SystemService
UsbManager usbManager;

// TODO API 19
// @SystemService
// UserManager userManager;

@SystemService
Vibrator vibrator;

@SystemService
WallpaperManager wallpaperManager;

@SystemService
WifiManager wifiManager;

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

@SystemService
WifiP2pManager wifiP2pManager;

@SystemService
WindowManager windowManager;

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void servicesAreInjected() {
assertThat(activity.activityManager).isNotNull();
assertThat(activity.alarmManager).isNotNull();
// assertThat(activity.appOpsManager).isNotNull(); // TODO API 19
// assertThat(activity.appWidgetManager).isNotNull(); // hidden API
assertThat(activity.appWidgetManager).isNotNull();
assertThat(activity.audioManager).isNotNull();
// assertThat(activity.backupManager).isNotNull(); // hidden API
// assertThat(activity.batteryManager).isNotNull(); // TODO API 21
Expand Down
X Tutup