/* * Copyright © 2013 – 2016 Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package com.etesync.syncadapter.ui import android.accounts.Account import android.app.Dialog import android.app.ProgressDialog import android.content.Context import android.os.Bundle import android.text.TextUtils import androidx.appcompat.app.AlertDialog import androidx.fragment.app.DialogFragment import androidx.loader.app.LoaderManager import androidx.loader.content.AsyncTaskLoader import androidx.loader.content.Loader import com.etesync.syncadapter.* import com.etesync.journalmanager.Crypto import com.etesync.journalmanager.Exceptions import com.etesync.journalmanager.JournalManager import com.etesync.syncadapter.model.CollectionInfo import com.etesync.syncadapter.model.JournalEntity import okhttp3.HttpUrl.Companion.toHttpUrlOrNull class DeleteCollectionFragment : DialogFragment(), LoaderManager.LoaderCallbacks { protected lateinit var account: Account protected lateinit var collectionInfo: CollectionInfo override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) loaderManager.initLoader(0, arguments, this) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val progress = ProgressDialog(context) progress.setTitle(R.string.delete_collection_deleting_collection) progress.setMessage(getString(R.string.please_wait)) progress.isIndeterminate = true progress.setCanceledOnTouchOutside(false) isCancelable = false return progress } override fun onCreateLoader(id: Int, args: Bundle?): Loader { account = args!!.getParcelable(ARG_ACCOUNT)!! collectionInfo = args.getSerializable(ARG_COLLECTION_INFO) as CollectionInfo return DeleteCollectionLoader(context!!, account, collectionInfo) } override fun onLoadFinished(loader: Loader, exception: Exception?) { dismissAllowingStateLoss() if (exception != null) fragmentManager!!.beginTransaction() .add(ExceptionInfoFragment.newInstance(exception, account), null) .commitAllowingStateLoss() else { val activity = activity if (activity is Refreshable) (activity as Refreshable).refresh() else if (activity is EditCollectionActivity) activity.finish() } } override fun onLoaderReset(loader: Loader) {} protected class DeleteCollectionLoader(context: Context, internal val account: Account, internal val collectionInfo: CollectionInfo) : AsyncTaskLoader(context) { override fun onStartLoading() { forceLoad() } override fun loadInBackground(): Exception? { try { // delete collection locally val data = (context.applicationContext as App).data val settings = AccountSettings(context, account) val principal = settings.uri?.toHttpUrlOrNull() val httpClient = HttpClient.Builder(context, settings).build().okHttpClient val journalManager = JournalManager(httpClient, principal!!) val crypto = Crypto.CryptoManager(collectionInfo.version, settings.password(), collectionInfo.uid!!) journalManager.delete(JournalManager.Journal(crypto, collectionInfo.toJson(), collectionInfo.uid!!)) val journalEntity = JournalEntity.fetch(data, collectionInfo.getServiceEntity(data), collectionInfo.uid) journalEntity!!.isDeleted = true data.update(journalEntity) return null } catch (e: Exceptions.HttpException) { return e } catch (e: Exceptions.IntegrityException) { return e } catch (e: Exceptions.GenericCryptoException) { return e } catch (e: InvalidAccountException) { return e } } } class ConfirmDeleteCollectionFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val collectionInfo = arguments!!.getSerializable(ARG_COLLECTION_INFO) as CollectionInfo val name = if (TextUtils.isEmpty(collectionInfo.displayName)) collectionInfo.uid else collectionInfo.displayName return AlertDialog.Builder(context!!) .setTitle(R.string.delete_collection_confirm_title) .setMessage(getString(R.string.delete_collection_confirm_warning, name)) .setPositiveButton(android.R.string.yes) { dialog, _ -> val frag = DeleteCollectionFragment() frag.arguments = arguments frag.show(fragmentManager!!, null) } .setNegativeButton(android.R.string.no) { _, _ -> dismiss() } .create() } companion object { fun newInstance(account: Account, collectionInfo: CollectionInfo): ConfirmDeleteCollectionFragment { val frag = ConfirmDeleteCollectionFragment() val args = Bundle(2) args.putParcelable(ARG_ACCOUNT, account) args.putSerializable(ARG_COLLECTION_INFO, collectionInfo) frag.arguments = args return frag } } } companion object { protected val ARG_ACCOUNT = "account" protected val ARG_COLLECTION_INFO = "collectionInfo" } }