111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterpackage com.android.deskclock;
211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport android.content.Context;
411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport android.content.res.AssetManager;
511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport android.util.Log;
611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport com.android.deskclock.provider.Alarm;
811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport java.io.FileNotFoundException;
1011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport java.io.IOException;
1111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport java.io.InputStream;
1211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterimport java.util.Properties;
1311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
1411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechterpublic class ExtensionsFactory {
1511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
1611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    private static String TAG = "ExtensionsFactory";
1711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    // Config filename for mappings of various class names to their custom
1811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    // implementations.
1911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    private static String EXTENSIONS_PROPERTIES = "deskclock_extensions.properties";
2011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    private static String DESKCLOCKEXTENSIONS_KEY = "DeskclockExtensions";
2111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    private static Properties sProperties = new Properties();
2211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    private static DeskClockExtensions sDeskClockExtensions = null;
2311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
2411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    public static void init(AssetManager assetManager) {
2511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        try {
2611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            InputStream fileStream = assetManager.open(EXTENSIONS_PROPERTIES);
2711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            sProperties.load(fileStream);
2811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            fileStream.close();
2911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        } catch (FileNotFoundException e) {
3011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            // No custom extensions. Ignore.
3111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            if (Log.isLoggable(TAG, Log.DEBUG)) {
3211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                Log.d(TAG, "No custom extensions.");
3311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            }
3411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        } catch (IOException e) {
3511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            if (Log.isLoggable(TAG, Log.DEBUG)) {
3611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                Log.d(TAG, e.toString());
3711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            }
3811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        }
3911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    }
4011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
4111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    private static <T> T createInstance(String className) {
4211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        try {
4311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            Class<?> c = Class.forName(className);
4411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            return (T) c.newInstance();
4511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        } catch (ClassNotFoundException e) {
4611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            if (Log.isLoggable(TAG, Log.ERROR)) {
4711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                Log.e(TAG, className + ": unable to create instance.", e);
4811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            }
4911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        } catch (IllegalAccessException e) {
5011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            if (Log.isLoggable(TAG, Log.ERROR)) {
5111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                Log.e(TAG, className + ": unable to create instance.", e);
5211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            }
5311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        } catch (InstantiationException e) {
5411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            if (Log.isLoggable(TAG, Log.ERROR)) {
5511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                Log.e(TAG, className + ": unable to create instance.", e);
5611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            }
5711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        }
5811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        return null;
5911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    }
6011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
6111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    public static DeskClockExtensions getDeskClockExtensions() {
6211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        if ((sDeskClockExtensions != null)) {
6311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            return sDeskClockExtensions;
6411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        }
6511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
6611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        String className = sProperties.getProperty(DESKCLOCKEXTENSIONS_KEY);
6711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        if (className != null) {
6811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            sDeskClockExtensions = createInstance(className);
6911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        } else {
7011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            if (Log.isLoggable(TAG, Log.DEBUG)) {
7111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                Log.d(TAG, DESKCLOCKEXTENSIONS_KEY + " not found in properties file.");
7211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            }
7311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        }
7411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
7511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        if (sDeskClockExtensions == null) {
7611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            sDeskClockExtensions = new DeskClockExtensions() {
7711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                @Override
7811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                public void addAlarm(Context context, Alarm newAlarm) {
7911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                    if (Log.isLoggable(TAG, Log.DEBUG)) {
8011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                        Log.d(TAG, "Add alarm: Empty inline implementation called.");
8111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                    }
8211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                }
8311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter
8411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                @Override
8511c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                public void deleteAlarm(Context context, long alarmId) {
8611c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                    if (Log.isLoggable(TAG, Log.DEBUG)) {
8711c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                        Log.d(TAG, "Delete alarm: Empty inline implementation called.");
8811c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                    }
8911c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter                }
9011c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter            };
9111c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        }
9211c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter        return sDeskClockExtensions;
9311c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter    }
9411c38e64f05bbcfa4503edb1680f255946ff6350Florian Salbrechter}
95