Merge branch 'development' of github.com:open-keychain/open-keychain into development

This commit is contained in:
Vincent Breitmoser 2014-10-23 23:31:28 +02:00
commit 76a1e99d7e
13 changed files with 92 additions and 60 deletions

View File

@ -23,6 +23,7 @@ import android.app.Application;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
@ -139,6 +140,7 @@ public class KeychainApplication extends Application {
} }
static void brandGlowEffect(Context context, int brandColor) { static void brandGlowEffect(Context context, int brandColor) {
try {
// terrible hack to brand the edge overscroll glow effect // terrible hack to brand the edge overscroll glow effect
// https://gist.github.com/menny/7878762#file-brandgloweffect_full-java // https://gist.github.com/menny/7878762#file-brandgloweffect_full-java
@ -150,5 +152,8 @@ public class KeychainApplication extends Application {
int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable", "android"); int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable", "android");
Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId); Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId);
androidEdge.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN); androidEdge.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN);
} catch (Resources.NotFoundException e) {
// no hack on Android 5
}
} }
} }

View File

@ -41,6 +41,7 @@ import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Utf8Util; import org.sufficientlysecure.keychain.util.Utf8Util;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
@ -160,11 +161,15 @@ public class UncachedKeyRing {
} }
try { try {
while(stream.available() > 0) { while (stream.available() > 0) {
// if there are no objects left from the last factory, create a new one // if there are no objects left from the last factory, create a new one
if (mObjectFactory == null) { if (mObjectFactory == null) {
mObjectFactory = new PGPObjectFactory(PGPUtil.getDecoderStream(stream), InputStream in = PGPUtil.getDecoderStream(stream);
new JcaKeyFingerprintCalculator()); if (!BufferedInputStream.class.isInstance(in)) {
in = new BufferedInputStream(in);
}
mObjectFactory = new PGPObjectFactory(in, new JcaKeyFingerprintCalculator());
} }
// go through all objects in this block // go through all objects in this block
@ -184,9 +189,10 @@ public class UncachedKeyRing {
mObjectFactory = null; mObjectFactory = null;
} }
} catch (IOException e) { } catch (IOException e) {
Log.e(Constants.TAG, "IOException while processing stream", e); Log.e(Constants.TAG, "IOException while processing stream. ArmoredInputStream CRC check failed?", e);
} catch (ArrayIndexOutOfBoundsException e) {
Log.e(Constants.TAG, "ArmoredInputStream decode failed, symbol is not in decodingTable!", e);
} }
} }
@Override @Override

View File

@ -24,6 +24,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@ -51,11 +52,10 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AbsListView.MultiChoiceModeListener; import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
@ -84,7 +84,6 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import edu.cmu.cylab.starslinger.exchange.ExchangeActivity; import edu.cmu.cylab.starslinger.exchange.ExchangeActivity;
import edu.cmu.cylab.starslinger.exchange.ExchangeConfig; import edu.cmu.cylab.starslinger.exchange.ExchangeConfig;
@ -585,18 +584,22 @@ public class KeyListFragment extends LoaderFragment
TextView mMainUserIdRest; TextView mMainUserIdRest;
ImageView mStatus; ImageView mStatus;
View mSlinger; View mSlinger;
ImageButton mSlingerButton;
} }
@Override @Override
public View newView(Context context, Cursor cursor, ViewGroup parent) { public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mInflater.inflate(R.layout.key_list_item, parent, false); View view = mInflater.inflate(R.layout.key_list_item, parent, false);
final ItemViewHolder holder = new ItemViewHolder(); final ItemViewHolder holder = new ItemViewHolder();
holder.mMainUserId = (TextView) view.findViewById(R.id.mainUserId); holder.mMainUserId = (TextView) view.findViewById(R.id.key_list_item_name);
holder.mMainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest); holder.mMainUserIdRest = (TextView) view.findViewById(R.id.key_list_item_email);
holder.mStatus = (ImageView) view.findViewById(R.id.status_icon); holder.mStatus = (ImageView) view.findViewById(R.id.key_list_item_status_icon);
holder.mSlinger = view.findViewById(R.id.slinger_view); holder.mSlinger = view.findViewById(R.id.key_list_item_slinger_view);
holder.mSlingerButton = (ImageButton) view.findViewById(R.id.key_list_item_slinger_button);
holder.mSlingerButton.setColorFilter(context.getResources().getColor(R.color.tertiary_text_light),
PorterDuff.Mode.SRC_IN);
view.setTag(holder); view.setTag(holder);
view.findViewById(R.id.slinger_button).setOnClickListener(new OnClickListener() { view.findViewById(R.id.key_list_item_slinger_button).setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (holder.mMasterKeyId != null) { if (holder.mMasterKeyId != null) {

View File

@ -21,6 +21,7 @@ import android.annotation.TargetApi;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
@ -33,6 +34,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.animation.AlphaAnimation; import android.view.animation.AlphaAnimation;
import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -68,7 +70,7 @@ public class ViewKeyShareFragment extends LoaderFragment implements
private View mFingerprintClipboardButton; private View mFingerprintClipboardButton;
private View mKeyShareButton; private View mKeyShareButton;
private View mKeyClipboardButton; private View mKeyClipboardButton;
private View mKeySafeSlingerButton; private ImageButton mKeySafeSlingerButton;
private View mNfcHelpButton; private View mNfcHelpButton;
private View mNfcPrefsButton; private View mNfcPrefsButton;
private View mKeyUploadButton; private View mKeyUploadButton;
@ -96,11 +98,14 @@ public class ViewKeyShareFragment extends LoaderFragment implements
mFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard); mFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard);
mKeyShareButton = view.findViewById(R.id.view_key_action_key_share); mKeyShareButton = view.findViewById(R.id.view_key_action_key_share);
mKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard); mKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard);
mKeySafeSlingerButton = view.findViewById(R.id.view_key_action_key_safeslinger); mKeySafeSlingerButton = (ImageButton) view.findViewById(R.id.view_key_action_key_safeslinger);
mNfcHelpButton = view.findViewById(R.id.view_key_action_nfc_help); mNfcHelpButton = view.findViewById(R.id.view_key_action_nfc_help);
mNfcPrefsButton = view.findViewById(R.id.view_key_action_nfc_prefs); mNfcPrefsButton = view.findViewById(R.id.view_key_action_nfc_prefs);
mKeyUploadButton = view.findViewById(R.id.view_key_action_upload); mKeyUploadButton = view.findViewById(R.id.view_key_action_upload);
mKeySafeSlingerButton.setColorFilter(getResources().getColor(R.color.tertiary_text_light),
PorterDuff.Mode.SRC_IN);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mNfcPrefsButton.setVisibility(View.VISIBLE); mNfcPrefsButton.setVisibility(View.VISIBLE);
} else { } else {

View File

@ -169,18 +169,27 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
} }
if (entry.isRevoked()) { if (entry.isRevoked()) {
holder.status.setVisibility(View.VISIBLE); KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_REVOKED, true);
KeyFormattingUtils.setStatusImage(getContext(), holder.status, KeyFormattingUtils.STATE_REVOKED);
// no more space for algorithm display
holder.algorithm.setVisibility(View.GONE);
} else if (entry.isExpired()) { } else if (entry.isExpired()) {
KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_EXPIRED, true);
}
if (entry.isRevoked() || entry.isExpired()) {
holder.status.setVisibility(View.VISIBLE); holder.status.setVisibility(View.VISIBLE);
KeyFormattingUtils.setStatusImage(getContext(), holder.status, KeyFormattingUtils.STATE_EXPIRED);
// no more space for algorithm display // no more space for algorithm display
holder.algorithm.setVisibility(View.GONE); holder.algorithm.setVisibility(View.GONE);
holder.mainUserId.setTextColor(getContext().getResources().getColor(R.color.bg_gray));
holder.mainUserIdRest.setTextColor(getContext().getResources().getColor(R.color.bg_gray));
holder.keyId.setTextColor(getContext().getResources().getColor(R.color.bg_gray));
} else { } else {
holder.status.setVisibility(View.GONE); holder.status.setVisibility(View.GONE);
holder.algorithm.setVisibility(View.VISIBLE); holder.algorithm.setVisibility(View.VISIBLE);
holder.mainUserId.setTextColor(getContext().getResources().getColor(R.color.black));
holder.mainUserIdRest.setTextColor(getContext().getResources().getColor(R.color.black));
holder.keyId.setTextColor(getContext().getResources().getColor(R.color.black));
} }
if (entry.getUserIds().size() == 1) { if (entry.getUserIds().size() == 1) {
@ -203,6 +212,12 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
uidView.setText(highlighter.highlight(cUserId)); uidView.setText(highlighter.highlight(cUserId));
uidView.setPadding(0, 0, FormattingUtils.dpToPx(getContext(), 8), 0); uidView.setPadding(0, 0, FormattingUtils.dpToPx(getContext(), 8), 0);
if (entry.isRevoked() || entry.isExpired()) {
uidView.setTextColor(getContext().getResources().getColor(R.color.bg_gray));
} else {
uidView.setTextColor(getContext().getResources().getColor(R.color.black));
}
holder.userIdsList.addView(uidView); holder.userIdsList.addView(uidView);
for (String email : cEmails) { for (String email : cEmails) {
@ -212,6 +227,13 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
FormattingUtils.dpToPx(getContext(), 16), 0, FormattingUtils.dpToPx(getContext(), 16), 0,
FormattingUtils.dpToPx(getContext(), 8), 0); FormattingUtils.dpToPx(getContext(), 8), 0);
emailView.setText(highlighter.highlight(email)); emailView.setText(highlighter.highlight(email));
if (entry.isRevoked() || entry.isExpired()) {
emailView.setTextColor(getContext().getResources().getColor(R.color.bg_gray));
} else {
emailView.setTextColor(getContext().getResources().getColor(R.color.black));
}
holder.userIdsList.addView(emailView); holder.userIdsList.addView(emailView);
} }
} }

View File

@ -152,7 +152,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
View view = mInflater.inflate(R.layout.select_key_item, null); View view = mInflater.inflate(R.layout.select_key_item, null);
ViewHolderItem holder = new ViewHolderItem(); ViewHolderItem holder = new ViewHolderItem();
holder.view = view; holder.view = view;
holder.mainUserId = (TextView) view.findViewById(R.id.mainUserId); holder.mainUserId = (TextView) view.findViewById(R.id.key_list_item_name);
holder.mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest); holder.mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
holder.keyId = (TextView) view.findViewById(R.id.subkey_item_key_id); holder.keyId = (TextView) view.findViewById(R.id.subkey_item_key_id);
holder.statusIcon = (ImageView) view.findViewById(R.id.status_icon); holder.statusIcon = (ImageView) view.findViewById(R.id.status_icon);

View File

@ -249,15 +249,11 @@ public class SubkeysAdapter extends CursorAdapter {
vKeyExpiry.setText(context.getString(R.string.label_expiry) + ": " + context.getString(R.string.none)); vKeyExpiry.setText(context.getString(R.string.label_expiry) + ": " + context.getString(R.string.none));
} }
// if key is expired or revoked, strike through text // if key is expired or revoked...
boolean isInvalid = isRevoked || isExpired; boolean isInvalid = isRevoked || isExpired;
if (isInvalid) { if (isInvalid) {
vStatus.setVisibility(View.VISIBLE); vStatus.setVisibility(View.VISIBLE);
vKeyId.setText(FormattingUtils.strikeOutText(vKeyId.getText()));
vKeyDetails.setText(FormattingUtils.strikeOutText(vKeyDetails.getText()));
vKeyExpiry.setText(FormattingUtils.strikeOutText(vKeyExpiry.getText()));
vCertifyIcon.setColorFilter( vCertifyIcon.setColorFilter(
mContext.getResources().getColor(R.color.bg_gray), mContext.getResources().getColor(R.color.bg_gray),
PorterDuff.Mode.SRC_IN); PorterDuff.Mode.SRC_IN);

View File

@ -166,13 +166,10 @@ public class UserIdsAdapter extends CursorAdapter implements AdapterView.OnItemC
// set revocation icon (can this even be primary?) // set revocation icon (can this even be primary?)
KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_REVOKED, true); KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_REVOKED, true);
// disable and strike through text for revoked user ids // disable revoked user ids
vName.setEnabled(false); vName.setEnabled(false);
vAddress.setEnabled(false); vAddress.setEnabled(false);
vComment.setEnabled(false); vComment.setEnabled(false);
vName.setText(FormattingUtils.strikeOutText(vName.getText()));
vAddress.setText(FormattingUtils.strikeOutText(vAddress.getText()));
vComment.setText(FormattingUtils.strikeOutText(vComment.getText()));
} else { } else {
vName.setEnabled(true); vName.setEnabled(true);
vAddress.setEnabled(true); vAddress.setEnabled(true);

View File

@ -102,16 +102,16 @@ public class CertifyKeySpinner extends KeySpinner {
@Override @Override
boolean setStatus(Context context, Cursor cursor, ImageView statusView) { boolean setStatus(Context context, Cursor cursor, ImageView statusView) {
if (cursor.getInt(mIndexIsRevoked) != 0) { if (cursor.getInt(mIndexIsRevoked) != 0) {
KeyFormattingUtils.setStatusImage(getContext(), statusView, KeyFormattingUtils.STATE_REVOKED); KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, true);
return false; return false;
} }
if (cursor.getInt(mIndexIsExpired) != 0) { if (cursor.getInt(mIndexIsExpired) != 0) {
KeyFormattingUtils.setStatusImage(getContext(), statusView, KeyFormattingUtils.STATE_EXPIRED); KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, true);
return false; return false;
} }
// don't invalidate the "None" entry, which is also null! // don't invalidate the "None" entry, which is also null!
if (cursor.getPosition() != 0 && cursor.isNull(mIndexHasCertify)) { if (cursor.getPosition() != 0 && cursor.isNull(mIndexHasCertify)) {
KeyFormattingUtils.setStatusImage(getContext(), statusView, KeyFormattingUtils.STATE_UNAVAILABLE); KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, true);
return false; return false;
} }

View File

@ -84,15 +84,15 @@ public class SignKeySpinner extends KeySpinner {
@Override @Override
boolean setStatus(Context context, Cursor cursor, ImageView statusView) { boolean setStatus(Context context, Cursor cursor, ImageView statusView) {
if (cursor.getInt(mIndexIsRevoked) != 0) { if (cursor.getInt(mIndexIsRevoked) != 0) {
KeyFormattingUtils.setStatusImage(getContext(), statusView, KeyFormattingUtils.STATE_REVOKED); KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, true);
return false; return false;
} }
if (cursor.getInt(mIndexIsExpired) != 0) { if (cursor.getInt(mIndexIsExpired) != 0) {
KeyFormattingUtils.setStatusImage(getContext(), statusView, KeyFormattingUtils.STATE_EXPIRED); KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, true);
return false; return false;
} }
if (cursor.getInt(mIndexHasSign) == 0) { if (cursor.getInt(mIndexHasSign) == 0) {
KeyFormattingUtils.setStatusImage(getContext(), statusView, KeyFormattingUtils.STATE_UNAVAILABLE); KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, true);
return false; return false;
} }

View File

@ -6,8 +6,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/holo_gray_bright"> android:background="@color/holo_gray_bright">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
android:id="@+id/result_main_layout"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -99,7 +98,6 @@
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/tertiary_text_light"
android:text="alice@example.com (set in-code)" android:text="alice@example.com (set in-code)"
android:gravity="center_vertical" /> android:gravity="center_vertical" />

View File

@ -98,16 +98,16 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/decrypt_invalid_text" android:text="@string/decrypt_invalid_text"
android:padding="8dp" android:padding="16dp"
android:layout_gravity="center" android:layout_gravity="center"
android:textColor="@color/android_red_dark" /> android:textColor="@color/android_red_light" />
<Button <Button
android:id="@+id/decrypt_text_invalid_button" android:id="@+id/decrypt_text_invalid_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/button_edgy" android:background="@drawable/button_edgy"
android:textColor="@color/android_red_dark" android:textColor="@color/android_red_light"
android:text="@string/decrypt_invalid_button" android:text="@string/decrypt_invalid_button"
android:layout_gravity="center_horizontal" /> android:layout_gravity="center_horizontal" />
</LinearLayout> </LinearLayout>

View File

@ -22,14 +22,14 @@
android:paddingBottom="4dp"> android:paddingBottom="4dp">
<TextView <TextView
android:id="@+id/mainUserId" android:id="@+id/key_list_item_name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/label_main_user_id" android:text="@string/label_main_user_id"
android:textAppearance="?android:attr/textAppearanceMedium" /> android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView <TextView
android:id="@+id/mainUserIdRest" android:id="@+id/key_list_item_email"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true" android:singleLine="true"
@ -39,9 +39,9 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/slinger_view" android:id="@+id/key_list_item_slinger_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
@ -54,18 +54,18 @@
android:background="?android:attr/listDivider" /> android:background="?android:attr/listDivider" />
<ImageButton <ImageButton
android:id="@+id/slinger_button" android:id="@+id/key_list_item_slinger_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_gravity="center" android:layout_gravity="center"
android:src="@drawable/ic_action_safeslinger" android:src="@drawable/ic_action_safeslinger"
android:padding="16dp" android:padding="12dp"
style="@style/SelectableItem" /> style="@style/SelectableItem" />
</LinearLayout> </LinearLayout>
<ImageView <ImageView
android:id="@+id/status_icon" android:id="@+id/key_list_item_status_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"