160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson/*
260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * Copyright (C) 2010 The Android Open Source Project
360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson *
460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * Licensed under the Apache License, Version 2.0 (the "License");
560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * you may not use this file except in compliance with the License.
660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * You may obtain a copy of the License at
760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson *
860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson *      http://www.apache.org/licenses/LICENSE-2.0
960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson *
1060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * Unless required by applicable law or agreed to in writing, software
1160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * distributed under the License is distributed on an "AS IS" BASIS,
1260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * See the License for the specific language governing permissions and
1460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson * limitations under the License.
1560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson */
1660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonpackage com.android.calendar;
1760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
18a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErikimport static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME;
19a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErikimport static android.provider.CalendarContract.EXTRA_EVENT_END_TIME;
2098c8add7f42469d797bf77e145e5fd091e5539dfIsaac Katzenelsonimport static android.provider.CalendarContract.Attendees.ATTENDEE_STATUS;
2160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
2260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.app.ActionBar;
2360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.app.Activity;
2460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.app.FragmentManager;
2560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.app.FragmentTransaction;
2660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.content.Intent;
270ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport android.content.res.Resources;
284afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.database.ContentObserver;
2960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.net.Uri;
3060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.os.Bundle;
314afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.os.Handler;
324afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport android.provider.CalendarContract;
336bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelsonimport android.provider.CalendarContract.Attendees;
3460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonimport android.util.Log;
3547f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelsonimport android.widget.Toast;
3647f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson
3794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzsteinimport com.android.calendar.CalendarEventModel.ReminderEntry;
3894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
3994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzsteinimport java.util.ArrayList;
4047f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelsonimport java.util.List;
4160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
4260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelsonpublic class EventInfoActivity extends Activity {
4360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson//        implements CalendarController.EventHandler, SearchView.OnQueryTextListener,
4460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson//        SearchView.OnCloseListener {
4560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
4660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    private static final String TAG = "EventInfoActivity";
4760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    private EventInfoFragment mInfoFragment;
4860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    private long mStartMillis, mEndMillis;
4960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    private long mEventId;
5060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
514afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    // Create an observer so that we can update the views whenever a
524afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    // Calendar event changes.
534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private final ContentObserver mObserver = new ContentObserver(new Handler()) {
544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        @Override
554afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        public boolean deliverSelfNotifications() {
564afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            return false;
574afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
584afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
594afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        @Override
604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        public void onChange(boolean selfChange) {
614afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            if (selfChange) return;
624afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            if (mInfoFragment != null) {
634afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                mInfoFragment.reloadEvents();
644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    };
674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
6860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
6960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected void onCreate(Bundle icicle) {
7060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        super.onCreate(icicle);
7160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
7260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // Get the info needed for the fragment
7360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        Intent intent = getIntent();
7460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        int attendeeResponse = 0;
7547f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson        mEventId = -1;
7660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        boolean isDialog = false;
7794a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein        ArrayList<ReminderEntry> reminders = null;
7860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
7960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        if (icicle != null) {
8060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            mEventId = icicle.getLong(EventInfoFragment.BUNDLE_KEY_EVENT_ID);
8160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            mStartMillis = icicle.getLong(EventInfoFragment.BUNDLE_KEY_START_MILLIS);
8260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            mEndMillis = icicle.getLong(EventInfoFragment.BUNDLE_KEY_END_MILLIS);
8360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            attendeeResponse = icicle.getInt(EventInfoFragment.BUNDLE_KEY_ATTENDEE_RESPONSE);
8460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            isDialog = icicle.getBoolean(EventInfoFragment.BUNDLE_KEY_IS_DIALOG);
8594a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein
8694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein            reminders = Utils.readRemindersFromBundle(icicle);
8760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        } else if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
88a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik            mStartMillis = intent.getLongExtra(EXTRA_EVENT_BEGIN_TIME, 0);
89a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik            mEndMillis = intent.getLongExtra(EXTRA_EVENT_END_TIME, 0);
9098c8add7f42469d797bf77e145e5fd091e5539dfIsaac Katzenelson            attendeeResponse = intent.getIntExtra(ATTENDEE_STATUS,
916bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                    Attendees.ATTENDEE_STATUS_NONE);
9260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            Uri data = intent.getData();
9360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            if (data != null) {
9460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                try {
9547f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    List<String> pathSegments = data.getPathSegments();
9647f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    int size = pathSegments.size();
9747f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    if (size > 2 && "EventTime".equals(pathSegments.get(2))) {
9847f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        // Support non-standard VIEW intent format:
9947f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        //dat = content://com.android.calendar/events/[id]/EventTime/[start]/[end]
10047f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        mEventId = Long.parseLong(pathSegments.get(1));
10147f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        if (size > 4) {
10247f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                            mStartMillis = Long.parseLong(pathSegments.get(3));
10347f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                            mEndMillis = Long.parseLong(pathSegments.get(4));
10447f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        }
10547f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    } else {
10647f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        mEventId = Long.parseLong(data.getLastPathSegment());
10747f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    }
10860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                } catch (NumberFormatException e) {
10947f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    if (mEventId == -1) {
11047f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        // do nothing here , deal with it later
11147f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    } else if (mStartMillis == 0 || mEndMillis ==0) {
11247f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        // Parsing failed on the start or end time , make sure the times were not
11347f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        // pulled from the intent's extras and reset them.
11447f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        mStartMillis = 0;
11547f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                        mEndMillis = 0;
11647f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson                    }
11760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson                }
11860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            }
11960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        }
12060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
12147f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson        if (mEventId == -1) {
12247f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson            Log.w(TAG, "No event id");
12347f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson            Toast.makeText(this, R.string.event_not_found, Toast.LENGTH_SHORT).show();
12447f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson            finish();
12547f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson        }
12647f6cc6909665e4f6f8d85f29bfd588688463c66Isaac Katzenelson
1270ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson        // If we do not support showing full screen event info in this configuration,
1280ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson        // close the activity and show the event in AllInOne.
1290ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson        Resources res = getResources();
1300ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson        if (!res.getBoolean(R.bool.agenda_show_event_info_full_screen)
1310ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson                && !res.getBoolean(R.bool.show_event_info_full_screen)) {
132ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn            CalendarController.getInstance(this)
1336bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                    .launchViewEvent(mEventId, mStartMillis, mEndMillis, attendeeResponse);
134ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn            finish();
135ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn            return;
136ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn        }
137ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn
138ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn        setContentView(R.layout.simple_frame_layout);
139ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn
140ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn        // Get the fragment if exists
141ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn        mInfoFragment = (EventInfoFragment)
142ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn                getFragmentManager().findFragmentById(R.id.main_frame);
143ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn
144ea032a06284975291cfe747c90e57bdf413c3776Andrew Flynn
14553aad911d4d901d19afba320cc626da2dab68025Isaac Katzenelson        // Remove the application title
14653aad911d4d901d19afba320cc626da2dab68025Isaac Katzenelson        ActionBar bar = getActionBar();
14753aad911d4d901d19afba320cc626da2dab68025Isaac Katzenelson        if (bar != null) {
14815b4dcc873336ceb35fa335410b467aed3a834eaRoboErik            bar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME);
14953aad911d4d901d19afba320cc626da2dab68025Isaac Katzenelson        }
15053aad911d4d901d19afba320cc626da2dab68025Isaac Katzenelson
15160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // Create a new fragment if none exists
15260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        if (mInfoFragment == null) {
15360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            FragmentManager fragmentManager = getFragmentManager();
15460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            FragmentTransaction ft = fragmentManager.beginTransaction();
15560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            mInfoFragment = new EventInfoFragment(this, mEventId, mStartMillis, mEndMillis,
15694a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                    attendeeResponse, isDialog, (isDialog ?
1577ef2981ab9ad32a6818b36cefbd39f070ba708edIsaac Katzenelson                            EventInfoFragment.DIALOG_WINDOW_STYLE :
15894a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                                EventInfoFragment.FULL_WINDOW_STYLE),
15994a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein                    reminders);
16081d45a9c5f53a44aa2e2bfb22ba99e8e8d34dc00Michael Chan            ft.replace(R.id.main_frame, mInfoFragment);
16160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson            ft.commit();
16260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        }
16360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
16460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
16560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
16660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected void onNewIntent(Intent intent) {
16760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // From the Android Dev Guide: "It's important to note that when
16860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // onNewIntent(Intent) is called, the Activity has not been restarted,
16960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // so the getIntent() method will still return the Intent that was first
17060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // received with onCreate(). This is why setIntent(Intent) is called
17160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // inside onNewIntent(Intent) (just in case you call getIntent() at a
17260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        // later time)."
17360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        setIntent(intent);
17460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
17560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
17660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
17760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
17860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    public void onSaveInstanceState(Bundle outState) {
17960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        super.onSaveInstanceState(outState);
18060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
18160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
18260f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
18360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected void onResume() {
18460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        super.onResume();
1854afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        getContentResolver().registerContentObserver(CalendarContract.Events.CONTENT_URI,
1864afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                true, mObserver);
18760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
18860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
18960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
19060f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected void onPause() {
19160f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        super.onPause();
1924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        getContentResolver().unregisterContentObserver(mObserver);
19360f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
19460f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson
19560f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    @Override
19660f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    protected void onDestroy() {
19760f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson        super.onDestroy();
19860f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson    }
19960f01c23282284e691fcd24918ea67087540f95dIsaac Katzenelson}
200