1ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad/* 2ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * Copyright (C) 2013 The Android Open Source Project 3ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * 4ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * Licensed under the Apache License, Version 2.0 (the "License"); 5ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * you may not use this file except in compliance with the License. 6ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * You may obtain a copy of the License at 7ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * 8ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * http://www.apache.org/licenses/LICENSE-2.0 9ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * 10ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * Unless required by applicable law or agreed to in writing, software 11ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * distributed under the License is distributed on an "AS IS" BASIS, 12ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * See the License for the specific language governing permissions and 14ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * limitations under the License. 15ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad */ 16ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 17ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladpackage com.android.contacts.common.extensions; 18ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 19ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladimport android.content.Context; 20ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladimport android.util.Log; 21ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 22ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladimport java.io.FileNotFoundException; 23ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladimport java.io.IOException; 24ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladimport java.io.InputStream; 25ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladimport java.util.Properties; 26ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 27ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 28ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad/* 29ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * A framework for adding extensions to Dialer. This class reads a property file from 30ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * assets/contacts_extensions.properties and loads extension classes that an app has defined. If 31ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad * an extension class was not defined, null is returned. 32ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad */ 33ad582fa758c6a276c26c5cc52079613a653c81bfBen Giladpublic class ExtensionsFactory { 34ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 35ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad private static String TAG = "ExtensionsFactory"; 36ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 37ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad // Config filename for mappings of various class names to their custom 38ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad // implementations. 39ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad private static final String EXTENSIONS_PROPERTIES = "contacts_extensions.properties"; 40ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 41ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad private static final String EXTENDED_PHONE_DIRECTORIES_KEY = "extendedPhoneDirectories"; 42ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 43ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad private static Properties sProperties = null; 44ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad private static ExtendedPhoneDirectoriesManager mExtendedPhoneDirectoriesManager = null; 45ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 46ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad public static void init(Context context) { 47ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad if (sProperties != null) { 48ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad return; 49ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 50ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad try { 51ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad final InputStream fileStream = context.getAssets().open(EXTENSIONS_PROPERTIES); 52ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad sProperties = new Properties(); 53ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad sProperties.load(fileStream); 54ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad fileStream.close(); 55ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 56ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad final String className = sProperties.getProperty(EXTENDED_PHONE_DIRECTORIES_KEY); 57ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad if (className != null) { 58ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad mExtendedPhoneDirectoriesManager = createInstance(className); 59ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } else { 60ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Log.d(TAG, EXTENDED_PHONE_DIRECTORIES_KEY + " not found in properties file."); 61ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 62ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 63ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } catch (FileNotFoundException e) { 64ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad // No custom extensions. Ignore. 65ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Log.d(TAG, "No custom extensions."); 66ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } catch (IOException e) { 67ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Log.d(TAG, e.toString()); 68ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 69ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 70ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 71ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad private static <T> T createInstance(String className) { 72ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad try { 73ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Class<?> c = Class.forName(className); 74ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad //noinspection unchecked 75ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad return (T) c.newInstance(); 76ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } catch (ClassNotFoundException e) { 77ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Log.e(TAG, className + ": unable to create instance.", e); 78ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } catch (IllegalAccessException e) { 79ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Log.e(TAG, className + ": unable to create instance.", e); 80ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } catch (InstantiationException e) { 81ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad Log.e(TAG, className + ": unable to create instance.", e); 82ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 83ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad return null; 84ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 85ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad 86ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad public static ExtendedPhoneDirectoriesManager getExtendedPhoneDirectoriesManager() { 87ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad return mExtendedPhoneDirectoriesManager; 88ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad } 89ad582fa758c6a276c26c5cc52079613a653c81bfBen Gilad} 90