From c8ad0cd316cf115d666aee5c61038119473c2a32 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Mon, 20 Jun 2016 15:41:35 -0700 Subject: [PATCH] Tweaks to DragAndDropPermissions behavior No longer release permissions in finalize(), so that apps do not have to maintain a reference to the DragAndDropPermissions object. Also make it parcelable, so that permission instances can be retained across activity instances so that they can be manually released. Bug: 29162822 Change-Id: Ie604dd3e83ee45a8665d743449b91857dd54e896 --- api/current.txt | 5 +- api/system-current.txt | 5 +- api/test-current.txt | 5 +- .../android/view/DragAndDropPermissions.java | 57 +++++++++++++------ 4 files changed, 52 insertions(+), 20 deletions(-) diff --git a/api/current.txt b/api/current.txt index 3bd607bff4726..4f12ad4ed8c89 100644 --- a/api/current.txt +++ b/api/current.txt @@ -40820,8 +40820,11 @@ package android.view { field public static final android.os.Parcelable.Creator CREATOR; } - public final class DragAndDropPermissions { + public final class DragAndDropPermissions implements android.os.Parcelable { + method public int describeContents(); method public void release(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; } public class DragEvent implements android.os.Parcelable { diff --git a/api/system-current.txt b/api/system-current.txt index 82404073d36ec..ea2707e2bd6fd 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -43819,8 +43819,11 @@ package android.view { field public static final android.os.Parcelable.Creator CREATOR; } - public final class DragAndDropPermissions { + public final class DragAndDropPermissions implements android.os.Parcelable { + method public int describeContents(); method public void release(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; } public class DragEvent implements android.os.Parcelable { diff --git a/api/test-current.txt b/api/test-current.txt index 8425e9007502e..a70e9e3f7e19e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -40899,8 +40899,11 @@ package android.view { field public static final android.os.Parcelable.Creator CREATOR; } - public final class DragAndDropPermissions { + public final class DragAndDropPermissions implements android.os.Parcelable { + method public int describeContents(); method public void release(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; } public class DragEvent implements android.os.Parcelable { diff --git a/core/java/android/view/DragAndDropPermissions.java b/core/java/android/view/DragAndDropPermissions.java index a3dbdb16197d0..71afaaa5b458f 100644 --- a/core/java/android/view/DragAndDropPermissions.java +++ b/core/java/android/view/DragAndDropPermissions.java @@ -16,12 +16,14 @@ package android.view; +import android.app.Activity; import android.app.ActivityManagerNative; import android.os.IBinder; +import android.os.Parcel; +import android.os.Parcelable; import android.os.RemoteException; -import com.android.internal.view.IDragAndDropPermissions; -import dalvik.system.CloseGuard; +import com.android.internal.view.IDragAndDropPermissions; /** * {@link DragAndDropPermissions} controls the access permissions for the content URIs associated @@ -33,20 +35,27 @@ import dalvik.system.CloseGuard; * Which permissions are granted is defined by the set of flags passed to {@link * View#startDragAndDrop(android.content.ClipData, View.DragShadowBuilder, Object, int) * View.startDragAndDrop} by the app that started the drag operation. + *

*

* The life cycle of the permissions is bound to the activity used to call {@link * android.app.Activity#requestDragAndDropPermissions(DragEvent) requestDragAndDropPermissions}. The * permissions are revoked when this activity is destroyed, or when {@link #release()} is called, * whichever occurs first. + *

+ *

+ * If you anticipate that your application will receive a large number of drops (e.g. document + * editor), you should try to call {@link #release()} on the obtained permissions as soon as they + * are no longer required. Permissions can be added to your activity's + * {@link Activity#onSaveInstanceState} bundle and later retrieved in order to manually release + * the permissions once they are no longer needed. + *

*/ -public final class DragAndDropPermissions { +public final class DragAndDropPermissions implements Parcelable { private final IDragAndDropPermissions mDragAndDropPermissions; private IBinder mPermissionOwnerToken; - private final CloseGuard mCloseGuard = CloseGuard.get(); - /** * Create a new {@link DragAndDropPermissions} object to control the access permissions for * content URIs associated with {@link DragEvent}. @@ -79,7 +88,6 @@ public final class DragAndDropPermissions { } catch (RemoteException e) { return false; } - mCloseGuard.open("release"); return true; } @@ -96,7 +104,6 @@ public final class DragAndDropPermissions { } catch (RemoteException e) { return false; } - mCloseGuard.open("release"); return true; } @@ -109,18 +116,34 @@ public final class DragAndDropPermissions { mPermissionOwnerToken = null; } catch (RemoteException e) { } - mCloseGuard.close(); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator () { + @Override + public DragAndDropPermissions createFromParcel(Parcel source) { + return new DragAndDropPermissions(source); + } + + @Override + public DragAndDropPermissions[] newArray(int size) { + return new DragAndDropPermissions[size]; + } + }; + + @Override + public int describeContents() { + return 0; } @Override - protected void finalize() throws Throwable { - try { - if (mCloseGuard != null) { - mCloseGuard.warnIfOpen(); - } - release(); - } finally { - super.finalize(); - } + public void writeToParcel(Parcel destination, int flags) { + destination.writeStrongInterface(mDragAndDropPermissions); + destination.writeStrongBinder(mPermissionOwnerToken); + } + + private DragAndDropPermissions(Parcel in) { + mDragAndDropPermissions = IDragAndDropPermissions.Stub.asInterface(in.readStrongBinder()); + mPermissionOwnerToken = in.readStrongBinder(); } }