From fcec7e830c11fa0bda903ea9913fa2e41fa4d2e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Sep 2013 23:47:40 +0200 Subject: App settings activity --- .../keychain/provider/KeychainProvider.java | 7 +++ .../keychain/remote_api/AppSettingsActivity.java | 63 +++++++++++++++++++-- .../keychain/remote_api/AppSettingsFragment.java | 66 +++++++++++++++++++++- .../keychain/remote_api/RegisteredAppsAdapter.java | 5 +- .../remote_api/RegisteredAppsListFragment.java | 2 +- .../keychain/ui/SelectPublicKeyFragment.java | 13 +++-- .../keychain/ui/SelectSecretKeyFragment.java | 2 +- .../keychain/ui/widget/ImportKeysListLoader.java | 10 ---- .../keychain/ui/widget/SelectKeyCursorAdapter.java | 12 ++-- 9 files changed, 147 insertions(+), 33 deletions(-) (limited to 'OpenPGP-Keychain/src/org') diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainProvider.java index 5a86b0bdb..c875b7a70 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -611,6 +611,13 @@ public class KeychainProvider extends ContentProvider { case CRYPTO_CONSUMERS: qb.setTables(Tables.CRYPTO_CONSUMERS); + break; + case CRYPTO_CONSUMERS_BY_ROW_ID: + qb.setTables(Tables.CRYPTO_CONSUMERS); + + qb.appendWhere(BaseColumns._ID + " = "); + qb.appendWhereEscapeString(uri.getLastPathSegment()); + break; case CRYPTO_CONSUMERS_BY_PACKAGE_NAME: qb.setTables(Tables.CRYPTO_CONSUMERS); 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 31fbdc8a6..765cb8e2b 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsActivity.java @@ -2,34 +2,89 @@ package org.sufficientlysecure.keychain.remote_api; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.util.Log; +import android.content.ContentUris; import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragmentActivity; public class AppSettingsActivity extends SherlockFragmentActivity { + private PackageManager pm; + + long id; + + String packageName; + long keyId; + boolean asciiArmor; + + // derived + String appName; + + // view + TextView selectedKey; + Button selectKeyButton; + CheckBox asciiArmorCheckBox; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + pm = getApplicationContext().getPackageManager(); + setContentView(R.layout.api_app_settings_activity); - // check if add new or edit existing + selectedKey = (TextView) findViewById(R.id.api_app_settings_selected_key); + selectKeyButton = (Button) findViewById(R.id.api_app_settings_select_key_button); + asciiArmorCheckBox = (CheckBox) findViewById(R.id.api_app_ascii_armor); + Intent intent = getIntent(); Uri appUri = intent.getData(); if (appUri == null) { Log.e(Constants.TAG, "Intent data missing. Should be Uri of app!"); finish(); return; + } else { + Log.d(Constants.TAG, "uri: " + appUri); + loadData(appUri); + } + } + + private void loadData(Uri appUri) { + Cursor cur = getContentResolver().query(appUri, null, null, null, null); + id = ContentUris.parseId(appUri); + if (cur.moveToFirst()) { + do { + packageName = cur.getString(cur + .getColumnIndex(KeychainContract.CryptoConsumers.PACKAGE_NAME)); + // get application name + try { + ApplicationInfo ai = pm.getApplicationInfo(packageName, 0); + + appName = (String) pm.getApplicationLabel(ai); + } catch (final NameNotFoundException e) { + appName = getString(R.string.api_unknown_app); + } +// asciiArmor = (cur.getInt(cur +// .getColumnIndex(KeychainContract.CryptoConsumers.ASCII_ARMOR)) == 1); + + // display values +// asciiArmorCheckBox.setChecked(asciiArmor); + + } while (cur.moveToNext()); } - Log.d(Constants.TAG, "uri: " + appUri); - - } } 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 4bb09d50f..98cf5abd5 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/AppSettingsFragment.java @@ -1,15 +1,28 @@ package org.sufficientlysecure.keychain.remote_api; +import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.SelectSecretKeyActivity; +import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.widget.Button; +import android.widget.LinearLayout; public class AppSettingsFragment extends Fragment { - + + private LinearLayout advancedSettingsContainer; + private Button advancedSettingsButton; + + private Button selectKeyButton; + /** * Inflate the layout for this fragment */ @@ -17,4 +30,55 @@ public class AppSettingsFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.api_app_settings_fragment, container, false); } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + advancedSettingsButton = (Button) getActivity().findViewById( + 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); + final Animation invisibleAnimation = new AlphaAnimation(1.0f, 0.0f); + invisibleAnimation.setDuration(250); + + // TODO: Better: collapse/expand animation + // final Animation animation2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, + // Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f, + // Animation.RELATIVE_TO_SELF, 0.0f); + // animation2.setDuration(150); + + advancedSettingsButton.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + if (advancedSettingsContainer.getVisibility() == View.VISIBLE) { + advancedSettingsContainer.startAnimation(invisibleAnimation); + advancedSettingsContainer.setVisibility(View.INVISIBLE); + } else { + advancedSettingsContainer.startAnimation(visibleAnimation); + advancedSettingsContainer.setVisibility(View.VISIBLE); + } + } + }); + + 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); + } } diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsAdapter.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsAdapter.java index 61888ad5a..dcc0b973d 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsAdapter.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsAdapter.java @@ -35,9 +35,8 @@ public class RegisteredAppsAdapter extends CursorAdapter { private LayoutInflater mInflater; private PackageManager pm; - @SuppressWarnings("deprecation") - public RegisteredAppsAdapter(Context context, Cursor c) { - super(context, c); + public RegisteredAppsAdapter(Context context, Cursor c, int flags) { + super(context, c, flags); mInflater = LayoutInflater.from(context); pm = context.getApplicationContext().getPackageManager(); diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsListFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsListFragment.java index 52f4d1398..bd879a1b6 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsListFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/remote_api/RegisteredAppsListFragment.java @@ -51,7 +51,7 @@ public class RegisteredAppsListFragment extends SherlockListFragment implements setHasOptionsMenu(true); // Create an empty adapter we will use to display the loaded data. - mAdapter = new RegisteredAppsAdapter(getActivity(), null); + mAdapter = new RegisteredAppsAdapter(getActivity(), null, 0); setListAdapter(mAdapter); // Prepare the loader. Either re-connect with an existing one, diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java index 8b3e75d05..b9c42a17c 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java @@ -67,7 +67,7 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements // application this would come from a resource. setEmptyText(getString(R.string.listEmpty)); - mAdapter = new SelectKeyCursorAdapter(mActivity, mListView, null, Id.type.public_key); + mAdapter = new SelectKeyCursorAdapter(mActivity, null, 0, mListView, Id.type.public_key); setListAdapter(mAdapter); @@ -160,11 +160,12 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements + SelectKeyCursorAdapter.PROJECTION_ROW_AVAILABLE, "(SELECT COUNT(valid_keys." + Keys._ID + ") FROM " + Tables.KEYS + " AS valid_keys WHERE valid_keys." + Keys.KEY_RING_ROW_ID + " = " - + KeychainDatabase.Tables.KEY_RINGS + "." + KeyRings._ID + " AND valid_keys." - + Keys.IS_REVOKED + " = '0' AND valid_keys." + Keys.CAN_ENCRYPT - + " = '1' AND valid_keys." + Keys.CREATION + " <= '" + now + "' AND " - + "(valid_keys." + Keys.EXPIRY + " IS NULL OR valid_keys." + Keys.EXPIRY - + " >= '" + now + "')) AS " + SelectKeyCursorAdapter.PROJECTION_ROW_VALID, }; + + KeychainDatabase.Tables.KEY_RINGS + "." + KeyRings._ID + + " AND valid_keys." + Keys.IS_REVOKED + " = '0' AND valid_keys." + + Keys.CAN_ENCRYPT + " = '1' AND valid_keys." + Keys.CREATION + " <= '" + + now + "' AND " + "(valid_keys." + Keys.EXPIRY + " IS NULL OR valid_keys." + + Keys.EXPIRY + " >= '" + now + "')) AS " + + SelectKeyCursorAdapter.PROJECTION_ROW_VALID, }; String inMasterKeyList = null; if (mSelectedMasterKeyIds != null && mSelectedMasterKeyIds.length > 0) { diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java index 4871b74bc..9b87f085c 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java @@ -73,7 +73,7 @@ public class SelectSecretKeyFragment extends SherlockListFragment implements // application this would come from a resource. setEmptyText(getString(R.string.listEmpty)); - mAdapter = new SelectKeyCursorAdapter(mActivity, mListView, null, Id.type.secret_key); + mAdapter = new SelectKeyCursorAdapter(mActivity, null, 0, mListView, Id.type.secret_key); setListAdapter(mAdapter); diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/ImportKeysListLoader.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/ImportKeysListLoader.java index 198140e0c..94d578384 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/ImportKeysListLoader.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/ImportKeysListLoader.java @@ -23,19 +23,14 @@ import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import org.spongycastle.openpgp.PGPKeyRing; import org.spongycastle.openpgp.PGPObjectFactory; -import org.spongycastle.openpgp.PGPPublicKeyRing; -import org.spongycastle.openpgp.PGPPublicKeyRingCollection; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.spongycastle.openpgp.PGPSecretKeyRingCollection; import org.spongycastle.openpgp.PGPUtil; import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.helper.PgpConversionHelper; import org.sufficientlysecure.keychain.helper.PgpHelper; import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; @@ -45,11 +40,6 @@ import org.sufficientlysecure.keychain.R; import android.content.Context; import android.support.v4.content.AsyncTaskLoader; -/** - * A custom Loader to search for bad adware apps, based on - * https://github.com/brosmike/AirPush-Detector. Daniel Bjorge licensed it under Apachev2 after - * asking him by mail. - */ public class ImportKeysListLoader extends AsyncTaskLoader>> { public static final String MAP_ATTR_USER_ID = "user_id"; public static final String MAP_ATTR_FINGERPINT = "fingerprint"; diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java index 17423136f..5d8b7d1b1 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java @@ -44,9 +44,9 @@ public class SelectKeyCursorAdapter extends CursorAdapter { public final static String PROJECTION_ROW_AVAILABLE = "available"; public final static String PROJECTION_ROW_VALID = "valid"; - @SuppressWarnings("deprecation") - public SelectKeyCursorAdapter(Context context, ListView listView, Cursor c, int keyType) { - super(context, c); + public SelectKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView, + int keyType) { + super(context, c, flags); mInflater = LayoutInflater.from(context); mListView = listView; @@ -65,8 +65,7 @@ public class SelectKeyCursorAdapter extends CursorAdapter { @Override public void bindView(View view, Context context, Cursor cursor) { - boolean valid = cursor.getInt(cursor - .getColumnIndex(PROJECTION_ROW_VALID)) > 0; + boolean valid = cursor.getInt(cursor.getColumnIndex(PROJECTION_ROW_VALID)) > 0; TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId); mainUserId.setText(R.string.unknownUserId); @@ -101,8 +100,7 @@ public class SelectKeyCursorAdapter extends CursorAdapter { status.setText(R.string.canSign); } } else { - if (cursor.getInt(cursor - .getColumnIndex(PROJECTION_ROW_AVAILABLE)) > 0) { + if (cursor.getInt(cursor.getColumnIndex(PROJECTION_ROW_AVAILABLE)) > 0) { // has some CAN_ENCRYPT keys, but col(ROW_VALID) = 0, so must be revoked or // expired status.setText(R.string.expired); -- cgit v1.2.3