Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f038004f authored by Fred Quintana's avatar Fred Quintana
Browse files

changes from Sync Manager API Review: bug 2164262

parent 460b60c9
Loading
Loading
Loading
Loading
+485 −0
Original line number Diff line number Diff line
@@ -27216,6 +27216,81 @@
</package>
<package name="android.content"
>
<class name="AbstractThreadedSyncAdapter"
 extends="java.lang.Object"
 abstract="true"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<constructor name="AbstractThreadedSyncAdapter"
 type="android.content.AbstractThreadedSyncAdapter"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="context" type="android.content.Context">
</parameter>
<parameter name="autoInitialize" type="boolean">
</parameter>
</constructor>
<method name="getContext"
 return="android.content.Context"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="getSyncAdapterBinder"
 return="android.os.IBinder"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="onPerformSync"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="account" type="android.accounts.Account">
</parameter>
<parameter name="extras" type="android.os.Bundle">
</parameter>
<parameter name="authority" type="java.lang.String">
</parameter>
<parameter name="provider" type="android.content.ContentProviderClient">
</parameter>
<parameter name="syncResult" type="android.content.SyncResult">
</parameter>
</method>
<field name="LOG_SYNC_DETAILS"
 type="int"
 transient="false"
 volatile="false"
 value="2743"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
</class>
<class name="ActivityNotFoundException"
 extends="java.lang.RuntimeException"
 abstract="false"
@@ -38092,6 +38167,416 @@
>
</field>
</class>
<class name="SyncContext"
 extends="java.lang.Object"
 abstract="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<method name="getSyncContextBinder"
 return="android.os.IBinder"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="onFinished"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="result" type="android.content.SyncResult">
</parameter>
</method>
</class>
<class name="SyncResult"
 extends="java.lang.Object"
 abstract="false"
 static="false"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
<implements name="android.os.Parcelable">
</implements>
<constructor name="SyncResult"
 type="android.content.SyncResult"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</constructor>
<method name="clear"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="describeContents"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="hasError"
 return="boolean"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="hasHardError"
 return="boolean"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="hasSoftError"
 return="boolean"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="madeSomeProgress"
 return="boolean"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="toDebugString"
 return="java.lang.String"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="writeToParcel"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="parcel" type="android.os.Parcel">
</parameter>
<parameter name="flags" type="int">
</parameter>
</method>
<field name="ALREADY_IN_PROGRESS"
 type="android.content.SyncResult"
 transient="false"
 volatile="false"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="CREATOR"
 type="android.os.Parcelable.Creator"
 transient="false"
 volatile="false"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="databaseError"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="fullSyncRequested"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="moreRecordsToGet"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="partialSyncUnavailable"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="stats"
 type="android.content.SyncStats"
 transient="false"
 volatile="false"
 static="false"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="syncAlreadyInProgress"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="tooManyDeletions"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="tooManyRetries"
 type="boolean"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
</class>
<class name="SyncStats"
 extends="java.lang.Object"
 abstract="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<implements name="android.os.Parcelable">
</implements>
<constructor name="SyncStats"
 type="android.content.SyncStats"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</constructor>
<constructor name="SyncStats"
 type="android.content.SyncStats"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="in" type="android.os.Parcel">
</parameter>
</constructor>
<method name="clear"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="describeContents"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="writeToParcel"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="dest" type="android.os.Parcel">
</parameter>
<parameter name="flags" type="int">
</parameter>
</method>
<field name="CREATOR"
 type="android.os.Parcelable.Creator"
 transient="false"
 volatile="false"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numAuthExceptions"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numConflictDetectedExceptions"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numDeletes"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numEntries"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numInserts"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numIoExceptions"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numParseExceptions"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numSkippedEntries"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="numUpdates"
 type="long"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
</class>
<interface name="SyncStatusObserver"
 abstract="true"
 static="false"
+17 −19
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.accounts.Account;
import android.os.Bundle;
import android.os.Process;
import android.os.NetStat;
import android.os.IBinder;
import android.util.EventLog;

import java.util.concurrent.atomic.AtomicInteger;
@@ -29,12 +30,10 @@ import java.util.concurrent.atomic.AtomicInteger;
 * If a sync operation is already in progress when a startSync() request is received then an error
 * will be returned to the new request and the existing request will be allowed to continue.
 * When a startSync() is received and there is no sync operation in progress then a thread
 * will be started to run the operation and {@link #performSync} will be invoked on that thread.
 * will be started to run the operation and {@link #onPerformSync} will be invoked on that thread.
 * 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.
 *
 * @hide
 */
public abstract class AbstractThreadedSyncAdapter {
    private final Context mContext;
@@ -71,7 +70,7 @@ public abstract class AbstractThreadedSyncAdapter {
        return mContext;
    }

    class ISyncAdapterImpl extends ISyncAdapter.Stub {
    private class ISyncAdapterImpl extends ISyncAdapter.Stub {
        public void startSync(ISyncContext syncContext, String authority, Account account,
                Bundle extras) {
            final SyncContext syncContextClient = new SyncContext(syncContext);
@@ -112,7 +111,7 @@ public abstract class AbstractThreadedSyncAdapter {
            // check it and when we use it
            synchronized (mSyncThreadLock) {
                if (mSyncThread != null
                        && mSyncThread.mSyncContext.getISyncContext().asBinder()
                        && mSyncThread.mSyncContext.getSyncContextBinder()
                        == syncContext.asBinder()) {
                    mSyncThread.interrupt();
                }
@@ -121,9 +120,9 @@ public abstract class AbstractThreadedSyncAdapter {
    }

    /**
     * The thread that invokes performSync(). It also acquires the provider for this sync
     * before calling performSync and releases it afterwards. Cancel this thread in order to
     * cancel the sync.
     * The thread that invokes {@link AbstractThreadedSyncAdapter#onPerformSync}. It also acquires
     * the provider for this sync before calling onPerformSync and releases it afterwards. Cancel
     * this thread in order to cancel the sync.
     */
    private class SyncThread extends Thread {
        private final SyncContext mSyncContext;
@@ -157,11 +156,10 @@ public abstract class AbstractThreadedSyncAdapter {
            try {
                provider = mContext.getContentResolver().acquireContentProviderClient(mAuthority);
                if (provider != null) {
                    AbstractThreadedSyncAdapter.this.performSync(mAccount, mExtras,
                    AbstractThreadedSyncAdapter.this.onPerformSync(mAccount, mExtras,
                            mAuthority, provider, syncResult);
                } else {
                    // TODO(fredq) update the syncResults to indicate that we were unable to
                    // find the provider. maybe with a ProviderError?
                    syncResult.databaseError = true;
                }
            } finally {
                if (provider != null) {
@@ -170,7 +168,7 @@ public abstract class AbstractThreadedSyncAdapter {
                if (!isCanceled()) {
                    mSyncContext.onFinished(syncResult);
                }
                logSyncDetails(NetStat.getUidTxBytes(uid) - mInitialTxBytes,
                onLogSyncDetails(NetStat.getUidTxBytes(uid) - mInitialTxBytes,
                        NetStat.getUidRxBytes(uid) - mInitialRxBytes, syncResult);
                // synchronize so that the assignment will be seen by other threads
                // that also synchronize accesses to mSyncThread
@@ -186,10 +184,10 @@ public abstract class AbstractThreadedSyncAdapter {
    }

    /**
     * @return a reference to the ISyncAdapter interface into this SyncAdapter implementation.
     * @return a reference to the IBinder of the SyncAdapter service.
     */
    public final ISyncAdapter getISyncAdapter() {
        return mISyncAdapterImpl;
    public final IBinder getSyncAdapterBinder() {
        return mISyncAdapterImpl.asBinder();
    }

    /**
@@ -204,7 +202,7 @@ public abstract class AbstractThreadedSyncAdapter {
     *   authority
     * @param syncResult SyncAdapter-specific parameters
     */
    public abstract void performSync(Account account, Bundle extras,
    public abstract void onPerformSync(Account account, Bundle extras,
            String authority, ContentProviderClient provider, SyncResult syncResult);

    /**
@@ -215,9 +213,9 @@ public abstract class AbstractThreadedSyncAdapter {
     * @param bytesSent number of bytes the sync sent over the network
     * @param bytesReceived number of bytes the sync received over the network
     * @param result The SyncResult object holding info on the sync
     * @hide
     */
    protected void logSyncDetails(long bytesSent, long bytesReceived, SyncResult result) {
    protected void onLogSyncDetails(long bytesSent, long bytesReceived, SyncResult result) {
        EventLog.writeEvent(SyncAdapter.LOG_SYNC_DETAILS, TAG, bytesSent, bytesReceived, "");
    }

}
+9 −6
Original line number Diff line number Diff line
@@ -18,16 +18,17 @@ package android.content;

import android.os.RemoteException;
import android.os.SystemClock;
import android.os.IBinder;

/**
 * @hide
 */
public class SyncContext {
    private ISyncContext mSyncContext;
    private long mLastHeartbeatSendTime;

    private static final long HEARTBEAT_SEND_INTERVAL_IN_MS = 1000;

    /**
     * @hide
     */
    public SyncContext(ISyncContext syncContextInterface) {
        mSyncContext = syncContextInterface;
        mLastHeartbeatSendTime = 0;
@@ -38,6 +39,8 @@ public class SyncContext {
     * {@link #updateHeartbeat}, so it also takes the place of a call to that.
     *
     * @param message the current status message for this sync
     *
     * @hide
     */
    public void setStatusText(String message) {
        updateHeartbeat();
@@ -48,7 +51,7 @@ public class SyncContext {
     * downloads or sends records to/from the server, this may be called after each record
     * is downloaded or uploaded.
     */
    public void updateHeartbeat() {
    private void updateHeartbeat() {
        final long now = SystemClock.elapsedRealtime();
        if (now < mLastHeartbeatSendTime + HEARTBEAT_SEND_INTERVAL_IN_MS) return;
        try {
@@ -67,7 +70,7 @@ public class SyncContext {
        }
    }

    public ISyncContext getISyncContext() {
        return mSyncContext;
    public IBinder getSyncContextBinder() {
        return mSyncContext.asBinder();
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -5,8 +5,6 @@ import android.os.Parcelable;

/**
 * This class is used to store information about the result of a sync
 * 
 * @hide
 */
public final class SyncResult implements Parcelable {
    public final boolean syncAlreadyInProgress;
+0 −37
Original line number Diff line number Diff line
/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.content;

/**
 * Class with callback methods for SyncAdapters and ContentProviders
 * that are called in response to the calls on SyncContext.  This class
 * is really only meant to be used by the Sync UI activities.
 *
 * <p>All of the onXXX callback methods here are called from a handler
 * on the thread this object was created in.
 *
 * <p>This interface is unused. It should be removed.
 * 
 * @hide
 */
@Deprecated
public interface SyncUIContext {
    
    void setStatusText(String text);

    Context context();
}