mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-12-26 00:48:51 -05:00
add support for hierarchical log entries
This commit is contained in:
parent
0b9308753d
commit
7fedde2638
@ -106,7 +106,7 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
mType = type;
|
mType = type;
|
||||||
mParameters = parameters;
|
mParameters = parameters;
|
||||||
mIndent = indent;
|
mIndent = indent;
|
||||||
Log.v(Constants.TAG, "log: " + this.toString());
|
Log.v(Constants.TAG, "log: " + this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LogEntryParcel(Parcel source) {
|
public LogEntryParcel(Parcel source) {
|
||||||
@ -122,6 +122,7 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
dest.writeInt(0);
|
||||||
dest.writeInt(mType.ordinal());
|
dest.writeInt(mType.ordinal());
|
||||||
dest.writeSerializable(mParameters);
|
dest.writeSerializable(mParameters);
|
||||||
dest.writeInt(mIndent);
|
dest.writeInt(mIndent);
|
||||||
@ -129,7 +130,12 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
|
|
||||||
public static final Creator<LogEntryParcel> CREATOR = new Creator<LogEntryParcel>() {
|
public static final Creator<LogEntryParcel> CREATOR = new Creator<LogEntryParcel>() {
|
||||||
public LogEntryParcel createFromParcel(final Parcel source) {
|
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) {
|
public LogEntryParcel[] newArray(final int size) {
|
||||||
@ -139,7 +145,7 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "LogEntryParcel{" +
|
return getClass().getSimpleName() + "{" +
|
||||||
"mLevel=" + mType.mLevel +
|
"mLevel=" + mType.mLevel +
|
||||||
", mType=" + mType +
|
", mType=" + mType +
|
||||||
", mParameters=" + Arrays.toString(mParameters) +
|
", 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) {
|
public SuperCardToast createNotify(final Activity activity) {
|
||||||
|
|
||||||
int color;
|
int color;
|
||||||
@ -597,6 +639,15 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
mParcels.add(new OperationResult.LogEntryParcel(type, indent, (Object[]) null));
|
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.getLast().mType, indent, subLog.getLast().mParameters));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
mParcels.clear();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean containsType(LogType type) {
|
public boolean containsType(LogType type) {
|
||||||
for(LogEntryParcel entry : new IterableIterator<LogEntryParcel>(mParcels.iterator())) {
|
for(LogEntryParcel entry : new IterableIterator<LogEntryParcel>(mParcels.iterator())) {
|
||||||
if (entry.mType == type) {
|
if (entry.mType == type) {
|
||||||
|
@ -31,6 +31,8 @@ import android.view.MotionEvent;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnTouchListener;
|
import android.view.View.OnTouchListener;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.AdapterView.OnItemClickListener;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
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;
|
||||||
import org.sufficientlysecure.keychain.service.results.OperationResult.LogEntryParcel;
|
import org.sufficientlysecure.keychain.service.results.OperationResult.LogEntryParcel;
|
||||||
import org.sufficientlysecure.keychain.service.results.OperationResult.LogLevel;
|
import org.sufficientlysecure.keychain.service.results.OperationResult.LogLevel;
|
||||||
|
import org.sufficientlysecure.keychain.service.results.OperationResult.SubLogEntryParcel;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.util.HashMap;
|
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>();
|
HashMap<LogLevel,LogAdapter> mAdapters = new HashMap<LogLevel, LogAdapter>();
|
||||||
LogAdapter mAdapter;
|
LogAdapter mAdapter;
|
||||||
@ -89,6 +92,8 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
getListView().setOnItemClickListener(this);
|
||||||
|
|
||||||
getListView().setFastScrollEnabled(true);
|
getListView().setFastScrollEnabled(true);
|
||||||
getListView().setDividerHeight(0);
|
getListView().setDividerHeight(0);
|
||||||
getListView().setOnTouchListener(this);
|
getListView().setOnTouchListener(this);
|
||||||
@ -126,6 +131,18 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener
|
|||||||
return false;
|
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 class LogAdapter extends ArrayAdapter<LogEntryParcel> {
|
||||||
|
|
||||||
private LayoutInflater mInflater;
|
private LayoutInflater mInflater;
|
||||||
@ -147,10 +164,11 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener
|
|||||||
|
|
||||||
private class ItemHolder {
|
private class ItemHolder {
|
||||||
final TextView mText;
|
final TextView mText;
|
||||||
final ImageView mImg;
|
final ImageView mImg, mSub;
|
||||||
public ItemHolder(TextView text, ImageView image) {
|
public ItemHolder(TextView text, ImageView image, ImageView sub) {
|
||||||
mText = text;
|
mText = text;
|
||||||
mImg = image;
|
mImg = image;
|
||||||
|
mSub = sub;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,13 +180,22 @@ public class LogDisplayFragment extends ListFragment implements OnTouchListener
|
|||||||
convertView = mInflater.inflate(R.layout.log_display_item, parent, false);
|
convertView = mInflater.inflate(R.layout.log_display_item, parent, false);
|
||||||
ih = new ItemHolder(
|
ih = new ItemHolder(
|
||||||
(TextView) convertView.findViewById(R.id.log_text),
|
(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.setTag(ih);
|
convertView.setTag(ih);
|
||||||
} else {
|
} else {
|
||||||
ih = (ItemHolder) convertView.getTag();
|
ih = (ItemHolder) convertView.getTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entry instanceof SubLogEntryParcel) {
|
||||||
|
ih.mSub.setVisibility(View.VISIBLE);
|
||||||
|
convertView.setClickable(false);
|
||||||
|
} else {
|
||||||
|
ih.mSub.setVisibility(View.GONE);
|
||||||
|
convertView.setClickable(true);
|
||||||
|
}
|
||||||
|
|
||||||
// special case: first parameter may be a quantity
|
// special case: first parameter may be a quantity
|
||||||
if (entry.mParameters != null && entry.mParameters.length > 0
|
if (entry.mParameters != null && entry.mParameters.length > 0
|
||||||
&& entry.mParameters[0] instanceof Integer) {
|
&& entry.mParameters[0] instanceof Integer) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="horizontal" android:layout_width="match_parent"
|
android:orientation="horizontal" android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
@ -12,11 +12,26 @@
|
|||||||
android:background="@color/bg_gray" />
|
android:background="@color/bg_gray" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Log Entry Text"
|
android:text="Log Entry Text"
|
||||||
android:id="@+id/log_text"
|
android:id="@+id/log_text"
|
||||||
android:layout_marginTop="4dp"
|
android:layout_marginTop="4dp"
|
||||||
android:layout_marginBottom="4dp"
|
android:layout_marginBottom="4dp"
|
||||||
android:layout_marginLeft="8dp" />
|
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:minWidth="10dp"
|
||||||
|
android:background="@drawable/ic_action_view_as_list"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:gravity="center_vertical" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
Loading…
Reference in New Issue
Block a user