package me.barrasso.android.volume.popup;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.graphics.PixelFormat;
import android.widget.SeekBar;
import static me.barrasso.android.volume.LogUtils.LOGD;
import static me.barrasso.android.volume.LogUtils.LOGI;
import me.barrasso.android.volume.R;
import me.barrasso.android.volume.media.StreamResources;
import me.barrasso.android.volume.media.VolumePanelInfo;
import me.barrasso.android.volume.ui.MaxWidthLinearLayout;
import me.barrasso.android.volume.ui.transition.TransitionCompat;
import me.barrasso.android.volume.utils.SettingsHelper;
import me.barrasso.android.volume.utils.Utils;
/**
* Simplest {@link VolumePanel} that covers the system status bar with a
* black strip that includes the active volume_3 stream icon and a {@link android.widget.ProgressBar},
* but does not accept user interaction.
*/
public class StatusBarVolumePanel extends VolumePanel {
public static final String TAG = StatusBarVolumePanel.class.getSimpleName();
public static final VolumePanelInfo<StatusBarVolumePanel> VOLUME_PANEL_INFO =
new VolumePanelInfo<StatusBarVolumePanel>(StatusBarVolumePanel.class);
public StatusBarVolumePanel(PopupWindowManager pWindowManager) {
super(pWindowManager);
}
ViewGroup sliderGroup;
ViewGroup root;
ImageView icon;
ProgressBar seekBar;
@Override
public void onCreate() {
super.onCreate();
LayoutInflater inflater = LayoutInflater.from(getContext());
root = (ViewGroup) inflater.inflate(R.layout.sb_volume_adjust, null);
sliderGroup = (ViewGroup) root.findViewById(R.id.slider_group);
seekBar = (ProgressBar) root.findViewById(android.R.id.progress);
icon = (ImageView) root.findViewById(R.id.stream_icon);
toggleSeekBar(seek);
SettingsHelper settingsHelper = SettingsHelper.getInstance(getContext());
setStretch(settingsHelper.getProperty(VolumePanel.class, STRETCH, stretch));
if ((sliderGroup instanceof MaxWidthLinearLayout) && stretch) {
((MaxWidthLinearLayout) sliderGroup).setMaxWidth(0);
}
// When the stream icon is clicked, launch sound settings.
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
hide();
Intent volumeSettings = new Intent(Settings.ACTION_SOUND_SETTINGS);
startActivity(volumeSettings);
}
});
// KitKat+ add support for default transitions.
TransitionCompat transition = TransitionCompat.get();
transition.beginDelayedTransition((ViewGroup) root.findViewById(R.id.slider_group));
mLayout = root;
}
@Override public void setColor(final int newColor) {
super.setColor(newColor);
toggleSeekBar(seek);
}
@Override public void setSeek(final boolean shouldSeek) {
super.setSeek(shouldSeek);
toggleSeekBar(shouldSeek);
}
protected void toggleSeekBar(final boolean shouldSeek) {
// If we've got a SeekBar, handle seeking!
if (seekBar instanceof SeekBar) {
SeekBar seeker = (SeekBar) seekBar;
seeker.setOnSeekBarChangeListener((shouldSeek) ? this : null);
seeker.setOnTouchListener((shouldSeek) ? null : noTouchListener);
Drawable thumb = null;
if (shouldSeek) {
thumb = getResources().getDrawable(R.drawable.scrubber_control_selector_mini);
thumb.mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
thumb.setBounds(0, 0, thumb.getIntrinsicWidth(), thumb.getIntrinsicHeight());
}
seeker.setThumb(thumb);
// NOTE: there's so weird issue with setting the thumb dynamically.
// This seems to do the trick (fingers crossed).
Utils.tap((View) seeker.getParent());
seeker.invalidate();
}
}
@Override
public void onStreamVolumeChange(int streamType, int volume, int max) {
// Update the icon & progress based on the volume_3 change.
StreamResources resources = StreamResources.resourceForStreamType(streamType);
resources.setVolume(volume);
LOGD(TAG, "onStreamVolumeChange(" + streamType + ", " + volume + ", " + max + ")");
// Figure out what resource and icon to use.
int iconRes = ((volume <= 0) ? resources.getIconMuteRes() : resources.getIconRes());
Drawable drawable = getResources().getDrawable(iconRes);
drawable.mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
LayerDrawable layer = (LayerDrawable) seekBar.getProgressDrawable();
layer.findDrawableByLayerId(android.R.id.progress).mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
// Actually update the images/ drawables.
root.setBackgroundColor(backgroundColor);
icon.setImageDrawable(drawable);
seekBar.setMax(max);
seekBar.setProgress(volume);
seekBar.setTag(resources);
show();
}
protected void updateSize() {
LOGI(TAG, "updateSize(stretch=" + stretch + ')');
if (sliderGroup instanceof MaxWidthLinearLayout) {
int panelWidth = 0;
if (!stretch) {
panelWidth = getNotificationPanelWidth();
if (panelWidth <= 0)
panelWidth = getResources().getDimensionPixelSize(R.dimen.notification_panel_width);
}
((MaxWidthLinearLayout) sliderGroup).setMaxWidth(panelWidth);
}
onWindowAttributesChanged();
}
@Override
public void setStretch(boolean stretchIt) {
LOGI(TAG, "setStretch(" + stretchIt + ')');
super.setStretch(stretchIt);
updateSize();
}
@Override public boolean isInteractive() { return true; }
@Override public WindowManager.LayoutParams getWindowLayoutParams() {
int flags = (LayoutParams.FLAG_NOT_FOCUSABLE |
LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
LayoutParams.FLAG_NOT_TOUCH_MODAL |
LayoutParams.FLAG_LAYOUT_INSET_DECOR |
LayoutParams.FLAG_LAYOUT_IN_SCREEN |
LayoutParams.FLAG_SHOW_WHEN_LOCKED );
LayoutParams WPARAMS = new WindowManager.LayoutParams(
LayoutParams.MATCH_PARENT, mStatusBarHeight, 0, 0,
LayoutParams.TYPE_SYSTEM_ERROR, flags, PixelFormat.TRANSLUCENT);
WPARAMS.windowAnimations = android.R.style.Animation_Dialog;
WPARAMS.packageName = getContext().getPackageName();
WPARAMS.setTitle(TAG);
WPARAMS.rotationAnimation = LayoutParams.ROTATION_ANIMATION_JUMPCUT;
WPARAMS.gravity = (Gravity.FILL_HORIZONTAL | Gravity.TOP);
WPARAMS.screenBrightness = WPARAMS.buttonBrightness = LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
return WPARAMS;
}
}