Loading api/current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5737,6 +5737,9 @@ package android.app.admin { ctor public DeviceAdminReceiver(); method public android.app.admin.DevicePolicyManager getManager(android.content.Context); method public android.content.ComponentName getWho(android.content.Context); method public void onBugreportFailed(android.content.Context, android.content.Intent, int); method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String); method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent); method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String); method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent); method public void onDisabled(android.content.Context, android.content.Intent); Loading @@ -5761,11 +5764,16 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; } public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation { } public class DevicePolicyManager { method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); Loading Loading @@ -5844,6 +5852,7 @@ package android.app.admin { method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean requestBugreport(android.content.ComponentName); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public boolean setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String); api/system-current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5870,6 +5870,9 @@ package android.app.admin { ctor public DeviceAdminReceiver(); method public android.app.admin.DevicePolicyManager getManager(android.content.Context); method public android.content.ComponentName getWho(android.content.Context); method public void onBugreportFailed(android.content.Context, android.content.Intent, int); method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String); method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent); method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String); method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent); method public void onDisabled(android.content.Context, android.content.Intent); Loading @@ -5894,11 +5897,16 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; } public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation { } public class DevicePolicyManager { method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); Loading Loading @@ -5986,6 +5994,7 @@ package android.app.admin { method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean requestBugreport(android.content.ComponentName); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public deprecated boolean setActiveProfileOwner(android.content.ComponentName, java.lang.String) throws java.lang.IllegalArgumentException; api/test-current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5739,6 +5739,9 @@ package android.app.admin { ctor public DeviceAdminReceiver(); method public android.app.admin.DevicePolicyManager getManager(android.content.Context); method public android.content.ComponentName getWho(android.content.Context); method public void onBugreportFailed(android.content.Context, android.content.Intent, int); method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String); method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent); method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String); method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent); method public void onDisabled(android.content.Context, android.content.Intent); Loading @@ -5763,11 +5766,16 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; } public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation { } public class DevicePolicyManager { method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); Loading Loading @@ -5846,6 +5854,7 @@ package android.app.admin { method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean requestBugreport(android.content.ComponentName); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public boolean setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String); core/java/android/app/admin/DeviceAdminReceiver.java +124 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.app.admin; import android.accounts.AccountManager; import android.annotation.IntDef; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; Loading @@ -29,6 +30,9 @@ import android.net.Uri; import android.os.Bundle; import android.security.KeyChain; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Base class for implementing a device administration component. This * class provides a convenience for interpreting the raw intent actions Loading Loading @@ -227,6 +231,75 @@ public class DeviceAdminReceiver extends BroadcastReceiver { public static final String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; /** * Action sent to a device administrator to notify that the device user * has declined sharing a bugreport. * * <p>The calling device admin must be the device owner to receive this broadcast. * @see DevicePolicyManager#requestBugreport * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BUGREPORT_SHARING_DECLINED = "android.app.action.BUGREPORT_SHARING_DECLINED"; /** * Action sent to a device administrator to notify that the collection of a bugreport * has failed. * * <p>The calling device admin must be the device owner to receive this broadcast. * @see DevicePolicyManager#requestBugreport * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BUGREPORT_FAILED = "android.app.action.BUGREPORT_FAILED"; /** * Action sent to a device administrator to share the bugreport. * * <p>The calling device admin must be the device owner to receive this broadcast. * @see DevicePolicyManager#requestBugreport * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BUGREPORT_SHARE = "android.app.action.BUGREPORT_SHARE"; /** * A string containing the SHA-256 hash of the bugreport file. * * @see #ACTION_BUGREPORT_SHARE * @hide */ public static final String EXTRA_BUGREPORT_HASH = "android.app.extra.BUGREPORT_HASH"; /** * An {@code int} failure code representing the reason of the bugreport failure. * * @see #ACTION_BUGREPORT_FAILED * @see #BUGREPORT_FAILURE_FAILED_COMPLETING, #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE * @hide */ public static final String EXTRA_BUGREPORT_FAILURE_REASON = "android.app.extra.BUGREPORT_FAILURE_REASON"; @Retention(RetentionPolicy.SOURCE) @IntDef({ BUGREPORT_FAILURE_FAILED_COMPLETING, BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE }) /** * An interface representing reason of bugreport failure. * * @see #EXTRA_BUGREPORT_FAILURE_REASON * @hide */ public @interface BugreportFailureCode {} /** Bugreport completion process failed. */ public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; /** Bugreport is no longer available for collection. */ public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; /** @hide */ public static final String ACTION_CHOOSE_PRIVATE_KEY_ALIAS = "android.app.action.CHOOSE_PRIVATE_KEY_ALIAS"; Loading Loading @@ -481,6 +554,48 @@ public class DeviceAdminReceiver extends BroadcastReceiver { public void onSystemUpdatePending(Context context, Intent intent, long receivedTime) { } /** * Called when sharing a bugreport has been cancelled by the user of the device. * * <p>This callback is only applicable to device owners. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. * @see DevicePolicyManager#requestBugreport */ public void onBugreportSharingDeclined(Context context, Intent intent) { } /** * Called when the bugreport has been shared with the device administrator app. * * <p>This callback is only applicable to device owners. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. Contains the URI of * the bugreport file (with MIME type "application/vnd.android.bugreport"), that can be accessed * by calling {@link Intent#getData()} * @param bugreportHash SHA-256 hash of the bugreport file. * @see DevicePolicyManager#requestBugreport */ public void onBugreportShared(Context context, Intent intent, String bugreportHash) { } /** * Called when the bugreport collection flow has failed. * * <p>This callback is only applicable to device owners. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. * @param failureCode int containing failure code. One of * #BUGREPORT_FAILURE_FAILED_COMPLETING or #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE * @see DevicePolicyManager#requestBugreport */ public void onBugreportFailed(Context context, Intent intent, @BugreportFailureCode int failureCode) { } /** * Intercept standard device administrator broadcasts. Implementations * should not override this method; it is better to implement the Loading Loading @@ -524,6 +639,15 @@ public class DeviceAdminReceiver extends BroadcastReceiver { } else if (ACTION_NOTIFY_PENDING_SYSTEM_UPDATE.equals(action)) { long receivedTime = intent.getLongExtra(EXTRA_SYSTEM_UPDATE_RECEIVED_TIME, -1); onSystemUpdatePending(context, intent, receivedTime); } else if (ACTION_BUGREPORT_SHARING_DECLINED.equals(action)) { onBugreportSharingDeclined(context, intent); } else if (ACTION_BUGREPORT_SHARE.equals(action)) { String bugreportFileHash = intent.getStringExtra(EXTRA_BUGREPORT_HASH); onBugreportShared(context, intent, bugreportFileHash); } else if (ACTION_BUGREPORT_FAILED.equals(action)) { int failureCode = intent.getIntExtra(EXTRA_BUGREPORT_FAILURE_REASON, BUGREPORT_FAILURE_FAILED_COMPLETING); onBugreportFailed(context, intent, failureCode); } } } core/java/android/app/admin/DevicePolicyManager.java +22 −0 Original line number Diff line number Diff line Loading @@ -2559,6 +2559,28 @@ public class DevicePolicyManager { return false; } /** * Called by a device owner to request a bugreport. * * <p>There must be only one user on the device, managed by the device owner. * Otherwise a security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return {@code true} if the bugreport collection started successfully, or {@code false} * if it wasn't triggered because a previous bugreport operation is still active * (either the bugreport is still running or waiting for the user to share or decline) */ public boolean requestBugreport(@NonNull ComponentName admin) { if (mService != null) { try { return mService.requestBugreport(admin); } catch (RemoteException e) { Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); } } return false; } /** * Determine whether or not creating a guest user has been disabled for the device * Loading Loading
api/current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5737,6 +5737,9 @@ package android.app.admin { ctor public DeviceAdminReceiver(); method public android.app.admin.DevicePolicyManager getManager(android.content.Context); method public android.content.ComponentName getWho(android.content.Context); method public void onBugreportFailed(android.content.Context, android.content.Intent, int); method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String); method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent); method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String); method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent); method public void onDisabled(android.content.Context, android.content.Intent); Loading @@ -5761,11 +5764,16 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; } public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation { } public class DevicePolicyManager { method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); Loading Loading @@ -5844,6 +5852,7 @@ package android.app.admin { method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean requestBugreport(android.content.ComponentName); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public boolean setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String);
api/system-current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5870,6 +5870,9 @@ package android.app.admin { ctor public DeviceAdminReceiver(); method public android.app.admin.DevicePolicyManager getManager(android.content.Context); method public android.content.ComponentName getWho(android.content.Context); method public void onBugreportFailed(android.content.Context, android.content.Intent, int); method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String); method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent); method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String); method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent); method public void onDisabled(android.content.Context, android.content.Intent); Loading @@ -5894,11 +5897,16 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; } public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation { } public class DevicePolicyManager { method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); Loading Loading @@ -5986,6 +5994,7 @@ package android.app.admin { method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean requestBugreport(android.content.ComponentName); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public deprecated boolean setActiveProfileOwner(android.content.ComponentName, java.lang.String) throws java.lang.IllegalArgumentException;
api/test-current.txt +9 −0 Original line number Diff line number Diff line Loading @@ -5739,6 +5739,9 @@ package android.app.admin { ctor public DeviceAdminReceiver(); method public android.app.admin.DevicePolicyManager getManager(android.content.Context); method public android.content.ComponentName getWho(android.content.Context); method public void onBugreportFailed(android.content.Context, android.content.Intent, int); method public void onBugreportShared(android.content.Context, android.content.Intent, java.lang.String); method public void onBugreportSharingDeclined(android.content.Context, android.content.Intent); method public java.lang.String onChoosePrivateKeyAlias(android.content.Context, android.content.Intent, int, android.net.Uri, java.lang.String); method public java.lang.CharSequence onDisableRequested(android.content.Context, android.content.Intent); method public void onDisabled(android.content.Context, android.content.Intent); Loading @@ -5763,11 +5766,16 @@ package android.app.admin { field public static final java.lang.String ACTION_PASSWORD_FAILED = "android.app.action.ACTION_PASSWORD_FAILED"; field public static final java.lang.String ACTION_PASSWORD_SUCCEEDED = "android.app.action.ACTION_PASSWORD_SUCCEEDED"; field public static final java.lang.String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; field public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; // 0x0 field public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; // 0x1 field public static final java.lang.String DEVICE_ADMIN_META_DATA = "android.app.device_admin"; field public static final java.lang.String EXTRA_DISABLE_WARNING = "android.app.extra.DISABLE_WARNING"; field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE"; } public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation { } public class DevicePolicyManager { method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); Loading Loading @@ -5846,6 +5854,7 @@ package android.app.admin { method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); method public boolean removeUser(android.content.ComponentName, android.os.UserHandle); method public boolean requestBugreport(android.content.ComponentName); method public boolean resetPassword(java.lang.String, int); method public void setAccountManagementDisabled(android.content.ComponentName, java.lang.String, boolean); method public boolean setAlwaysOnVpnPackage(android.content.ComponentName, java.lang.String);
core/java/android/app/admin/DeviceAdminReceiver.java +124 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.app.admin; import android.accounts.AccountManager; import android.annotation.IntDef; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; Loading @@ -29,6 +30,9 @@ import android.net.Uri; import android.os.Bundle; import android.security.KeyChain; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Base class for implementing a device administration component. This * class provides a convenience for interpreting the raw intent actions Loading Loading @@ -227,6 +231,75 @@ public class DeviceAdminReceiver extends BroadcastReceiver { public static final String ACTION_PROFILE_PROVISIONING_COMPLETE = "android.app.action.PROFILE_PROVISIONING_COMPLETE"; /** * Action sent to a device administrator to notify that the device user * has declined sharing a bugreport. * * <p>The calling device admin must be the device owner to receive this broadcast. * @see DevicePolicyManager#requestBugreport * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BUGREPORT_SHARING_DECLINED = "android.app.action.BUGREPORT_SHARING_DECLINED"; /** * Action sent to a device administrator to notify that the collection of a bugreport * has failed. * * <p>The calling device admin must be the device owner to receive this broadcast. * @see DevicePolicyManager#requestBugreport * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BUGREPORT_FAILED = "android.app.action.BUGREPORT_FAILED"; /** * Action sent to a device administrator to share the bugreport. * * <p>The calling device admin must be the device owner to receive this broadcast. * @see DevicePolicyManager#requestBugreport * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_BUGREPORT_SHARE = "android.app.action.BUGREPORT_SHARE"; /** * A string containing the SHA-256 hash of the bugreport file. * * @see #ACTION_BUGREPORT_SHARE * @hide */ public static final String EXTRA_BUGREPORT_HASH = "android.app.extra.BUGREPORT_HASH"; /** * An {@code int} failure code representing the reason of the bugreport failure. * * @see #ACTION_BUGREPORT_FAILED * @see #BUGREPORT_FAILURE_FAILED_COMPLETING, #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE * @hide */ public static final String EXTRA_BUGREPORT_FAILURE_REASON = "android.app.extra.BUGREPORT_FAILURE_REASON"; @Retention(RetentionPolicy.SOURCE) @IntDef({ BUGREPORT_FAILURE_FAILED_COMPLETING, BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE }) /** * An interface representing reason of bugreport failure. * * @see #EXTRA_BUGREPORT_FAILURE_REASON * @hide */ public @interface BugreportFailureCode {} /** Bugreport completion process failed. */ public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0; /** Bugreport is no longer available for collection. */ public static final int BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE = 1; /** @hide */ public static final String ACTION_CHOOSE_PRIVATE_KEY_ALIAS = "android.app.action.CHOOSE_PRIVATE_KEY_ALIAS"; Loading Loading @@ -481,6 +554,48 @@ public class DeviceAdminReceiver extends BroadcastReceiver { public void onSystemUpdatePending(Context context, Intent intent, long receivedTime) { } /** * Called when sharing a bugreport has been cancelled by the user of the device. * * <p>This callback is only applicable to device owners. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. * @see DevicePolicyManager#requestBugreport */ public void onBugreportSharingDeclined(Context context, Intent intent) { } /** * Called when the bugreport has been shared with the device administrator app. * * <p>This callback is only applicable to device owners. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. Contains the URI of * the bugreport file (with MIME type "application/vnd.android.bugreport"), that can be accessed * by calling {@link Intent#getData()} * @param bugreportHash SHA-256 hash of the bugreport file. * @see DevicePolicyManager#requestBugreport */ public void onBugreportShared(Context context, Intent intent, String bugreportHash) { } /** * Called when the bugreport collection flow has failed. * * <p>This callback is only applicable to device owners. * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. * @param failureCode int containing failure code. One of * #BUGREPORT_FAILURE_FAILED_COMPLETING or #BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE * @see DevicePolicyManager#requestBugreport */ public void onBugreportFailed(Context context, Intent intent, @BugreportFailureCode int failureCode) { } /** * Intercept standard device administrator broadcasts. Implementations * should not override this method; it is better to implement the Loading Loading @@ -524,6 +639,15 @@ public class DeviceAdminReceiver extends BroadcastReceiver { } else if (ACTION_NOTIFY_PENDING_SYSTEM_UPDATE.equals(action)) { long receivedTime = intent.getLongExtra(EXTRA_SYSTEM_UPDATE_RECEIVED_TIME, -1); onSystemUpdatePending(context, intent, receivedTime); } else if (ACTION_BUGREPORT_SHARING_DECLINED.equals(action)) { onBugreportSharingDeclined(context, intent); } else if (ACTION_BUGREPORT_SHARE.equals(action)) { String bugreportFileHash = intent.getStringExtra(EXTRA_BUGREPORT_HASH); onBugreportShared(context, intent, bugreportFileHash); } else if (ACTION_BUGREPORT_FAILED.equals(action)) { int failureCode = intent.getIntExtra(EXTRA_BUGREPORT_FAILURE_REASON, BUGREPORT_FAILURE_FAILED_COMPLETING); onBugreportFailed(context, intent, failureCode); } } }
core/java/android/app/admin/DevicePolicyManager.java +22 −0 Original line number Diff line number Diff line Loading @@ -2559,6 +2559,28 @@ public class DevicePolicyManager { return false; } /** * Called by a device owner to request a bugreport. * * <p>There must be only one user on the device, managed by the device owner. * Otherwise a security exception will be thrown. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return {@code true} if the bugreport collection started successfully, or {@code false} * if it wasn't triggered because a previous bugreport operation is still active * (either the bugreport is still running or waiting for the user to share or decline) */ public boolean requestBugreport(@NonNull ComponentName admin) { if (mService != null) { try { return mService.requestBugreport(admin); } catch (RemoteException e) { Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); } } return false; } /** * Determine whether or not creating a guest user has been disabled for the device * Loading