add a supportsUploading flag in the SyncAdapter description and honor it in the SyncManager

This commit is contained in:
Fred Quintana
2009-08-19 13:13:18 -07:00
parent 9e61acd9ff
commit e0616ffb74
7 changed files with 126 additions and 28 deletions

View File

@@ -7489,6 +7489,17 @@
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"
@@ -36124,6 +36135,8 @@
</parameter>
<parameter name="userVisible" type="boolean">
</parameter>
<parameter name="supportsUploading" type="boolean">
</parameter>
</constructor>
<constructor name="SyncAdapterType"
type="android.content.SyncAdapterType"
@@ -36146,6 +36159,17 @@
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"
@@ -36161,6 +36185,17 @@
<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"
@@ -36206,7 +36241,7 @@
visibility="public"
>
</field>
<field name="userVisible"
<field name="isKey"
type="boolean"
transient="false"
volatile="false"

View 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>() {

View 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();
}

View 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));
}

View 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();
}
}
/**

View File

@@ -3410,6 +3410,7 @@
<attr name="contentAuthority" format="string"/>
<attr name="accountType"/>
<attr name="userVisible" format="boolean"/>
<attr name="supportsUploading" format="boolean"/>
</declare-styleable>
<!-- =============================== -->

View File

@@ -1159,4 +1159,5 @@
<public type="style" name="Theme.Wallpaper.NoTitleBar" />
<public type="style" name="Theme.Wallpaper.NoTitleBar.Fullscreen" />
<public type="attr" name="supportsUploading" />
</resources>