1f84b1a90cf76e7eff76affa17834377194caba8cSara Ting/*
2f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * Copyright (C) 2012 The Android Open Source Project
3f84b1a90cf76e7eff76affa17834377194caba8cSara Ting *
4f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * Licensed under the Apache License, Version 2.0 (the "License");
5f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * you may not use this file except in compliance with the License.
6f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * You may obtain a copy of the License at
7f84b1a90cf76e7eff76affa17834377194caba8cSara Ting *
8f84b1a90cf76e7eff76affa17834377194caba8cSara Ting *      http://www.apache.org/licenses/LICENSE-2.0
9f84b1a90cf76e7eff76affa17834377194caba8cSara Ting *
10f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * Unless required by applicable law or agreed to in writing, software
11f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * distributed under the License is distributed on an "AS IS" BASIS,
12f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * See the License for the specific language governing permissions and
14f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * limitations under the License.
15f84b1a90cf76e7eff76affa17834377194caba8cSara Ting */
16f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
17f84b1a90cf76e7eff76affa17834377194caba8cSara Tingpackage com.android.calendar;
18f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
19f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport android.content.Context;
20f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport android.content.res.AssetManager;
21fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wrenimport android.os.Bundle;
22f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport android.util.Log;
23f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport android.view.Menu;
24f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport android.view.MenuItem;
25f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
2633171c7f2faa687a98e1687cfd409827566f7959Michael Chanimport java.io.FileNotFoundException;
27f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport java.io.IOException;
28f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport java.io.InputStream;
29f84b1a90cf76e7eff76affa17834377194caba8cSara Tingimport java.util.Properties;
30f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
31fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
32f84b1a90cf76e7eff76affa17834377194caba8cSara Ting/*
33f84b1a90cf76e7eff76affa17834377194caba8cSara Ting * Skeleton for additional options in the AllInOne menu.
34f84b1a90cf76e7eff76affa17834377194caba8cSara Ting */
35f84b1a90cf76e7eff76affa17834377194caba8cSara Tingpublic class ExtensionsFactory {
36fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
37f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    private static String TAG = "ExtensionsFactory";
38f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
3933171c7f2faa687a98e1687cfd409827566f7959Michael Chan    // Config filename for mappings of various class names to their custom
4033171c7f2faa687a98e1687cfd409827566f7959Michael Chan    // implementations.
41f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    private static String EXTENSIONS_PROPERTIES = "calendar_extensions.properties";
42f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
43f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    private static String ALL_IN_ONE_MENU_KEY = "AllInOneMenuExtensions";
44fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren    private static String CLOUD_NOTIFICATION_KEY = "CloudNotificationChannel";
45373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski    private static String ANALYTICS_LOGGER_KEY = "AnalyticsLogger";
46f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
47f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    private static Properties sProperties = new Properties();
48f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    private static AllInOneMenuExtensionsInterface sAllInOneMenuExtensions = null;
49373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski    private static AnalyticsLogger sAnalyticsLogger = null;
50f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
51f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    public static void init(AssetManager assetManager) {
52f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        try {
53f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            InputStream fileStream = assetManager.open(EXTENSIONS_PROPERTIES);
54f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            sProperties.load(fileStream);
55f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            fileStream.close();
5633171c7f2faa687a98e1687cfd409827566f7959Michael Chan        } catch (FileNotFoundException e) {
5733171c7f2faa687a98e1687cfd409827566f7959Michael Chan            // No custom extensions. Ignore.
5833171c7f2faa687a98e1687cfd409827566f7959Michael Chan            Log.d(TAG, "No custom extensions.");
59f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        } catch (IOException e) {
6033171c7f2faa687a98e1687cfd409827566f7959Michael Chan            Log.d(TAG, e.toString());
61f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        }
62f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    }
63f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
64f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    private static <T> T createInstance(String className) {
65f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        try {
66f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            Class<?> c = Class.forName(className);
67f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            return (T) c.newInstance();
68f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        } catch (ClassNotFoundException e) {
69f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            Log.e(TAG, className + ": unable to create instance.", e);
70f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        } catch (IllegalAccessException e) {
71f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            Log.e(TAG, className + ": unable to create instance.", e);
72f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        } catch (InstantiationException e) {
73f84b1a90cf76e7eff76affa17834377194caba8cSara Ting            Log.e(TAG, className + ": unable to create instance.", e);
74f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        }
75f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        return null;
76f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    }
77f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
78f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    public static AllInOneMenuExtensionsInterface getAllInOneMenuExtensions() {
79373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        if ((sAllInOneMenuExtensions != null)) {
80373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            return sAllInOneMenuExtensions;
81373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        }
82373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
83373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        String className = sProperties.getProperty(ALL_IN_ONE_MENU_KEY);
84373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        if (className != null) {
85373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            sAllInOneMenuExtensions = createInstance(className);
86373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        } else {
87373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            Log.d(TAG, ALL_IN_ONE_MENU_KEY + " not found in properties file.");
88f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        }
89f84b1a90cf76e7eff76affa17834377194caba8cSara Ting
90373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        if (sAllInOneMenuExtensions == null) {
91373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            sAllInOneMenuExtensions = new AllInOneMenuExtensionsInterface() {
92373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                @Override
93373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                public Integer getExtensionMenuResource(Menu menu) {
94373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                    return null;
95373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                }
96373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
97373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                @Override
98373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                public boolean handleItemSelected(MenuItem item, Context context) {
99373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                    return false;
100373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                }
101373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            };
102373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        }
103f84b1a90cf76e7eff76affa17834377194caba8cSara Ting        return sAllInOneMenuExtensions;
104f84b1a90cf76e7eff76affa17834377194caba8cSara Ting    }
105fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
106fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren    public static CloudNotificationBackplane getCloudNotificationBackplane() {
107fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        CloudNotificationBackplane cnb = null;
108fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
109fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        String className = sProperties.getProperty(CLOUD_NOTIFICATION_KEY);
110fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        if (className != null) {
111fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren            cnb = createInstance(className);
112fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        } else {
113fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren            Log.d(TAG, CLOUD_NOTIFICATION_KEY + " not found in properties file.");
114fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        }
115fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
116fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        if (cnb == null) {
117fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren            cnb = new CloudNotificationBackplane() {
118fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                @Override
119fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                public boolean open(Context context) {
120fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                    return true;
121fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                }
122fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
123fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                @Override
124fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                public boolean subscribeToGroup(String senderId, String account, String groupId)
125fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                        throws IOException {
126fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                    return true;}
127fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
128fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                @Override
129c9a20a3c1803c9485489a398e0a1bffdc46a15fbChris Wren                public void send(String to, String msgId, Bundle data) {
130fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                }
131fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
132fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                @Override
133fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                public void close() {
134fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren                }
135fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren            };
136fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        }
137fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren
138fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren        return cnb;
139fec5bff4f2d3c50bc7d644b21acca37f320358e0Chris Wren    }
140373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
141373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski    public static AnalyticsLogger getAnalyticsLogger(Context context) {
142373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        if (sAnalyticsLogger != null) {
143373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            return sAnalyticsLogger;
144373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        }
145373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
146373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        String className = sProperties.getProperty(ANALYTICS_LOGGER_KEY);
147373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        if (className != null) {
148373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            sAnalyticsLogger = createInstance(className);
149373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        } else {
150373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            Log.d(TAG, ANALYTICS_LOGGER_KEY + " not found in properties file.");
151373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        }
152373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
153373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        if (sAnalyticsLogger == null) {
154373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            sAnalyticsLogger = new AnalyticsLogger() {
155373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                @Override
156373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                public boolean initialize(Context context) {
157373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                    return true;
158373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                }
159373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
160373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                @Override
161373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                public void trackView(String name) {
162373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski                }
163373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski            };
164373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        }
165373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski
166373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        sAnalyticsLogger.initialize(context);
167373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski        return sAnalyticsLogger;
168373e9dab4c22b74e0039427fd316544d93a5d318Paul Sliwowski    }
169f84b1a90cf76e7eff76affa17834377194caba8cSara Ting}
170