diff --git a/src/main/java/org/tasks/dialogs/SeekBarDialog.java b/src/main/java/org/tasks/dialogs/SeekBarDialog.java new file mode 100644 index 000000000..3dcd9a860 --- /dev/null +++ b/src/main/java/org/tasks/dialogs/SeekBarDialog.java @@ -0,0 +1,95 @@ +package org.tasks.dialogs; + +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.icu.text.NumberFormat; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.SeekBar; +import android.widget.TextView; + +import org.tasks.R; +import org.tasks.injection.DialogFragmentComponent; +import org.tasks.injection.InjectingDialogFragment; +import org.tasks.themes.Theme; + +import javax.inject.Inject; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class SeekBarDialog extends InjectingDialogFragment { + + private static final String EXTRA_MIN_VALUE = "extra_min_value"; + private static final String EXTRA_MAX_VALUE = "extra_max_value"; + private static final String EXTRA_INITIAL_VALUE = "extra_initial_value"; + public static final String EXTRA_VALUE = "extra_value"; + + public static SeekBarDialog newSeekBarDialog(int minValue, int maxValue, int initial) { + SeekBarDialog dialog = new SeekBarDialog(); + Bundle args = new Bundle(); + args.putInt(EXTRA_MIN_VALUE, minValue); + args.putInt(EXTRA_MAX_VALUE, maxValue); + dialog.setArguments(args); + dialog.initial = initial; + return dialog; + } + + @BindView(R.id.seekbar) SeekBar seekBar; + @BindView(R.id.min) TextView min; + @BindView(R.id.max) TextView max; + + @Inject DialogBuilder dialogBuilder; + @Inject Theme theme; + + private int minValue; + private int maxValue; + private int initial; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + LayoutInflater layoutInflater = theme.getLayoutInflater(getContext()); + View view = layoutInflater.inflate(R.layout.dialog_seekbar, null); + ButterKnife.bind(this, view); + + Bundle arguments = getArguments(); + if (savedInstanceState != null) { + initial = savedInstanceState.getInt(EXTRA_INITIAL_VALUE); + } + minValue = arguments.getInt(EXTRA_MIN_VALUE); + maxValue = arguments.getInt(EXTRA_MAX_VALUE); + min.setText(NumberFormat.getIntegerInstance().format(minValue)); + max.setText(NumberFormat.getIntegerInstance().format(maxValue)); + seekBar.setMax(maxValue - minValue); + seekBar.setProgress(initial); + return dialogBuilder.newDialog() + .setView(view) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, new Intent() {{ + putExtra(EXTRA_VALUE, seekBar.getProgress() + minValue); + }}); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putInt(EXTRA_INITIAL_VALUE, seekBar.getProgress()); + } + + @Override + protected void inject(DialogFragmentComponent component) { + component.inject(this); + } +} diff --git a/src/main/java/org/tasks/injection/BaseDialogFragmentComponent.java b/src/main/java/org/tasks/injection/BaseDialogFragmentComponent.java index 226ab6a00..325d86e90 100644 --- a/src/main/java/org/tasks/injection/BaseDialogFragmentComponent.java +++ b/src/main/java/org/tasks/injection/BaseDialogFragmentComponent.java @@ -3,6 +3,7 @@ package org.tasks.injection; import org.tasks.activities.CalendarSelectionDialog; import org.tasks.dialogs.AccountSelectionDialog; import org.tasks.dialogs.AddAttachmentDialog; +import org.tasks.dialogs.SeekBarDialog; import org.tasks.dialogs.SortDialog; import org.tasks.dialogs.ColorPickerDialog; import org.tasks.reminders.MissedCallDialog; @@ -28,4 +29,6 @@ public interface BaseDialogFragmentComponent { void inject(SortDialog sortDialog); void inject(ColorPickerDialog colorPickerDialog); + + void inject(SeekBarDialog seekBarDialog); } diff --git a/src/main/java/org/tasks/widget/WidgetConfigDialog.java b/src/main/java/org/tasks/widget/WidgetConfigDialog.java index 6ffdae2d9..a5083675e 100644 --- a/src/main/java/org/tasks/widget/WidgetConfigDialog.java +++ b/src/main/java/org/tasks/widget/WidgetConfigDialog.java @@ -9,7 +9,6 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.CheckBox; -import android.widget.SeekBar; import android.widget.TextView; import com.todoroo.astrid.api.Filter; @@ -19,6 +18,7 @@ import org.tasks.activities.ColorPickerActivity; import org.tasks.activities.FilterSelectionActivity; import org.tasks.dialogs.ColorPickerDialog; import org.tasks.dialogs.DialogBuilder; +import org.tasks.dialogs.SeekBarDialog; import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.ForApplication; import org.tasks.injection.InjectingDialogFragment; @@ -35,11 +35,15 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -public class WidgetConfigDialog extends InjectingDialogFragment implements SeekBar.OnSeekBarChangeListener { +import static org.tasks.dialogs.SeekBarDialog.newSeekBarDialog; + +public class WidgetConfigDialog extends InjectingDialogFragment { private static final String EXTRA_FILTER = "extra_filter"; private static final String EXTRA_THEME = "extra_theme"; private static final String EXTRA_APP_WIDGET_ID = "extra_app_widget_id"; + private static final String EXTRA_OPACITY = "extra_opacity"; + private static final String FRAG_TAG_SEEKBAR = "frag_tag_seekbar"; public static WidgetConfigDialog newWidgetConfigDialog(int appWidgetId) { WidgetConfigDialog dialog = new WidgetConfigDialog(); @@ -47,21 +51,6 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB return dialog; } - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - updateOpacity(); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - - } - public interface WidgetConfigCallback { void ok(); @@ -71,6 +60,7 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB private static final int REQUEST_FILTER = 1005; private static final int REQUEST_THEME_SELECTION = 1006; private static final int REQUEST_COLOR_SELECTION = 1007; + private static final int REQUEST_OPACITY = 1008; @BindView(R.id.opacity_value) TextView opacityValue; @BindView(R.id.selected_filter) TextView selectedFilter; @@ -79,7 +69,6 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB @BindView(R.id.hideDueDate) CheckBox hideDueDate; @BindView(R.id.hideCheckboxes) CheckBox hideCheckBoxes; @BindView(R.id.hideHeader) CheckBox hideHeader; - @BindView(R.id.opacity_seekbar) SeekBar opacitySeekbar; @Inject DialogBuilder dialogBuilder; @Inject DefaultFilterProvider defaultFilterProvider; @@ -93,6 +82,7 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB private int colorIndex = 0; private int appWidgetId; private WidgetConfigCallback callback; + private int opacityPercentage; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -101,15 +91,14 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB ButterKnife.bind(this, view); - opacitySeekbar.setOnSeekBarChangeListener(this); - if (savedInstanceState != null) { themeIndex = savedInstanceState.getInt(EXTRA_THEME); filter = savedInstanceState.getParcelable(EXTRA_FILTER); appWidgetId = savedInstanceState.getInt(EXTRA_APP_WIDGET_ID); + opacityPercentage = savedInstanceState.getInt(EXTRA_OPACITY); } else { filter = defaultFilterProvider.getDefaultFilter(); - opacitySeekbar.setProgress(WidgetConfigActivity.DEFAULT_OPACITY); + opacityPercentage = 100; } updateFilter(); @@ -136,6 +125,7 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB outState.putInt(EXTRA_APP_WIDGET_ID, appWidgetId); outState.putInt(EXTRA_THEME, themeIndex); + outState.putInt(EXTRA_OPACITY, opacityPercentage); outState.putParcelable(EXTRA_FILTER, filter); } @@ -158,7 +148,7 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB } private void updateOpacity() { - opacityValue.setText(NumberFormat.getPercentInstance().format(opacitySeekbar.getProgress() / 255.0)); + opacityValue.setText(NumberFormat.getPercentInstance().format(opacityPercentage / 100.0)); } private void updateTheme() { @@ -190,6 +180,13 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB }}, REQUEST_COLOR_SELECTION); } + @OnClick(R.id.widget_opacity) + public void showOpacitySlider() { + SeekBarDialog seekBarDialog = newSeekBarDialog(0, 100, opacityPercentage); + seekBarDialog.setTargetFragment(this, REQUEST_OPACITY); + seekBarDialog.show(getChildFragmentManager(), FRAG_TAG_SEEKBAR); + } + @Override protected void inject(DialogFragmentComponent component) { component.inject(this); @@ -212,6 +209,11 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB filter = data.getParcelableExtra(FilterSelectionActivity.EXTRA_FILTER); updateFilter(); } + } else if (requestCode == REQUEST_OPACITY) { + if (resultCode == Activity.RESULT_OK) { + opacityPercentage = data.getIntExtra(SeekBarDialog.EXTRA_VALUE, 100); + updateOpacity(); + } } else { super.onActivityResult(requestCode, resultCode, data); } @@ -224,7 +226,7 @@ public class WidgetConfigDialog extends InjectingDialogFragment implements SeekB preferences.setBoolean(WidgetConfigActivity.PREF_HIDE_HEADER + appWidgetId, hideHeader.isChecked()); preferences.setInt(WidgetConfigActivity.PREF_THEME + appWidgetId, themeIndex); preferences.setInt(WidgetConfigActivity.PREF_COLOR + appWidgetId, colorIndex); - preferences.setInt(WidgetConfigActivity.PREF_WIDGET_OPACITY + appWidgetId, opacitySeekbar.getProgress()); + preferences.setInt(WidgetConfigActivity.PREF_WIDGET_OPACITY + appWidgetId, (int)(255.0 * ((double) opacityPercentage / 100.0))); // force update after setting preferences context.sendBroadcast(new Intent(context, TasksWidget.class) {{ diff --git a/src/main/res/layout/dialog_seekbar.xml b/src/main/res/layout/dialog_seekbar.xml new file mode 100644 index 000000000..c08024e08 --- /dev/null +++ b/src/main/res/layout/dialog_seekbar.xml @@ -0,0 +1,38 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/widget_config_activity.xml b/src/main/res/layout/widget_config_activity.xml index fcbde919c..17825b9b1 100644 --- a/src/main/res/layout/widget_config_activity.xml +++ b/src/main/res/layout/widget_config_activity.xml @@ -92,7 +92,9 @@ - + - -