196 lines
7.4 KiB
Kotlin
196 lines
7.4 KiB
Kotlin
/*
|
|
* Copyright (C) 2021 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.calendar
|
|
|
|
import android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME
|
|
import android.provider.CalendarContract.EXTRA_EVENT_END_TIME
|
|
import android.provider.CalendarContract.Attendees.ATTENDEE_STATUS
|
|
import android.app.ActionBar
|
|
import android.app.Activity
|
|
import android.app.FragmentManager
|
|
import android.app.FragmentTransaction
|
|
import android.content.Intent
|
|
import android.content.res.Resources
|
|
import android.database.ContentObserver
|
|
import android.net.Uri
|
|
import android.os.Bundle
|
|
import android.os.Handler
|
|
import android.provider.CalendarContract
|
|
import android.provider.CalendarContract.Attendees
|
|
import android.util.Log
|
|
import android.widget.Toast
|
|
|
|
class EventInfoActivity : Activity() {
|
|
private var mInfoFragment: EventInfoFragment? = null
|
|
private var mStartMillis: Long = 0
|
|
private var mEndMillis: Long = 0
|
|
private var mEventId: Long = 0
|
|
|
|
// Create an observer so that we can update the views whenever a
|
|
// Calendar event changes.
|
|
private val mObserver: ContentObserver = object : ContentObserver(Handler()) {
|
|
@Override
|
|
override fun deliverSelfNotifications(): Boolean {
|
|
return false
|
|
}
|
|
|
|
@Override
|
|
override fun onChange(selfChange: Boolean) {
|
|
if (selfChange) return
|
|
val temp = mInfoFragment
|
|
if (temp != null) {
|
|
mInfoFragment?.reloadEvents()
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected override fun onCreate(icicle: Bundle?) {
|
|
super.onCreate(icicle)
|
|
|
|
// Get the info needed for the fragment
|
|
val intent: Intent = getIntent()
|
|
var attendeeResponse = 0
|
|
mEventId = -1
|
|
var isDialog = false
|
|
if (icicle != null) {
|
|
mEventId = icicle.getLong(EventInfoFragment.BUNDLE_KEY_EVENT_ID)
|
|
mStartMillis = icicle.getLong(EventInfoFragment.BUNDLE_KEY_START_MILLIS)
|
|
mEndMillis = icicle.getLong(EventInfoFragment.BUNDLE_KEY_END_MILLIS)
|
|
attendeeResponse = icicle.getInt(EventInfoFragment.BUNDLE_KEY_ATTENDEE_RESPONSE)
|
|
isDialog = icicle.getBoolean(EventInfoFragment.BUNDLE_KEY_IS_DIALOG)
|
|
} else if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
|
|
mStartMillis = intent.getLongExtra(EXTRA_EVENT_BEGIN_TIME, 0)
|
|
mEndMillis = intent.getLongExtra(EXTRA_EVENT_END_TIME, 0)
|
|
attendeeResponse = intent.getIntExtra(
|
|
ATTENDEE_STATUS,
|
|
Attendees.ATTENDEE_STATUS_NONE
|
|
)
|
|
val data: Uri? = intent.getData()
|
|
if (data != null) {
|
|
try {
|
|
val pathSegments = data.getPathSegments()
|
|
val size: Int = pathSegments.size
|
|
if (size > 2 && "EventTime".equals(pathSegments[2])) {
|
|
// Support non-standard VIEW intent format:
|
|
// dat = content://com.android.calendar/events/[id]/EventTime/[start]/[end]
|
|
mEventId = pathSegments[1].toLong()
|
|
if (size > 4) {
|
|
mStartMillis = pathSegments[3].toLong()
|
|
mEndMillis = pathSegments[4].toLong()
|
|
}
|
|
} else {
|
|
mEventId = data.getLastPathSegment() as Long
|
|
}
|
|
} catch (e: NumberFormatException) {
|
|
if (mEventId == -1L) {
|
|
// do nothing here , deal with it later
|
|
} else if (mStartMillis == 0L || mEndMillis == 0L) {
|
|
// Parsing failed on the start or end time , make sure the times were not
|
|
// pulled from the intent's extras and reset them.
|
|
mStartMillis = 0
|
|
mEndMillis = 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (mEventId == -1L) {
|
|
Log.w(TAG, "No event id")
|
|
Toast.makeText(this, R.string.event_not_found, Toast.LENGTH_SHORT).show()
|
|
finish()
|
|
}
|
|
|
|
// If we do not support showing full screen event info in this configuration,
|
|
// close the activity and show the event in AllInOne.
|
|
val res: Resources = getResources()
|
|
if (!res.getBoolean(R.bool.agenda_show_event_info_full_screen) &&
|
|
!res.getBoolean(R.bool.show_event_info_full_screen)
|
|
) {
|
|
CalendarController.getInstance(this)
|
|
?.launchViewEvent(mEventId, mStartMillis, mEndMillis, attendeeResponse)
|
|
finish()
|
|
return
|
|
}
|
|
setContentView(R.layout.simple_frame_layout)
|
|
|
|
// Get the fragment if exists
|
|
mInfoFragment = getFragmentManager().findFragmentById(R.id.main_frame) as EventInfoFragment
|
|
|
|
// Remove the application title
|
|
val bar: ActionBar? = getActionBar()
|
|
if (bar != null) {
|
|
bar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP or ActionBar.DISPLAY_SHOW_HOME)
|
|
}
|
|
|
|
// Create a new fragment if none exists
|
|
if (mInfoFragment == null) {
|
|
val fragmentManager: FragmentManager = getFragmentManager()
|
|
val ft: FragmentTransaction = fragmentManager.beginTransaction()
|
|
mInfoFragment = EventInfoFragment(
|
|
this,
|
|
mEventId,
|
|
mStartMillis,
|
|
mEndMillis,
|
|
attendeeResponse,
|
|
isDialog,
|
|
if (isDialog) EventInfoFragment.DIALOG_WINDOW_STYLE
|
|
else EventInfoFragment.FULL_WINDOW_STYLE
|
|
)
|
|
ft.replace(R.id.main_frame, mInfoFragment)
|
|
ft.commit()
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected override fun onNewIntent(intent: Intent?) {
|
|
// From the Android Dev Guide: "It's important to note that when
|
|
// onNewIntent(Intent) is called, the Activity has not been restarted,
|
|
// so the getIntent() method will still return the Intent that was first
|
|
// received with onCreate(). This is why setIntent(Intent) is called
|
|
// inside onNewIntent(Intent) (just in case you call getIntent() at a
|
|
// later time)."
|
|
setIntent(intent)
|
|
}
|
|
|
|
@Override
|
|
override fun onSaveInstanceState(outState: Bundle) {
|
|
super.onSaveInstanceState(outState)
|
|
}
|
|
|
|
@Override
|
|
protected override fun onResume() {
|
|
super.onResume()
|
|
getContentResolver().registerContentObserver(
|
|
CalendarContract.Events.CONTENT_URI,
|
|
true, mObserver
|
|
)
|
|
}
|
|
|
|
@Override
|
|
protected override fun onPause() {
|
|
super.onPause()
|
|
getContentResolver().unregisterContentObserver(mObserver)
|
|
}
|
|
|
|
@Override
|
|
protected override fun onDestroy() {
|
|
super.onDestroy()
|
|
}
|
|
|
|
companion object {
|
|
private const val TAG = "EventInfoActivity"
|
|
}
|
|
} |