From 5ab73b969e50abbb1b76a58c432e2e84553f9d68 Mon Sep 17 00:00:00 2001 From: Benjamin Baxter Date: Wed, 14 Jun 2017 10:33:02 -0700 Subject: Move contact database operations to background. Bug: 34841755 Change-Id: I37a3460446fa961fe54f2372a08cb2b7270b3e74 --- .../messaging/contacts/ContactsListActivity.java | 74 +++++++++++++++++----- .../messaging/contacts/ContactsListAdapter.java | 1 + .../wearable/wear/messaging/model/Profile.java | 2 +- 3 files changed, 60 insertions(+), 17 deletions(-) (limited to 'wearable') diff --git a/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListActivity.java b/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListActivity.java index 5b45a604..71743326 100644 --- a/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListActivity.java +++ b/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListActivity.java @@ -15,7 +15,9 @@ */ package com.example.android.wearable.wear.messaging.contacts; +import android.content.Context; import android.content.Intent; +import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v7.widget.LinearLayoutManager; @@ -40,15 +42,12 @@ import java.util.List; * peek. Tapping the check returns the selected contacts/profiles. * *

The caller needs to provide the `ArrayList` of Profiles to display. - * - *

*/ public class ContactsListActivity extends GoogleSignedInActivity { - private WearableRecyclerView mRecyclerView; - private WearableActionDrawer mActionDrawer; private WearableDrawerLayout mDrawerLayout; private ContactsListAdapter mAdapter; + private FindContactsAsyncTask mContactsAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) { @@ -57,10 +56,10 @@ public class ContactsListActivity extends GoogleSignedInActivity { mDrawerLayout = (WearableDrawerLayout) findViewById(R.id.drawer_layout); - mRecyclerView = (WearableRecyclerView) findViewById(R.id.recycler_list); - mRecyclerView.addItemDecoration(new DividerItemDecoration(this, R.drawable.divider)); + WearableRecyclerView recyclerView = (WearableRecyclerView) findViewById(R.id.recycler_list); + recyclerView.addItemDecoration(new DividerItemDecoration(this, R.drawable.divider)); LinearLayoutManager layoutManager = new LinearLayoutManager(this); - mRecyclerView.setLayoutManager(layoutManager); + recyclerView.setLayoutManager(layoutManager); mAdapter = new ContactsListAdapter( @@ -71,16 +70,14 @@ public class ContactsListActivity extends GoogleSignedInActivity { mDrawerLayout.peekDrawer(Gravity.BOTTOM); } }); - mRecyclerView.setAdapter(mAdapter); - - List contacts = MockDatabase.getUserContacts(this); - mAdapter.addAll(contacts); + recyclerView.setAdapter(mAdapter); - mActionDrawer = (WearableActionDrawer) findViewById(R.id.bottom_action_drawer); + WearableActionDrawer actionDrawer = + (WearableActionDrawer) findViewById(R.id.bottom_action_drawer); - Menu menu = mActionDrawer.getMenu(); + Menu menu = actionDrawer.getMenu(); MenuTinter.tintMenu(this, menu, R.color.blue_15); - mActionDrawer.setOnMenuItemClickListener( + actionDrawer.setOnMenuItemClickListener( new WearableActionDrawer.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { @@ -88,12 +85,12 @@ public class ContactsListActivity extends GoogleSignedInActivity { } }); - mActionDrawer.setBackgroundColor(ContextCompat.getColor(this, R.color.blue_65)); + actionDrawer.setBackgroundColor(ContextCompat.getColor(this, R.color.blue_65)); View peek = getLayoutInflater() .inflate(R.layout.drawer_check_confirmation, mDrawerLayout, false); - mActionDrawer.setPeekContent(peek); + actionDrawer.setPeekContent(peek); peek.findViewById(R.id.button_confirm) .setOnClickListener( @@ -114,6 +111,25 @@ public class ContactsListActivity extends GoogleSignedInActivity { }); } + @Override + protected void onResume() { + super.onResume(); + + if (mContactsAsyncTask != null) { + mContactsAsyncTask.cancel(true); + } + mContactsAsyncTask = new FindContactsAsyncTask(this); + mContactsAsyncTask.execute(); + } + + @Override + protected void onPause() { + super.onPause(); + if (mContactsAsyncTask != null) { + mContactsAsyncTask.cancel(true); + } + } + private boolean handleMenuItems(MenuItem menuItem) { int menuId = menuItem.getItemId(); if (menuId == R.id.button_confirm) { @@ -136,4 +152,30 @@ public class ContactsListActivity extends GoogleSignedInActivity { setResult(RESULT_CANCELED); finish(); } + + /** + * Since messaging apps will retrieve contacts remotely, {@link AsyncTask} will allow us to + * perform the expensive operation in the background and not block the main thread. + * + *

Retrieves the user's contacts and updates the adapter with the new list of contacts. + */ + private class FindContactsAsyncTask extends AsyncTask> { + + private final Context mContext; + + FindContactsAsyncTask(Context context) { + this.mContext = context; + } + + @Override + protected List doInBackground(Void... params) { + return MockDatabase.getUserContacts(mContext); + } + + @Override + protected void onPostExecute(List contacts) { + super.onPostExecute(contacts); + mAdapter.addAll(contacts); + } + } } diff --git a/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListAdapter.java b/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListAdapter.java index b9a26752..153b103f 100644 --- a/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListAdapter.java +++ b/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/contacts/ContactsListAdapter.java @@ -222,6 +222,7 @@ public class ContactsListAdapter extends WearableRecyclerView.Adapter contacts) { this.mContacts.addAll(contacts); + notifyDataSetChanged(); } /** diff --git a/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/model/Profile.java b/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/model/Profile.java index ae858f37..62c73ab9 100644 --- a/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/model/Profile.java +++ b/wearable/wear/WearMessagingApp/Wearable/src/main/java/com/example/android/wearable/wear/messaging/model/Profile.java @@ -140,7 +140,7 @@ public class Profile implements Parcelable { if (!name.equals(profile.name)) { return false; } - if (!profileImageUri.equals(profile.profileImageUri)) { + if (profileImageUri != null && !profileImageUri.equals(profile.profileImageUri)) { return false; } return lastUpdatedTime != null -- cgit v1.2.3