Add SeekBarDialog

pull/437/head
Alex Baker 8 years ago
parent 84c3a4228c
commit d5fb5452f3

@ -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);
}
}

@ -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);
}

@ -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) {{

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?attr/listPreferredItemHeight"
android:paddingBottom="@dimen/keyline_first"
android:paddingTop="@dimen/keyline_first">
<TextView
android:id="@+id/min"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingLeft="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" />
<TextView
android:id="@+id/max"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:paddingEnd="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first" />
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/min"
android:layout_toLeftOf="@id/max"
android:layout_toRightOf="@id/min"
android:layout_toStartOf="@id/max"
android:indeterminate="false" />
</RelativeLayout>

@ -92,7 +92,9 @@
</RelativeLayout>
<RelativeLayout style="@style/WidgetConfigRow">
<RelativeLayout
android:id="@+id/widget_opacity"
style="@style/WidgetConfigRow">
<TextView
android:id="@+id/opacity_value"
@ -118,14 +120,6 @@
</RelativeLayout>
<SeekBar
android:id="@+id/opacity_seekbar"
style="@style/WidgetConfigRow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:max="255" />
<CheckBox
android:id="@+id/hideDueDate"
style="@style/WidgetConfigRow.CheckBox"

Loading…
Cancel
Save