From e663dadc32633dc12f846539196276265ccc3534 Mon Sep 17 00:00:00 2001
From: Tim Bray
Date: Fri, 18 Apr 2014 12:44:42 -0700
Subject: can search openkeychain, retrieve & install & use keys from there
---
.../keychain/service/KeychainIntentService.java | 53 +++++++
.../keychain/ui/ImportKeysActivity.java | 41 ++++-
.../keychain/ui/ImportKeysClipboardFragment.java | 2 +-
.../keychain/ui/ImportKeysFileFragment.java | 2 +-
.../keychain/ui/ImportKeysKeybaseFragment.java | 108 +++++++++++++
.../keychain/ui/ImportKeysListFragment.java | 52 ++++++-
.../keychain/ui/ImportKeysQrCodeFragment.java | 4 +-
.../keychain/ui/ImportKeysServerFragment.java | 2 +-
.../keychain/ui/adapter/ImportKeysListEntry.java | 2 +-
.../ui/adapter/ImportKeysListKeybaseLoader.java | 109 +++++++++++++
.../sufficientlysecure/keychain/util/JWalk.java | 56 +++++++
.../keychain/util/KeybaseKeyServer.java | 173 +++++++++++++++++++++
.../res/layout/import_keys_keybase_fragment.xml | 51 ++++++
OpenKeychain/src/main/res/values/arrays.xml | 1 +
OpenKeychain/src/main/res/values/strings.xml | 3 +
15 files changed, 647 insertions(+), 12 deletions(-)
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
create mode 100644 OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index 5615b59c4..fcd31b2fe 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -56,6 +56,8 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
import org.sufficientlysecure.keychain.util.HkpKeyServer;
import org.sufficientlysecure.keychain.util.InputData;
+import org.sufficientlysecure.keychain.util.KeyServer;
+import org.sufficientlysecure.keychain.util.KeybaseKeyServer;
import org.sufficientlysecure.keychain.util.KeychainServiceListener;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressScaler;
@@ -103,6 +105,7 @@ public class KeychainIntentService extends IntentService
public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING";
public static final String ACTION_DOWNLOAD_AND_IMPORT_KEYS = Constants.INTENT_PREFIX + "QUERY_KEYRING";
+ public static final String ACTION_IMPORT_KEYBASE_KEYS = Constants.INTENT_PREFIX + "DOWNLOAD_KEYBASE";
public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING";
@@ -739,6 +742,56 @@ public class KeychainIntentService extends IntentService
} catch (Exception e) {
sendErrorToHandler(e);
}
+ } else if (ACTION_IMPORT_KEYBASE_KEYS.equals(action)) {
+ ArrayList entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST);
+
+ try {
+ KeybaseKeyServer server = new KeybaseKeyServer();
+ for (ImportKeysListEntry entry : entries) {
+ // the keybase handle is in userId(1)
+ String username = entry.getUserIds().get(1);
+ byte[] downloadedKeyBytes = server.get(username).getBytes();
+
+ // create PGPKeyRing object based on downloaded armored key
+ PGPKeyRing downloadedKey = null;
+ BufferedInputStream bufferedInput =
+ new BufferedInputStream(new ByteArrayInputStream(downloadedKeyBytes));
+ if (bufferedInput.available() > 0) {
+ InputStream in = PGPUtil.getDecoderStream(bufferedInput);
+ PGPObjectFactory objectFactory = new PGPObjectFactory(in);
+
+ // get first object in block
+ Object obj;
+ if ((obj = objectFactory.nextObject()) != null) {
+ Log.d(Constants.TAG, "Found class: " + obj.getClass());
+
+ if (obj instanceof PGPKeyRing) {
+ downloadedKey = (PGPKeyRing) obj;
+ } else {
+ throw new PgpGeneralException("Object not recognized as PGPKeyRing!");
+ }
+ }
+ }
+
+ // save key bytes in entry object for doing the
+ // actual import afterwards
+ entry.setBytes(downloadedKey.getEncoded());
+ }
+
+ Intent importIntent = new Intent(this, KeychainIntentService.class);
+ importIntent.setAction(ACTION_IMPORT_KEYRING);
+ Bundle importData = new Bundle();
+ importData.putParcelableArrayList(IMPORT_KEY_LIST, entries);
+ importIntent.putExtra(EXTRA_DATA, importData);
+ importIntent.putExtra(EXTRA_MESSENGER, mMessenger);
+
+ // now import it with this service
+ onHandleIntent(importIntent);
+
+ // result is handled in ACTION_IMPORT_KEYRING
+ } catch (Exception e) {
+ sendErrorToHandler(e);
+ }
} else if (ACTION_DOWNLOAD_AND_IMPORT_KEYS.equals(action)) {
try {
ArrayList entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index 0fccd668f..650e51069 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -62,6 +62,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
+ "IMPORT_KEY_FROM_KEYSERVER";
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN = Constants.INTENT_PREFIX
+ "IMPORT_KEY_FROM_KEY_SERVER_AND_RETURN";
+ public static final String ACTION_IMPORT_KEY_FROM_KEYBASE = Constants.INTENT_PREFIX
+ + "IMPORT_KEY_FROM_KEYBASE";
// Actions for internal use only:
public static final String ACTION_IMPORT_KEY_FROM_FILE = Constants.INTENT_PREFIX
@@ -92,13 +94,15 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
ImportKeysFileFragment.class,
ImportKeysQrCodeFragment.class,
ImportKeysClipboardFragment.class,
- ImportKeysNFCFragment.class
+ ImportKeysNFCFragment.class,
+ ImportKeysKeybaseFragment.class
};
private static final int NAV_SERVER = 0;
private static final int NAV_FILE = 1;
private static final int NAV_QR_CODE = 2;
private static final int NAV_CLIPBOARD = 3;
private static final int NAV_NFC = 4;
+ private static final int NAV_KEYBASE = 5;
private int mCurrentNavPosition = -1;
@@ -236,6 +240,12 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
// NOTE: this only displays the appropriate fragment, no actions are taken
loadNavFragment(NAV_NFC, null);
+ // no immediate actions!
+ startListFragment(savedInstanceState, null, null, null);
+ } else if (ACTION_IMPORT_KEY_FROM_KEYBASE.equals(action)) {
+ // NOTE: this only displays the appropriate fragment, no actions are taken
+ loadNavFragment(NAV_KEYBASE, null);
+
// no immediate actions!
startListFragment(savedInstanceState, null, null, null);
} else {
@@ -340,8 +350,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
startListFragment(savedInstanceState, null, null, query);
}
- public void loadCallback(byte[] importData, Uri dataUri, String serverQuery, String keyServer) {
- mListFragment.loadNew(importData, dataUri, serverQuery, keyServer);
+ public void loadCallback(byte[] importData, Uri dataUri, String serverQuery, String keyServer, String keybaseQuery) {
+ mListFragment.loadNew(importData, dataUri, serverQuery, keyServer, keybaseQuery);
}
/**
@@ -449,6 +459,31 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
// start service with intent
startService(intent);
+ } else if (mListFragment.getKeybaseQuery() != null) {
+ // Send all information needed to service to query keys in other thread
+ Intent intent = new Intent(this, KeychainIntentService.class);
+
+ intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYBASE_KEYS);
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ // get selected key entries
+ ArrayList selectedEntries = mListFragment.getSelectedData();
+ data.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, selectedEntries);
+
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ // show progress dialog
+ saveHandler.showProgressDialog(this);
+
+ // start service with intent
+ startService(intent);
+
} else {
AppMsg.makeText(this, R.string.error_nothing_import, AppMsg.STYLE_ALERT).show();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
index 412fbddd8..f331358fa 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
@@ -71,7 +71,7 @@ public class ImportKeysClipboardFragment extends Fragment {
return;
}
}
- mImportActivity.loadCallback(sendText.getBytes(), null, null, null);
+ mImportActivity.loadCallback(sendText.getBytes(), null, null, null, null);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
index dc5333a8f..51f961aab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
@@ -85,7 +85,7 @@ public class ImportKeysFileFragment extends Fragment {
if (resultCode == Activity.RESULT_OK && data != null) {
// load data
- mImportActivity.loadCallback(null, data.getData(), null, null);
+ mImportActivity.loadCallback(null, data.getData(), null, null, null);
}
break;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
new file mode 100644
index 000000000..7ae57cec3
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
@@ -0,0 +1,108 @@
+package org.sufficientlysecure.keychain.ui;
+
+import android.content.Context;
+import android.support.v4.app.Fragment;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.beardedhen.androidbootstrap.BootstrapButton;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.util.Log;
+
+/**
+ * Import public keys from the Keybase.io directory. First cut: just raw search.
+ * TODO: make a pick list of the people you’re following on keybase
+ */
+public class ImportKeysKeybaseFragment extends Fragment {
+
+ private ImportKeysActivity mImportActivity;
+ private BootstrapButton mSearchButton;
+ private EditText mQueryEditText;
+
+ public static final String ARG_QUERY = "query";
+ public static final String ARG_DISABLE_QUERY_EDIT = "disable_query_edit";
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static ImportKeysKeybaseFragment newInstance() {
+ ImportKeysKeybaseFragment frag = new ImportKeysKeybaseFragment();
+
+ Bundle args = new Bundle();
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ /**
+ * Inflate the layout for this fragment
+ */
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.import_keys_keybase_fragment, container, false);
+
+ mQueryEditText = (EditText) view.findViewById(R.id.import_keybase_query);
+
+ mSearchButton = (BootstrapButton) view.findViewById(R.id.import_keybase_search);
+ mSearchButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String query = mQueryEditText.getText().toString();
+ search(query);
+
+ // close keyboard after pressing search
+ InputMethodManager imm =
+ (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(mQueryEditText.getWindowToken(), 0);
+ }
+ });
+
+ mQueryEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ String query = mQueryEditText.getText().toString();
+ search(query);
+
+ // Don't return true to let the keyboard close itself after pressing search
+ return false;
+ }
+ return false;
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mImportActivity = (ImportKeysActivity) getActivity();
+
+ // set displayed values
+ if (getArguments() != null) {
+ if (getArguments().containsKey(ARG_QUERY)) {
+ String query = getArguments().getString(ARG_QUERY);
+ mQueryEditText.setText(query, TextView.BufferType.EDITABLE);
+ }
+
+ if (getArguments().getBoolean(ARG_DISABLE_QUERY_EDIT, false)) {
+ mQueryEditText.setEnabled(false);
+ }
+ }
+ }
+
+ private void search(String query) {
+ mImportActivity.loadCallback(null, null, null, null, query);
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index 3a6c384e8..0580db080 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -34,6 +34,7 @@ import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListKeybaseLoader;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader;
import org.sufficientlysecure.keychain.util.InputData;
@@ -60,9 +61,11 @@ public class ImportKeysListFragment extends ListFragment implements
private Uri mDataUri;
private String mServerQuery;
private String mKeyServer;
+ private String mKeybaseQuery;
private static final int LOADER_ID_BYTES = 0;
private static final int LOADER_ID_SERVER_QUERY = 1;
+ private static final int LOADER_ID_KEYBASE = 2;
public byte[] getKeyBytes() {
return mKeyBytes;
@@ -76,6 +79,10 @@ public class ImportKeysListFragment extends ListFragment implements
return mServerQuery;
}
+ public String getKeybaseQuery() {
+ return mKeybaseQuery;
+ }
+
public String getKeyServer() {
return mKeyServer;
}
@@ -148,6 +155,16 @@ public class ImportKeysListFragment extends ListFragment implements
// give arguments to onCreateLoader()
getLoaderManager().initLoader(LOADER_ID_SERVER_QUERY, null, this);
}
+
+ if (mKeybaseQuery != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ // Prepare the loader. Either re-connect with an existing one,
+ // or start a new one.
+ // give arguments to onCreateLoader()
+ getLoaderManager().initLoader(LOADER_ID_KEYBASE, null, this);
+ }
}
@Override
@@ -157,16 +174,18 @@ public class ImportKeysListFragment extends ListFragment implements
// Select checkbox!
// Update underlying data and notify adapter of change. The adapter will
// update the view automatically.
+
ImportKeysListEntry entry = mAdapter.getItem(position);
entry.setSelected(!entry.isSelected());
mAdapter.notifyDataSetChanged();
}
- public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer) {
+ public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer, String keybaseQuery) {
mKeyBytes = keyBytes;
mDataUri = dataUri;
mServerQuery = serverQuery;
mKeyServer = keyServer;
+ mKeybaseQuery = keybaseQuery;
if (mKeyBytes != null || mDataUri != null) {
// Start out with a progress indicator.
@@ -181,11 +200,18 @@ public class ImportKeysListFragment extends ListFragment implements
getLoaderManager().restartLoader(LOADER_ID_SERVER_QUERY, null, this);
}
+
+ if (mKeybaseQuery != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ getLoaderManager().restartLoader(LOADER_ID_KEYBASE, null, this);
+ }
}
@Override
public Loader>>
- onCreateLoader(int id, Bundle args) {
+ onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_ID_BYTES: {
InputData inputData = getInputData(mKeyBytes, mDataUri);
@@ -194,6 +220,9 @@ public class ImportKeysListFragment extends ListFragment implements
case LOADER_ID_SERVER_QUERY: {
return new ImportKeysListServerLoader(getActivity(), mServerQuery, mKeyServer);
}
+ case LOADER_ID_KEYBASE: {
+ return new ImportKeysListKeybaseLoader(getActivity(), mKeybaseQuery);
+ }
default:
return null;
@@ -248,7 +277,7 @@ public class ImportKeysListFragment extends ListFragment implements
if (error == null) {
AppMsg.makeText(
getActivity(), getResources().getQuantityString(R.plurals.keys_found,
- mAdapter.getCount(), mAdapter.getCount()),
+ mAdapter.getCount(), mAdapter.getCount()),
AppMsg.STYLE_INFO
).show();
} else if (error instanceof KeyServer.InsufficientQuery) {
@@ -263,6 +292,19 @@ public class ImportKeysListFragment extends ListFragment implements
}
break;
+ case LOADER_ID_KEYBASE:
+
+ if (error == null) {
+ AppMsg.makeText(
+ getActivity(), getResources().getQuantityString(R.plurals.keys_found,
+ mAdapter.getCount(), mAdapter.getCount()),
+ AppMsg.STYLE_INFO
+ ).show();
+ } else if (error instanceof KeyServer.QueryException) {
+ AppMsg.makeText(getActivity(), R.string.error_keyserver_query,
+ AppMsg.STYLE_ALERT).show();
+ }
+
default:
break;
}
@@ -279,6 +321,10 @@ public class ImportKeysListFragment extends ListFragment implements
// Clear the data in the adapter.
mAdapter.clear();
break;
+ case LOADER_ID_KEYBASE:
+ // Clear the data in the adapter.
+ mAdapter.clear();
+ break;
default:
break;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
index 65d463456..22b56e1ab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
@@ -117,7 +117,7 @@ public class ImportKeysQrCodeFragment extends Fragment {
// is this a full key encoded as qr code?
if (scannedContent.startsWith("-----BEGIN PGP")) {
- mImportActivity.loadCallback(scannedContent.getBytes(), null, null, null);
+ mImportActivity.loadCallback(scannedContent.getBytes(), null, null, null, null);
return;
}
@@ -197,7 +197,7 @@ public class ImportKeysQrCodeFragment extends Fragment {
for (String in : mScannedContent) {
result += in;
}
- mImportActivity.loadCallback(result.getBytes(), null, null, null);
+ mImportActivity.loadCallback(result.getBytes(), null, null, null, null);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
index 82fe2fc4c..9e3d88ff5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
@@ -151,7 +151,7 @@ public class ImportKeysServerFragment extends Fragment {
}
private void search(String query, String keyServer) {
- mImportActivity.loadCallback(null, null, query, keyServer);
+ mImportActivity.loadCallback(null, null, query, keyServer, null);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java
index b06852af4..1610bfeab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java
@@ -203,7 +203,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
* Constructor for later querying from keyserver
*/
public ImportKeysListEntry() {
- // keys from keyserver are always public keys
+ // keys from keyserver are always public keys; from keybase too
secretKey = false;
// do not select by default
mSelected = false;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java
new file mode 100644
index 000000000..73ff9a8f8
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.sufficientlysecure.keychain.ui.adapter;
+
+import android.content.Context;
+import android.support.v4.content.AsyncTaskLoader;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.util.KeyServer;
+import org.sufficientlysecure.keychain.util.KeybaseKeyServer;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.ArrayList;
+
+public class ImportKeysListKeybaseLoader
+ extends AsyncTaskLoader>> {
+ Context mContext;
+
+ String mKeybaseQuery;
+
+ private ArrayList mEntryList = new ArrayList();
+ private AsyncTaskResultWrapper> mEntryListWrapper;
+
+ public ImportKeysListKeybaseLoader(Context context, String keybaseQuery) {
+ super(context);
+ mContext = context;
+ mKeybaseQuery = keybaseQuery;
+ }
+
+ @Override
+ public AsyncTaskResultWrapper> loadInBackground() {
+
+ mEntryListWrapper = new AsyncTaskResultWrapper>(mEntryList, null);
+
+ if (mKeybaseQuery == null) {
+ Log.e(Constants.TAG, "mKeybaseQery is null!");
+ return mEntryListWrapper;
+ }
+
+ queryServer(mKeybaseQuery);
+
+ return mEntryListWrapper;
+ }
+
+ @Override
+ protected void onReset() {
+ super.onReset();
+
+ // Ensure the loader is stopped
+ onStopLoading();
+ }
+
+ @Override
+ protected void onStartLoading() {
+ forceLoad();
+ }
+
+ @Override
+ protected void onStopLoading() {
+ cancelLoad();
+ }
+
+ @Override
+ public void deliverResult(AsyncTaskResultWrapper> data) {
+ super.deliverResult(data);
+ }
+
+ /**
+ * Query keybase
+ */
+ private void queryServer(String query) {
+
+ KeybaseKeyServer server = new KeybaseKeyServer();
+ try {
+ ArrayList searchResult = server.search(query);
+
+ mEntryList.clear();
+
+ mEntryList.addAll(searchResult);
+ mEntryListWrapper = new AsyncTaskResultWrapper>(mEntryList, null);
+ } catch (KeyServer.InsufficientQuery e) {
+ Log.e(Constants.TAG, "InsufficientQuery", e);
+ mEntryListWrapper = new AsyncTaskResultWrapper>(mEntryList, e);
+ } catch (KeyServer.QueryException e) {
+ Log.e(Constants.TAG, "QueryException", e);
+ mEntryListWrapper = new AsyncTaskResultWrapper>(mEntryList, e);
+ } catch (KeyServer.TooManyResponses e) {
+ Log.e(Constants.TAG, "TooManyResponses", e);
+ mEntryListWrapper = new AsyncTaskResultWrapper>(mEntryList, e);
+ }
+
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java
new file mode 100644
index 000000000..6f9c4cfa5
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java
@@ -0,0 +1,56 @@
+package org.sufficientlysecure.keychain.util;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Minimal hierarchy selector
+ */
+public class JWalk {
+
+ public static int getInt(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getInt(path[path.length - 1]);
+ }
+
+ public static long getLong(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getLong(path[path.length - 1]);
+ }
+
+ public static String getString(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getString(path[path.length - 1]);
+ }
+
+ public static JSONArray getArray(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getJSONArray(path[path.length - 1]);
+ }
+
+ public static JSONObject optObject(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.optJSONObject(path[path.length - 1]);
+ }
+
+ private static JSONObject walk(JSONObject json, String... path) throws JSONException {
+ int len = path.length - 1;
+ int pathIndex = 0;
+ try {
+ while (pathIndex < len) {
+ json = json.getJSONObject(path[pathIndex]);
+ pathIndex++;
+ }
+ } catch (JSONException e) {
+ // try to give ’em a nice-looking error
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < len; i++) {
+ sb.append(path[i]).append('.');
+ }
+ sb.append(path[len]);
+ throw new JSONException("JWalk error at step " + pathIndex + " of " + sb);
+ }
+ return json;
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
new file mode 100644
index 000000000..4b802c0e1
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2012-2014 Dominik Schürmann
+ * Copyright (C) 2011-2014 Thialfihar
+ * Copyright (C) 2011 Senecaso
+ *
+ * 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.util;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.util.WeakHashMap;
+
+public class KeybaseKeyServer extends KeyServer {
+
+ private WeakHashMap mKeyCache = new WeakHashMap();
+
+ private static String readAll(InputStream in, String encoding) throws IOException {
+ ByteArrayOutputStream raw = new ByteArrayOutputStream();
+
+ byte buffer[] = new byte[1 << 16];
+ int n = 0;
+ while ((n = in.read(buffer)) != -1) {
+ raw.write(buffer, 0, n);
+ }
+
+ if (encoding == null) {
+ encoding = "utf8";
+ }
+ return raw.toString(encoding);
+ }
+
+ @Override
+ public ArrayList search(String query) throws QueryException, TooManyResponses,
+ InsufficientQuery {
+ ArrayList results = new ArrayList();
+
+ JSONObject fromQuery = getFromKeybase("_/api/1.0/user/autocomplete.json?q=", query);
+ try {
+
+ JSONArray matches = JWalk.getArray(fromQuery, "completions");
+ for (int i = 0; i < matches.length(); i++) {
+ JSONObject match = matches.getJSONObject(i);
+
+ // only list them if they have a key
+ if (JWalk.optObject(match, "components", "key_fingerprint") != null) {
+ results.add(makeEntry(match));
+ }
+ }
+ } catch (Exception e) {
+ throw new QueryException("Unexpected structure in keybase search result: " + e.getMessage());
+ }
+
+ return results;
+ }
+
+ private JSONObject getUser(String keybaseID) throws QueryException {
+ try {
+ return getFromKeybase("_/api/1.0/user/lookup.json?username=", keybaseID);
+ } catch (Exception e) {
+ String detail = "";
+ if (keybaseID != null) {
+ detail = ". Query was for user '" + keybaseID + "'";
+ }
+ throw new QueryException(e.getMessage() + detail);
+ }
+ }
+
+ private ImportKeysListEntry makeEntry(JSONObject match) throws QueryException, JSONException {
+
+ String keybaseID = JWalk.getString(match, "components", "username", "val");
+ String key_fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val");
+ key_fingerprint = key_fingerprint.replace(" ", "").toUpperCase();
+ match = getUser(keybaseID);
+
+ final ImportKeysListEntry entry = new ImportKeysListEntry();
+
+ entry.setBitStrength(4096);
+ entry.setAlgorithm("RSA");
+ entry.setKeyIdHex("0x" + key_fingerprint);
+
+ final long creationDate = JWalk.getLong(match, "them", "public_keys", "primary", "ctime");
+ final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+ tmpGreg.setTimeInMillis(creationDate * 1000);
+ entry.setDate(tmpGreg.getTime());
+ entry.setRevoked(false);
+ mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle"));
+ String name = JWalk.getString(match, "them", "profile", "full_name");
+ ArrayList userIds = new ArrayList();
+ userIds.add(name);
+ userIds.add("keybase.io/" + keybaseID); // TODO: Maybe should be keybaseID@keybase.io ?
+ entry.setUserIds(userIds);
+ entry.setPrimaryUserId(name);
+ return entry;
+ }
+
+ private JSONObject getFromKeybase(String path, String query) throws QueryException {
+ try {
+ String url = "https://keybase.io/" + path + URLEncoder.encode(query, "utf8");
+ Log.d(Constants.TAG, "keybase query: " + url);
+
+ URL realUrl = new URL(url);
+ HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
+ conn.setConnectTimeout(5000); // TODO: Reasonable values for keybase
+ conn.setReadTimeout(25000);
+ conn.connect();
+ int response = conn.getResponseCode();
+ if (response >= 200 && response < 300) {
+ String text = readAll(conn.getInputStream(), conn.getContentEncoding());
+ try {
+ JSONObject json = new JSONObject(text);
+ if (JWalk.getInt(json, "status", "code") != 0) {
+ throw new QueryException("Keybase autocomplete search failed");
+ }
+ return json;
+ } catch (JSONException e) {
+ throw new QueryException("Keybase.io query returned broken JSON");
+ }
+ } else {
+ String message = readAll(conn.getErrorStream(), conn.getContentEncoding());
+ throw new QueryException("Keybase.io query error (status=" + response +
+ "): " + message);
+ }
+ } catch (Exception e) {
+ throw new QueryException("Keybase.io query error");
+ }
+ }
+
+ @Override
+ public String get(String id) throws QueryException {
+ // id is like "keybase/username"
+ String keybaseID = id.substring(id.indexOf('/') + 1);
+ String key = mKeyCache.get(keybaseID);
+ if (key == null) {
+ try {
+ JSONObject user = getUser(keybaseID);
+ key = JWalk.getString(user, "them", "public_keys", "primary", "bundle");
+ } catch (Exception e) {
+ throw new QueryException(e.getMessage());
+ }
+ }
+ return key;
+ }
+
+ @Override
+ public void add(String armoredKey) throws AddKeyException {
+ throw new AddKeyException();
+ }
+}
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
new file mode 100644
index 000000000..248581342
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/arrays.xml b/OpenKeychain/src/main/res/values/arrays.xml
index 4173d49e4..699c02aff 100644
--- a/OpenKeychain/src/main/res/values/arrays.xml
+++ b/OpenKeychain/src/main/res/values/arrays.xml
@@ -54,6 +54,7 @@
@string/menu_import_from_qr_code@string/import_from_clipboard@string/menu_import_from_nfc
+ @string/menu_import_from_keybase
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 330bc349d..21d008bb9 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -75,6 +75,7 @@
Create key (expert)SearchKeyserver
+ Import from Keybase.ioKeyserver…Update from keyserverUpload to key server
@@ -348,6 +349,7 @@
Search Public KeysSearch Secret KeysShare Key with…
+ Search Keybase.io512
@@ -393,6 +395,7 @@
To receive keys via NFC, the device needs to be unlocked.HelpGet key from clipboard
+ Get key from Keybase.ioDecrypt File with OpenKeychain
--
cgit v1.2.3
From ea1032dbfdbb42f39ef37af510e38b64f9854d5a Mon Sep 17 00:00:00 2001
From: Tim Bray
Date: Mon, 28 Apr 2014 10:47:39 -0700
Subject: Clean up debug crud
---
.../org/sufficientlysecure/keychain/service/KeychainIntentService.java | 3 ---
.../java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java | 2 +-
2 files changed, 1 insertion(+), 4 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index fcd31b2fe..e085b5b72 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -56,7 +56,6 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
import org.sufficientlysecure.keychain.util.HkpKeyServer;
import org.sufficientlysecure.keychain.util.InputData;
-import org.sufficientlysecure.keychain.util.KeyServer;
import org.sufficientlysecure.keychain.util.KeybaseKeyServer;
import org.sufficientlysecure.keychain.util.KeychainServiceListener;
import org.sufficientlysecure.keychain.util.Log;
@@ -763,7 +762,6 @@ public class KeychainIntentService extends IntentService
// get first object in block
Object obj;
if ((obj = objectFactory.nextObject()) != null) {
- Log.d(Constants.TAG, "Found class: " + obj.getClass());
if (obj instanceof PGPKeyRing) {
downloadedKey = (PGPKeyRing) obj;
@@ -820,7 +818,6 @@ public class KeychainIntentService extends IntentService
// get first object in block
Object obj;
if ((obj = objectFactory.nextObject()) != null) {
- Log.d(Constants.TAG, "Found class: " + obj.getClass());
if (obj instanceof PGPKeyRing) {
downloadedKey = (PGPKeyRing) obj;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
index 4b802c0e1..c5f97f0dd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
@@ -111,8 +111,8 @@ public class KeybaseKeyServer extends KeyServer {
mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle"));
String name = JWalk.getString(match, "them", "profile", "full_name");
ArrayList userIds = new ArrayList();
+ name = "keybase.io/" + keybaseID + " " + name;
userIds.add(name);
- userIds.add("keybase.io/" + keybaseID); // TODO: Maybe should be keybaseID@keybase.io ?
entry.setUserIds(userIds);
entry.setPrimaryUserId(name);
return entry;
--
cgit v1.2.3
From b5fb311c6152af36254a803aabe726ed8b03a447 Mon Sep 17 00:00:00 2001
From: Tim Bray
Date: Tue, 29 Apr 2014 15:03:37 -0700
Subject: keybase ID stuff
---
.../sufficientlysecure/keychain/util/KeybaseKeyServer.java | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
index c5f97f0dd..ae4c44e09 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
@@ -99,19 +99,24 @@ public class KeybaseKeyServer extends KeyServer {
final ImportKeysListEntry entry = new ImportKeysListEntry();
+ // TODO: Fix; have suggested keybase provide this value to avoid search-time crypto calls
entry.setBitStrength(4096);
entry.setAlgorithm("RSA");
entry.setKeyIdHex("0x" + key_fingerprint);
+ entry.setRevoked(false);
+ // ctime
final long creationDate = JWalk.getLong(match, "them", "public_keys", "primary", "ctime");
final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
tmpGreg.setTimeInMillis(creationDate * 1000);
entry.setDate(tmpGreg.getTime());
- entry.setRevoked(false);
+
+ // key bits
mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle"));
- String name = JWalk.getString(match, "them", "profile", "full_name");
+
+ // String displayName = JWalk.getString(match, "them", "profile", "full_name");
ArrayList userIds = new ArrayList();
- name = "keybase.io/" + keybaseID + " " + name;
+ String name = "keybase.io/" + keybaseID + " <" + keybaseID + "@keybase.io>";
userIds.add(name);
entry.setUserIds(userIds);
entry.setPrimaryUserId(name);
--
cgit v1.2.3
From 4c693b45097d08d0c4285dccd5d1679a2e4551d6 Mon Sep 17 00:00:00 2001
From: Tim Bray
Date: Wed, 30 Apr 2014 13:46:35 -0700
Subject: Changes should now be in sync with dominik
---
.../org/sufficientlysecure/keychain/util/KeybaseKeyServer.java | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
index ae4c44e09..dee3899a8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeybaseKeyServer.java
@@ -112,12 +112,15 @@ public class KeybaseKeyServer extends KeyServer {
entry.setDate(tmpGreg.getTime());
// key bits
+ // we have to fetch the user object to construct the search-result list, so we might as
+ // well (weakly) remember the key, in case they try to import it
mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle"));
// String displayName = JWalk.getString(match, "them", "profile", "full_name");
ArrayList userIds = new ArrayList();
String name = "keybase.io/" + keybaseID + " <" + keybaseID + "@keybase.io>";
userIds.add(name);
+ userIds.add(keybaseID);
entry.setUserIds(userIds);
entry.setPrimaryUserId(name);
return entry;
@@ -157,12 +160,10 @@ public class KeybaseKeyServer extends KeyServer {
@Override
public String get(String id) throws QueryException {
- // id is like "keybase/username"
- String keybaseID = id.substring(id.indexOf('/') + 1);
- String key = mKeyCache.get(keybaseID);
+ String key = mKeyCache.get(id);
if (key == null) {
try {
- JSONObject user = getUser(keybaseID);
+ JSONObject user = getUser(id);
key = JWalk.getString(user, "them", "public_keys", "primary", "bundle");
} catch (Exception e) {
throw new QueryException(e.getMessage());
--
cgit v1.2.3
From 18ed8286080c70daabfedcd258bfa20c1099c268 Mon Sep 17 00:00:00 2001
From: Tim Bray
Date: Wed, 30 Apr 2014 13:49:48 -0700
Subject: tidy up IntentService
---
.../sufficientlysecure/keychain/service/KeychainIntentService.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index e085b5b72..eabcfadee 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -748,8 +748,8 @@ public class KeychainIntentService extends IntentService
KeybaseKeyServer server = new KeybaseKeyServer();
for (ImportKeysListEntry entry : entries) {
// the keybase handle is in userId(1)
- String username = entry.getUserIds().get(1);
- byte[] downloadedKeyBytes = server.get(username).getBytes();
+ String keybaseID = entry.getUserIds().get(1);
+ byte[] downloadedKeyBytes = server.get(keybaseID).getBytes();
// create PGPKeyRing object based on downloaded armored key
PGPKeyRing downloadedKey = null;
--
cgit v1.2.3
From 5b0f19fcebd586235be7c895769ccb111c97e78e Mon Sep 17 00:00:00 2001
From: Tim Bray
Date: Wed, 30 Apr 2014 13:56:56 -0700
Subject: stupid identation stuff
---
.../java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index 0580db080..c1aa8a1f2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -211,7 +211,7 @@ public class ImportKeysListFragment extends ListFragment implements
@Override
public Loader>>
- onCreateLoader(int id, Bundle args) {
+ onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_ID_BYTES: {
InputData inputData = getInputData(mKeyBytes, mDataUri);
--
cgit v1.2.3
From 9726ac7a964dacc593cdb94a494182f61fd59c5b Mon Sep 17 00:00:00 2001
From: Vadim Lebedev
Date: Fri, 2 May 2014 19:05:43 +0200
Subject: Avoid displaying double 0x before keyid in ViewCertActivity
---
.../java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
index f740cfc22..645766287 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
@@ -124,7 +124,7 @@ public class ViewCertActivity extends ActionBarActivity
@Override
public void onLoadFinished(Loader loader, Cursor data) {
if (data.moveToFirst()) {
- String signeeKey = "0x" + PgpKeyHelper.convertKeyIdToHex(data.getLong(INDEX_MASTER_KEY_ID));
+ String signeeKey = PgpKeyHelper.convertKeyIdToHex(data.getLong(INDEX_MASTER_KEY_ID));
mSigneeKey.setText(signeeKey);
String signeeUid = data.getString(INDEX_USER_ID);
@@ -134,7 +134,7 @@ public class ViewCertActivity extends ActionBarActivity
mCreation.setText(DateFormat.getDateFormat(getApplicationContext()).format(creationDate));
mSignerKeyId = data.getLong(INDEX_KEY_ID_CERTIFIER);
- String signerKey = "0x" + PgpKeyHelper.convertKeyIdToHex(mSignerKeyId);
+ String signerKey = PgpKeyHelper.convertKeyIdToHex(mSignerKeyId);
mSignerKey.setText(signerKey);
String signerUid = data.getString(INDEX_SIGNER_UID);
--
cgit v1.2.3
From 6055b0b0da6ca3f6fdae3b7b1602a38d3a05bb3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 5 May 2014 00:58:22 +0200
Subject: New key view design, using Android flat buttons and Android icons
---
.../keychain/ui/CertifyKeyActivity.java | 4 +-
.../keychain/ui/ViewKeyActivity.java | 241 ++++++++--------
.../keychain/ui/ViewKeyCertsFragment.java | 18 +-
.../keychain/ui/ViewKeyKeysFragment.java | 238 +++++++++++++++
.../keychain/ui/ViewKeyMainFragment.java | 179 ++++--------
.../keychain/ui/ViewKeyShareFragment.java | 313 ++++++++++++++++++++
.../keychain/ui/adapter/ImportKeysAdapter.java | 3 +-
.../keychain/ui/adapter/PagerTabStripAdapter.java | 10 +-
.../keychain/ui/adapter/ViewKeyUserIdsAdapter.java | 46 ++-
.../keychain/util/SlidingTabLayout.java | 318 +++++++++++++++++++++
.../keychain/util/SlidingTabStrip.java | 211 ++++++++++++++
.../src/main/res/drawable-hdpi/ic_action_copy.png | Bin 0 -> 381 bytes
.../src/main/res/drawable-hdpi/ic_action_edit.png | Bin 0 -> 884 bytes
.../src/main/res/drawable-hdpi/ic_action_good.png | Bin 0 -> 485 bytes
.../src/main/res/drawable-hdpi/ic_action_help.png | Bin 0 -> 497 bytes
.../drawable-hdpi/ic_action_important_small.png | Bin 0 -> 473 bytes
.../main/res/drawable-hdpi/ic_action_settings.png | Bin 0 -> 953 bytes
.../src/main/res/drawable-mdpi/ic_action_copy.png | Bin 0 -> 288 bytes
.../src/main/res/drawable-mdpi/ic_action_edit.png | Bin 0 -> 587 bytes
.../src/main/res/drawable-mdpi/ic_action_good.png | Bin 0 -> 343 bytes
.../src/main/res/drawable-mdpi/ic_action_help.png | Bin 0 -> 404 bytes
.../drawable-mdpi/ic_action_important_small.png | Bin 0 -> 361 bytes
.../main/res/drawable-mdpi/ic_action_settings.png | Bin 0 -> 594 bytes
.../src/main/res/drawable-xhdpi/ic_action_copy.png | Bin 0 -> 353 bytes
.../src/main/res/drawable-xhdpi/ic_action_edit.png | Bin 0 -> 1179 bytes
.../src/main/res/drawable-xhdpi/ic_action_good.png | Bin 0 -> 566 bytes
.../src/main/res/drawable-xhdpi/ic_action_help.png | Bin 0 -> 648 bytes
.../drawable-xhdpi/ic_action_important_small.png | Bin 0 -> 623 bytes
.../main/res/drawable-xhdpi/ic_action_settings.png | Bin 0 -> 1231 bytes
.../main/res/drawable-xxhdpi/ic_action_copy.png | Bin 0 -> 470 bytes
.../main/res/drawable-xxhdpi/ic_action_edit.png | Bin 0 -> 1670 bytes
.../main/res/drawable-xxhdpi/ic_action_good.png | Bin 0 -> 823 bytes
.../main/res/drawable-xxhdpi/ic_action_help.png | Bin 0 -> 925 bytes
.../drawable-xxhdpi/ic_action_important_small.png | Bin 0 -> 890 bytes
.../res/drawable-xxhdpi/ic_action_settings.png | Bin 0 -> 1863 bytes
.../res/drawable/selector_transparent_button.xml | 4 +-
.../src/main/res/layout/certify_key_activity.xml | 4 +-
.../src/main/res/layout/import_keys_list_entry.xml | 2 +-
OpenKeychain/src/main/res/layout/key_list_item.xml | 2 +-
.../src/main/res/layout/view_key_activity.xml | 13 +-
.../src/main/res/layout/view_key_certs_item.xml | 10 +-
.../src/main/res/layout/view_key_keys_fragment.xml | 149 ++++++++++
.../src/main/res/layout/view_key_main_fragment.xml | 284 +++++-------------
.../main/res/layout/view_key_share_fragment.xml | 179 ++++++++++++
.../src/main/res/layout/view_key_userids_item.xml | 47 +--
OpenKeychain/src/main/res/menu/key_view.xml | 51 +---
OpenKeychain/src/main/res/values-v14/styles.xml | 4 +
OpenKeychain/src/main/res/values/colors.xml | 12 +-
OpenKeychain/src/main/res/values/strings.xml | 36 ++-
OpenKeychain/src/main/res/values/styles.xml | 4 +-
50 files changed, 1788 insertions(+), 594 deletions(-)
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png
create mode 100644 OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml
create mode 100644 OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
index fbcbbb0c3..2d31e0de8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
@@ -147,7 +147,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
}
Log.e(Constants.TAG, "uri: " + mDataUri);
- mUserIds = (ListView) findViewById(R.id.user_ids);
+ mUserIds = (ListView) findViewById(R.id.view_key_user_ids);
mUserIdsAdapter = new ViewKeyUserIdsAdapter(this, null, 0, true);
mUserIds.setAdapter(mUserIdsAdapter);
@@ -203,7 +203,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
byte[] fingerprintBlob = data.getBlob(INDEX_FINGERPRINT);
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
- ((TextView) findViewById(R.id.fingerprint))
+ ((TextView) findViewById(R.id.view_key_fingerprint))
.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
}
break;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index e595c1889..56aaba57b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.ui;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
+import android.database.Cursor;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
@@ -31,6 +32,9 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
@@ -42,20 +46,19 @@ import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter;
-import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment;
+import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.SlidingTabLayout;
import java.io.IOException;
import java.util.HashMap;
-public class ViewKeyActivity extends ActionBarActivity {
+public class ViewKeyActivity extends ActionBarActivity implements
+ LoaderManager.LoaderCallbacks {
ExportHelper mExportHelper;
ProviderHelper mProviderHelper;
@@ -63,9 +66,15 @@ public class ViewKeyActivity extends ActionBarActivity {
protected Uri mDataUri;
public static final String EXTRA_SELECTED_TAB = "selectedTab";
+ public static final int TAB_MAIN = 0;
+ public static final int TAB_SHARE = 1;
+ public static final int TAB_KEYS = 2;
+ public static final int TAB_CERTS = 3;
- ViewPager mViewPager;
- TabsAdapter mTabsAdapter;
+ // view
+ private ViewPager mViewPager;
+ private SlidingTabLayout mSlidingTabLayout;
+ private PagerTabStripAdapter mTabsAdapter;
public static final int REQUEST_CODE_LOOKUP_KEY = 0x00007006;
@@ -76,6 +85,9 @@ public class ViewKeyActivity extends ActionBarActivity {
private byte[] mNfcKeyringBytes;
private static final int NFC_SENT = 1;
+ private static final int LOADER_ID_UNIFIED = 0;
+
+
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
@@ -89,33 +101,67 @@ public class ViewKeyActivity extends ActionBarActivity {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setIcon(android.R.color.transparent);
actionBar.setHomeButtonEnabled(true);
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
setContentView(R.layout.view_key_activity);
- mViewPager = (ViewPager) findViewById(R.id.pager);
+ mViewPager = (ViewPager) findViewById(R.id.view_key_pager);
+ mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.view_key_sliding_tab_layout);
- mTabsAdapter = new TabsAdapter(this, mViewPager);
+ mTabsAdapter = new PagerTabStripAdapter(this);
+ mViewPager.setAdapter(mTabsAdapter);
- int selectedTab = 0;
+ int switchToTab = TAB_MAIN;
Intent intent = getIntent();
if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) {
- selectedTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
+ switchToTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
+ }
+
+ Uri dataUri = getIntent().getData();
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ finish();
+ return;
}
- mDataUri = getIntent().getData();
+ loadData(dataUri);
- initNfc(mDataUri);
+ initNfc(dataUri);
Bundle mainBundle = new Bundle();
- mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, mDataUri);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.key_view_tab_main)),
- ViewKeyMainFragment.class, mainBundle, (selectedTab == 0));
+ mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyMainFragment.class,
+ mainBundle, getString(R.string.key_view_tab_main));
+
+ Bundle shareBundle = new Bundle();
+ shareBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyShareFragment.class,
+ mainBundle, getString(R.string.key_view_tab_share));
+
+ Bundle keyDetailsBundle = new Bundle();
+ keyDetailsBundle.putParcelable(ViewKeyKeysFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyKeysFragment.class,
+ keyDetailsBundle, getString(R.string.key_view_tab_keys_details));
Bundle certBundle = new Bundle();
- certBundle.putParcelable(ViewKeyCertsFragment.ARG_DATA_URI, mDataUri);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.key_view_tab_certs)),
- ViewKeyCertsFragment.class, certBundle, (selectedTab == 1));
+ certBundle.putParcelable(ViewKeyCertsFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyCertsFragment.class,
+ certBundle, getString(R.string.key_view_tab_certs));
+
+ // NOTE: must be after adding the tabs!
+ mSlidingTabLayout.setViewPager(mViewPager);
+
+ // switch to tab selected by extra
+ mViewPager.setCurrentItem(switchToTab);
+ }
+
+ private void loadData(Uri dataUri) {
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
}
@Override
@@ -143,24 +189,6 @@ public class ViewKeyActivity extends ActionBarActivity {
case R.id.menu_key_view_export_file:
exportToFile(mDataUri, mExportHelper, mProviderHelper);
return true;
- case R.id.menu_key_view_share_default_fingerprint:
- shareKey(mDataUri, true, mProviderHelper);
- return true;
- case R.id.menu_key_view_share_default:
- shareKey(mDataUri, false, mProviderHelper);
- return true;
- case R.id.menu_key_view_share_qr_code_fingerprint:
- shareKeyQrCode(mDataUri, true);
- return true;
- case R.id.menu_key_view_share_qr_code:
- shareKeyQrCode(mDataUri, false);
- return true;
- case R.id.menu_key_view_share_nfc:
- shareNfc();
- return true;
- case R.id.menu_key_view_share_clipboard:
- copyToClipboard(mDataUri, mProviderHelper);
- return true;
case R.id.menu_key_view_delete: {
deleteKey(mDataUri, mExportHelper);
return true;
@@ -209,84 +237,6 @@ public class ViewKeyActivity extends ActionBarActivity {
startActivityForResult(queryIntent, REQUEST_CODE_LOOKUP_KEY);
}
- private void shareKey(Uri dataUri, boolean fingerprintOnly, ProviderHelper providerHelper)
- throws ProviderHelper.NotFoundException {
- String content = null;
- if (fingerprintOnly) {
- byte[] data = (byte[]) providerHelper.getGenericData(
- KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
- KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
- if (data != null) {
- String fingerprint = PgpKeyHelper.convertFingerprintToHex(data);
- content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
- } else {
- AppMsg.makeText(this, "Bad key selected!",
- AppMsg.STYLE_ALERT).show();
- return;
- }
- } else {
- // get public keyring as ascii armored string
- try {
- Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
- content = providerHelper.getKeyRingAsArmoredString(uri);
-
- // Android will fail with android.os.TransactionTooLargeException if key is too big
- // see http://www.lonestarprod.com/?p=34
- if (content.length() >= 86389) {
- AppMsg.makeText(this, R.string.key_too_big_for_sharing,
- AppMsg.STYLE_ALERT).show();
- return;
- }
- } catch (IOException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- AppMsg.makeText(this, R.string.error_invalid_data, AppMsg.STYLE_ALERT).show();
- } catch (ProviderHelper.NotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
- }
- }
-
- if (content != null) {
- // let user choose application
- Intent sendIntent = new Intent(Intent.ACTION_SEND);
- sendIntent.putExtra(Intent.EXTRA_TEXT, content);
- sendIntent.setType("text/plain");
- startActivity(Intent.createChooser(sendIntent,
- getResources().getText(R.string.action_share_key_with)));
- } else {
- Log.e(Constants.TAG, "content is null!");
- }
- }
-
- private void shareKeyQrCode(Uri dataUri, boolean fingerprintOnly) {
- ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(dataUri,
- fingerprintOnly);
- dialog.show(getSupportFragmentManager(), "shareQrCodeDialog");
- }
-
- private void copyToClipboard(Uri dataUri, ProviderHelper providerHelper) {
- // get public keyring as ascii armored string
- try {
- Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
- String keyringArmored = providerHelper.getKeyRingAsArmoredString(uri);
-
- ClipboardReflection.copyToClipboard(this, keyringArmored);
- AppMsg.makeText(this, R.string.key_copied_to_clipboard, AppMsg.STYLE_INFO)
- .show();
- } catch (IOException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- AppMsg.makeText(this, R.string.error_key_processing, AppMsg.STYLE_ALERT).show();
- } catch (ProviderHelper.NotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
- }
- }
-
- private void shareNfc() {
- ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance();
- dialog.show(getSupportFragmentManager(), "shareNfcDialog");
- }
-
private void deleteKey(Uri dataUri, ExportHelper exportHelper) {
// Message is received after key is deleted
Handler returnHandler = new Handler() {
@@ -409,4 +359,63 @@ public class ViewKeyActivity extends ActionBarActivity {
}
};
+ static final String[] UNIFIED_PROJECTION = new String[]{
+ KeychainContract.KeyRings._ID,
+ KeychainContract.KeyRings.MASTER_KEY_ID,
+ KeychainContract.KeyRings.USER_ID,
+
+ };
+ static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
+ static final int INDEX_UNIFIED_USER_ID = 2;
+
+ @Override
+ public Loader onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(this, baseUri, UNIFIED_PROJECTION, null, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void onLoadFinished(Loader loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+ // get name, email, and comment from USER_ID
+ String[] mainUserId = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_USER_ID));
+ if (mainUserId[0] != null) {
+ setTitle(mainUserId[0]);
+ } else {
+ setTitle(R.string.user_id_no_name);
+ }
+
+ // get key id from MASTER_KEY_ID
+ long masterKeyId = data.getLong(INDEX_UNIFIED_MASTER_KEY_ID);
+ String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId);
+ getSupportActionBar().setSubtitle(keyIdStr);
+
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader loader) {
+
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
index 3c4135715..e1c2013ea 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
@@ -75,6 +75,9 @@ public class ViewKeyCertsFragment extends Fragment
private Uri mDataUri;
+ // starting with 4 for this fragment
+ private static final int LOADER_ID = 4;
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.view_key_certs_fragment, container, false);
@@ -112,7 +115,7 @@ public class ViewKeyCertsFragment extends Fragment
mAdapter = new CertListAdapter(getActivity(), null);
mStickyList.setAdapter(mAdapter);
- getLoaderManager().initLoader(0, null, this);
+ getLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
@@ -208,11 +211,18 @@ public class ViewKeyCertsFragment extends Fragment
// set name and stuff, common to both key types
TextView wSignerKeyId = (TextView) view.findViewById(R.id.signerKeyId);
- TextView wSignerUserId = (TextView) view.findViewById(R.id.signerUserId);
+ TextView wSignerName = (TextView) view.findViewById(R.id.signerName);
TextView wSignStatus = (TextView) view.findViewById(R.id.signStatus);
String signerKeyId = PgpKeyHelper.convertKeyIdToHex(cursor.getLong(mIndexSignerKeyId));
- String signerUserId = cursor.getString(mIndexSignerUserId);
+ String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexSignerUserId));
+ if (userId[0] != null) {
+ wSignerName.setText(userId[0]);
+ } else {
+ wSignerName.setText(R.string.user_id_no_name);
+ }
+ wSignerKeyId.setText(signerKeyId);
+
switch (cursor.getInt(mIndexType)) {
case PGPSignature.DEFAULT_CERTIFICATION: // 0x10
wSignStatus.setText(R.string.cert_default);
@@ -231,8 +241,6 @@ public class ViewKeyCertsFragment extends Fragment
break;
}
- wSignerUserId.setText(signerUserId);
- wSignerKeyId.setText(signerKeyId);
view.setTag(R.id.tag_mki, cursor.getLong(mIndexMasterKeyId));
view.setTag(R.id.tag_rank, cursor.getLong(mIndexRank));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
new file mode 100644
index 000000000..bb0e4b23a
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.database.Cursor;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.text.format.DateFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
+import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.Date;
+
+
+public class ViewKeyKeysFragment extends Fragment implements
+ LoaderManager.LoaderCallbacks {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private LinearLayout mContainer;
+ private TextView mAlgorithm;
+ private TextView mKeyId;
+ private TextView mExpiry;
+ private TextView mCreation;
+ private TextView mFingerprint;
+ private TextView mSecretKey;
+
+ private ListView mKeys;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+ private static final int LOADER_ID_KEYS = 1;
+
+ private ViewKeyKeysAdapter mKeysAdapter;
+
+ private Uri mDataUri;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.view_key_keys_fragment, container, false);
+
+ mContainer = (LinearLayout) view.findViewById(R.id.container);
+ mKeyId = (TextView) view.findViewById(R.id.key_id);
+ mAlgorithm = (TextView) view.findViewById(R.id.algorithm);
+ mCreation = (TextView) view.findViewById(R.id.creation);
+ mExpiry = (TextView) view.findViewById(R.id.expiry);
+ mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint);
+ mSecretKey = (TextView) view.findViewById(R.id.secret_key);
+ mKeys = (ListView) view.findViewById(R.id.keys);
+
+ return view;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+
+ loadData(dataUri);
+ }
+
+ private void loadData(Uri dataUri) {
+ getActivity().setProgressBarIndeterminateVisibility(true);
+ mContainer.setVisibility(View.GONE);
+
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ mKeysAdapter = new ViewKeyKeysAdapter(getActivity(), null, 0);
+ mKeys.setAdapter(mKeysAdapter);
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+ getLoaderManager().initLoader(LOADER_ID_KEYS, null, this);
+ }
+
+ static final String[] UNIFIED_PROJECTION = new String[] {
+ KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET,
+ KeyRings.USER_ID, KeyRings.FINGERPRINT,
+ KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY,
+
+ };
+ static final int INDEX_UNIFIED_MKI = 1;
+ static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
+ static final int INDEX_UNIFIED_UID = 3;
+ static final int INDEX_UNIFIED_FINGERPRINT = 4;
+ static final int INDEX_UNIFIED_ALGORITHM = 5;
+ static final int INDEX_UNIFIED_KEY_SIZE = 6;
+ static final int INDEX_UNIFIED_CREATION = 7;
+ static final int INDEX_UNIFIED_EXPIRY = 8;
+
+ static final String[] KEYS_PROJECTION = new String[] {
+ Keys._ID,
+ Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET,
+ Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED,
+ Keys.CREATION, Keys.EXPIRY, Keys.FINGERPRINT
+ };
+ static final int KEYS_INDEX_CAN_ENCRYPT = 7;
+
+ public Loader onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
+ }
+ case LOADER_ID_KEYS: {
+ Uri baseUri = Keys.buildKeysUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, KEYS_PROJECTION, null, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ public void onLoadFinished(Loader loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if(data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+ if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
+ mSecretKey.setTextColor(getResources().getColor(R.color.emphasis));
+ mSecretKey.setText(R.string.secret_key_yes);
+ } else {
+ mSecretKey.setTextColor(Color.BLACK);
+ mSecretKey.setText(getResources().getString(R.string.secret_key_no));
+ }
+
+ // get key id from MASTER_KEY_ID
+ long masterKeyId = data.getLong(INDEX_UNIFIED_MKI);
+ String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId);
+ mKeyId.setText(keyIdStr);
+
+ // get creation date from CREATION
+ if (data.isNull(INDEX_UNIFIED_CREATION)) {
+ mCreation.setText(R.string.none);
+ } else {
+ Date creationDate = new Date(data.getLong(INDEX_UNIFIED_CREATION) * 1000);
+
+ mCreation.setText(
+ DateFormat.getDateFormat(getActivity().getApplicationContext()).format(
+ creationDate));
+ }
+
+ // get expiry date from EXPIRY
+ if (data.isNull(INDEX_UNIFIED_EXPIRY)) {
+ mExpiry.setText(R.string.none);
+ } else {
+ Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000);
+
+ mExpiry.setText(
+ DateFormat.getDateFormat(getActivity().getApplicationContext()).format(
+ expiryDate));
+ }
+
+ String algorithmStr = PgpKeyHelper.getAlgorithmInfo(
+ getActivity(),
+ data.getInt(INDEX_UNIFIED_ALGORITHM),
+ data.getInt(INDEX_UNIFIED_KEY_SIZE)
+ );
+ mAlgorithm.setText(algorithmStr);
+
+ byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT);
+ String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
+ mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
+
+ break;
+ }
+ }
+
+ case LOADER_ID_KEYS:
+ mKeysAdapter.swapCursor(data);
+ break;
+ }
+ getActivity().setProgressBarIndeterminateVisibility(false);
+ mContainer.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader loader) {
+ switch (loader.getId()) {
+ case LOADER_ID_KEYS:
+ mKeysAdapter.swapCursor(null);
+ break;
+ }
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
index ef4da3010..43e484ffe 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
@@ -19,66 +19,46 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.database.Cursor;
-import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
-import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListView;
-import android.widget.TextView;
-
-import com.beardedhen.androidbootstrap.BootstrapButton;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
-import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
+import org.sufficientlysecure.keychain.R;import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter;
import org.sufficientlysecure.keychain.ui.adapter.ViewKeyUserIdsAdapter;
import org.sufficientlysecure.keychain.util.Log;
-import java.util.Date;
-
-
public class ViewKeyMainFragment extends Fragment implements
LoaderManager.LoaderCallbacks {
public static final String ARG_DATA_URI = "uri";
private LinearLayout mContainer;
- private TextView mName;
- private TextView mEmail;
- private TextView mComment;
- private TextView mAlgorithm;
- private TextView mKeyId;
- private TextView mExpiry;
- private TextView mCreation;
- private TextView mFingerprint;
- private TextView mSecretKey;
- private BootstrapButton mActionEdit;
- private BootstrapButton mActionEncrypt;
- private BootstrapButton mActionCertify;
+ private View mActionEdit;
+ private View mActionEditDivider;
+ private View mActionEncrypt;
+ private View mActionCertify;
+ private View mActionCertifyDivider;
private ListView mUserIds;
- private ListView mKeys;
private static final int LOADER_ID_UNIFIED = 0;
private static final int LOADER_ID_USER_IDS = 1;
private static final int LOADER_ID_KEYS = 2;
private ViewKeyUserIdsAdapter mUserIdsAdapter;
- private ViewKeyKeysAdapter mKeysAdapter;
private Uri mDataUri;
@@ -87,20 +67,12 @@ public class ViewKeyMainFragment extends Fragment implements
View view = inflater.inflate(R.layout.view_key_main_fragment, container, false);
mContainer = (LinearLayout) view.findViewById(R.id.container);
- mName = (TextView) view.findViewById(R.id.name);
- mEmail = (TextView) view.findViewById(R.id.email);
- mComment = (TextView) view.findViewById(R.id.comment);
- mKeyId = (TextView) view.findViewById(R.id.key_id);
- mAlgorithm = (TextView) view.findViewById(R.id.algorithm);
- mCreation = (TextView) view.findViewById(R.id.creation);
- mExpiry = (TextView) view.findViewById(R.id.expiry);
- mFingerprint = (TextView) view.findViewById(R.id.fingerprint);
- mSecretKey = (TextView) view.findViewById(R.id.secret_key);
- mUserIds = (ListView) view.findViewById(R.id.user_ids);
- mKeys = (ListView) view.findViewById(R.id.keys);
- mActionEdit = (BootstrapButton) view.findViewById(R.id.action_edit);
- mActionEncrypt = (BootstrapButton) view.findViewById(R.id.action_encrypt);
- mActionCertify = (BootstrapButton) view.findViewById(R.id.action_certify);
+ mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids);
+ mActionEdit = view.findViewById(R.id.view_key_action_edit);
+ mActionEditDivider = view.findViewById(R.id.view_key_action_edit_divider);
+ mActionEncrypt = view.findViewById(R.id.view_key_action_encrypt);
+ mActionCertify = view.findViewById(R.id.view_key_action_certify);
+ mActionCertifyDivider = view.findViewById(R.id.view_key_action_certify_divider);
return view;
}
@@ -120,11 +92,6 @@ public class ViewKeyMainFragment extends Fragment implements
}
private void loadData(Uri dataUri) {
- if (dataUri.equals(mDataUri)) {
- Log.d(Constants.TAG, "Same URI, no need to load the data again!");
- return;
- }
-
getActivity().setProgressBarIndeterminateVisibility(true);
mContainer.setVisibility(View.GONE);
@@ -135,44 +102,46 @@ public class ViewKeyMainFragment extends Fragment implements
mActionEncrypt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- encryptToContact(mDataUri);
+ encrypt(mDataUri);
}
});
mActionCertify.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
- certifyKey(mDataUri);
+ certify(mDataUri);
+ }
+ });
+ mActionEdit.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View view) {
+ editKey(mDataUri);
}
});
mUserIdsAdapter = new ViewKeyUserIdsAdapter(getActivity(), null, 0);
mUserIds.setAdapter(mUserIdsAdapter);
- mKeysAdapter = new ViewKeyKeysAdapter(getActivity(), null, 0);
- mKeys.setAdapter(mKeysAdapter);
-
// Prepare the loaders. Either re-connect with an existing ones,
// or start new ones.
- getActivity().getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
- getActivity().getSupportLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
- getActivity().getSupportLoaderManager().initLoader(LOADER_ID_KEYS, null, this);
+ getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+ getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
+ getLoaderManager().initLoader(LOADER_ID_KEYS, null, this);
}
- static final String[] UNIFIED_PROJECTION = new String[] {
- KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET,
+ static final String[] UNIFIED_PROJECTION = new String[]{
+ KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET,
KeyRings.USER_ID, KeyRings.FINGERPRINT,
KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY,
};
- static final int INDEX_UNIFIED_MKI = 1;
+ static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
- static final int INDEX_UNIFIED_UID = 3;
+ static final int INDEX_UNIFIED_USER_ID = 3;
static final int INDEX_UNIFIED_FINGERPRINT = 4;
static final int INDEX_UNIFIED_ALGORITHM = 5;
static final int INDEX_UNIFIED_KEY_SIZE = 6;
static final int INDEX_UNIFIED_CREATION = 7;
static final int INDEX_UNIFIED_EXPIRY = 8;
- static final String[] KEYS_PROJECTION = new String[] {
+ static final String[] KEYS_PROJECTION = new String[]{
Keys._ID,
Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET,
Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED,
@@ -205,7 +174,7 @@ public class ViewKeyMainFragment extends Fragment implements
* because the notification triggers faster than the activity closes.
*/
// Avoid NullPointerExceptions...
- if(data.getCount() == 0) {
+ if (data.getCount() == 0) {
return;
}
// Swap the new cursor in. (The framework will take care of closing the
@@ -213,81 +182,24 @@ public class ViewKeyMainFragment extends Fragment implements
switch (loader.getId()) {
case LOADER_ID_UNIFIED: {
if (data.moveToFirst()) {
- // get name, email, and comment from USER_ID
- String[] mainUserId = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_UID));
- if (mainUserId[0] != null) {
- getActivity().setTitle(mainUserId[0]);
- mName.setText(mainUserId[0]);
- } else {
- getActivity().setTitle(R.string.user_id_no_name);
- mName.setText(R.string.user_id_no_name);
- }
- mEmail.setText(mainUserId[1]);
- mComment.setText(mainUserId[2]);
-
if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
- mSecretKey.setTextColor(getResources().getColor(R.color.emphasis));
- mSecretKey.setText(R.string.secret_key_yes);
+ // certify button
+ mActionCertify.setVisibility(View.GONE);
+ mActionCertifyDivider.setVisibility(View.GONE);
// edit button
mActionEdit.setVisibility(View.VISIBLE);
- mActionEdit.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- Intent editIntent = new Intent(getActivity(), EditKeyActivity.class);
- editIntent.setData(
- KeyRingData.buildSecretKeyRingUri(mDataUri));
- editIntent.setAction(EditKeyActivity.ACTION_EDIT_KEY);
- startActivityForResult(editIntent, 0);
- }
- });
+ mActionEditDivider.setVisibility(View.VISIBLE);
} else {
- mSecretKey.setTextColor(Color.BLACK);
- mSecretKey.setText(getResources().getString(R.string.secret_key_no));
-
// certify button
mActionCertify.setVisibility(View.VISIBLE);
+ mActionCertifyDivider.setVisibility(View.VISIBLE);
+
// edit button
mActionEdit.setVisibility(View.GONE);
+ mActionEditDivider.setVisibility(View.GONE);
}
- // get key id from MASTER_KEY_ID
- long masterKeyId = data.getLong(INDEX_UNIFIED_MKI);
- String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId);
- mKeyId.setText(keyIdStr);
-
- // get creation date from CREATION
- if (data.isNull(INDEX_UNIFIED_CREATION)) {
- mCreation.setText(R.string.none);
- } else {
- Date creationDate = new Date(data.getLong(INDEX_UNIFIED_CREATION) * 1000);
-
- mCreation.setText(
- DateFormat.getDateFormat(getActivity().getApplicationContext()).format(
- creationDate));
- }
-
- // get expiry date from EXPIRY
- if (data.isNull(INDEX_UNIFIED_EXPIRY)) {
- mExpiry.setText(R.string.none);
- } else {
- Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000);
-
- mExpiry.setText(
- DateFormat.getDateFormat(getActivity().getApplicationContext()).format(
- expiryDate));
- }
-
- String algorithmStr = PgpKeyHelper.getAlgorithmInfo(
- getActivity(),
- data.getInt(INDEX_UNIFIED_ALGORITHM),
- data.getInt(INDEX_UNIFIED_KEY_SIZE)
- );
- mAlgorithm.setText(algorithmStr);
-
- byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT);
- String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
- mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
-
break;
}
}
@@ -307,11 +219,12 @@ public class ViewKeyMainFragment extends Fragment implements
break;
}
} while (data.moveToNext());
- if (!canEncrypt) {
+ if (canEncrypt) {
+ mActionEncrypt.setVisibility(View.VISIBLE);
+ } else {
mActionEncrypt.setVisibility(View.GONE);
}
- mKeysAdapter.swapCursor(data);
break;
}
getActivity().setProgressBarIndeterminateVisibility(false);
@@ -327,16 +240,13 @@ public class ViewKeyMainFragment extends Fragment implements
case LOADER_ID_USER_IDS:
mUserIdsAdapter.swapCursor(null);
break;
- case LOADER_ID_KEYS:
- mKeysAdapter.swapCursor(null);
- break;
}
}
- private void encryptToContact(Uri dataUri) {
+ private void encrypt(Uri dataUri) {
try {
long keyId = new ProviderHelper(getActivity()).extractOrGetMasterKeyId(dataUri);
- long[] encryptionKeyIds = new long[]{ keyId };
+ long[] encryptionKeyIds = new long[]{keyId};
Intent intent = new Intent(getActivity(), EncryptActivity.class);
intent.setAction(EncryptActivity.ACTION_ENCRYPT);
intent.putExtra(EncryptActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds);
@@ -347,10 +257,17 @@ public class ViewKeyMainFragment extends Fragment implements
}
}
- private void certifyKey(Uri dataUri) {
+ private void certify(Uri dataUri) {
Intent signIntent = new Intent(getActivity(), CertifyKeyActivity.class);
signIntent.setData(dataUri);
startActivity(signIntent);
}
+ private void editKey(Uri dataUri) {
+ Intent editIntent = new Intent(getActivity(), EditKeyActivity.class);
+ editIntent.setData(KeychainContract.KeyRingData.buildSecretKeyRingUri(dataUri));
+ editIntent.setAction(EditKeyActivity.ACTION_EDIT_KEY);
+ startActivityForResult(editIntent, 0);
+ }
+
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
new file mode 100644
index 000000000..aacf30429
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.annotation.TargetApi;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.devspark.appmsg.AppMsg;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment;
+import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.QrCodeUtils;
+
+import java.io.IOException;
+
+
+public class ViewKeyShareFragment extends Fragment implements
+ LoaderManager.LoaderCallbacks {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private LinearLayout mContainer;
+ private TextView mFingerprint;
+ private ImageView mFingerprintQrCode;
+ private View mFingerprintShareButton;
+ private View mFingerprintClipboardButton;
+ private View mKeyShareButton;
+ private View mKeyClipboardButton;
+ private View mNfcHelpButton;
+ private View mNfcPrefsButton;
+
+ ProviderHelper mProviderHelper;
+
+ private static final int QR_CODE_SIZE = 1000;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+
+ private Uri mDataUri;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.view_key_share_fragment, container, false);
+
+ mProviderHelper = new ProviderHelper(ViewKeyShareFragment.this.getActivity());
+
+ mContainer = (LinearLayout) view.findViewById(R.id.container);
+ mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint);
+ mFingerprintQrCode = (ImageView) view.findViewById(R.id.view_key_fingerprint_qr_code_image);
+ mFingerprintShareButton = view.findViewById(R.id.view_key_action_fingerprint_share);
+ mFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard);
+ mKeyShareButton = view.findViewById(R.id.view_key_action_key_share);
+ mKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard);
+ mNfcHelpButton = view.findViewById(R.id.view_key_action_nfc_help);
+ mNfcPrefsButton = view.findViewById(R.id.view_key_action_nfc_prefs);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ mNfcPrefsButton.setVisibility(View.VISIBLE);
+ } else {
+ mNfcPrefsButton.setVisibility(View.GONE);
+ }
+
+ mFingerprintQrCode.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showQrCodeDialog();
+ }
+ });
+
+ mFingerprintShareButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, true, false);
+ }
+ });
+ mFingerprintClipboardButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, true, true);
+ }
+ });
+ mKeyShareButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, false, false);
+ }
+ });
+ mKeyClipboardButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, false, true);
+ }
+ });
+ mNfcHelpButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showNfcHelpDialog();
+ }
+ });
+ mNfcPrefsButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showNfcPrefs();
+ }
+ });
+
+ return view;
+ }
+
+ private void share(Uri dataUri, ProviderHelper providerHelper, boolean fingerprintOnly,
+ boolean toClipboard) {
+ try {
+ String content;
+ if (fingerprintOnly) {
+ byte[] data = (byte[]) providerHelper.getGenericData(
+ KeyRings.buildUnifiedKeyRingUri(dataUri),
+ Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
+ String fingerprint = PgpKeyHelper.convertFingerprintToHex(data);
+ content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ } else {
+ // get public keyring as ascii armored string
+ Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
+ content = providerHelper.getKeyRingAsArmoredString(uri);
+ }
+
+ if (toClipboard) {
+ ClipboardReflection.copyToClipboard(getActivity(), content);
+ String message;
+ if (fingerprintOnly) {
+ message = getResources().getString(R.string.fingerprint_copied_to_clipboard);
+ } else {
+ message = getResources().getString(R.string.key_copied_to_clipboard);
+ }
+ AppMsg.makeText(getActivity(), message, AppMsg.STYLE_INFO).show();
+ } else {
+ // Android will fail with android.os.TransactionTooLargeException if key is too big
+ // see http://www.lonestarprod.com/?p=34
+ if (content.length() >= 86389) {
+ AppMsg.makeText(getActivity(), R.string.key_too_big_for_sharing,
+ AppMsg.STYLE_ALERT).show();
+ return;
+ }
+
+ // let user choose application
+ Intent sendIntent = new Intent(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, content);
+ sendIntent.setType("text/plain");
+ String title;
+ if (fingerprintOnly) {
+ title = getResources().getString(R.string.title_share_fingerprint_with);
+ } else {
+ title = getResources().getString(R.string.title_share_key_with);
+ }
+ startActivity(Intent.createChooser(sendIntent, title));
+ }
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "error processing key!", e);
+ AppMsg.makeText(getActivity(), R.string.error_key_processing, AppMsg.STYLE_ALERT).show();
+ } catch (ProviderHelper.NotFoundException e) {
+ Log.e(Constants.TAG, "key not found!", e);
+ AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
+ }
+ }
+
+ private void showQrCodeDialog() {
+ ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(mDataUri,
+ true);
+ dialog.show(ViewKeyShareFragment.this.getActivity().getSupportFragmentManager(), "shareQrCodeDialog");
+ }
+
+ private void showNfcHelpDialog() {
+ ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance();
+ dialog.show(getActivity().getSupportFragmentManager(), "shareNfcDialog");
+ }
+
+ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+ private void showNfcPrefs() {
+ Intent intentSettings = new Intent(
+ Settings.ACTION_NFCSHARING_SETTINGS);
+ startActivity(intentSettings);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+
+ loadData(dataUri);
+ }
+
+ private void loadData(Uri dataUri) {
+ getActivity().setProgressBarIndeterminateVisibility(true);
+ mContainer.setVisibility(View.GONE);
+
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+ }
+
+ static final String[] UNIFIED_PROJECTION = new String[]{
+ KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET,
+ KeyRings.USER_ID, KeyRings.FINGERPRINT,
+ KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY,
+
+ };
+ static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
+ static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
+ static final int INDEX_UNIFIED_USER_ID = 3;
+ static final int INDEX_UNIFIED_FINGERPRINT = 4;
+ static final int INDEX_UNIFIED_ALGORITHM = 5;
+ static final int INDEX_UNIFIED_KEY_SIZE = 6;
+ static final int INDEX_UNIFIED_CREATION = 7;
+ static final int INDEX_UNIFIED_EXPIRY = 8;
+
+ public Loader onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ public void onLoadFinished(Loader loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+
+ byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT);
+ String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
+ mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
+
+ String qrCodeContent = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ mFingerprintQrCode.setImageBitmap(
+ QrCodeUtils.getQRCodeBitmap(qrCodeContent, QR_CODE_SIZE)
+ );
+
+ break;
+ }
+ }
+
+ }
+ getActivity().setProgressBarIndeterminateVisibility(false);
+ mContainer.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader loader) {
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
index f4fa7f3bf..c9070c897 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
@@ -28,7 +28,6 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
@@ -106,7 +105,7 @@ public class ImportKeysAdapter extends ArrayAdapter {
holder.mainUserId = (TextView) convertView.findViewById(R.id.mainUserId);
holder.mainUserIdRest = (TextView) convertView.findViewById(R.id.mainUserIdRest);
holder.keyId = (TextView) convertView.findViewById(R.id.keyId);
- holder.fingerprint = (TextView) convertView.findViewById(R.id.fingerprint);
+ holder.fingerprint = (TextView) convertView.findViewById(R.id.view_key_fingerprint);
holder.algorithm = (TextView) convertView.findViewById(R.id.algorithm);
holder.status = (TextView) convertView.findViewById(R.id.status);
holder.userIdsList = (LinearLayout) convertView.findViewById(R.id.user_ids_list);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java
index fd864eb09..977740567 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java
@@ -17,7 +17,7 @@
package org.sufficientlysecure.keychain.ui.adapter;
-import android.content.Context;
+import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
@@ -26,8 +26,8 @@ import android.support.v7.app.ActionBarActivity;
import java.util.ArrayList;
public class PagerTabStripAdapter extends FragmentPagerAdapter {
- private final Context mContext;
- private final ArrayList mTabs = new ArrayList();
+ protected final Activity mActivity;
+ protected final ArrayList mTabs = new ArrayList();
static final class TabInfo {
public final Class> clss;
@@ -43,7 +43,7 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter {
public PagerTabStripAdapter(ActionBarActivity activity) {
super(activity.getSupportFragmentManager());
- mContext = activity;
+ mActivity = activity;
}
public void addTab(Class> clss, Bundle args, String title) {
@@ -60,7 +60,7 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter {
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
- return Fragment.instantiate(mContext, info.clss.getName(), info.args);
+ return Fragment.instantiate(mActivity, info.clss.getName(), info.args);
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
index 52e6dec92..05f8f8860 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
@@ -27,6 +27,7 @@ import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
@@ -106,40 +107,55 @@ public class ViewKeyUserIdsAdapter extends CursorAdapter implements AdapterView.
@Override
public void bindView(View view, Context context, Cursor cursor) {
- TextView vRank = (TextView) view.findViewById(R.id.rank);
- TextView vUserId = (TextView) view.findViewById(R.id.userId);
+ TextView vName = (TextView) view.findViewById(R.id.userId);
TextView vAddress = (TextView) view.findViewById(R.id.address);
+ TextView vComment = (TextView) view.findViewById(R.id.comment);
ImageView vVerified = (ImageView) view.findViewById(R.id.certified);
+ ImageView vPrimaryUserIdIcon = (ImageView) view.findViewById(R.id.primary_user_id_icon);
- if (cursor.getInt(mIsPrimary) > 0) {
- vRank.setText("+");
+ String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexUserId));
+ if (userId[0] != null) {
+ vName.setText(userId[0]);
} else {
- vRank.setText(Integer.toString(cursor.getInt(mIndexRank)));
+ vName.setText(R.string.user_id_no_name);
+ }
+ if (userId[1] != null) {
+ vAddress.setText(userId[1]);
+ vAddress.setVisibility(View.VISIBLE);
+ } else {
+ vAddress.setVisibility(View.GONE);
+ }
+ if (userId[2] != null) {
+ vComment.setText(userId[2]);
+ vComment.setVisibility(View.VISIBLE);
+ } else {
+ vComment.setVisibility(View.GONE);
}
- String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexUserId));
- if (userId[0] != null) {
- vUserId.setText(userId[0]);
+ // show small star icon for primary user ids
+ if (cursor.getInt(mIsPrimary) > 0) {
+ vPrimaryUserIdIcon.setVisibility(View.VISIBLE);
} else {
- vUserId.setText(R.string.user_id_no_name);
+ vPrimaryUserIdIcon.setVisibility(View.GONE);
}
- vAddress.setText(userId[1]);
if (cursor.getInt(mIsRevoked) > 0) {
- vRank.setText(" ");
+ // no star icon for revoked user ids!
+ vPrimaryUserIdIcon.setVisibility(View.GONE);
+
+ // set revocation icon
vVerified.setImageResource(R.drawable.key_certify_revoke);
// disable and strike through text for revoked user ids
- vUserId.setEnabled(false);
+ vName.setEnabled(false);
vAddress.setEnabled(false);
- vUserId.setText(OtherHelper.strikeOutText(vUserId.getText()));
+ vName.setText(OtherHelper.strikeOutText(vName.getText()));
vAddress.setText(OtherHelper.strikeOutText(vAddress.getText()));
} else {
- vUserId.setEnabled(true);
+ vName.setEnabled(true);
vAddress.setEnabled(true);
int verified = cursor.getInt(mVerifiedId);
- // TODO introduce own resources for this :)
switch (verified) {
case Certs.VERIFIED_SECRET:
vVerified.setImageResource(R.drawable.key_certify_ok_depth0);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java
new file mode 100644
index 000000000..065034be1
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * 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.util;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.HorizontalScrollView;
+import android.widget.TextView;
+
+/**
+ * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html
+ */
+
+/**
+ * To be used with ViewPager to provide a tab indicator component which give constant feedback as to
+ * the user's scroll progress.
+ *
+ * To use the component, simply add it to your view hierarchy. Then in your
+ * {@link android.app.Activity} or {@link android.support.v4.app.Fragment} call
+ * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for.
+ *
+ * The colors can be customized in two ways. The first and simplest is to provide an array of colors
+ * via {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)}. The
+ * alternative is via the {@link TabColorizer} interface which provides you complete control over
+ * which color is used for any individual position.
+ *
+ * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)},
+ * providing the layout ID of your custom layout.
+ */
+public class SlidingTabLayout extends HorizontalScrollView {
+
+ /**
+ * Allows complete control over the colors drawn in the tab layout. Set with
+ * {@link #setCustomTabColorizer(TabColorizer)}.
+ */
+ public interface TabColorizer {
+
+ /**
+ * @return return the color of the indicator used when {@code position} is selected.
+ */
+ int getIndicatorColor(int position);
+
+ /**
+ * @return return the color of the divider drawn to the right of {@code position}.
+ */
+ int getDividerColor(int position);
+
+ }
+
+ private static final int TITLE_OFFSET_DIPS = 24;
+ private static final int TAB_VIEW_PADDING_DIPS = 16;
+ private static final int TAB_VIEW_TEXT_SIZE_SP = 12;
+
+ private int mTitleOffset;
+
+ private int mTabViewLayoutId;
+ private int mTabViewTextViewId;
+
+ private ViewPager mViewPager;
+ private ViewPager.OnPageChangeListener mViewPagerPageChangeListener;
+
+ private final SlidingTabStrip mTabStrip;
+
+ public SlidingTabLayout(Context context) {
+ this(context, null);
+ }
+
+ public SlidingTabLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ // Disable the Scroll Bar
+ setHorizontalScrollBarEnabled(false);
+ // Make sure that the Tab Strips fills this View
+ setFillViewport(true);
+
+ mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);
+
+ mTabStrip = new SlidingTabStrip(context);
+ addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+ }
+
+ /**
+ * Set the custom {@link TabColorizer} to be used.
+ *
+ * If you only require simple custmisation then you can use
+ * {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)} to achieve
+ * similar effects.
+ */
+ public void setCustomTabColorizer(TabColorizer tabColorizer) {
+ mTabStrip.setCustomTabColorizer(tabColorizer);
+ }
+
+ /**
+ * Sets the colors to be used for indicating the selected tab. These colors are treated as a
+ * circular array. Providing one color will mean that all tabs are indicated with the same color.
+ */
+ public void setSelectedIndicatorColors(int... colors) {
+ mTabStrip.setSelectedIndicatorColors(colors);
+ }
+
+ /**
+ * Sets the colors to be used for tab dividers. These colors are treated as a circular array.
+ * Providing one color will mean that all tabs are indicated with the same color.
+ */
+ public void setDividerColors(int... colors) {
+ mTabStrip.setDividerColors(colors);
+ }
+
+ /**
+ * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are
+ * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so
+ * that the layout can update it's scroll position correctly.
+ *
+ * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener)
+ */
+ public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
+ mViewPagerPageChangeListener = listener;
+ }
+
+ /**
+ * Set the custom layout to be inflated for the tab views.
+ *
+ * @param layoutResId Layout id to be inflated
+ * @param textViewId id of the {@link TextView} in the inflated view
+ */
+ public void setCustomTabView(int layoutResId, int textViewId) {
+ mTabViewLayoutId = layoutResId;
+ mTabViewTextViewId = textViewId;
+ }
+
+ /**
+ * Sets the associated view pager. Note that the assumption here is that the pager content
+ * (number of tabs and tab titles) does not change after this call has been made.
+ */
+ public void setViewPager(ViewPager viewPager) {
+ mTabStrip.removeAllViews();
+
+ mViewPager = viewPager;
+ if (viewPager != null) {
+ viewPager.setOnPageChangeListener(new InternalViewPagerListener());
+ populateTabStrip();
+ }
+ }
+
+ /**
+ * Create a default view to be used for tabs. This is called if a custom tab view is not set via
+ * {@link #setCustomTabView(int, int)}.
+ */
+ protected TextView createDefaultTabView(Context context) {
+ TextView textView = new TextView(context);
+ textView.setGravity(Gravity.CENTER);
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
+ textView.setTypeface(Typeface.DEFAULT_BOLD);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ // If we're running on Honeycomb or newer, then we can use the Theme's
+ // selectableItemBackground to ensure that the View has a pressed state
+ TypedValue outValue = new TypedValue();
+ getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
+ outValue, true);
+ textView.setBackgroundResource(outValue.resourceId);
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
+ textView.setAllCaps(true);
+ }
+
+ int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
+ textView.setPadding(padding, padding, padding, padding);
+
+ return textView;
+ }
+
+ private void populateTabStrip() {
+ final PagerAdapter adapter = mViewPager.getAdapter();
+ final View.OnClickListener tabClickListener = new TabClickListener();
+
+ for (int i = 0; i < adapter.getCount(); i++) {
+ View tabView = null;
+ TextView tabTitleView = null;
+
+ if (mTabViewLayoutId != 0) {
+ // If there is a custom tab view layout id set, try and inflate it
+ tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,
+ false);
+ tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId);
+ }
+
+ if (tabView == null) {
+ tabView = createDefaultTabView(getContext());
+ }
+
+ if (tabTitleView == null && TextView.class.isInstance(tabView)) {
+ tabTitleView = (TextView) tabView;
+ }
+
+ tabTitleView.setText(adapter.getPageTitle(i));
+ tabView.setOnClickListener(tabClickListener);
+
+ mTabStrip.addView(tabView);
+ }
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ if (mViewPager != null) {
+ scrollToTab(mViewPager.getCurrentItem(), 0);
+ }
+ }
+
+ private void scrollToTab(int tabIndex, int positionOffset) {
+ final int tabStripChildCount = mTabStrip.getChildCount();
+ if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
+ return;
+ }
+
+ View selectedChild = mTabStrip.getChildAt(tabIndex);
+ if (selectedChild != null) {
+ int targetScrollX = selectedChild.getLeft() + positionOffset;
+
+ if (tabIndex > 0 || positionOffset > 0) {
+ // If we're not at the first child and are mid-scroll, make sure we obey the offset
+ targetScrollX -= mTitleOffset;
+ }
+
+ scrollTo(targetScrollX, 0);
+ }
+ }
+
+ private class InternalViewPagerListener implements ViewPager.OnPageChangeListener {
+ private int mScrollState;
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ int tabStripChildCount = mTabStrip.getChildCount();
+ if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
+ return;
+ }
+
+ mTabStrip.onViewPagerPageChanged(position, positionOffset);
+
+ View selectedTitle = mTabStrip.getChildAt(position);
+ int extraOffset = (selectedTitle != null)
+ ? (int) (positionOffset * selectedTitle.getWidth())
+ : 0;
+ scrollToTab(position, extraOffset);
+
+ if (mViewPagerPageChangeListener != null) {
+ mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,
+ positionOffsetPixels);
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ mScrollState = state;
+
+ if (mViewPagerPageChangeListener != null) {
+ mViewPagerPageChangeListener.onPageScrollStateChanged(state);
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
+ mTabStrip.onViewPagerPageChanged(position, 0f);
+ scrollToTab(position, 0);
+ }
+
+ if (mViewPagerPageChangeListener != null) {
+ mViewPagerPageChangeListener.onPageSelected(position);
+ }
+ }
+
+ }
+
+ private class TabClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ for (int i = 0; i < mTabStrip.getChildCount(); i++) {
+ if (v == mTabStrip.getChildAt(i)) {
+ mViewPager.setCurrentItem(i);
+ return;
+ }
+ }
+ }
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java
new file mode 100644
index 000000000..4b8c7e75d
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * 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.util;
+
+import android.R;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.LinearLayout;
+
+/**
+ * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html
+ */
+class SlidingTabStrip extends LinearLayout {
+
+ private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 2;
+ private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;
+ private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 8;
+ private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5;
+
+ private static final int DEFAULT_DIVIDER_THICKNESS_DIPS = 1;
+ private static final byte DEFAULT_DIVIDER_COLOR_ALPHA = 0x20;
+ private static final float DEFAULT_DIVIDER_HEIGHT = 0.5f;
+
+ private final int mBottomBorderThickness;
+ private final Paint mBottomBorderPaint;
+
+ private final int mSelectedIndicatorThickness;
+ private final Paint mSelectedIndicatorPaint;
+
+ private final int mDefaultBottomBorderColor;
+
+ private final Paint mDividerPaint;
+ private final float mDividerHeight;
+
+ private int mSelectedPosition;
+ private float mSelectionOffset;
+
+ private SlidingTabLayout.TabColorizer mCustomTabColorizer;
+ private final SimpleTabColorizer mDefaultTabColorizer;
+
+ SlidingTabStrip(Context context) {
+ this(context, null);
+ }
+
+ SlidingTabStrip(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setWillNotDraw(false);
+
+ final float density = getResources().getDisplayMetrics().density;
+
+ TypedValue outValue = new TypedValue();
+ context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true);
+ final int themeForegroundColor = outValue.data;
+
+ mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor,
+ DEFAULT_BOTTOM_BORDER_COLOR_ALPHA);
+
+ mDefaultTabColorizer = new SimpleTabColorizer();
+ mDefaultTabColorizer.setIndicatorColors(DEFAULT_SELECTED_INDICATOR_COLOR);
+ mDefaultTabColorizer.setDividerColors(setColorAlpha(themeForegroundColor,
+ DEFAULT_DIVIDER_COLOR_ALPHA));
+
+ mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density);
+ mBottomBorderPaint = new Paint();
+ mBottomBorderPaint.setColor(mDefaultBottomBorderColor);
+
+ mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density);
+ mSelectedIndicatorPaint = new Paint();
+
+ mDividerHeight = DEFAULT_DIVIDER_HEIGHT;
+ mDividerPaint = new Paint();
+ mDividerPaint.setStrokeWidth((int) (DEFAULT_DIVIDER_THICKNESS_DIPS * density));
+ }
+
+ void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) {
+ mCustomTabColorizer = customTabColorizer;
+ invalidate();
+ }
+
+ void setSelectedIndicatorColors(int... colors) {
+ // Make sure that the custom colorizer is removed
+ mCustomTabColorizer = null;
+ mDefaultTabColorizer.setIndicatorColors(colors);
+ invalidate();
+ }
+
+ void setDividerColors(int... colors) {
+ // Make sure that the custom colorizer is removed
+ mCustomTabColorizer = null;
+ mDefaultTabColorizer.setDividerColors(colors);
+ invalidate();
+ }
+
+ void onViewPagerPageChanged(int position, float positionOffset) {
+ mSelectedPosition = position;
+ mSelectionOffset = positionOffset;
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ final int height = getHeight();
+ final int childCount = getChildCount();
+ final int dividerHeightPx = (int) (Math.min(Math.max(0f, mDividerHeight), 1f) * height);
+ final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null
+ ? mCustomTabColorizer
+ : mDefaultTabColorizer;
+
+ // Thick colored underline below the current selection
+ if (childCount > 0) {
+ View selectedTitle = getChildAt(mSelectedPosition);
+ int left = selectedTitle.getLeft();
+ int right = selectedTitle.getRight();
+ int color = tabColorizer.getIndicatorColor(mSelectedPosition);
+
+ if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) {
+ int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1);
+ if (color != nextColor) {
+ color = blendColors(nextColor, color, mSelectionOffset);
+ }
+
+ // Draw the selection partway between the tabs
+ View nextTitle = getChildAt(mSelectedPosition + 1);
+ left = (int) (mSelectionOffset * nextTitle.getLeft() +
+ (1.0f - mSelectionOffset) * left);
+ right = (int) (mSelectionOffset * nextTitle.getRight() +
+ (1.0f - mSelectionOffset) * right);
+ }
+
+ mSelectedIndicatorPaint.setColor(color);
+
+ canvas.drawRect(left, height - mSelectedIndicatorThickness, right,
+ height, mSelectedIndicatorPaint);
+ }
+
+ // Thin underline along the entire bottom edge
+ canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint);
+
+ // Vertical separators between the titles
+ int separatorTop = (height - dividerHeightPx) / 2;
+ for (int i = 0; i < childCount - 1; i++) {
+ View child = getChildAt(i);
+ mDividerPaint.setColor(tabColorizer.getDividerColor(i));
+ canvas.drawLine(child.getRight(), separatorTop, child.getRight(),
+ separatorTop + dividerHeightPx, mDividerPaint);
+ }
+ }
+
+ /**
+ * Set the alpha value of the {@code color} to be the given {@code alpha} value.
+ */
+ private static int setColorAlpha(int color, byte alpha) {
+ return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
+ }
+
+ /**
+ * Blend {@code color1} and {@code color2} using the given ratio.
+ *
+ * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
+ * 0.0 will return {@code color2}.
+ */
+ private static int blendColors(int color1, int color2, float ratio) {
+ final float inverseRation = 1f - ratio;
+ float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
+ float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
+ float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
+ return Color.rgb((int) r, (int) g, (int) b);
+ }
+
+ private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer {
+ private int[] mIndicatorColors;
+ private int[] mDividerColors;
+
+ @Override
+ public final int getIndicatorColor(int position) {
+ return mIndicatorColors[position % mIndicatorColors.length];
+ }
+
+ @Override
+ public final int getDividerColor(int position) {
+ return mDividerColors[position % mDividerColors.length];
+ }
+
+ void setIndicatorColors(int... colors) {
+ mIndicatorColors = colors;
+ }
+
+ void setDividerColors(int... colors) {
+ mDividerColors = colors;
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png
new file mode 100644
index 000000000..22327391e
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png
new file mode 100644
index 000000000..5f7c6eff3
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png
new file mode 100644
index 000000000..38051d8d6
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png
new file mode 100644
index 000000000..382d314ca
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png
new file mode 100644
index 000000000..a1804b2c1
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png
new file mode 100644
index 000000000..0eb78f7c7
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png
new file mode 100644
index 000000000..713482020
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png
new file mode 100644
index 000000000..650b4d899
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png
new file mode 100644
index 000000000..13967b30a
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png
new file mode 100644
index 000000000..5876cdea4
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png
new file mode 100644
index 000000000..11a25b504
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png
new file mode 100644
index 000000000..c290e5902
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png
new file mode 100644
index 000000000..5ddf15139
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png
new file mode 100644
index 000000000..8ab436d87
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png
new file mode 100644
index 000000000..0bb45d2c0
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png
new file mode 100644
index 000000000..19a9df332
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png
new file mode 100644
index 000000000..40ca1572c
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png
new file mode 100644
index 000000000..999d0f0d8
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png
new file mode 100644
index 000000000..a0508df8c
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png
new file mode 100644
index 000000000..f2b2078b0
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png
new file mode 100644
index 000000000..fda51ad86
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png
new file mode 100644
index 000000000..c5a34319b
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png
new file mode 100644
index 000000000..44754152f
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png
new file mode 100644
index 000000000..530227e2d
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png differ
diff --git a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml
index a2cacf0ad..ed856f281 100644
--- a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml
+++ b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml
@@ -1,7 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/certify_key_activity.xml b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
index 0ae46a261..cba73a3c7 100644
--- a/OpenKeychain/src/main/res/layout/certify_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
@@ -93,7 +93,7 @@
android:text="@string/label_fingerprint" />
@@ -111,7 +111,7 @@
android:text="@string/section_uids_to_sign" />
diff --git a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
index ba8ff91ca..f5ec71abe 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
@@ -106,7 +106,7 @@
android:typeface="monospace" />
Share with…Share fingerprint with…
- Whole key
+ Share key with…Share file with…Encrypt To FileDecrypt To File
@@ -38,13 +38,14 @@
Master KeyPrimary IdentityActions
- Share key
+ Whole keyYour Key used for certificationUpload KeyKeyserverEncrypt and/or SignDecrypt and VerifyFingerprint
+ Key to be certifiedCertify
--
cgit v1.2.3
From 2481b6e6602314faf12c13e40480ac91c889cd59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 09:31:01 +0200
Subject: Pull translations from transifex
---
OpenKeychain/src/main/res/values-de/strings.xml | 5 +++--
OpenKeychain/src/main/res/values-es/strings.xml | 1 -
OpenKeychain/src/main/res/values-fr/strings.xml | 1 -
OpenKeychain/src/main/res/values-it-rIT/strings.xml | 1 -
OpenKeychain/src/main/res/values-ja/strings.xml | 1 -
OpenKeychain/src/main/res/values-sl/strings.xml | 1 -
6 files changed, 3 insertions(+), 7 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index d90125c51..4b355f46f 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -15,7 +15,7 @@
Passwort setzenTeilen über...Teile Fingerabdruck über…
- Gesamter Schlüssel
+ Teile Schlüssel über...Datei teilen mit…In eine Datei verschlüsselnIn eine Datei entschlüsseln
@@ -36,13 +36,14 @@
HauptschlüsselHauptidentitätAktionen
- Schlüssel teilen
+ Gesamter SchlüsselMit diesem Schlüssel beglaubigenSchlüssel hochladenSchlüsselserverVerschlüsseln und/oder SignierenEntschlüsseln und VerifizierenFingerabdruck
+ Zu beglaubigende SchlüsselBeglaubigenEntschlüsselte Datei verifizieren und speichern
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index ea8127f60..17ac6c788 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -34,7 +34,6 @@
Clave maestraIdentidad primariaAcciones
- Compartir claveTu clave usada para las certificacionesCargar claveServidor de claves
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index be0f2003f..78265110d 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -34,7 +34,6 @@
Clef maîtresseIdentité principaleActions
- Partager la clefVotre clef utilisée pour la certificationTéléverser la clefServeur de clefs
diff --git a/OpenKeychain/src/main/res/values-it-rIT/strings.xml b/OpenKeychain/src/main/res/values-it-rIT/strings.xml
index 0550a5708..ab159a923 100644
--- a/OpenKeychain/src/main/res/values-it-rIT/strings.xml
+++ b/OpenKeychain/src/main/res/values-it-rIT/strings.xml
@@ -34,7 +34,6 @@
Chiave PrincipaleIdentità PrimariaAzioni
- Condividi chiave...La Tua Chiave usata per la certificazioneCarica ChiaveServer delle Chiavi
diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml
index 95d668a25..f22c2da62 100644
--- a/OpenKeychain/src/main/res/values-ja/strings.xml
+++ b/OpenKeychain/src/main/res/values-ja/strings.xml
@@ -34,7 +34,6 @@
主鍵メインのユーザIDアクション
- 鍵の共有あなたの鍵を証明に利用します鍵のアップロード鍵サーバ
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index d6e2bff77..bd370094d 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -34,7 +34,6 @@
Glavni ključGlavna identitetaRavnanja
- Deli ključVaš ključ, uporabljan za overitevNaloži ključStrežnik
--
cgit v1.2.3
From fb0f3c4778660c3ad9353b80173d2ef2d3684219 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 10:59:16 +0200
Subject: Use paste icon, clarify language once again
---
.../src/main/res/drawable-hdpi/ic_action_paste.png | Bin 0 -> 458 bytes
.../src/main/res/drawable-mdpi/ic_action_paste.png | Bin 0 -> 348 bytes
.../src/main/res/drawable-xhdpi/ic_action_paste.png | Bin 0 -> 494 bytes
.../src/main/res/drawable-xxhdpi/ic_action_paste.png | Bin 0 -> 687 bytes
.../src/main/res/layout/decrypt_file_fragment.xml | 2 +-
.../src/main/res/layout/decrypt_message_fragment.xml | 4 ++--
OpenKeychain/src/main/res/values-de/strings.xml | 2 +-
OpenKeychain/src/main/res/values/strings.xml | 7 ++++---
8 files changed, 8 insertions(+), 7 deletions(-)
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png
new file mode 100644
index 000000000..9438aa597
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png
new file mode 100644
index 000000000..940aae781
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png
new file mode 100644
index 000000000..5fa309cd8
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png
new file mode 100644
index 000000000..3589aeb55
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png differ
diff --git a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
index b5fd1fcc0..d1db1c782 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
@@ -72,7 +72,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
- android:text="@string/btn_decrypt_verify"
+ android:text="@string/btn_decrypt_verify_file"
android:clickable="true"
style="@style/SelectableItem"
android:drawableRight="@drawable/ic_action_save"
diff --git a/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml
index e54edd0d1..0db581910 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml
@@ -58,7 +58,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
- android:text="@string/btn_decrypt_verify"
+ android:text="@string/btn_decrypt_verify_message"
android:gravity="center_vertical"
android:layout_weight="1" />
@@ -75,7 +75,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="8dp"
- android:src="@drawable/ic_action_copy"
+ android:src="@drawable/ic_action_paste"
android:layout_gravity="center_vertical"
style="@style/SelectableItem" />
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 4b355f46f..41831f8df 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -46,7 +46,7 @@
Zu beglaubigende SchlüsselBeglaubigen
- Entschlüsselte Datei verifizieren und speichern
+ Entschlüsselte Datei verifizieren und speichernAus der ZwischenablageVerschlüsselte Datei speichernSpeichern
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 6df7cdcf2..11ca869ff 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -49,9 +49,10 @@
Certify
- Verify and save decrypted file
+ Decrypt, verify, and save file
+ Decrypt and verify messageFrom Clipboard
- Save encrypt file
+ Encrypt and save fileSaveCancelDelete
@@ -67,7 +68,7 @@
Lookup keyShow advanced settingsHide advanced settings
- Share encrypted/signed…
+ Share encrypted/signed message…Settings
--
cgit v1.2.3
From 61fc8d0eeed83cc24a694d011b86580e081c9b3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 11:01:33 +0200
Subject: Translations from transifex
---
OpenKeychain/src/main/res/values-de/strings.xml | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 41831f8df..b33506438 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -43,12 +43,13 @@
Verschlüsseln und/oder SignierenEntschlüsseln und VerifizierenFingerabdruck
- Zu beglaubigende Schlüssel
+ Zu beglaubigender SchlüsselBeglaubigen
- Entschlüsselte Datei verifizieren und speichern
+ Datei entschlüsseln, verifizieren und speichern
+ Entschlüsseln und verifizierenAus der Zwischenablage
- Verschlüsselte Datei speichern
+ Datei verschlüsseln und speichernSpeichernAbbrechenLöschen
@@ -437,8 +438,8 @@
verfügbarnicht verfügbar
- Hier die Nachricht schreiben welche verschlüsselt und/oder signiert werden soll...
- Hier den verslüsselten Text eingeben um ihn zu entschlüsseln und/oder zu überprüfen
+ Hier den Text schreiben welche verschlüsselt und/oder signiert werden soll...
+ Hier den verschlüsselten Text eingeben um ihn zu entschlüsseln und/oder zu überprüfenGrundeinstellungkein
--
cgit v1.2.3
From 10db9dd09a6f5537f1d760fd9504e21cfb39a8e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 11:15:40 +0200
Subject: Change drawer nav icon back to gray
---
OpenKeychain/src/main/res/drawable-hdpi/ic_drawer.png | Bin 328 -> 2829 bytes
.../keychaintheme_ic_navigation_drawer.png | Bin 124 -> 0 bytes
OpenKeychain/src/main/res/drawable-mdpi/ic_drawer.png | Bin 328 -> 2820 bytes
.../keychaintheme_ic_navigation_drawer.png | Bin 107 -> 0 bytes
OpenKeychain/src/main/res/drawable-xhdpi/ic_drawer.png | Bin 324 -> 2836 bytes
.../keychaintheme_ic_navigation_drawer.png | Bin 137 -> 0 bytes
.../src/main/res/drawable-xxhdpi/ic_drawer.png | Bin 328 -> 202 bytes
.../keychaintheme_ic_navigation_drawer.png | Bin 162 -> 0 bytes
8 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_ic_navigation_drawer.png
delete mode 100644 OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_ic_navigation_drawer.png
delete mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_ic_navigation_drawer.png
delete mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_ic_navigation_drawer.png
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_drawer.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_drawer.png
index a43751e29..c59f601ca 100644
Binary files a/OpenKeychain/src/main/res/drawable-hdpi/ic_drawer.png and b/OpenKeychain/src/main/res/drawable-hdpi/ic_drawer.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_ic_navigation_drawer.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_ic_navigation_drawer.png
deleted file mode 100644
index 049d90ac6..000000000
Binary files a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_ic_navigation_drawer.png and /dev/null differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_drawer.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_drawer.png
index 3e3af1a0a..1ed2c56ee 100644
Binary files a/OpenKeychain/src/main/res/drawable-mdpi/ic_drawer.png and b/OpenKeychain/src/main/res/drawable-mdpi/ic_drawer.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_ic_navigation_drawer.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_ic_navigation_drawer.png
deleted file mode 100644
index c9cd63c26..000000000
Binary files a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_ic_navigation_drawer.png and /dev/null differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_drawer.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_drawer.png
index 8db236f36..a5fa74def 100644
Binary files a/OpenKeychain/src/main/res/drawable-xhdpi/ic_drawer.png and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_drawer.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_ic_navigation_drawer.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_ic_navigation_drawer.png
deleted file mode 100644
index 8bd7a372c..000000000
Binary files a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_ic_navigation_drawer.png and /dev/null differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_drawer.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_drawer.png
index 67c5ec4f0..9c4685d6e 100644
Binary files a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_drawer.png and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_drawer.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_ic_navigation_drawer.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_ic_navigation_drawer.png
deleted file mode 100644
index c2d855307..000000000
Binary files a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_ic_navigation_drawer.png and /dev/null differ
--
cgit v1.2.3
From 7c2dc276c1bf01437db977026334ed17d2c1e65d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 13:48:19 +0200
Subject: Alignment in certify activity
---
OpenKeychain/src/main/res/layout/certify_key_activity.xml | 1 +
1 file changed, 1 insertion(+)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/layout/certify_key_activity.xml b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
index 0f8588737..6fd047187 100644
--- a/OpenKeychain/src/main/res/layout/certify_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
@@ -41,6 +41,7 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
+ android:layout_marginLeft="8dp"
android:shrinkColumns="1">
Date: Wed, 7 May 2014 14:17:18 +0200
Subject: Design fixes for certification activity
---
.../keychain/ui/ViewCertActivity.java | 87 +++++++++++-----------
.../src/main/res/layout/view_cert_activity.xml | 29 +++++++-
OpenKeychain/src/main/res/menu/view_cert.xml | 9 ---
OpenKeychain/src/main/res/values/strings.xml | 1 +
4 files changed, 71 insertions(+), 55 deletions(-)
delete mode 100644 OpenKeychain/src/main/res/menu/view_cert.xml
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
index 645766287..f78c30820 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
@@ -28,7 +28,6 @@ import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateFormat;
-import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
@@ -76,11 +75,12 @@ public class ViewCertActivity extends ActionBarActivity
private Uri mDataUri;
- private long mSignerKeyId;
+ private long mCertifierKeyId;
- private TextView mSigneeKey, mSigneeUid, mAlgorithm, mType, mRReason, mCreation;
- private TextView mSignerKey, mSignerUid, mStatus;
+ private TextView mSigneeKey, mSigneeUid, mAlgorithm, mType, mReason, mCreation;
+ private TextView mCertifierKey, mCertifierUid, mStatus;
private View mRowReason;
+ private View mViewCertifierButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -96,14 +96,16 @@ public class ViewCertActivity extends ActionBarActivity
mSigneeUid = (TextView) findViewById(R.id.signee_uid);
mAlgorithm = (TextView) findViewById(R.id.algorithm);
mType = (TextView) findViewById(R.id.signature_type);
- mRReason = (TextView) findViewById(R.id.reason);
+ mReason = (TextView) findViewById(R.id.reason);
mCreation = (TextView) findViewById(R.id.creation);
- mSignerKey = (TextView) findViewById(R.id.signer_key_id);
- mSignerUid = (TextView) findViewById(R.id.signer_uid);
+ mCertifierKey = (TextView) findViewById(R.id.signer_key_id);
+ mCertifierUid = (TextView) findViewById(R.id.signer_uid);
mRowReason = findViewById(R.id.row_reason);
+ mViewCertifierButton = findViewById(R.id.view_cert_view_cert_key);
+
mDataUri = getIntent().getData();
if (mDataUri == null) {
Log.e(Constants.TAG, "Intent data missing. Should be Uri of key!");
@@ -133,15 +135,15 @@ public class ViewCertActivity extends ActionBarActivity
Date creationDate = new Date(data.getLong(INDEX_CREATION) * 1000);
mCreation.setText(DateFormat.getDateFormat(getApplicationContext()).format(creationDate));
- mSignerKeyId = data.getLong(INDEX_KEY_ID_CERTIFIER);
- String signerKey = PgpKeyHelper.convertKeyIdToHex(mSignerKeyId);
- mSignerKey.setText(signerKey);
+ mCertifierKeyId = data.getLong(INDEX_KEY_ID_CERTIFIER);
+ String certifierKey = PgpKeyHelper.convertKeyIdToHex(mCertifierKeyId);
+ mCertifierKey.setText(certifierKey);
- String signerUid = data.getString(INDEX_SIGNER_UID);
- if (signerUid != null) {
- mSignerUid.setText(signerUid);
+ String certifierUid = data.getString(INDEX_SIGNER_UID);
+ if (certifierUid != null) {
+ mCertifierUid.setText(certifierUid);
} else {
- mSignerUid.setText(R.string.unknown_uid);
+ mCertifierUid.setText(R.string.unknown_uid);
}
PGPSignature sig = PgpConversionHelper.BytesToPGPSignature(data.getBlob(INDEX_DATA));
@@ -149,10 +151,12 @@ public class ViewCertActivity extends ActionBarActivity
ProviderHelper providerHelper = new ProviderHelper(this);
PGPKeyRing signeeRing = providerHelper.getPGPKeyRing(
KeychainContract.KeyRingData.buildPublicKeyRingUri(
- Long.toString(data.getLong(INDEX_MASTER_KEY_ID))));
+ Long.toString(data.getLong(INDEX_MASTER_KEY_ID)))
+ );
PGPKeyRing signerRing = providerHelper.getPGPKeyRing(
KeychainContract.KeyRingData.buildPublicKeyRingUri(
- Long.toString(sig.getKeyID())));
+ Long.toString(sig.getKeyID()))
+ );
try {
sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider(
@@ -203,25 +207,39 @@ public class ViewCertActivity extends ActionBarActivity
p = new RevocationReason(false, p.getData());
}
String reason = ((RevocationReason) p).getRevocationDescription();
- mRReason.setText(reason);
+ mReason.setText(reason);
mRowReason.setVisibility(View.VISIBLE);
}
break;
}
}
}
- }
- @Override
- public void onLoaderReset(Loader loader) {
- }
+ // can't do this before the data is initialized
+ mViewCertifierButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent viewIntent = new Intent(ViewCertActivity.this, ViewKeyActivity.class);
+ try {
+ ProviderHelper providerHelper = new ProviderHelper(ViewCertActivity.this);
+ long signerMasterKeyId = providerHelper.getMasterKeyId(
+ KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mCertifierKeyId))
+ );
+ viewIntent.setData(KeyRings.buildGenericKeyRingUri(
+ Long.toString(signerMasterKeyId))
+ );
+ startActivity(viewIntent);
+ } catch (ProviderHelper.NotFoundException e) {
+ // TODO notify user of this, maybe offer download?
+ Log.e(Constants.TAG, "key not found!", e);
+ }
+ }
+ });
+ }
@Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.view_cert, menu);
- return true;
+ public void onLoaderReset(Loader loader) {
}
@Override
@@ -233,25 +251,6 @@ public class ViewCertActivity extends ActionBarActivity
NavUtils.navigateUpTo(this, viewIntent);
return true;
}
- case R.id.menu_view_cert_view_signer:
- // can't do this before the data is initialized
- Intent viewIntent = new Intent(this, ViewKeyActivity.class);
-
- try {
- ProviderHelper providerHelper = new ProviderHelper(this);
- long signerMasterKeyId = providerHelper.getMasterKeyId(
- KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mSignerKeyId))
- );
- viewIntent.setData(KeyRings.buildGenericKeyRingUri(
- Long.toString(signerMasterKeyId))
- );
- startActivity(viewIntent);
- } catch (ProviderHelper.NotFoundException e) {
- // TODO notify user of this, maybe offer download?
- Log.e(Constants.TAG, "key not found!", e);
- }
-
- return true;
}
return super.onOptionsItemSelected(item);
}
diff --git a/OpenKeychain/src/main/res/layout/view_cert_activity.xml b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
index 264b84239..12357fa0c 100644
--- a/OpenKeychain/src/main/res/layout/view_cert_activity.xml
+++ b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
@@ -44,6 +44,7 @@
@@ -164,6 +165,8 @@
@@ -192,17 +195,39 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingRight="10dip"
- android:text="@string/label_email" />
+ android:text="@string/label_user_id" />
+ android:paddingRight="5dip" />
+
+
+
+
diff --git a/OpenKeychain/src/main/res/menu/view_cert.xml b/OpenKeychain/src/main/res/menu/view_cert.xml
deleted file mode 100644
index 8c8e455c7..000000000
--- a/OpenKeychain/src/main/res/menu/view_cert.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 11ca869ff..02889eac2 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -69,6 +69,7 @@
Show advanced settingsHide advanced settingsShare encrypted/signed message…
+ View certification keySettings
--
cgit v1.2.3
From e14ce09186cde662ec24312a1722692cac25d5c3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 14:33:20 +0200
Subject: Better handling of actionbars back
---
OpenKeychain/src/main/AndroidManifest.xml | 14 ++++++++--
.../keychain/helper/ActionBarHelper.java | 19 --------------
.../keychain/ui/CertifyKeyActivity.java | 26 ++++++++++++++-----
.../keychain/ui/DecryptActivity.java | 4 ---
.../keychain/ui/EncryptActivity.java | 30 ++++++++++++----------
.../keychain/ui/ImportKeysActivity.java | 2 --
.../keychain/ui/UploadKeyActivity.java | 15 +++++++++++
.../src/main/res/layout/view_cert_activity.xml | 6 ++---
8 files changed, 65 insertions(+), 51 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index caefafb54..c3ef16409 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -232,7 +232,12 @@
+ android:label="@string/title_send_key"
+ android:parentActivityName=".ui.ViewKeyActivity">
+
+
+ android:label="@string/title_certify_key"
+ android:parentActivityName=".ui.ViewKeyActivity">
+
+
adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, Preferences.getPreferences(this)
- .getKeyServers());
+ .getKeyServers()
+ );
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSelectKeyserverSpinner.setAdapter(adapter);
@@ -258,7 +256,8 @@ public class CertifyKeyActivity extends ActionBarActivity implements
startSigning();
}
}
- });
+ }
+ );
// bail out; need to wait until the user has entered the passphrase before trying again
return;
} else {
@@ -392,4 +391,17 @@ public class CertifyKeyActivity extends ActionBarActivity implements
public void onKeySelected(long secretKeyId) {
mMasterKeyId = secretKeyId;
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ Intent viewIntent = NavUtils.getParentActivityIntent(this);
+ viewIntent.setData(KeyRings.buildGenericKeyRingUri(mDataUri));
+ NavUtils.navigateUpTo(this, viewIntent);
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
index 1877a43b5..5b21be6e4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
@@ -27,7 +27,6 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
@@ -68,9 +67,6 @@ public class DecryptActivity extends DrawerActivity {
setContentView(R.layout.decrypt_activity);
- // set actionbar without home button if called from another app
- ActionBarHelper.setBackButton(this);
-
initView();
setupDrawerNavigation(savedInstanceState);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
index 6c71c641f..39d4a09bc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
@@ -27,7 +27,6 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.util.Log;
@@ -145,26 +144,28 @@ public class EncryptActivity extends DrawerActivity implements
setContentView(R.layout.encrypt_activity);
- // set actionbar without home button if called from another app
- ActionBarHelper.setBackButton(this);
-
initView();
- setupDrawerNavigation(savedInstanceState);
+ // if called with an intent action, do not init drawer navigation
+ if (ACTION_ENCRYPT.equals(getIntent().getAction())) {
+ // TODO: back button to key?
+ } else {
+ setupDrawerNavigation(savedInstanceState);
+ }
// Handle intent actions
handleActions(getIntent());
mTabsAdapterMode.addTab(EncryptAsymmetricFragment.class,
- mAsymmetricFragmentBundle, getString(R.string.label_asymmetric));
+ mAsymmetricFragmentBundle, getString(R.string.label_asymmetric));
mTabsAdapterMode.addTab(EncryptSymmetricFragment.class,
- mSymmetricFragmentBundle, getString(R.string.label_symmetric));
+ mSymmetricFragmentBundle, getString(R.string.label_symmetric));
mViewPagerMode.setCurrentItem(mSwitchToMode);
mTabsAdapterContent.addTab(EncryptMessageFragment.class,
- mMessageFragmentBundle, getString(R.string.label_message));
+ mMessageFragmentBundle, getString(R.string.label_message));
mTabsAdapterContent.addTab(EncryptFileFragment.class,
- mFileFragmentBundle, getString(R.string.label_file));
+ mFileFragmentBundle, getString(R.string.label_file));
mViewPagerContent.setCurrentItem(mSwitchToContent);
}
@@ -217,9 +218,9 @@ public class EncryptActivity extends DrawerActivity implements
// preselect keys given by intent
mAsymmetricFragmentBundle.putLongArray(EncryptAsymmetricFragment.ARG_ENCRYPTION_KEY_IDS,
- encryptionKeyIds);
+ encryptionKeyIds);
mAsymmetricFragmentBundle.putLong(EncryptAsymmetricFragment.ARG_SIGNATURE_KEY_ID,
- signatureKeyId);
+ signatureKeyId);
mSwitchToMode = PAGER_MODE_ASYMMETRIC;
/**
@@ -241,9 +242,10 @@ public class EncryptActivity extends DrawerActivity implements
} else {
Log.e(Constants.TAG,
"Direct binary data without actual file in filesystem is not supported " +
- "by Intents. Please use the Remote Service API!");
- Toast.makeText(this, R.string.error_only_files_are_supported, Toast.LENGTH_LONG)
- .show();
+ "by Intents. Please use the Remote Service API!"
+ );
+ Toast.makeText(this, R.string.error_only_files_are_supported,
+ Toast.LENGTH_LONG).show();
// end activity
finish();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index 66224dd0b..f71ef6d46 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -43,7 +43,6 @@ import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
@@ -125,7 +124,6 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) {
setTitle(R.string.nav_import);
} else {
- ActionBarHelper.setBackButton(this);
getSupportActionBar().setDisplayShowTitleEnabled(false);
// set drop down navigation
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
index 97a2af645..90783aa8b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -23,7 +23,9 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
+import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
@@ -129,4 +131,17 @@ public class UploadKeyActivity extends ActionBarActivity {
// start service with intent
startService(intent);
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ Intent viewIntent = NavUtils.getParentActivityIntent(this);
+ viewIntent.setData(KeychainContract.KeyRings.buildGenericKeyRingUri(mDataUri));
+ NavUtils.navigateUpTo(this, viewIntent);
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
diff --git a/OpenKeychain/src/main/res/layout/view_cert_activity.xml b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
index 12357fa0c..66c635599 100644
--- a/OpenKeychain/src/main/res/layout/view_cert_activity.xml
+++ b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
@@ -42,7 +42,7 @@
android:text="@string/section_cert" />
--
cgit v1.2.3
From 2a33eae9ebad8b24326ad30b262e6062f47be80f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 14:53:35 +0200
Subject: GET_KEY: also return PendingIntent to key view
---
.../sufficientlysecure/keychain/remote/OpenPgpService.java | 11 ++++++++++-
.../org/sufficientlysecure/keychain/ui/ViewKeyActivity.java | 2 +-
2 files changed, 11 insertions(+), 2 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
index 1e0cfaa8e..5691d2fe2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -42,6 +42,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.ui.ImportKeysActivity;
+import org.sufficientlysecure.keychain.ui.ViewKeyActivity;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
@@ -417,7 +418,15 @@ public class OpenPgpService extends RemoteService {
Intent result = new Intent();
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- // TODO: also return PendingIntent that opens the key view activity
+ // also return PendingIntent that opens the key view activity
+ Intent intent = new Intent(getBaseContext(), ViewKeyActivity.class);
+ intent.setData(KeyRings.buildGenericKeyRingUri(Long.toString(masterKeyId)));
+
+ PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
+ intent,
+ PendingIntent.FLAG_CANCEL_CURRENT);
+
+ result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
return result;
} catch (ProviderHelper.NotFoundException e) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 1955c122d..8c52e6f22 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -67,7 +67,7 @@ public class ViewKeyActivity extends ActionBarActivity implements
protected Uri mDataUri;
- public static final String EXTRA_SELECTED_TAB = "selectedTab";
+ public static final String EXTRA_SELECTED_TAB = "selected_tab";
public static final int TAB_MAIN = 0;
public static final int TAB_SHARE = 1;
public static final int TAB_KEYS = 2;
--
cgit v1.2.3
From b771276611b98e167242dd790416811ff2966a47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 15:03:24 +0200
Subject: Start app menu item for registered apps
---
.../keychain/remote/ui/AppSettingsActivity.java | 28 ++++++++++++++++++---
.../src/main/res/drawable-hdpi/ic_action_play.png | Bin 0 -> 497 bytes
.../src/main/res/drawable-mdpi/ic_action_play.png | Bin 0 -> 375 bytes
.../src/main/res/drawable-xhdpi/ic_action_play.png | Bin 0 -> 531 bytes
.../main/res/drawable-xxhdpi/ic_action_play.png | Bin 0 -> 778 bytes
.../src/main/res/menu/api_app_settings.xml | 6 +++++
OpenKeychain/src/main/res/values/strings.xml | 1 +
7 files changed, 31 insertions(+), 4 deletions(-)
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
index c6637c058..8df341f9e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
@@ -40,6 +40,9 @@ public class AppSettingsActivity extends ActionBarActivity {
private AppSettingsFragment mSettingsFragment;
private AccountsListFragment mAccountsListFragment;
+ // model
+ AppSettings mAppSettings;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -80,22 +83,39 @@ public class AppSettingsActivity extends ActionBarActivity {
case R.id.menu_api_settings_revoke:
revokeAccess();
return true;
+ case R.id.menu_api_settings_start:
+ startApp();
+ return true;
}
return super.onOptionsItemSelected(item);
}
+ private void startApp() {
+ Intent i;
+ PackageManager manager = getPackageManager();
+ try {
+ i = manager.getLaunchIntentForPackage(mAppSettings.getPackageName());
+ if (i == null)
+ throw new PackageManager.NameNotFoundException();
+ i.addCategory(Intent.CATEGORY_LAUNCHER);
+ startActivity(i);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(Constants.TAG, "startApp", e);
+ }
+ }
+
private void loadData(Bundle savedInstanceState, Uri appUri) {
- AppSettings settings = new ProviderHelper(this).getApiAppSettings(appUri);
- mSettingsFragment.setAppSettings(settings);
+ mAppSettings = new ProviderHelper(this).getApiAppSettings(appUri);
+ mSettingsFragment.setAppSettings(mAppSettings);
String appName;
PackageManager pm = getPackageManager();
try {
- ApplicationInfo ai = pm.getApplicationInfo(settings.getPackageName(), 0);
+ ApplicationInfo ai = pm.getApplicationInfo(mAppSettings.getPackageName(), 0);
appName = (String) pm.getApplicationLabel(ai);
} catch (PackageManager.NameNotFoundException e) {
// fallback
- appName = settings.getPackageName();
+ appName = mAppSettings.getPackageName();
}
setTitle(appName);
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png
new file mode 100644
index 000000000..869f0014b
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png
new file mode 100644
index 000000000..5f3bf86fd
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png
new file mode 100644
index 000000000..7f709bbf1
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png
new file mode 100644
index 000000000..df5994710
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png differ
diff --git a/OpenKeychain/src/main/res/menu/api_app_settings.xml b/OpenKeychain/src/main/res/menu/api_app_settings.xml
index a21db6708..1233e4f6e 100644
--- a/OpenKeychain/src/main/res/menu/api_app_settings.xml
+++ b/OpenKeychain/src/main/res/menu/api_app_settings.xml
@@ -2,6 +2,12 @@
+
+
SaveCancelRevoke access
+ Start applicationDelete accountPackage NameSHA-256 of Package Signature
--
cgit v1.2.3
From 377edfb31090eaa948852d264614817749febd23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 15:40:19 +0200
Subject: Remove code for sharing whole key via qr code
---
.../keychain/ui/ViewKeyShareFragment.java | 3 +-
.../ui/dialog/ShareQrCodeDialogFragment.java | 142 +++------------------
2 files changed, 16 insertions(+), 129 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
index fce402136..1a76f5eed 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
@@ -201,8 +201,7 @@ public class ViewKeyShareFragment extends Fragment implements
}
private void showQrCodeDialog() {
- ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(mDataUri,
- true);
+ ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(mDataUri);
dialog.show(ViewKeyShareFragment.this.getActivity().getSupportFragmentManager(), "shareQrCodeDialog");
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
index fe50c759b..1b998ec8d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
@@ -25,7 +25,6 @@ import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
@@ -34,37 +33,26 @@ import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.QrCodeUtils;
-import java.io.IOException;
-import java.util.ArrayList;
-
public class ShareQrCodeDialogFragment extends DialogFragment {
private static final String ARG_KEY_URI = "uri";
- private static final String ARG_FINGERPRINT_ONLY = "fingerprint_only";
private ImageView mImage;
private TextView mText;
- private boolean mFingerprintOnly;
-
- private ArrayList mContentList;
- private int mCounter;
-
private static final int QR_CODE_SIZE = 1000;
/**
* Creates new instance of this dialog fragment
*/
- public static ShareQrCodeDialogFragment newInstance(Uri dataUri, boolean fingerprintOnly) {
+ public static ShareQrCodeDialogFragment newInstance(Uri dataUri) {
ShareQrCodeDialogFragment frag = new ShareQrCodeDialogFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_KEY_URI, dataUri);
- args.putBoolean(ARG_FINGERPRINT_ONLY, fingerprintOnly);
frag.setArguments(args);
@@ -79,7 +67,6 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
final Activity activity = getActivity();
Uri dataUri = getArguments().getParcelable(ARG_KEY_URI);
- mFingerprintOnly = getArguments().getBoolean(ARG_FINGERPRINT_ONLY);
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
alert.setTitle(R.string.share_qr_code_dialog_title);
@@ -94,45 +81,21 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
ProviderHelper providerHelper = new ProviderHelper(getActivity());
String content;
try {
- if (mFingerprintOnly) {
- alert.setPositiveButton(R.string.btn_okay, null);
-
- byte[] blob = (byte[]) providerHelper.getGenericData(
- KeyRings.buildUnifiedKeyRingUri(dataUri),
- KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
- if (blob == null) {
- Log.e(Constants.TAG, "key not found!");
- AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
- return null;
- }
-
- String fingerprint = PgpKeyHelper.convertFingerprintToHex(blob);
- mText.setText(getString(R.string.share_qr_code_dialog_fingerprint_text) + " " + fingerprint);
- content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
- setQrCode(content);
- } else {
- mText.setText(R.string.share_qr_code_dialog_start);
-
- try {
- Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
- content = providerHelper.getKeyRingAsArmoredString(uri);
- } catch (IOException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT).show();
- return null;
- }
-
- // OnClickListener are set in onResume to prevent automatic dismissing of Dialogs
- // http://bit.ly/O5vfaR
- alert.setPositiveButton(R.string.btn_next, null);
- alert.setNegativeButton(android.R.string.cancel, null);
-
- mContentList = splitString(content, 1000);
-
- // start with first
- mCounter = 0;
- updatePartsQrCode();
+ alert.setPositiveButton(R.string.btn_okay, null);
+
+ byte[] blob = (byte[]) providerHelper.getGenericData(
+ KeyRings.buildUnifiedKeyRingUri(dataUri),
+ KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
+ if (blob == null) {
+ Log.e(Constants.TAG, "key not found!");
+ AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
+ return null;
}
+
+ String fingerprint = PgpKeyHelper.convertFingerprintToHex(blob);
+ mText.setText(getString(R.string.share_qr_code_dialog_fingerprint_text) + " " + fingerprint);
+ content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ setQrCode(content);
} catch (ProviderHelper.NotFoundException e) {
Log.e(Constants.TAG, "key not found!", e);
AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
@@ -142,83 +105,8 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
return alert.create();
}
- @Override
- public void onResume() {
- super.onResume();
-
- if (!mFingerprintOnly) {
- AlertDialog alertDialog = (AlertDialog) getDialog();
- final Button backButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
- final Button nextButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-
- backButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mCounter > 0) {
- mCounter--;
- updatePartsQrCode();
- updateDialog(backButton, nextButton);
- } else {
- dismiss();
- }
- }
- });
- nextButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
-
- if (mCounter < mContentList.size() - 1) {
- mCounter++;
- updatePartsQrCode();
- updateDialog(backButton, nextButton);
- } else {
- dismiss();
- }
- }
- });
- }
- }
-
- private void updatePartsQrCode() {
- // Content: ,,
- setQrCode(mCounter + "," + mContentList.size() + "," + mContentList.get(mCounter));
- }
-
private void setQrCode(String data) {
mImage.setImageBitmap(QrCodeUtils.getQRCodeBitmap(data, QR_CODE_SIZE));
}
- private void updateDialog(Button backButton, Button nextButton) {
- if (mCounter == 0) {
- backButton.setText(android.R.string.cancel);
- } else {
- backButton.setText(R.string.btn_back);
- }
- if (mCounter == mContentList.size() - 1) {
- nextButton.setText(android.R.string.ok);
- } else {
- nextButton.setText(R.string.btn_next);
- }
-
- mText.setText(getResources().getString(R.string.share_qr_code_dialog_progress,
- mCounter + 1, mContentList.size()));
- }
-
- /**
- * Split String by number of characters
- *
- * @param text
- * @param size
- * @return
- */
- private ArrayList splitString(String text, int size) {
- ArrayList strings = new ArrayList();
- int index = 0;
- while (index < text.length()) {
- strings.add(text.substring(index, Math.min(index + size, text.length())));
- index += size;
- }
-
- return strings;
- }
}
--
cgit v1.2.3
From b4a9d1a2db941a66bade5be2e12fe3ea7f1a3f26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 7 May 2014 18:31:31 +0200
Subject: Add applications section to help
---
.../keychain/remote/ui/RemoteServiceActivity.java | 4 ++--
.../keychain/ui/HelpAboutFragment.java | 2 +-
.../keychain/ui/HelpHtmlFragment.java | 2 +-
.../keychain/ui/dialog/ShareNfcDialogFragment.java | 2 +-
.../main/res/drawable-xxhdpi/apps_conversations.png | Bin 0 -> 3272 bytes
.../src/main/res/drawable-xxhdpi/apps_k9.png | Bin 0 -> 15207 bytes
OpenKeychain/src/main/res/raw-de/help_start.html | 19 -------------------
OpenKeychain/src/main/res/raw/help_start.html | 5 +++++
OpenKeychain/src/main/res/values/strings.xml | 2 +-
9 files changed, 11 insertions(+), 25 deletions(-)
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png
delete mode 100644 OpenKeychain/src/main/res/raw-de/help_start.html
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
index 2fd1ad3b5..d0b958844 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
@@ -250,7 +250,7 @@ public class RemoteServiceActivity extends ActionBarActivity {
// set text on view
HtmlTextView textView = (HtmlTextView) findViewById(R.id.api_select_pub_keys_text);
- textView.setHtmlFromString(text);
+ textView.setHtmlFromString(text, true);
/* Load select pub keys fragment */
// Check that the activity is using the layout version with
@@ -292,7 +292,7 @@ public class RemoteServiceActivity extends ActionBarActivity {
// set text on view
HtmlTextView textView = (HtmlTextView) findViewById(R.id.api_app_error_message_text);
- textView.setHtmlFromString(text);
+ textView.setHtmlFromString(text, true);
} else {
Log.e(Constants.TAG, "Action does not exist!");
setResult(RESULT_CANCELED);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java
index ec9f3a759..5909970af 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java
@@ -45,7 +45,7 @@ public class HelpAboutFragment extends Fragment {
HtmlTextView aboutTextView = (HtmlTextView) view.findViewById(R.id.help_about_text);
// load html from raw resource (Parsing handled by HtmlTextView library)
- aboutTextView.setHtmlFromRawResource(getActivity(), R.raw.help_about);
+ aboutTextView.setHtmlFromRawResource(getActivity(), R.raw.help_about, true);
// no flickering when clicking textview for Android < 4
aboutTextView.setTextColor(getResources().getColor(android.R.color.black));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java
index 98c84e5e3..a3f0ef614 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java
@@ -66,7 +66,7 @@ public class HelpHtmlFragment extends Fragment {
scroller.addView(text);
// load html from raw resource (Parsing handled by HtmlTextView library)
- text.setHtmlFromRawResource(getActivity(), mHtmlFile);
+ text.setHtmlFromRawResource(getActivity(), mHtmlFile, true);
// no flickering when clicking textview for Android < 4
text.setTextColor(getResources().getColor(android.R.color.black));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
index 15df53dcc..cd2364d7c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
@@ -78,7 +78,7 @@ public class ShareNfcDialogFragment extends DialogFragment {
+ getString(R.string.error_nfc_needed));
} else {
// nfc works...
- textView.setHtmlFromRawResource(getActivity(), R.raw.nfc_beam_share);
+ textView.setHtmlFromRawResource(getActivity(), R.raw.nfc_beam_share, true);
alert.setNegativeButton(R.string.menu_beam_preferences,
new DialogInterface.OnClickListener() {
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png
new file mode 100644
index 000000000..9dbbdd971
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png
new file mode 100644
index 000000000..970c536b7
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png differ
diff --git a/OpenKeychain/src/main/res/raw-de/help_start.html b/OpenKeychain/src/main/res/raw-de/help_start.html
deleted file mode 100644
index f21fc2141..000000000
--- a/OpenKeychain/src/main/res/raw-de/help_start.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
Los gehts
-
First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.
-
-
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
-
-
-
diff --git a/OpenKeychain/src/main/res/raw/help_start.html b/OpenKeychain/src/main/res/raw/help_start.html
index 4b2bdf722..0a1da56f4 100644
--- a/OpenKeychain/src/main/res/raw/help_start.html
+++ b/OpenKeychain/src/main/res/raw/help_start.html
@@ -10,6 +10,11 @@ And don't add newlines before or after p tags because of transifex -->
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index fd9920cfe..4d39b6273 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -413,7 +413,7 @@
Decrypt with OpenKeychain
- No registered applications!\n\nThird-party applications can request access to OpenKeychain. After granting access, they will be listed here.
+ No registered applications!\n\nA list of supported third-party applications can be found in \'Help\'!Show advanced informationHide advanced informationShow advanced settings
--
cgit v1.2.3
From 346b5dbb2821254ffc7052871e5ded3207edc29f Mon Sep 17 00:00:00 2001
From: Vincent Breitmoser
Date: Wed, 7 May 2014 22:41:09 +0200
Subject: Don't allow certification using keys where primary subkey is stripped
Closes #596
---
.../keychain/ui/SelectSecretKeyFragment.java | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java
index 6de03198e..38a0c8478 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java
@@ -56,7 +56,7 @@ public class SelectSecretKeyFragment extends ListFragment implements
Bundle args = new Bundle();
args.putBoolean(ARG_FILTER_CERTIFY, filterCertify);
- args.putBoolean(ARG_FILTER_CERTIFY, filterSign);
+ args.putBoolean(ARG_FILTER_SIGN, filterSign);
frag.setArguments(args);
return frag;
@@ -124,7 +124,8 @@ public class SelectSecretKeyFragment extends ListFragment implements
KeyRings.CAN_CERTIFY,
// has sign may be any subkey
KeyRings.HAS_SIGN,
- KeyRings.HAS_ANY_SECRET
+ KeyRings.HAS_ANY_SECRET,
+ KeyRings.HAS_SECRET
};
String where = KeyRings.HAS_ANY_SECRET + " = 1";
@@ -158,7 +159,7 @@ public class SelectSecretKeyFragment extends ListFragment implements
private class SelectSecretKeyCursorAdapter extends SelectKeyCursorAdapter {
- private int mIndexHasSign, mIndexCanCertify;
+ private int mIndexHasSign, mIndexCanCertify, mIndexHasSecret;
public SelectSecretKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) {
super(context, c, flags, listView);
@@ -170,6 +171,7 @@ public class SelectSecretKeyFragment extends ListFragment implements
if (cursor != null) {
mIndexCanCertify = cursor.getColumnIndexOrThrow(KeyRings.CAN_CERTIFY);
mIndexHasSign = cursor.getColumnIndexOrThrow(KeyRings.HAS_SIGN);
+ mIndexHasSecret = cursor.getColumnIndexOrThrow(KeyRings.HAS_SECRET);
}
}
@@ -187,7 +189,8 @@ public class SelectSecretKeyFragment extends ListFragment implements
// Check if key is viable for our purposes (certify or sign)
if(mFilterCertify) {
// Only enable if can certify
- if (cursor.getInt(mIndexCanCertify) == 0) {
+ if (cursor.getInt(mIndexCanCertify) == 0
+ || cursor.getInt(mIndexHasSecret) == 0) {
h.status.setText(R.string.can_certify_not);
} else {
h.status.setText(R.string.can_certify);
--
cgit v1.2.3
From 5c747a747f20fbbfeb31b60ed4d45ea96fa04f41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Thu, 8 May 2014 11:30:16 +0200
Subject: Update from transifex
---
.../src/main/res/raw-cs-rCZ/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-de/help_start.html | 24 ++++++++++++++++++++++
OpenKeychain/src/main/res/raw-el/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-es/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-et/help_start.html | 5 +++++
.../src/main/res/raw-fa-rIR/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-fr/help_start.html | 5 +++++
.../src/main/res/raw-it-rIT/help_start.html | 5 +++++
.../src/main/res/raw-ja/help_changelog.html | 2 +-
OpenKeychain/src/main/res/raw-ja/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-ko/help_start.html | 5 +++++
.../src/main/res/raw-nl-rNL/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-pl/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-ru/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-sl/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-tr/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-uk/help_start.html | 5 +++++
OpenKeychain/src/main/res/raw-zh/help_start.html | 5 +++++
OpenKeychain/src/main/res/values-de/strings.xml | 10 +++++----
OpenKeychain/src/main/res/values-es/strings.xml | 19 ++++++++++++++++-
OpenKeychain/src/main/res/values-fr/strings.xml | 19 ++++++++++++++++-
.../src/main/res/values-it-rIT/strings.xml | 19 ++++++++++++++++-
OpenKeychain/src/main/res/values-ja/strings.xml | 21 +++++++++++++++++--
OpenKeychain/src/main/res/values-pl/strings.xml | 1 -
OpenKeychain/src/main/res/values-ru/strings.xml | 1 -
OpenKeychain/src/main/res/values-sl/strings.xml | 19 ++++++++++++++++-
OpenKeychain/src/main/res/values-uk/strings.xml | 1 -
27 files changed, 202 insertions(+), 14 deletions(-)
create mode 100644 OpenKeychain/src/main/res/raw-de/help_start.html
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html b/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html
+++ b/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html
@@ -6,6 +6,11 @@
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.
+
+
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Es recomendable que instales OI File Manager para una mejor selección de archivos y Barcode Scanner para escanear los códigos QR generados. Pulsando en los enlaces se abrirá Google Play o F-Droid.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Il vous est recommendé d'installer le gestionnaire de fichiers OI pour sa fonction améliorée de séléction des fichiers et le lecteur de codes à barres pour balayer les codes QR générés. Cliquer sur les liens ouvrira Google Play Store ou F-Droid pour l'installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Si raccomanda di installare OI File Manager per una migliore selezione dei file e Barcode Scanner per scansionare i codici QR. I collegamenti verranno aperti in Google Play Store o F-Droid per l'installazione.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Zalecana jest instalacja menadżera plików OI File Manager w celu zapewnienia wygodniejszego wyboru plików oraz programu Barcode Scanner, który jest w stanie skanować wygenerowane kody QR. Kliknięcie na powyższe linki przekieruje Cię do sklepu Google Play / F-Droid.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Рекомендуется установить OI File Manager для удобного выбора файлов и Barcode Scanner для распознавания QR кодов. Перейдите по ссылкам на соответствующие страницы Google Play или F-Droid для дальнейшей установки.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Priporočamo, da namestite aplikaciji OI File Manager za boljše delo z datotekami in Barcode Scanner za skeniranje kod QR. Klik na povezavi bo odprl trgovino Google Play Store ali F-Droid za namestitev.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
Рекомендуємо вам встановити OI File Manager для поліпшеного виділення файлів та Barcode Scanner для сканування згенерованих штрих-кодів. Натискання посилань відкриє Google Play або F-Droid для встановлення.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
+
Applications
+
Several applications support OpenKeychain to encrypt/sign your private communication:
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index b33506438..04a35ab47 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -66,6 +66,7 @@
Erweiterte Einstellungen anzeigenErweiterte Einstellungen verbergenVerschlüsselt/signierten Text teilen…
+ Beglaubigungsschlüssel anzeigenEinstellungenHilfe
@@ -374,7 +375,6 @@
Mit OpenKeychain verschlüsselnMit OpenKeychain entschlüsseln
- Keine registrierten Anwendungen vorhanden!\n\nAnwendungen können Zugriff auf OpenKeychain anfordern. Nachdem Zugriff erlaubt wurde, werden diese hier aufgelistet.Erweiterte Informationen anzeigenErweiterte Informationen ausblendenErweiterte Einstellungen anzeigen
@@ -390,6 +390,7 @@
SHA-256 der PaketsignaturKontenKeine Accounts mit dieser App verknüpft.
+ Die Anwendung erfordert die Erstellung eines neuen Accounts. Bitte wähle einen existierenden Schlüssel oder erstelle einen neuen.\nAnwendungen sind auf die Nutzung der Schlüssel beschränkt, die du hier auswählst!Folgende Anwendung beantragt Zugriff auf OpenKeychains API.\nZugriff erlauben?\n\nVORSICHT: Sollten Sie nicht wissen, warum diese Anfrage erscheint, sollten Sie den Zugriff nicht erlauben! Sie können Zugriffe später über das Menü \'Registrierte Anwendungen\' widerrufen.Zugriff erlaubenZugriff verbieten
@@ -439,9 +440,9 @@
nicht verfügbarHier den Text schreiben welche verschlüsselt und/oder signiert werden soll...
- Hier den verschlüsselten Text eingeben um ihn zu entschlüsseln und/oder zu überprüfen
+ Hier den verschlüsselten Text eingeben um ihn zu entschlüsseln und/oder zu verifzieren…
- Grundeinstellung
+ normalkeineinfach überprüftpositiv
@@ -458,11 +459,12 @@
Keine Beglaubigungen für diesen SchlüsselZu beglaubigende IdentitätenWiderrufsgrund
- Verificationsstatus
+ VerifikationsstatusTypSchlüssel nicht gefunden!Fehler bei der Verarbeitung des Schlüssels!Unterschlüssel nicht verfügbar
+ nicht verfügbarGeheime Schlüssel können nur einzeln gelöscht werden!Zertifikatdetails anzeigenunbekannt
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index 17ac6c788..18d59f411 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -15,6 +15,7 @@
Establecer frase de contraseñaCompartir con...Compartir huella de validación de clave con...
+ Compartir clave con...Compartir fichero con...Cifrar hacia archivoDescifrar hacia archivo
@@ -23,6 +24,7 @@
Exportar clavesClave no encontradaCargar al servidor de claves
+ Certificar identidadesDetalles de la claveAyuda
@@ -34,15 +36,20 @@
Clave maestraIdentidad primariaAcciones
+ Clave completaTu clave usada para las certificacionesCargar claveServidor de clavesCifrar y/o firmarDescifrar y verificarHuella de validación de clave
+ Clave a ser certificadaCertificar
+ Descifrar, verificar, y guardar fichero
+ Descifrar y verificar mensajeDesde el portapapeles
+ Cifrar y guardar ficheroGuardarCancelarEliminar
@@ -58,6 +65,8 @@
Buscar claveMostrar ajustes avanzadosOcultar ajustes avanzados
+ Compartir mensaje cifrado/firmado...
+ Ver clave de verificaciónAjustesAyuda
@@ -229,11 +238,13 @@
%d malas claves secretas ignoradas. Quizás hayas exportado con la opción\n--export-secret-subkeys\nAsegúrate de que exportas con\n--export-secret-keys\nen su lugar.Clave cargada al servidor satisfactoriamente
+ Identidades certificadas con éxito¡Esta lista está vacía!¡Clave enviada con éxito vía NFC Beam (haz NFC)!¡La clave ha sido copiada al portapapeles!¡La huella de validación de clave se ha copiado al portapapeles!¡La clave ya ha sido certificada!
+ Por favor ¡seleccione una clave para ser usada en certificación!¡La clave es demasiado grande para ser compartida de esta forma!
- ¡No hay aplicaciones registradas!\n\nLas aplicaciones de terceros pueden pedir permiso de acceso a OpenKeychain. Después de obtener acceso, serán enumeradas aquí.Mostrar información avanzadaOcultar información avanzadaMostrar la configuración avanzada
@@ -411,8 +421,12 @@
Editar claveCifrar con esta claveCertificar identidades
+ Compartir con...
+ Compartir sobre NFC juntando los dispositivos por el reversoInformación principalCompartir
+ Subclaves
+ CertificadosClavesFirmar y cifrar
@@ -440,10 +454,12 @@
¡error!clave no disponible
+ CertificadorDetalles del certificadoIdentidad<desconocido>No hay certificados para esta clave
+ Identidades a certificarRazón de la revocaciónEstado de la verificaciónTipo
@@ -455,4 +471,5 @@
Ver detalles del certificadodesconocidono puede firmarse
+ ¡No hay subclave de cifrado disponible!
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index 78265110d..0c9b0cb8e 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -15,6 +15,7 @@
Définir la phrase de passePartager avec...Partager l\'empreinte avec...
+ Partager la clef avec...Partager le fichier avec...Chiffrer vers un fichierDéchiffrer vers un fichier
@@ -23,6 +24,7 @@
Exporter les clefsClef introuvableTéléverser vers le serveur de clefs
+ Certifier les identitésDétails sur la clefAide
@@ -34,15 +36,20 @@
Clef maîtresseIdentité principaleActions
+ Clef entièreVotre clef utilisée pour la certificationTéléverser la clefServeur de clefsChiffrer et/ou signerDéchiffrer et vérifierEmpreinte
+ Clef à certifier !Certifier
+ Déchiffrer, vérifier et enregistrer le fichier
+ Déchiffrer et enregistrer le messageÀ partir du presse-papiers
+ Chiffrer et enregistrer le fichierEnregistrerAnnulerSupprimer
@@ -58,6 +65,8 @@
Rechercher la clefAfficher les paramètres avancésMasquer les paramètres avancés
+ Partager le message chiffré/signé...
+ Voir la clef de certificationParamètresAide
@@ -229,11 +238,13 @@
%d mauvaises clefs ignorées. Vous avez peut-être exporté avec l\'option\n --export-secret-subkeys\nAssurez-vous d\'exporter plutôt avec\n --export-secret-keys.Clef téléversée vers le serveur avec succès
+ Identités certifiées avec succèsCette liste est vide !Clef envoyée par Beam NFC avec succès |La clef a été copié vers le presse-papiers !L\'empreinte a été copié vers le presse-papiers !La clef a déjà été certifiée !
+ Veuillez choisir une clef à utiliser pour la certification !La clef est trop grosse pour être partagée ainsi !
- Aucune application enregistrée !\n\nLes applications tierces peuvent demander l\'accès à OpenKeychain. Après avoir autorisé l\'accès, elles seront listées ici.Afficher les informations avancéesMasquer les informations avancéesAfficher les paramètres avancés
@@ -411,8 +421,12 @@
Modifier la clefChiffrer avec cette clefCertifier les identités
+ Partager avec...
+ Partager par NFC en tenant les appareils dos à dosInfos principalesPartager
+ Sous-clefs
+ CertificatsClefsSigner et chiffrer
@@ -440,10 +454,12 @@
erreur!clef non disponible
+ CertificateurDétails du certificatidentité<inconnu>Aucun certificat pour cette clef
+ Identités à certifierRaison de la révocationÉtat de vérificationType
@@ -455,4 +471,5 @@
Voir les détails du certificatinconnuimpossible de signer
+ Aucune sous-clef de chiffrement n\'est disponible !
diff --git a/OpenKeychain/src/main/res/values-it-rIT/strings.xml b/OpenKeychain/src/main/res/values-it-rIT/strings.xml
index ab159a923..b951bcf71 100644
--- a/OpenKeychain/src/main/res/values-it-rIT/strings.xml
+++ b/OpenKeychain/src/main/res/values-it-rIT/strings.xml
@@ -15,6 +15,7 @@
Imposta Frase di AccessoCondividi con...Condivi impronta con...
+ Condividi chiave con...Condividi file con...Codifica FileDecodifica File
@@ -23,6 +24,7 @@
Esporta ChiaviChiave Non TrovataCarica sul Server delle Chiavi
+ Certifica identitàDettagli ChiaveAiuto
@@ -34,15 +36,20 @@
Chiave PrincipaleIdentità PrimariaAzioni
+ Intera chiaveLa Tua Chiave usata per la certificazioneCarica ChiaveServer delle ChiaviCodifica e/o FirmaDecodifica e VerificaImpronta
+ Chiave da certificareCertifica
+ Decodifica, verifica e salva su file
+ Decodifica e verifica messaggioDagli Appunti
+ Codifica e salva fileSalvaAnnullaElimina
@@ -58,6 +65,8 @@
Chiave di ricercaMostra impostazioni avanzateNascondi impostazioni avanzate
+ Condividi messaggio codificato/firmato...
+ Mostra chiave di certificazioneImpostazioniAiuto
@@ -229,11 +238,13 @@
%d chiavi private non valide ignorate. Forse hai esportato con opzione\n--export-secret-subkeys\nAssicurati di esportare con\n--export-secret-keys\ninvece.Chiave caricata con successo sul server
+ Identità certificata correttamenteLista vuota!Chiave correttamente inviata tramite NFC Beam!Chiave copiata negli appunti!Impronta copiata negli appunti!La chiave è già certificata!
+ Per favore seleziona una chiave per la certificazione!Chiave troppo grande per essere condivisa in questo modo!
- Nessuna app registrata!\n\nApp di terze parti possono richiedere l\'accesso a OpenKeychain. Dopo aver concesso l\'accesso, le app saranno elencate qui.Mostra informazioni dettagliateNascondi informazioni dettagliateMostra impostazioni avanzate
@@ -411,8 +421,12 @@
Modifica chiaveCodifica con questa chiaveCertifica identità
+ Condividi con...
+ Condividi con NFC tenendo i dispositivi a stretto contattoInfo PrincipaleCondividi
+ Sottochiavi
+ CertificatiChiaviFirma e Codifica
@@ -440,10 +454,12 @@
errore!chiave non disponibile
+ CertificatoreDettagli CertificatoIdentit<sconosciuto>Nessun certificato per questa chiave
+ Identità da certificareRagione della RevocaStato VerificaTipo
@@ -455,4 +471,5 @@
Visualizza Dettagli Certificatisconosciutonon può firmare
+ Nessuna sottochiave di codifica disponibile!
diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml
index f22c2da62..a04441cfa 100644
--- a/OpenKeychain/src/main/res/values-ja/strings.xml
+++ b/OpenKeychain/src/main/res/values-ja/strings.xml
@@ -15,6 +15,7 @@
パスフレーズの設定...で共有...で指紋の共有
+ ...で鍵の共有...でファイルの共有暗号化してファイルに復号化してファイルに
@@ -23,6 +24,7 @@
複数鍵のエクスポート鍵が見当りません鍵サーバへアップロード
+ ユーザID検証鍵の概要ヘルプ
@@ -34,15 +36,20 @@
主鍵メインのユーザIDアクション
+ すべての鍵あなたの鍵を証明に利用します鍵のアップロード鍵サーバ暗号化/署名復号化と検証指紋
+ 鍵は検証されています。証明
+ 復号化と検証、そしてファイルの保存
+ メッセージの復号化と検証クリップボードから
+ 暗号化してファイルを保存保存キャンセル削除
@@ -58,6 +65,8 @@
鍵検出拡張設定を表示拡張設定を隠す
+ 暗号化/署名メッセージの共有...
+ 検証した鍵を見る設定ヘルプ
@@ -191,7 +200,7 @@
選択したすべての公開鍵を削除して本当に良いのですか?\nこれは元に戻せません!秘密鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!あなたは鍵輪に変更を加えました、これを保存しますか?
- あなたは空のユーザーIDを追加しました、このまま続けますか?
+ あなたは空のユーザIDを追加しました、このまま続けますか?公開鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!秘密鍵もエクスポートしますか?
@@ -220,11 +229,13 @@
%d の問題ある鍵を無視しました。 おそらく次のオプションでエクスポートしています\n --export-secret-subkeys\n代りに次のオプションでエクスポートしてください。\n --export-secret-keys鍵を鍵サーバにアップロードしました
+ ユーザIDの検証に成功このリストは空です!NFCビームで鍵を送信しました!鍵はクリプボードにコピーされました!指紋はクリプボードにコピーされました!鍵はすでに検証されています!
+ 検証に使う鍵を選択して下さい!この共有方法では鍵が大きすぎます!
- 登録されていないアプリケーション!\n\nサードパーティアプリケーションはOpenKeychainにアクセスを要求できます。アクセスを与えた後、それらはここにリストされます。詳細情報を表示詳細情報を非表示拡張設定を表示
@@ -397,8 +407,12 @@
鍵の編集この鍵で暗号化ユーザID検証
+ ...で共有
+ デバイスの後ろ同士を固定してNFC経由で共有情報共有
+ 副鍵
+ 証明鍵署名と暗号化
@@ -426,10 +440,12 @@
エラー!鍵がありません
+ 検証者証明の詳細ユーザID<不明>この鍵に証明がない
+ ユーザIDを検証破棄の理由検証ステータス種別
@@ -441,4 +457,5 @@
証明の詳細を見る不明署名不可
+ 暗号化の副鍵がありません!
diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml
index 542998eca..2f327c9bd 100644
--- a/OpenKeychain/src/main/res/values-pl/strings.xml
+++ b/OpenKeychain/src/main/res/values-pl/strings.xml
@@ -365,7 +365,6 @@
Zaszyfruj korzystając z OpenKeychainDeszyfruj korzystając z OpenKeychain
- Brak zarejestrowanych aplikacji!\n\nZewnętrzne aplikacje mogą żądać dostępu do OpenKeychain. Po przyznaniu dostępu, będa wyświetlone tutaj.Pokaż zaawansowane informacjeUkryj zaawansowane informacjePokaż zaawanowane ustawienia
diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml
index 326a6fe25..b51bcbde2 100644
--- a/OpenKeychain/src/main/res/values-ru/strings.xml
+++ b/OpenKeychain/src/main/res/values-ru/strings.xml
@@ -354,7 +354,6 @@
OpenKeychain: ЗашифроватьOpenKeychain: Расшифровать
- Нет связанных программ!\n\nСторонние программы могут запросить доступ к OpenKeychain, после чего они будут отражаться здесь.Показать подробную информациюСкрыть подробную информациюПоказать расширенные настройки
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index bd370094d..f80db4b6c 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -15,6 +15,7 @@
Določi gesloDeli z...Deli prstni odtis z...
+ Deli ključ z...Deli datoteko z...Šifriraj v datotekoDešifriraj v datoteko
@@ -23,6 +24,7 @@
Izvozi ključeKljuč ni bil najdenNaloži na strežnik
+ Overi identitetoPodrobnosti o ključuPomoč
@@ -34,15 +36,20 @@
Glavni ključGlavna identitetaRavnanja
+ Cel ključVaš ključ, uporabljan za overitevNaloži ključStrežnikŠifriraj in/ali podpišiDešifriraj in preveriPrstnim odtisom
+ Ključi za overjanjeOveri
+ Dešifriraj, preveri in shrani
+ Dešifriraj in preveri sporočiloIz odložišča
+ Šifriraj in shrani datotekoShraniPrekličiIzbriši
@@ -58,6 +65,8 @@
Išči ključPrikaži napredne nstavitveSkrij napredne nastavitve
+ Deli šifrirano/podpisano sporočilo...
+ Poglej ključ za overjanjeNastavitvePomoč
@@ -247,11 +256,13 @@
Neupoštevanih %d slabih zasebnih ključev. Morda so bili izvoženi na način\n --export-secret-subkeys\nPoskrbite, da bodo izvoženi z\n --export-secret-keysKljuč je bil uspešno naložen na strežnik.
+ Uspešno overjene identiteteLista je prazna!Ključ uspešno poslan preko NFC Beam!Ključ je bil prekopiran v odložišče!Prstni odtis je bil prekopiran v odložišče!Ključ je že bil overjen!
+ Izberite ključ, ki ga boste uporabljali za overjanje!Ključ je prevelik za delitev na ta način!
- Ni nobene prijavljene aplikacije!\n\nDruge aplikacije lahko zahtevajo dostop do aplikacije OpenKeychain. Po potrditvi dostopa bodo navedene tukaj.Pokaži dodatne informacijeSkrij dodatne informacijePokaži napredne nastavitve
@@ -439,8 +449,12 @@
Uredi ključŠifriraj s tem ključemOveri identitete
+ Deli z...
+ Deli preko NFC z držanjem hrbtov dveh telefonov skupajGlavne informacijeDeli
+ Podključi
+ CertifikatiKljučiPodpiši in šifriraj
@@ -468,10 +482,12 @@
napaka!ključ ni na voljo
+ OveroviteljPodrobnosti potrdilIdentiteta<neznan>Ni potrdil za ta ključ
+ Identitete za overitevRazlog za preklicStatus preverjanjaVrsta
@@ -483,4 +499,5 @@
Preglej podrobosti certifikataneznanne more podpisati
+ Ni nobenega podključa za šifriranje!
diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml
index 508737e00..54204a044 100644
--- a/OpenKeychain/src/main/res/values-uk/strings.xml
+++ b/OpenKeychain/src/main/res/values-uk/strings.xml
@@ -348,7 +348,6 @@
Зашифрувати з OpenKeychainРозшифрувати з OpenKeychain
- Нема зареєстрованих програм!\n\nСтороні програми можуть вимагати доступ до OpenPGP Keychain. Після надання доступу вони будуть наведені тут.Показати додаткову інформаціюПриховати додаткову інформаціюПоказати додаткові налаштування
--
cgit v1.2.3
From 596478a21297888c561276b081eb70fbd29e66ab Mon Sep 17 00:00:00 2001
From: Vincent Breitmoser
Date: Thu, 8 May 2014 13:39:59 +0200
Subject: extract generic LoaderFragment superclass from KeyList
---
.../keychain/ui/KeyListFragment.java | 71 ++---------
.../keychain/ui/LoaderFragment.java | 78 ++++++++++++
.../src/main/res/layout/key_list_fragment.xml | 137 ++++++++-------------
OpenKeychain/src/main/res/layout/loader_layout.xml | 39 ++++++
4 files changed, 181 insertions(+), 144 deletions(-)
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java
create mode 100644 OpenKeychain/src/main/res/layout/loader_layout.xml
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index 5464a9b96..3fd958bcc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -29,7 +29,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -45,10 +44,8 @@ import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
-import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -78,18 +75,13 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
* Public key list with sticky list headers. It does _not_ extend ListFragment because it uses
* StickyListHeaders library which does not extend upon ListView.
*/
-public class KeyListFragment extends Fragment
+public class KeyListFragment extends LoaderFragment
implements SearchView.OnQueryTextListener, AdapterView.OnItemClickListener,
LoaderManager.LoaderCallbacks {
private KeyListAdapter mAdapter;
private StickyListHeadersListView mStickyList;
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- boolean mListShown;
- View mProgressContainer;
- View mListContainer;
-
private String mCurQuery;
private SearchView mSearchView;
// empty list layout
@@ -101,14 +93,15 @@ public class KeyListFragment extends Fragment
* Load custom layout with StickyListView from library
*/
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View root = inflater.inflate(R.layout.key_list_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.key_list_fragment, getContainer());
- mStickyList = (StickyListHeadersListView) root.findViewById(R.id.key_list_list);
+ mStickyList = (StickyListHeadersListView) view.findViewById(R.id.key_list_list);
mStickyList.setOnItemClickListener(this);
// empty view
- mButtonEmptyCreate = (BootstrapButton) root.findViewById(R.id.key_list_empty_button_create);
+ mButtonEmptyCreate = (BootstrapButton) view.findViewById(R.id.key_list_empty_button_create);
mButtonEmptyCreate.setOnClickListener(new OnClickListener() {
@Override
@@ -120,7 +113,7 @@ public class KeyListFragment extends Fragment
startActivityForResult(intent, 0);
}
});
- mButtonEmptyImport = (BootstrapButton) root.findViewById(R.id.key_list_empty_button_import);
+ mButtonEmptyImport = (BootstrapButton) view.findViewById(R.id.key_list_empty_button_import);
mButtonEmptyImport.setOnClickListener(new OnClickListener() {
@Override
@@ -131,11 +124,6 @@ public class KeyListFragment extends Fragment
}
});
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- mListContainer = root.findViewById(R.id.key_list_list_container);
- mProgressContainer = root.findViewById(R.id.key_list_progress_container);
- mListShown = true;
-
return root;
}
@@ -234,9 +222,8 @@ public class KeyListFragment extends Fragment
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
- // NOTE: Not supported by StickyListHeader, but reimplemented here
// Start out with a progress indicator.
- setListShown(false);
+ setContentShown(false);
// Create an empty adapter we will use to display the loaded data.
mAdapter = new KeyListAdapter(getActivity(), null, 0);
@@ -298,12 +285,11 @@ public class KeyListFragment extends Fragment
// this view is made visible if no data is available
mStickyList.setEmptyView(getActivity().findViewById(R.id.key_list_empty));
- // NOTE: Not supported by StickyListHeader, but reimplemented here
// The list should now be shown.
if (isResumed()) {
- setListShown(true);
+ setContentShown(true);
} else {
- setListShownNoAnimation(true);
+ setContentShownNoAnimation(true);
}
}
@@ -418,43 +404,6 @@ public class KeyListFragment extends Fragment
return true;
}
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- public void setListShown(boolean shown, boolean animate) {
- if (mListShown == shown) {
- return;
- }
- mListShown = shown;
- if (shown) {
- if (animate) {
- mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_out));
- mListContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_in));
- }
- mProgressContainer.setVisibility(View.GONE);
- mListContainer.setVisibility(View.VISIBLE);
- } else {
- if (animate) {
- mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_in));
- mListContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_out));
- }
- mProgressContainer.setVisibility(View.VISIBLE);
- mListContainer.setVisibility(View.INVISIBLE);
- }
- }
-
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- public void setListShown(boolean shown) {
- setListShown(shown, true);
- }
-
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- public void setListShownNoAnimation(boolean shown) {
- setListShown(shown, false);
- }
-
/**
* Implements StickyListHeadersAdapter from library
*/
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java
new file mode 100644
index 000000000..87ab1bb8c
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java
@@ -0,0 +1,78 @@
+package org.sufficientlysecure.keychain.ui;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
+
+import org.sufficientlysecure.keychain.R;
+
+/** This is a fragment helper class, which implements a generic
+ * progressbar/container view.
+ *
+ * To use it in a fragment, simply subclass, use onCreateView to create the
+ * layout's root view, and ues getContainer() as root view of your subclass.
+ * The layout shows a progress bar by default, and can be switched to the
+ * actual contents by calling setContentShown().
+ *
+ */
+public class LoaderFragment extends Fragment {
+ private boolean mContentShown;
+ private View mProgressContainer;
+ private ViewGroup mContainer;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View root = inflater.inflate(R.layout.loader_layout, container, false);
+
+ mContentShown = true;
+ mContainer = (ViewGroup) root.findViewById(R.id.loader_container);
+ mProgressContainer = root.findViewById(R.id.loader_progress);
+
+ // content is not shown (by visibility statuses in the layout files)
+ mContentShown = false;
+
+ return root;
+
+ }
+
+ protected ViewGroup getContainer() {
+ return mContainer;
+ }
+
+ public void setContentShown(boolean shown, boolean animate) {
+ if (mContentShown == shown) {
+ return;
+ }
+ mContentShown = shown;
+ if (shown) {
+ if (animate) {
+ mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_out));
+ mContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_in));
+ }
+ mProgressContainer.setVisibility(View.GONE);
+ mContainer.setVisibility(View.VISIBLE);
+ } else {
+ if (animate) {
+ mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_in));
+ mContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_out));
+ }
+ mProgressContainer.setVisibility(View.VISIBLE);
+ mContainer.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ public void setContentShown(boolean shown) {
+ setContentShown(shown, true);
+ }
+
+ public void setContentShownNoAnimation(boolean shown) {
+ setContentShown(shown, false);
+ }
+}
diff --git a/OpenKeychain/src/main/res/layout/key_list_fragment.xml b/OpenKeychain/src/main/res/layout/key_list_fragment.xml
index 951f8d729..c02854668 100644
--- a/OpenKeychain/src/main/res/layout/key_list_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_fragment.xml
@@ -6,103 +6,74 @@
android:orientation="vertical">
+
+
+
+ android:gravity="center"
+ android:orientation="vertical"
+ android:visibility="visible">
-
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="@string/key_list_empty_text1"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
-
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
-
-
-
-
-
-
-
-
+ android:text="@string/key_list_empty_text2"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
-
-
-
-
-
+
-
-
+
-
+
+
diff --git a/OpenKeychain/src/main/res/layout/loader_layout.xml b/OpenKeychain/src/main/res/layout/loader_layout.xml
new file mode 100644
index 000000000..50252d27c
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/loader_layout.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.2.3
From 185c4eed4349d7539c2ddcbe696a8c80b523d214 Mon Sep 17 00:00:00 2001
From: Vincent Breitmoser
Date: Thu, 8 May 2014 13:57:46 +0200
Subject: use LoaderFragment in ViewKey tabs
Closes #616
---
.../keychain/ui/ViewKeyCertsFragment.java | 17 +++++++++-------
.../keychain/ui/ViewKeyKeysFragment.java | 18 +++++++----------
.../keychain/ui/ViewKeyMainFragment.java | 23 ++++++++--------------
.../keychain/ui/ViewKeyShareFragment.java | 18 +++++++----------
.../src/main/res/layout/view_key_keys_fragment.xml | 3 +--
.../src/main/res/layout/view_key_main_fragment.xml | 5 +----
.../main/res/layout/view_key_share_fragment.xml | 4 +---
7 files changed, 35 insertions(+), 53 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
index e1c2013ea..d5658586d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
@@ -23,7 +23,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -46,7 +45,7 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
-public class ViewKeyCertsFragment extends Fragment
+public class ViewKeyCertsFragment extends LoaderFragment
implements LoaderManager.LoaderCallbacks, AdapterView.OnItemClickListener {
// These are the rows that we will retrieve.
@@ -79,18 +78,19 @@ public class ViewKeyCertsFragment extends Fragment
private static final int LOADER_ID = 4;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.view_key_certs_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_certs_fragment, getContainer());
- return view;
+ mStickyList = (StickyListHeadersListView) view.findViewById(R.id.list);
+
+ return root;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- mStickyList = (StickyListHeadersListView) getActivity().findViewById(R.id.list);
-
if (!getArguments().containsKey(ARG_DATA_URI)) {
Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
getActivity().finish();
@@ -120,6 +120,7 @@ public class ViewKeyCertsFragment extends Fragment
@Override
public Loader onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
return new CursorLoader(getActivity(), mDataUri, PROJECTION, null, null, SORT_ORDER);
@@ -132,6 +133,8 @@ public class ViewKeyCertsFragment extends Fragment
mAdapter.swapCursor(data);
mStickyList.setAdapter(mAdapter);
+
+ setContentShown(true);
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
index 9ab6878d0..fb228f032 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
@@ -44,12 +44,11 @@ import org.sufficientlysecure.keychain.util.Log;
import java.util.Date;
-public class ViewKeyKeysFragment extends Fragment implements
+public class ViewKeyKeysFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks {
public static final String ARG_DATA_URI = "uri";
- private LinearLayout mContainer;
private ListView mKeys;
private ViewKeyKeysAdapter mKeysAdapter;
@@ -57,13 +56,13 @@ public class ViewKeyKeysFragment extends Fragment implements
private Uri mDataUri;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.view_key_keys_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_keys_fragment, getContainer());
- mContainer = (LinearLayout) view.findViewById(R.id.container);
mKeys = (ListView) view.findViewById(R.id.keys);
- return view;
+ return root;
}
@Override
@@ -81,9 +80,6 @@ public class ViewKeyKeysFragment extends Fragment implements
}
private void loadData(Uri dataUri) {
- getActivity().setProgressBarIndeterminateVisibility(true);
- mContainer.setVisibility(View.GONE);
-
mDataUri = dataUri;
Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
@@ -104,6 +100,7 @@ public class ViewKeyKeysFragment extends Fragment implements
};
public Loader onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
Uri baseUri = Keys.buildKeysUri(mDataUri);
return new CursorLoader(getActivity(), baseUri, KEYS_PROJECTION, null, null, null);
}
@@ -117,8 +114,7 @@ public class ViewKeyKeysFragment extends Fragment implements
// old cursor once we return.)
mKeysAdapter.swapCursor(data);
- getActivity().setProgressBarIndeterminateVisibility(false);
- mContainer.setVisibility(View.VISIBLE);
+ setContentShown(true);
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
index b30c9aaec..026417776 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
@@ -21,15 +21,12 @@ import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
-import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
import android.widget.ListView;
import com.devspark.appmsg.AppMsg;
@@ -37,7 +34,6 @@ import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
-import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.adapter.ViewKeyUserIdsAdapter;
@@ -45,12 +41,11 @@ import org.sufficientlysecure.keychain.util.Log;
import java.util.Date;
-public class ViewKeyMainFragment extends Fragment implements
+public class ViewKeyMainFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks {
public static final String ARG_DATA_URI = "uri";
- private LinearLayout mContainer;
private View mActionEdit;
private View mActionEditDivider;
private View mActionEncrypt;
@@ -70,10 +65,10 @@ public class ViewKeyMainFragment extends Fragment implements
private Uri mDataUri;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.view_key_main_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_main_fragment, getContainer());
- mContainer = (LinearLayout) view.findViewById(R.id.container);
mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids);
mActionEdit = view.findViewById(R.id.view_key_action_edit);
mActionEditDivider = view.findViewById(R.id.view_key_action_edit_divider);
@@ -81,7 +76,7 @@ public class ViewKeyMainFragment extends Fragment implements
mActionCertify = view.findViewById(R.id.view_key_action_certify);
mActionCertifyDivider = view.findViewById(R.id.view_key_action_certify_divider);
- return view;
+ return root;
}
@Override
@@ -99,9 +94,6 @@ public class ViewKeyMainFragment extends Fragment implements
}
private void loadData(Uri dataUri) {
- getActivity().setProgressBarIndeterminateVisibility(true);
- mContainer.setVisibility(View.GONE);
-
mDataUri = dataUri;
Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
@@ -143,6 +135,8 @@ public class ViewKeyMainFragment extends Fragment implements
static final int INDEX_UNIFIED_HAS_ENCRYPT = 5;
public Loader onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+
switch (id) {
case LOADER_ID_UNIFIED: {
Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
@@ -219,8 +213,7 @@ public class ViewKeyMainFragment extends Fragment implements
break;
}
- getActivity().setProgressBarIndeterminateVisibility(false);
- mContainer.setVisibility(View.VISIBLE);
+ setContentShown(true);
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
index 1a76f5eed..b3655133d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
@@ -53,12 +53,11 @@ import org.sufficientlysecure.keychain.util.QrCodeUtils;
import java.io.IOException;
-public class ViewKeyShareFragment extends Fragment implements
+public class ViewKeyShareFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks {
public static final String ARG_DATA_URI = "uri";
- private LinearLayout mContainer;
private TextView mFingerprint;
private ImageView mFingerprintQrCode;
private View mFingerprintShareButton;
@@ -77,12 +76,12 @@ public class ViewKeyShareFragment extends Fragment implements
private Uri mDataUri;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.view_key_share_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_share_fragment, getContainer());
mProviderHelper = new ProviderHelper(ViewKeyShareFragment.this.getActivity());
- mContainer = (LinearLayout) view.findViewById(R.id.container);
mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint);
mFingerprintQrCode = (ImageView) view.findViewById(R.id.view_key_fingerprint_qr_code_image);
mFingerprintShareButton = view.findViewById(R.id.view_key_action_fingerprint_share);
@@ -142,7 +141,7 @@ public class ViewKeyShareFragment extends Fragment implements
}
});
- return view;
+ return root;
}
private void share(Uri dataUri, ProviderHelper providerHelper, boolean fingerprintOnly,
@@ -232,9 +231,6 @@ public class ViewKeyShareFragment extends Fragment implements
}
private void loadData(Uri dataUri) {
- getActivity().setProgressBarIndeterminateVisibility(true);
- mContainer.setVisibility(View.GONE);
-
mDataUri = dataUri;
Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
@@ -260,6 +256,7 @@ public class ViewKeyShareFragment extends Fragment implements
static final int INDEX_UNIFIED_EXPIRY = 8;
public Loader onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
switch (id) {
case LOADER_ID_UNIFIED: {
Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
@@ -299,8 +296,7 @@ public class ViewKeyShareFragment extends Fragment implements
}
}
- getActivity().setProgressBarIndeterminateVisibility(false);
- mContainer.setVisibility(View.VISIBLE);
+ setContentShown(true);
}
/**
diff --git a/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml
index 1b15c7363..caea22341 100644
--- a/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml
@@ -11,8 +11,7 @@
android:descendantFocusability="beforeDescendants"
android:orientation="vertical"
android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:id="@+id/container">
+ android:paddingRight="16dp">
@@ -12,9 +11,7 @@
android:descendantFocusability="beforeDescendants"
android:orientation="vertical"
android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:id="@+id/container"
- android:visibility="visible">
+ android:paddingRight="16dp">
@@ -12,8 +11,7 @@
android:descendantFocusability="beforeDescendants"
android:orientation="vertical"
android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:id="@+id/container">
+ android:paddingRight="16dp">
Date: Thu, 8 May 2014 15:31:03 +0200
Subject: use setEncryptToSigner for asymmetric encryption
(tested and works, closes #569)
---
.../main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java | 2 --
.../org/sufficientlysecure/keychain/service/KeychainIntentService.java | 1 +
.../org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java | 3 ---
3 files changed, 1 insertion(+), 5 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
index 30cac9b77..665dc82cc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
@@ -192,8 +192,6 @@ public class PgpSignEncrypt {
}
/**
- * TODO: test this option!
- *
* @param encryptToSigner
* @return
*/
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index d2e9533a7..d363a4119 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -324,6 +324,7 @@ public class KeychainIntentService extends IntentService
.setEncryptionMasterKeyIds(encryptionKeyIds)
.setSymmetricPassphrase(symmetricPassphrase)
.setSignatureMasterKeyId(signatureKeyId)
+ .setEncryptToSigner(true)
.setSignatureHashAlgorithm(
Preferences.getPreferences(this).getDefaultHashAlgorithm())
.setSignaturePassphrase(
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
index d1a5dca07..c954e6465 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
@@ -226,9 +226,6 @@ public class EncryptAsymmetricFragment extends Fragment {
private void selectPublicKeys() {
Intent intent = new Intent(getActivity(), SelectPublicKeyActivity.class);
Vector keyIds = new Vector();
- if (mSecretKeyId != 0) {
- keyIds.add(mSecretKeyId);
- }
if (mEncryptionKeyIds != null && mEncryptionKeyIds.length > 0) {
for (int i = 0; i < mEncryptionKeyIds.length; ++i) {
keyIds.add(mEncryptionKeyIds[i]);
--
cgit v1.2.3
From 33cad382f96b673587e841932ea322a1dd6fa23b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Thu, 8 May 2014 15:46:57 +0200
Subject: Use flat buttons where appropriate
---
.../keychain/ui/CertifyKeyActivity.java | 10 ++--
.../keychain/ui/ImportKeysActivity.java | 4 +-
.../keychain/ui/UploadKeyActivity.java | 10 ++--
.../main/res/drawable-hdpi/ic_action_download.png | Bin 0 -> 398 bytes
.../main/res/drawable-hdpi/ic_action_upload.png | Bin 0 -> 356 bytes
.../main/res/drawable-mdpi/ic_action_download.png | Bin 0 -> 324 bytes
.../main/res/drawable-mdpi/ic_action_upload.png | Bin 0 -> 291 bytes
.../main/res/drawable-xhdpi/ic_action_download.png | Bin 0 -> 552 bytes
.../main/res/drawable-xhdpi/ic_action_upload.png | Bin 0 -> 477 bytes
.../res/drawable-xxhdpi/ic_action_download.png | Bin 0 -> 650 bytes
.../main/res/drawable-xxhdpi/ic_action_upload.png | Bin 0 -> 588 bytes
.../src/main/res/layout/certify_key_activity.xml | 31 +++++++++---
.../src/main/res/layout/edit_key_activity.xml | 2 +-
.../src/main/res/layout/import_keys_activity.xml | 23 ++++++---
.../src/main/res/layout/key_server_export.xml | 40 ---------------
.../src/main/res/layout/upload_key_activity.xml | 55 +++++++++++++++++++++
16 files changed, 106 insertions(+), 69 deletions(-)
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png
create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png
create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png
create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png
create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png
delete mode 100644 OpenKeychain/src/main/res/layout/key_server_export.xml
create mode 100644 OpenKeychain/src/main/res/layout/upload_key_activity.xml
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
index 29969ca55..bd12a3b52 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
@@ -29,7 +29,6 @@ import android.support.v4.app.LoaderManager;
import android.support.v4.app.NavUtils;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
-import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import android.view.View;
@@ -42,7 +41,6 @@ import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
-import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
import org.spongycastle.openpgp.PGPPublicKeyRing;
@@ -68,7 +66,7 @@ import java.util.ArrayList;
*/
public class CertifyKeyActivity extends ActionBarActivity implements
SelectSecretKeyLayoutFragment.SelectSecretKeyCallback, LoaderManager.LoaderCallbacks {
- private BootstrapButton mSignButton;
+ private View mSignButton;
private CheckBox mUploadKeyCheckbox;
private Spinner mSelectKeyserverSpinner;
@@ -95,7 +93,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
mSelectKeyFragment.setCallback(this);
mSelectKeyFragment.setFilterCertify(true);
- mSelectKeyserverSpinner = (Spinner) findViewById(R.id.sign_key_keyserver);
+ mSelectKeyserverSpinner = (Spinner) findViewById(R.id.upload_key_keyserver);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, Preferences.getPreferences(this)
.getKeyServers()
@@ -122,7 +120,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
}
});
- mSignButton = (BootstrapButton) findViewById(R.id.sign_key_sign_button);
+ mSignButton = findViewById(R.id.sign_key_sign_button);
mSignButton.setOnClickListener(new OnClickListener() {
@Override
@@ -350,7 +348,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
// fill values for this action
Bundle data = new Bundle();
- Spinner keyServer = (Spinner) findViewById(R.id.sign_key_keyserver);
+ Spinner keyServer = (Spinner) findViewById(R.id.upload_key_keyserver);
String server = (String) keyServer.getSelectedItem();
data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, server);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index f71ef6d46..bb5d2e922 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -86,7 +86,7 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
private ImportKeysListFragment mListFragment;
private String[] mNavigationStrings;
private Fragment mCurrentFragment;
- private BootstrapButton mImportButton;
+ private View mImportButton;
private static final Class[] NAVIGATION_CLASSES = new Class[]{
ImportKeysServerFragment.class,
@@ -111,7 +111,7 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
setContentView(R.layout.import_keys_activity);
- mImportButton = (BootstrapButton) findViewById(R.id.import_import);
+ mImportButton = findViewById(R.id.import_import);
mImportButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
index 90783aa8b..dbd1b7507 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -32,8 +32,6 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
-import com.beardedhen.androidbootstrap.BootstrapButton;
-
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.Preferences;
@@ -46,7 +44,7 @@ import org.sufficientlysecure.keychain.util.Log;
* Sends the selected public key to a keyserver
*/
public class UploadKeyActivity extends ActionBarActivity {
- private BootstrapButton mUploadButton;
+ private View mUploadButton;
private Spinner mKeyServerSpinner;
private Uri mDataUri;
@@ -55,10 +53,10 @@ public class UploadKeyActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.key_server_export);
+ setContentView(R.layout.upload_key_activity);
- mUploadButton = (BootstrapButton) findViewById(R.id.btn_export_to_server);
- mKeyServerSpinner = (Spinner) findViewById(R.id.sign_key_keyserver);
+ mUploadButton = findViewById(R.id.upload_key_action_upload);
+ mKeyServerSpinner = (Spinner) findViewById(R.id.upload_key_keyserver);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, Preferences.getPreferences(this)
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png
new file mode 100644
index 000000000..1f3d06519
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png
new file mode 100644
index 000000000..b53640176
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png
new file mode 100644
index 000000000..c2ead0cef
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png
new file mode 100644
index 000000000..5bef3ca81
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png
new file mode 100644
index 000000000..38a3aeea6
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png
new file mode 100644
index 000000000..27af9a43c
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png
new file mode 100644
index 000000000..ef7785a48
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png
new file mode 100644
index 000000000..48a0cd149
Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png differ
diff --git a/OpenKeychain/src/main/res/layout/certify_key_activity.xml b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
index 6fd047187..bb43fa805 100644
--- a/OpenKeychain/src/main/res/layout/certify_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
@@ -135,22 +135,37 @@
android:text="@string/label_send_key" />
-
+
+
+ android:layout_height="match_parent"
+ android:text="@string/key_view_action_certify"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_action_good"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="@style/SelectableItem" />
+
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/edit_key_activity.xml b/OpenKeychain/src/main/res/layout/edit_key_activity.xml
index fc4422cf0..1ce5c096f 100644
--- a/OpenKeychain/src/main/res/layout/edit_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/edit_key_activity.xml
@@ -33,7 +33,7 @@
android:padding="4dp"
android:text="@string/btn_set_passphrase"
bootstrapbutton:bb_icon_left="fa-pencil"
- bootstrapbutton:bb_type="info" />
+ bootstrapbutton:bb_type="default" />
-
+
+
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_action_download"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="@style/SelectableItem" />
diff --git a/OpenKeychain/src/main/res/layout/key_server_export.xml b/OpenKeychain/src/main/res/layout/key_server_export.xml
deleted file mode 100644
index 6031bf7c7..000000000
--- a/OpenKeychain/src/main/res/layout/key_server_export.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/upload_key_activity.xml b/OpenKeychain/src/main/res/layout/upload_key_activity.xml
new file mode 100644
index 000000000..5a6f732d5
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/upload_key_activity.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
--
cgit v1.2.3
From 79117b1ef8074434579191e1dd734f9445d6544f Mon Sep 17 00:00:00 2001
From: Vincent Breitmoser
Date: Thu, 8 May 2014 15:56:49 +0200
Subject: use longsparsearrays instead of hashmaps in that one place
---
.../keychain/provider/ProviderHelper.java | 35 ++++++++++++----------
1 file changed, 19 insertions(+), 16 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index 214a9988c..7ef186f00 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -26,6 +26,7 @@ import android.database.Cursor;
import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.RemoteException;
+import android.support.v4.util.LongSparseArray;
import org.spongycastle.bcpg.ArmoredOutputStream;
import org.spongycastle.bcpg.S2K;
@@ -167,33 +168,35 @@ public class ProviderHelper {
}
}
- public Map getPGPKeyRings(Uri queryUri) {
+ public LongSparseArray getPGPKeyRings(Uri queryUri) {
Cursor cursor = mContentResolver.query(queryUri,
new String[]{KeyRingData.MASTER_KEY_ID, KeyRingData.KEY_RING_DATA},
null, null, null);
- Map result = new HashMap(cursor.getCount());
- if (cursor != null && cursor.moveToFirst()) do {
- long masterKeyId = cursor.getLong(0);
- byte[] data = cursor.getBlob(1);
- if (data != null) {
- result.put(masterKeyId, PgpConversionHelper.BytesToPGPKeyRing(data));
+ LongSparseArray result = new LongSparseArray(cursor.getCount());
+ try {
+ if (cursor != null && cursor.moveToFirst()) do {
+ long masterKeyId = cursor.getLong(0);
+ byte[] data = cursor.getBlob(1);
+ if (data != null) {
+ result.put(masterKeyId, PgpConversionHelper.BytesToPGPKeyRing(data));
+ }
+ } while (cursor.moveToNext());
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
- } while (cursor.moveToNext());
-
- if (cursor != null) {
- cursor.close();
}
return result;
}
public PGPKeyRing getPGPKeyRing(Uri queryUri) throws NotFoundException {
- Map result = getPGPKeyRings(queryUri);
- if (result.isEmpty()) {
+ LongSparseArray result = getPGPKeyRings(queryUri);
+ if (result.size() == 0) {
throw new NotFoundException("PGPKeyRing object not found!");
} else {
- return result.values().iterator().next();
+ return result.valueAt(0);
}
}
@@ -267,7 +270,7 @@ public class ProviderHelper {
}
// get a list of owned secret keys, for verification filtering
- Map allKeyRings = getPGPKeyRings(KeyRingData.buildSecretKeyRingUri());
+ LongSparseArray allKeyRings = getPGPKeyRings(KeyRingData.buildSecretKeyRingUri());
// special case: available secret keys verify themselves!
if (secretRing != null)
allKeyRings.put(secretRing.getSecretKey().getKeyID(), secretRing);
@@ -305,7 +308,7 @@ public class ProviderHelper {
}
}
// verify signatures from known private keys
- if (allKeyRings.containsKey(certId)) {
+ if (allKeyRings.indexOfKey(certId) >= 0) {
// mark them as verified
cert.init(new JcaPGPContentVerifierBuilderProvider().setProvider(
Constants.BOUNCY_CASTLE_PROVIDER_NAME),
--
cgit v1.2.3
From cbc3988628d09ed8a4fe967e1f21786f46cb038b Mon Sep 17 00:00:00 2001
From: Vincent Breitmoser
Date: Thu, 8 May 2014 15:56:32 +0200
Subject: proper null checks and closing of cursors everywhere
---
.../keychain/helper/FileHelper.java | 12 +-
.../keychain/provider/KeychainDatabase.java | 65 ++++---
.../keychain/provider/KeychainProvider.java | 13 +-
.../keychain/provider/ProviderHelper.java | 208 ++++++++++++---------
.../keychain/remote/OpenPgpService.java | 32 ++--
.../keychain/service/KeychainIntentService.java | 7 +-
6 files changed, 189 insertions(+), 148 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
index f22fcd4b8..d7d73cf3d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
@@ -112,16 +112,18 @@ public class FileHelper {
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {"_data"};
- Cursor cursor = null;
-
+ Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
try {
- cursor = context.getContentResolver().query(uri, projection, null, null, null);
- int columnIndex = cursor.getColumnIndexOrThrow("_data");
- if (cursor.moveToFirst()) {
+ if (cursor != null && cursor.moveToFirst()) {
+ int columnIndex = cursor.getColumnIndexOrThrow("_data");
return cursor.getString(columnIndex);
}
} catch (Exception e) {
// Eat it
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
index 061f91176..68726d3e0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -255,53 +255,60 @@ public class KeychainDatabase extends SQLiteOpenHelper {
}
}.getReadableDatabase();
- Cursor c = null;
+ Cursor cursor = null;
try {
// we insert in two steps: first, all public keys that have secret keys
- c = db.rawQuery("SELECT key_ring_data FROM key_rings WHERE type = 1 OR EXISTS ("
+ cursor = db.rawQuery("SELECT key_ring_data FROM key_rings WHERE type = 1 OR EXISTS ("
+ " SELECT 1 FROM key_rings d2 WHERE key_rings.master_key_id = d2.master_key_id"
+ " AND d2.type = 1) ORDER BY type ASC", null);
- Log.d(Constants.TAG, "Importing " + c.getCount() + " secret keyrings from apg.db...");
- for (int i = 0; i < c.getCount(); i++) {
- c.moveToPosition(i);
- byte[] data = c.getBlob(0);
- PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
- ProviderHelper providerHelper = new ProviderHelper(context);
- if (ring instanceof PGPPublicKeyRing)
- providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
- else if (ring instanceof PGPSecretKeyRing)
- providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
- else {
- Log.e(Constants.TAG, "Unknown blob data type!");
+ Log.d(Constants.TAG, "Importing " + cursor.getCount() + " secret keyrings from apg.db...");
+ if (cursor != null) {
+ for (int i = 0; i < cursor.getCount(); i++) {
+ cursor.moveToPosition(i);
+ byte[] data = cursor.getBlob(0);
+ PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
+ ProviderHelper providerHelper = new ProviderHelper(context);
+ if (ring instanceof PGPPublicKeyRing)
+ providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
+ else if (ring instanceof PGPSecretKeyRing)
+ providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
+ else {
+ Log.e(Constants.TAG, "Unknown blob data type!");
+ }
}
}
+ if (cursor != null) {
+ cursor.close();
+ }
// afterwards, insert all keys, starting with public keys that have secret keys, then
// secret keys, then all others. this order is necessary to ensure all certifications
// are recognized properly.
- c = db.rawQuery("SELECT key_ring_data FROM key_rings ORDER BY (type = 0 AND EXISTS ("
+ cursor = db.rawQuery("SELECT key_ring_data FROM key_rings ORDER BY (type = 0 AND EXISTS ("
+ " SELECT 1 FROM key_rings d2 WHERE key_rings.master_key_id = d2.master_key_id AND"
+ " d2.type = 1)) DESC, type DESC", null);
// import from old database
- Log.d(Constants.TAG, "Importing " + c.getCount() + " keyrings from apg.db...");
- for (int i = 0; i < c.getCount(); i++) {
- c.moveToPosition(i);
- byte[] data = c.getBlob(0);
- PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
- ProviderHelper providerHelper = new ProviderHelper(context);
- if (ring instanceof PGPPublicKeyRing) {
- providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
- } else if (ring instanceof PGPSecretKeyRing) {
- providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
- } else {
- Log.e(Constants.TAG, "Unknown blob data type!");
+ Log.d(Constants.TAG, "Importing " + cursor.getCount() + " keyrings from apg.db...");
+ if (cursor != null) {
+ for (int i = 0; i < cursor.getCount(); i++) {
+ cursor.moveToPosition(i);
+ byte[] data = cursor.getBlob(0);
+ PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
+ ProviderHelper providerHelper = new ProviderHelper(context);
+ if (ring instanceof PGPPublicKeyRing) {
+ providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
+ } else if (ring instanceof PGPSecretKeyRing) {
+ providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
+ } else {
+ Log.e(Constants.TAG, "Unknown blob data type!");
+ }
}
}
} catch (IOException e) {
Log.e(Constants.TAG, "Error importing apg.db!", e);
} finally {
- if (c != null) {
- c.close();
+ if (cursor != null) {
+ cursor.close();
}
if (db != null) {
db.close();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
index 1dc822ac2..ec7bf58d9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
@@ -541,20 +541,21 @@ public class KeychainProvider extends ContentProvider {
}
SQLiteDatabase db = getDb().getReadableDatabase();
- Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, having, orderBy);
-
- // Tell the cursor what uri to watch, so it knows when its source data changes
- c.setNotificationUri(getContext().getContentResolver(), uri);
+ Cursor cursor = qb.query(db, projection, selection, selectionArgs, groupBy, having, orderBy);
+ if (cursor != null) {
+ // Tell the cursor what uri to watch, so it knows when its source data changes
+ cursor.setNotificationUri(getContext().getContentResolver(), uri);
+ }
if (Constants.DEBUG) {
Log.d(Constants.TAG,
"Query: "
+ qb.buildQuery(projection, selection, selectionArgs, null, null,
orderBy, null));
- Log.d(Constants.TAG, "Cursor: " + DatabaseUtils.dumpCursorToString(c));
+ Log.d(Constants.TAG, "Cursor: " + DatabaseUtils.dumpCursorToString(cursor));
}
- return c;
+ return cursor;
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index 7ef186f00..ab00db13a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -100,36 +100,38 @@ public class ProviderHelper {
throws NotFoundException {
Cursor cursor = mContentResolver.query(uri, proj, null, null, null);
- HashMap result = new HashMap(proj.length);
- if (cursor != null && cursor.moveToFirst()) {
- int pos = 0;
- for (String p : proj) {
- switch (types[pos]) {
- case FIELD_TYPE_NULL:
- result.put(p, cursor.isNull(pos));
- break;
- case FIELD_TYPE_INTEGER:
- result.put(p, cursor.getLong(pos));
- break;
- case FIELD_TYPE_FLOAT:
- result.put(p, cursor.getFloat(pos));
- break;
- case FIELD_TYPE_STRING:
- result.put(p, cursor.getString(pos));
- break;
- case FIELD_TYPE_BLOB:
- result.put(p, cursor.getBlob(pos));
- break;
+ try {
+ HashMap result = new HashMap(proj.length);
+ if (cursor != null && cursor.moveToFirst()) {
+ int pos = 0;
+ for (String p : proj) {
+ switch (types[pos]) {
+ case FIELD_TYPE_NULL:
+ result.put(p, cursor.isNull(pos));
+ break;
+ case FIELD_TYPE_INTEGER:
+ result.put(p, cursor.getLong(pos));
+ break;
+ case FIELD_TYPE_FLOAT:
+ result.put(p, cursor.getFloat(pos));
+ break;
+ case FIELD_TYPE_STRING:
+ result.put(p, cursor.getString(pos));
+ break;
+ case FIELD_TYPE_BLOB:
+ result.put(p, cursor.getBlob(pos));
+ break;
+ }
+ pos += 1;
}
- pos += 1;
}
- }
- if (cursor != null) {
- cursor.close();
+ return result;
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
-
- return result;
}
public Object getUnifiedData(long masterKeyId, String column, int type)
@@ -576,27 +578,29 @@ public class ProviderHelper {
}, inMasterKeyList, null, null);
}
- if (cursor != null) {
- int masterIdCol = cursor.getColumnIndex(KeyRingData.MASTER_KEY_ID);
- int dataCol = cursor.getColumnIndex(KeyRingData.KEY_RING_DATA);
- if (cursor.moveToFirst()) {
- do {
- Log.d(Constants.TAG, "masterKeyId: " + cursor.getLong(masterIdCol));
-
- byte[] data = cursor.getBlob(dataCol);
-
- // get actual keyring data blob and write it to ByteArrayOutputStream
- try {
- output.add(getKeyRingAsArmoredString(data));
- } catch (IOException e) {
- Log.e(Constants.TAG, "IOException", e);
- }
- } while (cursor.moveToNext());
+ try {
+ if (cursor != null) {
+ int masterIdCol = cursor.getColumnIndex(KeyRingData.MASTER_KEY_ID);
+ int dataCol = cursor.getColumnIndex(KeyRingData.KEY_RING_DATA);
+ if (cursor.moveToFirst()) {
+ do {
+ Log.d(Constants.TAG, "masterKeyId: " + cursor.getLong(masterIdCol));
+
+ byte[] data = cursor.getBlob(dataCol);
+
+ // get actual keyring data blob and write it to ByteArrayOutputStream
+ try {
+ output.add(getKeyRingAsArmoredString(data));
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException", e);
+ }
+ } while (cursor.moveToNext());
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
- }
-
- if (cursor != null) {
- cursor.close();
}
if (output.size() > 0) {
@@ -610,17 +614,19 @@ public class ProviderHelper {
Cursor cursor = mContentResolver.query(ApiApps.CONTENT_URI, null, null, null, null);
ArrayList packageNames = new ArrayList();
- if (cursor != null) {
- int packageNameCol = cursor.getColumnIndex(ApiApps.PACKAGE_NAME);
- if (cursor.moveToFirst()) {
- do {
- packageNames.add(cursor.getString(packageNameCol));
- } while (cursor.moveToNext());
+ try {
+ if (cursor != null) {
+ int packageNameCol = cursor.getColumnIndex(ApiApps.PACKAGE_NAME);
+ if (cursor.moveToFirst()) {
+ do {
+ packageNames.add(cursor.getString(packageNameCol));
+ } while (cursor.moveToNext());
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
- }
-
- if (cursor != null) {
- cursor.close();
}
return packageNames;
@@ -668,13 +674,19 @@ public class ProviderHelper {
public AppSettings getApiAppSettings(Uri uri) {
AppSettings settings = null;
- Cursor cur = mContentResolver.query(uri, null, null, null, null);
- if (cur != null && cur.moveToFirst()) {
- settings = new AppSettings();
- settings.setPackageName(cur.getString(
- cur.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)));
- settings.setPackageSignature(cur.getBlob(
- cur.getColumnIndex(KeychainContract.ApiApps.PACKAGE_SIGNATURE)));
+ Cursor cursor = mContentResolver.query(uri, null, null, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ settings = new AppSettings();
+ settings.setPackageName(cursor.getString(
+ cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)));
+ settings.setPackageSignature(cursor.getBlob(
+ cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_SIGNATURE)));
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
return settings;
@@ -683,20 +695,26 @@ public class ProviderHelper {
public AccountSettings getApiAccountSettings(Uri accountUri) {
AccountSettings settings = null;
- Cursor cur = mContentResolver.query(accountUri, null, null, null, null);
- if (cur != null && cur.moveToFirst()) {
- settings = new AccountSettings();
-
- settings.setAccountName(cur.getString(
- cur.getColumnIndex(KeychainContract.ApiAccounts.ACCOUNT_NAME)));
- settings.setKeyId(cur.getLong(
- cur.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID)));
- settings.setCompression(cur.getInt(
- cur.getColumnIndexOrThrow(KeychainContract.ApiAccounts.COMPRESSION)));
- settings.setHashAlgorithm(cur.getInt(
- cur.getColumnIndexOrThrow(KeychainContract.ApiAccounts.HASH_ALORITHM)));
- settings.setEncryptionAlgorithm(cur.getInt(
- cur.getColumnIndexOrThrow(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM)));
+ Cursor cursor = mContentResolver.query(accountUri, null, null, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ settings = new AccountSettings();
+
+ settings.setAccountName(cursor.getString(
+ cursor.getColumnIndex(KeychainContract.ApiAccounts.ACCOUNT_NAME)));
+ settings.setKeyId(cursor.getLong(
+ cursor.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID)));
+ settings.setCompression(cursor.getInt(
+ cursor.getColumnIndexOrThrow(KeychainContract.ApiAccounts.COMPRESSION)));
+ settings.setHashAlgorithm(cursor.getInt(
+ cursor.getColumnIndexOrThrow(KeychainContract.ApiAccounts.HASH_ALORITHM)));
+ settings.setEncryptionAlgorithm(cursor.getInt(
+ cursor.getColumnIndexOrThrow(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM)));
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
return settings;
@@ -706,10 +724,16 @@ public class ProviderHelper {
Set keyIds = new HashSet();
Cursor cursor = mContentResolver.query(uri, null, null, null, null);
- if (cursor != null) {
- int keyIdColumn = cursor.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID);
- while (cursor.moveToNext()) {
- keyIds.add(cursor.getLong(keyIdColumn));
+ try {
+ if (cursor != null) {
+ int keyIdColumn = cursor.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID);
+ while (cursor.moveToNext()) {
+ keyIds.add(cursor.getLong(keyIdColumn));
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
}
@@ -722,18 +746,18 @@ public class ProviderHelper {
String[] projection = new String[]{ApiApps.PACKAGE_SIGNATURE};
Cursor cursor = mContentResolver.query(queryUri, projection, null, null, null);
+ try {
+ byte[] signature = null;
+ if (cursor != null && cursor.moveToFirst()) {
+ int signatureCol = 0;
- byte[] signature = null;
- if (cursor != null && cursor.moveToFirst()) {
- int signatureCol = 0;
-
- signature = cursor.getBlob(signatureCol);
- }
-
- if (cursor != null) {
- cursor.close();
+ signature = cursor.getBlob(signatureCol);
+ }
+ return signature;
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
-
- return signature;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
index 5691d2fe2..db2db668d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -70,19 +70,25 @@ public class OpenPgpService extends RemoteService {
for (String email : encryptionUserIds) {
Uri uri = KeyRings.buildUnifiedKeyRingsFindByEmailUri(email);
- Cursor cur = getContentResolver().query(uri, null, null, null, null);
- if (cur.moveToFirst()) {
- long id = cur.getLong(cur.getColumnIndex(KeyRings.MASTER_KEY_ID));
- keyIds.add(id);
- } else {
- missingUserIdsCheck = true;
- missingUserIds.add(email);
- Log.d(Constants.TAG, "user id missing");
- }
- if (cur.moveToNext()) {
- duplicateUserIdsCheck = true;
- duplicateUserIds.add(email);
- Log.d(Constants.TAG, "more than one user id with the same email");
+ Cursor cursor = getContentResolver().query(uri, null, null, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ long id = cursor.getLong(cursor.getColumnIndex(KeyRings.MASTER_KEY_ID));
+ keyIds.add(id);
+ } else {
+ missingUserIdsCheck = true;
+ missingUserIds.add(email);
+ Log.d(Constants.TAG, "user id missing");
+ }
+ if (cursor != null && cursor.moveToNext()) {
+ duplicateUserIdsCheck = true;
+ duplicateUserIds.add(email);
+ Log.d(Constants.TAG, "more than one user id with the same email");
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index d363a4119..f1e30c560 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -690,8 +690,7 @@ public class KeychainIntentService extends IntentService
new String[]{KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET},
selection, null, null);
try {
- cursor.moveToFirst();
- do {
+ if (cursor != null && cursor.moveToFirst()) do {
// export public either way
publicMasterKeyIds.add(cursor.getLong(0));
// add secret if available (and requested)
@@ -699,7 +698,9 @@ public class KeychainIntentService extends IntentService
secretMasterKeyIds.add(cursor.getLong(0));
} while (cursor.moveToNext());
} finally {
- cursor.close();
+ if (cursor != null) {
+ cursor.close();
+ }
}
PgpImportExport pgpImportExport = new PgpImportExport(this, this, this);
--
cgit v1.2.3
From 4ba06e7735eb64c7b3d02c605e8c91fe986c1976 Mon Sep 17 00:00:00 2001
From: Vincent Breitmoser
Date: Thu, 8 May 2014 18:06:12 +0200
Subject: ui: purplize dialog headers (huge hack inside)
---
.../keychain/ui/EditKeyActivity.java | 9 ++---
.../keychain/ui/ImportKeysActivity.java | 1 -
.../ui/dialog/BadImportKeyDialogFragment.java | 5 ++-
.../ui/dialog/CreateKeyDialogFragment.java | 4 +--
.../ui/dialog/CustomAlertDialogBuilder.java | 40 ++++++++++++++++++++++
.../ui/dialog/DeleteFileDialogFragment.java | 5 ++-
.../ui/dialog/DeleteKeyDialogFragment.java | 5 ++-
.../keychain/ui/dialog/FileDialogFragment.java | 4 +--
.../ui/dialog/PassphraseDialogFragment.java | 4 +--
.../ui/dialog/SetPassphraseDialogFragment.java | 4 +--
.../keychain/ui/dialog/ShareNfcDialogFragment.java | 5 ++-
.../ui/dialog/ShareQrCodeDialogFragment.java | 5 ++-
12 files changed, 63 insertions(+), 28 deletions(-)
create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
index 4c747d0d9..bd3a98567 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
@@ -59,6 +59,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
+import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.widget.Editor;
@@ -504,7 +505,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
int curID = 0;
for (String userID : userIDs) {
if (userID.equals("") && (!userID.equals(originalIDs.get(curID)) || newIDs.get(curID))) {
- AlertDialog.Builder alert = new AlertDialog.Builder(
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(
EditKeyActivity.this);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
@@ -527,7 +528,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
}
);
alert.setCancelable(false);
- alert.create().show();
+ alert.show();
return;
}
curID++;
@@ -617,7 +618,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
private void cancelClicked() {
if (needsSaving()) { //ask if we want to save
- AlertDialog.Builder alert = new AlertDialog.Builder(
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(
EditKeyActivity.this);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
@@ -640,7 +641,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
}
});
alert.setCancelable(false);
- alert.create().show();
+ alert.show();
} else {
setResult(RESULT_CANCELED);
finish();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index bb5d2e922..35076287b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -38,7 +38,6 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
-import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
index 35e464423..19cf27259 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
@@ -17,7 +17,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
@@ -50,7 +49,7 @@ public class BadImportKeyDialogFragment extends DialogFragment {
final FragmentActivity activity = getActivity();
final int badImport = getArguments().getInt(ARG_BAD_IMPORT);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
alert.setTitle(R.string.warning);
alert.setMessage(activity.getResources()
@@ -63,6 +62,6 @@ public class BadImportKeyDialogFragment extends DialogFragment {
});
alert.setCancelable(true);
- return alert.create();
+ return alert.show();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
index c71bc160a..6c012cb94 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
@@ -83,7 +83,7 @@ public class CreateKeyDialogFragment extends DialogFragment {
final int childCount = getArguments().getInt(ARG_EDITOR_CHILD_COUNT);
mInflater = context.getLayoutInflater();
- AlertDialog.Builder dialog = new AlertDialog.Builder(context);
+ CustomAlertDialogBuilder dialog = new CustomAlertDialogBuilder(context);
View view = mInflater.inflate(R.layout.create_key_dialog, null);
dialog.setView(view);
@@ -146,7 +146,7 @@ public class CreateKeyDialogFragment extends DialogFragment {
}
});
- final AlertDialog alertDialog = dialog.create();
+ final AlertDialog alertDialog = dialog.show();
mCustomKeyEditText.addTextChangedListener(new TextWatcher() {
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
new file mode 100644
index 000000000..4b40b7ef1
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
@@ -0,0 +1,40 @@
+package org.sufficientlysecure.keychain.ui.dialog;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.View;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.R;
+
+/** This class extends AlertDiaog.Builder, styling the header using emphasis color.
+ * Note that this class is a huge hack, because dialog boxes aren't easily stylable.
+ * Also, the dialog NEEDS to be called with show() directly, not create(), otherwise
+ * the order of internal operations will lead to a crash!
+ */
+public class CustomAlertDialogBuilder extends AlertDialog.Builder {
+
+ public CustomAlertDialogBuilder(Activity activity) {
+ super(activity);
+ }
+
+ @Override
+ public AlertDialog show() {
+ AlertDialog dialog = super.show();
+
+ int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
+ View divider = dialog.findViewById(dividerId);
+ if (divider != null) {
+ divider.setBackgroundColor(dialog.getContext().getResources().getColor(R.color.emphasis));
+ }
+
+ int textViewId = dialog.getContext().getResources().getIdentifier("android:id/alertTitle", null, null);
+ TextView tv = (TextView) dialog.findViewById(textViewId);
+ if (tv != null) {
+ tv.setTextColor(dialog.getContext().getResources().getColor(R.color.emphasis));
+ }
+
+ return dialog;
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
index 37dec70cd..b42a79993 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
@@ -17,7 +17,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
@@ -59,7 +58,7 @@ public class DeleteFileDialogFragment extends DialogFragment {
final String deleteFile = getArguments().getString(ARG_DELETE_FILE);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
@@ -120,6 +119,6 @@ public class DeleteFileDialogFragment extends DialogFragment {
});
alert.setCancelable(true);
- return alert.create();
+ return alert.show();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
index 93cdef5e3..01d2fae6a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
@@ -17,7 +17,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
@@ -73,7 +72,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
final long[] masterKeyIds = getArguments().getLongArray(ARG_DELETE_MASTER_KEY_IDS);
- AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(activity);
// Setup custom View to display in AlertDialog
LayoutInflater inflater = activity.getLayoutInflater();
@@ -144,7 +143,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
}
});
- return builder.create();
+ return builder.show();
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java
index 6a5baf658..24f93bed7 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java
@@ -97,7 +97,7 @@ public class FileDialogFragment extends DialogFragment {
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(title);
View view = inflater.inflate(R.layout.file_dialog, null);
@@ -157,7 +157,7 @@ public class FileDialogFragment extends DialogFragment {
dismiss();
}
});
- return alert.create();
+ return alert.show();
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java
index 3cb1ce7b4..12fd77141 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java
@@ -135,7 +135,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
final long secretKeyId = getArguments().getLong(ARG_SECRET_KEY_ID);
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(R.string.title_authentication);
@@ -262,7 +262,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
});
mCanKB = true;
- return alert.create();
+ return alert.show();
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
index e5db22a04..04bec3282 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
@@ -81,7 +81,7 @@ public class SetPassphraseDialogFragment extends DialogFragment implements OnEdi
int title = getArguments().getInt(ARG_TITLE);
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(title);
alert.setMessage(R.string.enter_passphrase_twice);
@@ -135,7 +135,7 @@ public class SetPassphraseDialogFragment extends DialogFragment implements OnEdi
}
});
- return alert.create();
+ return alert.show();
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
index cd2364d7c..961f92f03 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.annotation.TargetApi;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
@@ -51,7 +50,7 @@ public class ShareNfcDialogFragment extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(R.string.share_nfc_dialog);
alert.setCancelable(true);
@@ -93,6 +92,6 @@ public class ShareNfcDialogFragment extends DialogFragment {
}
}
- return alert.create();
+ return alert.show();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
index 1b998ec8d..24608784b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.net.Uri;
import android.os.Bundle;
@@ -68,7 +67,7 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
Uri dataUri = getArguments().getParcelable(ARG_KEY_URI);
- AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(getActivity());
alert.setTitle(R.string.share_qr_code_dialog_title);
LayoutInflater inflater = activity.getLayoutInflater();
@@ -102,7 +101,7 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
return null;
}
- return alert.create();
+ return alert.show();
}
private void setQrCode(String data) {
--
cgit v1.2.3
From af4f32e2d73ce514cf8f8748b1f0b6430c802fc9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Thu, 8 May 2014 18:44:54 +0200
Subject: Translations from transifex
---
OpenKeychain/src/main/res/raw-es/help_start.html | 8 ++++----
OpenKeychain/src/main/res/values-de/strings.xml | 8 ++++----
OpenKeychain/src/main/res/values-es/strings.xml | 2 ++
OpenKeychain/src/main/res/values-ja/strings.xml | 2 ++
4 files changed, 12 insertions(+), 8 deletions(-)
(limited to 'OpenKeychain/src')
diff --git a/OpenKeychain/src/main/res/raw-es/help_start.html b/OpenKeychain/src/main/res/raw-es/help_start.html
index fa9b4dc3b..d9eaa90b5 100644
--- a/OpenKeychain/src/main/res/raw-es/help_start.html
+++ b/OpenKeychain/src/main/res/raw-es/help_start.html
@@ -6,10 +6,10 @@
Es recomendable que instales OI File Manager para una mejor selección de archivos y Barcode Scanner para escanear los códigos QR generados. Pulsando en los enlaces se abrirá Google Play o F-Droid.
-
Applications
-
Several applications support OpenKeychain to encrypt/sign your private communication:
Il vous est recommendé d'installer le gestionnaire de fichiers OI pour sa fonction améliorée de séléction des fichiers et le lecteur de codes à barres pour balayer les codes QR générés. Cliquer sur les liens ouvrira Google Play Store ou F-Droid pour l'installation.
Applications
-
Several applications support OpenKeychain to encrypt/sign your private communication:
First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.
-
-
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
-
-
Applications
-
Several applications support OpenKeychain to encrypt/sign your private communication:
-
-
-
diff --git a/OpenKeychain/src/main/res/raw/help_start.html b/OpenKeychain/src/main/res/raw/help_start.html
index 0a1da56f4..26386d3d4 100644
--- a/OpenKeychain/src/main/res/raw/help_start.html
+++ b/OpenKeychain/src/main/res/raw/help_start.html
@@ -11,9 +11,10 @@ And don't add newlines before or after p tags because of transifex -->
It is recommended that you install OI File Manager for enhanced file selection and Barcode Scanner to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.
Applications
-
Several applications support OpenKeychain to encrypt/sign your private communication:
K-9 Mail: OpenKeychain support available in current alpha build!
+
Several applications support OpenKeychain to encrypt/sign your private communication:
+ K-9 Mail: OpenKeychain support available in current alpha build!
+ Conversations: Jabber/XMPP client
+ PGPAuth: App to send a PGP-signed request to a server to open or close $thing