| /* |
| * 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" |
| } |
| } |