diff options
author | Fred Quintana <fredq@google.com> | 2011-08-24 11:29:00 -0700 |
---|---|---|
committer | Fred Quintana <fredq@google.com> | 2011-08-25 17:23:42 -0700 |
commit | e6d60ecdf668499f003a81274f18cb57075eb65b (patch) | |
tree | 8a09181e9bb7a3cbcc4b45ce3bd804c54b84857e /core/java/android/content | |
parent | 12bde60b39affbfdcb7ef6317e0a5f99c3f41b10 (diff) | |
download | frameworks_base-e6d60ecdf668499f003a81274f18cb57075eb65b.zip frameworks_base-e6d60ecdf668499f003a81274f18cb57075eb65b.tar.gz frameworks_base-e6d60ecdf668499f003a81274f18cb57075eb65b.tar.bz2 |
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
Diffstat (limited to 'core/java/android/content')
-rw-r--r-- | core/java/android/content/AbstractThreadedSyncAdapter.java | 45 | ||||
-rw-r--r-- | core/java/android/content/SyncAdapterType.java | 24 | ||||
-rw-r--r-- | core/java/android/content/SyncAdaptersCache.java | 5 |
3 files changed, 71 insertions, 3 deletions
diff --git a/core/java/android/content/AbstractThreadedSyncAdapter.java b/core/java/android/content/AbstractThreadedSyncAdapter.java index fcc19a2..6bffed7 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. + * <p> + * 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 <code>android.content.SyncAdapter</code>. This service + * must specify the following intent filter and metadata tags in its AndroidManifest.xml file + * <pre> + * <intent-filter> + * <action android:name="android.content.SyncAdapter" /> + * </intent-filter> + * <meta-data android:name="android.content.SyncAdapter" + * android:resource="@xml/syncadapter" /> + * </pre> + * The <code>android:resource</code> attribute must point to a resource that looks like: + * <pre> + * <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" + * /> + * </pre> + * <ul> + * <li>The <code>android:contentAuthority</code> and <code>android:accountType</code> attributes + * indicate which content authority and for which account types this sync adapter serves. + * <li><code>android:userVisible</code> defaults to true and controls whether or not this sync + * adapter shows up in the Sync Settings screen. + * <li><code>android:supportsUploading</code> defaults + * to true and if true an upload-only sync will be requested for all syncadapters associated + * with an authority whenever that authority's content provider does a + * {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)} + * with syncToNetwork set to true. + * <li><code>android:allowParallelSyncs</code> defaults to false and if true indicates that + * the sync adapter can handle syncs for multiple accounts at the same time. Otherwise + * the SyncManager will wait until the sync adapter is not in use before requesting that + * it sync an account's data. + * <li><code>android:isAlwaysSyncable</code> defaults to false and if true tells the SyncManager + * to intialize the isSyncable state to 1 for that sync adapter for each account that is added. + * <li><code>android:syncAdapterSettingsAction</code> defaults to null and if supplied it + * specifies an Intent action of an activity that can be used to adjust the sync adapter's + * sync settings. The activity must live in the same package as the sync adapter. + * </ul> */ public abstract class AbstractThreadedSyncAdapter { /** diff --git a/core/java/android/content/SyncAdapterType.java b/core/java/android/content/SyncAdapterType.java index b85346e..8a16ac9 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<SyncAdapterType> CREATOR = new Creator<SyncAdapterType>() { diff --git a/core/java/android/content/SyncAdaptersCache.java b/core/java/android/content/SyncAdaptersCache.java index 33a713b..7b643a0 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(); } |