From 1d1f132806245c816a7799ad5bb265a7c8d3cacd Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 11 May 2020 15:57:21 -0500 Subject: [PATCH] Convert MainActivity to Kotlin --- .../todoroo/astrid/activity/MainActivity.java | 561 ------------------ .../todoroo/astrid/activity/MainActivity.kt | 451 ++++++++++++++ .../todoroo/astrid/timers/TimerControlSet.kt | 6 +- .../java/org/tasks/ui/SubtaskControlSet.kt | 2 +- 4 files changed, 455 insertions(+), 565 deletions(-) delete mode 100644 app/src/main/java/com/todoroo/astrid/activity/MainActivity.java create mode 100644 app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java deleted file mode 100644 index 0d9a3f1f7..000000000 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java +++ /dev/null @@ -1,561 +0,0 @@ -/* - * Copyright (c) 2012 Todoroo Inc - * - * See the file "LICENSE" for the full license governing this code. - */ - -package com.todoroo.astrid.activity; - -import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; -import static com.todoroo.andlib.utility.AndroidUtilities.atLeastNougat; -import static com.todoroo.astrid.activity.TaskEditFragment.newTaskEditFragment; -import static com.todoroo.astrid.activity.TaskListFragment.newTaskListFragment; -import static org.tasks.Strings.isNullOrEmpty; -import static org.tasks.location.LocationPickerActivity.EXTRA_PLACE; -import static org.tasks.tasklist.ActionUtils.applySupportActionModeColor; -import static org.tasks.ui.NavigationDrawerFragment.REQUEST_NEW_LIST; -import static org.tasks.ui.NavigationDrawerFragment.REQUEST_NEW_PLACE; - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.content.res.Configuration; -import android.net.Uri; -import android.os.Bundle; -import android.view.View; -import android.view.inputmethod.InputMethodManager; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.view.ActionMode; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.fragment.app.FragmentManager; -import androidx.lifecycle.ViewModelProvider; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.service.TaskCreator; -import com.todoroo.astrid.timers.TimerControlSet; -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.BuildConfig; -import org.tasks.LocalBroadcastManager; -import org.tasks.R; -import org.tasks.activities.TagSettingsActivity; -import org.tasks.billing.Inventory; -import org.tasks.data.Place; -import org.tasks.databinding.TaskListActivityBinding; -import org.tasks.dialogs.SortDialog; -import org.tasks.dialogs.WhatsNewDialog; -import org.tasks.filters.PlaceFilter; -import org.tasks.fragments.CommentBarFragment; -import org.tasks.gtasks.PlayServices; -import org.tasks.injection.ActivityComponent; -import org.tasks.injection.InjectingAppCompatActivity; -import org.tasks.intents.TaskIntents; -import org.tasks.preferences.DefaultFilterProvider; -import org.tasks.preferences.Preferences; -import org.tasks.receivers.RepeatConfirmationReceiver; -import org.tasks.themes.ColorProvider; -import org.tasks.themes.Theme; -import org.tasks.themes.ThemeColor; -import org.tasks.ui.DeadlineControlSet; -import org.tasks.ui.EmptyTaskEditFragment; -import org.tasks.ui.NavigationDrawerFragment; -import org.tasks.ui.RemoteListFragment; -import org.tasks.ui.TaskListViewModel; - -public class MainActivity extends InjectingAppCompatActivity - implements TaskListFragment.TaskListFragmentCallbackHandler, - RemoteListFragment.OnListChanged, - TimerControlSet.TimerControlSetCallback, - DeadlineControlSet.DueDateChangeListener, - TaskEditFragment.TaskEditFragmentCallbackHandler, - CommentBarFragment.CommentBarFragmentCallback, - SortDialog.SortDialogCallback { - - /** For indicating the new list screen should be launched at fragment setup time */ - public static final String TOKEN_CREATE_NEW_LIST_NAME = "newListName"; // $NON-NLS-1$ - - public static final String OPEN_FILTER = "open_filter"; // $NON-NLS-1$ - public static final String LOAD_FILTER = "load_filter"; - public static final String CREATE_TASK = "open_task"; // $NON-NLS-1$ - public static final String OPEN_TASK = "open_new_task"; // $NON-NLS-1$ - private static final String FRAG_TAG_TASK_LIST = "frag_tag_task_list"; - private static final String FRAG_TAG_WHATS_NEW = "frag_tag_whats_new"; - private static final String EXTRA_FILTER = "extra_filter"; - - @Inject Preferences preferences; - @Inject RepeatConfirmationReceiver repeatConfirmationReceiver; - @Inject DefaultFilterProvider defaultFilterProvider; - @Inject Theme theme; - @Inject TaskDao taskDao; - @Inject LocalBroadcastManager localBroadcastManager; - @Inject TaskCreator taskCreator; - @Inject PlayServices playServices; - @Inject Inventory inventory; - @Inject ColorProvider colorProvider; - - private CompositeDisposable disposables; - private NavigationDrawerFragment navigationDrawer; - private int currentNightMode; - private boolean currentPro; - - private Filter filter; - private ActionMode actionMode = null; - - private TaskListActivityBinding binding; - - /** @see android.app.Activity#onCreate(Bundle) */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - TaskListViewModel viewModel = new ViewModelProvider(this).get(TaskListViewModel.class); - getComponent().inject(viewModel); - - currentNightMode = getNightMode(); - currentPro = inventory.hasPro(); - - binding = TaskListActivityBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - if (savedInstanceState != null) { - filter = savedInstanceState.getParcelable(EXTRA_FILTER); - applyTheme(); - } - - navigationDrawer = getNavigationDrawerFragment(); - navigationDrawer.setUp(binding.drawerLayout); - - binding.drawerLayout.addDrawerListener( - new DrawerLayout.SimpleDrawerListener() { - @Override - public void onDrawerStateChanged(int newState) { - finishActionMode(); - } - }); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == NavigationDrawerFragment.REQUEST_SETTINGS) { - if (atLeastNougat()) { - recreate(); - } else { - finish(); - startActivity(TaskIntents.getTaskListIntent(this, filter)); - } - } else if (requestCode == REQUEST_NEW_LIST) { - if (resultCode == RESULT_OK && data != null) { - Filter filter = data.getParcelableExtra(MainActivity.OPEN_FILTER); - if (filter != null) { - startActivity(TaskIntents.getTaskListIntent(this, filter)); - } - } - } else if (requestCode == REQUEST_NEW_PLACE) { - if (resultCode == RESULT_OK && data != null) { - Place place = data.getParcelableExtra(EXTRA_PLACE); - if (place != null) { - startActivity(TaskIntents.getTaskListIntent(this, new PlaceFilter(place))); - } - } - } else { - super.onActivityResult(requestCode, resultCode, data); - } - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - - setIntent(intent); - } - - @Override - protected void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putParcelable(EXTRA_FILTER, filter); - } - - private void clearUi() { - finishActionMode(); - navigationDrawer.closeDrawer(); - } - - private @Nullable Task getTaskToLoad(Filter filter) { - Intent intent = getIntent(); - if (intent.hasExtra(CREATE_TASK)) { - intent.removeExtra(CREATE_TASK); - return taskCreator.createWithValues(filter, ""); - } - - if (intent.hasExtra(OPEN_TASK)) { - Task task = intent.getParcelableExtra(OPEN_TASK); - intent.removeExtra(OPEN_TASK); - return task; - } - - return null; - } - - private void openTask(Filter filter) { - Task task = getTaskToLoad(filter); - if (task != null) { - onTaskListItemClicked(task); - } else if (getTaskEditFragment() == null) { - hideDetailFragment(); - } else { - showDetailFragment(); - } - } - - private void handleIntent() { - Intent intent = getIntent(); - - boolean openFilter = intent.hasExtra(OPEN_FILTER); - boolean loadFilter = intent.hasExtra(LOAD_FILTER); - - TaskEditFragment tef = getTaskEditFragment(); - if (tef != null && (openFilter || loadFilter)) { - tef.save(); - } - - if (loadFilter || (!openFilter && filter == null)) { - disposables.add( - Single.fromCallable( - () -> { - String filter = intent.getStringExtra(LOAD_FILTER); - intent.removeExtra(LOAD_FILTER); - return isNullOrEmpty(filter) - ? defaultFilterProvider.getDefaultFilter() - : defaultFilterProvider.getFilterFromPreference(filter); - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - filter -> { - clearUi(); - openTaskListFragment(filter); - openTask(filter); - })); - } else if (openFilter) { - Filter filter = intent.getParcelableExtra(OPEN_FILTER); - intent.removeExtra(OPEN_FILTER); - clearUi(); - openTaskListFragment(filter); - openTask(filter); - } else { - TaskListFragment existing = getTaskListFragment(); - openTaskListFragment( - existing == null || existing.getFilter() != filter - ? newTaskListFragment(getApplicationContext(), filter) - : existing, - false); - openTask(filter); - } - - if (intent.hasExtra(TOKEN_CREATE_NEW_LIST_NAME)) { - final String listName = intent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME); - intent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME); - Intent activityIntent = new Intent(MainActivity.this, TagSettingsActivity.class); - activityIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, listName); - startActivityForResult(activityIntent, REQUEST_NEW_LIST); - } - } - - private void showDetailFragment() { - if (isSinglePaneLayout()) { - binding.detail.setVisibility(View.VISIBLE); - binding.master.setVisibility(View.GONE); - } - } - - private void hideDetailFragment() { - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.detail, EmptyTaskEditFragment.Companion.newEmptyTaskEditFragment(filter)) - .commit(); - - if (isSinglePaneLayout()) { - binding.master.setVisibility(View.VISIBLE); - binding.detail.setVisibility(View.GONE); - } - } - - private void openTaskListFragment(Filter filter) { - openTaskListFragment(filter, false); - } - - private void openTaskListFragment(Filter filter, boolean force) { - openTaskListFragment(newTaskListFragment(getApplicationContext(), filter), force); - } - - private void openTaskListFragment(@NonNull TaskListFragment taskListFragment, boolean force) { - assertMainThread(); - - Filter newFilter = taskListFragment.getFilter(); - if (filter != null - && !force - && filter.areItemsTheSame(newFilter) - && filter.areContentsTheSame(newFilter)) { - return; - } - - filter = newFilter; - navigationDrawer.setSelected(filter); - applyTheme(); - FragmentManager fragmentManager = getSupportFragmentManager(); - fragmentManager - .beginTransaction() - .replace(R.id.master, taskListFragment, FRAG_TAG_TASK_LIST) - .commit(); - fragmentManager.executePendingTransactions(); - } - - private void applyTheme() { - ThemeColor filterColor = getFilterColor(); - filterColor.setStatusBarColor(binding.drawerLayout); - filterColor.applyToNavigationBar(this); - filterColor.applyTaskDescription( - this, filter == null ? getString(R.string.app_name) : filter.listingTitle); - theme.withThemeColor(filterColor).applyToContext(this); - } - - private ThemeColor getFilterColor() { - return filter != null && filter.tint != 0 - ? colorProvider.getThemeColor(filter.tint, true) - : theme.getThemeColor(); - } - - private NavigationDrawerFragment getNavigationDrawerFragment() { - return (NavigationDrawerFragment) - getSupportFragmentManager() - .findFragmentById(NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER); - } - - @Override - protected void onResume() { - super.onResume(); - - if (currentNightMode != getNightMode() || currentPro != inventory.hasPro()) { - recreate(); - return; - } - - localBroadcastManager.registerRepeatReceiver(repeatConfirmationReceiver); - - if (BuildConfig.DEBUG && disposables != null && !disposables.isDisposed()) { - throw new IllegalStateException(); - } - - disposables = new CompositeDisposable(playServices.check(this)); - - if (preferences.getBoolean(R.string.p_just_updated, false)) { - if (preferences.getBoolean(R.string.p_show_whats_new, true)) { - FragmentManager fragmentManager = getSupportFragmentManager(); - if (fragmentManager.findFragmentByTag(FRAG_TAG_WHATS_NEW) == null) { - new WhatsNewDialog().show(fragmentManager, FRAG_TAG_WHATS_NEW); - } - } - preferences.setBoolean(R.string.p_just_updated, false); - } - } - - @Override - protected void onResumeFragments() { - super.onResumeFragments(); - - handleIntent(); - } - - private int getNightMode() { - return getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; - } - - @Override - public void inject(ActivityComponent component) { - component.inject(this); - theme.applyTheme(this); - } - - @Override - protected void onPause() { - super.onPause(); - - localBroadcastManager.unregisterReceiver(repeatConfirmationReceiver); - - if (disposables != null) { - disposables.dispose(); - } - } - - @Override - public void onTaskListItemClicked(Task task) { - assertMainThread(); - - if (task == null) { - return; - } - - TaskEditFragment taskEditFragment = getTaskEditFragment(); - - if (taskEditFragment != null) { - taskEditFragment.save(); - } - - clearUi(); - - if (task.isNew()) { - openTask(task); - } else { - disposables.add( - Single.fromCallable(() -> taskDao.fetch(task.getId())) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::openTask)); - } - } - - private void openTask(Task task) { - getSupportFragmentManager() - .beginTransaction() - .replace( - R.id.detail, - newTaskEditFragment(task, getFilterColor()), - TaskEditFragment.TAG_TASKEDIT_FRAGMENT) - .addToBackStack(TaskEditFragment.TAG_TASKEDIT_FRAGMENT) - .commit(); - - showDetailFragment(); - } - - @Override - public void onNavigationIconClicked() { - hideKeyboard(); - navigationDrawer.openDrawer(); - } - - @Override - public void onBackPressed() { - if (navigationDrawer.isDrawerOpen()) { - navigationDrawer.closeDrawer(); - return; - } - - TaskEditFragment taskEditFragment = getTaskEditFragment(); - if (taskEditFragment != null) { - if (preferences.backButtonSavesTask()) { - taskEditFragment.save(); - } else { - taskEditFragment.discardButtonClick(); - } - return; - } - - TaskListFragment taskListFragment = getTaskListFragment(); - if (taskListFragment != null && taskListFragment.collapseSearchView()) { - return; - } - - finish(); - } - - public TaskListFragment getTaskListFragment() { - return (TaskListFragment) getSupportFragmentManager().findFragmentByTag(FRAG_TAG_TASK_LIST); - } - - public TaskEditFragment getTaskEditFragment() { - return (TaskEditFragment) - getSupportFragmentManager().findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT); - } - - @Override - public Task stopTimer() { - return getTaskEditFragment().stopTimer(); - } - - @Override - public Task startTimer() { - return getTaskEditFragment().startTimer(); - } - - private boolean isSinglePaneLayout() { - return !getResources().getBoolean(R.bool.two_pane_layout); - } - - @Override - public void removeTaskEditFragment() { - getSupportFragmentManager() - .popBackStackImmediate( - TaskEditFragment.TAG_TASKEDIT_FRAGMENT, FragmentManager.POP_BACK_STACK_INCLUSIVE); - hideDetailFragment(); - hideKeyboard(); - getTaskListFragment().loadTaskListContent(); - } - - private void hideKeyboard() { - View view = getCurrentFocus(); - if (view != null) { - InputMethodManager inputMethodManager = - (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - } - - @Override - public void addComment(String message, Uri picture) { - TaskEditFragment taskEditFragment = getTaskEditFragment(); - if (taskEditFragment != null) { - taskEditFragment.addComment(message, picture); - } - } - - @Override - public void sortChanged(boolean reload) { - localBroadcastManager.broadcastRefresh(); - if (reload) { - openTaskListFragment(filter, true); - } - } - - @Override - public void onSupportActionModeStarted(@NonNull ActionMode mode) { - super.onSupportActionModeStarted(mode); - - actionMode = mode; - - ThemeColor filterColor = getFilterColor(); - - applySupportActionModeColor(filterColor, mode); - - filterColor.setStatusBarColor(this); - } - - @Override - @SuppressLint("NewApi") - public void onSupportActionModeFinished(@NonNull ActionMode mode) { - super.onSupportActionModeFinished(mode); - - getWindow().setStatusBarColor(0); - } - - private void finishActionMode() { - if (actionMode != null) { - actionMode.finish(); - actionMode = null; - } - } - - @Override - public void dueDateChanged(long dateTime) { - getTaskEditFragment().onDueDateChanged(dateTime); - } - - @Override - public void onListchanged(@Nullable Filter filter) { - getTaskEditFragment().onRemoteListChanged(filter); - } -} diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt new file mode 100644 index 000000000..edff9cdf6 --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.kt @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2012 Todoroo Inc + * + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.activity + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.res.Configuration +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.view.inputmethod.InputMethodManager +import androidx.appcompat.view.ActionMode +import androidx.drawerlayout.widget.DrawerLayout.SimpleDrawerListener +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.ViewModelProvider +import com.todoroo.andlib.utility.AndroidUtilities +import com.todoroo.astrid.activity.TaskEditFragment.TaskEditFragmentCallbackHandler +import com.todoroo.astrid.activity.TaskListFragment.TaskListFragmentCallbackHandler +import com.todoroo.astrid.api.Filter +import com.todoroo.astrid.dao.TaskDao +import com.todoroo.astrid.data.Task +import com.todoroo.astrid.service.TaskCreator +import com.todoroo.astrid.timers.TimerControlSet.TimerControlSetCallback +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.schedulers.Schedulers +import org.tasks.BuildConfig +import org.tasks.LocalBroadcastManager +import org.tasks.R +import org.tasks.Strings.isNullOrEmpty +import org.tasks.activities.TagSettingsActivity +import org.tasks.billing.Inventory +import org.tasks.data.Place +import org.tasks.databinding.TaskListActivityBinding +import org.tasks.dialogs.SortDialog.SortDialogCallback +import org.tasks.dialogs.WhatsNewDialog +import org.tasks.filters.PlaceFilter +import org.tasks.fragments.CommentBarFragment.CommentBarFragmentCallback +import org.tasks.gtasks.PlayServices +import org.tasks.injection.ActivityComponent +import org.tasks.injection.InjectingAppCompatActivity +import org.tasks.intents.TaskIntents +import org.tasks.location.LocationPickerActivity +import org.tasks.preferences.DefaultFilterProvider +import org.tasks.preferences.Preferences +import org.tasks.receivers.RepeatConfirmationReceiver +import org.tasks.tasklist.ActionUtils +import org.tasks.themes.ColorProvider +import org.tasks.themes.Theme +import org.tasks.themes.ThemeColor +import org.tasks.ui.DeadlineControlSet.DueDateChangeListener +import org.tasks.ui.EmptyTaskEditFragment.Companion.newEmptyTaskEditFragment +import org.tasks.ui.NavigationDrawerFragment +import org.tasks.ui.RemoteListFragment.OnListChanged +import org.tasks.ui.TaskListViewModel +import javax.inject.Inject + +class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandler, OnListChanged, TimerControlSetCallback, DueDateChangeListener, TaskEditFragmentCallbackHandler, CommentBarFragmentCallback, SortDialogCallback { + @Inject lateinit var preferences: Preferences + @Inject lateinit var repeatConfirmationReceiver: RepeatConfirmationReceiver + @Inject lateinit var defaultFilterProvider: DefaultFilterProvider + @Inject lateinit var theme: Theme + @Inject lateinit var taskDao: TaskDao + @Inject lateinit var localBroadcastManager: LocalBroadcastManager + @Inject lateinit var taskCreator: TaskCreator + @Inject lateinit var playServices: PlayServices + @Inject lateinit var inventory: Inventory + @Inject lateinit var colorProvider: ColorProvider + private var disposables: CompositeDisposable? = null + private lateinit var navigationDrawer: NavigationDrawerFragment + private var currentNightMode = 0 + private var currentPro = false + private var filter: Filter? = null + private var actionMode: ActionMode? = null + private lateinit var binding: TaskListActivityBinding + + /** @see android.app.Activity.onCreate + */ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val viewModel = ViewModelProvider(this).get(TaskListViewModel::class.java) + component.inject(viewModel) + currentNightMode = nightMode + currentPro = inventory.hasPro() + binding = TaskListActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + if (savedInstanceState != null) { + filter = savedInstanceState.getParcelable(EXTRA_FILTER) + applyTheme() + } + navigationDrawer = navigationDrawerFragment + navigationDrawer.setUp(binding.drawerLayout) + binding.drawerLayout.addDrawerListener( + object : SimpleDrawerListener() { + override fun onDrawerStateChanged(newState: Int) { + finishActionMode() + } + }) + } + + public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (requestCode == NavigationDrawerFragment.REQUEST_SETTINGS) { + if (AndroidUtilities.atLeastNougat()) { + recreate() + } else { + finish() + startActivity(TaskIntents.getTaskListIntent(this, filter)) + } + } else if (requestCode == NavigationDrawerFragment.REQUEST_NEW_LIST) { + if (resultCode == Activity.RESULT_OK && data != null) { + val filter: Filter? = data.getParcelableExtra(OPEN_FILTER) + if (filter != null) { + startActivity(TaskIntents.getTaskListIntent(this, filter)) + } + } + } else if (requestCode == NavigationDrawerFragment.REQUEST_NEW_PLACE) { + if (resultCode == Activity.RESULT_OK && data != null) { + val place: Place? = data.getParcelableExtra(LocationPickerActivity.EXTRA_PLACE) + if (place != null) { + startActivity(TaskIntents.getTaskListIntent(this, PlaceFilter(place))) + } + } + } else { + super.onActivityResult(requestCode, resultCode, data) + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(EXTRA_FILTER, filter) + } + + private fun clearUi() { + finishActionMode() + navigationDrawer.closeDrawer() + } + + private fun getTaskToLoad(filter: Filter?): Task? { + val intent = intent + if (intent.hasExtra(CREATE_TASK)) { + intent.removeExtra(CREATE_TASK) + return taskCreator.createWithValues(filter, "") + } + if (intent.hasExtra(OPEN_TASK)) { + val task: Task? = intent.getParcelableExtra(OPEN_TASK) + intent.removeExtra(OPEN_TASK) + return task + } + return null + } + + private fun openTask(filter: Filter?) { + val task = getTaskToLoad(filter) + when { + task != null -> onTaskListItemClicked(task) + taskEditFragment == null -> hideDetailFragment() + else -> showDetailFragment() + } + } + + private fun handleIntent() { + val intent = intent + val openFilter = intent.hasExtra(OPEN_FILTER) + val loadFilter = intent.hasExtra(LOAD_FILTER) + val tef = taskEditFragment + if (tef != null && (openFilter || loadFilter)) { + tef.save() + } + if (loadFilter || !openFilter && filter == null) { + disposables!!.add( + Single.fromCallable { + val filter = intent.getStringExtra(LOAD_FILTER) + intent.removeExtra(LOAD_FILTER) + if (isNullOrEmpty(filter)) defaultFilterProvider.defaultFilter else defaultFilterProvider.getFilterFromPreference(filter) + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { filter: Filter? -> + clearUi() + openTaskListFragment(filter) + openTask(filter) + }) + } else if (openFilter) { + val filter: Filter? = intent.getParcelableExtra(OPEN_FILTER) + intent.removeExtra(OPEN_FILTER) + clearUi() + openTaskListFragment(filter) + openTask(filter) + } else { + val existing = taskListFragment + openTaskListFragment( + if (existing == null || existing.filter !== filter) TaskListFragment.newTaskListFragment(applicationContext, filter) else existing, + false) + openTask(filter) + } + if (intent.hasExtra(TOKEN_CREATE_NEW_LIST_NAME)) { + val listName = intent.getStringExtra(TOKEN_CREATE_NEW_LIST_NAME) + intent.removeExtra(TOKEN_CREATE_NEW_LIST_NAME) + val activityIntent = Intent(this@MainActivity, TagSettingsActivity::class.java) + activityIntent.putExtra(TagSettingsActivity.TOKEN_AUTOPOPULATE_NAME, listName) + startActivityForResult(activityIntent, NavigationDrawerFragment.REQUEST_NEW_LIST) + } + } + + private fun showDetailFragment() { + if (isSinglePaneLayout) { + binding.detail.visibility = View.VISIBLE + binding.master.visibility = View.GONE + } + } + + private fun hideDetailFragment() { + supportFragmentManager + .beginTransaction() + .replace(R.id.detail, newEmptyTaskEditFragment(filter!!)) + .commit() + if (isSinglePaneLayout) { + binding.master.visibility = View.VISIBLE + binding.detail.visibility = View.GONE + } + } + + private fun openTaskListFragment(filter: Filter?, force: Boolean = false) { + openTaskListFragment(TaskListFragment.newTaskListFragment(applicationContext, filter), force) + } + + private fun openTaskListFragment(taskListFragment: TaskListFragment, force: Boolean) { + AndroidUtilities.assertMainThread() + val newFilter = taskListFragment.filter + if (filter != null && !force + && filter!!.areItemsTheSame(newFilter) + && filter!!.areContentsTheSame(newFilter)) { + return + } + filter = newFilter + navigationDrawer.setSelected(filter) + applyTheme() + val fragmentManager = supportFragmentManager + fragmentManager + .beginTransaction() + .replace(R.id.master, taskListFragment, FRAG_TAG_TASK_LIST) + .commit() + fragmentManager.executePendingTransactions() + } + + private fun applyTheme() { + val filterColor = filterColor + filterColor.setStatusBarColor(binding.drawerLayout) + filterColor.applyToNavigationBar(this) + filterColor.applyTaskDescription(this, filter?.listingTitle ?: getString(R.string.app_name)) + theme.withThemeColor(filterColor).applyToContext(this) + } + + private val filterColor: ThemeColor + get() = if (filter != null && filter!!.tint != 0) colorProvider.getThemeColor(filter!!.tint, true) else theme.themeColor + + private val navigationDrawerFragment: NavigationDrawerFragment + get() = supportFragmentManager + .findFragmentById(NavigationDrawerFragment.FRAGMENT_NAVIGATION_DRAWER) as NavigationDrawerFragment + + override fun onResume() { + super.onResume() + if (currentNightMode != nightMode || currentPro != inventory.hasPro()) { + recreate() + return + } + localBroadcastManager.registerRepeatReceiver(repeatConfirmationReceiver) + check(!(BuildConfig.DEBUG && disposables != null && !disposables!!.isDisposed)) + disposables = CompositeDisposable(playServices.check(this)) + if (preferences.getBoolean(R.string.p_just_updated, false)) { + if (preferences.getBoolean(R.string.p_show_whats_new, true)) { + val fragmentManager = supportFragmentManager + if (fragmentManager.findFragmentByTag(FRAG_TAG_WHATS_NEW) == null) { + WhatsNewDialog().show(fragmentManager, FRAG_TAG_WHATS_NEW) + } + } + preferences.setBoolean(R.string.p_just_updated, false) + } + } + + override fun onResumeFragments() { + super.onResumeFragments() + handleIntent() + } + + private val nightMode: Int + get() = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + + override fun inject(component: ActivityComponent) { + component.inject(this) + theme.applyTheme(this) + } + + override fun onPause() { + super.onPause() + localBroadcastManager.unregisterReceiver(repeatConfirmationReceiver) + disposables?.dispose() + } + + override fun onTaskListItemClicked(task: Task?) { + AndroidUtilities.assertMainThread() + if (task == null) { + return + } + val taskEditFragment = taskEditFragment + taskEditFragment?.save() + clearUi() + if (task.isNew) { + openTask(task) + } else { + disposables!!.add( + Single.fromCallable { taskDao.fetch(task.id) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { t: Task? -> this.openTask(t) }) + } + } + + private fun openTask(task: Task?) { + supportFragmentManager + .beginTransaction() + .replace( + R.id.detail, + TaskEditFragment.newTaskEditFragment(task, filterColor), + TaskEditFragment.TAG_TASKEDIT_FRAGMENT) + .addToBackStack(TaskEditFragment.TAG_TASKEDIT_FRAGMENT) + .commit() + showDetailFragment() + } + + override fun onNavigationIconClicked() { + hideKeyboard() + navigationDrawer.openDrawer() + } + + override fun onBackPressed() { + if (navigationDrawer.isDrawerOpen) { + navigationDrawer.closeDrawer() + return + } + val taskEditFragment = taskEditFragment + if (taskEditFragment != null) { + if (preferences.backButtonSavesTask()) { + taskEditFragment.save() + } else { + taskEditFragment.discardButtonClick() + } + return + } + if (taskListFragment?.collapseSearchView() == true) { + return + } + finish() + } + + val taskListFragment: TaskListFragment? + get() = supportFragmentManager.findFragmentByTag(FRAG_TAG_TASK_LIST) as TaskListFragment? + + val taskEditFragment: TaskEditFragment? + get() = supportFragmentManager.findFragmentByTag(TaskEditFragment.TAG_TASKEDIT_FRAGMENT) as TaskEditFragment? + + override fun stopTimer(): Task { + return taskEditFragment!!.stopTimer() + } + + override fun startTimer(): Task { + return taskEditFragment!!.startTimer() + } + + private val isSinglePaneLayout: Boolean + get() = !resources.getBoolean(R.bool.two_pane_layout) + + override fun removeTaskEditFragment() { + supportFragmentManager + .popBackStackImmediate( + TaskEditFragment.TAG_TASKEDIT_FRAGMENT, FragmentManager.POP_BACK_STACK_INCLUSIVE) + hideDetailFragment() + hideKeyboard() + taskListFragment?.loadTaskListContent() + } + + private fun hideKeyboard() { + val view = currentFocus + if (view != null) { + val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) + } + } + + override fun addComment(message: String?, picture: Uri?) { + val taskEditFragment = taskEditFragment + taskEditFragment?.addComment(message, picture) + } + + override fun sortChanged(reload: Boolean) { + localBroadcastManager.broadcastRefresh() + if (reload) { + openTaskListFragment(filter, true) + } + } + + override fun onSupportActionModeStarted(mode: ActionMode) { + super.onSupportActionModeStarted(mode) + actionMode = mode + val filterColor = filterColor + ActionUtils.applySupportActionModeColor(filterColor, mode) + filterColor.setStatusBarColor(this) + } + + @SuppressLint("NewApi") + override fun onSupportActionModeFinished(mode: ActionMode) { + super.onSupportActionModeFinished(mode) + window.statusBarColor = 0 + } + + private fun finishActionMode() { + actionMode?.finish() + actionMode = null + } + + override fun dueDateChanged(dateTime: Long) { + taskEditFragment!!.onDueDateChanged(dateTime) + } + + override fun onListchanged(filter: Filter?) { + taskEditFragment!!.onRemoteListChanged(filter) + } + + companion object { + /** For indicating the new list screen should be launched at fragment setup time */ + const val TOKEN_CREATE_NEW_LIST_NAME = "newListName" // $NON-NLS-1$ + const val OPEN_FILTER = "open_filter" // $NON-NLS-1$ + const val LOAD_FILTER = "load_filter" + const val CREATE_TASK = "open_task" // $NON-NLS-1$ + const val OPEN_TASK = "open_new_task" // $NON-NLS-1$ + private const val FRAG_TAG_TASK_LIST = "frag_tag_task_list" + private const val FRAG_TAG_WHATS_NEW = "frag_tag_whats_new" + private const val EXTRA_FILTER = "extra_filter" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt b/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt index 5e2e655f1..9a71a8aea 100644 --- a/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt @@ -57,7 +57,7 @@ class TimerControlSet : TaskEditControlFragment() { private var timerStarted: Long = 0 private var dialog: AlertDialog? = null private lateinit var dialogView: View - private var callback: TimerControlSetCallback? = null + private lateinit var callback: TimerControlSetCallback override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -118,13 +118,13 @@ class TimerControlSet : TaskEditControlFragment() { @OnClick(R.id.timer_container) fun timerClicked() { if (timerActive()) { - val task = callback!!.stopTimer() + val task = callback.stopTimer() elapsed.setTimeDuration(task.elapsedSeconds) timerStarted = 0 chronometer.stop() refreshDisplayView() } else { - val task = callback!!.startTimer() + val task = callback.startTimer() timerStarted = task.timerStart chronometer.start() } diff --git a/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt b/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt index f395005c9..6c09a17f9 100644 --- a/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt +++ b/app/src/main/java/org/tasks/ui/SubtaskControlSet.kt @@ -257,7 +257,7 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks } override fun openSubtask(task: Task) { - (activity as MainActivity).taskListFragment.onTaskListItemClicked(task) + (activity as MainActivity).taskListFragment?.onTaskListItemClicked(task) } override fun toggleSubtask(taskId: Long, collapsed: Boolean) {