1
0
mirror of https://github.com/etesync/android synced 2025-02-02 19:01:06 +00:00

Event invitations: add a button to send an email invite from the journal item view.

This commit is contained in:
Tom Hacohen 2019-01-08 19:46:59 +00:00
parent 7b0cdff9dc
commit fe7aa2208b
5 changed files with 57 additions and 7 deletions

View File

@ -1,5 +1,6 @@
package com.etesync.syncadapter.ui
import android.accounts.Account
import android.content.Context
import android.content.Intent
import android.os.Bundle
@ -11,9 +12,7 @@ import android.support.v4.view.ViewPager
import android.text.format.DateFormat
import android.text.format.DateUtils
import android.text.format.Time
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.*
import android.widget.TextView
import at.bitfire.ical4android.Event
import at.bitfire.ical4android.InvalidCalendarException
@ -26,6 +25,7 @@ import com.etesync.syncadapter.model.CollectionInfo
import com.etesync.syncadapter.model.JournalEntity
import com.etesync.syncadapter.model.SyncEntry
import com.etesync.syncadapter.ui.journalviewer.ListEntriesFragment.Companion.setJournalEntryView
import com.etesync.syncadapter.utils.EventEmailInvitation
import ezvcard.util.PartialDate
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
@ -37,8 +37,11 @@ import java.util.concurrent.Future
class JournalItemActivity : BaseActivity(), Refreshable {
private var journalEntity: JournalEntity? = null
private lateinit var account: Account
protected lateinit var info: CollectionInfo
private lateinit var syncEntry: SyncEntry
private var emailInvitationEvent: Event? = null
private var emailInvitationEventString: String? = null
override fun refresh() {
val data = (applicationContext as App).data
@ -49,6 +52,7 @@ class JournalItemActivity : BaseActivity(), Refreshable {
return
}
account = intent.extras!!.getParcelable(ViewCollectionActivity.EXTRA_ACCOUNT)!!
info = journalEntity!!.info
title = info.displayName
@ -75,6 +79,24 @@ class JournalItemActivity : BaseActivity(), Refreshable {
tabLayout.setupWithViewPager(viewPager)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
if (emailInvitationEvent != null) {
menuInflater.inflate(R.menu.activity_journal_item, menu)
}
return true
}
fun allowSendEmail(event: Event?, icsContent: String) {
emailInvitationEvent = event
emailInvitationEventString = icsContent
invalidateOptionsMenu()
}
fun sendEventInvite(item: MenuItem) {
val intent = EventEmailInvitation(this, account).createIntent(emailInvitationEvent!!, emailInvitationEventString!!)
startActivity(intent)
}
private class TabsAdapter(fm: FragmentManager, private val context: Context, private val info: CollectionInfo, private val syncEntry: SyncEntry) : FragmentPagerAdapter(fm) {
override fun getCount(): Int {
@ -220,6 +242,10 @@ class JournalItemActivity : BaseActivity(), Refreshable {
sb.append(alarm.trigger.value)
}
setTextViewText(view, R.id.reminders, sb.toString())
if (event.attendees.isNotEmpty() && activity != null) {
(activity as JournalItemActivity).allowSendEmail(event, syncEntry.content)
}
}
}
}
@ -467,8 +493,9 @@ class JournalItemActivity : BaseActivity(), Refreshable {
companion object {
private val KEY_SYNC_ENTRY = "syncEntry"
fun newIntent(context: Context, info: CollectionInfo, syncEntry: SyncEntry): Intent {
fun newIntent(context: Context, account: Account, info: CollectionInfo, syncEntry: SyncEntry): Intent {
val intent = Intent(context, JournalItemActivity::class.java)
intent.putExtra(ViewCollectionActivity.EXTRA_ACCOUNT, account)
intent.putExtra(Constants.KEY_COLLECTION_INFO, info)
intent.putExtra(KEY_SYNC_ENTRY, syncEntry)
return intent

View File

@ -102,7 +102,7 @@ class ViewCollectionActivity : BaseActivity(), Refreshable {
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.add(R.id.list_entries_container, ListEntriesFragment.newInstance(info))
.add(R.id.list_entries_container, ListEntriesFragment.newInstance(account, info))
.commit()
}

View File

@ -8,6 +8,7 @@
package com.etesync.syncadapter.ui.journalviewer
import android.accounts.Account
import android.content.Context
import android.os.Bundle
import android.support.v4.app.ListFragment
@ -22,6 +23,7 @@ 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 io.requery.Persistable
import io.requery.sql.EntityDataStore
import org.jetbrains.anko.doAsync
@ -31,6 +33,7 @@ import java.util.concurrent.Future
class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener {
private lateinit var data: EntityDataStore<Persistable>
private lateinit var account: Account
private lateinit var info: CollectionInfo
private var journalEntity: JournalEntity? = null
private var asyncTask: Future<Unit>? = null
@ -40,6 +43,7 @@ class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener {
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
}
@ -85,7 +89,7 @@ class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener {
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
val entry = listAdapter.getItem(position) as EntryEntity
startActivity(JournalItemActivity.newIntent(context!!, info, entry.content))
startActivity(JournalItemActivity.newIntent(context!!, account, info, entry.content))
}
internal inner class EntriesListAdapter(context: Context) : ArrayAdapter<EntryEntity>(context, R.layout.journal_viewer_list_item) {
@ -110,9 +114,10 @@ class ListEntriesFragment : ListFragment(), AdapterView.OnItemClickListener {
companion object {
protected val EXTRA_COLLECTION_INFO = "collectionInfo"
fun newInstance(info: CollectionInfo): ListEntriesFragment {
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

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:title="@string/calendar_attendees_send_email_action"
android:icon="@drawable/ic_email_black"
android:onClick="sendEventInvite"
app:showAsAction="always" />
</menu>

View File

@ -336,6 +336,7 @@
<!-- Calendar invites -->
<string name="sync_calendar_attendees_notification_title" formatted="false">%s</string>
<string name="sync_calendar_attendees_notification_content">Send invitations to guests?</string>
<string name="calendar_attendees_send_email_action">Send invitations</string>
<string name="sync_calendar_attendees_email_subject" formatted="false">Invitation: %s @ %s</string>
<string name="sync_calendar_attendees_email_content" formatted="false">You have been invited to the following event:\n\n%s\nWhen: %s\nWhere: %s\nAttendees: %s\n\n--\nThis email was created by EteSync.\nSecure, encrypted and journaled cloud sync.</string>