103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad/*
203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * Copyright (C) 2013 The Android Open Source Project
303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad *
403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * Licensed under the Apache License, Version 2.0 (the "License");
503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * you may not use this file except in compliance with the License.
603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * You may obtain a copy of the License at
703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad *
803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad *      http://www.apache.org/licenses/LICENSE-2.0
903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad *
1003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * Unless required by applicable law or agreed to in writing, software
1103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * distributed under the License is distributed on an "AS IS" BASIS,
1203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * See the License for the specific language governing permissions and
1403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * limitations under the License.
1503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad */
1603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
1769c182afb0e6d82a341a28b4317aa703af768906Gary Maipackage com.android.contacts.extensions;
1803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
1903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladimport android.content.Context;
2003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladimport android.util.Log;
2103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
2203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladimport java.io.FileNotFoundException;
2303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladimport java.io.IOException;
2403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladimport java.io.InputStream;
2503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladimport java.util.Properties;
2603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
2703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
2803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad/*
2903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * A framework for adding extensions to Dialer. This class reads a property file from
3003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * assets/contacts_extensions.properties and loads extension classes that an app has defined. If
3103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad * an extension class was not defined, null is returned.
3203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad */
3303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Giladpublic class ExtensionsFactory {
3403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
3503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    private static String TAG = "ExtensionsFactory";
3603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
3703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    // Config filename for mappings of various class names to their custom
3803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    // implementations.
3903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    private static final String EXTENSIONS_PROPERTIES = "contacts_extensions.properties";
4003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
4103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    private static final String EXTENDED_PHONE_DIRECTORIES_KEY = "extendedPhoneDirectories";
4203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
4303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    private static Properties sProperties = null;
4403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    private static ExtendedPhoneDirectoriesManager mExtendedPhoneDirectoriesManager = null;
4503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
4603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    public static void init(Context context) {
4703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        if (sProperties != null) {
4803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            return;
4903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        }
5003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        try {
5103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            final InputStream fileStream = context.getAssets().open(EXTENSIONS_PROPERTIES);
5203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            sProperties = new Properties();
5303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            sProperties.load(fileStream);
5403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            fileStream.close();
5503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
5603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            final String className = sProperties.getProperty(EXTENDED_PHONE_DIRECTORIES_KEY);
5703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            if (className != null) {
5803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad                mExtendedPhoneDirectoriesManager = createInstance(className);
5903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            } else {
6057a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang                if (Log.isLoggable(TAG, Log.DEBUG)) {
6157a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang                    Log.d(TAG, EXTENDED_PHONE_DIRECTORIES_KEY + " not found in properties file.");
6257a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang                }
6303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            }
6403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
6503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        } catch (FileNotFoundException e) {
6603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            // No custom extensions. Ignore.
6757a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang            if (Log.isLoggable(TAG, Log.DEBUG)) {
6857a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang                Log.d(TAG, "No custom extensions.");
6957a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang            }
7003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        } catch (IOException e) {
7157a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang            if (Log.isLoggable(TAG, Log.DEBUG)) {
7257a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang                Log.d(TAG, e.toString());
7357a0e98eed836b72dd3dc3540b9cac029266ed7cWenyi Wang            }
7403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        }
7503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    }
7603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
7703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    private static <T> T createInstance(String className) {
7803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        try {
7903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            Class<?> c = Class.forName(className);
8003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            //noinspection unchecked
8103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            return (T) c.newInstance();
8203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        } catch (ClassNotFoundException e) {
8303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            Log.e(TAG, className + ": unable to create instance.", e);
8403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        } catch (IllegalAccessException e) {
8503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            Log.e(TAG, className + ": unable to create instance.", e);
8603a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        } catch (InstantiationException e) {
8703a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad            Log.e(TAG, className + ": unable to create instance.", e);
8803a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        }
8903a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        return null;
9003a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    }
9103a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad
9203a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    public static ExtendedPhoneDirectoriesManager getExtendedPhoneDirectoriesManager() {
9303a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad        return mExtendedPhoneDirectoriesManager;
9403a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad    }
9503a533a82c68deff7f58ddf37cd5cd4afde4b8a3Ben Gilad}
96