From e6d60ecdf668499f003a81274f18cb57075eb65b Mon Sep 17 00:00:00 2001 From: Fred Quintana Date: Wed, 24 Aug 2011 11:29:00 -0700 Subject: add a way for the sync adapter to specify the activity that should be invoked to reach a settings screen for that sync adapter Bug: 5204776 Change-Id: I4641067c1f0710c51f2633241a8c87bc4d568af2 --- api/current.txt | 1 + .../content/AbstractThreadedSyncAdapter.java | 45 ++++++++++++++++++++++ core/java/android/content/SyncAdapterType.java | 24 +++++++++++- core/java/android/content/SyncAdaptersCache.java | 5 ++- core/res/res/values/attrs.xml | 4 ++ 5 files changed, 76 insertions(+), 3 deletions(-) diff --git a/api/current.txt b/api/current.txt index 88a708c9e940..6cf9bb476bcc 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5770,6 +5770,7 @@ package android.content { ctor public SyncAdapterType(android.os.Parcel); method public boolean allowParallelSyncs(); method public int describeContents(); + method public java.lang.String getSettingsActivity(); method public boolean isAlwaysSyncable(); method public boolean isUserVisible(); method public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String); diff --git a/core/java/android/content/AbstractThreadedSyncAdapter.java b/core/java/android/content/AbstractThreadedSyncAdapter.java index fcc19a24a4b0..6bffed759465 100644 --- a/core/java/android/content/AbstractThreadedSyncAdapter.java +++ b/core/java/android/content/AbstractThreadedSyncAdapter.java @@ -34,6 +34,51 @@ import java.util.concurrent.atomic.AtomicInteger; * If a cancelSync() is received that matches an existing sync operation then the thread * that is running that sync operation will be interrupted, which will indicate to the thread * that the sync has been canceled. + *

+ * In order to be a sync adapter one must extend this class, provide implementations for the + * abstract methods and write a service that returns the result of {@link #getSyncAdapterBinder()} + * in the service's {@link android.app.Service#onBind(android.content.Intent)} when invoked + * with an intent with action android.content.SyncAdapter. This service + * must specify the following intent filter and metadata tags in its AndroidManifest.xml file + *

+ *   <intent-filter>
+ *     <action android:name="android.content.SyncAdapter" />
+ *   </intent-filter>
+ *   <meta-data android:name="android.content.SyncAdapter"
+ *             android:resource="@xml/syncadapter" />
+ * 
+ * The android:resource attribute must point to a resource that looks like: + *
+ * <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
+ *    android:contentAuthority="authority"
+ *    android:accountType="accountType"
+ *    android:userVisible="true|false"
+ *    android:supportsUploading="true|false"
+ *    android:allowParallelSyncs="true|false"
+ *    android:isAlwaysSyncable="true|false"
+ *    android:syncAdapterSettingsAction="ACTION_OF_SETTINGS_ACTIVITY"
+ * />
+ * 
+ * */ public abstract class AbstractThreadedSyncAdapter { /** diff --git a/core/java/android/content/SyncAdapterType.java b/core/java/android/content/SyncAdapterType.java index b85346ed3bd3..8a16ac94522e 100644 --- a/core/java/android/content/SyncAdapterType.java +++ b/core/java/android/content/SyncAdapterType.java @@ -32,6 +32,7 @@ public class SyncAdapterType implements Parcelable { private final boolean supportsUploading; private final boolean isAlwaysSyncable; private final boolean allowParallelSyncs; + private final String settingsActivity; public SyncAdapterType(String authority, String accountType, boolean userVisible, boolean supportsUploading) { @@ -47,6 +48,7 @@ public class SyncAdapterType implements Parcelable { this.supportsUploading = supportsUploading; this.isAlwaysSyncable = false; this.allowParallelSyncs = false; + this.settingsActivity = null; this.isKey = false; } @@ -54,7 +56,8 @@ public class SyncAdapterType implements Parcelable { public SyncAdapterType(String authority, String accountType, boolean userVisible, boolean supportsUploading, boolean isAlwaysSyncable, - boolean allowParallelSyncs) { + boolean allowParallelSyncs, + String settingsActivity) { if (TextUtils.isEmpty(authority)) { throw new IllegalArgumentException("the authority must not be empty: " + authority); } @@ -67,6 +70,7 @@ public class SyncAdapterType implements Parcelable { this.supportsUploading = supportsUploading; this.isAlwaysSyncable = isAlwaysSyncable; this.allowParallelSyncs = allowParallelSyncs; + this.settingsActivity = settingsActivity; this.isKey = false; } @@ -83,6 +87,7 @@ public class SyncAdapterType implements Parcelable { this.supportsUploading = true; this.isAlwaysSyncable = false; this.allowParallelSyncs = false; + this.settingsActivity = null; this.isKey = true; } @@ -131,6 +136,18 @@ public class SyncAdapterType implements Parcelable { return isAlwaysSyncable; } + /** + * @return The activity to use to invoke this SyncAdapter's settings activity. + * May be null. + */ + public String getSettingsActivity() { + if (isKey) { + throw new IllegalStateException( + "this method is not allowed to be called when this is a key"); + } + return settingsActivity; + } + public static SyncAdapterType newKey(String authority, String accountType) { return new SyncAdapterType(authority, accountType); } @@ -163,6 +180,7 @@ public class SyncAdapterType implements Parcelable { + ", supportsUploading=" + supportsUploading + ", isAlwaysSyncable=" + isAlwaysSyncable + ", allowParallelSyncs=" + allowParallelSyncs + + ", settingsActivity=" + settingsActivity + "}"; } } @@ -182,6 +200,7 @@ public class SyncAdapterType implements Parcelable { dest.writeInt(supportsUploading ? 1 : 0); dest.writeInt(isAlwaysSyncable ? 1 : 0); dest.writeInt(allowParallelSyncs ? 1 : 0); + dest.writeString(settingsActivity); } public SyncAdapterType(Parcel source) { @@ -191,7 +210,8 @@ public class SyncAdapterType implements Parcelable { source.readInt() != 0, source.readInt() != 0, source.readInt() != 0, - source.readInt() != 0); + source.readInt() != 0, + source.readString()); } public static final Creator CREATOR = new Creator() { diff --git a/core/java/android/content/SyncAdaptersCache.java b/core/java/android/content/SyncAdaptersCache.java index 33a713b20e43..7b643a0801cb 100644 --- a/core/java/android/content/SyncAdaptersCache.java +++ b/core/java/android/content/SyncAdaptersCache.java @@ -66,8 +66,11 @@ import java.io.IOException; final boolean allowParallelSyncs = sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_allowParallelSyncs, false); + final String settingsActivity = + sa.getString(com.android.internal.R.styleable + .SyncAdapter_settingsActivity); return new SyncAdapterType(authority, accountType, userVisible, supportsUploading, - isAlwaysSyncable, allowParallelSyncs); + isAlwaysSyncable, allowParallelSyncs, settingsActivity); } finally { sa.recycle(); } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a5369617dade..93cbde55e389 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5110,6 +5110,10 @@ Defaults to false. --> + + -- cgit v1.2.3-59-g8ed1b