Cleaned up ReplyFragment

captchafix
Florens Douwes 11 years ago
parent 8b3d6c3ef4
commit 998a774efa
  1. 27
      Chan/res/layout/reply_captcha.xml
  2. 88
      Chan/res/layout/reply_input.xml
  3. 243
      Chan/res/layout/reply_view.xml
  4. 83
      Chan/src/org/floens/chan/ui/fragment/ReplyFragment.java

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/reply_captcha_tap_to_reload"
android:textSize="16sp" />
<org.floens.chan.ui.view.LoadView
android:id="@+id/reply_captcha_container"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center" />
<EditText
android:id="@+id/reply_captcha"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/reply_captcha"
android:inputType="textNoSuggestions" />
</LinearLayout>

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:floatlabel="http://schemas.android.com/apk/res-auto"
android:id="@+id/reply_data"
style="?android:attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.micromobs.android.floatlabel.FloatLabelEditText
android:id="@+id/reply_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
floatlabel:fitScreenWidth="full"
floatlabel:hint="@string/reply_name"
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp" />
<com.micromobs.android.floatlabel.FloatLabelEditText
android:id="@+id/reply_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
floatlabel:fitScreenWidth="full"
floatlabel:hint="@string/reply_email"
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp" />
<com.micromobs.android.floatlabel.FloatLabelEditText
android:id="@+id/reply_subject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
floatlabel:fitScreenWidth="full"
floatlabel:hint="@string/reply_subject"
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp" />
<com.micromobs.android.floatlabel.FloatLabelEditText
android:id="@+id/reply_comment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeActionLabel="@string/reply_submit"
android:inputType="textMultiLine|textCapSentences|textAutoCorrect"
android:minLines="5"
floatlabel:fitScreenWidth="full"
floatlabel:hint="@string/reply_comment"
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray"
floatlabel:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/reply_file"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/reply_file" />
<Button
android:id="@+id/reply_file_delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/reply_file_delete" />
</LinearLayout>
<org.floens.chan.ui.view.LoadView
android:id="@+id/reply_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:minHeight="200dp"
android:scaleType="centerCrop" />
</LinearLayout>
</LinearLayout>

@ -1,172 +1,71 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:floatlabel="http://schemas.android.com/apk/res-auto"
xmlns:floatlabel="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_height="match_parent" android:divider="?android:attr/dividerHorizontal"
android:minWidth="600dp" android:minHeight="500dp"
android:minHeight="500dp" android:minWidth="600dp"
android:orientation="vertical" android:orientation="vertical"
android:divider="?android:attr/dividerHorizontal" android:showDividers="middle" >
android:showDividers="middle" >
<!-- global viewflipper -->
<ViewFlipper
android:id="@+id/reply_flipper" <ViewFlipper
android:orientation="horizontal" android:id="@+id/reply_flipper"
android:layout_weight="1" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="0dp"
android:layout_height="0dp"> android:layout_weight="1"
<ScrollView android:orientation="horizontal" >
android:layout_width="match_parent"
android:layout_height="match_parent" > <!-- input view: -->
<LinearLayout
android:id="@+id/reply_data" <ScrollView
style="?android:attr/buttonBarStyle" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="match_parent" >
android:layout_height="wrap_content"
android:orientation="vertical" > <include layout="@layout/reply_input" />
</ScrollView>
<com.micromobs.android.floatlabel.FloatLabelEditText
android:id="@+id/reply_name" <!-- captcha view: -->
android:layout_width="match_parent"
android:layout_height="wrap_content" <ScrollView
android:layout_width="match_parent"
floatlabel:fitScreenWidth="full" android:layout_height="match_parent" >
floatlabel:textSize="16sp"
floatlabel:hint="@string/reply_name" <include layout="@layout/reply_captcha" />
floatlabel:textColorHintFocused="@color/holo_blue_dark" </ScrollView>
floatlabel:textColorHintUnFocused="@android:color/darker_gray" />
<!-- response view: -->
<com.micromobs.android.floatlabel.FloatLabelEditText <org.floens.chan.ui.view.LoadView
android:id="@+id/reply_email" android:id="@+id/reply_response"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:inputType="textEmailAddress" android:orientation="vertical" >
</org.floens.chan.ui.view.LoadView>
floatlabel:fitScreenWidth="full" </ViewFlipper>
floatlabel:textSize="16sp"
floatlabel:hint="@string/reply_email" <LinearLayout
floatlabel:textColorHintFocused="@color/holo_blue_dark" style="?android:attr/buttonBarStyle"
floatlabel:textColorHintUnFocused="@android:color/darker_gray" /> android:layout_width="match_parent"
android:layout_height="wrap_content"
<com.micromobs.android.floatlabel.FloatLabelEditText android:orientation="horizontal" >
android:id="@+id/reply_subject"
android:layout_width="match_parent" <Button
android:layout_height="wrap_content" android:id="@+id/reply_cancel"
style="?android:attr/buttonBarButtonStyle"
floatlabel:fitScreenWidth="full" android:layout_width="0dp"
floatlabel:textSize="16sp" android:layout_height="wrap_content"
floatlabel:hint="@string/reply_subject" android:layout_weight="1"
floatlabel:textColorHintFocused="@color/holo_blue_dark" android:text="@string/cancel" />
floatlabel:textColorHintUnFocused="@android:color/darker_gray" />
<Button
<com.micromobs.android.floatlabel.FloatLabelEditText android:id="@+id/reply_submit"
android:id="@+id/reply_comment" style="?android:attr/buttonBarButtonStyle"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textMultiLine|textCapSentences|textAutoCorrect" android:layout_weight="1"
android:minLines="5" android:text="@string/reply_submit" />
android:imeActionLabel="@string/reply_submit" </LinearLayout>
floatlabel:fitScreenWidth="full" </LinearLayout>
floatlabel:textSize="16sp"
floatlabel:hint="@string/reply_comment"
floatlabel:textColorHintFocused="@color/holo_blue_dark"
floatlabel:textColorHintUnFocused="@android:color/darker_gray" />
<LinearLayout
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" >
<Button
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/reply_file"
android:text="@string/reply_file" />
<Button
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/reply_file_delete"
android:text="@string/reply_file_delete" />
</LinearLayout>
<org.floens.chan.ui.view.LoadView
android:id="@+id/reply_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="200dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />
</LinearLayout>
</LinearLayout>
</ScrollView>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:orientation="vertical" >
<org.floens.chan.ui.view.LoadView
android:id="@+id/reply_captcha_container"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_gravity="center" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/reply_captcha_tap_to_reload" />
<EditText
android:id="@+id/reply_captcha"
android:hint="@string/reply_captcha"
android:inputType="textNoSuggestions"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
<org.floens.chan.ui.view.LoadView
android:id="@+id/reply_response"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</org.floens.chan.ui.view.LoadView>
</ViewFlipper>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/buttonBarStyle" >
<Button
android:id="@+id/reply_cancel"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/cancel" />
<Button
android:id="@+id/reply_submit"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/reply_submit" />
</LinearLayout>
</LinearLayout>

@ -15,9 +15,9 @@ import org.floens.chan.ui.view.LoadView;
import org.floens.chan.utils.ImageDecoder; import org.floens.chan.utils.ImageDecoder;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.DialogFragment; import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
@ -73,6 +73,8 @@ public class ReplyFragment extends DialogFragment {
private TextView captchaText; private TextView captchaText;
private LoadView responseContainer; private LoadView responseContainer;
private Activity context;
public static ReplyFragment newInstance(Loadable loadable) { public static ReplyFragment newInstance(Loadable loadable) {
ReplyFragment reply = new ReplyFragment(); ReplyFragment reply = new ReplyFragment();
reply.loadable = loadable; reply.loadable = loadable;
@ -83,28 +85,29 @@ public class ReplyFragment extends DialogFragment {
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
loadable.writeToBundle(getActivity(), outState); loadable.writeToBundle(context, outState);
} }
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
context = getActivity();
if (loadable == null && savedInstanceState != null) { if (loadable == null && savedInstanceState != null) {
loadable = new Loadable(); loadable = new Loadable();
loadable.readFromBundle(getActivity(), savedInstanceState); loadable.readFromBundle(context, savedInstanceState);
} }
if (loadable != null) { if (loadable != null) {
setClosable(true); setClosable(true);
Dialog dialog = getDialog(); Dialog dialog = getDialog();
Context context = getActivity();
String title = loadable.isThreadMode() ? context.getString(R.string.reply) + " /" + loadable.board + "/" String title = loadable.isThreadMode() ? context.getString(R.string.reply) + " /" + loadable.board + "/"
+ loadable.no : context.getString(R.string.reply_to_board) + " /" + loadable.board + "/"; + loadable.no : context.getString(R.string.reply_to_board) + " /" + loadable.board + "/";
if (dialog == null) { if (dialog == null) {
getActivity().getActionBar().setTitle(title); context.getActionBar().setTitle(title);
} else { } else {
dialog.setTitle(title); dialog.setTitle(title);
} }
@ -173,6 +176,8 @@ public class ReplyFragment extends DialogFragment {
ReplyManager replyManager = ChanApplication.getReplyManager(); ReplyManager replyManager = ChanApplication.getReplyManager();
replyManager.removeFileListener(); replyManager.removeFileListener();
context = null;
} }
@Override @Override
@ -255,7 +260,7 @@ public class ReplyFragment extends DialogFragment {
if (getDialog() != null) { if (getDialog() != null) {
dismiss(); dismiss();
} else { } else {
getActivity().finish(); context.finish();
} }
} }
@ -318,20 +323,26 @@ public class ReplyFragment extends DialogFragment {
fileDeleteButton.setEnabled(true); fileDeleteButton.setEnabled(true);
// UI Thread // UI Thread
final ImageView imageView = new ImageView(getActivity()); final ImageView imageView = new ImageView(context);
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (context == null)
return;
// Other thread // Other thread
final Bitmap bitmap = ImageDecoder.decodeFile(file, imageViewContainer.getWidth(), 3000); final Bitmap bitmap = ImageDecoder.decodeFile(file, imageViewContainer.getWidth(), 3000);
getActivity().runOnUiThread(new Runnable() { context.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (context == null)
return;
// UI Thread // UI Thread
if (bitmap == null) { if (bitmap == null) {
Toast.makeText(getActivity(), R.string.image_preview_failed, Toast.LENGTH_LONG).show(); Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
} else { } else {
imageView.setScaleType(ScaleType.CENTER_CROP); imageView.setScaleType(ScaleType.CENTER_CROP);
imageView.setImageBitmap(bitmap); imageView.setImageBitmap(bitmap);
@ -357,19 +368,18 @@ public class ReplyFragment extends DialogFragment {
ChanApplication.getVolleyRequestQueue().add(new StringRequest(Method.GET, url, new Response.Listener<String>() { ChanApplication.getVolleyRequestQueue().add(new StringRequest(Method.GET, url, new Response.Listener<String>() {
@Override @Override
public void onResponse(String result) { public void onResponse(String result) {
if (!isVisible()) if (context != null) {
return; String challenge = ReplyManager.getChallenge(result);
if (challenge != null) {
String challenge = ReplyManager.getChallenge(result); captchaChallenge = challenge;
if (challenge != null) { String imageUrl = ChanUrls.getCaptchaImageUrl(challenge);
captchaChallenge = challenge;
String imageUrl = ChanUrls.getCaptchaImageUrl(challenge);
NetworkImageView captchaImage = new NetworkImageView(getActivity()); NetworkImageView captchaImage = new NetworkImageView(context);
captchaImage.setImageUrl(imageUrl, ChanApplication.getImageLoader()); captchaImage.setImageUrl(imageUrl, ChanApplication.getImageLoader());
captchaContainer.setView(captchaImage); captchaContainer.setView(captchaImage);
gettingCaptcha = false; gettingCaptcha = false;
}
} }
} }
}, new Response.ErrorListener() { }, new Response.ErrorListener() {
@ -377,10 +387,13 @@ public class ReplyFragment extends DialogFragment {
public void onErrorResponse(VolleyError error) { public void onErrorResponse(VolleyError error) {
error.printStackTrace(); error.printStackTrace();
gettingCaptcha = false; gettingCaptcha = false;
TextView text = new TextView(getActivity());
text.setGravity(Gravity.CENTER); if (context != null) {
text.setText(R.string.reply_captcha_load_error); TextView text = new TextView(context);
captchaContainer.setView(text); text.setGravity(Gravity.CENTER);
text.setText(R.string.reply_captcha_load_error);
captchaContainer.setView(text);
}
} }
})); }));
} }
@ -420,13 +433,13 @@ public class ReplyFragment extends DialogFragment {
* @param response * @param response
*/ */
private void handleSubmitResponse(ReplyResponse response) { private void handleSubmitResponse(ReplyResponse response) {
if (getActivity() == null) if (context == null)
return; return;
if (response.isNetworkError || response.isUserError) { if (response.isNetworkError || response.isUserError) {
int resId = response.isCaptchaError ? R.string.reply_error_captcha int resId = response.isCaptchaError ? R.string.reply_error_captcha
: (response.isFileError ? R.string.reply_error_file : R.string.reply_error); : (response.isFileError ? R.string.reply_error_file : R.string.reply_error);
Toast.makeText(getActivity(), resId, Toast.LENGTH_LONG).show(); Toast.makeText(context, resId, Toast.LENGTH_LONG).show();
submitButton.setEnabled(true); submitButton.setEnabled(true);
cancelButton.setEnabled(true); cancelButton.setEnabled(true);
setClosable(true); setClosable(true);
@ -435,22 +448,20 @@ public class ReplyFragment extends DialogFragment {
captchaText.setText(""); captchaText.setText("");
} else if (response.isSuccessful) { } else if (response.isSuccessful) {
shouldSaveDraft = false; shouldSaveDraft = false;
Toast.makeText(getActivity(), R.string.reply_success, Toast.LENGTH_SHORT).show(); Toast.makeText(context, R.string.reply_success, Toast.LENGTH_SHORT).show();
// threadFragment.reload(); // won't work: it takes 4chan a variable time to process the reply // threadFragment.reload(); // won't work: it takes 4chan a variable time to process the reply
closeReply(); closeReply();
} else { } else {
if (isVisible()) { cancelButton.setEnabled(true);
cancelButton.setEnabled(true); setClosable(true);
setClosable(true);
WebView webView = new WebView(getActivity()); WebView webView = new WebView(context);
WebSettings settings = webView.getSettings(); WebSettings settings = webView.getSettings();
settings.setSupportZoom(true); settings.setSupportZoom(true);
webView.loadData(response.responseData, "text/html", null); webView.loadData(response.responseData, "text/html", null);
responseContainer.setView(webView); responseContainer.setView(webView);
}
} }
} }
} }

Loading…
Cancel
Save