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.
etesync-android/app/src/main/java/com/etesync/syncadapter/ui/journalviewer/ListEntriesFragment.kt

176 lines
6.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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.journalviewer
import android.accounts.Account
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.ListFragment
import com.etesync.journalmanager.model.SyncEntry
import com.etesync.syncadapter.App
import com.etesync.syncadapter.R
import com.etesync.syncadapter.model.*
import com.etesync.syncadapter.ui.JournalItemActivity
import com.etesync.syncadapter.ui.ViewCollectionActivity
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import java.util.concurrent.Future
class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener {
private lateinit var data: MyEntityDataStore
private lateinit var account: Account
private lateinit var info: CollectionInfo
private var journalEntity: JournalEntity? = null
private var asyncTask: Future<Unit>? = null
private var emptyTextView: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
data = (context!!.applicationContext as App).data
account = arguments!!.getParcelable(ViewCollectionActivity.EXTRA_ACCOUNT)!!
info = arguments!!.getSerializable(EXTRA_COLLECTION_INFO) as CollectionInfo
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
activity!!.title = info.displayName
val view = inflater.inflate(R.layout.journal_viewer_list, container, false)
//This is instead of setEmptyText() function because of Google bug
//See: https://code.google.com/p/android/issues/detail?id=21742
emptyTextView = view.findViewById<View>(android.R.id.empty) as TextView
return view
}
fun loadEntries(): List<EntryEntity> {
journalEntity = JournalModel.Journal.fetch(data, info.getServiceEntity(data), info.uid)
return data.select(EntryEntity::class.java).where(EntryEntity.JOURNAL.eq(journalEntity)).orderBy(EntryEntity.ID.desc()).get().toList()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
asyncTask = doAsync {
val entries = loadEntries()
uiThread {
val listAdapter = EntriesListAdapter(context!!)
setListAdapter(listAdapter)
listAdapter.addAll(entries)
emptyTextView!!.text = getString(R.string.journal_entries_list_empty)
}
}
listView.onItemClickListener = this
}
override fun onDestroyView() {
super.onDestroyView()
if (asyncTask != null)
asyncTask!!.cancel(true)
}
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
val entry = listAdapter?.getItem(position) as EntryEntity
startActivity(JournalItemActivity.newIntent(context!!, account, info, entry.content))
}
internal inner class EntriesListAdapter(context: Context) : ArrayAdapter<EntryEntity>(context, R.layout.journal_viewer_list_item) {
override fun getView(position: Int, _v: View?, parent: ViewGroup): View {
var v = _v
if (v == null)
v = LayoutInflater.from(context).inflate(R.layout.journal_viewer_list_item, parent, false)!!
val entryEntity = getItem(position)
// FIXME: hacky way to make it show sensible info
val info = journalEntity!!.info
setJournalEntryView(v, info, entryEntity!!.content)
val entryError = data.select(EntryErrorEntity::class.java).where(EntryErrorEntity.ENTRY.eq(entryEntity)).limit(1).get().firstOrNull()
if (entryError != null) {
val errorIcon = v.findViewById<View>(R.id.error) as ImageView
errorIcon.visibility = View.VISIBLE
}
return v
}
}
companion object {
protected val EXTRA_COLLECTION_INFO = "collectionInfo"
fun newInstance(account: Account, info: CollectionInfo): ListEntriesFragment {
val frag = ListEntriesFragment()
val args = Bundle(1)
args.putParcelable(ViewCollectionActivity.EXTRA_ACCOUNT, account)
args.putSerializable(EXTRA_COLLECTION_INFO, info)
frag.arguments = args
return frag
}
private fun getLine(content: String?, prefix: String): String? {
var content: String? = content ?: return null
val start = content!!.indexOf(prefix)
if (start >= 0) {
val end = content.indexOf("\n", start)
content = content.substring(start + prefix.length, end)
} else {
content = null
}
return content
}
fun setJournalEntryView(v: View, info: CollectionInfo, syncEntry: SyncEntry) {
var tv = v.findViewById<View>(R.id.title) as TextView
// FIXME: hacky way to make it show sensible info
val fullContent = syncEntry.content
var prefix = ""
when (info.enumType) {
CollectionInfo.Type.CALENDAR, CollectionInfo.Type.TASKS -> {
prefix = "SUMMARY:"
}
CollectionInfo.Type.ADDRESS_BOOK -> {
prefix = "FN:"
}
}
var content = getLine(fullContent, prefix)
content = content ?: "Not found"
tv.text = content
tv = v.findViewById<View>(R.id.description) as TextView
content = getLine(fullContent, "UID:")
content = "UID: " + (content ?: "Not found")
tv.text = content
val action = v.findViewById<View>(R.id.action) as ImageView
when (syncEntry.action) {
SyncEntry.Actions.ADD -> action.setImageResource(R.drawable.action_add)
SyncEntry.Actions.CHANGE -> action.setImageResource(R.drawable.action_change)
SyncEntry.Actions.DELETE -> action.setImageResource(R.drawable.action_delete)
}
}
}
}