From 2aeedcde21a5e50e39b935f6c4e980499de5e8f5 Mon Sep 17 00:00:00 2001 From: Varun Shah Date: Fri, 3 Apr 2020 17:53:21 -0700 Subject: [PATCH] Update display logic for no shared data. When there is no shared data, instead of showing an empty list view, the developer option's summary is updated. Additionally, for the two shared data screens, added the back button to the action bar so that it matches the other screens in the Settings app. Also, implemented PreferenceControllerMixin for the SharedDataPreferenceController so that the dev option shows up in settings search. Bug: 153079829 Test: make RunSettingsRoboTests ROBOTEST_FILTER=SharedDataPreferenceControllerTest Test: manual (visual) Change-Id: I6ec5c35fc262dc27a383af8e2593be5b349ee85f --- res/layout/shared_data_empty_list_view.xml | 31 --------------- .../development/storage/BlobInfoListView.java | 24 ++++++------ .../storage/LeaseInfoListView.java | 13 ++++++- .../SharedDataPreferenceController.java | 27 +++++++++---- .../SharedDataPreferenceControllerTest.java | 39 ++++++++++++++++++- 5 files changed, 82 insertions(+), 52 deletions(-) delete mode 100644 res/layout/shared_data_empty_list_view.xml diff --git a/res/layout/shared_data_empty_list_view.xml b/res/layout/shared_data_empty_list_view.xml deleted file mode 100644 index 1bb338bdaf8..00000000000 --- a/res/layout/shared_data_empty_list_view.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - diff --git a/src/com/android/settings/development/storage/BlobInfoListView.java b/src/com/android/settings/development/storage/BlobInfoListView.java index 427e37fbc10..8e312a25579 100644 --- a/src/com/android/settings/development/storage/BlobInfoListView.java +++ b/src/com/android/settings/development/storage/BlobInfoListView.java @@ -16,6 +16,7 @@ package com.android.settings.development.storage; +import android.app.ActionBar; import android.app.ListActivity; import android.app.blob.BlobInfo; import android.app.blob.BlobStoreManager; @@ -30,7 +31,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; -import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; @@ -41,7 +41,6 @@ import com.android.settings.R; import java.io.IOException; import java.util.List; -// TODO: have this class extend DashboardFragment for consistency public class BlobInfoListView extends ListActivity { private static final String TAG = "BlobInfoListView"; @@ -60,6 +59,17 @@ public class BlobInfoListView extends ListActivity { mAdapter = new BlobListAdapter(this); setListAdapter(mAdapter); + + final ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public boolean onNavigateUp() { + finish(); + return true; } @Override @@ -91,14 +101,6 @@ public class BlobInfoListView extends ListActivity { } } - private View getEmptyView() { - final View emptyView = mInflater.inflate(R.layout.shared_data_empty_list_view, - (ViewGroup) getListView().getRootView()); - final TextView emptyText = emptyView.findViewById(R.id.empty_view_text); - emptyText.setText(R.string.shared_data_no_blobs_text); - return emptyView; - } - private void showDeleteBlobDialog(BlobInfo blob) { final AlertDialog dialog = new AlertDialog.Builder(mContext) .setMessage(R.string.shared_data_no_accessors_dialog_text) @@ -139,7 +141,7 @@ public class BlobInfoListView extends ListActivity { void updateList(List blobs) { clear(); if (blobs.isEmpty()) { - getListView().setEmptyView(getEmptyView()); + finish(); } else { addAll(blobs); } diff --git a/src/com/android/settings/development/storage/LeaseInfoListView.java b/src/com/android/settings/development/storage/LeaseInfoListView.java index b9a30427397..ef9e5b813f2 100644 --- a/src/com/android/settings/development/storage/LeaseInfoListView.java +++ b/src/com/android/settings/development/storage/LeaseInfoListView.java @@ -16,6 +16,7 @@ package com.android.settings.development.storage; +import android.app.ActionBar; import android.app.ListActivity; import android.app.blob.BlobInfo; import android.app.blob.BlobStoreManager; @@ -44,7 +45,6 @@ import com.android.settings.R; import java.io.IOException; import java.util.List; -// TODO: have this class extend DashboardFragment for consistency public class LeaseInfoListView extends ListActivity { private static final String TAG = "LeaseInfoListView"; @@ -74,6 +74,17 @@ public class LeaseInfoListView extends ListActivity { getListView().addHeaderView(getHeaderView()); getListView().addFooterView(getFooterView()); getListView().setClickable(false); + + final ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public boolean onNavigateUp() { + finish(); + return true; } private LinearLayout getHeaderView() { diff --git a/src/com/android/settings/development/storage/SharedDataPreferenceController.java b/src/com/android/settings/development/storage/SharedDataPreferenceController.java index 1d5c3e40168..5d94dc81ee8 100644 --- a/src/com/android/settings/development/storage/SharedDataPreferenceController.java +++ b/src/com/android/settings/development/storage/SharedDataPreferenceController.java @@ -18,13 +18,20 @@ package com.android.settings.development.storage; import android.app.blob.BlobStoreManager; import android.content.Context; +import android.os.UserHandle; +import android.util.Log; import androidx.preference.Preference; +import com.android.settings.R; +import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.development.DeveloperOptionsPreferenceController; -public class SharedDataPreferenceController extends DeveloperOptionsPreferenceController { +import java.io.IOException; +public class SharedDataPreferenceController extends DeveloperOptionsPreferenceController + implements PreferenceControllerMixin { + private static final String TAG = "SharedDataPrefCtrl"; private static final String SHARED_DATA = "shared_data"; private BlobStoreManager mBlobStoreManager; @@ -39,14 +46,18 @@ public class SharedDataPreferenceController extends DeveloperOptionsPreferenceCo return SHARED_DATA; } - @Override - public boolean isAvailable() { - return mBlobStoreManager != null; - } - @Override public void updateState(Preference preference) { - preference.setEnabled(mBlobStoreManager != null); - // TODO: update summary to indicate why this preference isn't available + try { + final boolean showPref = mBlobStoreManager != null + && !mBlobStoreManager.queryBlobsForUser(UserHandle.CURRENT).isEmpty(); + preference.setEnabled(showPref); + preference.setSummary(showPref ? R.string.shared_data_summary + : R.string.shared_data_no_blobs_text); + } catch (IOException e) { + Log.e(TAG, "Unable to fetch blobs for current user: " + e.getMessage()); + preference.setEnabled(false); + preference.setSummary(R.string.shared_data_no_blobs_text); + } } } diff --git a/tests/robotests/src/com/android/settings/development/storage/SharedDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/storage/SharedDataPreferenceControllerTest.java index 86bb4a70883..f11fb399689 100644 --- a/tests/robotests/src/com/android/settings/development/storage/SharedDataPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/storage/SharedDataPreferenceControllerTest.java @@ -22,8 +22,11 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.blob.BlobInfo; import android.app.blob.BlobStoreManager; +import android.app.blob.LeaseInfo; import android.content.Context; +import android.os.UserHandle; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -38,6 +41,10 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.util.ReflectionHelpers; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + // TODO: add more detailed tests for the shared data screens @RunWith(RobolectricTestRunner.class) public class SharedDataPreferenceControllerTest { @@ -63,8 +70,11 @@ public class SharedDataPreferenceControllerTest { } @Test - public void updateState_BlobManagerIsNotNull_preferenceIsEnabled() { + public void updateState_BlobManagerIsNotNullAndBlobsExist_preferenceIsEnabled() + throws IOException { ReflectionHelpers.setField(mController, "mBlobStoreManager", mBlobStoreManager); + when(mBlobStoreManager.queryBlobsForUser(UserHandle.CURRENT)) + .thenReturn(generateBlobList()); mController.updateState(mPreference); verify(mPreference).setEnabled(true); @@ -72,11 +82,38 @@ public class SharedDataPreferenceControllerTest { .isEqualTo(mContext.getString(R.string.shared_data_summary)); } + @Test + public void updateState_BlobManagerIsNotNullButNoBlobsExist_preferenceIsDisabled() { + ReflectionHelpers.setField(mController, "mBlobStoreManager", mBlobStoreManager); + mController.updateState(mPreference); + + verify(mPreference).setEnabled(false); + assertThat(mPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.shared_data_no_blobs_text)); + } + @Test public void updateState_BlobManagerIsNull_preferenceIsDisabled() { ReflectionHelpers.setField(mController, "mBlobStoreManager", null); mController.updateState(mPreference); verify(mPreference).setEnabled(false); + assertThat(mPreference.getSummary()) + .isEqualTo(mContext.getString(R.string.shared_data_no_blobs_text)); + } + + private List generateBlobList() { + LeaseInfo one = new LeaseInfo("com.google.android.photos", + System.currentTimeMillis(), -1, "test description"); + LeaseInfo two = new LeaseInfo("com.google.android.drive", + System.currentTimeMillis(), -1, "test description 2"); + + List accessors = new ArrayList<>(); + accessors.add(one); + accessors.add(two); + + final List tmp = new ArrayList<>(); + tmp.add(new BlobInfo(10, System.currentTimeMillis(), "testing blob 1", accessors)); + return tmp; } }