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

Commit 2508b15b authored by Makoto Onuki's avatar Makoto Onuki Committed by Android Git Automerger
Browse files

am e7beac0d: am d8fa716e: Improve provider status query wait

* commit 'e7beac0d':
  Improve provider status query wait
parents da4dd619 e7beac0d
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -150,7 +150,7 @@ public class PeopleActivity extends ContactsActivity

    private ContactsUnavailableFragment mContactsUnavailableFragment;
    private ProviderStatusWatcher mProviderStatusWatcher;
    private int mProviderStatus;
    private ProviderStatusWatcher.Status mProviderStatus;

    private boolean mOptionsMenuContactsAvailable;

@@ -217,7 +217,8 @@ public class PeopleActivity extends ContactsActivity
    }

    public boolean areContactsAvailable() {
        return mProviderStatus == ProviderStatus.STATUS_NORMAL;
        return (mProviderStatus != null)
                && mProviderStatus.status == ProviderStatus.STATUS_NORMAL;
    }

    private boolean areContactWritableAccountsAvailable() {
@@ -991,14 +992,15 @@ public class PeopleActivity extends ContactsActivity
    }

    private void updateViewConfiguration(boolean forceUpdate) {
        int providerStatus = mProviderStatusWatcher.getProviderStatus();
        if (!forceUpdate && (providerStatus == mProviderStatus)) return;
        ProviderStatusWatcher.Status providerStatus = mProviderStatusWatcher.getProviderStatus();
        if (!forceUpdate && (mProviderStatus != null)
                && (providerStatus.status == mProviderStatus.status)) return;
        mProviderStatus = providerStatus;

        View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
        View mainView = findViewById(R.id.main_view);

        if (mProviderStatus == ProviderStatus.STATUS_NORMAL) {
        if (mProviderStatus.status == ProviderStatus.STATUS_NORMAL) {
            // Ensure that the mTabPager is visible; we may have made it invisible below.
            contactsUnavailableView.setVisibility(View.GONE);
            if (mTabPager != null) {
@@ -1033,9 +1035,8 @@ public class PeopleActivity extends ContactsActivity
                getFragmentManager().beginTransaction()
                        .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
                        .commitAllowingStateLoss();
            } else {
                mContactsUnavailableFragment.update();
            }
            mContactsUnavailableFragment.updateStatus(mProviderStatus);

            // Show the contactsUnavailableView, and hide the mTabPager so that we don't
            // see it sliding in underneath the contactsUnavailableView at the edges.
+22 −12
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.contacts.list;
import com.android.contacts.R;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.provider.ContactsContract.ProviderStatus;
import android.view.Gravity;
@@ -35,8 +36,6 @@ import android.widget.TextView;
 */
public class ContactsUnavailableFragment extends Fragment implements OnClickListener {

    private ProviderStatusWatcher mProviderStatusWatcher;

    private View mView;
    private TextView mMessageView;
    private TextView mSecondaryMessageView;
@@ -51,10 +50,11 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList

    private OnContactsUnavailableActionListener mListener;

    private ProviderStatusWatcher.Status mProviderStatus;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mProviderStatusWatcher = ProviderStatusWatcher.getInstance(getActivity());
    }

    @Override
@@ -74,7 +74,11 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList
        mRetryUpgradeButton = (Button) mView.findViewById(R.id.import_failure_retry_button);
        mRetryUpgradeButton.setOnClickListener(this);
        mProgress = (ProgressBar) mView.findViewById(R.id.progress);
        update();

        if (mProviderStatus != null) {
            updateStatus(mProviderStatus);
        }

        return mView;
    }

@@ -83,9 +87,13 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList
        mListener = listener;
    }

    public void update() {
        int providerStatus = mProviderStatusWatcher.getProviderStatus();
        switch (providerStatus) {
    public void updateStatus(ProviderStatusWatcher.Status providerStatus) {
        mProviderStatus = providerStatus;
        if (mView == null) {
            // The view hasn't been inflated yet.
            return;
        }
        switch (providerStatus.status) {
            case ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS:
                setMessageText(mNoContactsMsgResId, mNSecNoContactsMsgResId);
                mCreateContactButton.setVisibility(View.VISIBLE);
@@ -122,7 +130,7 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList

            case ProviderStatus.STATUS_UPGRADE_OUT_OF_MEMORY:
                String message = getResources().getString(R.string.upgrade_out_of_memory,
                        new Object[] { mProviderStatusWatcher.getProviderStatusData() });
                        new Object[] { providerStatus.data});
                mMessageView.setText(message);
                mMessageView.setGravity(Gravity.LEFT);
                mMessageView.setVisibility(View.VISIBLE);
@@ -155,7 +163,10 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList
                mListener.onFreeInternalStorageAction();
                break;
            case R.id.import_failure_retry_button:
                mProviderStatusWatcher.retryUpgrade();
                final Context context = getActivity();
                if (context != null) { // Just in case.
                    ProviderStatusWatcher.retryUpgrade(context);
                }
                break;
        }
    }
@@ -167,9 +178,8 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList
    public void setMessageText(int resId, int secResId) {
        mNoContactsMsgResId = resId;
        mNSecNoContactsMsgResId = secResId;
        if (mMessageView != null &&
                mProviderStatusWatcher.getProviderStatus() ==
                    ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS) {
        if ((mMessageView != null) && (mProviderStatus != null) &&
                (mProviderStatus.status == ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS)) {
            if (resId != -1) {
                mMessageView.setText(mNoContactsMsgResId);
                mMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
+24 −28
Original line number Diff line number Diff line
@@ -47,6 +47,19 @@ public class ProviderStatusWatcher extends ContentObserver {
        public void onProviderStatusChange();
    }

    public static class Status {
        /** See {@link ProviderStatus#STATUS} */
        public final int status;

        /** See {@link ProviderStatus#DATA1} */
        public final String data;

        public Status(int status, String data) {
            this.status = status;
            this.data = data;
        }
    }

    private static final String[] PROJECTION = new String[] {
        ProviderStatus.STATUS,
        ProviderStatus.DATA1
@@ -57,8 +70,6 @@ public class ProviderStatusWatcher extends ContentObserver {
     */
    private static final int LOAD_WAIT_TIMEOUT_MS = 1000;

    private static final int STATUS_UNKNOWN = -1;

    private static ProviderStatusWatcher sInstance;

    private final Context mContext;
@@ -71,10 +82,7 @@ public class ProviderStatusWatcher extends ContentObserver {
    private LoaderTask mLoaderTask;

    /** Last known provider status.  This can be changed on a worker thread. */
    private int mProviderStatus = STATUS_UNKNOWN;

    /** Last known provider status data.  This can be changed on a worker thread. */
    private String mProviderData;
    private Status mProviderStatus;

    private final ArrayList<ProviderStatusListener> mListeners = Lists.newArrayList();

@@ -177,32 +185,18 @@ public class ProviderStatusWatcher extends ContentObserver {
     * (If {@link ProviderStatus#STATUS_UPGRADING} is returned, the app (should) shows an according
     * message, like "contacts are being updated".)
     */
    public int getProviderStatus() {
    public Status getProviderStatus() {
        waitForLoaded();

        if (mProviderStatus == STATUS_UNKNOWN) {
            return ProviderStatus.STATUS_UPGRADING;
        if (mProviderStatus == null) {
            return new Status(ProviderStatus.STATUS_UPGRADING, null);
        }

        return mProviderStatus;
    }

    /**
     * @return last known provider status data.  See also {@link #getProviderStatus()}.
     */
    public String getProviderStatusData() {
        waitForLoaded();

        if (mProviderStatus == STATUS_UNKNOWN) {
            // STATUS_UPGRADING has no data.
            return "";
        }

        return mProviderData;
    }

    private void waitForLoaded() {
        if (mProviderStatus == STATUS_UNKNOWN) {
        if (mProviderStatus == null) {
            if (mLoaderTask == null) {
                // For some reason the loader couldn't load the status.  Let's start it again.
                startLoading();
@@ -238,8 +232,10 @@ public class ProviderStatusWatcher extends ContentObserver {
                if (cursor != null) {
                    try {
                        if (cursor.moveToFirst()) {
                            mProviderStatus = cursor.getInt(0);
                            mProviderData = cursor.getString(1);
                            // Note here we can't just say "Status", as AsyncTask has the "Status"
                            // enum too.
                            mProviderStatus = new ProviderStatusWatcher.Status(
                                    cursor.getInt(0), cursor.getString(1));
                            return true;
                        }
                    } finally {
@@ -291,14 +287,14 @@ public class ProviderStatusWatcher extends ContentObserver {
    /**
     * Sends a provider status update, which will trigger a retry of database upgrade
     */
    public void retryUpgrade() {
    public static void retryUpgrade(final Context context) {
        Log.i(TAG, "retryUpgrade");
        final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                ContentValues values = new ContentValues();
                values.put(ProviderStatus.STATUS, ProviderStatus.STATUS_UPGRADING);
                mContext.getContentResolver().update(ProviderStatus.CONTENT_URI, values,
                context.getContentResolver().update(ProviderStatus.CONTENT_URI, values,
                        null, null);
                return null;
            }