diff options
author | Dominik Schürmann <dominik@dominikschuermann.de> | 2013-09-06 08:29:56 +0200 |
---|---|---|
committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2013-09-06 08:29:56 +0200 |
commit | 2b303d35583a31dfa994ca722f98446a474eb5ae (patch) | |
tree | 6208eeb289a0599d4df4cf60b8c89b50704f3a8a | |
parent | 00d03d452ecde61cd6fe29eeadbf7a3d2e9050e5 (diff) | |
download | open-keychain-2b303d35583a31dfa994ca722f98446a474eb5ae.tar.gz open-keychain-2b303d35583a31dfa994ca722f98446a474eb5ae.tar.bz2 open-keychain-2b303d35583a31dfa994ca722f98446a474eb5ae.zip |
select key for api apps
7 files changed, 165 insertions, 49 deletions
diff --git a/OpenPGP-Keychain/res/layout/actionbar_include_done_button.xml b/OpenPGP-Keychain/res/layout/actionbar_include_done_button.xml index e14853be3..54e5933e3 100644 --- a/OpenPGP-Keychain/res/layout/actionbar_include_done_button.xml +++ b/OpenPGP-Keychain/res/layout/actionbar_include_done_button.xml @@ -31,6 +31,6 @@ android:drawablePadding="8dp" android:gravity="center_vertical" android:paddingRight="20dp" - android:text="Save (set in-code!)" /> + android:text="Done (set in-code!)" /> </FrameLayout>
\ No newline at end of file diff --git a/OpenPGP-Keychain/res/layout/api_app_settings_activity.xml b/OpenPGP-Keychain/res/layout/api_app_settings_activity.xml index 3157a3f09..c80d767ac 100644 --- a/OpenPGP-Keychain/res/layout/api_app_settings_activity.xml +++ b/OpenPGP-Keychain/res/layout/api_app_settings_activity.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" - android:layout_height="fill_parent" > + android:layout_height="fill_parent" + android:orientation="vertical" + android:padding="8dp" > <fragment android:id="@+id/api_app_settings_fragment" @@ -11,4 +13,4 @@ android:layout_height="wrap_content" tools:layout="@layout/api_app_settings_fragment" /> -</RelativeLayout>
\ No newline at end of file +</LinearLayout>
\ No newline at end of file diff --git a/OpenPGP-Keychain/res/layout/api_app_settings_fragment.xml b/OpenPGP-Keychain/res/layout/api_app_settings_fragment.xml index 6db366297..307da3efb 100644 --- a/OpenPGP-Keychain/res/layout/api_app_settings_fragment.xml +++ b/OpenPGP-Keychain/res/layout/api_app_settings_fragment.xml @@ -4,20 +4,38 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="?android:attr/listPreferredItemHeight" + android:gravity="center_horizontal" android:orientation="horizontal" android:paddingBottom="3dip" > + <ImageView + android:id="@+id/api_app_settings_app_icon" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_alignParentBottom="true" + android:layout_alignParentTop="true" + android:layout_marginRight="6dp" + android:src="@drawable/icon" /> + <TextView - android:id="@+id/api_app_settings_selected_key" - android:layout_width="0dip" + android:id="@+id/api_app_settings_app_name" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_weight="1" - android:text="@string/api_settings_no_key" + android:layout_centerVertical="true" + android:layout_toRightOf="@+id/api_app_settings_app_icon" + android:gravity="center_vertical" + android:orientation="vertical" + android:text="Name (set in-code)" android:textAppearance="?android:attr/textAppearanceMedium" /> + </RelativeLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" > <Button android:id="@+id/api_app_settings_select_key_button" @@ -25,6 +43,33 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="@string/api_settings_select_key" /> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingLeft="16dp" > + + <TextView + android:id="@+id/api_app_settings_user_id" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right" + android:ellipsize="end" + android:singleLine="true" + android:text="@string/api_settings_no_key" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/api_app_settings_user_id_rest" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right" + android:ellipsize="end" + android:singleLine="true" + android:text="" + android:textAppearance="?android:attr/textAppearanceSmall" /> + </LinearLayout> </LinearLayout> <Button diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainContract.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainContract.java index e9637c35d..93ee50a5e 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainContract.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainContract.java @@ -55,7 +55,7 @@ public class KeychainContract { interface ApiAppsColumns { String PACKAGE_NAME = "package_name"; - String PRIVATE_KEY_ID = "private_key_id"; // not a database id + String KEY_ID = "key_id"; // not a database id String ASCII_ARMOR = "ascii_armor"; String ENCRYPTION_ALGORITHM = "encryption_algorithm"; String HASH_ALORITHM = "hash_algorithm"; diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainDatabase.java index 283ab73e3..6da96f45f 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainDatabase.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainDatabase.java @@ -67,7 +67,7 @@ public class KeychainDatabase extends SQLiteOpenHelper { private static final String CREATE_API_APPS = "CREATE TABLE IF NOT EXISTS " + Tables.API_APPS + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ApiAppsColumns.PACKAGE_NAME - + " TEXT UNIQUE, " + ApiAppsColumns.PRIVATE_KEY_ID + " INT64, " + + " TEXT UNIQUE, " + ApiAppsColumns.KEY_ID + " INT64, " + ApiAppsColumns.ASCII_ARMOR + " INTEGER, " + ApiAppsColumns.ENCRYPTION_ALGORITHM + " INTEGER, " + ApiAppsColumns.HASH_ALORITHM + " INTEGER, " diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsActivity.java index 0cfbbe3fc..8d32dd3f5 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsActivity.java @@ -1,8 +1,14 @@ package org.sufficientlysecure.keychain.remote_api; +import org.spongycastle.openpgp.PGPSecretKey; +import org.spongycastle.openpgp.PGPSecretKeyRing; import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.helper.PgpHelper; import org.sufficientlysecure.keychain.provider.KeychainContract; +import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.ui.SelectSecretKeyActivity; import org.sufficientlysecure.keychain.util.Log; import android.content.ContentValues; @@ -11,12 +17,15 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.database.Cursor; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; +import android.widget.ImageView; import android.widget.TextView; import com.actionbarsherlock.app.ActionBar; @@ -28,15 +37,15 @@ public class AppSettingsActivity extends SherlockFragmentActivity { private PackageManager pm; // model - Uri appUri; - String packageName; - long keyId; - - // model, derived - String appName; + Uri mAppUri; + String mPackageName; + long mSecretKeyId = Id.key.none; // view - TextView selectedKey; + TextView appNameView; + ImageView appIconView; + TextView keyUserId; + TextView keyUserIdRest; Button selectKeyButton; CheckBox asciiArmorCheckBox; Button saveButton; @@ -75,19 +84,30 @@ public class AppSettingsActivity extends SherlockFragmentActivity { setContentView(R.layout.api_app_settings_activity); - selectedKey = (TextView) findViewById(R.id.api_app_settings_selected_key); + appNameView = (TextView) findViewById(R.id.api_app_settings_app_name); + appIconView = (ImageView) findViewById(R.id.api_app_settings_app_icon); + keyUserId = (TextView) findViewById(R.id.api_app_settings_user_id); + keyUserIdRest = (TextView) findViewById(R.id.api_app_settings_user_id_rest); selectKeyButton = (Button) findViewById(R.id.api_app_settings_select_key_button); asciiArmorCheckBox = (CheckBox) findViewById(R.id.api_app_ascii_armor); + selectKeyButton.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + selectSecretKey(); + } + }); + Intent intent = getIntent(); - appUri = intent.getData(); - if (appUri == null) { + mAppUri = intent.getData(); + if (mAppUri == null) { Log.e(Constants.TAG, "Intent data missing. Should be Uri of app!"); finish(); return; } else { - Log.d(Constants.TAG, "uri: " + appUri); - loadData(appUri); + Log.d(Constants.TAG, "uri: " + mAppUri); + loadData(mAppUri); } } @@ -114,18 +134,28 @@ public class AppSettingsActivity extends SherlockFragmentActivity { private void loadData(Uri appUri) { Cursor cur = getContentResolver().query(appUri, null, null, null, null); if (cur.moveToFirst()) { - packageName = cur.getString(cur.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)); - // get application name + mPackageName = cur.getString(cur.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)); + + // get application name and icon from package manager + String appName = null; + Drawable appIcon = null; try { - ApplicationInfo ai = pm.getApplicationInfo(packageName, 0); + ApplicationInfo ai = pm.getApplicationInfo(mPackageName, 0); appName = (String) pm.getApplicationLabel(ai); + appIcon = pm.getApplicationIcon(ai); } catch (final NameNotFoundException e) { appName = getString(R.string.api_unknown_app); } - setTitle(appName); + appNameView.setText(appName); + appIconView.setImageDrawable(appIcon); try { + mSecretKeyId = (cur.getLong(cur + .getColumnIndexOrThrow(KeychainContract.ApiApps.KEY_ID))); + Log.d(Constants.TAG, "mSecretKeyId: " + mSecretKeyId); + updateSelectedKeyView(mSecretKeyId); + boolean asciiArmor = (cur.getInt(cur .getColumnIndexOrThrow(KeychainContract.ApiApps.ASCII_ARMOR)) == 1); asciiArmorCheckBox.setChecked(asciiArmor); @@ -137,7 +167,7 @@ public class AppSettingsActivity extends SherlockFragmentActivity { } private void revokeAccess() { - if (getContentResolver().delete(appUri, null, null) <= 0) { + if (getContentResolver().delete(mAppUri, null, null) <= 0) { throw new RuntimeException(); } finish(); @@ -145,14 +175,69 @@ public class AppSettingsActivity extends SherlockFragmentActivity { private void save() { final ContentValues cv = new ContentValues(); - // cv.put(KeychainContract.ApiApps.PACKAGE_NAME, packageName); + cv.put(KeychainContract.ApiApps.KEY_ID, mSecretKeyId); + cv.put(KeychainContract.ApiApps.ASCII_ARMOR, asciiArmorCheckBox.isChecked()); // TODO: other parameters - if (getContentResolver().update(appUri, cv, null, null) <= 0) { + + if (getContentResolver().update(mAppUri, cv, null, null) <= 0) { throw new RuntimeException(); } finish(); } + private void selectSecretKey() { + Intent intent = new Intent(this, SelectSecretKeyActivity.class); + startActivityForResult(intent, Id.request.secret_keys); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + + case Id.request.secret_keys: { + if (resultCode == RESULT_OK) { + Bundle bundle = data.getExtras(); + mSecretKeyId = bundle.getLong(SelectSecretKeyActivity.RESULT_EXTRA_MASTER_KEY_ID); + } else { + mSecretKeyId = Id.key.none; + } + updateSelectedKeyView(mSecretKeyId); + break; + } + + default: { + break; + } + } + + super.onActivityResult(requestCode, resultCode, data); + } + + private void updateSelectedKeyView(long secretKeyId) { + if (secretKeyId == Id.key.none) { + keyUserId.setText(R.string.api_settings_no_key); + keyUserIdRest.setText(""); + } else { + String uid = getResources().getString(R.string.unknownUserId); + String uidExtra = ""; + PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId(this, + secretKeyId); + if (keyRing != null) { + PGPSecretKey key = PgpHelper.getMasterKey(keyRing); + if (key != null) { + String userId = PgpHelper.getMainUserIdSafe(this, key); + String chunks[] = userId.split(" <", 2); + uid = chunks[0]; + if (chunks.length > 1) { + uidExtra = "<" + chunks[1]; + } + } + } + keyUserId.setText(uid); + keyUserIdRest.setText(uidExtra); + } + } + } diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsFragment.java index ec983dc06..46cea389a 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsFragment.java @@ -21,8 +21,6 @@ public class AppSettingsFragment extends Fragment { private LinearLayout advancedSettingsContainer; private Button advancedSettingsButton; - private Button selectKeyButton; - /** * Inflate the layout for this fragment */ @@ -39,8 +37,6 @@ public class AppSettingsFragment extends Fragment { R.id.api_app_settings_advanced_button); advancedSettingsContainer = (LinearLayout) getActivity().findViewById( R.id.api_app_settings_advanced); - selectKeyButton = (Button) getActivity().findViewById( - R.id.api_app_settings_select_key_button); final Animation visibleAnimation = new AlphaAnimation(0.0f, 1.0f); visibleAnimation.setDuration(250); @@ -68,18 +64,6 @@ public class AppSettingsFragment extends Fragment { } } }); - - selectKeyButton.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - selectSecretKey(); - } - }); } - private void selectSecretKey() { - Intent intent = new Intent(getActivity(), SelectSecretKeyActivity.class); - startActivityForResult(intent, Id.request.secret_keys); - } } |