OSDN Git Service

add a supportsUploading flag in the SyncAdapter description and honor it in the SyncM...
authorFred Quintana <fredq@google.com>
Wed, 19 Aug 2009 20:13:18 +0000 (13:13 -0700)
committerFred Quintana <fredq@google.com>
Thu, 20 Aug 2009 20:52:22 +0000 (13:52 -0700)
api/current.xml
core/java/android/content/SyncAdapterType.java
core/java/android/content/SyncAdaptersCache.java
core/java/android/content/SyncManager.java
core/java/android/preference/CheckBoxPreference.java
core/res/res/values/attrs.xml
core/res/res/values/public.xml

index 881c71f..a330a2a 100644 (file)
  visibility="public"
 >
 </field>
+<field name="supportsUploading"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843410"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="syncable"
  type="int"
  transient="false"
 </parameter>
 <parameter name="userVisible" type="boolean">
 </parameter>
+<parameter name="supportsUploading" type="boolean">
+</parameter>
 </constructor>
 <constructor name="SyncAdapterType"
  type="android.content.SyncAdapterType"
  visibility="public"
 >
 </method>
+<method name="isUserVisible"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="newKey"
  return="android.content.SyncAdapterType"
  abstract="false"
 <parameter name="accountType" type="java.lang.String">
 </parameter>
 </method>
+<method name="supportsUploading"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="writeToParcel"
  return="void"
  abstract="false"
  visibility="public"
 >
 </field>
-<field name="userVisible"
+<field name="isKey"
  type="boolean"
  transient="false"
  volatile="false"
index 93b61ec..25cbdb1 100644 (file)
@@ -27,9 +27,12 @@ import android.os.Parcel;
 public class SyncAdapterType implements Parcelable {
     public final String authority;
     public final String accountType;
-    public final boolean userVisible;
+    public final boolean isKey;
+    private final boolean userVisible;
+    private final boolean supportsUploading;
 
-    public SyncAdapterType(String authority, String accountType, boolean userVisible) {
+    public SyncAdapterType(String authority, String accountType, boolean userVisible, 
+            boolean supportsUploading) {
         if (TextUtils.isEmpty(authority)) {
             throw new IllegalArgumentException("the authority must not be empty: " + authority);
         }
@@ -39,17 +42,49 @@ public class SyncAdapterType implements Parcelable {
         this.authority = authority;
         this.accountType = accountType;
         this.userVisible = userVisible;
+        this.supportsUploading = supportsUploading;
+        this.isKey = false;
+    }
+
+    private SyncAdapterType(String authority, String accountType) {
+        if (TextUtils.isEmpty(authority)) {
+            throw new IllegalArgumentException("the authority must not be empty: " + authority);
+        }
+        if (TextUtils.isEmpty(accountType)) {
+            throw new IllegalArgumentException("the accountType must not be empty: " + accountType);
+        }
+        this.authority = authority;
+        this.accountType = accountType;
+        this.userVisible = true;
+        this.supportsUploading = true;
+        this.isKey = true;
+    }
+
+    public boolean supportsUploading() {
+        if (isKey) {
+            throw new IllegalStateException(
+                    "this method is not allowed to be called when this is a key");
+        }
+        return supportsUploading;
+    }
+
+    public boolean isUserVisible() {
+        if (isKey) {
+            throw new IllegalStateException(
+                    "this method is not allowed to be called when this is a key");
+        }
+        return userVisible;
     }
 
     public static SyncAdapterType newKey(String authority, String accountType) {
-        return new SyncAdapterType(authority, accountType, true);
+        return new SyncAdapterType(authority, accountType);
     }
 
     public boolean equals(Object o) {
         if (o == this) return true;
         if (!(o instanceof SyncAdapterType)) return false;
         final SyncAdapterType other = (SyncAdapterType)o;
-        // don't include userVisible in the equality check
+        // don't include userVisible or supportsUploading in the equality check
         return authority.equals(other.authority) && accountType.equals(other.accountType);
     }
 
@@ -57,13 +92,22 @@ public class SyncAdapterType implements Parcelable {
         int result = 17;
         result = 31 * result + authority.hashCode();
         result = 31 * result + accountType.hashCode();
-        // don't include userVisible in the hash
+        // don't include userVisible or supportsUploading  the hash
         return result;
     }
 
     public String toString() {
-        return "SyncAdapterType {name=" + authority + ", type=" + accountType
-                + ", userVisible=" + userVisible + "}";
+        if (isKey) {
+            return "SyncAdapterType Key {name=" + authority
+                    + ", type=" + accountType
+                    + "}";
+        } else {
+            return "SyncAdapterType {name=" + authority
+                    + ", type=" + accountType
+                    + ", userVisible=" + userVisible
+                    + ", supportsUploading=" + supportsUploading
+                    + "}";
+        }
     }
 
     public int describeContents() {
@@ -71,13 +115,22 @@ public class SyncAdapterType implements Parcelable {
     }
 
     public void writeToParcel(Parcel dest, int flags) {
+        if (isKey) {
+            throw new IllegalStateException("keys aren't parcelable");
+        }
+
         dest.writeString(authority);
         dest.writeString(accountType);
         dest.writeInt(userVisible ? 1 : 0);
+        dest.writeInt(supportsUploading ? 1 : 0);
     }
 
     public SyncAdapterType(Parcel source) {
-        this(source.readString(), source.readString(), source.readInt() != 0);
+        this(
+                source.readString(),
+                source.readString(),
+                source.readInt() != 0,
+                source.readInt() != 0);
     }
 
     public static final Creator<SyncAdapterType> CREATOR = new Creator<SyncAdapterType>() {
index c27fd25..7d9f1de 100644 (file)
@@ -49,7 +49,10 @@ import android.util.AttributeSet;
             }
             final boolean userVisible =
                     sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_userVisible, true);
-            return new SyncAdapterType(authority, accountType, userVisible);
+            final boolean supportsUploading =
+                    sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_supportsUploading,
+                            true);
+            return new SyncAdapterType(authority, accountType, userVisible, supportsUploading);
         } finally {
             sa.recycle();
         }
index 34efc51..82cf23f 100644 (file)
@@ -526,13 +526,6 @@ class SyncManager implements OnAccountsUpdatedListener {
     public void scheduleSync(Account requestedAccount, String requestedAuthority,
             Bundle extras, long delay, boolean onlyThoseWithUnkownSyncableState) {
         boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
-        if (isLoggable) {
-            Log.v(TAG, "scheduleSync:"
-                    + " delay " + delay
-                    + ", account " + requestedAccount
-                    + ", authority " + requestedAuthority
-                    + ", extras " + ((extras == null) ? "(null)" : extras));
-        }
 
         if (!isSyncEnabled()) {
             if (isLoggable) {
@@ -617,13 +610,27 @@ class SyncManager implements OnAccountsUpdatedListener {
                 if (onlyThoseWithUnkownSyncableState && isSyncable >= 0) {
                     continue;
                 }
-                if (mSyncAdapters.getServiceInfo(SyncAdapterType.newKey(authority, account.type))
-                        != null) {
+                final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
+                        mSyncAdapters.getServiceInfo(
+                                SyncAdapterType.newKey(authority, account.type));
+                if (syncAdapterInfo != null) {
+                    if (!syncAdapterInfo.type.supportsUploading() && uploadOnly) {
+                        continue;
+                    }
                     // make this an initialization sync if the isSyncable state is unknown
-                    Bundle extrasCopy = new Bundle(extras);
+                    Bundle extrasCopy = extras;
                     if (isSyncable < 0) {
+                        extrasCopy = new Bundle(extras);
                         extrasCopy.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true);
                     }
+                    if (isLoggable) {
+                        Log.v(TAG, "scheduleSync:"
+                                + " delay " + delay
+                                + ", source " + source
+                                + ", account " + account
+                                + ", authority " + authority
+                                + ", extras " + extrasCopy);
+                    }
                     scheduleSyncOperation(
                             new SyncOperation(account, source, authority, extrasCopy, delay));
                 }
index cf5664c..f16a7e4 100644 (file)
@@ -149,14 +149,12 @@ public class CheckBoxPreference extends Preference {
      * @param checked The checked state.
      */
     public void setChecked(boolean checked) {
-
-        mChecked = checked;
-
-        persistBoolean(checked);
-
-        notifyDependencyChange(shouldDisableDependents());
-        
-        notifyChanged();
+        if (mChecked != checked) {
+            mChecked = checked;
+            persistBoolean(checked);
+            notifyDependencyChange(shouldDisableDependents());
+            notifyChanged();
+        }
     }
 
     /**
index e03211d..729b1db 100644 (file)
         <attr name="contentAuthority" format="string"/>
         <attr name="accountType"/>
         <attr name="userVisible" format="boolean"/>
+        <attr name="supportsUploading" format="boolean"/>
     </declare-styleable>
 
     <!-- =============================== -->
index bbeb78d..4bc376b 100644 (file)
   <public type="style" name="Theme.Wallpaper.NoTitleBar" />
   <public type="style" name="Theme.Wallpaper.NoTitleBar.Fullscreen" />
 
+  <public type="attr" name="supportsUploading" />
 </resources>