package org.softeg.slartus.forpdaplus.fragments.topic; import android.app.Dialog; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.Client; import org.softeg.slartus.forpdaplus.MainActivity; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.common.AppLog; import org.softeg.slartus.forpdaplus.common.HtmlUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by radiationx on 29.10.15. */ public class ThemeQuoteEditor extends DialogFragment implements View.OnClickListener{ private static final String QUOTE_URL_KEY = "QUOTE_TEXT_KEY"; private static final String QUOTE_TEXT_KEY = "QUOTE_TEXT_KEY"; private static final String EDITOR_TEXT_KEY = "EDITOR_TEXT_KEY"; private static String parentTag; public static DialogFragment newInstance(CharSequence quoteUrl, String t) { parentTag = t; ThemeQuoteEditor fragment = new ThemeQuoteEditor (); Bundle args = new Bundle(); args.putString(QUOTE_URL_KEY, quoteUrl.toString()); fragment.setArguments(args); return fragment; } EditText txtBody; protected Bundle args = new Bundle(); private String m_Author, m_Text; private View progressBar; private LinearLayout buttons; @Override public void onCreate(android.os.Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { args = getArguments(); } if (savedInstanceState != null) { args = savedInstanceState; parseQuote(); } } @Override public void onSaveInstanceState(android.os.Bundle outState) { if (args != null) outState.putAll(args); outState.putString(EDITOR_TEXT_KEY, txtBody.getText().toString()); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); super.onViewCreated(view, savedInstanceState); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.quote_editor, null); assert v != null; txtBody = (EditText) v.findViewById(R.id.txtBody); progressBar = v.findViewById(R.id.progressBar); buttons = (LinearLayout) v.findViewById(R.id.relativeLayout); v.findViewById(R.id.btnAll).setOnClickListener(this); v.findViewById(R.id.btnAuthor).setOnClickListener(this); v.findViewById(R.id.btnAuthor).setOnClickListener(this); v.findViewById(R.id.btnText).setOnClickListener(this); v.findViewById(R.id.btnClear).setOnClickListener(this); MaterialDialog dialog = new MaterialDialog.Builder(getActivity()) .customView(v,false) .positiveText(R.string.insert) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ((ThemeFragment)((MainActivity)getActivity()).getSupportFragmentManager().findFragmentByTag(parentTag)).insertTextToPost(txtBody.getText().toString()); } }) .negativeText(R.string.cancel) .build(); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); return dialog; } @Override public void onActivityCreated(android.os.Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); new QuoteLoader(args.getString(QUOTE_URL_KEY)).execute(); } private void parseQuote() { m_Author = ""; m_Text = ""; Matcher m = Pattern.compile("(\\[quote name=\"[^\"]*\" date=\"[^\"]*\" post=\"\\d+\"\\])([\\s\\S]*?)\\[/quote\\]", Pattern.CASE_INSENSITIVE) .matcher(args.getString(QUOTE_TEXT_KEY)); if (m.find()) { m_Author = m.group(1); m_Text = m.group(2); if (m_Text != null) m_Text = m_Text.trim(); } else { Toast.makeText(getActivity(), App.getContext().getString(R.string.error_parsing_quote), Toast.LENGTH_LONG).show(); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnAll: txtBody.setText(args.getString(QUOTE_TEXT_KEY)); break; case R.id.btnAuthor: insertText(m_Author+"\n", "\n[/quote]"); break; case R.id.btnText: insertText(m_Text, ""); break; case R.id.btnClear: txtBody.setText(""); break; } } private void insertText(String startText, String endText) { int selectionStart = txtBody.getSelectionStart(); int selectionEnd = txtBody.getSelectionEnd(); if (selectionEnd < selectionStart && selectionEnd != -1) { int c = selectionStart; selectionStart = selectionEnd; selectionEnd = c; } if (selectionStart == -1) selectionStart = 0; if (selectionEnd == -1) selectionEnd = 0; if (!TextUtils.isEmpty(endText)) txtBody.getText().insert(selectionEnd, endText); txtBody.getText().insert(selectionStart, startText); } /** * A fragment that displays a menu. This fragment happens to not * have a UI (it does not implement onCreateView), but it could also * have one if it wanted. */ public class QuoteLoader extends AsyncTask<String, String, Boolean> { private String m_QuoteUrl; public QuoteLoader(String url) { m_QuoteUrl = url; } protected void onPreExecute() { progressBar.setVisibility(View.VISIBLE); buttons.setVisibility(View.GONE); } private String m_Quote = ""; @Override protected Boolean doInBackground(String... strings) { try { String page = Client.getInstance().performGet(m_QuoteUrl); Matcher m = Pattern.compile("<textarea name=\"post\"[^>]*>([\\s\\S]*?)</textarea>",Pattern.CASE_INSENSITIVE) .matcher(page); if (m.find()) { String quote = m.group(1); if (quote != null) quote = quote.trim(); m_Quote = HtmlUtils.modifyHtmlQuote(quote) ; } return true; } catch (Throwable e) { // Log.e(ThemeActivity.this, e); ex = e; return false; } } private Throwable ex; protected void onPostExecute(final Boolean success) { try { progressBar.setVisibility(View.GONE); } catch (Exception ex) { AppLog.e(null, ex); } if (isCancelled()) return; if (success) { args.putString(QUOTE_TEXT_KEY, m_Quote); txtBody.setText(m_Quote); parseQuote(); buttons.setVisibility(View.VISIBLE); } else { AppLog.e(getActivity(), ex, new Runnable() { @Override public void run() { new QuoteLoader(m_QuoteUrl).execute(); } }); } } } }