package org.softeg.slartus.forpdaplus.fragments.topic;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.softeg.slartus.forpdacommon.PatternExtensions;
import org.softeg.slartus.forpdaplus.App;
import org.softeg.slartus.forpdaplus.Client;
import org.softeg.slartus.forpdaplus.IntentActivity;
import org.softeg.slartus.forpdaplus.MainActivity;
import org.softeg.slartus.forpdaplus.R;
import org.softeg.slartus.forpdaplus.classes.AdvWebView;
import org.softeg.slartus.forpdaplus.classes.HtmlBuilder;
import org.softeg.slartus.forpdaplus.classes.common.ExtUrl;
import org.softeg.slartus.forpdaplus.common.AppLog;
import org.softeg.slartus.forpdaplus.fragments.WebViewFragment;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by radiationx on 04.02.16.
*/
public class CuratorFragment extends WebViewFragment {
private AdvWebView webView;
private String topicId = "";
private String url = "";
private String ids = "";
private String postarg = "";
private String postact = "";
private String postUrl = "";
@Override
public AdvWebView getWebView() {
return webView;
}
@Override
public WebViewClient getWebViewClient() {
return new MyWebViewClient();
}
@Override
public String getTitle() {
return null;
}
@Override
public String getUrl() {
return null;
}
@Override
public void reload() {
load(url, topicId);
}
@Override
public AsyncTask getAsyncTask() {
return null;
}
@Override
public boolean closeTab() {
return false;
}
public static CuratorFragment newInstance(String url, String topicId){
CuratorFragment fragment = new CuratorFragment();
Bundle args = new Bundle();
args.putString("URL", url);
args.putString("TOPIC_ID", topicId);
fragment.setArguments(args);
return fragment;
}
public static void showSpecial(String url, String topicId) {
MainActivity.addTab(App.getContext().getString(R.string.multi_moderation), url, newInstance(url, topicId));
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.curator_fragment, container, false);
webView = (AdvWebView) findViewById(R.id.wvBody);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
if(App.getInstance().getPreferences().getBoolean("pancilInActionBar",false)){
fab.hide();
}else {
setHideFab(fab);
setFabColors(fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
webView.evalJs("getIds();");
}
});
}
ImageButton up = (ImageButton) findViewById(R.id.btnUp);
ImageButton down = (ImageButton) findViewById(R.id.btnDown);
up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.pageUp(true);
}
});
down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.pageDown(true);
}
});
initSwipeRefreshLayout();
webView.addJavascriptInterface(this, "HTMLOUT");
topicId = getArguments().getString("TOPIC_ID");
url = getArguments().getString("URL");
load(url, topicId);
return view;
}
private class LoadPostsTask extends AsyncTask<Boolean, String, Boolean> {
private String m_ThemeBody;
@Override
protected Boolean doInBackground(Boolean... get) {
try {
if (isCancelled()) return false;
m_ThemeBody = parse(Client.getInstance().performGet(url,true,false)).getHtml().toString();
return true;
} catch (Throwable e) {
return false;
}
}
protected void onPreExecute() {
setLoading(true);
}
protected void onPostExecute(final Boolean success) {
setLoading(false);
if (isCancelled()) return;
if (success) {
showThemeBody(m_ThemeBody);
getArguments().putString("TOPIC_ID", topicId);
System.gc();
}
}
}
private class PostTask extends AsyncTask<Boolean, String, Boolean> {
private String m_ThemeBody;
@Override
protected Boolean doInBackground(Boolean... get) {
try {
if (isCancelled()) return false;
List<NameValuePair> nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("postact", postact));
nvps.add(new BasicNameValuePair("postarg", postarg));
nvps.add(new BasicNameValuePair("postsel2", ids));
m_ThemeBody = parse(Client.getInstance().performPost(postUrl, nvps)).getHtml().toString();
postarg = "";
postact = "";
ids = "";
return true;
} catch (Throwable e) {
return false;
}
}
protected void onPreExecute() {
setLoading(true);
}
protected void onPostExecute(final Boolean success) {
setLoading(false);
if (isCancelled()) return;
if (success) {
showThemeBody(m_ThemeBody);
getArguments().putString("TOPIC_ID", topicId);
}
}
}
private HtmlBuilder parse(String m_ThemeBody){
HtmlBuilder builder = new HtmlBuilder();
builder.beginHtml("curator");
builder.beginBody("curator");
String pages = "";
Pattern mainPattern = PatternExtensions.compile("<form method=\"post\"[\\s\\S]*?action=\"([^\"]*?)\"[^>]*>([\\s\\S]*?)</form>");
Pattern postsPattern = PatternExtensions.compile("(<input [\\s\\S]*?)<hr>");
Pattern postPattern = PatternExtensions.compile("<input type=\"checkbox\" name=\"postsel\\[\\]\" value=\"(\\d*?)\"[\\s\\S]*?showuser=(\\d*)\"[^>]*>([^<]*)</a>([^$]*)<br>[^<]*<br>([^$]*)");
Matcher postMatcher;
Matcher m = Pattern.compile("<br>Страницы:[^<]*([\\s\\S]*?)<br>").matcher(m_ThemeBody);
if(m.find())
pages = m.group(1);
m = mainPattern.matcher(m_ThemeBody);
if(m.find()){
builder.append("<div class=\"panel top\"><div class=\"pages\">").append(pages).append("</div>");
builder.append("<div class=\"controls\"><button onclick=\"invertCheckboxes();\">Инвертировать</button><button onclick=\"setCheckedAll();\">Выделить всё</button></div></div>");
builder.append("<div class=\"posts_list\">");
postUrl = m.group(1);
m = postsPattern.matcher(m.group(2));
while (m.find()){
postMatcher = postPattern.matcher(m.group(1));
if(postMatcher.find()){
builder.append("<div class=\"post_container\">");
builder.append("<div class=\"post_header\">");
builder.append("<a class=\"inf nick\" href=\"http://4pda.ru/forum/index.php?showuser=")
.append(postMatcher.group(2)).append("\"><span><b>").append(postMatcher.group(3))
.append("</b></span></a>");
builder.append("<a class=\"inf link\" href=\"http://4pda.ru/forum/index.php?act=findpost&pid=")
.append(postMatcher.group(1)).append("\"><span><span class=\"sharp\">#</span>").append(postMatcher.group(1))
.append("</span></a>");
builder.append("<div class=\"date-link\"><span class=\"inf date\"><span>").append(postMatcher.group(4).replaceAll("\n","").replace("@", "")).append("</span></span></div>");
builder.append("<label class=\"checkbox\"><input type=\"checkbox\" name=\"postsel[]\" value=\"").append(postMatcher.group(1)).append("\"><span class=\"icon\"></span></label>");
builder.append("</div>");
builder.append("<div class=\"post_body \">");
builder.append(postMatcher.group(5));
builder.append("</div>");
builder.append("</div>");
}
}
builder.append("</div>");
builder.append("<div class=\"panel bottom\"><div class=\"controls\"><button onclick=\"invertCheckboxes();\">Инвертировать</button><button onclick=\"setCheckedAll();\">Выделить всё</button></div>");
builder.append("<div class=\"pages\">").append(pages).append("</div></div>");
}
builder.endBody();
builder.endHtml();
return builder;
}
private void showThemeBody(String body) {
try {
webView.loadDataWithBaseURL("http://4pda.ru/forum/", body, "text/html", "UTF-8", null);
webView.setWebViewClient(new MyWebViewClient());
} catch (Exception ex) {
AppLog.e(getMainActivity(), ex);
}
}
public void load(String url, String topicId){
this.topicId = topicId;
load(url);
}
public void load(String url){
this.url = url;
setLoading(true);
new LoadPostsTask().execute(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if(App.getInstance().getPreferences().getBoolean("pancilInActionBar",false)) {
menu.add(R.string.write)
.setIcon(R.drawable.auto_fix)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
webView.evalJs("getIds();");
return true;
}
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
menu.add(R.string.setting)
.setIcon(R.drawable.settings_white)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ThemeCurator.showMmodDialog(getActivity(), CuratorFragment.this, getArguments().getString("TOPIC_ID"));
return true;
}
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(R.string.link)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ExtUrl.showSelectActionDialog(getMainActivity(), getString(R.string.link), url);
return true;
}
});
}
@JavascriptInterface
public void showCuratorDialog(final String ids) {
run(new Runnable() {
@Override
public void run() {
CuratorFragment.this.ids = ids;
String[] idsArray = ids.split(",");
Log.e("kek", idsArray.length+" length");
Log.e("kek", "'"+idsArray[0]+"'");
if (TextUtils.isEmpty(idsArray[0])) {
Toast.makeText(getContext(), R.string.no_selected_posts, Toast.LENGTH_SHORT).show();
return;
}
LayoutInflater inflater = getMainActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.curator_actions, null);
final RadioGroup group = (RadioGroup) view.findViewById(R.id.radioGroup);
final EditText editText = (EditText) view.findViewById(R.id.editText2);
editText.setVisibility(View.GONE);
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radioButton:
editText.setVisibility(View.GONE);
break;
case R.id.radioButton2:
editText.setVisibility(View.VISIBLE);
break;
}
}
});
new MaterialDialog.Builder(getContext())
.customView(view, true)
.positiveText(R.string.perform)
.negativeText(R.string.cancel)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog dialog, DialogAction which) {
switch (group.getCheckedRadioButtonId()) {
case R.id.radioButton:
postact = "del";
break;
case R.id.radioButton2:
postact = "mov";
postarg = editText.getText().toString();
break;
}
new PostTask().execute();
}
})
.show();
}
});
}
public void run(final Runnable runnable) {
getMainActivity().runOnUiThread(runnable);
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
if (checkIsTheme(url))
return true;
IntentActivity.tryShowUrl(getMainActivity(), new Handler(), url, true, false);
return true;
}
}
private boolean checkIsTheme(String url) {
if("mmod".equals(Uri.parse(url).getQueryParameter("act"))){
load(url);
return true;
}
return false;
}
}