diff options
14 files changed, 87 insertions, 1 deletions
diff --git a/core/java/android/annotation/RequiresFeature.java b/core/java/android/annotation/RequiresFeature.java new file mode 100644 index 000000000000..fc93f03d76cf --- /dev/null +++ b/core/java/android/annotation/RequiresFeature.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.annotation; + +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import android.content.pm.PackageManager; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * Denotes that the annotated element requires one or more device features. This + * is used to auto-generate documentation. + * + * @see PackageManager#hasSystemFeature(String) + * @hide + */ +@Retention(SOURCE) +@Target({TYPE,FIELD,METHOD,CONSTRUCTOR}) +public @interface RequiresFeature { + /** + * The name of the device feature that is required. + * + * @see PackageManager#hasSystemFeature(String) + */ + String value(); +} diff --git a/core/java/android/annotation/SystemService.java b/core/java/android/annotation/SystemService.java index ba5002a4f1b5..0c5d15e178a3 100644 --- a/core/java/android/annotation/SystemService.java +++ b/core/java/android/annotation/SystemService.java @@ -26,12 +26,19 @@ import java.lang.annotation.Target; /** * Description of a system service available through - * {@link Context#getSystemService(Class)}. + * {@link Context#getSystemService(Class)}. This is used to auto-generate + * documentation explaining how to obtain a reference to the service. * * @hide */ @Retention(SOURCE) @Target(TYPE) public @interface SystemService { + /** + * The string name of the system service that can be passed to + * {@link Context#getSystemService(String)}. + * + * @see Context#getSystemServiceName(Class) + */ String value(); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index b29644bcf320..14b2119b4e4b 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -21,6 +21,7 @@ import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; @@ -116,6 +117,7 @@ import java.util.concurrent.Executor; * guide. </div> */ @SystemService(Context.DEVICE_POLICY_SERVICE) +@RequiresFeature(PackageManager.FEATURE_DEVICE_ADMIN) public class DevicePolicyManager { private static String TAG = "DevicePolicyManager"; diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index a2c75a6c014c..e736f34eea11 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -19,6 +19,7 @@ package android.appwidget; import android.annotation.BroadcastBehavior; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemService; @@ -29,6 +30,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.ServiceConnection; +import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ShortcutInfo; import android.os.Bundle; @@ -55,6 +57,7 @@ import java.util.List; * </div> */ @SystemService(Context.APPWIDGET_SERVICE) +@RequiresFeature(PackageManager.FEATURE_APP_WIDGETS) public class AppWidgetManager { /** diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java index 7e3bb05fe024..11f8ab7551c2 100644 --- a/core/java/android/bluetooth/BluetoothManager.java +++ b/core/java/android/bluetooth/BluetoothManager.java @@ -17,9 +17,11 @@ package android.bluetooth; import android.Manifest; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.content.Context; +import android.content.pm.PackageManager; import android.os.RemoteException; import android.util.Log; @@ -47,6 +49,7 @@ import java.util.List; * @see BluetoothAdapter#getDefaultAdapter() */ @SystemService(Context.BLUETOOTH_SERVICE) +@RequiresFeature(PackageManager.FEATURE_BLUETOOTH) public final class BluetoothManager { private static final String TAG = "BluetoothManager"; private static final boolean DBG = true; diff --git a/core/java/android/hardware/ConsumerIrManager.java b/core/java/android/hardware/ConsumerIrManager.java index c7a33ffa1b0f..6f589cd9190b 100644 --- a/core/java/android/hardware/ConsumerIrManager.java +++ b/core/java/android/hardware/ConsumerIrManager.java @@ -16,8 +16,10 @@ package android.hardware; +import android.annotation.RequiresFeature; import android.annotation.SystemService; import android.content.Context; +import android.content.pm.PackageManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; @@ -27,6 +29,7 @@ import android.util.Log; * Class that operates consumer infrared on the device. */ @SystemService(Context.CONSUMER_IR_SERVICE) +@RequiresFeature(PackageManager.FEATURE_CONSUMER_IR) public final class ConsumerIrManager { private static final String TAG = "ConsumerIr"; diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 92d6bbb0a20f..bd54522719b2 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -23,10 +23,12 @@ import static android.Manifest.permission.USE_FINGERPRINT; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.app.ActivityManager; import android.content.Context; +import android.content.pm.PackageManager; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricFingerprintConstants; import android.os.Binder; @@ -59,6 +61,7 @@ import javax.crypto.Mac; */ @Deprecated @SystemService(Context.FINGERPRINT_SERVICE) +@RequiresFeature(PackageManager.FEATURE_FINGERPRINT) public class FingerprintManager implements BiometricFingerprintConstants { private static final String TAG = "FingerprintManager"; private static final boolean DEBUG = true; diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index a772cbe43196..e34423c05a87 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -17,11 +17,13 @@ package android.hardware.hdmi; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressLint; import android.content.Context; +import android.content.pm.PackageManager; import android.annotation.SystemApi; import android.annotation.SystemService; import android.os.RemoteException; @@ -42,6 +44,7 @@ import android.util.Log; */ @SystemApi @SystemService(Context.HDMI_CONTROL_SERVICE) +@RequiresFeature(PackageManager.FEATURE_HDMI_CEC) public final class HdmiControlManager { private static final String TAG = "HdmiControlManager"; diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index e1d7edfa7d9c..8fde82ef2012 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -21,10 +21,12 @@ import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Handler; import android.os.Parcel; import android.os.Parcelable; @@ -58,6 +60,7 @@ import java.util.stream.Collectors; */ @SystemApi @SystemService(Context.RADIO_SERVICE) +@RequiresFeature(PackageManager.FEATURE_BROADCAST_RADIO) public class RadioManager { private static final String TAG = "BroadcastRadio.manager"; diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java index 51b77980fcf4..e436bc6ea30f 100644 --- a/core/java/android/print/PrintManager.java +++ b/core/java/android/print/PrintManager.java @@ -18,6 +18,7 @@ package android.print; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; @@ -27,6 +28,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.IntentSender; import android.content.IntentSender.SendIntentException; +import android.content.pm.PackageManager; import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.CancellationSignal; @@ -104,6 +106,7 @@ import java.util.Map; * @see PrintJobInfo */ @SystemService(Context.PRINT_SERVICE) +@RequiresFeature(PackageManager.FEATURE_PRINTING) public final class PrintManager { private static final String LOG_TAG = "PrintManager"; diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 134dc1f060c6..7792fa640015 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -24,6 +24,7 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.SystemService; import android.content.ComponentName; import android.content.Context; @@ -135,6 +136,7 @@ import sun.misc.Cleaner; * <p>It is safe to call into its methods from any thread. */ @SystemService(Context.AUTOFILL_MANAGER_SERVICE) +@RequiresFeature(PackageManager.FEATURE_AUTOFILL) public final class AutofillManager { private static final String TAG = "AutofillManager"; diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 9de26a86f20f..a2280a4acd11 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -20,10 +20,12 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.annotation.TestApi; import android.content.Context; +import android.content.pm.PackageManager; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; import android.net.Uri; @@ -213,6 +215,7 @@ import java.util.concurrent.TimeUnit; * </ul> */ @SystemService(Context.INPUT_METHOD_SERVICE) +@RequiresFeature(PackageManager.FEATURE_INPUT_METHODS) public final class InputMethodManager { static final boolean DEBUG = false; static final String TAG = "InputMethodManager"; diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index d194796ec1c5..7d2ad9125f40 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -23,6 +23,7 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS; import android.Manifest; import android.annotation.NonNull; +import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; @@ -30,6 +31,7 @@ import android.annotation.SystemService; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -63,6 +65,7 @@ import java.util.List; * location will be obfuscated to a coarse level of accuracy. */ @SystemService(Context.LOCATION_SERVICE) +@RequiresFeature(PackageManager.FEATURE_LOCATION) public class LocationManager { private static final String TAG = "LocationManager"; diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java index a015732ddfdd..dee94c681e87 100644 --- a/media/java/android/media/midi/MidiManager.java +++ b/media/java/android/media/midi/MidiManager.java @@ -16,9 +16,11 @@ package android.media.midi; +import android.annotation.RequiresFeature; import android.annotation.SystemService; import android.bluetooth.BluetoothDevice; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Binder; import android.os.IBinder; import android.os.Bundle; @@ -32,6 +34,7 @@ import java.util.concurrent.ConcurrentHashMap; * This class is the public application interface to the MIDI service. */ @SystemService(Context.MIDI_SERVICE) +@RequiresFeature(PackageManager.FEATURE_MIDI) public final class MidiManager { private static final String TAG = "MidiManager"; |