diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 70dce8ff23b..a94801f1dfa 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -736,7 +736,7 @@ @@ -796,7 +796,7 @@ @@ -889,7 +889,7 @@ + android:icon="@drawable/ic_suggestion_night_display"> @@ -1628,7 +1628,7 @@ + android:icon="@drawable/ic_suggestion_security"> @@ -2635,7 +2635,7 @@ + android:icon="@drawable/ic_suggestion_wireless"> diff --git a/res/drawable/ic_suggestion_dnd.xml b/res/drawable/ic_suggestion_dnd.xml new file mode 100644 index 00000000000..816b148c406 --- /dev/null +++ b/res/drawable/ic_suggestion_dnd.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/res/drawable/ic_suggestion_night_display.xml b/res/drawable/ic_suggestion_night_display.xml new file mode 100644 index 00000000000..16cb04ef90b --- /dev/null +++ b/res/drawable/ic_suggestion_night_display.xml @@ -0,0 +1,25 @@ + + + + diff --git a/res/drawable/ic_suggestion_security.xml b/res/drawable/ic_suggestion_security.xml new file mode 100644 index 00000000000..e2d3a90e962 --- /dev/null +++ b/res/drawable/ic_suggestion_security.xml @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/ic_suggestion_wallpaper.xml b/res/drawable/ic_suggestion_wallpaper.xml new file mode 100644 index 00000000000..32defcecdc1 --- /dev/null +++ b/res/drawable/ic_suggestion_wallpaper.xml @@ -0,0 +1,25 @@ + + + + diff --git a/res/drawable/ic_suggestion_wireless.xml b/res/drawable/ic_suggestion_wireless.xml new file mode 100644 index 00000000000..74b4cee4cdf --- /dev/null +++ b/res/drawable/ic_suggestion_wireless.xml @@ -0,0 +1,25 @@ + + + + diff --git a/res/layout/apps_filter_spinner.xml b/res/layout/apps_filter_spinner.xml index c9b1e074078..50f0fde26c7 100644 --- a/res/layout/apps_filter_spinner.xml +++ b/res/layout/apps_filter_spinner.xml @@ -18,7 +18,8 @@ + android:layout_height="wrap_content" + android:background="@android:color/transparent"> + android:layout_height="@dimen/homepage_card_icon_size"/> - - + android:layout_height="match_parent" + android:orientation="vertical" + android:visibility="gone"> - + android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:clipToPadding="false" + settings:fastScrollEnabled="true" + settings:fastScrollHorizontalThumbDrawable="@drawable/thumb_drawable" + settings:fastScrollHorizontalTrackDrawable="@drawable/line_drawable" + settings:fastScrollVerticalThumbDrawable="@drawable/thumb_drawable" + settings:fastScrollVerticalTrackDrawable="@drawable/line_drawable"/> - + - + - + - + - - - - - + 0 ? width : 1, + height > 0 ? height : 1); } + return IconCompat.createWithBitmap(bitmap); + } - final Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + private static Bitmap createBitmap(Drawable drawable, int width, int height) { + final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 816b44aed6a..a9de206a0da 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -186,7 +186,6 @@ public class ManageApplications extends InstrumentedFragment private View mLoadingContainer; private View mListContainer; - private RecyclerView mRecyclerView; private SearchView mSearchView; // Size resource used for packages whose size computation failed for some reason @@ -220,7 +219,7 @@ public class ManageApplications extends InstrumentedFragment @VisibleForTesting FilterSpinnerAdapter mFilterAdapter; @VisibleForTesting - View mContentContainer; + RecyclerView mRecyclerView; private View mRootView; private Spinner mFilterSpinner; @@ -330,7 +329,6 @@ public class ManageApplications extends InstrumentedFragment Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.manage_applications_apps, null); mLoadingContainer = mRootView.findViewById(R.id.loading_container); - mContentContainer = mRootView.findViewById(R.id.content_container); mListContainer = mRootView.findViewById(R.id.list_container); if (mListContainer != null) { // Create adapter and list view here @@ -861,14 +859,14 @@ public class ManageApplications extends InstrumentedFragment // overlapped by floating filter. if (hasFilter) { mManageApplications.mSpinnerHeader.setVisibility(View.VISIBLE); - mManageApplications.mContentContainer.setPadding(0 /* left */, + mManageApplications.mRecyclerView.setPadding(0 /* left */, mContext.getResources().getDimensionPixelSize( R.dimen.app_bar_height) /* top */, 0 /* right */, 0 /* bottom */); } else { mManageApplications.mSpinnerHeader.setVisibility(View.GONE); - mManageApplications.mContentContainer.setPadding(0 /* left */, 0 /* top */, + mManageApplications.mRecyclerView.setPadding(0 /* left */, 0 /* top */, 0 /* right */, 0 /* bottom */); } diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java index 0156ac61d0c..95412a8b44e 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java @@ -214,7 +214,7 @@ public class BluetoothDevicesSlice implements CustomSliceable { .getBtClassDrawableWithDescription(mContext, device); if (pair.first != null) { - return IconCompat.createWithBitmap(Utils.drawableToBitmap(pair.first)); + return Utils.createIconWithDrawable(pair.first); } else { return IconCompat.createWithResource(mContext, com.android.internal.R.drawable.ic_settings_bluetooth); diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java index 692dc0a9b95..c2c2ecea601 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java @@ -30,9 +30,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -243,7 +240,7 @@ public class NotificationChannelSlice implements CustomSliceable { return null; } - return IconCompat.createWithBitmap(Utils.drawableToBitmap(drawable)); + return Utils.createIconWithDrawable(drawable); } @VisibleForTesting diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java index 5c5eb8823c1..d52b441f9e0 100644 --- a/src/com/android/settings/media/MediaOutputSlice.java +++ b/src/com/android/settings/media/MediaOutputSlice.java @@ -23,8 +23,6 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.UserHandle; @@ -87,7 +85,7 @@ public class MediaOutputSlice implements CustomSliceable { final Drawable drawable = Utils.getBadgedIcon(mIconDrawableFactory, pm, mPackageName, UserHandle.myUserId()); - final IconCompat icon = IconCompat.createWithBitmap(getBitmapFromDrawable(drawable)); + final IconCompat icon = Utils.createIconWithDrawable(drawable); @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext); final SliceAction primarySliceAction = SliceAction.createDeeplink(getPrimaryAction(), icon, @@ -134,17 +132,6 @@ public class MediaOutputSlice implements CustomSliceable { return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */); } - private Bitmap getBitmapFromDrawable(Drawable drawable) { - final Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(bitmap); - - drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); - drawable.draw(canvas); - - return bitmap; - } - private ListBuilder.RowBuilder getMediaDeviceRow(MediaDevice device) { final String title = device.getName(); final PendingIntent broadcastAction = diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java index f678e08032a..de54879abc2 100644 --- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java +++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java @@ -22,21 +22,21 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.provider.Settings; +import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + import androidx.annotation.VisibleForTesting; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; -import com.android.settings.core.TogglePreferenceController; -import com.android.settingslib.core.lifecycle.LifecycleObserver; -import com.android.settingslib.core.lifecycle.events.OnStart; -import com.android.settingslib.core.lifecycle.events.OnStop; - /** * Preference controller for "Mobile data" */ @@ -115,8 +115,18 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon @Override public boolean isChecked() { - return mTelephonyManager.isDataEnabled() - && mSubId == SubscriptionManager.getDefaultDataSubscriptionId(); + return mTelephonyManager.isDataEnabled(); + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + preference.setEnabled(!isOpportunistic()); + } + + private boolean isOpportunistic() { + SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(mSubId); + return info != null && info.isOpportunistic(); } public static Uri getObservableUri(int subId) { diff --git a/src/com/android/settings/wifi/slice/ContextualWifiSlice.java b/src/com/android/settings/wifi/slice/ContextualWifiSlice.java index 7a6d1fa5480..5761ae59c77 100644 --- a/src/com/android/settings/wifi/slice/ContextualWifiSlice.java +++ b/src/com/android/settings/wifi/slice/ContextualWifiSlice.java @@ -90,7 +90,7 @@ public class ContextualWifiSlice extends WifiSlice { } d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); - return IconCompat.createWithBitmap(Utils.drawableToBitmap(d)); + return Utils.createIconWithDrawable(d); } @Override diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index c10e0d64df9..37186cad8b1 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -34,6 +34,11 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.VectorDrawable; import android.net.ConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; @@ -48,6 +53,8 @@ import android.util.IconDrawableFactory; import android.widget.EditText; import android.widget.TextView; +import androidx.core.graphics.drawable.IconCompat; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -96,7 +103,7 @@ public class UtilsTest { } @Test - public void testGetWifiIpAddresses_succeeds() throws Exception { + public void getWifiIpAddresses_succeeds() throws Exception { when(wifiManager.getCurrentNetwork()).thenReturn(network); LinkAddress address = new LinkAddress(InetAddress.getByName("127.0.0.1"), 0); LinkProperties lp = new LinkProperties(); @@ -107,7 +114,7 @@ public class UtilsTest { } @Test - public void testGetWifiIpAddresses_nullLinkProperties() { + public void getWifiIpAddresses_nullLinkProperties() { when(wifiManager.getCurrentNetwork()).thenReturn(network); // Explicitly set the return value to null for readability sake. when(connectivityManager.getLinkProperties(network)).thenReturn(null); @@ -116,7 +123,7 @@ public class UtilsTest { } @Test - public void testGetWifiIpAddresses_nullNetwork() { + public void getWifiIpAddresses_nullNetwork() { // Explicitly set the return value to null for readability sake. when(wifiManager.getCurrentNetwork()).thenReturn(null); @@ -124,7 +131,7 @@ public class UtilsTest { } @Test - public void testInitializeVolumeDoesntBreakOnNullVolume() { + public void initializeVolumeDoesntBreakOnNullVolume() { VolumeInfo info = new VolumeInfo("id", 0, new DiskInfo("id", 0), ""); StorageManager storageManager = mock(StorageManager.class, RETURNS_DEEP_STUBS); when(storageManager.findVolumeById(anyString())).thenReturn(info); @@ -133,13 +140,13 @@ public class UtilsTest { } @Test - public void testGetInstallationStatus_notInstalled_shouldReturnUninstalled() { + public void getInstallationStatus_notInstalled_shouldReturnUninstalled() { assertThat(Utils.getInstallationStatus(new ApplicationInfo())) .isEqualTo(R.string.not_installed); } @Test - public void testGetInstallationStatus_enabled_shouldReturnInstalled() { + public void getInstallationStatus_enabled_shouldReturnInstalled() { final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = true; @@ -148,7 +155,7 @@ public class UtilsTest { } @Test - public void testGetInstallationStatus_disabled_shouldReturnDisabled() { + public void getInstallationStatus_disabled_shouldReturnDisabled() { final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = false; @@ -157,7 +164,7 @@ public class UtilsTest { } @Test - public void testIsProfileOrDeviceOwner_deviceOwnerApp_returnTrue() { + public void isProfileOrDeviceOwner_deviceOwnerApp_returnTrue() { when(mDevicePolicyManager.isDeviceOwnerAppOnAnyUser(PACKAGE_NAME)).thenReturn(true); assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager, PACKAGE_NAME)) @@ -165,7 +172,7 @@ public class UtilsTest { } @Test - public void testIsProfileOrDeviceOwner_profileOwnerApp_returnTrue() { + public void isProfileOrDeviceOwner_profileOwnerApp_returnTrue() { final List userInfos = new ArrayList<>(); userInfos.add(new UserInfo()); @@ -178,7 +185,7 @@ public class UtilsTest { } @Test - public void testSetEditTextCursorPosition_shouldGetExpectedEditTextLenght() { + public void setEditTextCursorPosition_shouldGetExpectedEditTextLenght() { final EditText editText = new EditText(mContext); final CharSequence text = "test"; editText.setText(text, TextView.BufferType.EDITABLE); @@ -189,7 +196,36 @@ public class UtilsTest { } @Test - public void testGetBadgedIcon_usePackageNameAndUserId() + public void createIconWithDrawable_BitmapDrawable() { + final Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + final BitmapDrawable drawable = new BitmapDrawable(mContext.getResources(), bitmap); + + final IconCompat icon = Utils.createIconWithDrawable(drawable); + + assertThat(icon.getBitmap()).isNotNull(); + } + + @Test + public void createIconWithDrawable_ColorDrawable() { + final ColorDrawable drawable = new ColorDrawable(Color.BLACK); + + final IconCompat icon = Utils.createIconWithDrawable(drawable); + + assertThat(icon.getBitmap()).isNotNull(); + } + + @Test + public void createIconWithDrawable_VectorDrawable() { + final VectorDrawable drawable = VectorDrawable.create(mContext.getResources(), + R.drawable.ic_settings_accent); + + final IconCompat icon = Utils.createIconWithDrawable(drawable); + + assertThat(icon.getBitmap()).isNotNull(); + } + + @Test + public void getBadgedIcon_usePackageNameAndUserId() throws PackageManager.NameNotFoundException { doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfoAsUser( PACKAGE_NAME, PackageManager.GET_META_DATA, USER_ID); diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java index 27aeccc933d..419fc4917b5 100644 --- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java +++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java @@ -466,27 +466,27 @@ public class ManageApplicationsTest { @Test public void updateFilterView_hasFilterSet_shouldShowFilterAndHavePaddingTop() { - mFragment.mContentContainer = new View(mContext); + mFragment.mRecyclerView = new RecyclerView(mContext); mFragment.mSpinnerHeader = new View(mContext); mFragment.mFilterAdapter = new ManageApplications.FilterSpinnerAdapter(mFragment); mFragment.mFilterAdapter.updateFilterView(true); assertThat(mFragment.mSpinnerHeader.getVisibility()).isEqualTo(View.VISIBLE); - assertThat(mFragment.mContentContainer.getPaddingTop()).isEqualTo( + assertThat(mFragment.mRecyclerView.getPaddingTop()).isEqualTo( mContext.getResources().getDimensionPixelSize(R.dimen.app_bar_height)); } @Test public void updateFilterView_noFilterSet_shouldHideFilterAndNoPaddingTop() { - mFragment.mContentContainer = new View(mContext); + mFragment.mRecyclerView = new RecyclerView(mContext); mFragment.mSpinnerHeader = new View(mContext); mFragment.mFilterAdapter = new ManageApplications.FilterSpinnerAdapter(mFragment); mFragment.mFilterAdapter.updateFilterView(false); assertThat(mFragment.mSpinnerHeader.getVisibility()).isEqualTo(View.GONE); - assertThat(mFragment.mContentContainer.getPaddingTop()).isEqualTo(0); + assertThat(mFragment.mRecyclerView.getPaddingTop()).isEqualTo(0); } private void setUpOptionMenus() { diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java index 4c242c147d0..1b7b4b47fc3 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java @@ -149,4 +149,23 @@ public class MobileDataPreferenceControllerTest { verify(mTelephonyManager).setDataEnabled(true); } + + @Test + public void isChecked_returnUserDataEnabled() { + mController.init(mFragmentManager, SUB_ID); + assertThat(mController.isChecked()).isFalse(); + + doReturn(true).when(mTelephonyManager).isDataEnabled(); + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void updateState_opportunistic_disabled() { + doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID); + mController.init(mFragmentManager, SUB_ID); + doReturn(true).when(mSubscriptionInfo).isOpportunistic(); + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isFalse(); + } } diff --git a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java index a57fefc1370..bd2ce1e56cf 100644 --- a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java +++ b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java @@ -22,14 +22,11 @@ import static org.mockito.Mockito.mock; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.util.Size; -import com.android.settings.R; - import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.RGBLuminanceSource;