Convert ListPicker to Kotlin

pull/1001/head
Alex Baker 4 years ago
parent 0eeb393154
commit 9ff92418e2

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

@ -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<FilterListItem>? -> 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()
}
}
}
Loading…
Cancel
Save