Migrate WidgetConfigActivity to androidx prefs

pull/935/head
Alex Baker 4 years ago
parent 4d901351da
commit 09d2314411

@ -106,7 +106,7 @@ public interface ActivityComponent {
void inject(ReminderPreferences reminderPreferences);
void inject(WidgetConfigActivity widgetConfigActivity);
void inject(@NotNull WidgetConfigActivity widgetConfigActivity);
void inject(OldTaskPreferences oldTaskPreferences);

@ -13,6 +13,7 @@ import dagger.Subcomponent;
import org.jetbrains.annotations.NotNull;
import org.tasks.fragments.CommentBarFragment;
import org.tasks.preferences.fragments.HelpAndFeedback;
import org.tasks.preferences.fragments.ScrollableWidget;
import org.tasks.ui.CalendarControlSet;
import org.tasks.ui.DeadlineControlSet;
import org.tasks.ui.DescriptionControlSet;
@ -65,4 +66,6 @@ public interface FragmentComponent {
void inject(TaskListViewModel taskListViewModel);
void inject(@NotNull HelpAndFeedback helpAndFeedback);
void inject(@NotNull ScrollableWidget scrollableWidget);
}

@ -0,0 +1,82 @@
package org.tasks.preferences
import android.os.Bundle
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import org.tasks.R
import org.tasks.databinding.ActivityPreferencesBinding
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.ui.MenuColorizer
private const val EXTRA_TITLE = "extra_title"
abstract class BasePreferences : ThemedInjectingAppCompatActivity(),
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
lateinit var toolbar: Toolbar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityPreferencesBinding.inflate(layoutInflater)
setContentView(binding.root)
toolbar = binding.toolbar.toolbar
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.settings, getRootPreference())
.commit()
toolbar.title = getString(getRootTitle())
} else {
toolbar.title = savedInstanceState.getCharSequence(EXTRA_TITLE)
}
supportFragmentManager.addOnBackStackChangedListener {
if (supportFragmentManager.backStackEntryCount == 0) {
toolbar.title = getString(getRootTitle())
}
}
toolbar.navigationIcon = ContextCompat.getDrawable(this, R.drawable.ic_outline_arrow_back_24px);
toolbar.setNavigationOnClickListener { onBackPressed() }
setupMenu()
MenuColorizer.colorToolbar(this, toolbar)
}
open fun setupMenu() {}
abstract fun getRootTitle(): Int
abstract fun getRootPreference(): PreferenceFragmentCompat
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putCharSequence(EXTRA_TITLE, toolbar.title)
}
override fun onSupportNavigateUp(): Boolean {
if (supportFragmentManager.popBackStackImmediate()) {
return true
}
return super.onSupportNavigateUp()
}
override fun onPreferenceStartFragment(
caller: PreferenceFragmentCompat,
pref: Preference
): Boolean {
val args = pref.extras
val fragment = supportFragmentManager.fragmentFactory.instantiate(
classLoader,
pref.fragment
).apply {
arguments = args
setTargetFragment(caller, 0)
}
supportFragmentManager.beginTransaction()
.replace(R.id.settings, fragment)
.addToBackStack(null)
.commit()
toolbar.title = pref.title
return true
}
}

@ -1,81 +1,16 @@
package org.tasks.preferences
import android.os.Bundle
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import org.tasks.R
import org.tasks.databinding.ActivityPreferencesBinding
import org.tasks.injection.ActivityComponent
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.preferences.fragments.HelpAndFeedback
import org.tasks.ui.MenuColorizer
private const val EXTRA_TITLE = "extra_title"
class HelpAndFeedback : BasePreferences() {
class HelpAndFeedback : ThemedInjectingAppCompatActivity(),
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
override fun getRootTitle() = R.string.help_and_feedback
lateinit var toolbar: Toolbar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityPreferencesBinding.inflate(layoutInflater)
setContentView(binding.root)
toolbar = binding.toolbar.toolbar
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.settings, HelpAndFeedback())
.commit()
toolbar.title = getString(R.string.help_and_feedback)
} else {
toolbar.title = savedInstanceState.getCharSequence(EXTRA_TITLE)
}
supportFragmentManager.addOnBackStackChangedListener {
if (supportFragmentManager.backStackEntryCount == 0) {
toolbar.title = getString(R.string.help_and_feedback)
}
}
toolbar.navigationIcon = ContextCompat.getDrawable(this, R.drawable.ic_outline_arrow_back_24px);
toolbar.setNavigationOnClickListener { onBackPressed() }
MenuColorizer.colorToolbar(this, toolbar)
}
override fun getRootPreference() = HelpAndFeedback()
override fun inject(component: ActivityComponent) {
component.inject(this)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putCharSequence(EXTRA_TITLE, toolbar.title)
}
override fun onSupportNavigateUp(): Boolean {
if (supportFragmentManager.popBackStackImmediate()) {
return true
}
return super.onSupportNavigateUp()
}
override fun onPreferenceStartFragment(
caller: PreferenceFragmentCompat,
pref: Preference
): Boolean {
val args = pref.extras
val fragment = supportFragmentManager.fragmentFactory.instantiate(
classLoader,
pref.fragment
).apply {
arguments = args
setTargetFragment(caller, 0)
}
supportFragmentManager.beginTransaction()
.replace(R.id.settings, fragment)
.addToBackStack(null)
.commit()
toolbar.title = pref.title
return true
}
}

@ -0,0 +1,172 @@
package org.tasks.preferences.fragments
import android.app.Activity
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.os.Bundle
import androidx.preference.Preference
import androidx.preference.SeekBarPreference
import androidx.preference.SwitchPreferenceCompat
import com.todoroo.astrid.api.Filter
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.activities.ColorPickerActivity
import org.tasks.activities.FilterSelectionActivity
import org.tasks.injection.FragmentComponent
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.locale.Locale
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
import org.tasks.themes.ThemeCache
import org.tasks.themes.ThemeColor
import org.tasks.themes.WidgetTheme
import org.tasks.widget.TasksWidget
import org.tasks.widget.WidgetPreferences
import javax.inject.Inject
private const val REQUEST_FILTER = 1005
private const val REQUEST_THEME_SELECTION = 1006
private const val REQUEST_COLOR_SELECTION = 1007
const val EXTRA_WIDGET_ID = "extra_widget_id"
class ScrollableWidget : InjectingPreferenceFragment() {
companion object {
fun newScrollableWidget(appWidgetId: Int): ScrollableWidget {
val widget = ScrollableWidget()
val args = Bundle()
args.putInt(EXTRA_WIDGET_ID, appWidgetId)
widget.arguments = args
return widget
}
}
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var preferences: Preferences
@Inject lateinit var locale: Locale
@Inject lateinit var themeCache: ThemeCache
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
private lateinit var widgetPreferences: WidgetPreferences
private var appWidgetId = 0
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_widget, rootKey)
appWidgetId = arguments!!.getInt(EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
widgetPreferences = WidgetPreferences(context, preferences, appWidgetId)
setupSlider(R.string.p_widget_opacity, 100)
setupSlider(R.string.p_widget_font_size, 16)
setupCheckbox(R.string.p_widget_show_due_date)
setupCheckbox(R.string.p_widget_show_checkboxes)
val showHeader = setupCheckbox(R.string.p_widget_show_header)
val showSettings = setupCheckbox(R.string.p_widget_show_settings)
showSettings.dependency = showHeader.key
findPreference(R.string.p_widget_filter)
.setOnPreferenceClickListener {
val intent = Intent(context, FilterSelectionActivity::class.java)
intent.putExtra(FilterSelectionActivity.EXTRA_FILTER, getFilter())
intent.putExtra(FilterSelectionActivity.EXTRA_RETURN_FILTER, true)
startActivityForResult(intent, REQUEST_FILTER)
false
}
findPreference(R.string.p_widget_theme)
.setOnPreferenceClickListener {
val intent = Intent(context, ColorPickerActivity::class.java)
intent.putExtra(
ColorPickerActivity.EXTRA_PALETTE,
ColorPickerActivity.ColorPalette.WIDGET_BACKGROUND)
intent.putExtra(
ColorPickerActivity.EXTRA_THEME_INDEX, widgetPreferences.themeIndex)
startActivityForResult(intent, REQUEST_THEME_SELECTION)
false
}
val colorPreference = findPreference(R.string.p_widget_color)
colorPreference.dependency = showHeader.key
colorPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
val intent = Intent(context, ColorPickerActivity::class.java)
intent.putExtra(
ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS)
intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, widgetPreferences.colorIndex)
startActivityForResult(intent, REQUEST_COLOR_SELECTION)
false
}
updateFilter()
updateTheme()
updateColor()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_FILTER) {
if (resultCode == Activity.RESULT_OK) {
val filter: Filter = data!!.getParcelableExtra(FilterSelectionActivity.EXTRA_FILTER)!!
widgetPreferences.setFilter(defaultFilterProvider.getFilterPreferenceValue(filter))
updateFilter()
}
} else if (requestCode == REQUEST_THEME_SELECTION) {
if (resultCode == Activity.RESULT_OK) {
widgetPreferences.setTheme(data!!.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0))
updateTheme()
}
} else if (requestCode == REQUEST_COLOR_SELECTION) {
if (resultCode == Activity.RESULT_OK) {
widgetPreferences.setColor(data!!.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0))
updateColor()
}
} else {
super.onActivityResult(requestCode, resultCode, data)
}
}
override fun onPause() {
super.onPause()
localBroadcastManager.broadcastRefresh()
// force update after setting preferences
val intent = Intent(context, TasksWidget::class.java)
intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(appWidgetId))
activity!!.sendBroadcast(intent)
}
private fun updateTheme() {
val widgetTheme: WidgetTheme = themeCache.getWidgetTheme(widgetPreferences.themeIndex)
findPreference(R.string.p_widget_theme).summary = widgetTheme.name
}
private fun updateColor() {
val themeColor: ThemeColor = themeCache.getThemeColor(widgetPreferences.colorIndex)
findPreference(R.string.p_widget_color).summary = themeColor.name
}
private fun updateFilter() {
findPreference(R.string.p_widget_filter).summary = getFilter()!!.listingTitle
}
private fun getFilter(): Filter? {
return defaultFilterProvider.getFilterFromPreference(widgetPreferences.filterId)
}
private fun setupSlider(resId: Int, defValue: Int): SeekBarPreference {
val preference = findPreference(resId) as SeekBarPreference
preference.key = widgetPreferences.getKey(resId)
preference.value = preferences.getInt(preference.key, defValue)
return preference
}
private fun setupCheckbox(resId: Int): SwitchPreferenceCompat {
val preference = findPreference(resId) as SwitchPreferenceCompat
val key = getString(resId) + appWidgetId
preference.key = key
preference.isChecked = preferences.getBoolean(key, true)
return preference
}
override fun inject(component: FragmentComponent) = component.inject(this)
}

@ -1,232 +0,0 @@
package org.tasks.widget;
import static org.tasks.dialogs.NativeSeekBarDialog.newSeekBarDialog;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import com.todoroo.astrid.api.Filter;
import javax.inject.Inject;
import org.tasks.LocalBroadcastManager;
import org.tasks.R;
import org.tasks.activities.ColorPickerActivity;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.analytics.Tracker;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.NativeSeekBarDialog;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.locale.Locale;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
import org.tasks.themes.WidgetTheme;
public class WidgetConfigActivity extends InjectingPreferenceActivity
implements NativeSeekBarDialog.SeekBarCallback {
private static final String FRAG_TAG_OPACITY_SEEKBAR = "frag_tag_opacity_seekbar";
private static final String FRAG_TAG_FONT_SIZE_SEEKBAR = "frag_tag_font_size_seekbar";
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;
private static final int REQUEST_FONT_SIZE = 1009;
@Inject Tracker tracker;
@Inject DialogBuilder dialogBuilder;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject Preferences preferences;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject ThemeCache themeCache;
@Inject Locale locale;
private WidgetPreferences widgetPreferences;
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_widget);
appWidgetId =
getIntent()
.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
// If they gave us an intent without the widget id, just bail.
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
return;
}
widgetPreferences = new WidgetPreferences(this, preferences, appWidgetId);
Intent data = new Intent();
data.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
mergeResults(data.getExtras());
setupCheckbox(R.string.p_widget_show_due_date);
setupCheckbox(R.string.p_widget_show_checkboxes);
CheckBoxPreference showHeader = setupCheckbox(R.string.p_widget_show_header);
CheckBoxPreference showSettings = setupCheckbox(R.string.p_widget_show_settings);
showSettings.setDependency(showHeader.getKey());
findPreference(R.string.p_widget_filter)
.setOnPreferenceClickListener(
preference -> {
Intent intent = new Intent(WidgetConfigActivity.this, FilterSelectionActivity.class);
intent.putExtra(FilterSelectionActivity.EXTRA_FILTER, getFilter());
intent.putExtra(FilterSelectionActivity.EXTRA_RETURN_FILTER, true);
startActivityForResult(intent, REQUEST_FILTER);
return false;
});
findPreference(R.string.p_widget_theme)
.setOnPreferenceClickListener(
preference -> {
Intent intent = new Intent(WidgetConfigActivity.this, ColorPickerActivity.class);
intent.putExtra(
ColorPickerActivity.EXTRA_PALETTE,
ColorPickerActivity.ColorPalette.WIDGET_BACKGROUND);
intent.putExtra(
ColorPickerActivity.EXTRA_THEME_INDEX, widgetPreferences.getThemeIndex());
startActivityForResult(intent, REQUEST_THEME_SELECTION);
return false;
});
Preference colorPreference = findPreference(R.string.p_widget_color);
colorPreference.setDependency(showHeader.getKey());
colorPreference.setOnPreferenceClickListener(
preference -> {
Intent intent = new Intent(WidgetConfigActivity.this, ColorPickerActivity.class);
intent.putExtra(
ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS);
intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, widgetPreferences.getColorIndex());
startActivityForResult(intent, REQUEST_COLOR_SELECTION);
return false;
});
findPreference(R.string.p_widget_opacity)
.setOnPreferenceClickListener(
preference -> {
newSeekBarDialog(
R.layout.dialog_opacity_seekbar,
0,
100,
widgetPreferences.getOpacity(),
REQUEST_OPACITY)
.show(getFragmentManager(), FRAG_TAG_OPACITY_SEEKBAR);
return false;
});
findPreference(R.string.p_widget_font_size)
.setOnPreferenceClickListener(
preference -> {
newSeekBarDialog(
R.layout.dialog_font_size_seekbar,
10,
22,
widgetPreferences.getFontSize(),
REQUEST_FONT_SIZE)
.show(getFragmentManager(), FRAG_TAG_FONT_SIZE_SEEKBAR);
return false;
});
updateFilter();
updateOpacity();
updateFontSize();
updateTheme();
updateColor();
}
private CheckBoxPreference setupCheckbox(int resId) {
CheckBoxPreference preference = (CheckBoxPreference) findPreference(resId);
String key = getString(resId) + appWidgetId;
preference.setKey(key);
preference.setChecked(preferences.getBoolean(key, true));
return preference;
}
private void updateOpacity() {
int opacity = widgetPreferences.getOpacity();
findPreference(R.string.p_widget_opacity).setSummary(locale.formatPercentage(opacity));
}
private void updateFontSize() {
int fontSize = widgetPreferences.getFontSize();
findPreference(R.string.p_widget_font_size).setSummary(locale.formatNumber(fontSize));
}
private void updateFilter() {
findPreference(R.string.p_widget_filter).setSummary(getFilter().listingTitle);
}
private Filter getFilter() {
return defaultFilterProvider.getFilterFromPreference(widgetPreferences.getFilterId());
}
private void updateTheme() {
WidgetTheme widgetTheme = themeCache.getWidgetTheme(widgetPreferences.getThemeIndex());
findPreference(R.string.p_widget_theme).setSummary(widgetTheme.getName());
}
private void updateColor() {
ThemeColor themeColor = themeCache.getThemeColor(widgetPreferences.getColorIndex());
findPreference(R.string.p_widget_color).setSummary(themeColor.getName());
}
@Override
protected void onPause() {
super.onPause();
localBroadcastManager.broadcastRefresh();
// force update after setting preferences
Intent intent = new Intent(this, TasksWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {appWidgetId});
sendBroadcast(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_FILTER) {
if (resultCode == RESULT_OK) {
Filter filter = data.getParcelableExtra(FilterSelectionActivity.EXTRA_FILTER);
widgetPreferences.setFilter(defaultFilterProvider.getFilterPreferenceValue(filter));
updateFilter();
}
} else if (requestCode == REQUEST_THEME_SELECTION) {
if (resultCode == RESULT_OK) {
widgetPreferences.setTheme(data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0));
updateTheme();
}
} else if (requestCode == REQUEST_COLOR_SELECTION) {
if (resultCode == RESULT_OK) {
widgetPreferences.setColor(data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0));
updateColor();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void inject(ActivityComponent component) {
component.inject(this);
}
@Override
public void valueSelected(int value, int requestCode) {
if (requestCode == REQUEST_OPACITY) {
widgetPreferences.setOpacity(value);
updateOpacity();
} else if (requestCode == REQUEST_FONT_SIZE) {
widgetPreferences.setFontSize(value);
updateFontSize();
}
}
}

@ -0,0 +1,34 @@
package org.tasks.widget
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.os.Bundle
import org.tasks.R
import org.tasks.injection.ActivityComponent
import org.tasks.preferences.BasePreferences
import org.tasks.preferences.fragments.ScrollableWidget.Companion.newScrollableWidget
class WidgetConfigActivity : BasePreferences() {
private var appWidgetId: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
super.onCreate(savedInstanceState)
// If they gave us an intent without the widget id, just bail.
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish()
return
}
setResult(RESULT_OK, Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId))
}
override fun getRootTitle() = R.string.widget_settings
override fun getRootPreference() = newScrollableWidget(appWidgetId)
override fun inject(component: ActivityComponent) = component.inject(this)
}

@ -4,13 +4,13 @@ import android.content.Context;
import org.tasks.R;
import org.tasks.preferences.Preferences;
class WidgetPreferences {
public class WidgetPreferences {
private final Context context;
private final Preferences preferences;
private final int widgetId;
WidgetPreferences(Context context, Preferences preferences, int widgetId) {
public WidgetPreferences(Context context, Preferences preferences, int widgetId) {
this.context = context;
this.preferences = preferences;
this.widgetId = widgetId;
@ -36,19 +36,15 @@ class WidgetPreferences {
return preferences.getInt(getKey(R.string.p_widget_font_size), 16);
}
void setFontSize(int value) {
preferences.setInt(getKey(R.string.p_widget_font_size), value);
}
String getFilterId() {
public String getFilterId() {
return preferences.getStringValue(getKey(R.string.p_widget_filter));
}
int getThemeIndex() {
public int getThemeIndex() {
return preferences.getInt(getKey(R.string.p_widget_theme), 0);
}
int getColorIndex() {
public int getColorIndex() {
return preferences.getInt(getKey(R.string.p_widget_color), 0);
}
@ -68,7 +64,7 @@ class WidgetPreferences {
preferences.setInt(getKey(R.string.p_widget_theme), index);
}
private String getKey(int resId) {
public String getKey(int resId) {
return context.getString(resId) + widgetId;
}

@ -1,49 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.todoroo.astrid.ui.MultilinePreference
<Preference
android:key="@string/p_widget_filter"
android:title="@string/filter"/>
android:title="@string/filter" />
<com.todoroo.astrid.ui.MultilinePreference
<Preference
android:key="@string/p_widget_theme"
android:title="@string/theme"/>
android:title="@string/theme" />
<com.todoroo.astrid.ui.MultilinePreference
<SeekBarPreference
android:defaultValue="100"
android:key="@string/p_widget_opacity"
android:title="@string/opacity"/>
android:max="100"
android:title="@string/opacity"
app:min="0"
app:seekBarIncrement="5"
app:showSeekBarValue="true" />
<PreferenceCategory
android:title="@string/widget_header_settings">
<PreferenceCategory android:title="@string/widget_header_settings">
<CheckBoxPreference
<SwitchPreferenceCompat
android:key="@string/p_widget_show_header"
android:title="@string/widget_show_header"/>
android:title="@string/widget_show_header" />
<com.todoroo.astrid.ui.MultilinePreference
<Preference
android:key="@string/p_widget_color"
android:title="@string/color"/>
android:title="@string/color" />
<CheckBoxPreference
<SwitchPreferenceCompat
android:key="@string/p_widget_show_settings"
android:title="@string/widget_show_settings"/>
android:title="@string/widget_show_settings" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/widget_row_settings">
<PreferenceCategory android:title="@string/widget_row_settings">
<com.todoroo.astrid.ui.MultilinePreference
<SeekBarPreference
android:defaultValue="16"
android:key="@string/p_widget_font_size"
android:title="@string/font_size"/>
android:max="22"
android:title="@string/font_size"
app:min="10"
app:showSeekBarValue="true" />
<CheckBoxPreference
<SwitchPreferenceCompat
android:key="@string/p_widget_show_due_date"
android:title="@string/widget_show_due_date"/>
android:title="@string/widget_show_due_date" />
<CheckBoxPreference
<SwitchPreferenceCompat
android:key="@string/p_widget_show_checkboxes"
android:title="@string/widget_show_checkboxes"/>
android:title="@string/widget_show_checkboxes" />
</PreferenceCategory>

Loading…
Cancel
Save