mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 19:22:14 -05:00
Add connection helper for other projects
This eases using the AIDL-Interface and is the recommended way for other project to implement the connection.
This commit is contained in:
parent
2660c561a1
commit
6477f60764
@ -4,6 +4,10 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@ -20,7 +24,10 @@ public class ApgService extends Service {
|
|||||||
|
|
||||||
private final IApgService.Stub mBinder = new IApgService.Stub() {
|
private final IApgService.Stub mBinder = new IApgService.Stub() {
|
||||||
|
|
||||||
public String encrypt_with_passphrase(String msg, String passphrase) {
|
public String encrypt_with_passphrase(List<String> args) {
|
||||||
|
String msg = args.remove(0);
|
||||||
|
String passphrase = args.remove(0);
|
||||||
|
|
||||||
Preferences mPreferences = Preferences.getPreferences(getBaseContext(), true);
|
Preferences mPreferences = Preferences.getPreferences(getBaseContext(), true);
|
||||||
InputStream inStream = new ByteArrayInputStream(msg.getBytes());
|
InputStream inStream = new ByteArrayInputStream(msg.getBytes());
|
||||||
InputData in = new InputData(inStream, 9999);
|
InputData in = new InputData(inStream, 9999);
|
||||||
@ -29,17 +36,16 @@ public class ApgService extends Service {
|
|||||||
|
|
||||||
Apg.initialize(getApplicationContext());
|
Apg.initialize(getApplicationContext());
|
||||||
try {
|
try {
|
||||||
Apg.encrypt(
|
Apg.encrypt(getApplicationContext(), // context
|
||||||
getApplicationContext(),
|
in, // input stream
|
||||||
in,
|
out, // output stream
|
||||||
out,
|
|
||||||
true, // armored
|
true, // armored
|
||||||
enc_keys, // encryption keys
|
enc_keys, // encryption keys
|
||||||
0, // signature key
|
0, // signature key
|
||||||
null, // signature passphrase
|
null, // signature passphrase
|
||||||
null, // progress
|
null, // progress
|
||||||
mPreferences.getDefaultEncryptionAlgorithm(),
|
mPreferences.getDefaultEncryptionAlgorithm(), // encryption
|
||||||
mPreferences.getDefaultHashAlgorithm(),
|
mPreferences.getDefaultHashAlgorithm(), // hash
|
||||||
Id.choice.compression.none, // compression
|
Id.choice.compression.none, // compression
|
||||||
false, // mPreferences.getForceV3Signatures(),
|
false, // mPreferences.getForceV3Signatures(),
|
||||||
passphrase // passPhrase
|
passphrase // passPhrase
|
||||||
@ -53,12 +59,13 @@ public class ApgService extends Service {
|
|||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String decrypt_with_passphrase(String encrypted_msg,
|
public String decrypt_with_passphrase(List<String> args) {
|
||||||
String passphrase) {
|
String encrypted_msg = args.remove(0);
|
||||||
InputStream inStream = new ByteArrayInputStream(encrypted_msg
|
String passphrase = args.remove(0);
|
||||||
.getBytes());
|
|
||||||
|
InputStream inStream = new ByteArrayInputStream(encrypted_msg.getBytes());
|
||||||
InputData in = new InputData(inStream, 9999); // XXX what size in
|
InputData in = new InputData(inStream, 9999); // XXX what size in
|
||||||
// second parameter?
|
// second parameter?
|
||||||
OutputStream out = new ByteArrayOutputStream();
|
OutputStream out = new ByteArrayOutputStream();
|
||||||
try {
|
try {
|
||||||
Apg.decrypt(getApplicationContext(), in, out, passphrase, null, // progress
|
Apg.decrypt(getApplicationContext(), in, out, passphrase, null, // progress
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package org.thialfihar.android.apg;
|
package org.thialfihar.android.apg;
|
||||||
|
|
||||||
interface IApgService {
|
interface IApgService {
|
||||||
String encrypt_with_passphrase(String msg, String passphrase);
|
String encrypt_with_passphrase(in List<String> params);
|
||||||
String decrypt_with_passphrase(String encrypted_msg, String passphrase);
|
String decrypt_with_passphrase(in List<String> params);
|
||||||
}
|
}
|
144
src/org/thialfihar/android/apg/utils/ApgCon.java
Normal file
144
src/org/thialfihar/android/apg/utils/ApgCon.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user