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