aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/fil/libre/repwifiapp/fwproxies/FrameworkProxy.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/fil/libre/repwifiapp/fwproxies/FrameworkProxy.java')
-rw-r--r--app/src/fil/libre/repwifiapp/fwproxies/FrameworkProxy.java126
1 files changed, 126 insertions, 0 deletions
diff --git a/app/src/fil/libre/repwifiapp/fwproxies/FrameworkProxy.java b/app/src/fil/libre/repwifiapp/fwproxies/FrameworkProxy.java
new file mode 100644
index 0000000..a468a1c
--- /dev/null
+++ b/app/src/fil/libre/repwifiapp/fwproxies/FrameworkProxy.java
@@ -0,0 +1,126 @@
+//
+// Copyright 2017, 2018 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.fwproxies;
+
+import fil.libre.repwifiapp.helpers.Logger;
+import java.lang.reflect.Constructor;
+
+/**
+ * Provides a base class for creating "proxy" classes that wrap up classes from
+ * the Android Application Framework via reflection, exposing them outside the
+ * framework itself.
+ */
+public abstract class FrameworkProxy {
+
+ protected Object inner;
+
+ protected abstract String getInnerClassName();
+
+ protected static String getStaticInnerClassName() {
+ return "Object";
+ }
+
+ protected static Class<?> getClassFromName(String className) {
+
+ try {
+ return Class.forName(className);
+ } catch (ClassNotFoundException e) {
+ Logger.logError(null, e);
+ return null;
+ }
+
+ }
+
+ protected Class<?> getInnerClass() {
+ return getClassFromName(getInnerClassName());
+ }
+
+ protected Class<?>[] getTypesArray(Class<?>... args) {
+ Class<?>[] types = new Class<?>[args.length];
+ for (int i = 0; i < args.length; i++) {
+ types[i] = args[i];
+ }
+ return types;
+ }
+
+ protected Object createInnerObject(Class<?> argType, Object arg) {
+ return createInnerObject(getTypesArray(argType), arg);
+ }
+
+ protected Object createInnerObject(Class<?>[] argumentTypes, Object... args) {
+ try {
+ Class<?> cls = getClassFromName(getInnerClassName());
+ Constructor<?> c = cls.getConstructor(argumentTypes);
+ this.inner = c.newInstance(getRealArgs(args));
+ return this.inner;
+ } catch (Exception e) {
+ Logger.logError("Exception while creating inner object via reflection.", e);
+ return null;
+ }
+ }
+
+ protected Object invokeMethodGetResult(String methodName, Class<?> argumentType, Object arg) {
+ return invokeMethodGetResult(methodName, getTypesArray(argumentType), arg);
+ }
+
+ protected Object invokeMethodGetResult(String methodName, Class<?>[] argumentTypes,
+ Object... args) {
+ try {
+ return getClassFromName(getInnerClassName()).getMethod(methodName, argumentTypes)
+ .invoke(inner, getRealArgs(args));
+ } catch (Exception e) {
+ Logger.logError("Exception while invoking method via reflection.", e);
+ return null;
+ }
+ }
+
+ protected void invokeMethod(String methodName, Class<?> argumentType, Object arg) {
+ invokeMethod(methodName, getTypesArray(argumentType), arg);
+ }
+
+ protected void invokeMethod(String methodName, Class<?>[] argumentTypes, Object... args) {
+ try {
+ getClassFromName(getInnerClassName()).getMethod(methodName, argumentTypes).invoke(
+ inner, getRealArgs(args));
+ } catch (Exception e) {
+ Logger.logError("Exception while invoking method via reflection.", e);
+ }
+ }
+
+ private Object[] getRealArgs(Object[] args) {
+
+ if (args == null || args.length == 0) {
+ return new Object[] {};
+ }
+
+ // if the object is just a proxy, use the inner object as an argument to
+ // the call.
+ for (int i = 0; i < args.length; i++) {
+ if (args[i] instanceof FrameworkProxy) {
+ args[i] = ((FrameworkProxy) args[i]).inner;
+ }
+ }
+
+ return args;
+
+ }
+
+} \ No newline at end of file