Snap for 5007879 from ff6f6f6991 to qt-release

Change-Id: Icf470f3352cbece8bcfdc4a1ef83b8df91eeeb7a
This commit is contained in:
android-build-team Robot
2018-09-13 03:01:44 +00:00
21 changed files with 251 additions and 57 deletions

View File

@@ -23,8 +23,8 @@
android:id="@+id/master_clear_scrollview"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_marginStart="@dimen/preference_no_icon_padding_start"
android:layout_marginEnd="12dp"
android:layout_marginStart="@dimen/reset_master_clear_margin_start"
android:layout_marginEnd="@dimen/reset_master_clear_margin_end"
android:layout_marginTop="12dp"
android:layout_weight="1">
<LinearLayout

View File

@@ -23,8 +23,8 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_marginStart="@dimen/preference_no_icon_padding_start"
android:layout_marginEnd="12dp"
android:layout_marginStart="@dimen/reset_network_margin_start"
android:layout_marginEnd="@dimen/reset_network_margin_end"
android:layout_marginTop="12dp"
android:layout_weight="1">

View File

@@ -31,8 +31,8 @@
android:paddingTop="@dimen/screen_pinning_textview_padding"
android:text="@string/screen_pinning_description"
android:textAppearance="@style/TextAppearance.Medium"
android:paddingStart="@dimen/screen_margin_sides"
android:paddingEnd="@dimen/screen_margin_sides"
android:paddingStart="@dimen/screen_pinning_padding_start"
android:paddingEnd="@dimen/screen_pinning_padding_end"
/>
</ScrollView>

View File

@@ -29,4 +29,8 @@
<dimen name="confirm_credentials_top_padding">20dp</dimen>
<dimen name="confirm_credentials_top_margin">24dp</dimen>
<!-- Padding for screen pinning -->
<dimen name="screen_pinning_padding_start">128dp</dimen>
<dimen name="screen_pinning_padding_end">128dp</dimen>
</resources>

View File

@@ -62,4 +62,8 @@
<dimen name="confirm_credentials_top_padding">48dp</dimen>
<dimen name="confirm_credentials_side_margin">0dp</dimen>
<dimen name="confirm_credentials_top_margin">64dp</dimen>
<!-- Padding for screen pinning -->
<dimen name="screen_pinning_padding_start">40dp</dimen>
<dimen name="screen_pinning_padding_end">40dp</dimen>
</resources>

View File

@@ -18,4 +18,8 @@
<dimen name="screen_margin_sides">128dip</dimen>
<dimen name="datetime_margin_top">154dip</dimen>
<dimen name="datetime_margin_bottom">96dip</dimen>
<!-- Padding for screen pinning -->
<dimen name="screen_pinning_padding_start">128dp</dimen>
<dimen name="screen_pinning_padding_end">128dp</dimen>
</resources>

View File

@@ -297,6 +297,16 @@
<dimen name="battery_meter_width">66dp</dimen>
<dimen name="battery_meter_height">100dp</dimen>
<!-- Margin for the reset screens -->
<dimen name="reset_network_margin_start">72dp</dimen>
<dimen name="reset_network_margin_end">12dp</dimen>
<dimen name="reset_master_clear_margin_start">72dp</dimen>
<dimen name="reset_master_clear_margin_end">12dp</dimen>
<!-- Padding for screen pinning -->
<dimen name="screen_pinning_padding_start">64dp</dimen>
<dimen name="screen_pinning_padding_end">64dp</dimen>
<!-- Suggestion/condition header padding -->
<dimen name="suggestion_condition_header_padding_collapsed">10dp</dimen>
<dimen name="suggestion_condition_header_padding_expanded">5dp</dimen>

View File

@@ -541,10 +541,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
private DialogInterface.OnCancelListener mOnCancelListener;
private DialogInterface.OnDismissListener mOnDismissListener;
public SettingsDialogFragment() {
/* do nothing */
}
public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
super(fragment, dialogId);
if (!(fragment instanceof Fragment)) {

View File

@@ -185,16 +185,22 @@ public class AppInfoDashboardFragment extends DashboardFragment
mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
mPm = activity.getPackageManager();
if (!ensurePackageInfoAvailable(activity)) {
return;
}
startListeningToPackageRemove();
setHasOptionsMenu(true);
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
if (!ensurePackageInfoAvailable(getActivity())) {
return;
}
super.onCreatePreferences(savedInstanceState, rootKey);
}
@Override
public void onDestroy() {
stopListeningToPackageRemove();

View File

@@ -17,7 +17,6 @@
package com.android.settings.connecteddevice.usb;
import android.content.Context;
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import androidx.annotation.VisibleForTesting;
@@ -70,15 +69,6 @@ public class UsbDetailsFragment extends DashboardFragment {
return R.xml.usb_details_fragment;
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
}
public boolean isConnected() {
return mUsbReceiver.isConnected();
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mUsbBackend = new UsbBackend(context);

View File

@@ -20,7 +20,6 @@ package com.android.settings.core;
* This class keeps track of all feature flags in Settings.
*/
public class FeatureFlags {
public static final String BATTERY_DISPLAY_APP_LIST = "settings_battery_display_app_list";
public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving";
public static final String AUDIO_SWITCHER_SETTINGS = "settings_audio_switcher";
public static final String DYNAMIC_HOMEPAGE = "settings_dynamic_homepage";

View File

@@ -17,46 +17,58 @@
package com.android.settings.homepage;
import android.content.Context;
import android.database.Cursor;
import androidx.annotation.Nullable;
import com.android.settingslib.utils.AsyncLoaderCompat;
import java.util.ArrayList;
import java.util.List;
//TODO(b/112521307): Implement this to make it work with the card database.
public class CardContentLoader {
public class CardContentLoader extends AsyncLoaderCompat<List<ContextualCard>> {
static final int CARD_CONTENT_LOADER_ID = 1;
private static final String TAG = "CardContentLoader";
private CardContentLoaderListener mListener;
private Context mContext;
public interface CardContentLoaderListener {
void onFinishCardLoading(List<ContextualCard> contextualCards);
}
public CardContentLoader() {
CardContentLoader(Context context) {
super(context);
mContext = context.getApplicationContext();
}
void setListener(CardContentLoaderListener listener) {
mListener = listener;
@Override
protected void onDiscardResult(List<ContextualCard> result) {
}
private static class CardLoader extends AsyncLoaderCompat<List<ContextualCard>> {
public CardLoader(Context context) {
super(context);
@Nullable
@Override
public List<ContextualCard> loadInBackground() {
List<ContextualCard> result;
try (Cursor cursor = CardDatabaseHelper.getInstance(mContext).getAllContextualCards()) {
if (cursor.getCount() == 0) {
//TODO(b/113372471): Load Default static cards and return 3 static cards
return new ArrayList<>();
}
result = buildContextualCardList(cursor);
}
return result;
}
@Override
protected void onDiscardResult(List<ContextualCard> result) {
}
@Nullable
@Override
public List<ContextualCard> loadInBackground() {
return null;
private List<ContextualCard> buildContextualCardList(Cursor cursor) {
final List<ContextualCard> result = new ArrayList<>();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
final ContextualCard card = new ContextualCard(cursor);
if (card.isCustomCard()) {
//TODO(b/114688391): Load and generate custom card,then add into list
} else {
result.add(card);
}
}
return result;
}
}

View File

@@ -17,6 +17,7 @@
package com.android.settings.homepage;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
@@ -190,4 +191,12 @@ public class CardDatabaseHelper extends SQLiteOpenHelper {
}
return sCardDatabaseHelper;
}
Cursor getAllContextualCards() {
final SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(CARD_TABLE, null /* columns */, null /* selection */,
null /* selectionArgs */, null /* groupBy */, null /* having */,
null /* orderBy */);
return cursor;
}
}

View File

@@ -17,6 +17,7 @@
package com.android.settings.homepage;
import android.annotation.IntDef;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextUtils;
@@ -58,8 +59,8 @@ public class ContextualCard {
private final int mIconResId;
private final int mCardAction;
private final long mExpireTimeMS;
private final Drawable mIconDrawable;
private final boolean mIsHalfWidth;
private final Drawable mIconDrawable;
String getName() {
return mName;
@@ -137,6 +138,10 @@ public class ContextualCard {
return mIsHalfWidth;
}
boolean isCustomCard() {
return TextUtils.isEmpty(mSliceUri);
}
public ContextualCard(Builder builder) {
mName = builder.mName;
mCardType = builder.mCardType;
@@ -158,6 +163,31 @@ public class ContextualCard {
mIsHalfWidth = builder.mIsHalfWidth;
}
ContextualCard(Cursor c) {
mName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.NAME));
mCardType = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.TYPE));
mRankingScore = c.getDouble(c.getColumnIndex(CardDatabaseHelper.CardColumns.SCORE));
mSliceUri = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SLICE_URI));
mCategory = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CATEGORY));
mLocalizedToLocale = c.getString(
c.getColumnIndex(CardDatabaseHelper.CardColumns.LOCALIZED_TO_LOCALE));
mPackageName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.PACKAGE_NAME));
mAppVersion = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.APP_VERSION));
mTitleResName = c.getString(
c.getColumnIndex(CardDatabaseHelper.CardColumns.TITLE_RES_NAME));
mTitleText = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.TITLE_TEXT));
mSummaryResName = c.getString(
c.getColumnIndex(CardDatabaseHelper.CardColumns.SUMMARY_RES_NAME));
mSummaryText = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SUMMARY_TEXT));
mIconResName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.ICON_RES_NAME));
mIconResId = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.ICON_RES_ID));
mCardAction = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CARD_ACTION));
mExpireTimeMS = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.EXPIRE_TIME_MS));
mIsHalfWidth = (c.getInt(
c.getColumnIndex(CardDatabaseHelper.CardColumns.SUPPORT_HALF_WIDTH)) == 1);
mIconDrawable = null;
}
@Override
public int hashCode() {
return mName.hashCode();

View File

@@ -16,9 +16,17 @@
package com.android.settings.homepage;
import static com.android.settings.homepage.CardContentLoader.CARD_CONTENT_LOADER_ID;
import android.content.Context;
import android.os.Bundle;
import android.widget.BaseAdapter;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -60,9 +68,12 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade
mControllerRendererPool = new ControllerRendererPool();
}
void startCardContentLoading() {
final CardContentLoader cardContentLoader = new CardContentLoader();
cardContentLoader.setListener(this);
void startCardContentLoading(PersonalSettingsFragment fragment) {
final CardContentLoaderCallbacks cardContentLoaderCallbacks =
new CardContentLoaderCallbacks(mContext);
cardContentLoaderCallbacks.setListener(this);
LoaderManager.getInstance(fragment).initLoader(CARD_CONTENT_LOADER_ID, null /* bundle */,
cardContentLoaderCallbacks);
}
private void loadCardControllers() {
@@ -140,4 +151,43 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade
public ControllerRendererPool getControllerRendererPool() {
return mControllerRendererPool;
}
static class CardContentLoaderCallbacks implements
LoaderManager.LoaderCallbacks<List<ContextualCard>> {
private Context mContext;
private CardContentLoader.CardContentLoaderListener mListener;
CardContentLoaderCallbacks(Context context) {
mContext = context.getApplicationContext();
}
protected void setListener(CardContentLoader.CardContentLoaderListener listener) {
mListener = listener;
}
@NonNull
@Override
public Loader<List<ContextualCard>> onCreateLoader(int id, @Nullable Bundle bundle) {
if (id == CARD_CONTENT_LOADER_ID) {
return new CardContentLoader(mContext);
} else {
throw new IllegalArgumentException("Unknown loader id: " + id);
}
}
@Override
public void onLoadFinished(@NonNull Loader<List<ContextualCard>> loader,
List<ContextualCard> contextualCards) {
if (mListener != null) {
mListener.onFinishCardLoading(contextualCards);
}
}
@Override
public void onLoaderReset(@NonNull Loader<List<ContextualCard>> loader) {
}
}
}

View File

@@ -43,7 +43,7 @@ public class PersonalSettingsFragment extends InstrumentedFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContextualCardManager = new ContextualCardManager(getContext(), getSettingsLifecycle());
mContextualCardManager.startCardContentLoading();
mContextualCardManager.startCardContentLoading(this);
}
@Override

View File

@@ -15,12 +15,15 @@
*/
package com.android.settings.network;
import static android.provider.Settings.ACTION_DATA_USAGE_SETTINGS;
import static com.android.settings.network.MobilePlanPreferenceController
.MANAGE_MOBILE_PLAN_DIALOG_ID;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.icu.text.ListFormatter;
import android.provider.SearchIndexableResource;
import android.text.BidiFormatter;
@@ -45,6 +48,7 @@ import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.BooleanSupplier;
import java.util.List;
@SearchIndexable
@@ -158,24 +162,32 @@ public class NetworkDashboardFragment extends DashboardFragment implements
private final WifiMasterSwitchPreferenceController mWifiPreferenceController;
private final MobileNetworkPreferenceController mMobileNetworkPreferenceController;
private final TetherPreferenceController mTetherPreferenceController;
private final BooleanSupplier mHasDataUsageActivity;
public SummaryProvider(Context context, SummaryLoader summaryLoader) {
this(context, summaryLoader,
new WifiMasterSwitchPreferenceController(context, null),
new MobileNetworkPreferenceController(context),
new TetherPreferenceController(context, null /* lifecycle */));
new TetherPreferenceController(context, null /* lifecycle */),
() -> {
final Intent intent = new Intent(ACTION_DATA_USAGE_SETTINGS);
final PackageManager pm = context.getPackageManager();
return intent.resolveActivity(pm) != null;
});
}
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
SummaryProvider(Context context, SummaryLoader summaryLoader,
WifiMasterSwitchPreferenceController wifiPreferenceController,
MobileNetworkPreferenceController mobileNetworkPreferenceController,
TetherPreferenceController tetherPreferenceController) {
TetherPreferenceController tetherPreferenceController,
BooleanSupplier hasDataUsageActivity) {
mContext = context;
mSummaryLoader = summaryLoader;
mWifiPreferenceController = wifiPreferenceController;
mMobileNetworkPreferenceController = mobileNetworkPreferenceController;
mTetherPreferenceController = tetherPreferenceController;
mHasDataUsageActivity = hasDataUsageActivity;
}
@@ -198,7 +210,7 @@ public class NetworkDashboardFragment extends DashboardFragment implements
if (mMobileNetworkPreferenceController.isAvailable() && !TextUtils.isEmpty(mobileSummary)) {
summaries.add(mobileSummary);
}
if (!TextUtils.isEmpty(dataUsageSummary)) {
if (!TextUtils.isEmpty(dataUsageSummary) && mHasDataUsageActivity.getAsBoolean()) {
summaries.add(dataUsageSummary);
}
if (mTetherPreferenceController.isAvailable() && !TextUtils.isEmpty(hotspotSummary)) {

View File

@@ -964,9 +964,10 @@ public class UserSettings extends SettingsPreferenceFragment
mAddUserWhenLockedPreferenceController.getPreferenceKey());
mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen);
mMultiUserFooterPreferenceController.updateState(null /* preference */);
mAddUser.setVisible(mUserCaps.mCanAddUser && Utils.isDeviceProvisioned(context)
&& mUserCaps.mUserSwitcherEnabled);
mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled);
if (!mUserCaps.mUserSwitcherEnabled) {
mAddUser.setVisible(false);
return;
}

View File

@@ -170,7 +170,7 @@ public final class AppInfoDashboardFragmentTest {
}
@Test
public void launchFragment_hasNoPackageInfo_shouldFinish() {
public void ensurePackageInfoAvailable_hasNoPackageInfo_shouldFinish() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);
assertThat(mFragment.ensurePackageInfoAvailable(mActivity)).isFalse();
@@ -178,7 +178,7 @@ public final class AppInfoDashboardFragmentTest {
}
@Test
public void launchFragment_hasPackageInfo_shouldReturnTrue() {
public void ensurePackageInfoAvailable_hasPackageInfo_shouldReturnTrue() {
final PackageInfo packageInfo = mock(PackageInfo.class);
ReflectionHelpers.setField(mFragment, "mPackageInfo", packageInfo);
@@ -186,6 +186,16 @@ public final class AppInfoDashboardFragmentTest {
verify(mActivity, never()).finishAndRemoveTask();
}
@Test
public void createPreference_hasNoPackageInfo_shouldSkip() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);
mFragment.onCreatePreferences(new Bundle(), "root_key");
verify(mActivity).finishAndRemoveTask();
verify(mFragment, never()).getPreferenceScreen();
}
@Test
public void packageSizeChange_isOtherPackage_shouldNotRefreshUi() {
ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME);

View File

@@ -79,7 +79,7 @@ public class NetworkDashboardFragmentTest {
final SummaryLoader.SummaryProvider provider =
new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
wifiPreferenceController, mobileNetworkPreferenceController,
tetherPreferenceController);
tetherPreferenceController, () -> true);
provider.setListening(false);
@@ -107,7 +107,7 @@ public class NetworkDashboardFragmentTest {
final SummaryLoader.SummaryProvider provider =
new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
wifiPreferenceController, mobileNetworkPreferenceController,
tetherPreferenceController);
tetherPreferenceController, () -> true);
provider.setListening(false);
@@ -121,4 +121,34 @@ public class NetworkDashboardFragmentTest {
verify(summaryLoader).setSummary(provider, "Wi\u2011Fi and data usage");
}
@Test
public void summaryProviderSetListening_noDataUsageActivity_shouldReturnNoDataUsageSummary() {
final WifiMasterSwitchPreferenceController wifiPreferenceController =
mock(WifiMasterSwitchPreferenceController.class);
final MobileNetworkPreferenceController mobileNetworkPreferenceController =
mock(MobileNetworkPreferenceController.class);
final TetherPreferenceController tetherPreferenceController =
mock(TetherPreferenceController.class);
final SummaryLoader summaryLoader = mock(SummaryLoader.class);
final SummaryLoader.SummaryProvider provider =
new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
wifiPreferenceController, mobileNetworkPreferenceController,
tetherPreferenceController, () -> false);
provider.setListening(false);
verifyZeroInteractions(summaryLoader);
when(wifiPreferenceController.isAvailable()).thenReturn(true);
when(mobileNetworkPreferenceController.isAvailable()).thenReturn(true);
when(tetherPreferenceController.isAvailable()).thenReturn(true);
provider.setListening(true);
verify(summaryLoader).setSummary(provider, "Wi\u2011Fi, mobile, and hotspot");
}
}

View File

@@ -212,4 +212,31 @@ public class UserSettingsTest {
}
@Test
public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
final RestrictedPreference addUser = mock(RestrictedPreference.class);
mUserCapabilities.mCanAddUser = true;
mUserCapabilities.mDisallowAddUser = false;
mUserCapabilities.mUserSwitcherEnabled = true;
ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities);
ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable);
ReflectionHelpers.setField(mFragment, "mAddingUser", false);
mFragment.mMePreference = mMePreference;
mFragment.mUserListCategory = mock(PreferenceCategory.class);
mFragment.mAddUser = addUser;
doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen();
doReturn("Test summary").when(mFragment).getString(anyInt(), anyInt());
mFragment.updateUserList();
verify(addUser).setVisible(true);
}
}