Merge "Update display logic for no shared data." into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-04-08 15:11:37 +00:00
committed by Android (Google) Code Review
5 changed files with 82 additions and 52 deletions

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2020 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@android:color/transparent"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
<TextView
android:id="@+id/empty_view_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

View File

@@ -16,6 +16,7 @@
package com.android.settings.development.storage; package com.android.settings.development.storage;
import android.app.ActionBar;
import android.app.ListActivity; import android.app.ListActivity;
import android.app.blob.BlobInfo; import android.app.blob.BlobInfo;
import android.app.blob.BlobStoreManager; import android.app.blob.BlobStoreManager;
@@ -30,7 +31,6 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
@@ -41,7 +41,6 @@ import com.android.settings.R;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
// TODO: have this class extend DashboardFragment for consistency
public class BlobInfoListView extends ListActivity { public class BlobInfoListView extends ListActivity {
private static final String TAG = "BlobInfoListView"; private static final String TAG = "BlobInfoListView";
@@ -60,6 +59,17 @@ public class BlobInfoListView extends ListActivity {
mAdapter = new BlobListAdapter(this); mAdapter = new BlobListAdapter(this);
setListAdapter(mAdapter); setListAdapter(mAdapter);
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
@Override
public boolean onNavigateUp() {
finish();
return true;
} }
@Override @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) { private void showDeleteBlobDialog(BlobInfo blob) {
final AlertDialog dialog = new AlertDialog.Builder(mContext) final AlertDialog dialog = new AlertDialog.Builder(mContext)
.setMessage(R.string.shared_data_no_accessors_dialog_text) .setMessage(R.string.shared_data_no_accessors_dialog_text)
@@ -139,7 +141,7 @@ public class BlobInfoListView extends ListActivity {
void updateList(List<BlobInfo> blobs) { void updateList(List<BlobInfo> blobs) {
clear(); clear();
if (blobs.isEmpty()) { if (blobs.isEmpty()) {
getListView().setEmptyView(getEmptyView()); finish();
} else { } else {
addAll(blobs); addAll(blobs);
} }

View File

@@ -16,6 +16,7 @@
package com.android.settings.development.storage; package com.android.settings.development.storage;
import android.app.ActionBar;
import android.app.ListActivity; import android.app.ListActivity;
import android.app.blob.BlobInfo; import android.app.blob.BlobInfo;
import android.app.blob.BlobStoreManager; import android.app.blob.BlobStoreManager;
@@ -44,7 +45,6 @@ import com.android.settings.R;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
// TODO: have this class extend DashboardFragment for consistency
public class LeaseInfoListView extends ListActivity { public class LeaseInfoListView extends ListActivity {
private static final String TAG = "LeaseInfoListView"; private static final String TAG = "LeaseInfoListView";
@@ -74,6 +74,17 @@ public class LeaseInfoListView extends ListActivity {
getListView().addHeaderView(getHeaderView()); getListView().addHeaderView(getHeaderView());
getListView().addFooterView(getFooterView()); getListView().addFooterView(getFooterView());
getListView().setClickable(false); getListView().setClickable(false);
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
@Override
public boolean onNavigateUp() {
finish();
return true;
} }
private LinearLayout getHeaderView() { private LinearLayout getHeaderView() {

View File

@@ -18,13 +18,20 @@ package com.android.settings.development.storage;
import android.app.blob.BlobStoreManager; import android.app.blob.BlobStoreManager;
import android.content.Context; import android.content.Context;
import android.os.UserHandle;
import android.util.Log;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController; 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 static final String SHARED_DATA = "shared_data";
private BlobStoreManager mBlobStoreManager; private BlobStoreManager mBlobStoreManager;
@@ -39,14 +46,18 @@ public class SharedDataPreferenceController extends DeveloperOptionsPreferenceCo
return SHARED_DATA; return SHARED_DATA;
} }
@Override
public boolean isAvailable() {
return mBlobStoreManager != null;
}
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
preference.setEnabled(mBlobStoreManager != null); try {
// TODO: update summary to indicate why this preference isn't available 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);
}
} }
} }

View File

@@ -22,8 +22,11 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.blob.BlobInfo;
import android.app.blob.BlobStoreManager; import android.app.blob.BlobStoreManager;
import android.app.blob.LeaseInfo;
import android.content.Context; import android.content.Context;
import android.os.UserHandle;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -38,6 +41,10 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ReflectionHelpers; 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 // TODO: add more detailed tests for the shared data screens
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class SharedDataPreferenceControllerTest { public class SharedDataPreferenceControllerTest {
@@ -63,8 +70,11 @@ public class SharedDataPreferenceControllerTest {
} }
@Test @Test
public void updateState_BlobManagerIsNotNull_preferenceIsEnabled() { public void updateState_BlobManagerIsNotNullAndBlobsExist_preferenceIsEnabled()
throws IOException {
ReflectionHelpers.setField(mController, "mBlobStoreManager", mBlobStoreManager); ReflectionHelpers.setField(mController, "mBlobStoreManager", mBlobStoreManager);
when(mBlobStoreManager.queryBlobsForUser(UserHandle.CURRENT))
.thenReturn(generateBlobList());
mController.updateState(mPreference); mController.updateState(mPreference);
verify(mPreference).setEnabled(true); verify(mPreference).setEnabled(true);
@@ -72,11 +82,38 @@ public class SharedDataPreferenceControllerTest {
.isEqualTo(mContext.getString(R.string.shared_data_summary)); .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 @Test
public void updateState_BlobManagerIsNull_preferenceIsDisabled() { public void updateState_BlobManagerIsNull_preferenceIsDisabled() {
ReflectionHelpers.setField(mController, "mBlobStoreManager", null); ReflectionHelpers.setField(mController, "mBlobStoreManager", null);
mController.updateState(mPreference); mController.updateState(mPreference);
verify(mPreference).setEnabled(false); verify(mPreference).setEnabled(false);
assertThat(mPreference.getSummary())
.isEqualTo(mContext.getString(R.string.shared_data_no_blobs_text));
}
private List<BlobInfo> 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<LeaseInfo> accessors = new ArrayList<>();
accessors.add(one);
accessors.add(two);
final List<BlobInfo> tmp = new ArrayList<>();
tmp.add(new BlobInfo(10, System.currentTimeMillis(), "testing blob 1", accessors));
return tmp;
} }
} }