mirror of https://github.com/etesync/android
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
7.9 KiB
176 lines
7.9 KiB
package com.etesync.syncadapter.ui.etebase
|
|
|
|
import android.app.Dialog
|
|
import android.app.ProgressDialog
|
|
import android.os.Bundle
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.Button
|
|
import android.widget.CheckBox
|
|
import android.widget.EditText
|
|
import android.widget.TextView
|
|
import androidx.appcompat.app.AlertDialog
|
|
import androidx.fragment.app.DialogFragment
|
|
import androidx.fragment.app.Fragment
|
|
import androidx.fragment.app.activityViewModels
|
|
import com.etebase.client.CollectionAccessLevel
|
|
import com.etebase.client.Utils
|
|
import com.etebase.client.exceptions.EtebaseException
|
|
import com.etebase.client.exceptions.NotFoundException
|
|
import com.etesync.syncadapter.CachedCollection
|
|
import com.etesync.syncadapter.Constants
|
|
import com.etesync.syncadapter.R
|
|
import com.etesync.syncadapter.resource.LocalCalendar
|
|
import com.etesync.syncadapter.syncadapter.requestSync
|
|
import com.etesync.syncadapter.ui.BaseActivity
|
|
import org.jetbrains.anko.doAsync
|
|
import org.jetbrains.anko.uiThread
|
|
|
|
class CollectionMembersFragment : Fragment() {
|
|
private val model: AccountViewModel by activityViewModels()
|
|
private val collectionModel: CollectionViewModel by activityViewModels()
|
|
private var isAdmin: Boolean = false
|
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
|
val ret = if (collectionModel.value!!.col.accessLevel == CollectionAccessLevel.Admin) {
|
|
isAdmin = true
|
|
inflater.inflate(R.layout.etebase_view_collection_members, container, false)
|
|
} else {
|
|
inflater.inflate(R.layout.etebase_view_collection_members_no_access, container, false)
|
|
}
|
|
|
|
if (savedInstanceState == null) {
|
|
collectionModel.observe(this) {
|
|
(activity as? BaseActivity?)?.supportActionBar?.setTitle(R.string.collection_members_title)
|
|
if (container != null) {
|
|
initUi(inflater, ret, it)
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
private fun initUi(inflater: LayoutInflater, v: View, cachedCollection: CachedCollection) {
|
|
val meta = cachedCollection.meta
|
|
val colorSquare = v.findViewById<View>(R.id.color)
|
|
val color = LocalCalendar.parseColor(meta.color)
|
|
when (meta.collectionType) {
|
|
Constants.ETEBASE_TYPE_CALENDAR -> {
|
|
colorSquare.setBackgroundColor(color)
|
|
}
|
|
Constants.ETEBASE_TYPE_TASKS -> {
|
|
colorSquare.setBackgroundColor(color)
|
|
}
|
|
Constants.ETEBASE_TYPE_ADDRESS_BOOK -> {
|
|
colorSquare.visibility = View.GONE
|
|
}
|
|
}
|
|
|
|
val title = v.findViewById<View>(R.id.display_name) as TextView
|
|
title.text = meta.name
|
|
|
|
val desc = v.findViewById<View>(R.id.description) as TextView
|
|
desc.text = meta.description
|
|
|
|
if (isAdmin) {
|
|
v.findViewById<View>(R.id.add_member).setOnClickListener {
|
|
addMemberClicked()
|
|
}
|
|
} else {
|
|
v.findViewById<Button>(R.id.leave).setOnClickListener {
|
|
doAsync {
|
|
val membersManager = model.value!!.colMgr.getMemberManager(cachedCollection.col)
|
|
membersManager.leave()
|
|
val applicationContext = activity?.applicationContext
|
|
if (applicationContext != null) {
|
|
requestSync(applicationContext, model.value!!.account)
|
|
}
|
|
activity?.finish()
|
|
}
|
|
}
|
|
}
|
|
|
|
v.findViewById<View>(R.id.progressBar).visibility = View.GONE
|
|
}
|
|
|
|
private fun addMemberClicked() {
|
|
val view = View.inflate(requireContext(), R.layout.add_member_fragment, null)
|
|
val dialog = AlertDialog.Builder(requireContext())
|
|
.setTitle(R.string.collection_members_add)
|
|
.setIcon(R.drawable.ic_account_add_dark)
|
|
.setPositiveButton(android.R.string.yes) { _, _ ->
|
|
val username = view.findViewById<EditText>(R.id.username).text.toString()
|
|
val readOnly = view.findViewById<CheckBox>(R.id.read_only).isChecked
|
|
|
|
val frag = AddMemberFragment(model.value!!, collectionModel.value!!, username, if (readOnly) CollectionAccessLevel.ReadOnly else CollectionAccessLevel.ReadWrite)
|
|
frag.show(childFragmentManager, null)
|
|
}
|
|
.setNegativeButton(android.R.string.no) { _, _ -> }
|
|
dialog.setView(view)
|
|
dialog.show()
|
|
}
|
|
}
|
|
|
|
class AddMemberFragment(private val accountHolder: AccountHolder, private val cachedCollection: CachedCollection, private val username: String, private val accessLevel: CollectionAccessLevel) : DialogFragment() {
|
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
val progress = ProgressDialog(context)
|
|
progress.setTitle(R.string.collection_members_adding)
|
|
progress.setMessage(getString(R.string.please_wait))
|
|
progress.isIndeterminate = true
|
|
progress.setCanceledOnTouchOutside(false)
|
|
isCancelable = false
|
|
|
|
doAsync {
|
|
val invitationManager = accountHolder.etebase.invitationManager
|
|
try {
|
|
val profile = invitationManager.fetchUserProfile(username)
|
|
val fingerprint = Utils.prettyFingerprint(profile.pubkey)
|
|
uiThread {
|
|
val view = LayoutInflater.from(context).inflate(R.layout.fingerprint_alertdialog, null)
|
|
(view.findViewById<View>(R.id.body) as TextView).text = getString(R.string.trust_fingerprint_body, username)
|
|
(view.findViewById<View>(R.id.fingerprint) as TextView).text = fingerprint
|
|
AlertDialog.Builder(requireContext())
|
|
.setIcon(R.drawable.ic_fingerprint_dark)
|
|
.setTitle(R.string.trust_fingerprint_title)
|
|
.setView(view)
|
|
.setPositiveButton(android.R.string.ok) { _, _ ->
|
|
doAsync {
|
|
try {
|
|
invitationManager.invite(cachedCollection.col, username, profile.pubkey, accessLevel)
|
|
uiThread {
|
|
AlertDialog.Builder(requireContext())
|
|
.setTitle(R.string.collection_members_add)
|
|
.setIcon(R.drawable.ic_account_add_dark)
|
|
.setMessage(R.string.collection_members_add_success)
|
|
.setPositiveButton(android.R.string.yes) { _, _ -> }
|
|
.show()
|
|
dismiss()
|
|
}
|
|
} catch (e: EtebaseException) {
|
|
uiThread { handleError(e.localizedMessage) }
|
|
}
|
|
}
|
|
}
|
|
.setNegativeButton(android.R.string.cancel) { _, _ -> dismiss() }.show()
|
|
}
|
|
} catch (e: NotFoundException) {
|
|
uiThread { handleError(getString(R.string.collection_members_error_user_not_found, username)) }
|
|
} catch (e: EtebaseException) {
|
|
uiThread { handleError(e.localizedMessage) }
|
|
}
|
|
}
|
|
|
|
return progress
|
|
}
|
|
|
|
private fun handleError(message: String) {
|
|
AlertDialog.Builder(requireContext())
|
|
.setIcon(R.drawable.ic_error_dark)
|
|
.setTitle(R.string.collection_members_add_error)
|
|
.setMessage(message)
|
|
.setPositiveButton(android.R.string.yes) { _, _ -> }.show()
|
|
dismiss()
|
|
}
|
|
} |