diff --git a/app/src/main/java/org/tasks/injection/ActivityComponent.java b/app/src/main/java/org/tasks/injection/ActivityComponent.java index 3aa172709..85c5b575c 100644 --- a/app/src/main/java/org/tasks/injection/ActivityComponent.java +++ b/app/src/main/java/org/tasks/injection/ActivityComponent.java @@ -106,7 +106,7 @@ public interface ActivityComponent { void inject(ReminderPreferences reminderPreferences); - void inject(WidgetConfigActivity widgetConfigActivity); + void inject(@NotNull WidgetConfigActivity widgetConfigActivity); void inject(OldTaskPreferences oldTaskPreferences); diff --git a/app/src/main/java/org/tasks/injection/FragmentComponent.java b/app/src/main/java/org/tasks/injection/FragmentComponent.java index 41ed82139..3b1832943 100644 --- a/app/src/main/java/org/tasks/injection/FragmentComponent.java +++ b/app/src/main/java/org/tasks/injection/FragmentComponent.java @@ -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); } diff --git a/app/src/main/java/org/tasks/preferences/BasePreferences.kt b/app/src/main/java/org/tasks/preferences/BasePreferences.kt new file mode 100644 index 000000000..5a17edd27 --- /dev/null +++ b/app/src/main/java/org/tasks/preferences/BasePreferences.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/preferences/HelpAndFeedback.kt b/app/src/main/java/org/tasks/preferences/HelpAndFeedback.kt index e18e54a8a..1b803b3ac 100644 --- a/app/src/main/java/org/tasks/preferences/HelpAndFeedback.kt +++ b/app/src/main/java/org/tasks/preferences/HelpAndFeedback.kt @@ -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 - } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt new file mode 100644 index 000000000..9ffeb8da1 --- /dev/null +++ b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt @@ -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) +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java deleted file mode 100644 index befdc746e..000000000 --- a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.java +++ /dev/null @@ -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(); - } - } -} diff --git a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt new file mode 100644 index 000000000..3ccb1fa55 --- /dev/null +++ b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt @@ -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) +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.java b/app/src/main/java/org/tasks/widget/WidgetPreferences.java index 69346bcc3..ce1ee9edb 100644 --- a/app/src/main/java/org/tasks/widget/WidgetPreferences.java +++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.java @@ -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; } diff --git a/app/src/main/res/xml/preferences_widget.xml b/app/src/main/res/xml/preferences_widget.xml index 64269f515..73a5a3089 100644 --- a/app/src/main/res/xml/preferences_widget.xml +++ b/app/src/main/res/xml/preferences_widget.xml @@ -1,49 +1,57 @@ - + - + android:title="@string/filter" /> - + android:title="@string/theme" /> - + android:max="100" + android:title="@string/opacity" + app:min="0" + app:seekBarIncrement="5" + app:showSeekBarValue="true" /> - + - + android:title="@string/widget_show_header" /> - + android:title="@string/color" /> - + android:title="@string/widget_show_settings" /> - + - + android:max="22" + android:title="@string/font_size" + app:min="10" + app:showSeekBarValue="true" /> - + android:title="@string/widget_show_due_date" /> - + android:title="@string/widget_show_checkboxes" />