Loading src/com/android/contacts/activities/PeopleActivity.java +8 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -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) { Loading Loading @@ -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. Loading src/com/android/contacts/list/ContactsUnavailableFragment.java +22 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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; } Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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; } } Loading @@ -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); Loading src/com/android/contacts/list/ProviderStatusWatcher.java +24 −28 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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(); Loading Loading @@ -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 { Loading Loading @@ -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; } Loading Loading
src/com/android/contacts/activities/PeopleActivity.java +8 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -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) { Loading Loading @@ -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. Loading
src/com/android/contacts/list/ContactsUnavailableFragment.java +22 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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; } Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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; } } Loading @@ -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); Loading
src/com/android/contacts/list/ProviderStatusWatcher.java +24 −28 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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(); Loading Loading @@ -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 { Loading Loading @@ -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; } Loading