add failure state to DecryptListFragment

This commit is contained in:
Vincent Breitmoser 2015-06-22 03:13:55 +02:00
parent fe7d13c85f
commit 361ad99928
2 changed files with 151 additions and 68 deletions

View File

@ -577,74 +577,104 @@ public class DecryptListFragment
// - replace the contents of the view with that element // - replace the contents of the view with that element
final ViewModel model = mDataset.get(position); final ViewModel model = mDataset.get(position);
if (model.hasResult()) { if (!model.hasResult()) {
if (holder.vAnimator.getDisplayedChild() != 1) { bindItemProgress(holder, model);
holder.vAnimator.setDisplayedChild(1); return;
}
KeyFormattingUtils.setStatus(mContext, holder, model.mResult);
final OpenPgpMetadata metadata = model.mResult.getDecryptMetadata();
String filename;
if (metadata == null) {
filename = mContext.getString(R.string.filename_unknown);
} else if (TextUtils.isEmpty(metadata.getFilename())) {
filename = mContext.getString("text/plain".equals(metadata.getMimeType())
? R.string.filename_unknown_text : R.string.filename_unknown);
} else {
filename = metadata.getFilename();
}
holder.vFilename.setText(filename);
long size = metadata == null ? 0 : metadata.getOriginalSize();
if (size == -1 || size == 0) {
holder.vFilesize.setText("");
} else {
holder.vFilesize.setText(FileHelper.readableFileSize(size));
}
// TODO thumbnail from OpenPgpMetadata?
if (model.mIcon != null) {
holder.vThumbnail.setImageDrawable(model.mIcon);
} else {
holder.vThumbnail.setImageResource(R.drawable.ic_doc_generic_am);
}
holder.vFile.setOnClickListener(model.mOnFileClickListener);
holder.vSignatureLayout.setOnClickListener(model.mOnKeyClickListener);
holder.vContextMenu.setTag(model);
holder.vContextMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mMenuClickedModel = model;
PopupMenu menu = new PopupMenu(mContext, view);
menu.inflate(R.menu.decrypt_item_context_menu);
if (!"file".equals(model.mInputUri.getScheme())) {
menu.getMenu().findItem(R.id.decrypt_delete).setVisible(false);
}
menu.setOnMenuItemClickListener(mMenuItemClickListener);
menu.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(PopupMenu popupMenu) {
mMenuClickedModel = null;
}
});
menu.show();
}
});
} else {
if (holder.vAnimator.getDisplayedChild() != 0) {
holder.vAnimator.setDisplayedChild(0);
}
holder.vProgress.setProgress(model.mProgress);
holder.vProgress.setMax(model.mMax);
holder.vProgressMsg.setText(model.mProgressMsg);
} }
if (model.mResult.success()) {
bindItemSuccess(holder, model);
} else {
bindItemFailure(holder, model);
}
}
private void bindItemProgress(ViewHolder holder, ViewModel model) {
if (holder.vAnimator.getDisplayedChild() != 0) {
holder.vAnimator.setDisplayedChild(0);
}
holder.vProgress.setProgress(model.mProgress);
holder.vProgress.setMax(model.mMax);
holder.vProgressMsg.setText(model.mProgressMsg);
}
private void bindItemSuccess(ViewHolder holder, final ViewModel model) {
if (holder.vAnimator.getDisplayedChild() != 1) {
holder.vAnimator.setDisplayedChild(1);
}
KeyFormattingUtils.setStatus(mContext, holder, model.mResult);
final OpenPgpMetadata metadata = model.mResult.getDecryptMetadata();
String filename;
if (metadata == null) {
filename = mContext.getString(R.string.filename_unknown);
} else if (TextUtils.isEmpty(metadata.getFilename())) {
filename = mContext.getString("text/plain".equals(metadata.getMimeType())
? R.string.filename_unknown_text : R.string.filename_unknown);
} else {
filename = metadata.getFilename();
}
holder.vFilename.setText(filename);
long size = metadata == null ? 0 : metadata.getOriginalSize();
if (size == -1 || size == 0) {
holder.vFilesize.setText("");
} else {
holder.vFilesize.setText(FileHelper.readableFileSize(size));
}
// TODO thumbnail from OpenPgpMetadata?
if (model.mIcon != null) {
holder.vThumbnail.setImageDrawable(model.mIcon);
} else {
holder.vThumbnail.setImageResource(R.drawable.ic_doc_generic_am);
}
holder.vFile.setOnClickListener(model.mOnFileClickListener);
holder.vSignatureLayout.setOnClickListener(model.mOnKeyClickListener);
holder.vContextMenu.setTag(model);
holder.vContextMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mMenuClickedModel = model;
PopupMenu menu = new PopupMenu(mContext, view);
menu.inflate(R.menu.decrypt_item_context_menu);
if (!"file".equals(model.mInputUri.getScheme())) {
menu.getMenu().findItem(R.id.decrypt_delete).setVisible(false);
}
menu.setOnMenuItemClickListener(mMenuItemClickListener);
menu.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(PopupMenu popupMenu) {
mMenuClickedModel = null;
}
});
menu.show();
}
});
}
private void bindItemFailure(ViewHolder holder, final ViewModel model) {
if (holder.vAnimator.getDisplayedChild() != 2) {
holder.vAnimator.setDisplayedChild(2);
}
holder.vErrorMsg.setText(model.mResult.getLog().getLast().mType.getMsgId());
holder.vErrorViewLog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, LogDisplayActivity.class);
intent.putExtra(LogDisplayFragment.EXTRA_RESULT, model.mResult);
mContext.startActivity(intent);
}
});
} }
// Return the size of your dataset (invoked by the layout manager) // Return the size of your dataset (invoked by the layout manager)
@ -719,9 +749,11 @@ public class DecryptListFragment
public TextView vSignatureName; public TextView vSignatureName;
public TextView vSignatureMail; public TextView vSignatureMail;
public TextView vSignatureAction; public TextView vSignatureAction;
public View vContextMenu; public View vContextMenu;
public TextView vErrorMsg;
public ImageView vErrorViewLog;
public ViewHolder(View itemView) { public ViewHolder(View itemView) {
super(itemView); super(itemView);
@ -747,6 +779,9 @@ public class DecryptListFragment
vContextMenu = itemView.findViewById(R.id.context_menu); vContextMenu = itemView.findViewById(R.id.context_menu);
vErrorMsg = (TextView) itemView.findViewById(R.id.result_error_msg);
vErrorViewLog = (ImageView) itemView.findViewById(R.id.result_error_log);
} }
@Override @Override

View File

@ -23,7 +23,8 @@
android:inAnimation="@anim/fade_in" android:inAnimation="@anim/fade_in"
android:outAnimation="@anim/fade_out" android:outAnimation="@anim/fade_out"
android:id="@+id/view_animator" android:id="@+id/view_animator"
custom:initialView="1" android:measureAllChildren="false"
custom:initialView="2"
> >
<LinearLayout <LinearLayout
@ -243,6 +244,53 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:src="@drawable/status_signature_invalid_cutout_24dp"
android:tint="@color/android_red_light"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/result_error_msg"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:text=""
android:layout_gravity="center_vertical"
tools:text="Error processing data!" />
<ImageView
android:id="@+id/result_error_log"
android:scaleType="center"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clickable="true"
android:padding="6dp"
android:background="?android:selectableItemBackground"
android:src="@drawable/ic_view_list_grey_24dp"
android:layout_gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
</org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator> </org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator>
</android.support.v7.widget.CardView> </android.support.v7.widget.CardView>