package zenproject.meditation.android.ui.menu.dialogs.brush.size; import android.content.Context; import android.util.AttributeSet; import android.widget.LinearLayout; import android.widget.SeekBar; import com.novoda.notils.caster.Views; import zenproject.meditation.android.ContextRetriever; import zenproject.meditation.android.R; import zenproject.meditation.android.preferences.BrushOptionsPreferences; import zenproject.meditation.android.ui.menu.dialogs.brush.SizeChangedListener; @SuppressWarnings("PMD.TooManyMethods") public class SizeView extends LinearLayout { private static final int MAX_DROP_SIZE = ContextRetriever.INSTANCE.getResources().getDimensionPixelSize(R.dimen.ink_drop_max_radius); private static final int MIN_DROP_SIZE = ContextRetriever.INSTANCE.getResources().getDimensionPixelSize(R.dimen.ink_drop_min_radius); private static final float PERCENTAGE_FACTOR = 0.005f; private SeekBar sizeSeekBar; private BrushSizeImage inkDropImage; private BrushOptionsPreferences brushOptionsPreferences; private SizeChangedListener sizeChangedListener; public SizeView(Context context) { super(context); } public SizeView(Context context, AttributeSet attrs) { super(context, attrs); } public SizeView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { sizeSeekBar = Views.findById(this, R.id.brush_size_slider); inkDropImage = Views.findById(this, R.id.brush_size_image); brushOptionsPreferences = BrushOptionsPreferences.newInstance(); sizeSeekBar.setProgress(brushOptionsPreferences.getBrushSizePercentage()); updateInkDropImageColor(brushOptionsPreferences.getBrushColor().toAndroidColor()); } private boolean hasSizeChangedListener() { return sizeChangedListener != null; } public void setSizeChangedListener(SizeChangedListener sizeChangedListener) { this.sizeChangedListener = sizeChangedListener; } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); sizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { changeInkDropImageSize(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { //no-op } @Override public void onStopTrackingTouch(SeekBar seekBar) { notifySizeChangedListener(seekBar.getProgress()); } }); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); changeInkDropImageSize(brushOptionsPreferences.getBrushSizePercentage()); } private void changeInkDropImageSize(int progress) { float targetSize = Math.max(MIN_DROP_SIZE, MAX_DROP_SIZE * progress * PERCENTAGE_FACTOR); inkDropImage.setSize(targetSize); } public void updateInkDropImageColor(int color) { inkDropImage.setColor(color); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); sizeSeekBar.setOnSeekBarChangeListener(null); } private void notifySizeChangedListener(int percentage) { if (hasSizeChangedListener()) { sizeChangedListener.onSizeChanged(percentage); } } }