aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/thialfihar/android/apg/utils/ApgCon.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/thialfihar/android/apg/utils/ApgCon.java')
-rw-r--r--src/org/thialfihar/android/apg/utils/ApgCon.java144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/org/thialfihar/android/apg/utils/ApgCon.java b/src/org/thialfihar/android/apg/utils/ApgCon.java
new file mode 100644
index 000000000..f6ace207a
--- /dev/null
+++ b/src/org/thialfihar/android/apg/utils/ApgCon.java
@@ -0,0 +1,144 @@
+package org.thialfihar.android.apg.utils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import android.content.Context;
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.content.Intent;
+import android.os.IBinder;
+import android.util.Log;
+
+import org.thialfihar.android.apg.IApgService;
+
+/**
+ * This class can be used by other projects to simplify connecting to the
+ * APG-Service. Kind of wrapper of for AIDL.
+ *
+ * It is not used in this project.
+ */
+public class ApgCon {
+
+ private String TAG = "ApgCon";
+
+ private final Context mContext;
+
+ /** Remote service for decrypting and encrypting data */
+ private IApgService apgService = null;
+
+ /** Set apgService accordingly to connection status */
+ private ServiceConnection apgConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ Log.d(TAG, "IApgService bound to apgService");
+ apgService = IApgService.Stub.asInterface(service);
+ }
+
+ public void onServiceDisconnected(ComponentName className) {
+ Log.d(TAG, "IApgService disconnected");
+ apgService = null;
+ }
+ };
+
+ /** Possible fields which are returned to the application */
+ public static enum retKey {
+ ERROR, // error enum, see below
+ ERROR_DESC, // human readable description
+ RESULT, // if everything went fine, result
+ }
+
+ public static enum error {
+ GENERIC, // no special type
+ CANNOT_BIND_TO_APG, // connection to apg service not possible
+ CALL_MISSING, // function to call not provided
+ CALL_NOT_KNOWN, // apg service does not know what to do
+ }
+
+ public ApgCon(Context ctx) {
+ Log.d(TAG, "EncryptionService created");
+ mContext = ctx;
+ }
+
+ /** try to connect to the apg service */
+ private boolean connect() {
+ Log.d(TAG, "trying to bind the apgService to context");
+
+ if (apgService != null) {
+ Log.d(TAG, "allready connected");
+ return true;
+ }
+
+ try {
+ mContext.bindService(new Intent(IApgService.class.getName()), apgConnection, Context.BIND_AUTO_CREATE);
+ } catch (Exception e) {
+ Log.d(TAG, "could not bind APG service");
+ return false;
+ }
+
+ int wait_count = 0;
+ while (apgService == null && wait_count++ < 15) {
+ Log.d(TAG, "sleeping 1 second to wait for apg");
+ android.os.SystemClock.sleep(1000);
+ }
+ ;
+
+ if (wait_count >= 15) {
+ Log.d(TAG, "slept waiting for nothing!");
+ return false;
+ }
+
+ return true;
+ }
+
+ private boolean initialize() {
+ if (apgService == null) {
+ if (!connect()) {
+ Log.d(TAG, "connection to apg service failed");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean call(String function, Map<retKey, Object> return_map, String... function_params) {
+ return_map.put(retKey.ERROR, null);
+
+ if (!initialize()) {
+ return_map.put(retKey.ERROR, error.CANNOT_BIND_TO_APG);
+ return false;
+ }
+
+ if (function == null || function.length() == 0) {
+ return_map.put(retKey.ERROR, error.CALL_MISSING);
+ return false;
+ }
+
+ try {
+ List<String> params_list = Arrays.asList(function_params);
+ return_map.put(retKey.RESULT, IApgService.class.getMethod(function, List.class).invoke(apgService, params_list));
+ } catch (NoSuchMethodException e) {
+ Log.d(TAG, e.getMessage());
+ return_map.put(retKey.ERROR, error.CALL_NOT_KNOWN);
+ return_map.put(retKey.ERROR_DESC, e.getMessage());
+ return false;
+ } catch (Exception e) {
+ Log.d(TAG, e.getMessage());
+ return_map.put(retKey.ERROR, error.GENERIC);
+ return_map.put(retKey.ERROR_DESC, e.getMessage());
+ return false;
+ }
+
+ return true;
+
+ }
+
+ private void disconnect() {
+ Log.d(TAG, "disconnecting apgService");
+ if (apgService != null) {
+ mContext.unbindService(apgConnection);
+ apgService = null;
+ }
+ }
+
+}