Convert MainActivity to Kotlin

pull/996/head
Alex Baker 4 years ago
parent 47d414f20f
commit 1d1f132806

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

@ -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"
}
}

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

@ -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) {

Loading…
Cancel
Save