Loading src/com/android/settings/Utils.java +16 −0 Original line number Diff line number Diff line Loading @@ -958,6 +958,22 @@ public final class Utils extends com.android.settingslib.Utils { return new BitmapDrawable(null, bitmap); } /** * Converts the {@link Drawable} to a {@link Bitmap}. */ public static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable)drawable).getBitmap(); } 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; } /** * Get the {@link Drawable} that represents the app icon */ Loading src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java +1 −15 Original line number Diff line number Diff line Loading @@ -21,9 +21,6 @@ import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; Loading Loading @@ -84,17 +81,6 @@ public class BluetoothDevicesSlice implements CustomSliceable { mContext = context; } private static Bitmap getBitmapFromVectorDrawable(Drawable VectorDrawable) { final Bitmap bitmap = Bitmap.createBitmap(VectorDrawable.getIntrinsicWidth(), VectorDrawable.getIntrinsicHeight(), Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); VectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); VectorDrawable.draw(canvas); return bitmap; } @Override public Uri getUri() { return CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI; Loading Loading @@ -234,7 +220,7 @@ public class BluetoothDevicesSlice implements CustomSliceable { .getBtClassDrawableWithDescription(mContext, device); if (pair.first != null) { return IconCompat.createWithBitmap(getBitmapFromVectorDrawable(pair.first)); return IconCompat.createWithBitmap(Utils.drawableToBitmap(pair.first)); } else { return IconCompat.createWithResource(mContext, com.android.internal.R.drawable.ic_settings_bluetooth); Loading src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java +1 −15 Original line number Diff line number Diff line Loading @@ -142,20 +142,6 @@ public class NotificationChannelSlice implements CustomSliceable { mNotificationBackend = new NotificationBackend(); } private static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } 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; } @Override public Slice getSlice() { final ListBuilder listBuilder = Loading Loading @@ -257,7 +243,7 @@ public class NotificationChannelSlice implements CustomSliceable { return null; } return IconCompat.createWithBitmap(drawableToBitmap(drawable)); return IconCompat.createWithBitmap(Utils.drawableToBitmap(drawable)); } @VisibleForTesting Loading src/com/android/settings/wifi/slice/ContextualWifiSlice.java +39 −0 Original line number Diff line number Diff line Loading @@ -16,17 +16,26 @@ package com.android.settings.wifi.slice; import android.annotation.ColorInt; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.NetworkInfo.State; import android.net.Uri; import android.net.wifi.WifiSsid; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; import com.android.settingslib.wifi.AccessPoint; /** * {@link CustomSliceable} for Wi-Fi, used by contextual homepage. Loading Loading @@ -56,6 +65,36 @@ public class ContextualWifiSlice extends WifiSlice { // keep showing this card to keep UI stable, even if wifi connects to a network later. mPreviouslyDisplayed = true; // Reload theme for switching dark mode on/off mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */); return super.getSlice(); } @Override protected IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) { final Drawable d = mContext.getDrawable( com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); @ColorInt int color; if (accessPoint.isActive()) { final State state = accessPoint.getNetworkInfo().getState(); if (state == State.CONNECTED) { color = Utils.getColorAccentDefaultColor(mContext); } else { // connecting color = Utils.getDisabled(mContext, Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal)); } } else { color = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal); } d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); return IconCompat.createWithBitmap(Utils.drawableToBitmap(d)); } @Override protected int getSliceAccentColor() { return -1; } } src/com/android/settings/wifi/slice/WifiSlice.java +16 −13 Original line number Diff line number Diff line Loading @@ -64,8 +64,8 @@ public class WifiSlice implements CustomSliceable { @VisibleForTesting static final int DEFAULT_EXPANDED_ROW_COUNT = 3; protected final Context mContext; protected final WifiManager mWifiManager; private final Context mContext; public WifiSlice(Context context) { mContext = context; Loading @@ -85,7 +85,7 @@ public class WifiSlice implements CustomSliceable { R.drawable.ic_settings_wireless); final String title = mContext.getString(R.string.wifi_settings); final CharSequence summary = getSummary(); @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext); @ColorInt final int color = getSliceAccentColor(); final PendingIntent toggleAction = getBroadcastIntent(mContext); final PendingIntent primaryAction = getPrimaryAction(); final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon, Loading Loading @@ -120,29 +120,22 @@ public class WifiSlice implements CustomSliceable { listBuilder.addRow(getAccessPointRow(results.get(i))); } else if (needLoadingRow) { listBuilder.addRow(new ListBuilder.RowBuilder() .setTitle(mContext.getText(R.string.wifi_empty_list_wifi_on)) .setSubtitle(placeholder)); .setTitle(mContext.getText(R.string.wifi_empty_list_wifi_on))); needLoadingRow = false; } else { listBuilder.addRow(new ListBuilder.RowBuilder() .setTitle(placeholder) .setSubtitle(placeholder)); .setTitle(placeholder)); } } return listBuilder.build(); } private ListBuilder.RowBuilder getAccessPointRow(AccessPoint accessPoint) { final String title = accessPoint.getConfigName(); final IconCompat levelIcon = IconCompat.createWithResource(mContext, com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); final CharSequence apSummary = accessPoint.getSettingsSummary(); final CharSequence title = accessPoint.getConfigName(); final IconCompat levelIcon = getAccessPointLevelIcon(accessPoint); final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE) .setTitle(title) .setSubtitle(!TextUtils.isEmpty(apSummary) ? apSummary : null) .setPrimaryAction(SliceAction.create( getAccessPointAction(accessPoint), levelIcon, ListBuilder.ICON_IMAGE, title)); Loading @@ -154,6 +147,16 @@ public class WifiSlice implements CustomSliceable { return rowBuilder; } protected IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) { return IconCompat.createWithResource(mContext, com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); } @ColorInt protected int getSliceAccentColor() { return Utils.getColorAccentDefaultColor(mContext); } private IconCompat getEndIcon(AccessPoint accessPoint) { if (accessPoint.isActive()) { return IconCompat.createWithResource(mContext, R.drawable.ic_settings); Loading Loading
src/com/android/settings/Utils.java +16 −0 Original line number Diff line number Diff line Loading @@ -958,6 +958,22 @@ public final class Utils extends com.android.settingslib.Utils { return new BitmapDrawable(null, bitmap); } /** * Converts the {@link Drawable} to a {@link Bitmap}. */ public static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable)drawable).getBitmap(); } 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; } /** * Get the {@link Drawable} that represents the app icon */ Loading
src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java +1 −15 Original line number Diff line number Diff line Loading @@ -21,9 +21,6 @@ import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; Loading Loading @@ -84,17 +81,6 @@ public class BluetoothDevicesSlice implements CustomSliceable { mContext = context; } private static Bitmap getBitmapFromVectorDrawable(Drawable VectorDrawable) { final Bitmap bitmap = Bitmap.createBitmap(VectorDrawable.getIntrinsicWidth(), VectorDrawable.getIntrinsicHeight(), Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); VectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); VectorDrawable.draw(canvas); return bitmap; } @Override public Uri getUri() { return CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI; Loading Loading @@ -234,7 +220,7 @@ public class BluetoothDevicesSlice implements CustomSliceable { .getBtClassDrawableWithDescription(mContext, device); if (pair.first != null) { return IconCompat.createWithBitmap(getBitmapFromVectorDrawable(pair.first)); return IconCompat.createWithBitmap(Utils.drawableToBitmap(pair.first)); } else { return IconCompat.createWithResource(mContext, com.android.internal.R.drawable.ic_settings_bluetooth); Loading
src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java +1 −15 Original line number Diff line number Diff line Loading @@ -142,20 +142,6 @@ public class NotificationChannelSlice implements CustomSliceable { mNotificationBackend = new NotificationBackend(); } private static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } 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; } @Override public Slice getSlice() { final ListBuilder listBuilder = Loading Loading @@ -257,7 +243,7 @@ public class NotificationChannelSlice implements CustomSliceable { return null; } return IconCompat.createWithBitmap(drawableToBitmap(drawable)); return IconCompat.createWithBitmap(Utils.drawableToBitmap(drawable)); } @VisibleForTesting Loading
src/com/android/settings/wifi/slice/ContextualWifiSlice.java +39 −0 Original line number Diff line number Diff line Loading @@ -16,17 +16,26 @@ package com.android.settings.wifi.slice; import android.annotation.ColorInt; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.NetworkInfo.State; import android.net.Uri; import android.net.wifi.WifiSsid; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; import com.android.settingslib.wifi.AccessPoint; /** * {@link CustomSliceable} for Wi-Fi, used by contextual homepage. Loading Loading @@ -56,6 +65,36 @@ public class ContextualWifiSlice extends WifiSlice { // keep showing this card to keep UI stable, even if wifi connects to a network later. mPreviouslyDisplayed = true; // Reload theme for switching dark mode on/off mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */); return super.getSlice(); } @Override protected IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) { final Drawable d = mContext.getDrawable( com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); @ColorInt int color; if (accessPoint.isActive()) { final State state = accessPoint.getNetworkInfo().getState(); if (state == State.CONNECTED) { color = Utils.getColorAccentDefaultColor(mContext); } else { // connecting color = Utils.getDisabled(mContext, Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal)); } } else { color = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal); } d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); return IconCompat.createWithBitmap(Utils.drawableToBitmap(d)); } @Override protected int getSliceAccentColor() { return -1; } }
src/com/android/settings/wifi/slice/WifiSlice.java +16 −13 Original line number Diff line number Diff line Loading @@ -64,8 +64,8 @@ public class WifiSlice implements CustomSliceable { @VisibleForTesting static final int DEFAULT_EXPANDED_ROW_COUNT = 3; protected final Context mContext; protected final WifiManager mWifiManager; private final Context mContext; public WifiSlice(Context context) { mContext = context; Loading @@ -85,7 +85,7 @@ public class WifiSlice implements CustomSliceable { R.drawable.ic_settings_wireless); final String title = mContext.getString(R.string.wifi_settings); final CharSequence summary = getSummary(); @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext); @ColorInt final int color = getSliceAccentColor(); final PendingIntent toggleAction = getBroadcastIntent(mContext); final PendingIntent primaryAction = getPrimaryAction(); final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon, Loading Loading @@ -120,29 +120,22 @@ public class WifiSlice implements CustomSliceable { listBuilder.addRow(getAccessPointRow(results.get(i))); } else if (needLoadingRow) { listBuilder.addRow(new ListBuilder.RowBuilder() .setTitle(mContext.getText(R.string.wifi_empty_list_wifi_on)) .setSubtitle(placeholder)); .setTitle(mContext.getText(R.string.wifi_empty_list_wifi_on))); needLoadingRow = false; } else { listBuilder.addRow(new ListBuilder.RowBuilder() .setTitle(placeholder) .setSubtitle(placeholder)); .setTitle(placeholder)); } } return listBuilder.build(); } private ListBuilder.RowBuilder getAccessPointRow(AccessPoint accessPoint) { final String title = accessPoint.getConfigName(); final IconCompat levelIcon = IconCompat.createWithResource(mContext, com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); final CharSequence apSummary = accessPoint.getSettingsSummary(); final CharSequence title = accessPoint.getConfigName(); final IconCompat levelIcon = getAccessPointLevelIcon(accessPoint); final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE) .setTitle(title) .setSubtitle(!TextUtils.isEmpty(apSummary) ? apSummary : null) .setPrimaryAction(SliceAction.create( getAccessPointAction(accessPoint), levelIcon, ListBuilder.ICON_IMAGE, title)); Loading @@ -154,6 +147,16 @@ public class WifiSlice implements CustomSliceable { return rowBuilder; } protected IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) { return IconCompat.createWithResource(mContext, com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel())); } @ColorInt protected int getSliceAccentColor() { return Utils.getColorAccentDefaultColor(mContext); } private IconCompat getEndIcon(AccessPoint accessPoint) { if (accessPoint.isActive()) { return IconCompat.createWithResource(mContext, R.drawable.ic_settings); Loading