diff options
Diffstat (limited to 'OpenKeychain/src/main')
6 files changed, 212 insertions, 29 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java index 2a74c8d8c..b0c801a93 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpCertifyOperation.java @@ -121,6 +121,7 @@ public class PgpCertifyOperation { log.add(LogType.MSG_CRT_SAVE, 2, KeyFormattingUtils.convertKeyIdToHex(certifiedKey.getMasterKeyId())); // store the signed key in our local cache + mProviderHelper.clearLog(); SaveKeyringResult result = mProviderHelper.savePublicKeyRing(certifiedKey); if (result.success()) { @@ -129,6 +130,8 @@ public class PgpCertifyOperation { log.add(LogType.MSG_CRT_WARN_SAVE_FAILED, 3); } + log.add(result, 2); + // TODO do something with import results } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java index 964c535dd..9b21b49ce 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java @@ -117,10 +117,12 @@ public class PgpImportExport { public ImportKeyResult importKeyRings(Iterator<ParcelableKeyRing> entries, int num) { updateProgress(R.string.progress_importing, 0, 100); + OperationLog log = new OperationLog(); + // If there aren't even any keys, do nothing here. if (entries == null || !entries.hasNext()) { return new ImportKeyResult( - ImportKeyResult.RESULT_FAIL_NOTHING, mProviderHelper.getLog(), 0, 0, 0, 0, + ImportKeyResult.RESULT_FAIL_NOTHING, log, 0, 0, 0, 0, new long[]{}); } @@ -156,6 +158,7 @@ public class PgpImportExport { } SaveKeyringResult result; + mProviderHelper.clearLog(); if (key.isSecret()) { result = mProviderHelper.saveSecretKeyRing(key, new ProgressScaler(mProgressable, (int)(position*progSteps), (int)((position+1)*progSteps), 100)); @@ -176,6 +179,8 @@ public class PgpImportExport { importedMasterKeyIds.add(key.getMasterKeyId()); } + log.add(result, 1); + } catch (IOException e) { Log.e(Constants.TAG, "Encountered bad key on import!", e); ++badKeys; @@ -187,7 +192,6 @@ public class PgpImportExport { position++; } - OperationLog log = mProviderHelper.getLog(); int resultType = 0; // special return case: no new keys at all if (badKeys == 0 && newKeys == 0 && oldKeys == 0) { 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 6b96a1e6e..273f9c75f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java @@ -133,6 +133,12 @@ public class ProviderHelper { } } + public void clearLog() { + if (mLog != null) { + mLog.clear(); + } + } + // If we ever switch to api level 11, we can ditch this whole mess! public static final int FIELD_TYPE_NULL = 1; // this is called integer to stay coherent with the constants in Cursor (api level 11) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/OperationResult.java index d32e3a4a9..d65a84e5b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/OperationResult.java @@ -106,7 +106,7 @@ public abstract class OperationResult implements Parcelable { mType = type; mParameters = parameters; mIndent = indent; - Log.v(Constants.TAG, "log: " + this.toString()); + Log.v(Constants.TAG, "log: " + this); } public LogEntryParcel(Parcel source) { @@ -122,6 +122,7 @@ public abstract class OperationResult implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(0); dest.writeInt(mType.ordinal()); dest.writeSerializable(mParameters); dest.writeInt(mIndent); @@ -129,7 +130,12 @@ public abstract class OperationResult implements Parcelable { public static final Creator<LogEntryParcel> CREATOR = new Creator<LogEntryParcel>() { public LogEntryParcel createFromParcel(final Parcel source) { - return new LogEntryParcel(source); + // Actually create LogEntryParcel or SubLogEntryParcel depending on type indicator + if (source.readInt() == 0) { + return new LogEntryParcel(source); + } else { + return new SubLogEntryParcel(source); + } } public LogEntryParcel[] newArray(final int size) { @@ -139,7 +145,7 @@ public abstract class OperationResult implements Parcelable { @Override public String toString() { - return "LogEntryParcel{" + + return getClass().getSimpleName() + "{" + "mLevel=" + mType.mLevel + ", mType=" + mType + ", mParameters=" + Arrays.toString(mParameters) + @@ -148,6 +154,42 @@ public abstract class OperationResult implements Parcelable { } } + public static class SubLogEntryParcel extends LogEntryParcel { + + OperationResult mSubResult; + + public SubLogEntryParcel(OperationResult subResult, LogType type, int indent, Object... parameters) { + super(type, indent, parameters); + mSubResult = subResult; + + Log.v(Constants.TAG, "log: " + this); + } + + public SubLogEntryParcel(Parcel source) { + super(source); + mSubResult = source.readParcelable(SubLogEntryParcel.class.getClassLoader()); + } + + public OperationResult getSubResult() { + return mSubResult; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(1); + dest.writeInt(mType.ordinal()); + dest.writeSerializable(mParameters); + dest.writeInt(mIndent); + dest.writeParcelable(mSubResult, 0); + } + + } + public SuperCardToast createNotify(final Activity activity) { int color; @@ -597,6 +639,15 @@ public abstract class OperationResult implements Parcelable { mParcels.add(new OperationResult.LogEntryParcel(type, indent, (Object[]) null)); } + public void add(OperationResult subResult, int indent) { + OperationLog subLog = subResult.getLog(); + mParcels.add(new SubLogEntryParcel(subResult, subLog.getFirst().mType, indent, subLog.getFirst().mParameters)); + } + + public void clear() { + mParcels.clear(); + } + public boolean containsType(LogType type) { for(LogEntryParcel entry : new IterableIterator<LogEntryParcel>(mParcels.iterator())) { if (entry.mType == type) { @@ -627,6 +678,13 @@ public abstract class OperationResult implements Parcelable { return mParcels.isEmpty(); } + public LogEntryParcel getFirst() { + if (mParcels.isEmpty()) { + return null; + } + return mParcels.get(0); + } + public LogEntryParcel getLast() { if (mParcels.isEmpty()) { return null; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index 4fdfd3a21..d8a7e397d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -31,6 +31,8 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; @@ -40,11 +42,12 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.service.results.OperationResult; import org.sufficientlysecure.keychain.service.results.OperationResult.LogEntryParcel; import org.sufficientlysecure.keychain.service.results.OperationResult.LogLevel; +import org.sufficientlysecure.keychain.service.results.OperationResult.SubLogEntryParcel; import org.sufficientlysecure.keychain.util.Log; import java.util.HashMap; -public class LogDisplayFragment extends ListFragment implements OnTouchListener { +public class LogDisplayFragment extends ListFragment implements OnTouchListener, OnItemClickListener { HashMap<LogLevel,LogAdapter> mAdapters = new HashMap<LogLevel, LogAdapter>(); LogAdapter mAdapter; @@ -89,6 +92,8 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener } }); + getListView().setOnItemClickListener(this); + getListView().setFastScrollEnabled(true); getListView().setDividerHeight(0); getListView().setOnTouchListener(this); @@ -126,6 +131,18 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener return false; } + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + LogEntryParcel parcel = mAdapter.getItem(position); + if ( ! (parcel instanceof SubLogEntryParcel)) { + return; + } + Intent intent = new Intent( + getActivity(), LogDisplayActivity.class); + intent.putExtra(LogDisplayFragment.EXTRA_RESULT, ((SubLogEntryParcel) parcel).getSubResult()); + startActivity(intent); + } + private class LogAdapter extends ArrayAdapter<LogEntryParcel> { private LayoutInflater mInflater; @@ -146,11 +163,16 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener } private class ItemHolder { - final TextView mText; - final ImageView mImg; - public ItemHolder(TextView text, ImageView image) { + final View mSecond; + final TextView mText, mSecondText; + final ImageView mImg, mSecondImg, mSub; + public ItemHolder(TextView text, ImageView image, ImageView sub, View second, TextView secondText, ImageView secondImg) { mText = text; mImg = image; + mSub = sub; + mSecond = second; + mSecondText = secondText; + mSecondImg = secondImg; } } @@ -162,13 +184,55 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener convertView = mInflater.inflate(R.layout.log_display_item, parent, false); ih = new ItemHolder( (TextView) convertView.findViewById(R.id.log_text), - (ImageView) convertView.findViewById(R.id.log_img) + (ImageView) convertView.findViewById(R.id.log_img), + (ImageView) convertView.findViewById(R.id.log_sub), + convertView.findViewById(R.id.log_second), + (TextView) convertView.findViewById(R.id.log_second_text), + (ImageView) convertView.findViewById(R.id.log_second_img) ); convertView.setTag(ih); } else { ih = (ItemHolder) convertView.getTag(); } + if (entry instanceof SubLogEntryParcel) { + ih.mSub.setVisibility(View.VISIBLE); + convertView.setClickable(false); + + OperationResult result = ((SubLogEntryParcel) entry).getSubResult(); + LogEntryParcel subEntry = result.getLog().getLast(); + if (subEntry != null) { + ih.mSecond.setVisibility(View.VISIBLE); + // special case: first parameter may be a quantity + if (subEntry.mParameters != null && subEntry.mParameters.length > 0 + && subEntry.mParameters[0] instanceof Integer) { + ih.mSecondText.setText(getResources().getQuantityString(subEntry.mType.getMsgId(), + (Integer) subEntry.mParameters[0], + subEntry.mParameters)); + } else { + ih.mSecondText.setText(getResources().getString(subEntry.mType.getMsgId(), + subEntry.mParameters)); + } + ih.mSecondText.setTextColor(subEntry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : Color.BLACK); + switch (subEntry.mType.mLevel) { + case DEBUG: ih.mSecondImg.setBackgroundColor(Color.GRAY); break; + case INFO: ih.mSecondImg.setBackgroundColor(Color.BLACK); break; + case WARN: ih.mSecondImg.setBackgroundColor(Color.YELLOW); break; + case ERROR: ih.mSecondImg.setBackgroundColor(Color.RED); break; + case START: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.emphasis)); break; + case OK: ih.mSecondImg.setBackgroundColor(Color.GREEN); break; + case CANCELLED: ih.mSecondImg.setBackgroundColor(Color.RED); break; + } + } else { + ih.mSecond.setVisibility(View.GONE); + } + + } else { + ih.mSub.setVisibility(View.GONE); + ih.mSecond.setVisibility(View.GONE); + convertView.setClickable(true); + } + // special case: first parameter may be a quantity if (entry.mParameters != null && entry.mParameters.length > 0 && entry.mParameters[0] instanceof Integer) { @@ -179,14 +243,14 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener ih.mText.setText(getResources().getString(entry.mType.getMsgId(), entry.mParameters)); } - ih.mText.setTextColor(entry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : Color.BLACK); convertView.setPadding((entry.mIndent) * dipFactor, 0, 0, 0); + ih.mText.setTextColor(entry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : Color.BLACK); switch (entry.mType.mLevel) { case DEBUG: ih.mImg.setBackgroundColor(Color.GRAY); break; case INFO: ih.mImg.setBackgroundColor(Color.BLACK); break; case WARN: ih.mImg.setBackgroundColor(Color.YELLOW); break; case ERROR: ih.mImg.setBackgroundColor(Color.RED); break; - case START: ih.mImg.setBackgroundColor(Color.GREEN); break; + case START: ih.mImg.setBackgroundColor(getResources().getColor(R.color.emphasis)); break; case OK: ih.mImg.setBackgroundColor(Color.GREEN); break; case CANCELLED: ih.mImg.setBackgroundColor(Color.RED); break; } diff --git a/OpenKeychain/src/main/res/layout/log_display_item.xml b/OpenKeychain/src/main/res/layout/log_display_item.xml index 35489afed..d3938aaf0 100644 --- a/OpenKeychain/src/main/res/layout/log_display_item.xml +++ b/OpenKeychain/src/main/res/layout/log_display_item.xml @@ -1,22 +1,70 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ImageView - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:id="@+id/log_img" - android:minWidth="10dp" - android:background="@color/bg_gray" /> - - <TextView - android:layout_width="wrap_content" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:id="@+id/log_img" + android:minWidth="10dp" + android:background="@color/bg_gray" /> + + <TextView + android:layout_width="0dp" + android:layout_height="wrap_content" + android:text="Log Entry Text" + android:id="@+id/log_text" + android:layout_marginTop="4dp" + android:layout_marginBottom="4dp" + android:layout_marginLeft="8dp" + android:layout_weight="1" + android:layout_gravity="center_vertical"/> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/log_sub" + android:src="@drawable/ic_action_view_as_list" + android:layout_marginBottom="4dp" + android:layout_marginLeft="8dp" + android:layout_marginRight="8dp" + android:gravity="center_vertical" + android:layout_marginTop="4dp" /> + + </LinearLayout> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="Log Entry Text" - android:id="@+id/log_text" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" - android:layout_marginLeft="8dp" /> + android:id="@+id/log_second" + android:layout_marginLeft="8dip"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:id="@+id/log_second_img" + android:minWidth="10dp" + android:background="@color/bg_gray" /> + + <TextView + android:layout_width="0dp" + android:layout_height="wrap_content" + android:text="Log Entry Text" + android:id="@+id/log_second_text" + android:layout_marginTop="4dp" + android:layout_marginBottom="4dp" + android:layout_marginLeft="8dp" + android:layout_weight="1" + android:layout_gravity="center_vertical"/> + </LinearLayout> + </LinearLayout>
\ No newline at end of file |