BrandingResources.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:7k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2008 Esmertec AG.
  3.  * Copyright (C) 2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.app;
  18. import com.android.im.plugin.IImPlugin;
  19. import com.android.im.plugin.ImPluginInfo;
  20. import dalvik.system.PathClassLoader;
  21. import android.content.Context;
  22. import android.content.Intent;
  23. import android.content.pm.PackageManager;
  24. import android.content.pm.PackageManager.NameNotFoundException;
  25. import android.content.res.Resources;
  26. import android.graphics.drawable.Drawable;
  27. import android.os.RemoteException;
  28. import android.util.Log;
  29. import java.lang.reflect.InvocationTargetException;
  30. import java.lang.reflect.Method;
  31. import java.util.Map;
  32. /**
  33.  * The provider specific branding resources.
  34.  */
  35. public class BrandingResources {
  36.     private static final String TAG = ImApp.LOG_TAG;
  37.     private Map<Integer, Integer> mResMapping;
  38.     private Resources mPackageRes;
  39.     private int[] mSmileyIcons;
  40.     private BrandingResources mDefaultRes;
  41.     /**
  42.      * Creates a new BrandingResource of a specific plug-in. The resources will
  43.      * be retrieved from the plug-in package.
  44.      *
  45.      * @param context The current application context.
  46.      * @param pluginInfo The info about the plug-in.
  47.      * @param defaultRes The default branding resources. If the resource is not
  48.      *            found in the plug-in, the default resource will be returned.
  49.      */
  50.     public BrandingResources(Context context, ImPluginInfo pluginInfo,
  51.             BrandingResources defaultRes) {
  52.         mDefaultRes = defaultRes;
  53.         PackageManager pm = context.getPackageManager();
  54.         try {
  55.             mPackageRes = pm.getResourcesForApplication(pluginInfo.mPackageName);
  56.         } catch (NameNotFoundException e) {
  57.             Log.e(TAG, "Can not load resources from package: " + pluginInfo.mPackageName);
  58.         }
  59.         // Load the plug-in directly from the apk instead of binding the service
  60.         // and calling through the IPC binder API. It's more effective in this way
  61.         // and we can avoid the async behaviors of binding service.
  62.         PathClassLoader classLoader = new PathClassLoader(pluginInfo.mSrcPath,
  63.                 context.getClassLoader());
  64.         try {
  65.             Class cls = classLoader.loadClass(pluginInfo.mClassName);
  66.             Method m = cls.getMethod("onBind", Intent.class);
  67.             IImPlugin plugin = (IImPlugin)m.invoke(cls.newInstance(), new Object[]{null});
  68.             mResMapping = plugin.getResourceMap();
  69.             mSmileyIcons = plugin.getSmileyIconIds();
  70.         } catch (ClassNotFoundException e) {
  71.             Log.e(TAG, "Failed load the plugin resource map", e);
  72.         } catch (IllegalAccessException e) {
  73.             Log.e(TAG, "Failed load the plugin resource map", e);
  74.         } catch (InstantiationException e) {
  75.             Log.e(TAG, "Failed load the plugin resource map", e);
  76.         } catch (SecurityException e) {
  77.             Log.e(TAG, "Failed load the plugin resource map", e);
  78.         } catch (NoSuchMethodException e) {
  79.             Log.e(TAG, "Failed load the plugin resource map", e);
  80.         } catch (IllegalArgumentException e) {
  81.             Log.e(TAG, "Failed load the plugin resource map", e);
  82.         } catch (InvocationTargetException e) {
  83.             Log.e(TAG, "Failed load the plugin resource map", e);
  84.         } catch (RemoteException e) {
  85.             Log.e(TAG, "Failed load the plugin resource map", e);
  86.         }
  87.     }
  88.     /**
  89.      * Creates a BrandingResource with application context and the resource ID map.
  90.      * The resource will be retrieved from the context directly instead from the plug-in package.
  91.      *
  92.      * @param context
  93.      * @param resMapping
  94.      */
  95.     public BrandingResources(Context context, Map<Integer, Integer> resMapping,
  96.             BrandingResources defaultRes) {
  97.         mPackageRes = context.getResources();
  98.         mResMapping = resMapping;
  99.         mDefaultRes = defaultRes;
  100.     }
  101.     /**
  102.      * Gets a drawable object associated with a particular resource ID defined
  103.      * in {@link com.android.im.plugin.BrandingResourceIDs}
  104.      *
  105.      * @param id The ID defined in
  106.      *            {@link com.android.im.plugin.BrandingResourceIDs}
  107.      * @return Drawable An object that can be used to draw this resource.
  108.      */
  109.     public Drawable getDrawable(int id) {
  110.         int resId = getPackageResourceId(id);
  111.         if (resId != 0) {
  112.             return mPackageRes.getDrawable(resId);
  113.         } else if (mDefaultRes != null){
  114.             return mDefaultRes.getDrawable(id);
  115.         } else {
  116.             return null;
  117.         }
  118.     }
  119.     /**
  120.      * Gets an array of the IDs of the supported smiley of the provider. Use
  121.      * {@link #getSmileyIcon(int)} to get the drawable object of the smiley.
  122.      *
  123.      * @return An array of the IDs of the supported smileys.
  124.      */
  125.     public int[] getSmileyIcons() {
  126.         return mSmileyIcons;
  127.     }
  128.     /**
  129.      * Gets the drawable associated with particular smiley ID.
  130.      *
  131.      * @param smileyId The ID of the smiley returned in
  132.      *            {@link #getSmileyIcons()}
  133.      * @return Drawable An object that can be used to draw this smiley.
  134.      */
  135.     public Drawable getSmileyIcon(int smileyId){
  136.         if (mPackageRes == null) {
  137.             return null;
  138.         }
  139.         return mPackageRes.getDrawable(smileyId);
  140.     }
  141.     /**
  142.      * Gets the string value associated with a particular resource ID defined in
  143.      * {@link com.android.im.plugin.BrandingResourceIDs}
  144.      *
  145.      * @param id The ID of the string resource defined in
  146.      *            {@link com.android.im.plugin.BrandingResourceIDs}
  147.      * @param formatArgs The format arguments that will be used for
  148.      *            substitution.
  149.      * @return The string data associated with the resource
  150.      */
  151.     public String getString(int id, Object... formatArgs) {
  152.         int resId = getPackageResourceId(id);
  153.         if (resId != 0) {
  154.             return mPackageRes.getString(resId, formatArgs);
  155.         } else if (mDefaultRes != null){
  156.             return  mDefaultRes.getString(id, formatArgs);
  157.         } else {
  158.             return null;
  159.         }
  160.     }
  161.     /**
  162.      * Gets the string array associated with a particular resource ID defined in
  163.      * {@link com.android.im.plugin.BrandingResourceIDs}
  164.      *
  165.      * @param id The ID of the string resource defined in
  166.      *            {@link com.android.im.plugin.BrandingResourceIDs}
  167.      * @return The string array associated with the resource.
  168.      */
  169.     public String[] getStringArray(int id) {
  170.         int resId = getPackageResourceId(id);
  171.         if (resId != 0) {
  172.             return mPackageRes.getStringArray(resId);
  173.         } else if (mDefaultRes != null){
  174.             return mDefaultRes.getStringArray(id);
  175.         } else {
  176.             return null;
  177.         }
  178.     }
  179.     private int getPackageResourceId(int id) {
  180.         if (mResMapping == null || mPackageRes == null) {
  181.             return 0;
  182.         }
  183.         Integer resId = mResMapping.get(id);
  184.         return resId == null ? 0 : resId;
  185.     }
  186. }