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

Commit d01ed46c authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #21799741: AbstractThreadedSyncAdapter crashes...

...when permissions aren't granted

Eat the SecurityException, turn it into a new callback.

Change-Id: Ibeffce061aa51beba097c90f431de07ce70b3c4e
parent 9622c0cc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7211,6 +7211,7 @@ package android.content {
    method public android.content.Context getContext();
    method public final android.os.IBinder getSyncAdapterBinder();
    method public abstract void onPerformSync(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.ContentProviderClient, android.content.SyncResult);
    method public void onSecurityException(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.SyncResult);
    method public void onSyncCanceled();
    method public void onSyncCanceled(java.lang.Thread);
    field public static final deprecated int LOG_SYNC_DETAILS = 2743; // 0xab7
+1 −0
Original line number Diff line number Diff line
@@ -7436,6 +7436,7 @@ package android.content {
    method public android.content.Context getContext();
    method public final android.os.IBinder getSyncAdapterBinder();
    method public abstract void onPerformSync(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.ContentProviderClient, android.content.SyncResult);
    method public void onSecurityException(android.accounts.Account, android.os.Bundle, java.lang.String, android.content.SyncResult);
    method public void onSyncCanceled();
    method public void onSyncCanceled(java.lang.Thread);
    field public static final deprecated int LOG_SYNC_DETAILS = 2743; // 0xab7
+18 −0
Original line number Diff line number Diff line
@@ -261,6 +261,10 @@ public abstract class AbstractThreadedSyncAdapter {
                } else {
                    syncResult.databaseError = true;
                }
            } catch (SecurityException e) {
                AbstractThreadedSyncAdapter.this.onSecurityException(mAccount, mExtras,
                        mAuthority, syncResult);
                syncResult.databaseError = true;
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_SYNC_MANAGER);

@@ -305,6 +309,20 @@ public abstract class AbstractThreadedSyncAdapter {
    public abstract void onPerformSync(Account account, Bundle extras,
            String authority, ContentProviderClient provider, SyncResult syncResult);

    /**
     * Report that there was a security exception when opening the content provider
     * prior to calling {@link #onPerformSync}.  This will be treated as a sync
     * database failure.
     *
     * @param account the account that attempted to sync
     * @param extras SyncAdapter-specific parameters
     * @param authority the authority of the failed sync request
     * @param syncResult SyncAdapter-specific parameters
     */
    public void onSecurityException(Account account, Bundle extras,
            String authority, SyncResult syncResult) {
    }

    /**
     * Indicates that a sync operation has been canceled. This will be invoked on a separate
     * thread than the sync thread and so you must consider the multi-threaded implications