package org.tasks.activities import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.ProgressBar import androidx.activity.viewModels import com.google.android.material.textfield.TextInputEditText import com.google.api.services.tasks.model.TaskList import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.TaskListFragment import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.service.TaskDeleter import dagger.hilt.android.AndroidEntryPoint import org.tasks.R import org.tasks.Strings.isNullOrEmpty import org.tasks.data.CaldavAccount import org.tasks.data.CaldavCalendar import org.tasks.data.GoogleTaskListDao import org.tasks.databinding.ActivityGoogleTaskListSettingsBinding import org.tasks.extensions.Context.toast import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint class GoogleTaskListSettingsActivity : BaseListSettingsActivity() { @Inject lateinit var googleTaskListDao: GoogleTaskListDao @Inject lateinit var taskDeleter: TaskDeleter private lateinit var name: TextInputEditText private lateinit var progressView: ProgressBar private var isNewList = false private lateinit var gtasksList: CaldavCalendar private val createListViewModel: CreateListViewModel by viewModels() private val renameListViewModel: RenameListViewModel by viewModels() private val deleteListViewModel: DeleteListViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA) ?: CaldavCalendar( account = intent.getParcelableExtra(EXTRA_ACCOUNT)!!.username ).apply { isNewList = true } super.onCreate(savedInstanceState) if (savedInstanceState == null) { selectedColor = gtasksList.color selectedIcon = gtasksList.getIcon()!! } if (isNewList) { name.requestFocus() val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.showSoftInput(name, InputMethodManager.SHOW_IMPLICIT) } else { name.setText(gtasksList.name) } if (createListViewModel.inProgress || renameListViewModel.inProgress || deleteListViewModel.inProgress) { showProgressIndicator() } createListViewModel.observe(this, this::onListCreated, this::requestFailed) renameListViewModel.observe(this, this::onListRenamed, this::requestFailed) deleteListViewModel.observe(this, this::onListDeleted, this::requestFailed) updateTheme() } override val isNew: Boolean get() = isNewList override val toolbarTitle: String? get() = if (isNew) getString(R.string.new_list) else gtasksList.name!! private fun showProgressIndicator() { progressView.visibility = View.VISIBLE } private fun hideProgressIndicator() { progressView.visibility = View.GONE } private fun requestInProgress() = progressView.visibility == View.VISIBLE override suspend fun save() { if (requestInProgress()) { return } val newName = newName if (isNullOrEmpty(newName)) { toast(R.string.name_cannot_be_empty) return } when { isNewList -> { showProgressIndicator() createListViewModel.createList(gtasksList.account!!, newName) } nameChanged() -> { showProgressIndicator() renameListViewModel.renameList(gtasksList, newName) } else -> { if (colorChanged() || iconChanged()) { gtasksList.color = selectedColor gtasksList.setIcon(selectedIcon) googleTaskListDao.insertOrReplace(gtasksList) setResult( Activity.RESULT_OK, Intent(TaskListFragment.ACTION_RELOAD) .putExtra(MainActivity.OPEN_FILTER, GtasksFilter(gtasksList))) } finish() } } } override fun finish() { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(name.windowToken, 0) super.finish() } override fun bind() = ActivityGoogleTaskListSettingsBinding.inflate(layoutInflater).let { name = it.name progressView = it.progressBar.progressBar it.root } override fun promptDelete() { if (!requestInProgress()) { super.promptDelete() } } override suspend fun delete() { showProgressIndicator() deleteListViewModel.deleteList(gtasksList) } override fun discard() { if (!requestInProgress()) { super.discard() } } private val newName: String get() = name.text.toString().trim { it <= ' ' } override fun hasChanges(): Boolean = if (isNewList) { selectedColor >= 0 || !isNullOrEmpty(newName) } else colorChanged() || nameChanged() || iconChanged() private fun colorChanged() = selectedColor != gtasksList.color private fun iconChanged() = selectedIcon != gtasksList.getIcon() private fun nameChanged() = newName != gtasksList.name private suspend fun onListCreated(taskList: TaskList) { with(gtasksList) { uuid = taskList.id name = taskList.title color = selectedColor setIcon(selectedIcon) id = googleTaskListDao.insertOrReplace(this) } setResult( Activity.RESULT_OK, Intent().putExtra(MainActivity.OPEN_FILTER, GtasksFilter(gtasksList))) finish() } private fun onListDeleted(deleted: Boolean) { if (deleted) { taskDeleter.deleteGoogleTaskList(gtasksList) setResult(Activity.RESULT_OK, Intent(TaskListFragment.ACTION_DELETED)) finish() } } private suspend fun onListRenamed(taskList: TaskList) { with(gtasksList) { name = taskList.title color = selectedColor setIcon(selectedIcon) googleTaskListDao.insertOrReplace(this) } setResult( Activity.RESULT_OK, Intent(TaskListFragment.ACTION_RELOAD) .putExtra(MainActivity.OPEN_FILTER, GtasksFilter(gtasksList))) finish() } private fun requestFailed(error: Throwable) { Timber.e(error) hideProgressIndicator() toast(R.string.gtasks_GLA_errorIOAuth) return } companion object { const val EXTRA_ACCOUNT = "extra_account" const val EXTRA_STORE_DATA = "extra_store_data" } }