From 33b54ab03ea611223864dded6f1f99b9eac0870b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Sat, 25 Oct 2014 02:38:06 +0200 Subject: Safe slinger activity preps --- OpenKeychain/src/main/AndroidManifest.xml | 9 + .../keychain/ui/KeyListActivity.java | 1 - .../keychain/ui/KeyListFragment.java | 138 +----------- .../keychain/ui/SafeSlingerActivity.java | 233 ++++++++++++++++++++- .../main/res/layout-v11/safe_slinger_activity.xml | 65 ++++++ .../src/main/res/layout/safe_slinger_activity.xml | 49 ++++- OpenKeychain/src/main/res/values/strings.xml | 7 +- 7 files changed, 350 insertions(+), 152 deletions(-) create mode 100644 OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index bc6912f38..3014d7093 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -134,6 +134,15 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".ui.ViewKeyActivity" /> + + + it = getSlingedKeys(data.getExtras()); - - // We parcel this iteratively into a file - anything we can - // display here, we should be able to import. - ParcelableFileCache cache = - new ParcelableFileCache(activity, "key_import.pcl"); - cache.writeCache(it.size(), it.iterator()); - - // fill values for this action - Bundle bundle = new Bundle(); - intent.putExtra(KeychainIntentService.EXTRA_DATA, bundle); - - // Create a new Messenger for the communication back - Messenger messenger = new Messenger(saveHandler); - intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); - - // show progress dialog - saveHandler.showProgressDialog(activity); - - // start service with intent - activity.startService(intent); - } catch (IOException e) { - Log.e(Constants.TAG, "Problem writing cache file", e); - Notify.showNotify(activity, "Problem writing cache file!", Notify.Style.ERROR); - } - } - - super.onActivityResult(requestCode, resultCode, data); - } - - private static ArrayList getSlingedKeys(Bundle extras) { - - ArrayList list = new ArrayList(); - - if (extras != null) { - byte[] d; - int i = 0; - do { - d = extras.getByteArray(ExchangeConfig.extra.MEMBER_DATA + i); - if (d != null) { - list.add(new ParcelableKeyRing(d)); - i++; - } - } while (d != null); - } - - return list; - - } - - private void startExchange(long masterKeyId) { - mExchangeMasterKeyId = masterKeyId; - // retrieve public key blob and start SafeSlinger - Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(masterKeyId); - try { - byte[] keyBlob = (byte[]) new ProviderHelper(getActivity()).getGenericData( - uri, KeychainContract.KeyRingData.KEY_RING_DATA, ProviderHelper.FIELD_TYPE_BLOB); - - Intent slingerIntent = new Intent(getActivity(), ExchangeActivity.class); - slingerIntent.putExtra(ExchangeConfig.extra.USER_DATA, keyBlob); - slingerIntent.putExtra(ExchangeConfig.extra.HOST_NAME, Constants.SAFESLINGER_SERVER); - startActivityForResult(slingerIntent, REQUEST_CODE_SAFE_SLINGER); - } catch (ProviderHelper.NotFoundException e) { - Log.e(Constants.TAG, "personal key not found", e); - } - } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java index b8e3dd590..36ea453c5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java @@ -17,27 +17,250 @@ package org.sufficientlysecure.keychain.ui; +import android.annotation.TargetApi; +import android.app.ProgressDialog; +import android.content.Intent; +import android.graphics.PorterDuff; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Message; +import android.os.Messenger; +import android.support.v4.app.FragmentActivity; import android.support.v7.app.ActionBarActivity; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.NumberPicker; +import android.widget.Spinner; +import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; +import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult; +import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; +import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.ParcelableFileCache; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import edu.cmu.cylab.starslinger.exchange.ExchangeActivity; +import edu.cmu.cylab.starslinger.exchange.ExchangeConfig; + +@TargetApi(Build.VERSION_CODES.HONEYCOMB) public class SafeSlingerActivity extends ActionBarActivity { + private static final int REQUEST_CODE_SAFE_SLINGER = 211; + + public static final String EXTRA_MASTER_KEY_ID = "master_key_id"; + + private long mMasterKeyId; + private int mSelectedNumber; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.safe_slinger_activity); - NumberPicker numberPicker = (NumberPicker) findViewById(R.id.safe_slinger_number_picker); + mMasterKeyId = getIntent().getLongExtra(EXTRA_MASTER_KEY_ID, 0); + + // NOTE: there are two versions of this layout, for API >= 11 and one for < 11 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + NumberPicker picker = (NumberPicker) findViewById(R.id.safe_slinger_picker); + picker.setMinValue(2); + picker.setMaxValue(10); + picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + mSelectedNumber = newVal; + } + }); + } else { + Spinner spinner = (Spinner) findViewById(R.id.safe_slinger_spinner); + + List list = new ArrayList(); + list.add("2"); + list.add("3"); + list.add("4"); + list.add("5"); + list.add("6"); + list.add("7"); + list.add("8"); + list.add("9"); + list.add("10"); + + ArrayAdapter dataAdapter = new ArrayAdapter(this, + android.R.layout.simple_spinner_item, list); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(dataAdapter); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + mSelectedNumber = position + 2; + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + } + + ImageView button = (ImageView) findViewById(R.id.safe_slinger_button_image); + button.setColorFilter(getResources().getColor(R.color.tertiary_text_light), + PorterDuff.Mode.SRC_IN); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startExchange(mMasterKeyId); + } + }); + } + + private void startExchange(long masterKeyId) { + // retrieve public key blob and start SafeSlinger + Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(masterKeyId); + try { + byte[] keyBlob = (byte[]) new ProviderHelper(this).getGenericData( + uri, KeychainContract.KeyRingData.KEY_RING_DATA, ProviderHelper.FIELD_TYPE_BLOB); + + Intent slingerIntent = new Intent(this, ExchangeActivity.class); + slingerIntent.putExtra(ExchangeConfig.extra.USER_DATA, keyBlob); + slingerIntent.putExtra(ExchangeConfig.extra.HOST_NAME, Constants.SAFESLINGER_SERVER); + startActivityForResult(slingerIntent, REQUEST_CODE_SAFE_SLINGER); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "personal key not found", e); + } + } + + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_SAFE_SLINGER) { + if (resultCode == ExchangeActivity.RESULT_EXCHANGE_CANCELED) { + return; + } + + final FragmentActivity activity = SafeSlingerActivity.this; + + // Message is received after importing is done in KeychainIntentService + KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler( + activity, + getString(R.string.progress_importing), + ProgressDialog.STYLE_HORIZONTAL, + true) { + public void handleMessage(Message message) { + // handle messages by standard KeychainIntentServiceHandler first + super.handleMessage(message); + + if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { + // get returned data bundle + Bundle returnData = message.getData(); + if (returnData == null) { + return; + } + final ImportKeyResult result = + returnData.getParcelable(OperationResult.EXTRA_RESULT); + if (result == null) { + Log.e(Constants.TAG, "result == null"); + return; + } + + if (!result.success()) { +// result.createNotify(activity).show(); + // only return if no success... + Intent data = new Intent(); + data.putExtras(returnData); + setResult(RESULT_OK, data); + finish(); + return; + } + +// if (mExchangeMasterKeyId == null) { +// return; +// } + + Intent certifyIntent = new Intent(activity, MultiCertifyKeyActivity.class); + certifyIntent.putExtra(MultiCertifyKeyActivity.EXTRA_RESULT, result); + certifyIntent.putExtra(MultiCertifyKeyActivity.EXTRA_KEY_IDS, result.getImportedMasterKeyIds()); + certifyIntent.putExtra(MultiCertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, mMasterKeyId); + startActivityForResult(certifyIntent, KeyListActivity.REQUEST_CODE_RESULT_TO_LIST); + +// mExchangeMasterKeyId = null; + } + } + }; + + Log.d(Constants.TAG, "importKeys started"); + + // Send all information needed to service to import key in other thread + Intent intent = new Intent(activity, KeychainIntentService.class); + + intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING); + + // instead of giving the entries by Intent extra, cache them into a + // file to prevent Java Binder problems on heavy imports + // read FileImportCache for more info. + try { + // import exchanged keys + ArrayList it = getSlingedKeys(data.getExtras()); + + // We parcel this iteratively into a file - anything we can + // display here, we should be able to import. + ParcelableFileCache cache = + new ParcelableFileCache(activity, "key_import.pcl"); + cache.writeCache(it.size(), it.iterator()); + + // fill values for this action + Bundle bundle = new Bundle(); + intent.putExtra(KeychainIntentService.EXTRA_DATA, bundle); + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(saveHandler); + intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + + // show progress dialog + saveHandler.showProgressDialog(activity); + + // start service with intent + activity.startService(intent); + } catch (IOException e) { + Log.e(Constants.TAG, "Problem writing cache file", e); + Notify.showNotify(activity, "Problem writing cache file!", Notify.Style.ERROR); + } + } else { + // give everything else down to KeyListActivity! + setResult(resultCode, data); + finish(); + } + } + + private static ArrayList getSlingedKeys(Bundle extras) { + ArrayList list = new ArrayList(); + + if (extras != null) { + byte[] d; + int i = 0; + do { + d = extras.getByteArray(ExchangeConfig.extra.MEMBER_DATA + i); + if (d != null) { + list.add(new ParcelableKeyRing(d)); + i++; + } + } while (d != null); + } - numberPicker.setDisplayedValues(new String[]{"2","3","4","5","6","7","8","9","10"}); - numberPicker.setValue(0); -// numberPicker.setMaxValue(8); -// numberPicker.setMinValue(0); + return list; } } diff --git a/OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml b/OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml new file mode 100644 index 000000000..5e8e5aa5f --- /dev/null +++ b/OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml b/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml index 46d9237ea..e81c21182 100644 --- a/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml +++ b/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml @@ -10,17 +10,56 @@ android:paddingRight="16dp"> - + android:id="@+id/safe_slinger_spinner" /> - + + + + + + + + + + + + + diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 3cfacbfd5..b6de54c14 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -39,6 +39,7 @@ "Help" "Log" "Create Key" + "Exchange Keys" "Identities" @@ -238,7 +239,6 @@ "Please select a key to be used for certification!" "Key is too big to be shared this way!" "Text has been copied to the clipboard!" - "Please select a key to be used for secure exchange!" - "Exchange" - "Add" "My key:" - "Start exchange" - "Scan QR Code" - "Receive via NFC" "Done." -- cgit v1.2.3