Merge "[Output Switcher] Extract color from album"
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.systemui.media.dialog;
|
||||
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -23,8 +24,10 @@ import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.widget.CompoundButtonCompat;
|
||||
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.settingslib.media.LocalMediaManager.MediaDeviceState;
|
||||
@@ -100,8 +103,10 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
}
|
||||
mCheckBox.setVisibility(View.GONE);
|
||||
mStatusIcon.setVisibility(View.GONE);
|
||||
mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_inactive_item_main_content));
|
||||
mTitleText.setTextColor(mController.getColorInactiveItem());
|
||||
mSeekBar.getProgressDrawable().setColorFilter(
|
||||
new PorterDuffColorFilter(mController.getColorSeekbarProgress(),
|
||||
PorterDuff.Mode.SRC_IN));
|
||||
if (mCurrentActivePosition == position) {
|
||||
mCurrentActivePosition = -1;
|
||||
}
|
||||
@@ -117,6 +122,10 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
if (mController.isTransferring()) {
|
||||
if (device.getState() == MediaDeviceState.STATE_CONNECTING
|
||||
&& !mController.hasAdjustVolumeUserRestriction()) {
|
||||
mProgressBar.getIndeterminateDrawable().setColorFilter(
|
||||
new PorterDuffColorFilter(
|
||||
mController.getColorInactiveItem(),
|
||||
PorterDuff.Mode.SRC_IN));
|
||||
setSingleLineLayout(getItemTitle(device), true /* bFocused */,
|
||||
false /* showSeekBar*/,
|
||||
true /* showProgressBar */, false /* showStatus */);
|
||||
@@ -130,6 +139,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
mTitleIcon.setAlpha(DEVICE_CONNECTED_ALPHA);
|
||||
mStatusIcon.setImageDrawable(
|
||||
mContext.getDrawable(R.drawable.media_output_status_failed));
|
||||
mStatusIcon.setColorFilter(mController.getColorInactiveItem());
|
||||
setTwoLineLayout(device, false /* bFocused */,
|
||||
false /* showSeekBar */, false /* showProgressBar */,
|
||||
true /* showSubtitle */, true /* showStatus */);
|
||||
@@ -137,8 +147,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
mContainerLayout.setOnClickListener(v -> onItemClick(v, device));
|
||||
} else if (mController.getSelectedMediaDevice().size() > 1
|
||||
&& isDeviceIncluded(mController.getSelectedMediaDevice(), device)) {
|
||||
mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_active_item_main_content));
|
||||
mTitleText.setTextColor(mController.getColorActiveItem());
|
||||
setSingleLineLayout(getItemTitle(device), true /* bFocused */,
|
||||
true /* showSeekBar */,
|
||||
false /* showProgressBar */, false /* showStatus */);
|
||||
@@ -147,12 +156,13 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
mCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
onCheckBoxClicked(false, device);
|
||||
});
|
||||
setCheckBoxColor(mCheckBox, mController.getColorActiveItem());
|
||||
initSessionSeekbar();
|
||||
} else if (!mController.hasAdjustVolumeUserRestriction() && currentlyConnected) {
|
||||
mStatusIcon.setImageDrawable(
|
||||
mContext.getDrawable(R.drawable.media_output_status_check));
|
||||
mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_active_item_main_content));
|
||||
mStatusIcon.setColorFilter(mController.getColorActiveItem());
|
||||
mTitleText.setTextColor(mController.getColorActiveItem());
|
||||
setSingleLineLayout(getItemTitle(device), true /* bFocused */,
|
||||
true /* showSeekBar */,
|
||||
false /* showProgressBar */, true /* showStatus */);
|
||||
@@ -164,6 +174,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
mCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
onCheckBoxClicked(true, device);
|
||||
});
|
||||
setCheckBoxColor(mCheckBox, mController.getColorInactiveItem());
|
||||
setSingleLineLayout(getItemTitle(device), false /* bFocused */,
|
||||
false /* showSeekBar */,
|
||||
false /* showProgressBar */, false /* showStatus */);
|
||||
@@ -175,11 +186,17 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
public void setCheckBoxColor(CheckBox checkBox, int color) {
|
||||
int[][] states = {{android.R.attr.state_checked}, {}};
|
||||
int[] colors = {color, color};
|
||||
CompoundButtonCompat.setButtonTintList(checkBox, new
|
||||
ColorStateList(states, colors));
|
||||
}
|
||||
|
||||
@Override
|
||||
void onBind(int customizedItem, boolean topMargin, boolean bottomMargin) {
|
||||
if (customizedItem == CUSTOMIZED_ITEM_PAIR_NEW) {
|
||||
mTitleText.setTextColor(Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_inactive_item_main_content));
|
||||
mTitleText.setTextColor(mController.getColorInactiveItem());
|
||||
mCheckBox.setVisibility(View.GONE);
|
||||
setSingleLineLayout(mContext.getText(R.string.media_output_dialog_pairing_new),
|
||||
false /* bFocused */);
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.systemui.media.dialog;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.app.WallpaperColors;
|
||||
import android.content.Context;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
@@ -56,7 +57,7 @@ public abstract class MediaOutputBaseAdapter extends
|
||||
static final int CUSTOMIZED_ITEM_GROUP = 2;
|
||||
static final int CUSTOMIZED_ITEM_DYNAMIC_GROUP = 3;
|
||||
|
||||
final MediaOutputController mController;
|
||||
protected final MediaOutputController mController;
|
||||
|
||||
private int mMargin;
|
||||
private boolean mIsAnimating;
|
||||
@@ -84,6 +85,10 @@ public abstract class MediaOutputBaseAdapter extends
|
||||
return null;
|
||||
}
|
||||
|
||||
void updateColorScheme(WallpaperColors wallpaperColors, boolean isDarkTheme) {
|
||||
mController.setCurrentColorScheme(wallpaperColors, isDarkTheme);
|
||||
}
|
||||
|
||||
CharSequence getItemTitle(MediaDevice device) {
|
||||
return device.getName();
|
||||
}
|
||||
@@ -105,6 +110,10 @@ public abstract class MediaOutputBaseAdapter extends
|
||||
return mCurrentActivePosition;
|
||||
}
|
||||
|
||||
public MediaOutputController getController() {
|
||||
return mController;
|
||||
}
|
||||
|
||||
/**
|
||||
* ViewHolder for binding device view.
|
||||
*/
|
||||
|
||||
@@ -19,8 +19,14 @@ package com.android.systemui.media.dialog;
|
||||
import static android.view.WindowInsets.Type.navigationBars;
|
||||
import static android.view.WindowInsets.Type.statusBars;
|
||||
|
||||
import android.app.WallpaperColors;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
@@ -73,6 +79,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
|
||||
private Button mDoneButton;
|
||||
private Button mStopButton;
|
||||
private int mListMaxHeight;
|
||||
private WallpaperColors mWallpaperColors;
|
||||
|
||||
MediaOutputBaseAdapter mAdapter;
|
||||
|
||||
@@ -161,6 +168,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
|
||||
final int iconRes = getHeaderIconRes();
|
||||
final IconCompat iconCompat = getHeaderIcon();
|
||||
final Drawable appSourceDrawable = getAppSourceIcon();
|
||||
boolean colorSetUpdated = false;
|
||||
if (appSourceDrawable != null) {
|
||||
mAppResourceIcon.setImageDrawable(appSourceDrawable);
|
||||
} else {
|
||||
@@ -170,8 +178,24 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
|
||||
mHeaderIcon.setVisibility(View.VISIBLE);
|
||||
mHeaderIcon.setImageResource(iconRes);
|
||||
} else if (iconCompat != null) {
|
||||
Icon icon = iconCompat.toIcon(mContext);
|
||||
Configuration config = mContext.getResources().getConfiguration();
|
||||
int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
boolean isDarkThemeOn = currentNightMode == Configuration.UI_MODE_NIGHT_YES;
|
||||
WallpaperColors wallpaperColors = WallpaperColors.fromBitmap(icon.getBitmap());
|
||||
colorSetUpdated = !wallpaperColors.equals(mWallpaperColors);
|
||||
if (colorSetUpdated) {
|
||||
mAdapter.updateColorScheme(wallpaperColors, isDarkThemeOn);
|
||||
ColorFilter buttonColorFilter = new PorterDuffColorFilter(
|
||||
mAdapter.getController().getColorButtonBackground(),
|
||||
PorterDuff.Mode.SRC_IN);
|
||||
ColorFilter onlineButtonColorFilter = new PorterDuffColorFilter(
|
||||
mAdapter.getController().getColorInactiveItem(), PorterDuff.Mode.SRC_IN);
|
||||
mDoneButton.getBackground().setColorFilter(buttonColorFilter);
|
||||
mStopButton.getBackground().setColorFilter(onlineButtonColorFilter);
|
||||
}
|
||||
mHeaderIcon.setVisibility(View.VISIBLE);
|
||||
mHeaderIcon.setImageIcon(iconCompat.toIcon(mContext));
|
||||
mHeaderIcon.setImageIcon(icon);
|
||||
} else {
|
||||
mHeaderIcon.setVisibility(View.GONE);
|
||||
}
|
||||
@@ -194,7 +218,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
|
||||
}
|
||||
if (!mAdapter.isDragging() && !mAdapter.isAnimating()) {
|
||||
int currentActivePosition = mAdapter.getCurrentActivePosition();
|
||||
if (!deviceSetChanged && currentActivePosition >= 0
|
||||
if (!colorSetUpdated && !deviceSetChanged && currentActivePosition >= 0
|
||||
&& currentActivePosition < mAdapter.getItemCount()) {
|
||||
mAdapter.notifyItemChanged(currentActivePosition);
|
||||
} else {
|
||||
|
||||
@@ -19,10 +19,10 @@ package com.android.systemui.media.dialog;
|
||||
import static android.provider.Settings.ACTION_BLUETOOTH_PAIRING_SETTINGS;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.WallpaperColors;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
@@ -57,6 +57,7 @@ import com.android.settingslib.media.MediaDevice;
|
||||
import com.android.settingslib.utils.ThreadUtils;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.monet.ColorScheme;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
@@ -103,6 +104,11 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
|
||||
private MediaOutputMetricLogger mMetricLogger;
|
||||
private UiEventLogger mUiEventLogger;
|
||||
|
||||
private int mColorActiveItem;
|
||||
private int mColorInactiveItem;
|
||||
private int mColorSeekbarProgress;
|
||||
private int mColorButtonBackground;
|
||||
|
||||
@Inject
|
||||
public MediaOutputController(@NonNull Context context, String packageName,
|
||||
boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager
|
||||
@@ -125,6 +131,14 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
|
||||
mVolumeAdjustmentForRemoteGroupSessions = mContext.getResources().getBoolean(
|
||||
com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
|
||||
mDialogManager = dialogManager;
|
||||
mColorActiveItem = Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_active_item_main_content);
|
||||
mColorInactiveItem = Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_inactive_item_main_content);
|
||||
mColorSeekbarProgress = Utils.getColorStateListDefaultColor(mContext,
|
||||
android.R.color.system_accent1_200);
|
||||
mColorButtonBackground = Utils.getColorStateListDefaultColor(mContext,
|
||||
R.color.media_dialog_item_background);
|
||||
}
|
||||
|
||||
void start(@NonNull Callback cb) {
|
||||
@@ -264,13 +278,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
|
||||
}
|
||||
|
||||
void setColorFilter(Drawable drawable, boolean isActive) {
|
||||
final ColorStateList list =
|
||||
mContext.getResources().getColorStateList(
|
||||
isActive
|
||||
? R.color.media_dialog_active_item_main_content
|
||||
: R.color.media_dialog_inactive_item_main_content,
|
||||
mContext.getTheme());
|
||||
drawable.setColorFilter(new PorterDuffColorFilter(list.getDefaultColor(),
|
||||
drawable.setColorFilter(new PorterDuffColorFilter(isActive
|
||||
? mColorActiveItem : mColorInactiveItem,
|
||||
PorterDuff.Mode.SRC_IN));
|
||||
}
|
||||
|
||||
@@ -301,6 +310,38 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
|
||||
return null;
|
||||
}
|
||||
|
||||
void setCurrentColorScheme(WallpaperColors wallpaperColors, boolean isDarkTheme) {
|
||||
ColorScheme mCurrentColorScheme = new ColorScheme(wallpaperColors,
|
||||
isDarkTheme);
|
||||
if (isDarkTheme) {
|
||||
mColorActiveItem = mCurrentColorScheme.getNeutral1().get(10);
|
||||
mColorInactiveItem = mCurrentColorScheme.getAccent1().get(2);
|
||||
mColorSeekbarProgress = mCurrentColorScheme.getAccent1().get(3);
|
||||
mColorButtonBackground = mCurrentColorScheme.getAccent1().get(2);
|
||||
} else {
|
||||
mColorActiveItem = mCurrentColorScheme.getNeutral1().get(10);
|
||||
mColorInactiveItem = mCurrentColorScheme.getAccent1().get(7);
|
||||
mColorSeekbarProgress = mCurrentColorScheme.getAccent1().get(3);
|
||||
mColorButtonBackground = mCurrentColorScheme.getAccent2().get(1);
|
||||
}
|
||||
}
|
||||
|
||||
public int getColorActiveItem() {
|
||||
return mColorActiveItem;
|
||||
}
|
||||
|
||||
public int getColorInactiveItem() {
|
||||
return mColorInactiveItem;
|
||||
}
|
||||
|
||||
public int getColorSeekbarProgress() {
|
||||
return mColorSeekbarProgress;
|
||||
}
|
||||
|
||||
public int getColorButtonBackground() {
|
||||
return mColorButtonBackground;
|
||||
}
|
||||
|
||||
private void buildMediaDevices(List<MediaDevice> devices) {
|
||||
// For the first time building list, to make sure the top device is the connected device.
|
||||
if (mMediaDevices.isEmpty()) {
|
||||
|
||||
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.media.session.MediaSessionManager;
|
||||
import android.os.Bundle;
|
||||
@@ -99,7 +100,10 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void refresh_withIconCompat_iconIsVisible() {
|
||||
mIconCompat = mock(IconCompat.class);
|
||||
mIconCompat = IconCompat.createWithBitmap(
|
||||
Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888));
|
||||
when(mMediaOutputBaseAdapter.getController()).thenReturn(mMediaOutputController);
|
||||
|
||||
mMediaOutputBaseDialogImpl.refresh();
|
||||
final ImageView view = mMediaOutputBaseDialogImpl.mDialogView.requireViewById(
|
||||
R.id.header_icon);
|
||||
|
||||
Reference in New Issue
Block a user