diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputAttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputAttachmentController.java index b711c456d..3258cd67f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputAttachmentController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputAttachmentController.java @@ -4,9 +4,12 @@ import android.content.ClipData; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.design.widget.FloatingActionButton; +import android.support.v4.view.AbsSavedState; import android.support.v7.graphics.Palette; import android.support.v7.widget.AppCompatImageButton; import android.text.Editable; @@ -35,6 +38,7 @@ import static android.content.Intent.EXTRA_ALLOW_MULTIPLE; import static android.graphics.Color.BLACK; import static android.graphics.Color.WHITE; import static android.os.Build.VERSION.SDK_INT; +import static android.support.v4.view.AbsSavedState.EMPTY_STATE; import static android.support.v7.app.AppCompatDelegate.MODE_NIGHT_YES; import static android.support.v7.app.AppCompatDelegate.getDefaultNightMode; import static android.view.View.GONE; @@ -92,15 +96,19 @@ class TextInputAttachmentController implements TextWatcher { if (resultData == null) return; if (resultData.getData() != null) { imageUris = singletonList(resultData.getData()); + onNewUris(); } else if (SDK_INT >= 18 && resultData.getClipData() != null) { ClipData clipData = resultData.getClipData(); imageUris = new ArrayList<>(clipData.getItemCount()); for (int i = 0; i < clipData.getItemCount(); i++) { imageUris.add(clipData.getItemAt(i).getUri()); } - } else { - return; + onNewUris(); } + } + + private void onNewUris() { + if (imageUris.isEmpty()) return; showImageButton(false); editText.setHint(R.string.image_caption_hint); imageLayout.setVisibility(VISIBLE); @@ -208,4 +216,51 @@ class TextInputAttachmentController implements TextWatcher { showImageButton(true); } + public Parcelable onSaveInstanceState(@Nullable Parcelable superState) { + SavedState state = + new SavedState(superState == null ? EMPTY_STATE : superState); + state.imageUris = imageUris; + return state; + } + + @Nullable + public Parcelable onRestoreInstanceState(Parcelable inState) { + SavedState state = (SavedState) inState; + imageUris = state.imageUris; + onNewUris(); + return state.getSuperState(); + } + + private static class SavedState extends AbsSavedState { + private List imageUris; + + private SavedState(Parcelable superState) { + super(superState); + } + + private SavedState(Parcel in) { + super(in); + //noinspection unchecked + imageUris = in.readArrayList(Uri.class.getClassLoader()); + + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeList(imageUris); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputView.java b/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputView.java index a935b8e9c..383361a69 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputView.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/view/TextInputView.java @@ -7,6 +7,7 @@ import android.content.res.TypedArray; import android.graphics.Rect; import android.net.Uri; import android.os.IBinder; +import android.os.Parcelable; import android.support.annotation.CallSuper; import android.support.annotation.Nullable; import android.support.annotation.StringRes; @@ -77,6 +78,7 @@ public class TextInputView extends KeyboardAwareLinearLayout { setOrientation(VERTICAL); setLayoutTransition(new LayoutTransition()); inflateLayout(context); + setSaveEnabled(true); if (!isInEditMode()) setUpViews(context, attrs); } @@ -118,6 +120,27 @@ public class TextInputView extends KeyboardAwareLinearLayout { sendButton.setOnClickListener(v -> onSendButtonClicked()); } + @Nullable + @Override + protected Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + if (attachmentController != null) { + superState = attachmentController.onSaveInstanceState(superState); + } + return superState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (attachmentController != null) { + Parcelable outState = + attachmentController.onRestoreInstanceState(state); + super.onRestoreInstanceState(outState); + } else { + super.onRestoreInstanceState(state); + } + } + public void setListener(TextInputListener listener) { this.listener = listener; }