diff options
Diffstat (limited to 'OpenPGP-Keychain-API-Demo/src')
2 files changed, 249 insertions, 0 deletions
| diff --git a/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/BaseActivity.java b/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/BaseActivity.java index 322a446b5..aa34fdebe 100644 --- a/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/BaseActivity.java +++ b/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/BaseActivity.java @@ -30,6 +30,7 @@ public class BaseActivity extends PreferenceActivity {      private Preference mIntentDemo;      private Preference mContentProviderDemo; +    private Preference mCryptoProvider;      private Preference mAidlDemo;      private Preference mAidlDemo2; @@ -48,6 +49,7 @@ public class BaseActivity extends PreferenceActivity {          // find preferences          mIntentDemo = (Preference) findPreference("intent_demo");          mContentProviderDemo = (Preference) findPreference("content_provider_demo"); +        mCryptoProvider = (Preference) findPreference("crypto_provider_demo");          mAidlDemo = (Preference) findPreference("aidl_demo");          mAidlDemo2 = (Preference) findPreference("aidl_demo2"); @@ -68,6 +70,15 @@ public class BaseActivity extends PreferenceActivity {                  return false;              }          }); +         +        mCryptoProvider.setOnPreferenceClickListener(new OnPreferenceClickListener() { +            @Override +            public boolean onPreferenceClick(Preference preference) { +                startActivity(new Intent(mActivity, CryptoProviderDemoActivity.class)); + +                return false; +            } +        });          mAidlDemo.setOnPreferenceClickListener(new OnPreferenceClickListener() {              @Override diff --git a/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java b/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java new file mode 100644 index 000000000..b915e2a76 --- /dev/null +++ b/OpenPGP-Keychain-API-Demo/src/org/sufficientlysecure/keychain/demo/CryptoProviderDemoActivity.java @@ -0,0 +1,238 @@ +/* + * 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 org.sufficientlysecure.keychain.integration.Constants; +import org.sufficientlysecure.keychain.integration.KeychainData; +import org.sufficientlysecure.keychain.integration.KeychainIntentHelper; +import org.sufficientlysecure.keychain.service.IKeychainApiService; +import org.sufficientlysecure.keychain.service.IKeychainKeyService; +import org.sufficientlysecure.keychain.service.handler.IKeychainDecryptHandler; +import org.sufficientlysecure.keychain.service.handler.IKeychainEncryptHandler; +import org.sufficientlysecure.keychain.service.handler.IKeychainGetDecryptionKeyIdHandler; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +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.Log; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +public class CryptoProviderDemoActivity extends Activity { +    Activity mActivity; + +    TextView mMessageTextView; +    TextView mCiphertextTextView; +    TextView mDataTextView; + +    KeychainIntentHelper mKeychainIntentHelper; +    KeychainData mKeychainData; + +    private IKeychainApiService service = null; +    private ServiceConnection svcConn = new ServiceConnection() { +        public void onServiceConnected(ComponentName className, IBinder binder) { +            service = IKeychainApiService.Stub.asInterface(binder); +        } + +        public void onServiceDisconnected(ComponentName className) { +            service = null; +        } +    }; + +    @Override +    public void onCreate(Bundle icicle) { +        super.onCreate(icicle); +        setContentView(R.layout.crypto_provider_demo); + +        mActivity = this; + +        mMessageTextView = (TextView) findViewById(R.id.aidl_demo_message); +        mCiphertextTextView = (TextView) findViewById(R.id.aidl_demo_ciphertext); +        mDataTextView = (TextView) findViewById(R.id.aidl_demo_data); + +        mKeychainIntentHelper = new KeychainIntentHelper(mActivity); +        mKeychainData = new KeychainData(); + +        bindService(new Intent(IKeychainApiService.class.getName()), svcConn, +                Context.BIND_AUTO_CREATE); +    } + +    public void registerCryptoProvider(View view) { +        try { +            startActivityForResult(Intent.createChooser(new Intent("com.android.crypto.REGISTER"), +                    "select crypto provider"), 123); +        } catch (ActivityNotFoundException e) { +            Toast.makeText(mActivity, "No app that handles com.android.crypto.REGISTER!", +                    Toast.LENGTH_LONG).show(); +            Log.e(Constants.TAG, "No app that handles com.android.crypto.REGISTER!"); +        } +    } + +    @Override +    protected void onActivityResult(int requestCode, int resultCode, Intent data) { +        if (requestCode == 123) { +            if (resultCode == RESULT_OK) { +                String packageName = data.getStringExtra("packageName"); +                Log.d(Constants.TAG, "packageName: " + packageName); +            } +        } + +        // boolean result = mKeychainIntentHelper.onActivityResult(requestCode, resultCode, data, +        // mKeychainData); +        // if (result) { +        // updateView(); +        // } + +        // continue with other activity results +        super.onActivityResult(requestCode, resultCode, data); +    } + +    public void encryptOnClick(View view) { +        byte[] inputBytes = mMessageTextView.getText().toString().getBytes(); + +        try { +            service.encryptAsymmetric(inputBytes, null, true, 0, mKeychainData.getPublicKeys(), 7, +                    encryptHandler); +        } catch (RemoteException e) { +            exceptionImplementation(-1, e.toString()); +        } +    } + +    public void decryptOnClick(View view) { +        byte[] inputBytes = mCiphertextTextView.getText().toString().getBytes(); + +        try { +            service.decryptAndVerifyAsymmetric(inputBytes, null, null, decryptHandler); +        } catch (RemoteException e) { +            exceptionImplementation(-1, e.toString()); +        } +    } + +    private void updateView() { +        if (mKeychainData.getDecryptedData() != null) { +            mMessageTextView.setText(mKeychainData.getDecryptedData()); +        } +        if (mKeychainData.getEncryptedData() != null) { +            mCiphertextTextView.setText(mKeychainData.getEncryptedData()); +        } +        mDataTextView.setText(mKeychainData.toString()); +    } + +    @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 IKeychainEncryptHandler.Stub encryptHandler = new IKeychainEncryptHandler.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, String outputUri) throws RemoteException { +            runOnUiThread(new Runnable() { +                public void run() { +                    mKeychainData.setEncryptedData(new String(outputBytes)); +                    updateView(); +                } +            }); +        } + +    }; + +    private final IKeychainDecryptHandler.Stub decryptHandler = new IKeychainDecryptHandler.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, String outputUri, boolean signature, +                long signatureKeyId, String signatureUserId, boolean signatureSuccess, +                boolean signatureUnknown) throws RemoteException { +            runOnUiThread(new Runnable() { +                public void run() { +                    mKeychainData.setDecryptedData(new String(outputBytes)); +                    updateView(); +                } +            }); + +        } + +    }; + +    private final IKeychainGetDecryptionKeyIdHandler.Stub helperHandler = new IKeychainGetDecryptionKeyIdHandler.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(long arg0, boolean arg1) throws RemoteException { +            // TODO Auto-generated method stub + +        } + +    }; + +    /** +     * Selection is done with Intents, not AIDL! +     *  +     * @param view +     */ +    public void selectSecretKeyOnClick(View view) { +        mKeychainIntentHelper.selectSecretKey(); +    } + +    public void selectEncryptionKeysOnClick(View view) { +        mKeychainIntentHelper.selectPublicKeys("user@example.com"); + +    } + +} | 
