package org.softeg.slartus.forpdaplus.fragments.topic;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.nineoldandroids.view.ViewPropertyAnimator;
import org.softeg.slartus.forpdaapi.TopicApi;
import org.softeg.slartus.forpdacommon.NotReportException;
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.ForumUser;
import org.softeg.slartus.forpdaplus.classes.MenuListDialog;
import org.softeg.slartus.forpdaplus.classes.Post;
import org.softeg.slartus.forpdaplus.classes.TopicBodyBuilder;
import org.softeg.slartus.forpdaplus.classes.WebViewExternals;
import org.softeg.slartus.forpdaplus.classes.common.ExtUrl;
import org.softeg.slartus.forpdaplus.classes.common.Functions;
import org.softeg.slartus.forpdaplus.classes.forum.ExtTopic;
import org.softeg.slartus.forpdaplus.common.AppLog;
import org.softeg.slartus.forpdaplus.common.HelpTask;
import org.softeg.slartus.forpdaplus.controls.imageview.ImageViewDialogFragment;
import org.softeg.slartus.forpdaplus.controls.imageview.ImgViewer;
import org.softeg.slartus.forpdaplus.controls.quickpost.QuickPostFragment;
import org.softeg.slartus.forpdaplus.db.TopicsHistoryTable;
import org.softeg.slartus.forpdaplus.fragments.WebViewFragment;
import org.softeg.slartus.forpdaplus.fragments.search.SearchSettingsDialogFragment;
import org.softeg.slartus.forpdaplus.listfragments.BricksListDialogFragment;
import org.softeg.slartus.forpdaplus.listfragments.NotesListFragment;
import org.softeg.slartus.forpdaplus.listfragments.TopicAttachmentListFragment;
import org.softeg.slartus.forpdaplus.listfragments.TopicReadersListFragment;
import org.softeg.slartus.forpdaplus.listfragments.TopicUtils;
import org.softeg.slartus.forpdaplus.listfragments.TopicWritersListFragment;
import org.softeg.slartus.forpdaplus.listfragments.TopicsListFragment;
import org.softeg.slartus.forpdaplus.listfragments.next.ForumFragment;
import org.softeg.slartus.forpdaplus.listfragments.next.UserReputationFragment;
import org.softeg.slartus.forpdaplus.listtemplates.BrickInfo;
import org.softeg.slartus.forpdaplus.listtemplates.NotesBrickInfo;
import org.softeg.slartus.forpdaplus.listtemplates.TopicReadersBrickInfo;
import org.softeg.slartus.forpdaplus.listtemplates.TopicWritersBrickInfo;
import org.softeg.slartus.forpdaplus.notes.NoteDialog;
import org.softeg.slartus.forpdaplus.prefs.Preferences;
import org.softeg.slartus.forpdaplus.tabs.TabItem;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import static org.softeg.slartus.forpdaplus.utils.Utils.getS;
/**
* Created by radiationx on 28.10.15.
*/
public class ThemeFragment extends WebViewFragment implements BricksListDialogFragment.IBricksListDialogCaller {
@BindView(R.id.quick_post_panel)
LinearLayout mQuickPostPanel;
@BindView(R.id.fab)
FloatingActionButton fab;
@BindView(R.id.wvBody)
AdvWebView webView;
@BindView(R.id.txtSearch)
EditText txtSearch;
@BindView(R.id.pnlSearch)
LinearLayout pnlSearch;
@BindView(R.id.buttonsPanel)
FrameLayout buttonsPanel;
@OnClick(R.id.btnPrevSearch)
public void btnPrevSearch() {
webView.findNext(false);
}
@OnClick(R.id.btnNextSearch)
public void btnNextSearch() {
webView.findNext(true);
}
@OnClick(R.id.btnCloseSearch)
public void btnCloseSearch() {
closeSearch();
}
@OnClick(R.id.btnUp)
public void btnUp() {
webView.pageUp(true);
}
@OnClick(R.id.btnDown)
public void btnDown() {
webView.pageDown(true);
}
private static final String TAG = "ThemeActivity";
private static final String TOPIC_URL_KEY = "ThemeActivity.TOPIC_URL_KEY";
public static Boolean LoadsImagesAutomatically = null;
private Handler mHandler = new Handler();
private String m_LastUrl;
private ArrayList<SessionHistory> m_History = new ArrayList<>();
private ExtTopic m_Topic;
private Boolean m_SpoilFirstPost = true;
// текст редактирования сообщения при переходе по страницам
private String m_PostBody = "";
// id сообщения к которому скроллить
private String m_ScrollElement = null;
private Boolean m_FromHistory = false;
private int m_ScrollY = 0;
private QuickPostFragment mQuickPostFragment;
private String lastStyle;
private GetThemeTask asyncTask;
private MyWebViewClient webViewClient;
public static ThemeFragment newInstance(String url) {
ThemeFragment fragment = new ThemeFragment();
Bundle args = new Bundle();
args.putString(TOPIC_URL_KEY, url);
fragment.setArguments(args);
return fragment;
}
public static String getThemeUrl(CharSequence topicId) {
return "http://4pda.ru/forum/index.php?showtopic=" + topicId;
}
public static String getThemeUrl(CharSequence topicId, CharSequence urlParams) {
return String.format("http://4pda.ru/forum/index.php?showtopic=%s%s", topicId, TextUtils.isEmpty(urlParams) ? "" : ("&" + urlParams));
}
public static void showTopicById(CharSequence topicId, CharSequence urlParams) {
String url = getThemeUrl(topicId, urlParams);
MainActivity.addTab(getS(R.string.theme), url, newInstance(url));
}
public static void showTopicById(CharSequence title, CharSequence topicId, CharSequence urlParams) {
String url = getThemeUrl(topicId, urlParams);
MainActivity.addTab(title.toString(), url, newInstance(url));
}
public static void showTopicById(CharSequence topicId) {
String url = getThemeUrl(topicId);
MainActivity.addTab(getS(R.string.theme), url, newInstance(url));
}
public static void showImgPreview(final FragmentActivity context, String title, String previewUrl,
final String fullUrl) {
ImageViewDialogFragment fragment = new ImageViewDialogFragment();
Bundle args = new Bundle();
args.putString(ImageViewDialogFragment.PREVIEW_URL_KEY, previewUrl);
args.putString(ImageViewDialogFragment.URL_KEY, fullUrl);
args.putString(ImageViewDialogFragment.TITLE_KEY, title);
fragment.setArguments(args);
fragment.show(context.getSupportFragmentManager(), "dlg1");
}
@Override
public WebViewClient getWebViewClient() {
if (webViewClient == null)
webViewClient = new MyWebViewClient();
return webViewClient;
}
@Override
public String getTitle() {
return m_Topic.getTitle();
}
@Override
public String getUrl() {
return getLastUrl();
}
@Override
public void reload() {
reloadTopic();
}
@Override
public AsyncTask getAsyncTask() {
return asyncTask;
}
@Override
public boolean closeTab() {
getPostBody();
if (!TextUtils.isEmpty(m_PostBody)) {
new MaterialDialog.Builder(getMainActivity())
.title(R.string.ConfirmTheAction)
.content(R.string.entered_text)
.positiveText(R.string.apply_yes)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
clear();
getMainActivity().tryRemoveTab(getTag());
}
})
.negativeText(R.string.apply_cancel)
.show();
return true;
} else {
clear();
return false;
}
}
@Override
public String Prefix() {
return "theme";
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.theme, container, false);
ButterKnife.bind(this, view);
initSwipeRefreshLayout();
lastStyle = App.getInstance().getThemeCssFileName();
LoadsImagesAutomatically = null;
getMainActivity().setDefaultKeyMode(Activity.DEFAULT_KEYS_SEARCH_LOCAL);// чтобы поиск начинался при вводе текста
mQuickPostFragment = (QuickPostFragment) getChildFragmentManager().findFragmentById(R.id.quick_post_fragment);
mQuickPostFragment.setParentTag(getTag());
mQuickPostFragment.setOnPostSendListener(postResult -> {
if (postResult.Success) {
hideMessagePanel();
if (Client.getInstance().getRedirectUri() == null)
Log.e("ThemeActivity", "redirect is null");
m_LastUrl = Client.getInstance().getRedirectUri() == null ? Client.getInstance().getLastUrl() : Client.getInstance().getRedirectUri().toString();
m_Topic = postResult.ExtTopic;
if (postResult.TopicBody == null)
Log.e("ThemeActivity", "TopicBody is null");
addToHistory(postResult.TopicBody);
showBody(postResult.TopicBody);
} else {
if (postResult.Exception != null)
AppLog.e(getMainActivity(), postResult.Exception, () -> mQuickPostFragment.post());
else if (!TextUtils.isEmpty(postResult.ForumErrorMessage))
new MaterialDialog.Builder(getContext())
.title(R.string.forum_msg)
.content(postResult.ForumErrorMessage)
.show();
}
});
txtSearch.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
doSearch(txtSearch.getText().toString());
}
public void afterTextChanged(Editable editable) {
}
});
hideMessagePanel();
closeSearch();
loadPreferences(App.getInstance().getPreferences());
showTheme(IntentActivity.normalizeThemeUrl(getArguments().getString(TOPIC_URL_KEY)));
if (App.getInstance().getPreferences().getBoolean("pancilInActionBar", false)) {
fab.hide();
} else {
setHideFab(fab);
setFabColors(fab);
fab.setOnClickListener(view1 -> toggleMessagePanelVisibility());
}
registerForContextMenu(webView);
setWebViewSettings();
webView.getSettings().setDomStorageEnabled(true);
if (Build.VERSION.SDK_INT < 18)
webView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);
String appCachePath = App.getInstance().getCacheDir().getAbsolutePath();
webView.getSettings().setAppCachePath(appCachePath);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//webView.getSettings().setLoadWithOverviewMode(false);
//webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setDefaultFontSize(Preferences.Topic.getFontSize());
webView.setWebChromeClient(new MyChromeClient());
/*if (getSupportActionBar() != null)
webView.setActionBarheight(getSupportActionBar().getHeight());*/
setHideArrows(Preferences.isHideArrows());
webView.addJavascriptInterface(new ForPdaWebInterface(this), ForPdaWebInterface.NAME);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
try {
outState.putSerializable("History", m_History);
outState.putSerializable("Topic", m_Topic);
webView.saveState(outState);
outState.putString("LastUrl", getLastUrl());
outState.putString("ScrollElement", m_ScrollElement);
outState.putString("LastStyle", lastStyle);
outState.putBoolean("FromHistory", m_FromHistory);
outState.putString("LoadsImagesAutomatically", LoadsImagesAutomatically == null ? "null" : (LoadsImagesAutomatically ? "1" : "0"));
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState == null) return;
try {
m_Topic = (ExtTopic) savedInstanceState.getSerializable("Topic");
if (m_Topic != null)
mQuickPostFragment.setTopic(m_Topic.getForumId(), m_Topic.getId(), Client.getInstance().getAuthKey());
m_LastUrl = savedInstanceState.getString("LastUrl");
m_ScrollElement = savedInstanceState.getString("ScrollElement");
m_FromHistory = savedInstanceState.getBoolean("FromHistory");
String sLoadsImagesAutomatically = savedInstanceState.getString("LoadsImagesAutomatically");
LoadsImagesAutomatically = "null".equals(sLoadsImagesAutomatically) ? null : Boolean.parseBoolean(sLoadsImagesAutomatically);
loadPreferences(App.getInstance().getPreferences());
m_History = (ArrayList<SessionHistory>) savedInstanceState.getSerializable("History");
assert m_History != null;
if (m_History.size() > 0) {
SessionHistory sessionHistory = m_History.get(m_History.size() - 1);
m_ScrollY = sessionHistory.getY();
m_LastUrl = sessionHistory.getUrl();
m_Topic = sessionHistory.getTopic();
if (m_Topic != null)
mQuickPostFragment.setTopic(m_Topic.getForumId(), m_Topic.getId(), Client.getInstance().getAuthKey());
if (sessionHistory.getBody() == null) {
showTheme(sessionHistory.getUrl());
} else {
String body = sessionHistory.getBody().replace(savedInstanceState.getString("LastStyle"), App.getInstance().getThemeCssFileName());
showBody(body);
sessionHistory.setBody(body);
}
}
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
private Boolean m_FirstTime = true;
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (!m_FirstTime)
onPrepareOptionsMenu();
m_FirstTime = false;
if (mTopicOptionsMenu != null)
configureOptionsMenu(getMainActivity(), getHandler(), mTopicOptionsMenu, true, getLastUrl());
else if (getTopic() != null)
mTopicOptionsMenu = addOptionsMenu(getMainActivity(), getHandler(), menu, true, getLastUrl());
}
private SubMenu mTopicOptionsMenu;
private SubMenu addOptionsMenu(final Context context, final Handler mHandler,
Menu menu, Boolean addFavorites, final String shareItUrl) {
SubMenu optionsMenu = menu.addSubMenu(getS(R.string.theme_option));
configureOptionsMenu(context, mHandler, optionsMenu, addFavorites, shareItUrl);
return optionsMenu;
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void configureOptionsMenu(final Context context, final Handler mHandler, SubMenu optionsMenu,
Boolean addFavorites, final String shareItUrl) {
optionsMenu.clear();
if (addFavorites) {
optionsMenu.add(R.string.AddToFavorites).setOnMenuItemClickListener(menuItem -> {
try {
TopicUtils.showSubscribeSelectTypeDialog(context, mHandler, getTopic());
} catch (Exception ex) {
AppLog.e(context, ex);
}
return true;
});
optionsMenu.add(R.string.DeleteFromFavorites).setOnMenuItemClickListener(menuItem -> {
try {
final HelpTask helpTask = new HelpTask(context, context.getString(R.string.DeletingFromFavorites));
helpTask.setOnPostMethod(param -> {
if (helpTask.Success)
Toast.makeText(context, (String) param, Toast.LENGTH_SHORT).show();
else
AppLog.e(context, helpTask.ex);
return null;
});
helpTask.execute((HelpTask.OnMethodListener) param -> TopicApi.deleteFromFavorites(Client.getInstance(),
getTopic().getId())
);
} catch (Exception ex) {
AppLog.e(context, ex);
}
return true;
});
// new
/* optionsMenu.add(R.string.FindOnPage).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
onSearchRequested();
return true;
}
});
optionsMenu.add(R.string.FindInTopic).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
SearchSettingsDialogFragment.showSearchSettingsDialog(getMainActivity(),
SearchSettingsDialogFragment.createTopicSearchSettings(getTopic().getId()));
return true;
}
});*/
optionsMenu.add(R.string.OpenTopicForum).setOnMenuItemClickListener(menuItem -> {
try {
ForumFragment.showActivity(context, getTopic().getForumId(), getTopic().getId());
} catch (Exception ex) {
AppLog.e(context, ex);
}
return true;
});
}
optionsMenu.add(R.string.NotesByTopic).setOnMenuItemClickListener(menuItem -> {
Bundle args = new Bundle();
args.putString(NotesListFragment.TOPIC_ID_KEY, getTopic().getId());
MainActivity.showListFragment(new NotesBrickInfo().getName(), args);
return true;
});
if (!Preferences.Topic.getReadersAndWriters()) {
optionsMenu.add(R.string.who_read_topic).setOnMenuItemClickListener(menuItem -> {
Bundle args = new Bundle();
args.putString(TopicReadersListFragment.TOPIC_ID_KEY, getTopic().getId());
MainActivity.showListFragment(getTopic().getId(), TopicReadersBrickInfo.NAME, args);
return true;
});
optionsMenu.add(R.string.who_posted_msg).setOnMenuItemClickListener(menuItem -> {
Bundle args = new Bundle();
args.putString(TopicWritersListFragment.TOPIC_ID_KEY, getTopic().getId());
MainActivity.showListFragment(getTopic().getId(), TopicWritersBrickInfo.NAME, args);
return true;
});
}
/*optionsMenu.add("Ссылка").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ExtUrl.showSelectActionDialog(getMainActivity(), "Ссылка", TextUtils.isEmpty(getLastUrl()) ? ("http://4pda.ru/forum/index.php?showtopic=" + getTopic().getId()) : getLastUrl());
return true;
}
});*/
}
@Override
public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
try {
boolean pancil = App.getInstance().getPreferences().getBoolean("pancilInActionBar", false);
if (pancil) {
menu.add(R.string.new_post)
.setIcon(R.drawable.pencil)
.setOnMenuItemClickListener(item -> {
toggleMessagePanelVisibility();
return true;
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
menu.add(R.string.Refresh)
.setIcon(R.drawable.refresh)
.setOnMenuItemClickListener(item -> {
reloadTopic();
return true;
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
SubMenu subMenu = menu.addSubMenu(R.string.Attaches)
.setIcon(R.drawable.download_white);
subMenu.add(R.string.attachments_page)
.setOnMenuItemClickListener(item -> {
showPageAttaches();
return true;
});
subMenu.add(R.string.all_attachments_topic)
.setOnMenuItemClickListener(item -> {
showTopicAttaches();
return true;
});
menu.add(R.string.FindOnPage)
.setOnMenuItemClickListener(item -> {
onSearchRequested();
return true;
});
menu.add(R.string.FindInTopic)
.setOnMenuItemClickListener(item -> {
SearchSettingsDialogFragment.showSearchSettingsDialog(getMainActivity(),
SearchSettingsDialogFragment.createTopicSearchSettings(getTopic().getId()));
return true;
});
mTopicOptionsMenu = addOptionsMenu(getMainActivity(), getHandler(), menu, true, getLastUrl());
menu.add(R.string.link).setOnMenuItemClickListener(menuItem -> {
ExtUrl.showSelectActionDialog(getMainActivity(), getS(R.string.link), TextUtils.isEmpty(getLastUrl()) ? ("http://4pda.ru/forum/index.php?showtopic=" + getTopic().getId()) : getLastUrl());
return true;
});
SubMenu optionsMenu = menu.addSubMenu(R.string.theme_view);
optionsMenu.getItem().setTitle(R.string.theme_view);
optionsMenu.add(String.format(getS(R.string.avatars),
App.getContext().getResources().getStringArray(R.array.AvatarsShowTitles)[Preferences.Topic.getShowAvatarsOpt()]))
.setOnMenuItemClickListener(menuItem -> {
String[] avatars = App.getContext().getResources().getStringArray(R.array.AvatarsShowTitles);
new MaterialDialog.Builder(getMainActivity())
.title(R.string.show_avatars)
.cancelable(true)
.items(avatars)
.itemsCallbackSingleChoice(Preferences.Topic.getShowAvatarsOpt(), (dialog, view1, i, avatars1) -> {
//if(i==-1) return false;
Preferences.Topic.setShowAvatarsOpt(i);
menuItem.setTitle(String.format(getS(R.string.show_avatars_a),
App.getContext().getResources().getStringArray(R.array.AvatarsShowTitles)[Preferences.Topic.getShowAvatarsOpt()]));
return true; // allow selection
})
.show();
return true;
});
if (!pancil) {
optionsMenu.add(R.string.hide_pencil)
.setOnMenuItemClickListener(menuItem -> {
Preferences.setHideFab(!Preferences.isHideFab());
setHideFab(fab);
menuItem.setChecked(Preferences.isHideFab());
return true;
}).setCheckable(true).setChecked(Preferences.isHideFab());
}
optionsMenu.add(R.string.hide_arrows)
.setOnMenuItemClickListener(menuItem -> {
Preferences.setHideArrows(!Preferences.isHideArrows());
setHideArrows(Preferences.isHideArrows());
menuItem.setChecked(Preferences.isHideArrows());
return true;
}).setCheckable(true).setChecked(Preferences.isHideArrows());
optionsMenu.add(R.string.loading_img_for_session)
.setOnMenuItemClickListener(menuItem -> {
Boolean loadImagesAutomatically1 = getLoadsImagesAutomatically();
setLoadsImagesAutomatically(!loadImagesAutomatically1);
menuItem.setChecked(!loadImagesAutomatically1);
return true;
}).setCheckable(true).setChecked(getLoadsImagesAutomatically());
optionsMenu.add(R.string.font_size)
.setOnMenuItemClickListener(menuItem -> {
showFontSizeDialog();
return true;
});
optionsMenu.add(R.string.theme_style).setOnMenuItemClickListener(menuItem -> {
showStylesDialog(App.getInstance().getPreferences());
return true;
});
if (Preferences.System.isCurator()) {
menu.add(R.string.multi_moderation).setOnMenuItemClickListener(menuItem -> {
try {
ThemeCurator.showMmodDialog(getActivity(), ThemeFragment.this, getTopic().getId());
} catch (Exception ex) {
return false;
}
return true;
});
}
} catch (Exception ex) {
AppLog.e(getMainActivity(), ex);
}
}
@Override
public void onResume() {
super.onResume();
if (m_Topic != null) {
setSubtitle(m_Topic.getCurrentPage() + "/" + m_Topic.getPagesCount());
}
if (mQuickPostFragment != null)
mQuickPostFragment.onResume();
}
@Override
public void onPause() {
super.onPause();
if (mQuickPostFragment != null)
mQuickPostFragment.onPause();
}
private void hideKeyboard() {
mQuickPostFragment.hideKeyboard();
}
@Override
public void hidePopupWindows() {
super.hidePopupWindows();
mQuickPostFragment.hidePopupWindow();
}
public Handler getHandler() {
return mHandler;
}
public ExtTopic getTopic() {
return m_Topic;
}
public String getLastUrl() {
return m_LastUrl;
}
public boolean onSearchRequested() {
hideMessagePanel();
pnlSearch.setVisibility(View.VISIBLE);
return false;
}
protected void showQuoteEditor(String url) {
DialogFragment quoteEditorDialogFragment = ThemeQuoteEditor
.newInstance(url, getTag());
quoteEditorDialogFragment.show(getChildFragmentManager(), "dialog");
}
public void checkBodyAndReload(String body) {
if (TextUtils.isEmpty(body)) {
reloadTopic();
}
}
public void checkBodyAndReload() {
try {
webView.evalJs("window.HTMLOUT.checkBodyAndReload(document.getElementsByTagName('body')[0].innerHTML);");
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
public void showPageAttaches() {
try {
webView.evalJs("window.HTMLOUT.showTopicAttaches('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
public void showTopicAttaches() {
if (m_Topic == null)
return;
TopicAttachmentListFragment.showActivity(getMainActivity(), m_Topic.getId());
}
private void doSearch(String query) {
if (TextUtils.isEmpty(query)) return;
if (Build.VERSION.SDK_INT >= 16) {
webView.findAllAsync(query);
} else {
webView.findAll(query);
}
try {
Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);
m.invoke(webView, true);
} catch (Throwable ignored) {
}
//onSearchRequested();
}
private void closeSearch() {
mHandler.post(() -> {
if (Build.VERSION.SDK_INT >= 16) {
webView.findAllAsync("");
} else {
webView.findAll("");
}
try {
Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);
m.invoke(webView, false);
} catch (Throwable ignored) {
}
pnlSearch.setVisibility(View.GONE);
InputMethodManager imm = (InputMethodManager) getMainActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(pnlSearch.getWindowToken(), 0);
});
}
@Override
protected void loadPreferences(SharedPreferences prefs) {
super.loadPreferences(prefs);
LoadsImagesAutomatically = WebViewExternals.isLoadImages("theme");
m_SpoilFirstPost = Preferences.Topic.getSpoilFirstPost();
}
public void showLinkMenu(final String link) {
showLinkMenu(link, "");
}
public void showLinkMenu(final String link, String postId) {
if (TextUtils.isEmpty(link) || link.contains("HTMLOUT.ru")
|| link.equals("#")
|| link.startsWith("file:///")) return;
ExtUrl.showSelectActionDialog(mHandler, getMainActivity(), m_Topic.getTitle(), "", link, m_Topic.getId(),
m_Topic.getTitle(), postId, "", "");
}
@Override
public boolean onBackPressed() {
if (pnlSearch.getVisibility() == View.VISIBLE) {
closeSearch();
return true;
}
if (m_History.size() > 1) {
m_History.remove(m_History.size() - 1);
SessionHistory sessionHistory = m_History.get(m_History.size() - 1);
m_ScrollY = sessionHistory.getY();
if (sessionHistory.getBody() == null) {
m_History.remove(m_History.size() - 1);
showTheme(sessionHistory.getUrl());
} else {
m_LastUrl = sessionHistory.getUrl();
m_Topic = sessionHistory.getTopic();
if (m_Topic != null)
mQuickPostFragment.setTopic(m_Topic.getForumId(), m_Topic.getId(), Client.getInstance().getAuthKey());
showBody(sessionHistory.getBody());
}
return true;
}
getPostBody();
if (!TextUtils.isEmpty(m_PostBody)) {
new MaterialDialog.Builder(getMainActivity())
.title(R.string.ConfirmTheAction)
.content(R.string.entered_text)
.positiveText(R.string.apply_yes)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
clear();
getMainActivity().tryRemoveTab(getTag());
}
})
.negativeText(R.string.apply_cancel)
.show();
return true;
} else {
clear();
return false;
}
}
public void clear() {
clear(false);
}
public void clear(Boolean clearChache) {
webView.setWebViewClient(null);
webView.loadData("<html><head></head><body bgcolor=" + App.getInstance().getCurrentBackgroundColorHtml() + "></body></html>", "text/html", "UTF-8");
if (clearChache)
webView.clearCache(true);
if (m_Topic != null)
m_Topic.dispose();
m_Topic = null;
}
public String getPostBody() {
m_PostBody = mQuickPostFragment.getPostBody();
return m_PostBody;
}
public void setPostBody(String postBody) {
m_PostBody = postBody;
}
public void quote(final String forumId, final String topicId, final String postId, final String postDate, String userId, String userNick) {
final String finalPostDate = Functions.getForumDateTime(Functions.parseForumDateTime(postDate, Functions.getToday(), Functions.getYesterToday()));
final String mUserNick = userNick.replace("\"", "\\\"");
CharSequence clipboardText = null;
try {
ClipboardManager clipboardManager = (android.content.ClipboardManager) App.getInstance().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData primaryClip = clipboardManager.getPrimaryClip();
clipboardText = null;
if (primaryClip != null)
for (int i = 0; i < primaryClip.getItemCount(); i++) {
clipboardText = clipboardManager.getPrimaryClip().getItemAt(i).getText();
if ("primaryClip".equals(clipboardText) || "clipboardManager".equals(clipboardText))
clipboardText = null;
if (clipboardText != null)
clipboardText = clipboardText.toString().trim();
if (!TextUtils.isEmpty(clipboardText))
break;
}
} catch (Throwable ex) {
AppLog.eToast(getContext(), ex);
}
CharSequence[] titles = new CharSequence[]{getS(R.string.quote_post), getS(R.string.blank_quote), getS(R.string.quote_from_buffer)};
if (TextUtils.isEmpty(clipboardText))
titles = new CharSequence[]{getS(R.string.quote_editor), getS(R.string.blank_quote)};
final CharSequence finalClipboardText = clipboardText;
new MaterialDialog.Builder(getContext())
.title(R.string.quote)
.cancelable(true)
.items(titles)
.itemsCallback((dialog, view1, i, titles1) -> {
switch (i) {
case 0:
showQuoteEditor("http://4pda.ru/forum/index.php?act=Post&CODE=02&f=" + forumId + "&t=" + topicId + "&qpid=" + postId);
break;
case 1:
getMainActivity().runOnUiThread(() -> new Handler().post(() -> insertTextToPost("[quote name=\"" + mUserNick + "\" date=\"" + finalPostDate + "\" post=\"" + postId + "\"]\n\n[/quote]")));
break;
case 2:
getMainActivity().runOnUiThread(() -> new Handler().post(() -> insertTextToPost("[quote name=\"" + mUserNick + "\" date=\"" + finalPostDate + "\" post=\"" + postId + "\"]\n" + finalClipboardText + "\n[/quote]")));
break;
}
})
.show();
}
public void openActionMenu(final String postId, final String postDate,
final String userId, final String userNick,
final Boolean canEdit, final Boolean canDelete) {
try {
final List<MenuListDialog> list = new ArrayList<>();
if (Client.getInstance().getLogined()) {
list.add(new MenuListDialog(getS(R.string.url_post), () -> showLinkMenu(Post.getLink(m_Topic.getId(), postId), postId)));
list.add(new MenuListDialog(getS(R.string.report_msg), () -> Post.claim(getMainActivity(), mHandler, m_Topic.getId(), postId)));
if (canEdit) {
list.add(new MenuListDialog(getS(R.string.edit_post), () -> EditPostFragment.editPost(getMainActivity(), m_Topic.getForumId(), m_Topic.getId(), postId, Client.getInstance().getAuthKey(), getTag())));
}
if (canDelete) {
list.add(new MenuListDialog(getS(R.string.delete_post), () -> prepareDeleteMessage(postId)));
}
list.add(new MenuListDialog(getS(R.string.quote_post), () -> quote(m_Topic.getForumId(), m_Topic.getId(), postId, postDate, userId, userNick)));
}
list.add(new MenuListDialog(getS(R.string.create_note), () -> NoteDialog.showDialog(mHandler, getMainActivity(), m_Topic.getTitle(), null,
"http://4pda.ru/forum/index.php?showtopic=" + m_Topic.getId() + "&view=findpost&p=" + postId,
m_Topic.getId(), m_Topic.getTitle(), postId, null, null)));
ExtUrl.showContextDialog(getContext(), null, list);
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
private void showBody(String body) {
super.showBody();
try {
setScrollElement();
setTitle(m_Topic.getTitle());
if (getSupportActionBar() != null)
setSubtitle(m_Topic.getCurrentPage() + "/" + m_Topic.getPagesCount());
//webView.loadDataWithBaseURL(m_LastUrl, body, "text/html", "UTF-8", null);
webView.loadDataWithBaseURL("http://4pda.ru/forum/", body, "text/html", "UTF-8", null);
TopicsHistoryTable.addHistory(m_Topic, m_LastUrl);
if (buttonsPanel.getTranslationY() != 0)
ViewPropertyAnimator.animate(buttonsPanel)
.setInterpolator(new AccelerateDecelerateInterpolator())
.setDuration(500)
.translationY(0);
} catch (Exception ex) {
AppLog.e(getMainActivity(), ex);
}
}
public void showMessagePanel() {
fab.setImageResource(R.drawable.close_white);
pnlSearch.setVisibility(View.GONE);
mQuickPostPanel.setVisibility(View.VISIBLE);
mQuickPostPanel.setEnabled(Client.getInstance().getLogined());
mQuickPostFragment.showKeyboard();
}
public void hideMessagePanel() {
fab.setImageResource(R.drawable.pencil);
mQuickPostPanel.setVisibility(View.GONE);
mQuickPostFragment.hidePopupWindow();
hideKeyboard();
}
public void toggleMessagePanelVisibility() {
if (!Client.getInstance().getLogined()) {
Toast.makeText(getMainActivity(), R.string.NeedToLogin, Toast.LENGTH_SHORT).show();
return;
}
if (mQuickPostPanel.getVisibility() == View.GONE)
showMessagePanel();
else
hideMessagePanel();
}
public boolean getLoadsImagesAutomatically() {
return WebViewExternals.isLoadImages("theme");
}
public void setLoadsImagesAutomatically(boolean loadsImagesAutomatically) {
LoadsImagesAutomatically = loadsImagesAutomatically;
new MaterialDialog.Builder(getMainActivity())
.title(R.string.select_action)
.content(R.string.refresh_page)
.positiveText(R.string.refresh_p)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
reloadTopic();
}
})
.negativeText(R.string.apply_no)
.show();
}
@Override
public FragmentManager getSupportFragmentManager() {
return getChildFragmentManager();
}
@Override
public void onBricksListDialogResult(DialogInterface dialog, String dialogId, BrickInfo brickInfo, Bundle args) {
dialog.dismiss();
MainActivity.showListFragment(brickInfo.getName(), args);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == EditPostFragment.NEW_EDIT_POST_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
String url = data.getStringExtra(EditPostFragment.POST_URL_KEY);
assert url != null;
mQuickPostFragment.clearPostBody();
closeSearch();
asyncTask = new GetThemeTask();
if (data.getExtras() != null && data.getExtras().containsKey(EditPostFragment.TOPIC_BODY_KEY)) {
asyncTask.execute(url.replace("|", ""), data.getStringExtra(EditPostFragment.TOPIC_BODY_KEY));
} else
asyncTask.execute(url.replace("|", ""));
}
}
}
private boolean checkIsTheme(String url) {
url = IntentActivity.normalizeThemeUrl(url);
String[] patterns = {
"(/+4pda.ru/+forum/+index.php\\?.*?showtopic=[^\"]*)",
"(/+4pda.ru/+forum/+index.php\\?.*?act=findpost&pid=\\d+[^\"]*?)$",
"(/+4pda.ru/+index.php\\?.*?act=findpost&pid=\\d+[^\"]*?)$"
};
for (String pattern : patterns) {
Matcher m = Pattern.compile(pattern).matcher(url);
if (m.find()) {
goToAnchorOrLoadTopic(m.group(1));
return true;
}
}
return false;
}
public void reloadTopic() {
m_ScrollY = webView.getScrollY();
showTheme(getLastUrl());
}
public void goToAnchorOrLoadTopic(final String topicUrl) {
try {
if (getTopic() == null || m_History.size() == 0) {
showTheme(topicUrl);
return;
}
/*Uri uri = Uri.parse(topicUrl.toLowerCase());
String postId = null;
if (!TextUtils.isEmpty(getTopic().getId()) && getTopic().getId().equals(uri.getQueryParameter("showtopic")))
postId = uri.getQueryParameter("p");
if (TextUtils.isEmpty(postId) && "findpost".equals(uri.getQueryParameter("act")))
postId = uri.getQueryParameter("pid");
String anchor = "entry" + postId;
if (!TextUtils.isEmpty(postId)) {
anchor = "entry" + postId;
} else {
Pattern p = Pattern.compile("#(\\w+\\d+)");
Matcher m = p.matcher(topicUrl);
if (m.find()) {
anchor = m.group(1);
}
}
if (anchor == null) {
showTheme(topicUrl);
return;
}
String fragment = anchor;
String currentBody = m_History.get(m_History.size() - 1).getBody();
if (currentBody.contains("name=\"" + fragment + "\"")) {
webView.scrollTo(fragment);
return;
}*/
showTheme(topicUrl);
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
private String lofiversionToNormal(String url) {
if (url == null)
return null;
Matcher m = Pattern.compile("lofiversion/index.php\\?t(\\d+)(?:-(\\d+))?.html", Pattern.CASE_INSENSITIVE)
.matcher(url);
if (m.find())
return "http://4pda.ru/forum/index.php?showtopic=" + m.group(1) +
(m.group(2) != null ? ("&st=" + m.group(2)) : "");
return url;
}
public void showTheme(String url, boolean clearText) {
if (clearText) mQuickPostFragment.clearPostBody();
showTheme(url);
}
public void showTheme(String url) {
try {
closeSearch();
if (url == null) {
Toast.makeText(getMainActivity(), R.string.blank_url, Toast.LENGTH_SHORT).show();
return;
}
url = lofiversionToNormal(url);
if (m_History.size() > 0) {
m_History.get(m_History.size() - 1).setY(webView.getScrollY());
webView.evalJs("window.HTMLOUT.setHistoryBody(" + (m_History.size() - 1) + ",'<!DOCTYPE html><html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
webView.setWebViewClient(getWebViewClient());
asyncTask = new GetThemeTask();
asyncTask.execute(url.replace("|", ""));
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
public void setHistoryBody(int index, String body) {
m_History.get(index).setBody(body);
}
public AdvWebView getWebView() {
return webView;
}
private void prepareDeleteMessage(final String postId) {
new MaterialDialog.Builder(getMainActivity())
.title(R.string.ConfirmTheAction)
.content(R.string.want_to_delete_msg)
.positiveText(R.string.delete_m)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
deleteMessage(postId);
}
})
.negativeText(R.string.apply_cancel)
.show();
}
private void deleteMessage(final String postId) {
final MaterialDialog dialog = new MaterialDialog.Builder(getMainActivity())
.progress(true, 0)
.cancelable(false)
.content(R.string.deleting_msg)
.show();
new Thread(() -> {
Throwable ex = null;
try {
Post.delete(postId, m_Topic.getForumId(), m_Topic.getId(), Client.getInstance().getAuthKey());
} catch (Throwable e) {
ex = e;
}
final Throwable finalEx = ex;
mHandler.post(() -> {
try {
if (dialog.isShowing()) {
dialog.dismiss();
}
} catch (Throwable ignored) {
}
if (finalEx != null)
AppLog.e(getMainActivity(), finalEx);
m_ScrollY = 0;
//showTheme(getLastUrl());
getWebView().evalJs("document.querySelector('div[name*=del" + postId + "]').remove();");
});
}).start();
}
public void showRep(final String userId) {
UserReputationFragment.showActivity(getMainActivity(), userId, false);
}
public void insertTextToPost(final String text) {
mQuickPostFragment.insertTextToPost(text);
showMessagePanel();
}
public void post() {
mQuickPostFragment.post();
}
public void nextPage() {
m_ScrollY = 0;
showTheme("showtopic=" + m_Topic.getId() + "&st=" + m_Topic.getCurrentPage() * m_Topic.getPostsPerPageCount(getLastUrl()));
}
public void prevPage() {
m_ScrollY = 0;
showTheme("showtopic=" + m_Topic.getId() + "&st=" + (m_Topic.getCurrentPage() - 2) * m_Topic.getPostsPerPageCount(getLastUrl()));
}
public void firstPage() {
m_ScrollY = 0;
showTheme("showtopic=" + m_Topic.getId());
}
public void lastPage() {
m_ScrollY = 0;
showTheme("showtopic=" + m_Topic.getId() + "&st=" + (m_Topic.getPagesCount() - 1) * m_Topic.getPostsPerPageCount(getLastUrl()));
}
public void openFromSt(int st) {
showTheme("showtopic=" + m_Topic.getId() + "&st=" + st);
}
protected void showChangeRep(final String postId, String userId, String userNick, final String type, String title) {
ForumUser.startChangeRep(getMainActivity(), mHandler, userId, userNick, postId, type, title);
}
private void addToHistory(String topicBody) {
int historyLimit = Preferences.Topic.getHistoryLimit();
if (m_History.size() >= historyLimit && m_History.size() > 0)
m_History.get(m_History.size() - historyLimit).setBody(null);
m_History.add(new SessionHistory(m_Topic, m_LastUrl, topicBody, 0));
}
private void setScrollElement() {
m_ScrollElement = null;
String url = getLastUrl();
if (url != null) {
Pattern p = Pattern.compile("#(\\w+\\d+)");
Matcher m = p.matcher(url);
if (m.find()) {
m_ScrollElement = m.group(1);
}
}
}
private boolean calledScroll = false;
private void tryScrollToElement() {
if (calledScroll)
return;
calledScroll = true;
mHandler.postDelayed(() -> {
if (m_ScrollY != 0) {
webView.setScrollY(m_ScrollY);
} else if (!TextUtils.isEmpty(m_ScrollElement)) {
webView.evalJs("scrollToElement('" + m_ScrollElement + "');");
}
calledScroll = false;
}, 250);
}
private class MyChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress >= 10 && m_ScrollElement != null && m_ScrollY == 0)
//tryScrollToElement();
Log.e("kekp", newProgress + " %");
}
}
public List<ArrayList<String>> imageAttaches = new ArrayList<>();
private class MyWebViewClient extends WebViewClient {
private final long LOADING_ERROR_TIMEOUT = TimeUnit.SECONDS.toMillis(45);
// WebView instance is kept in WeakReference because of mPageLoadingTimeoutHandlerTask
private WeakReference<WebView> mReference;
private boolean mLoadingFinished = false;
private boolean mLoadingError = false;
private String mOnErrorUrl;
// Helps to know what page is loading in the moment
// Allows check url to prevent onReceivedError/onPageFinished calling for wrong url
// Helps to prevent double call of onPageStarted
// These problems cached on many devices
private String mUrl;
@Override
public void onReceivedError(WebView view, int errorCode, String description, String url) {
if (mUrl != null && !mLoadingError) {
Log.e(TAG, "onReceivedError: " + errorCode + ", " + description);
mLoadingError = true;
} else {
mOnErrorUrl = url;
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!startsWith(url, mUrl) && !mLoadingFinished) {
if (url.contains("HTMLOUT.ru")) {
Uri uri = Uri.parse(url);
try {
String function = uri.getPathSegments().get(0);
String query = uri.getQuery();
Class[] parameterTypes = null;
String[] parameterValues = new String[0];
if (!TextUtils.isEmpty(query)) {
Matcher m = Pattern.compile("(.*?)=(.*?)(&|$)").matcher(url);
ArrayList<String> objs = new ArrayList<String>();
while (m.find()) {
objs.add(Uri.decode(m.group(2)));
}
parameterValues = new String[objs.size()];
parameterTypes = new Class[objs.size()];
for (int i = 0; i < objs.size(); i++) {
parameterTypes[i] = String.class;
parameterValues[i] = objs.get(i);
}
}
ThemeFragment.class.getMethod(function, parameterTypes).invoke(getMainActivity(), parameterValues);
} catch (Exception e) {
AppLog.eToast(getMainActivity(), e);
}
return true;
}
mUrl = null;
onPageStarted(view, url, null);
}
m_ScrollY = 0;
if (checkIsImage(url))
return true;
if (checkIsTheme(url))
return true;
if (checkIsPoll(url))
return true;
if (tryDeletePost(url))
return true;
if (tryQuote(url))
return true;
IntentActivity.tryShowUrl(getMainActivity(), mHandler, url, true, false,
m_Topic == null ? null : Client.getInstance().getAuthKey());
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (startsWith(url, mOnErrorUrl)) {
mUrl = url;
mLoadingError = true;
mLoadingFinished = false;
onPageFinished(view, url);
}
if (mUrl == null) {
mUrl = url;
mLoadingError = false;
mLoadingFinished = false;
view.removeCallbacks(mPageLoadingTimeoutHandlerTask);
view.postDelayed(mPageLoadingTimeoutHandlerTask, LOADING_ERROR_TIMEOUT);
mReference = new WeakReference<>(view);
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (startsWith(url, mUrl) && !mLoadingFinished) {
mLoadingFinished = true;
view.removeCallbacks(mPageLoadingTimeoutHandlerTask);
mOnErrorUrl = null;
mUrl = null;
} else if (mUrl == null) {
view.setWebViewClient(getWebViewClient());
mLoadingFinished = true;
}
view.clearHistory();
//tryScrollToElement();
}
private boolean startsWith(String str, String prefix) {
return str != null && prefix != null && str.startsWith(prefix);
}
private final Runnable mPageLoadingTimeoutHandlerTask = new Runnable() {
@Override
public void run() {
mUrl = null;
mLoadingFinished = true;
if (mReference != null) {
WebView webView = mReference.get();
if (webView != null) {
webView.stopLoading();
}
}
}
};
private boolean checkIsImage(final String url) {
final Pattern imagePattern = PatternExtensions.compile("\\.(png|jpg|jpeg|gif)$");
if (!imagePattern.matcher(url).find()) return false;
if (!Client.getInstance().getLogined() && !Client.getInstance().hasLoginCookies()) {
Client.getInstance().showLoginForm(getContext(), (user, success) -> {
if (success) {
showImage(url);
}
});
} else {
showImage(url);
}
return true;
}
private void showImage(String url) {
Pattern tPattern = Pattern.compile("(post\\/\\d*?\\/[\\s\\S]*?\\.(?:png|jpg|jpeg|gif))");
Matcher target = tPattern.matcher(url);
Matcher temp;
String id;
if (target.find()) {
id = target.group(1);
for (ArrayList<String> list : imageAttaches) {
for (int i = 0; i < list.size(); i++) {
temp = tPattern.matcher(list.get(i));
if (temp.find()) {
if (temp.group(1).equals(id)) {
ImgViewer.startActivity(getContext(), list, i);
return;
}
}
}
}
ImgViewer.startActivity(getContext(), url);
}
}
private boolean checkIsPoll(String url) {
Matcher m = Pattern.compile("4pda.ru.*?addpoll=1").matcher(url);
if (m.find()) {
Uri uri = Uri.parse(url);
uri = uri.buildUpon()
.appendQueryParameter("showtopic", getTopic().getId())
.appendQueryParameter("st", "" + getTopic().getCurrentPage() * getTopic().getPostsPerPageCount(m_LastUrl))
.build();
showTheme(uri.toString());
return true;
}
return false;
}
private boolean tryDeletePost(String url) {
Matcher m = Pattern.compile("4pda.ru/forum/index.php\\?act=Mod&CODE=04&f=(\\d+)&t=(\\d+)&p=(\\d+)&st=(\\d+)&auth_key=(.*?)").matcher(url);
if (m.find()) {
prepareDeleteMessage(m.group(3));
return true;
}
return false;
}
private boolean tryQuote(final String url) {
Matcher m = Pattern.compile("4pda.ru/forum/index.php\\?act=Post&CODE=02&f=\\d+&t=\\d+&qpid=\\d+").matcher(url);
if (m.find()) {
showQuoteEditor(url);
return true;
}
return false;
}
}
private class GetThemeTask extends AsyncTask<String, String, Boolean> {
private int scrollY = 0;
private String m_ThemeBody;
private Throwable ex;
public GetThemeTask() {
}
private CharSequence prepareTopicUrl(CharSequence url) {
final Uri uri = Uri.parse(url.toString());
return uri.getHost() == null ? uri.toString() : uri.getQuery();
}
@Override
protected Boolean doInBackground(String... forums) {
String pageBody = null;
try {
if (isCancelled()) return false;
Client client = Client.getInstance();
m_LastUrl = forums[0];
m_LastUrl = "http://4pda.ru/forum/index.php?" + prepareTopicUrl(m_LastUrl);
if (forums.length == 1) {
pageBody = client.loadPageAndCheckLogin("http://4pda.ru/forum/index.php?" + prepareTopicUrl(m_LastUrl), null);
} else
pageBody = forums[1];
m_LastUrl = client.getRedirectUri() == null ? m_LastUrl : client.getRedirectUri().toString();
m_SpoilFirstPost = Preferences.Topic.getSpoilFirstPost();
TopicBodyBuilder topicBodyBuilder = client.parseTopic(pageBody, App.getInstance(), m_LastUrl,
m_SpoilFirstPost);
m_Topic = topicBodyBuilder.getTopic();
m_ThemeBody = topicBodyBuilder.getBody();
topicBodyBuilder.clear();
return true;
} catch (Throwable e) {
m_ThemeBody = pageBody;
// Log.e(ThemeActivity.getMainActivity(), e);
ex = e;
return false;
}
}
protected void onPreExecute() {
try {
setLoading(true);
scrollY = m_ScrollY;
hideMessagePanel();
} catch (Exception ex) {
AppLog.e(null, ex);
}
}
protected void onPostExecute(final Boolean success) {
setLoading(false);
TabItem item = App.getInstance().getTabByTag(getTag());
if (item != null) {
TabItem tabItem = App.getInstance().getTabByTag(item.getParentTag());
if (tabItem != null && !tabItem.getTag().contains("tag")) {
Fragment fragment = getMainActivity().getSupportFragmentManager().findFragmentByTag(item.getParentTag());
if (fragment instanceof TopicsListFragment && getTopic() != null && getTopic().getId() != null)
((TopicsListFragment) fragment).topicAfterClick(getTopic().getId());
}
}
Log.e("kek", webView.getSettings().getLoadsImagesAutomatically() + " loadimages");
m_ScrollY = scrollY;
if (m_Topic != null)
mQuickPostFragment.setTopic(m_Topic.getForumId(), m_Topic.getId(), Client.getInstance().getAuthKey());
if (isCancelled()) return;
if (success && m_Topic != null) {
addToHistory(m_ThemeBody);
showBody(m_ThemeBody);
} else {
if (m_Topic == null) {
return;
}
if (ex.getClass() != NotReportException.class) {
setTitle(ex.getMessage());
webView.loadDataWithBaseURL(m_LastUrl, m_ThemeBody, "text/html", "UTF-8", null);
//webView.loadDataWithBaseURL("http://4pda.ru/forum/", m_ThemeBody, "text/html", "UTF-8", null);
addToHistory(m_ThemeBody);
}
AppLog.e(getMainActivity(), ex, () -> showTheme(getLastUrl()));
}
}
}
}