Upstream version 8.36.161.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core_internal / src / org / xwalk / core / internal / XWalkInternalResources.java
1 // Copyright (c) 2014 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.xwalk.core.internal;
6
7 import android.content.Context;
8 import android.util.Log;
9
10 import java.lang.reflect.Field;
11 import java.lang.reflect.Modifier;
12
13 class XWalkInternalResources {
14     private static final String TAG = "XWalkInternalResources";
15
16     private static boolean loaded = false;
17     private final static String INTERNAL_RESOURCE_CLASSES[] = {
18         "org.chromium.content.R",
19         "org.chromium.ui.R",
20         "org.xwalk.core.internal.R"
21     };
22     private final static String GENERATED_RESOURCE_CLASS = "org.xwalk.core.R";
23
24     // Doing org.chromium.content.R.<class>.<name> = org.xwalk.core.R.<class>.<name>
25     // Use reflection to iterate over the target class is to avoid hardcode.
26     private static void doResetIds(Context context) {
27         ClassLoader classLoader = context.getClassLoader();
28         for (String resourceClass : INTERNAL_RESOURCE_CLASSES) {
29             try {
30                 Class<?> internalResource = classLoader.loadClass(resourceClass);
31                 Class<?>[] innerClazzs = internalResource.getClasses();
32                 for (Class<?> innerClazz : innerClazzs) {
33                     Class<?> generatedInnerClazz;
34                     String generatedInnerClassName = innerClazz.getName().replace(
35                             resourceClass, GENERATED_RESOURCE_CLASS);
36                     try {
37                         generatedInnerClazz = classLoader.loadClass(generatedInnerClassName);
38                     } catch (ClassNotFoundException e) {
39                         Log.w(TAG, generatedInnerClassName + "is not found.");
40                         continue;
41                     }
42                     Field[] fields = innerClazz.getFields();
43                     for (Field field : fields) {
44                         // It's final means we are probably not used as library project.
45                         if (Modifier.isFinal(field.getModifiers())) continue;
46                         try {
47                             int value = generatedInnerClazz.getField(field.getName()).getInt(null);
48                             field.setInt(null, value);
49                         } catch (IllegalAccessException e) {
50                             Log.w(TAG, generatedInnerClazz.getName() + "." +
51                                     field.getName() + " is not accessable.");
52                         } catch (IllegalArgumentException e) {
53                             Log.w(TAG, generatedInnerClazz.getName() + "." +
54                                     field.getName() + " is not int.");
55                         } catch (NoSuchFieldException e) {
56                             Log.w(TAG, generatedInnerClazz.getName() + "." +
57                                     field.getName() + " is not found.");
58                         }
59                     }
60                 }
61             } catch (ClassNotFoundException e) {
62                 Log.w(TAG, resourceClass + "is not found.");
63             }
64         }
65     }
66
67     static void resetIds(Context context) {
68         if (!loaded) {
69             doResetIds(context);
70             loaded = true;
71         }
72     }
73 }