From 16418a8b5cf9dcc293a233188059660b387d5b71 Mon Sep 17 00:00:00 2001 From: Floens Date: Tue, 26 Aug 2014 14:30:26 +0200 Subject: [PATCH] Update reply screen Also add spoilers --- .../chan/core/manager/ReplyManager.java | 4 + .../org/floens/chan/core/model/Reply.java | 1 + .../chan/ui/activity/ReplyActivity.java | 11 +- .../chan/ui/fragment/ReplyFragment.java | 180 ++++++++++-------- .../chan/ui/view/ThumbnailImageView.java | 161 ++++++++-------- .../drawable-hdpi/ic_action_attachment.png | Bin 0 -> 509 bytes .../ic_action_attachment_dark.png | Bin 0 -> 472 bytes .../drawable-mdpi/ic_action_attachment.png | Bin 0 -> 379 bytes .../ic_action_attachment_dark.png | Bin 0 -> 379 bytes .../drawable-xhdpi/ic_action_attachment.png | Bin 0 -> 653 bytes .../ic_action_attachment_dark.png | Bin 0 -> 590 bytes .../drawable-xxhdpi/ic_action_attachment.png | Bin 0 -> 926 bytes .../ic_action_attachment_dark.png | Bin 0 -> 822 bytes .../app/src/main/res/layout/reply_captcha.xml | 14 +- .../app/src/main/res/layout/reply_input.xml | 73 ++++--- Clover/app/src/main/res/layout/reply_view.xml | 19 +- Clover/app/src/main/res/values/strings.xml | 4 +- 17 files changed, 255 insertions(+), 212 deletions(-) create mode 100644 Clover/app/src/main/res/drawable-hdpi/ic_action_attachment.png create mode 100644 Clover/app/src/main/res/drawable-hdpi/ic_action_attachment_dark.png create mode 100644 Clover/app/src/main/res/drawable-mdpi/ic_action_attachment.png create mode 100644 Clover/app/src/main/res/drawable-mdpi/ic_action_attachment_dark.png create mode 100644 Clover/app/src/main/res/drawable-xhdpi/ic_action_attachment.png create mode 100644 Clover/app/src/main/res/drawable-xhdpi/ic_action_attachment_dark.png create mode 100644 Clover/app/src/main/res/drawable-xxhdpi/ic_action_attachment.png create mode 100644 Clover/app/src/main/res/drawable-xxhdpi/ic_action_attachment_dark.png diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java index d6773ef8..e993ca55 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/ReplyManager.java @@ -346,6 +346,10 @@ public class ReplyManager { entity.addTextBody("resto", Integer.toString(reply.resto)); } + if (reply.spoilerImage) { + entity.addTextBody("spoiler", "on"); + } + entity.addTextBody("recaptcha_challenge_field", reply.captchaChallenge); entity.addTextBody("recaptcha_response_field", reply.captchaResponse, TEXT_UTF_8); diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Reply.java b/Clover/app/src/main/java/org/floens/chan/core/model/Reply.java index e68097f5..8f91486c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Reply.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Reply.java @@ -36,4 +36,5 @@ public class Reply { public String password = ""; public boolean usePass = false; public String passId = ""; + public boolean spoilerImage = false; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java index 3114c7d0..ca94e195 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java @@ -18,6 +18,7 @@ package org.floens.chan.ui.activity; import android.app.Activity; +import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.MenuItem; @@ -46,7 +47,7 @@ public class ReplyActivity extends Activity { getActionBar().setDisplayHomeAsUpEnabled(true); FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(android.R.id.content, ReplyFragment.newInstance(loadable, false)); + ft.replace(android.R.id.content, ReplyFragment.newInstance(loadable, false), "reply"); ft.commitAllowingStateLoss(); loadable = null; @@ -56,6 +57,14 @@ public class ReplyActivity extends Activity { } } + @Override + public void onBackPressed() { + Fragment f = getFragmentManager().findFragmentByTag("reply"); + if (f != null && ((ReplyFragment)f).onBackPressed()) { + super.onBackPressed(); + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java index 5610a01c..3059910d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java @@ -32,14 +32,13 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; -import android.webkit.MimeTypeMap; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Button; +import android.widget.CheckBox; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ImageView; -import android.widget.ImageView.ScaleType; -import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; @@ -56,12 +55,14 @@ import org.floens.chan.chan.ChanUrls; import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.ReplyManager.ReplyResponse; +import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Reply; import org.floens.chan.ui.ViewFlipperAnimations; import org.floens.chan.ui.view.LoadView; import org.floens.chan.utils.ImageDecoder; import org.floens.chan.utils.Logger; +import org.floens.chan.utils.ThemeHelper; import org.floens.chan.utils.Utils; import java.io.File; @@ -84,14 +85,14 @@ public class ReplyFragment extends DialogFragment { private View container; private ViewFlipper flipper; private Button cancelButton; - private Button fileButton; - private Button fileDeleteButton; + private ImageButton fileButton; private Button submitButton; private EditText nameView; private EditText emailView; private EditText subjectView; private EditText commentView; private EditText fileNameView; + private CheckBox spoilerImageView; private LoadView imageViewContainer; private LoadView captchaContainer; private TextView captchaInput; @@ -142,10 +143,7 @@ public class ReplyFragment extends DialogFragment { @Override public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { - if (page == 1) - flipPage(0); - else if (page == 2) - closeReply(); + onBackPressed(); return true; } else return false; @@ -170,6 +168,7 @@ public class ReplyFragment extends DialogFragment { // To the end of the comment Selection.setSelection(commentView.getText(), commentView.getText().length()); setFile(draft.fileName, draft.file); + spoilerImageView.setChecked(draft.spoilerImage); if (loadable.isThreadMode()) { subjectView.setVisibility(View.GONE); @@ -199,10 +198,8 @@ public class ReplyFragment extends DialogFragment { draft.email = emailView.getText().toString(); draft.subject = subjectView.getText().toString(); draft.comment = commentView.getText().toString(); - - if (fileNameView != null) { - draft.fileName = fileNameView.getText().toString(); - } + draft.fileName = fileNameView.getText().toString(); + draft.spoilerImage = spoilerImageView.isChecked(); replyManager.setReplyDraft(draft); } else { @@ -232,6 +229,8 @@ public class ReplyFragment extends DialogFragment { subjectView = (EditText) container.findViewById(R.id.reply_subject); commentView = (EditText) container.findViewById(R.id.reply_comment); commentView.requestFocus(); + fileNameView = (EditText) container.findViewById(R.id.reply_file_name); + spoilerImageView = (CheckBox) container.findViewById(R.id.reply_spoiler_image); imageViewContainer = (LoadView) container.findViewById(R.id.reply_image); responseContainer = (LoadView) container.findViewById(R.id.reply_response); @@ -262,29 +261,26 @@ public class ReplyFragment extends DialogFragment { } }); - fileButton = (Button) container.findViewById(R.id.reply_file); + fileButton = (ImageButton) container.findViewById(R.id.reply_file); fileButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - ChanApplication.getReplyManager().pickFile(new ReplyManager.FileListener() { - @Override - public void onFile(String name, File file) { - setFile(name, file); - } - - @Override - public void onFileLoading() { - imageViewContainer.setView(null); - } - }); - } - }); + if (draft.file == null) { + ChanApplication.getReplyManager().pickFile(new ReplyManager.FileListener() { + @Override + public void onFile(String name, File file) { + setFile(name, file); + } - fileDeleteButton = (Button) container.findViewById(R.id.reply_file_delete); - fileDeleteButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - setFile(null, null); + @Override + public void onFileLoading() { + imageViewContainer.setVisibility(View.VISIBLE); + imageViewContainer.setView(null); + } + }); + } else { + setFile(null, null); + } } }); @@ -304,6 +300,17 @@ public class ReplyFragment extends DialogFragment { return container; } + public boolean onBackPressed() { + if (page == 1) { + flipPage(0); + return false; + } else if (page == 2) { + return false; + } else { + return true; + } + } + private void closeReply() { if (getDialog() != null) { dismiss(); @@ -365,56 +372,72 @@ public class ReplyFragment extends DialogFragment { draft.fileName = name; if (file == null) { - fileDeleteButton.setEnabled(false); + fileButton.setImageResource(ThemeHelper.getInstance().getTheme().isLightTheme ? R.drawable.ic_action_attachment : R.drawable.ic_action_attachment_dark); imageViewContainer.removeAllViews(); - fileNameView = null; + imageViewContainer.setVisibility(View.GONE); + fileNameView.setText(""); + fileNameView.setVisibility(View.GONE); + spoilerImageView.setVisibility(View.GONE); + spoilerImageView.setChecked(false); } else { - fileDeleteButton.setEnabled(true); - - LinearLayout wrapper = new LinearLayout(context); - wrapper.setLayoutParams(Utils.MATCH_WRAP_PARAMS); - wrapper.setOrientation(LinearLayout.VERTICAL); - - fileNameView = new EditText(context); - fileNameView.setSingleLine(); - fileNameView.setHint(R.string.reply_file_name); - fileNameView.setTextSize(16f); + fileButton.setImageResource(ThemeHelper.getInstance().getTheme().isLightTheme ? R.drawable.ic_action_cancel : R.drawable.ic_action_cancel_dark); + fileNameView.setVisibility(View.VISIBLE); fileNameView.setText(name); - wrapper.addView(fileNameView); - - final ImageView imageView = new ImageView(context); - imageView.setScaleType(ScaleType.CENTER_INSIDE); - wrapper.addView(imageView); - - imageViewContainer.setView(wrapper); - - String extension = MimeTypeMap.getFileExtensionFromUrl(name); - if (extension != null) { - String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - if (mimeType != null && mimeType.contains("image")) { - new Thread(new Runnable() { - @Override - public void run() { - if (context == null) - return; - - final Bitmap bitmap = ImageDecoder.decodeFile(file, imageViewContainer.getWidth(), 3000); - context.runOnUiThread(new Runnable() { - @Override - public void run() { - if (context != null && bitmap != null) { - imageView.setImageBitmap(bitmap); + Board b = ChanApplication.getBoardManager().getBoardByValue(loadable.board); + spoilerImageView.setVisibility(b != null && b.spoilers ? View.VISIBLE : View.GONE); + + imageViewContainer.setVisibility(View.VISIBLE); + imageViewContainer.setView(null); + imageViewContainer.post(new Runnable() { + public void run() { + if (file.length() < 10 * 1024 * 1024) { + new Thread(new Runnable() { + @Override + public void run() { + if (context == null) + return; + + final Bitmap bitmap = ImageDecoder.decodeFile(file, imageViewContainer.getWidth(), imageViewContainer.getWidth()); + + context.runOnUiThread(new Runnable() { + @Override + public void run() { + if (context != null) { + if (bitmap != null) { + ImageView imageView = new ImageView(context); + imageViewContainer.setView(imageView); + imageView.setAdjustViewBounds(true); + imageView.setMaxWidth(imageViewContainer.getWidth()); + imageView.setMaxHeight(imageViewContainer.getWidth()); + imageView.setImageBitmap(bitmap); + } else { + noPreview(imageViewContainer); + } + } } - } - }); - } - }).start(); + }); + } + }).start(); + } else { + noPreview(imageViewContainer); + } } - } + }); } } + private void noPreview(LoadView loadView) { + TextView text = new TextView(context); + text.setLayoutParams(Utils.MATCH_WRAP_PARAMS); + text.setGravity(Gravity.CENTER); + text.setText(R.string.reply_no_preview); + text.setTextSize(16f); + int padding = Utils.dp(16); + text.setPadding(padding, padding, padding, padding); + loadView.setView(text); + } + private void getCaptcha() { if (gettingCaptcha) return; @@ -476,11 +499,9 @@ public class ReplyFragment extends DialogFragment { draft.captchaResponse = captchaInput.getText().toString(); draft.fileName = "image"; - if (fileNameView != null) { - String n = fileNameView.getText().toString(); - if (!TextUtils.isEmpty(n)) { - draft.fileName = n; - } + String n = fileNameView.getText().toString(); + if (!TextUtils.isEmpty(n)) { + draft.fileName = n; } draft.resto = loadable.isThreadMode() ? loadable.no : -1; @@ -491,6 +512,9 @@ public class ReplyFragment extends DialogFragment { draft.passId = ChanPreferences.getPassId(); } + Board b = ChanApplication.getBoardManager().getBoardByValue(loadable.board); + draft.spoilerImage = b != null && b.spoilers && spoilerImageView.isChecked(); + ChanApplication.getReplyManager().sendReply(draft, new ReplyManager.ReplyListener() { @Override public void onResponse(ReplyResponse response) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java index 6b10c00c..a2864ff3 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java @@ -32,7 +32,6 @@ import android.widget.VideoView; import com.android.volley.Request; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader.ImageContainer; -import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.koushikdutta.async.future.Future; import org.floens.chan.ChanApplication; @@ -134,25 +133,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener @Override public void onSuccess(File file) { - final CustomScaleImageView image = new CustomScaleImageView(getContext()); - image.setImageFile(file.getAbsolutePath()); - image.setOnClickListener(ThumbnailImageView.this); - - addView(image); - - image.setInitCallback(new CustomScaleImageView.InitedCallback() { - @Override - public void onInit() { - Utils.runOnUiThread(new Runnable() { - @Override - public void run() { - removeAllViews(); - addView(image); - callback.setProgress(false); - } - }); - } - }); + setBigImageFile(file); } @Override @@ -166,6 +147,28 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener }); } + public void setBigImageFile(File file) { + final CustomScaleImageView image = new CustomScaleImageView(getContext()); + image.setImageFile(file.getAbsolutePath()); + image.setOnClickListener(ThumbnailImageView.this); + + addView(image); + + image.setInitCallback(new CustomScaleImageView.InitedCallback() { + @Override + public void onInit() { + Utils.runOnUiThread(new Runnable() { + @Override + public void run() { + removeAllViews(); + addView(image); + callback.setProgress(false); + } + }); + } + }); + } + public void setGif(String gifUrl) { if (getWidth() == 0 || getHeight() == 0) { Logger.e(TAG, "getWidth() or getHeight() returned 0, not loading"); @@ -187,19 +190,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener @Override public void onSuccess(File file) { - GifDrawable drawable; - try { - drawable = new GifDrawable(file.getAbsolutePath()); - } catch (IOException e) { - e.printStackTrace(); - onError(); - return; - } - - GifImageView view = new GifImageView(getContext()); - view.setImageDrawable(drawable); - view.setLayoutParams(Utils.MATCH_PARAMS); - setView(view, false); + setGifFile(file); } @Override @@ -213,6 +204,22 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener }); } + public void setGifFile(File file) { + GifDrawable drawable; + try { + drawable = new GifDrawable(file.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + onError(); + return; + } + + GifImageView view = new GifImageView(getContext()); + view.setImageDrawable(drawable); + view.setLayoutParams(Utils.MATCH_PARAMS); + setView(view, false); + } + public void setVideo(String videoUrl) { callback.setProgress(true); ionRequest = ChanApplication.getFileCache().downloadFile(getContext(), videoUrl, new FileCache.DownloadedCallback() { @@ -228,48 +235,8 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener } @Override - public void onSuccess(final File file) { - if (ChanPreferences.getVideoExternal()) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromFile(file), "video/*"); - - try { - getContext().startActivity(intent); - } catch (ActivityNotFoundException e) { - Toast.makeText(getContext(), R.string.open_link_failed, Toast.LENGTH_SHORT).show(); - } - } else { - videoView = new VideoView(getContext()); - videoView.setZOrderOnTop(true); - videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT)); - videoView.setLayoutParams(Utils.MATCH_PARAMS); - LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - par.gravity = Gravity.CENTER; - videoView.setLayoutParams(par); - - videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - mp.setLooping(true); - callback.onVideoLoaded(); - } - }); - videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { - @Override - public boolean onError(MediaPlayer mp, int what, int extra) { - callback.onVideoError(file); - - return true; - } - }); - - videoView.setVideoPath(file.getAbsolutePath()); - - setView(videoView, false); - - videoView.start(); - } + public void onSuccess(File file) { + setVideoFile(file); } @Override @@ -283,6 +250,50 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener }); } + public void setVideoFile(final File file) { + if (ChanPreferences.getVideoExternal()) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.fromFile(file), "video/*"); + + try { + getContext().startActivity(intent); + } catch (ActivityNotFoundException e) { + Toast.makeText(getContext(), R.string.open_link_failed, Toast.LENGTH_SHORT).show(); + } + } else { + videoView = new VideoView(getContext()); + videoView.setZOrderOnTop(true); + videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT)); + videoView.setLayoutParams(Utils.MATCH_PARAMS); + LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + par.gravity = Gravity.CENTER; + videoView.setLayoutParams(par); + + videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setLooping(true); + callback.onVideoLoaded(); + } + }); + videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + callback.onVideoError(file); + + return true; + } + }); + + videoView.setVideoPath(file.getAbsolutePath()); + + setView(videoView, false); + + videoView.start(); + } + } + public VideoView getVideoView() { return videoView; } diff --git a/Clover/app/src/main/res/drawable-hdpi/ic_action_attachment.png b/Clover/app/src/main/res/drawable-hdpi/ic_action_attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..175adeb4c46628209078396ccacbd4d1b2485f11 GIT binary patch literal 509 zcmVO87>ZXr=q1ZddatBhAHAVG@@{$WVZguIXSpO+OKXx?vYLL0b9 zBQ0eDn;P&)XVdD_fi}=vcUT93wyicsz@}J*wmWrY{BQA+roBxB_GEx5R(DsSBiruE z9SeH%j(qS)MijQ&Xrgu>p^V&B6P)le)RWOh_riI9 zffH|0GvPoE`Lyx@$%Y6!^vA zRbZhTulA&p$st+G4I9#RbR3xaKPG_**KSm#)V6HAyiF=~c3!{f3}s;IOqQbWE@Za3 zU59;;d0A@AKpC-a>g`Tl8E^DFI$!CS3}|P81)_Tt>hi&U-eBCaBOhi?Md;8rssyhO zHp&$yt%T?lef5E59XgQ{p=tJ)!vuyt3kyC;P2RzEVkKQCVozdIGOs^0_4qDxcB?GB zhSfb>CAJ7u^=Aj1Oypyzb%~_u5P_`CqPE^O|A7!f2qA0fhdEP)Qsy(YKK# zNsMLVsZIwgi=t>p383&AO9qR6aN!3?#QME*2eEYGjVrDo$kZS~z8Gs{`XRKMj?iGUvyz$O z_bCcEd`sIAGKLjMID=RxzotmQE*0n>MLpK?-(WvMO+nO*BpLH7t-{$uGv-bOn8fr2 zGmyA4rshyIa~4o@mt%9_$ljcSo0&I$x(3kTBm{{)`?qsJN>-CcvBz;dsDMBq5C}d3 Z3;?KqV7eI%afAQ>002ovPDHLkV1hxPpUnUO literal 0 HcmV?d00001 diff --git a/Clover/app/src/main/res/drawable-mdpi/ic_action_attachment_dark.png b/Clover/app/src/main/res/drawable-mdpi/ic_action_attachment_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d8051af57606f0265789a0e60c803a6c6bf246 GIT binary patch literal 379 zcmV->0fhdEP)p5$jBPJ* zC^7OR=)%I*qQf1<=y5M92l8jD15B>D1SVn@um!d0AV?dCpj?FYIP`-*YC1xLO+C77 zAb)Ogz>@oN&^Hv;5aG?(toc=|VLWPZH{{Z^QzdBV5Y>w;Gx8<7kU40^bn+X5_=M%b z_T2}i+=TJYuc^7YtED-R7&Wihl|3kJ188;#ZQ#Iia z3=xtcrnwk^l<(6c*h3G$PxFTI2FkB!%pFs>NyF3ThBi+qrzn3(j|*)&lI}Hg@yJQ$ zo(xs>pl(Rsm1%v|@*xrH1A|M2i^by8Ri7u>-W!dE$N|2bs?+$U`N*`sX8Bf6dmp96 z6B*5u`?h^Uyx3$BzmY6wiX5jj9<}<4_A(kE zE>d&p!2!pEYbmGxtCWcCw6b!p@0V2hU!kxklS=Tev5JfSw zU73{>h5p=IR)rK-{ zxpp%olgX`a(X=*G?rU?eqAgsJ5y{9(#GGzWBSU^Zb+VbF@dYdv3Y<5UL)&Hv@kxmj*|Y|=T&#{{$z4t6Mq+-6*U zIn%FyMwF35tyk90pjV$Cu^Dvj59oH=u;G?KeoDt-S00B``7bB-T{v8BmmiR>5g(|{ zwrs<_S&G%$%PN~bY0STpHaokaX>2p%zX0FZBzcT5`+FO1mi_21S4cYczFEZM> zdD*_;<2Ksg{vO^w|3$x(@w)dsAD>Qg{qMGE$ut?OhWEFn63*Sp&=+{~)$66}QMrK2kwPEjvW|t=YKC+DYMIozEOyP!1808KDD+3( zzrp-WM^EIDE>Ka@*%eQ@zRqM#3fnCbYqMa>luOmO!^6bFcsx8i_8ixJptSOI!dh;{ zFve+5M7bRW?(l5T(eU_oTrcv#xy=(-&-ihAFSAbXR`$GDSv9`aqG|cYMos!>ZMloT zm|iHd`RP@r%AxlD%p&XihL?N1m#kc|+?vtznb2Ie*Wb$WydFCn6fODAxQ?Oxb@InZ z^~>ALon}k#+-m%8M#a_6&Kp7d-|aJLU!?UzeZ@LvUpEh_yhOLntndf{G9Ik^A(+5$ Wx_6(-zl0<4AQ?|rKbLh*2~7akoP_978H@y_uz$bK60r?Q#k$x8#chDY{D(Sd}L>1>LyN zBi7zGtw&@UTR%@pf{MvPMQM)6B|IgUoPsqqQWmf(SFf*{yy)GXIp@DcS>IQmD`ffc z=D+)QtKZ+-8N>*51QyV+X!G!ojLht&bGP`=8g|qzoIkQ zt*ttiUusM0nEgMCK`@T>{rdwM-yM(sS8$6^vE4ZB(A_=Lzj3{Ne`9)?jO)d!tx>Vh zvlxW``$Wm!{l8Gt?T4bE`EY8fHIqCE!%^WEc`HpI-Df%_Zhc>rd zum9fgV`Wod;D$Bs^Gmgky@-Ccy;EwbcJ7pw+>^R9mmfD|e6jh?jfiFU-p772|FoyL z&{ALb>%AviW&Xcf>~4DSYn9>g(kuSuS6`mq96#&!%_Z+&wiXw?5@j zxKI0nNiFLcV_sgfF=%}~%|vF6?D^Y1xeU=2JJ;;v*l{wf^KoH-?iqD9oAV#kq$95d z&b#nv%{!xp^Tt1SEQmh7F|}>+li-O*&373xYuEC0XsV|~R_T2?b<^#C=i}wBYHS^x z248uO+G*|hQP}FaUgc=H?1nw|ubw{Aohj>Sys%YS;QNyGvqkdWZp?`AdMi}_cDKV< z(*t)DW3&}Sul}EJ)i-~djee`a^8FTLZfS1U&(8SzU$$uuTIUkk6JXfc;CtE=9l88c+}|n#Hs0? zye`C1zB=jj^~2TnvTAp^ug;$G&Gr1|2XP_JFBV)m_{C5`ai{XjX-lLY*rdrWcz=RN zd%}FiGaS6ePIsyjx15$X*(rUX=fX{)hJ2mkpyoe1JKU~UzAIi{X_!4*@YErN^HHIu zUtEff#it(VqhAE%Cf==yk437`Lqks8S*gXC1k^82*FW)A* uJoMbMrE6U4imL*e{(>?YHgIC1JrfUu-Y!1#9~!c(AQhgjelF{r5}E+gPM?$j literal 0 HcmV?d00001 diff --git a/Clover/app/src/main/res/drawable-xxhdpi/ic_action_attachment_dark.png b/Clover/app/src/main/res/drawable-xxhdpi/ic_action_attachment_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..305bc41a46603a4838c6a338e5390694e02d7ace GIT binary patch literal 822 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGok|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m~MEwIEGZ*dNb>6;UfcyHp9)~Tn$V&m|_kDIZU$FWVk>5 zjwe^b`;WEGj0+oc56gVX}RLqm?O?OH<^xNzH{Fh&WwqgSd zUaKt3+j2AKSkcaDOV?#S*(JKkD{{4p=c>t43Wu~Wrf+H!-_?12)3hX)+7M=!9}{E5 z#5df|4S00Flk;dG&xME20R+ zG?IfOvM0PdQJudjFSod9HKYHoQ=Id9tg?>njaerZcgnThW(DJ?wBVg*csXB8&wkT= zhh^!>-m_^XCmD?opVtrjv)|gn^IhqUn`sFalK(%RU3g7iqVLw`)yG)#nbYt=kY5&aA4lTxzsGNb&9&dgT?EvUp?Pzw#e<8@{ - - + android:padding="16dp"> + android:textSize="16sp" /> + android:layout_gravity="center" /> + android:inputType="textNoSuggestions|textVisiblePassword" /> diff --git a/Clover/app/src/main/res/layout/reply_input.xml b/Clover/app/src/main/res/layout/reply_input.xml index 746e5b06..b8ed1484 100644 --- a/Clover/app/src/main/res/layout/reply_input.xml +++ b/Clover/app/src/main/res/layout/reply_input.xml @@ -1,5 +1,4 @@ - - - + android:orientation="vertical" + android:paddingBottom="16dp" + android:paddingLeft="16dp" + android:paddingRight="16dp"> + android:minHeight="48dp" + android:textSize="16sp" /> + android:minHeight="48dp" + android:textSize="16sp" /> + android:minHeight="48dp" + android:textSize="16sp" /> . android:imeActionLabel="@string/reply_submit" android:inputType="textMultiLine|textCapSentences|textAutoCorrect" android:minLines="4" - android:textSize="16sp"/> + android:textSize="16sp" /> + android:orientation="horizontal"> - - -