Upstream version 8.36.161.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core_internal / src / org / xwalk / core / internal / extension / XWalkExtensionClientImpl.java
1 // Copyright (c) 2013 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.extension;
6
7 import android.content.Context;
8 import android.content.Intent;
9 import android.util.Log;
10
11 import java.lang.reflect.InvocationTargetException;
12 import java.lang.reflect.Method;
13
14 /**
15  * The public base class of xwalk external extensions. It acts a bridge class from
16  * runtime to runtime client. The objects of class 'XWalkExtensionClient' in runtime
17  * client side will be passed into this class because we need to call its methods.
18  */
19 class XWalkExtensionClientImpl extends XWalkExtension {
20
21     private static final String TAG = XWalkExtensionClientImpl.class.getName();
22     private Object mExtensionClient;
23     private Method mOnMessage;
24     private Method mOnSyncMessage;
25     private Method mOnResume;
26     private Method mOnPause;
27     private Method mOnDestroy;
28     private Method mOnActivityResult;
29
30     public XWalkExtensionClientImpl(String name, String jsApi,
31             XWalkExtensionContextWrapper context, Object extensionClient) {
32         super(name, jsApi, context);
33
34         mExtensionClient = extensionClient;
35         mOnMessage = lookupMethod("onMessage", int.class, String.class);
36         mOnSyncMessage = lookupMethod("onSyncMessage", int.class, String.class);
37         mOnResume = lookupMethod("onResume");
38         mOnPause = lookupMethod("onPause");
39         mOnDestroy = lookupMethod("onDestroy");
40         mOnActivityResult = lookupMethod("onActivityResult", int.class, int.class, Intent.class);
41     }
42
43     @Override
44     public void onMessage(int extensionInstanceID, String message) {
45         invokeMethod(mOnMessage, mExtensionClient, extensionInstanceID, message);
46     }
47
48     @Override
49     public String onSyncMessage(int extensionInstanceID, String message) {
50         return (String) invokeMethod(mOnSyncMessage, mExtensionClient, extensionInstanceID, message);
51     }
52
53     @Override
54     public void onResume() {
55         invokeMethod(mOnResume, mExtensionClient);
56     }
57
58     @Override
59     public void onPause() {
60         invokeMethod(mOnPause, mExtensionClient);
61     }
62
63     @Override
64     public void onDestroy() {
65         invokeMethod(mOnDestroy, mExtensionClient);
66     }
67
68     @Override
69     public void onActivityResult(int requestCode, int resultCode, Intent data) {
70         invokeMethod(mOnActivityResult, mExtensionClient, requestCode, resultCode, data);
71     }
72
73     private Method lookupMethod(String method, Class<?>... parameters) {
74         Class<?> clientClass = mExtensionClient.getClass();
75         try {
76             return clientClass.getMethod(method, parameters);
77         } catch (NoSuchMethodException e) {
78             handleException(e);
79         }
80         return null;
81     }
82
83     private static Object invokeMethod(Method method, Object instance, Object... parameters) {
84         Object result = null;
85         if (method != null) {
86             try {
87                 result = method.invoke(instance, parameters);
88             } catch (IllegalArgumentException e) {
89                 handleException(e);
90             } catch (IllegalAccessException e) {
91                 handleException(e);
92             } catch (InvocationTargetException e) {
93                 handleException(e);
94             } catch (NullPointerException e) {
95                 handleException(e);
96             }
97         }
98         return result;
99     }
100
101     private static void handleException(Exception e) {
102         Log.e(TAG, "Error in calling methods of external extensions. " + e.toString());
103         e.printStackTrace();
104     }
105 }