diff options
Diffstat (limited to 'OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain')
4 files changed, 632 insertions, 0 deletions
diff --git a/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/AidlDemoActivity2.java b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/AidlDemoActivity2.java new file mode 100644 index 000000000..b6e211955 --- /dev/null +++ b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/AidlDemoActivity2.java @@ -0,0 +1,168 @@ +///* +// * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> +// * +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// */ +// +//package org.sufficientlysecure.keychain.demo; +// +//import java.util.ArrayList; +//import java.util.List; +// +//import org.sufficientlysecure.keychain.demo.R; +//import org.sufficientlysecure.keychain.integration.KeychainData; +//import org.sufficientlysecure.keychain.integration.KeychainIntentHelper; +//import org.sufficientlysecure.keychain.service.IKeychainKeyService; +//import org.sufficientlysecure.keychain.service.handler.IKeychainGetKeyringsHandler; +// +//import android.annotation.SuppressLint; +//import android.app.Activity; +//import android.app.AlertDialog; +//import android.content.ComponentName; +//import android.content.Context; +//import android.content.Intent; +//import android.content.ServiceConnection; +//import android.os.Bundle; +//import android.os.IBinder; +//import android.os.RemoteException; +//import android.util.Base64; +//import android.view.View; +//import android.widget.TextView; +// +//public class AidlDemoActivity2 extends Activity { +// Activity mActivity; +// +// TextView mKeyringsTextView; +// +// KeychainIntentHelper mKeychainIntentHelper; +// KeychainData mKeychainData; +// +// byte[] keysBytes; +// ArrayList<String> keysStrings; +// +// private IKeychainKeyService service = null; +// private ServiceConnection svcConn = new ServiceConnection() { +// public void onServiceConnected(ComponentName className, IBinder binder) { +// service = IKeychainKeyService.Stub.asInterface(binder); +// } +// +// public void onServiceDisconnected(ComponentName className) { +// service = null; +// } +// }; +// +// @Override +// public void onCreate(Bundle icicle) { +// super.onCreate(icicle); +// setContentView(R.layout.aidl_demo2); +// +// mActivity = this; +// +// mKeyringsTextView = (TextView) findViewById(R.id.aidl_demo_keyrings); +// +// mKeychainIntentHelper = new KeychainIntentHelper(mActivity); +// mKeychainData = new KeychainData(); +// +// bindService(new Intent(IKeychainKeyService.class.getName()), svcConn, +// Context.BIND_AUTO_CREATE); +// } +// +// public void getKeyringsStringsOnClick(View view) { +// try { +// service.getPublicKeyRings(mKeychainData.getPublicKeys(), true, getKeyringsHandler); +// } catch (RemoteException e) { +// exceptionImplementation(-1, e.toString()); +// } +// } +// +// public void getKeyringsBytesOnClick(View view) { +// try { +// service.getPublicKeyRings(mKeychainData.getPublicKeys(), false, getKeyringsHandler); +// } catch (RemoteException e) { +// exceptionImplementation(-1, e.toString()); +// } +// } +// +// @SuppressLint("NewApi") +// private void updateView() { +// if (keysBytes != null) { +// mKeyringsTextView.setText(Base64.encodeToString(keysBytes, Base64.DEFAULT)); +// } else if (keysStrings != null) { +// mKeyringsTextView.setText(""); +// for (String output : keysStrings) { +// mKeyringsTextView.append(output); +// } +// } +// } +// +// @Override +// public void onDestroy() { +// super.onDestroy(); +// +// unbindService(svcConn); +// } +// +// private void exceptionImplementation(int exceptionId, String error) { +// AlertDialog.Builder builder = new AlertDialog.Builder(this); +// builder.setTitle("Exception!").setMessage(error).setPositiveButton("OK", null).show(); +// } +// +// private final IKeychainGetKeyringsHandler.Stub getKeyringsHandler = new IKeychainGetKeyringsHandler.Stub() { +// +// @Override +// public void onException(final int exceptionId, final String message) throws RemoteException { +// runOnUiThread(new Runnable() { +// public void run() { +// exceptionImplementation(exceptionId, message); +// } +// }); +// } +// +// @Override +// public void onSuccess(final byte[] outputBytes, final List<String> outputStrings) +// throws RemoteException { +// runOnUiThread(new Runnable() { +// public void run() { +// if (outputBytes != null) { +// keysBytes = outputBytes; +// keysStrings = null; +// } else if (outputStrings != null) { +// keysBytes = null; +// keysStrings = (ArrayList<String>) outputStrings; +// } +// updateView(); +// } +// }); +// +// } +// +// }; +// +// public void selectEncryptionKeysOnClick(View view) { +// mKeychainIntentHelper.selectPublicKeys("user@example.com"); +// } +// +// @Override +// protected void onActivityResult(int requestCode, int resultCode, Intent data) { +// // this updates the mKeychainData object to the result of the methods +// boolean result = mKeychainIntentHelper.onActivityResult(requestCode, resultCode, data, +// mKeychainData); +// if (result) { +// updateView(); +// } +// +// // continue with other activity results +// super.onActivityResult(requestCode, resultCode, data); +// } +// +//} diff --git a/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/BaseActivity.java b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/BaseActivity.java new file mode 100644 index 000000000..5b286f208 --- /dev/null +++ b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/BaseActivity.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sufficientlysecure.keychain.demo; + +import org.sufficientlysecure.keychain.demo.R; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; +import android.widget.Toast; + +public class BaseActivity extends PreferenceActivity { + private Activity mActivity; + + private Preference mIntentDemo; + private Preference mContentProviderDemo; + private Preference mCryptoProvider; + private Preference mAidlDemo; + private Preference mAidlDemo2; + + /** + * Called when the activity is first created. + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mActivity = this; + + // load preferences from xml + addPreferencesFromResource(R.xml.base_preference); + + // find preferences + mIntentDemo = (Preference) findPreference("intent_demo"); + mContentProviderDemo = (Preference) findPreference("content_provider_demo"); + mCryptoProvider = (Preference) findPreference("openpgp_provider_demo"); + mAidlDemo = (Preference) findPreference("aidl_demo"); + mAidlDemo2 = (Preference) findPreference("aidl_demo2"); + + mIntentDemo.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + // startActivity(new Intent(mActivity, IntentDemoActivity.class)); + Toast.makeText(BaseActivity.this, "Not implemented!", Toast.LENGTH_LONG).show(); + + return false; + } + }); + + mCryptoProvider.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startActivity(new Intent(mActivity, OpenPgpProviderActivity.class)); + + return false; + } + }); + + // mAidlDemo2.setOnPreferenceClickListener(new OnPreferenceClickListener() { + // @Override + // public boolean onPreferenceClick(Preference preference) { + // startActivity(new Intent(mActivity, AidlDemoActivity2.class)); + // + // return false; + // } + // }); + + } + +} diff --git a/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/Constants.java b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/Constants.java new file mode 100644 index 000000000..03e76254c --- /dev/null +++ b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/Constants.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2013 Dominik Schürmann <dominik@dominikschuermann.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sufficientlysecure.keychain.demo; + +public final class Constants { + + public static final boolean DEBUG = BuildConfig.DEBUG; + + public static final String TAG = "Keychain"; + +} diff --git a/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java new file mode 100644 index 000000000..4a96de5a1 --- /dev/null +++ b/OpenPGP-Keychain-API-Demo/src/main/java/org/sufficientlysecure/keychain/demo/OpenPgpProviderActivity.java @@ -0,0 +1,352 @@ +/* + * Copyright (C) 2013 Dominik Schürmann <dominik@dominikschuermann.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sufficientlysecure.keychain.demo; + +import java.util.ArrayList; +import java.util.List; + +import org.openintents.openpgp.IOpenPgpKeyIdsCallback; +import org.openintents.openpgp.OpenPgpData; +import org.openintents.openpgp.OpenPgpError; +import org.openintents.openpgp.OpenPgpServiceConnection; +import org.openintents.openpgp.OpenPgpSignatureResult; +import org.openintents.openpgp.IOpenPgpCallback; +import org.openintents.openpgp.IOpenPgpService; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.RemoteException; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ListAdapter; +import android.widget.TextView; +import android.widget.Toast; + +public class OpenPgpProviderActivity extends Activity { + Activity mActivity; + + EditText mMessage; + EditText mCiphertext; + EditText mEncryptUserIds; + + private OpenPgpServiceConnection mCryptoServiceConnection; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setContentView(R.layout.crypto_provider_demo); + + mActivity = this; + + mMessage = (EditText) findViewById(R.id.crypto_provider_demo_message); + mCiphertext = (EditText) findViewById(R.id.crypto_provider_demo_ciphertext); + mEncryptUserIds = (EditText) findViewById(R.id.crypto_provider_demo_encrypt_user_id); + + selectCryptoProvider(); + } + + /** + * Callback from remote openpgp service + */ + final IOpenPgpKeyIdsCallback.Stub getKeysEncryptCallback = new IOpenPgpKeyIdsCallback.Stub() { + + @Override + public void onSuccess(final long[] keyIds) throws RemoteException { + Log.d(Constants.TAG, "getKeysEncryptCallback keyId " + keyIds[0]); + mActivity.runOnUiThread(new Runnable() { + + @Override + public void run() { + // encrypt after getting key ids + String inputStr = mMessage.getText().toString(); + OpenPgpData input = new OpenPgpData(inputStr); + + Log.d(Constants.TAG, "getKeysEncryptCallback inputStr " + inputStr); + + try { + mCryptoServiceConnection.getService().encrypt(input, + new OpenPgpData(OpenPgpData.TYPE_STRING), keyIds, encryptCallback); + } catch (RemoteException e) { + Log.e(Constants.TAG, "CryptoProviderDemo", e); + } + } + }); + } + + @Override + public void onError(OpenPgpError error) throws RemoteException { + handleError(error); + } + + }; + + final IOpenPgpKeyIdsCallback.Stub getKeysSignAndEncryptCallback = new IOpenPgpKeyIdsCallback.Stub() { + + @Override + public void onSuccess(final long[] keyIds) throws RemoteException { + Log.d(Constants.TAG, "getKeysSignAndEncryptCallback keyId " + keyIds[0]); + + mActivity.runOnUiThread(new Runnable() { + + @Override + public void run() { + // encrypt after getting key ids + String inputStr = mMessage.getText().toString(); + OpenPgpData input = new OpenPgpData(inputStr); + + try { + mCryptoServiceConnection.getService().signAndEncrypt(input, + new OpenPgpData(OpenPgpData.TYPE_STRING), keyIds, encryptCallback); + } catch (RemoteException e) { + Log.e(Constants.TAG, "CryptoProviderDemo", e); + } + } + }); + } + + @Override + public void onError(OpenPgpError error) throws RemoteException { + handleError(error); + } + + }; + + final IOpenPgpCallback.Stub encryptCallback = new IOpenPgpCallback.Stub() { + + @Override + public void onSuccess(final OpenPgpData output, OpenPgpSignatureResult signatureResult) + throws RemoteException { + Log.d(Constants.TAG, "encryptCallback"); + + runOnUiThread(new Runnable() { + + @Override + public void run() { + mCiphertext.setText(output.getString()); + } + }); + } + + @Override + public void onError(OpenPgpError error) throws RemoteException { + handleError(error); + } + + }; + + final IOpenPgpCallback.Stub decryptAndVerifyCallback = new IOpenPgpCallback.Stub() { + + @Override + public void onSuccess(final OpenPgpData output, final OpenPgpSignatureResult signatureResult) + throws RemoteException { + Log.d(Constants.TAG, "decryptAndVerifyCallback"); + + runOnUiThread(new Runnable() { + + @Override + public void run() { + mMessage.setText(output.getString()); + if (signatureResult != null) { + Toast.makeText(OpenPgpProviderActivity.this, + "signature result:\n" + signatureResult.toString(), + Toast.LENGTH_LONG).show(); + } + } + }); + + } + + @Override + public void onError(OpenPgpError error) throws RemoteException { + handleError(error); + } + + }; + + private void handleError(final OpenPgpError error) { + mActivity.runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText(mActivity, + "onError id:" + error.getErrorId() + "\n\n" + error.getMessage(), + Toast.LENGTH_LONG).show(); + Log.e(Constants.TAG, "onError getErrorId:" + error.getErrorId()); + Log.e(Constants.TAG, "onError getMessage:" + error.getMessage()); + } + }); + } + + public void encryptOnClick(View view) { + try { + mCryptoServiceConnection.getService().getKeyIds( + mEncryptUserIds.getText().toString().split(","), true, getKeysEncryptCallback); + } catch (RemoteException e) { + Log.e(Constants.TAG, "CryptoProviderDemo", e); + } + } + + public void signOnClick(View view) { + String inputStr = mMessage.getText().toString(); + OpenPgpData input = new OpenPgpData(inputStr); + + try { + mCryptoServiceConnection.getService().sign(input, + new OpenPgpData(OpenPgpData.TYPE_STRING), encryptCallback); + } catch (RemoteException e) { + Log.e(Constants.TAG, "CryptoProviderDemo", e); + } + } + + public void signAndEncryptOnClick(View view) { + try { + mCryptoServiceConnection.getService().getKeyIds( + mEncryptUserIds.getText().toString().split(","), true, + getKeysSignAndEncryptCallback); + } catch (RemoteException e) { + Log.e(Constants.TAG, "CryptoProviderDemo", e); + } + } + + public void decryptAndVerifyOnClick(View view) { + String inputStr = mCiphertext.getText().toString(); + OpenPgpData input = new OpenPgpData(inputStr); + + try { + mCryptoServiceConnection.getService().decryptAndVerify(input, + new OpenPgpData(OpenPgpData.TYPE_STRING), decryptAndVerifyCallback); + } catch (RemoteException e) { + Log.e(Constants.TAG, "CryptoProviderDemo", e); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + + if (mCryptoServiceConnection != null) { + mCryptoServiceConnection.unbindFromService(); + } + } + + private static class OpenPgpProviderElement { + private String packageName; + private String simpleName; + private Drawable icon; + + public OpenPgpProviderElement(String packageName, String simpleName, Drawable icon) { + this.packageName = packageName; + this.simpleName = simpleName; + this.icon = icon; + } + + @Override + public String toString() { + return simpleName; + } + } + + private void selectCryptoProvider() { + Intent intent = new Intent(IOpenPgpService.class.getName()); + + final ArrayList<OpenPgpProviderElement> providerList = new ArrayList<OpenPgpProviderElement>(); + + List<ResolveInfo> resInfo = getPackageManager().queryIntentServices(intent, 0); + if (!resInfo.isEmpty()) { + for (ResolveInfo resolveInfo : resInfo) { + if (resolveInfo.serviceInfo == null) + continue; + + String packageName = resolveInfo.serviceInfo.packageName; + String simpleName = String.valueOf(resolveInfo.serviceInfo + .loadLabel(getPackageManager())); + Drawable icon = resolveInfo.serviceInfo.loadIcon(getPackageManager()); + providerList.add(new OpenPgpProviderElement(packageName, simpleName, icon)); + } + } + + AlertDialog.Builder alert = new AlertDialog.Builder(this); + alert.setTitle("Select OpenPGP Provider!"); + alert.setCancelable(false); + + if (!providerList.isEmpty()) { + // add "disable OpenPGP provider" + providerList.add(0, new OpenPgpProviderElement(null, "Disable OpenPGP Provider", + getResources().getDrawable(android.R.drawable.ic_menu_close_clear_cancel))); + + // Init ArrayAdapter with OpenPGP Providers + ListAdapter adapter = new ArrayAdapter<OpenPgpProviderElement>(this, + android.R.layout.select_dialog_item, android.R.id.text1, providerList) { + public View getView(int position, View convertView, ViewGroup parent) { + // User super class to create the View + View v = super.getView(position, convertView, parent); + TextView tv = (TextView) v.findViewById(android.R.id.text1); + + // Put the image on the TextView + tv.setCompoundDrawablesWithIntrinsicBounds(providerList.get(position).icon, + null, null, null); + + // Add margin between image and text (support various screen densities) + int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f); + tv.setCompoundDrawablePadding(dp5); + + return v; + } + }; + + alert.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int position) { + String packageName = providerList.get(position).packageName; + + if (packageName == null) { + dialog.cancel(); + finish(); + } + + // bind to service + mCryptoServiceConnection = new OpenPgpServiceConnection( + OpenPgpProviderActivity.this, packageName); + mCryptoServiceConnection.bindToService(); + + dialog.dismiss(); + } + }); + } else { + alert.setMessage("No OpenPGP Provider installed!"); + } + + alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + finish(); + } + }); + + AlertDialog ad = alert.create(); + ad.show(); + } +} |