Modified last of reflection calls to use ReflectHelper class

Also modified ReflectHelper class to consolidate the API and
modified browser code to reflect the API changes.

Change-Id: I708f43cf3c1432adc7cd78c25264330a673ffeb5
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 14b9e40..ee7aebd 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -421,8 +421,8 @@
                 Class[] type = new Class[] { android.content.Context.class,
                                              String.class,
                                              String.class};
-                ReflectHelper.invokeStaticMethod("android.provider.Browser","sendString",
-                    type, params);
+                ReflectHelper.invokeMethod("android.provider.Browser","sendString",
+                                           type, params);
                 return true;
             case R.id.copy_url_context_menu_id:
                 copy(url);
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 34ba56b..e3f31c0 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -43,7 +43,6 @@
 
 import java.io.InputStream;
 import java.lang.ref.WeakReference;
-import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Locale;
@@ -358,16 +357,16 @@
 
         // add for carrier useragent feature
         String ua = null;
-        try {
-            Class c = Class.forName("com.qrd.useragent.UserAgentHandler");
-            Object cObj = c.newInstance();
-            Method m = c.getDeclaredMethod("getUAString", Context.class);
-            ua = (String)m.invoke(cObj, mContext);
-        } catch (Exception e) {
-            Log.e(TAG, "plug in Load failed, err " + e);
+        Object objUserAgentHandler = ReflectHelper.newObject(
+                "com.qrd.useragent.UserAgentHandler", null, null);
+        Object[] params = {mContext};
+        Class[] type = new Class[] {Context.class};
+        ua = (String) ReflectHelper.invokeMethod(objUserAgentHandler,"getUAString",
+                                type, params);
+        if (ua == null)
             ua = mCustomUserAgents.get(settings);
-        }
-        if (ua != null) {
+
+        if (ua != null){
             settings.setUserAgentString(ua);
         } else {
             settings.setUserAgentString(USER_AGENTS[getUserAgent()]);
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 4d96cf5..c0ffd83 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -906,8 +906,8 @@
                         this.getContext().startActivity(intent);
                     }
                 } else {
-                    if ((Boolean)ReflectHelper.invokeStaticMethod(
-                             "ActivityManagerNative", "isSystemReady", null, null)) {
+                    if ((Boolean)ReflectHelper.invokeMethod(
+                             "android.app.ActivityManagerNative", "isSystemReady", null, null)) {
                         try {
                             Intent intent = new Intent(INTENT_PICK_NETWORK);
                             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -947,7 +947,7 @@
         Object[] params  = {new String(PROP_NETSWITCH),
                             new Boolean(false)};
         Class[] type = new Class[] {String.class, boolean.class};
-        Boolean result = (Boolean) ReflectHelper.invokeStaticMethod(
+        Boolean result = (Boolean) ReflectHelper.invokeMethod(
                         "android.os.SystemProperties", "getBoolean",
                         type, params);
         if (result) {
@@ -1164,7 +1164,7 @@
             public String[] doInBackground(Void... unused) {
                 Object[] params  = {mActivity.getContentResolver()};
                 Class[] type = new Class[] {ContentResolver.class};
-                return (String[])ReflectHelper.invokeStaticMethod(
+                return (String[])ReflectHelper.invokeMethod(
                     "android.provider.Browser","getVisitedHistory",
                     type, params);
             }
@@ -2001,7 +2001,7 @@
             case R.id.exit_menu_id:
                 Object[] params  = { new String("persist.debug.browsermonkeytest")};
                 Class[] type = new Class[] {String.class};
-                String ret = (String)ReflectHelper.invokeStaticMethod(
+                String ret = (String)ReflectHelper.invokeMethod(
                              "android.os.SystemProperties","get", type, params);
                 if (ret != null && ret.equals("enable"))
                     break;
diff --git a/src/com/android/browser/DownloadHandler.java b/src/com/android/browser/DownloadHandler.java
index 1de6ac6..1e969c5 100644
--- a/src/com/android/browser/DownloadHandler.java
+++ b/src/com/android/browser/DownloadHandler.java
@@ -117,7 +117,7 @@
     private static boolean isAudioFileType(int fileType){
         Object[] params  = {Integer.valueOf(fileType)};
         Class[] type = new Class[] {int.class};
-        Boolean result = (Boolean) ReflectHelper.invokeStaticMethod("android.media.MediaFile",
+        Boolean result = (Boolean) ReflectHelper.invokeMethod("android.media.MediaFile",
                                "isAudioFileType", type, params);
         return result;
     }
@@ -125,7 +125,7 @@
     private static boolean isVideoFileType(int fileType){
         Object[] params  = {Integer.valueOf(fileType)};
         Class[] type = new Class[] {int.class};
-        Boolean result = (Boolean) ReflectHelper.invokeStaticMethod("android.media.MediaFile",
+        Boolean result = (Boolean) ReflectHelper.invokeMethod("android.media.MediaFile",
                              "isVideoFileType", type, params);
         return result;
     }
@@ -160,7 +160,7 @@
             // For those file types other than audio or video, download it immediately.
             Object[] params = {mimetype};
             Class[] type = new Class[] {String.class};
-            Integer result = (Integer) ReflectHelper.invokeStaticMethod("android.media.MediaFile",
+            Integer result = (Integer) ReflectHelper.invokeMethod("android.media.MediaFile",
                                            "getFileTypeForMimeType", type, params);
             int fileType = result.intValue();
             if ("http".equalsIgnoreCase(scheme) &&
diff --git a/src/com/android/browser/DownloadSettings.java b/src/com/android/browser/DownloadSettings.java
index 4ae00e3..cca26cc 100644
--- a/src/com/android/browser/DownloadSettings.java
+++ b/src/com/android/browser/DownloadSettings.java
@@ -131,7 +131,7 @@
             String updatedFileName = filenameBase + "." + filenameExtension;
             Object[] params = {updatedFileName};
             Class[] type = new Class[] {String.class};
-            mimetype = (String) ReflectHelper.invokeStaticMethod("android.media.MediaFile",
+            mimetype = (String) ReflectHelper.invokeMethod("android.media.MediaFile",
                                            "getMimeTypeForFile", type, params);
         }
 
diff --git a/src/com/android/browser/DownloadTouchIcon.java b/src/com/android/browser/DownloadTouchIcon.java
index d2c4024..fe139e8 100644
--- a/src/com/android/browser/DownloadTouchIcon.java
+++ b/src/com/android/browser/DownloadTouchIcon.java
@@ -121,7 +121,7 @@
                 //HttpHost httpHost = Proxy.getPreferredHttpHost(mContext, url);
                 Object[] params  = { mContext, url};
                 Class[] type = new Class[] {android.content.Context.class, String.class};
-                HttpHost httpHost = (HttpHost) ReflectHelper.invokeStaticMethod(
+                HttpHost httpHost = (HttpHost) ReflectHelper.invokeMethod(
                     "android.net.Proxy", "getPreferredHttpHost",
                     type, params);
                 if (httpHost != null) {
diff --git a/src/com/android/browser/FetchUrlMimeType.java b/src/com/android/browser/FetchUrlMimeType.java
index f42d627..fbd8be7 100644
--- a/src/com/android/browser/FetchUrlMimeType.java
+++ b/src/com/android/browser/FetchUrlMimeType.java
@@ -79,7 +79,7 @@
         try {
             Class<?> argTypes[] = new Class[]{Context.class, String.class};
             Object args[] = new Object[]{mContext, mUri};
-            httpHost = (HttpHost) ReflectHelper.invokeStaticMethod("android.net.Proxy",
+            httpHost = (HttpHost) ReflectHelper.invokeMethod("android.net.Proxy",
                 "getPreferredHttpHost", argTypes, args);
             if (httpHost != null) {
                 ConnRouteParams.setDefaultProxy(client.getParams(), httpHost);
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 22655f2..826d519 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -174,7 +174,7 @@
             Object[] params  = {new String("persist.env.browser.wap2estore"),
                                     Boolean.valueOf(false)};
             Class[] type = new Class[] {String.class, boolean.class};
-            Boolean wap2estore = (Boolean) ReflectHelper.invokeStaticMethod(
+            Boolean wap2estore = (Boolean) ReflectHelper.invokeMethod(
                       "android.os.SystemProperties", "getBoolean", type, params);
             if ((wap2estore && isEstoreTypeUrl(text)) || isRtspTypeUrl(text)
                 || isMakeCallTypeUrl(text)) {
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index a38b904..b1e1d44 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -16,8 +16,6 @@
 
 package com.android.browser;
 
-import java.lang.reflect.Method;
-
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -31,6 +29,7 @@
 import org.codeaurora.swe.SslErrorHandler;
 import org.codeaurora.swe.WebView;
 
+import com.android.browser.reflect.ReflectHelper;
 import com.android.browser.R;
 
 import android.widget.LinearLayout;
@@ -339,25 +338,9 @@
     }
 
     private static View inflateCertificateView(SslCertificate certificate, Context ctx) {
-        Class certClass;
-        try {
-            certClass = Class.forName("android.net.http.SslCertificate");
-
-            Class argTypes[] = new Class[1];
-            argTypes[0] = Context.class;
-
-            Method m =  certClass.getDeclaredMethod("inflateCertificateView", argTypes);
-            m.setAccessible(true);
-
-            Object args[] = new Object[1];
-            args[0] = ctx;
-            return (View) m.invoke(certificate, args);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return null;
+        Object[] params = {ctx};
+        Class[] type = new Class[] {Context.class};
+        return (View)ReflectHelper.invokeMethod(certificate, "inflateCertificateView",type, params);
     }
 
     /*
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index a1ebd72..e0c3286 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -19,8 +19,6 @@
 import android.os.Bundle;
 import android.util.Log;
 
-import com.android.browser.reflect.ReflectHelper;
-
 import org.codeaurora.swe.WebView;
 
 import java.util.ArrayList;
diff --git a/src/com/android/browser/UploadHandler.java b/src/com/android/browser/UploadHandler.java
index 8dec49c..349f67f 100644
--- a/src/com/android/browser/UploadHandler.java
+++ b/src/com/android/browser/UploadHandler.java
@@ -125,7 +125,7 @@
         Object[] params  = {new String("persist.env.browser.drmupload"),
                             Boolean.valueOf(false)};
         Class[] type = new Class[] {String.class, boolean.class};
-        Boolean drmUpload = (Boolean) ReflectHelper.invokeStaticMethod(
+        Boolean drmUpload = (Boolean) ReflectHelper.invokeMethod(
                       "android.os.SystemProperties", "getBoolean", type, params);
         if (drmUpload && isDrmFileUpload(result)) {
             mUploadMessage.onReceiveValue(null);
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index 783f11a..4b40df9 100755
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -107,7 +107,7 @@
         Object[] params  = {new String("persist.env.browser.wap2estore"),
                             Boolean.valueOf(false)};
         Class[] type = new Class[] {String.class, boolean.class};
-        Boolean wap2estore = (Boolean)ReflectHelper.invokeStaticMethod(
+        Boolean wap2estore = (Boolean)ReflectHelper.invokeMethod(
                       "android.os.SystemProperties", "getBoolean", type, params);
         if (wap2estore && isEstoreTypeUrl(url)) {
             handleEstoreTypeUrl(url);
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index e37e7fe..8b968a9 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -58,7 +58,6 @@
 import com.android.browser.platformsupport.BrowserContract.Searches;
 import com.android.browser.platformsupport.BrowserContract.Settings;
 import com.android.browser.platformsupport.BrowserContract.SyncState;
-import com.android.browser.reflect.ReflectHelper;
 import com.android.browser.widget.BookmarkThumbnailWidgetProvider;
 import com.google.common.annotations.VisibleForTesting;
 
diff --git a/src/com/android/browser/reflect/ReflectHelper.java b/src/com/android/browser/reflect/ReflectHelper.java
index 5a5f2ae..06ac8d0 100644
--- a/src/com/android/browser/reflect/ReflectHelper.java
+++ b/src/com/android/browser/reflect/ReflectHelper.java
@@ -41,42 +41,46 @@
 
     private final static String LOGTAG = "ReflectHelper";
 
-    public static Object newObject(String className) {
-        Object obj = null;
-        try {
-            Class clazz = Class.forName(className);
-            obj = clazz.newInstance();
-        } catch (Exception e) {
-            Log.e(LOGTAG, "An exception occured : " + e.getMessage());
-        }
-        return obj;
-    }
-
     public static Object newObject(String className, Class[] argTypes, Object[] args) {
-        if (args == null || args.length == 0) {
-            return newObject(className);
-        }
         Object obj = null;
-        try {
+
+        try{
             Class clazz = Class.forName(className);
-            Constructor ctor = clazz.getDeclaredConstructor(argTypes);
-            obj = ctor.newInstance(args);
-        } catch (Exception e) {
+
+            if (args == null || args.length == 0) {
+                obj = clazz.newInstance();
+            } else {
+                Constructor ctor = clazz.getDeclaredConstructor(argTypes);
+                obj = ctor.newInstance(args);
+            }
+        }
+        catch (Exception e) {
             Log.e(LOGTAG, "An exception occured : " + e.getMessage() );
         }
         return obj;
     }
 
     public static Object invokeMethod(Object obj, String method, Class[] argTypes, Object[] args) {
-        Object result  = null;
         boolean modifiedAccessibility = false;
-        if (obj == null || method == null) {
-            throw new IllegalArgumentException("Object and Method must be supplied.");
-        }
+        Object result = null;
+        Method m = null;
+
+        if (obj == null || method == null)
+            return null;
+
         try {
-            Method m = obj.getClass().getDeclaredMethod(method, argTypes);
+            if (obj instanceof String){
+                //Process call as a static method call
+                String className = (String)obj;
+                obj = null;
+                Class clazz = Class.forName(className);
+                m = clazz.getDeclaredMethod(method, argTypes);
+            } else {
+                //Process call on instance of obj
+                m = obj.getClass().getDeclaredMethod(method, argTypes);
+            }
+
             if(m != null) {
-                // make it visible
                 if (!m.isAccessible()) {
                     modifiedAccessibility = true;
                     m.setAccessible(true);
@@ -87,33 +91,34 @@
             }
         } catch (Exception e) {
             Log.e(LOGTAG, "An exception occured : " + e.getMessage() );
+            return null;
         }
         return result;
     }
 
-    public static Object invokeStaticMethod(String className, String method,
-                                            Class[] argTypes, Object[] args) {
-        Object result  = null;
+    public static Object invokeProxyMethod(String proxyClassName, String method, Object obj,
+                                           Class[] proxyArgTypes, Object[] args) {
+        Object result = null;
         boolean modifiedAccessibility = false;
-        if (className == null || method == null) {
+        if (proxyClassName == null || method == null) {
             throw new IllegalArgumentException("Object and Method must be supplied.");
         }
         try {
-            Class clazz = Class.forName(className);
-            Method m = clazz.getDeclaredMethod(method, argTypes);
+            Class clazz = Class.forName(proxyClassName);
+            Method m = clazz.getDeclaredMethod(method, proxyArgTypes);
             if(m != null) {
                 // make it visible
                 if (!m.isAccessible()) {
                     modifiedAccessibility = true;
                     m.setAccessible(true);
                 }
-                result = m.invoke(null, args);
+                result = m.invoke(obj, args);
                 if (modifiedAccessibility)
                     m.setAccessible(false);
+                }
+            } catch (Exception e) {
+                Log.e(LOGTAG, "An exception occured : " + e.getMessage() );
             }
-        } catch (Exception e) {
-            Log.e(LOGTAG, "An exception occured : " + e.getMessage() );
-        }
         return result;
     }
 
diff --git a/src/com/android/browser/search/SearchEngines.java b/src/com/android/browser/search/SearchEngines.java
index c840afc..91bddc8 100644
--- a/src/com/android/browser/search/SearchEngines.java
+++ b/src/com/android/browser/search/SearchEngines.java
@@ -16,8 +16,6 @@
 package com.android.browser.search;
 
 import com.android.browser.R;
-import com.android.browser.reflect.ReflectHelper;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.text.TextUtils;
diff --git a/src/com/android/browser/view/BookmarkExpandableView.java b/src/com/android/browser/view/BookmarkExpandableView.java
index 763efa7..aec00ff 100644
--- a/src/com/android/browser/view/BookmarkExpandableView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -33,13 +33,13 @@
 
 import com.android.browser.BreadCrumbView;
 import com.android.browser.BrowserBookmarksAdapter;
-import com.android.browser.R;
 import com.android.browser.platformsupport.BrowserContract;
+import com.android.browser.reflect.ReflectHelper;
+import com.android.browser.R;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
 
@@ -160,20 +160,10 @@
     // Since the 'menu' object is of type MenuBuilder, java reflection method
     // is the only way to access MenuBuilder.setCurrentMenuInfo().
     static void setCurrentMenuInfo(ContextMenu menu, ContextMenuInfo menuInfo) {
-        try {
-            Class<?> proxyClass = Class.forName("com.android.internal.view.menu.MenuBuilder");
-            Class<?> argTypes[] = new Class[1];
-            argTypes[0] = ContextMenuInfo.class;
-            Method m =  proxyClass.getDeclaredMethod("setCurrentMenuInfo", argTypes);
-            m.setAccessible(true);
-
-            Object args[] = new Object[1];
-            args[0] = menuInfo;
-            m.invoke(menu, args);
-        } catch (Exception e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
+        Object[] params = {menuInfo};
+        Class[] proxyType = new Class[] {ContextMenuInfo.class};
+        ReflectHelper.invokeProxyMethod("com.android.internal.view.menu.MenuBuilder",
+                                        "setCurrentMenuInfo", menu, proxyType, params);
     }
 
     @Override