From 9ff92418e2d443ee0eed7215baf52298e853fd83 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 2 Jun 2020 11:25:06 -0500 Subject: [PATCH] Convert ListPicker to Kotlin --- .../java/org/tasks/activities/ListPicker.java | 167 ------------------ .../java/org/tasks/activities/ListPicker.kt | 141 +++++++++++++++ 2 files changed, 141 insertions(+), 167 deletions(-) delete mode 100644 app/src/main/java/org/tasks/activities/ListPicker.java create mode 100644 app/src/main/java/org/tasks/activities/ListPicker.kt diff --git a/app/src/main/java/org/tasks/activities/ListPicker.java b/app/src/main/java/org/tasks/activities/ListPicker.java deleted file mode 100644 index 6845e9644..000000000 --- a/app/src/main/java/org/tasks/activities/ListPicker.java +++ /dev/null @@ -1,167 +0,0 @@ -package org.tasks.activities; - -import android.app.Activity; -import android.app.Dialog; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.Fragment; -import com.todoroo.astrid.adapter.FilterAdapter; -import com.todoroo.astrid.api.CaldavFilter; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.api.FilterListItem; -import com.todoroo.astrid.api.GtasksFilter; -import io.reactivex.Single; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; -import javax.inject.Inject; -import org.tasks.LocalBroadcastManager; -import org.tasks.R; -import org.tasks.dialogs.AlertDialogBuilder; -import org.tasks.dialogs.DialogBuilder; -import org.tasks.filters.FilterProvider; -import org.tasks.gtasks.RemoteListSelectionHandler; -import org.tasks.injection.DialogFragmentComponent; -import org.tasks.injection.InjectingDialogFragment; -import org.tasks.sync.AddAccountDialog; -import org.tasks.sync.SyncAdapters; - -public class ListPicker extends InjectingDialogFragment - implements RemoteListSelectionHandler { - - public static final String EXTRA_SELECTED_FILTER = "extra_selected_filter"; - private static final String EXTRA_NO_SELECTION = "extra_no_selection"; - - @Inject DialogBuilder dialogBuilder; - @Inject FilterAdapter filterAdapter; - @Inject FilterProvider filterProvider; - @Inject SyncAdapters syncAdapters; - @Inject LocalBroadcastManager localBroadcastManager; - - private CompositeDisposable disposables; - private final BroadcastReceiver refreshReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - refresh(); - } - }; - - public static ListPicker newListPicker( - Filter selected, Fragment targetFragment, int requestCode) { - ListPicker dialog = new ListPicker(); - Bundle arguments = new Bundle(); - arguments.putParcelable(EXTRA_SELECTED_FILTER, selected); - dialog.setArguments(arguments); - dialog.setTargetFragment(targetFragment, requestCode); - return dialog; - } - - public static ListPicker newListPicker(Fragment targetFragment, int requestCode) { - ListPicker dialog = new ListPicker(); - Bundle arguments = new Bundle(); - arguments.putBoolean(EXTRA_NO_SELECTION, true); - dialog.setArguments(arguments); - dialog.setTargetFragment(targetFragment, requestCode); - return dialog; - } - - private static AlertDialog createDialog( - FilterAdapter filterAdapter, - DialogBuilder dialogBuilder, - SyncAdapters syncAdapters, - RemoteListSelectionHandler handler) { - AlertDialogBuilder builder = - dialogBuilder - .newDialog() - .setNegativeButton(android.R.string.cancel, null) - .setSingleChoiceItems( - filterAdapter, - -1, - (dialog, which) -> { - if (which == 0) { - handler.selectedList(null); - } else { - FilterListItem item = filterAdapter.getItem(which); - if (item instanceof GtasksFilter || item instanceof CaldavFilter) { - handler.selectedList((Filter) item); - } - } - dialog.dismiss(); - }); - if (!syncAdapters.isSyncEnabled()) { - builder.setNeutralButton(R.string.add_account, (dialog, which) -> handler.addAccount()); - } - return builder.show(); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - if (savedInstanceState != null) { - filterAdapter.restore(savedInstanceState); - } - - return createDialog(filterAdapter, dialogBuilder, syncAdapters, this); - } - - @Override - public void onResume() { - super.onResume(); - - disposables = new CompositeDisposable(); - - localBroadcastManager.registerRefreshListReceiver(refreshReceiver); - - refresh(); - } - - @Override - public void onPause() { - super.onPause(); - - localBroadcastManager.unregisterReceiver(refreshReceiver); - - disposables.dispose(); - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - filterAdapter.save(outState); - } - - @Override - protected void inject(DialogFragmentComponent component) { - component.inject(this); - } - - @Override - public void addAccount() { - AddAccountDialog.showAddAccountDialog(getActivity(), dialogBuilder); - } - - @Override - public void selectedList(Filter filter) { - getTargetFragment() - .onActivityResult( - getTargetRequestCode(), - Activity.RESULT_OK, - new Intent().putExtra(EXTRA_SELECTED_FILTER, filter)); - } - - private void refresh() { - Bundle arguments = getArguments(); - boolean noSelection = arguments.getBoolean(EXTRA_NO_SELECTION, false); - Filter selected = noSelection ? null : arguments.getParcelable(EXTRA_SELECTED_FILTER); - - disposables.add(Single.fromCallable(filterProvider::getRemoteListPickerItems) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(items -> filterAdapter.setData(items, selected))); - } -} diff --git a/app/src/main/java/org/tasks/activities/ListPicker.kt b/app/src/main/java/org/tasks/activities/ListPicker.kt new file mode 100644 index 000000000..eb8513eac --- /dev/null +++ b/app/src/main/java/org/tasks/activities/ListPicker.kt @@ -0,0 +1,141 @@ +package org.tasks.activities + +import android.app.Activity +import android.app.Dialog +import android.content.BroadcastReceiver +import android.content.Context +import android.content.DialogInterface +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment +import com.todoroo.astrid.adapter.FilterAdapter +import com.todoroo.astrid.api.CaldavFilter +import com.todoroo.astrid.api.Filter +import com.todoroo.astrid.api.FilterListItem +import com.todoroo.astrid.api.GtasksFilter +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.schedulers.Schedulers +import org.tasks.LocalBroadcastManager +import org.tasks.R +import org.tasks.dialogs.DialogBuilder +import org.tasks.filters.FilterProvider +import org.tasks.gtasks.RemoteListSelectionHandler +import org.tasks.injection.DialogFragmentComponent +import org.tasks.injection.InjectingDialogFragment +import org.tasks.sync.AddAccountDialog +import org.tasks.sync.SyncAdapters +import javax.inject.Inject + +class ListPicker : InjectingDialogFragment(), RemoteListSelectionHandler { + @Inject lateinit var dialogBuilder: DialogBuilder + @Inject lateinit var filterAdapter: FilterAdapter + @Inject lateinit var filterProvider: FilterProvider + @Inject lateinit var syncAdapters: SyncAdapters + @Inject lateinit var localBroadcastManager: LocalBroadcastManager + + private var disposables: CompositeDisposable? = null + private val refreshReceiver: BroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + refresh() + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + if (savedInstanceState != null) { + filterAdapter.restore(savedInstanceState) + } + return createDialog(filterAdapter, dialogBuilder, syncAdapters, this) + } + + override fun onResume() { + super.onResume() + disposables = CompositeDisposable() + localBroadcastManager.registerRefreshListReceiver(refreshReceiver) + refresh() + } + + override fun onPause() { + super.onPause() + localBroadcastManager.unregisterReceiver(refreshReceiver) + disposables!!.dispose() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + filterAdapter.save(outState) + } + + override fun inject(component: DialogFragmentComponent) = component.inject(this) + + override fun addAccount() = AddAccountDialog.showAddAccountDialog(activity, dialogBuilder) + + override fun selectedList(filter: Filter) { + targetFragment!!.onActivityResult( + targetRequestCode, + Activity.RESULT_OK, + Intent().putExtra(EXTRA_SELECTED_FILTER, filter)) + } + + private fun refresh() { + val noSelection = requireArguments().getBoolean(EXTRA_NO_SELECTION, false) + val selected: Filter? = if (noSelection) null else arguments?.getParcelable(EXTRA_SELECTED_FILTER) + disposables!!.add(Single.fromCallable(filterProvider::remoteListPickerItems) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { items: List? -> filterAdapter.setData(items!!, selected) }) + } + + companion object { + const val EXTRA_SELECTED_FILTER = "extra_selected_filter" + private const val EXTRA_NO_SELECTION = "extra_no_selection" + fun newListPicker( + selected: Filter?, targetFragment: Fragment?, requestCode: Int): ListPicker { + val dialog = ListPicker() + val arguments = Bundle() + arguments.putParcelable(EXTRA_SELECTED_FILTER, selected) + dialog.arguments = arguments + dialog.setTargetFragment(targetFragment, requestCode) + return dialog + } + + fun newListPicker(targetFragment: Fragment?, requestCode: Int): ListPicker { + val dialog = ListPicker() + val arguments = Bundle() + arguments.putBoolean(EXTRA_NO_SELECTION, true) + dialog.arguments = arguments + dialog.setTargetFragment(targetFragment, requestCode) + return dialog + } + + private fun createDialog( + filterAdapter: FilterAdapter, + dialogBuilder: DialogBuilder, + syncAdapters: SyncAdapters, + handler: RemoteListSelectionHandler): AlertDialog { + val builder = dialogBuilder + .newDialog() + .setNegativeButton(android.R.string.cancel, null) + .setSingleChoiceItems( + filterAdapter, + -1 + ) { dialog: DialogInterface, which: Int -> + if (which == 0) { + handler.selectedList(null) + } else { + val item = filterAdapter.getItem(which) + if (item is GtasksFilter || item is CaldavFilter) { + handler.selectedList(item as Filter) + } + } + dialog.dismiss() + } + if (!syncAdapters.isSyncEnabled) { + builder.setNeutralButton(R.string.add_account) { _, _ -> handler.addAccount() } + } + return builder.show() + } + } +} \ No newline at end of file