package org.softeg.slartus.forpdaplus.fragments.qms;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.util.Pair;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.Gravity;
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.view.inputmethod.InputMethodManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.softeg.slartus.forpdaapi.ProgressState;
import org.softeg.slartus.forpdaapi.post.EditAttach;
import org.softeg.slartus.forpdaapi.qms.QmsApi;
import org.softeg.slartus.forpdacommon.ExtPreferences;
import org.softeg.slartus.forpdacommon.FileUtils;
import org.softeg.slartus.forpdacommon.SimpleCookie;
import org.softeg.slartus.forpdanotifyservice.qms.QmsNotifier;
import org.softeg.slartus.forpdaplus.App;
import org.softeg.slartus.forpdaplus.Client;
import org.softeg.slartus.forpdaplus.HttpHelper;
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.ImageFilePath;
import org.softeg.slartus.forpdaplus.classes.SaveHtml;
import org.softeg.slartus.forpdaplus.classes.WebViewExternals;
import org.softeg.slartus.forpdaplus.classes.common.ExtUrl;
import org.softeg.slartus.forpdaplus.common.AppLog;
import org.softeg.slartus.forpdaplus.controls.quickpost.PopupPanelView;
import org.softeg.slartus.forpdaplus.emotic.Smiles;
import org.softeg.slartus.forpdaplus.fragments.WebViewFragment;
import org.softeg.slartus.forpdaplus.fragments.profile.ProfileFragment;
import org.softeg.slartus.forpdaplus.prefs.HtmlPreferences;
import org.softeg.slartus.forpdaplus.prefs.Preferences;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* Created by radiationx on 12.11.15.
*/
public class QmsChatFragment extends WebViewFragment {
private boolean emptyText = true;
private static final String MID_KEY = "mid";
private static final String TID_KEY = "tid";
private static final String THEME_TITLE_KEY = "theme_title";
private static final String NICK_KEY = "nick";
private static final String PAGE_BODY_KEY = "page_body";
private static final String POST_TEXT_KEY = "PostText";
private final static int FILECHOOSER_RESULTCODE = 1;
final Handler uiHandler = new Handler();
private Handler mHandler = new Handler();
private AdvWebView wvChat;
private String m_Id;
private String m_TId;
private String m_Nick = "";
private String m_ThemeTitle = "";
private long m_LastBodyLength = 0;
private EditText edMessage;
private long m_UpdateTimeout = 15000;
private Timer m_UpdateTimer = new Timer();
private HtmlPreferences m_HtmlPreferences;
private PopupPanelView mPopupPanelView;
private String m_MessageText = null;
private AsyncTask<ArrayList<String>, Void, Boolean> m_SendTask = null;
private Button btnAttachments;
@Override
public void hidePopupWindows() {
super.hidePopupWindows();
mPopupPanelView.hidePopupWindow();
}
public static void openChat(String userId, String userNick, String tid, String themeTitle, String pageBody) {
MainActivity.addTab(themeTitle, themeTitle + userId, newInstance(userId, userNick, tid, themeTitle, pageBody));
}
public static void openChat(String userId, String userNick, String tid, String themeTitle) {
MainActivity.addTab(themeTitle, themeTitle + userId, newInstance(userId, userNick, tid, themeTitle));
}
public static QmsChatFragment newInstance(String userId, String userNick, String tid, String themeTitle, String pageBody) {
Bundle args = new Bundle();
args.putString(MID_KEY, userId);
args.putString(NICK_KEY, userNick);
args.putString(TID_KEY, tid);
args.putString(THEME_TITLE_KEY, themeTitle);
args.putString(PAGE_BODY_KEY, pageBody);
QmsChatFragment fragment = new QmsChatFragment();
fragment.setArguments(args);
return fragment;
}
public static QmsChatFragment newInstance(String userId, String userNick, String tid, String themeTitle) {
Bundle args = new Bundle();
args.putString(MID_KEY, userId);
args.putString(NICK_KEY, userNick);
args.putString(TID_KEY, tid);
args.putString(THEME_TITLE_KEY, themeTitle);
QmsChatFragment fragment = new QmsChatFragment();
fragment.setArguments(args);
return fragment;
}
public static String getEncoding() {
SharedPreferences prefs = App.getInstance().getPreferences();
return prefs.getString("qms.chat.encoding", "UTF-8");
}
@Override
public WebViewClient getWebViewClient() {
return new MyWebViewClient();
}
@Override
public String getTitle() {
return m_ThemeTitle;
}
@Override
public String getUrl() {
return "";
}
@Override
public void reload() {
new Thread(this::reLoadChatSafe).start();
}
@Override
public AsyncTask getAsyncTask() {
return m_SendTask;
}
@Override
public boolean closeTab() {
return false;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.qms_chat, container, false);
assert view != null;
m_HtmlPreferences = new HtmlPreferences();
m_HtmlPreferences.load(getContext());
edMessage = (EditText) findViewById(R.id.edMessage);
if (mPopupPanelView == null)
mPopupPanelView = new PopupPanelView(PopupPanelView.VIEW_FLAG_EMOTICS | PopupPanelView.VIEW_FLAG_BBCODES);
mPopupPanelView.createView(LayoutInflater.from(getContext()), (ImageButton) findViewById(R.id.advanced_button), edMessage);
mPopupPanelView.activityCreated(getMainActivity(), view);
final ImageButton send_button = (ImageButton) findViewById(R.id.btnSend);
send_button.setOnClickListener(view12 -> startSendMessage());
edMessage.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.toString().isEmpty()) {
if (!emptyText) {
send_button.clearColorFilter();
emptyText = true;
}
} else {
if (emptyText) {
send_button.setColorFilter(ContextCompat.getColor(App.getContext(), R.color.selectedItemText), PorterDuff.Mode.SRC_ATOP);
emptyText = false;
}
}
}
});
wvChat = (AdvWebView) findViewById(R.id.wvChat);
registerForContextMenu(wvChat);
wvChat.getSettings().setDomStorageEnabled(true);
wvChat.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);
String appCachePath = getMainActivity().getApplicationContext().getCacheDir().getAbsolutePath();
wvChat.getSettings().setAppCachePath(appCachePath);
wvChat.getSettings().setAppCacheEnabled(true);
wvChat.getSettings().setAllowFileAccess(true);
wvChat.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
wvChat.addJavascriptInterface(this, "HTMLOUT");
wvChat.getSettings().setDefaultFontSize(Preferences.Topic.getFontSize());
WebViewExternals m_WebViewExternals = new WebViewExternals(this);
m_WebViewExternals.loadPreferences(App.getInstance().getPreferences());
m_WebViewExternals.setWebViewSettings(true);
wvChat.setWebViewClient(new MyWebViewClient());
Bundle extras = getArguments();
m_Id = extras.getString(MID_KEY);
m_Nick = extras.getString(NICK_KEY);
m_TId = extras.getString(TID_KEY);
m_ThemeTitle = extras.getString(THEME_TITLE_KEY);
final String[] m_PageBody = {extras.getString(PAGE_BODY_KEY)};
if (TextUtils.isEmpty(m_Nick))
setTitle("QMS");
else
setTitle(m_ThemeTitle);
if (getSupportActionBar() != null)
setSubtitle(m_Nick);
if (!TextUtils.isEmpty(m_PageBody[0])) {
m_LastBodyLength = m_PageBody[0].length();
new Thread(new Runnable() {
@Override
public void run() {
final String body = transformChatBody(m_PageBody[0]);
mHandler.post(new Runnable() {
@Override
public void run() {
wvChat.loadDataWithBaseURL("http://4pda.ru/forum/", body, "text/html", "UTF-8", null);
}
});
}
}).start();
}
hideKeyboard();
btnAttachments = (Button) findViewById(R.id.btnAttachments);
btnAttachments.setOnClickListener(view1 -> showAttachesListDialog());
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
App.stopQmsService();
clearNotification(1);
loadPrefs();
startUpdateTimer();
}
@JavascriptInterface
public void showChooseCssDialog() {
getMainActivity().runOnUiThread(() -> {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
// intent.setDataAndType(Uri.parse("file://" + lastSelectDirPath), "file/*");
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
} catch (ActivityNotFoundException ex) {
Toast.makeText(getMainActivity(), R.string.no_app_for_get_file, Toast.LENGTH_LONG).show();
} catch (Exception ex) {
AppLog.e(getMainActivity(), ex);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == MY_INTENT_CLICK) {
if (null == data) return;
Uri selectedImageUri = data.getData();
String selectedImagePath = ImageFilePath.getPath(getMainActivity().getApplicationContext(), selectedImageUri);
if (selectedImagePath != null && selectedImagePath.matches("(?i)(.*)(jpg|png|gif)$")) {
saveAttachDirPath(selectedImagePath);
new UpdateTask(getMainActivity(), selectedImagePath).execute();
} else {
Toast.makeText(getContext(), "Данный формат файла не поддерживается", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == FILECHOOSER_RESULTCODE) {
String attachFilePath = FileUtils.getRealPathFromURI(getContext(), data.getData());
String cssData = FileUtils.readFileText(attachFilePath)
.replace("\\", "\\\\")
.replace("'", "\\'").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "");
if (Build.VERSION.SDK_INT < 19)
wvChat.loadUrl("javascript:window['HtmlInParseLessContent']('" + cssData + "');");
else
wvChat.evaluateJavascript("window['HtmlInParseLessContent']('" + cssData + "')",
s -> {
}
);
}
}
}
private void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) getMainActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edMessage.getWindowToken(), 0);
}
/*
@Override
protected void onRestoreInstanceState(Bundle outState) {
//super.onRestoreInstanceState(outState);
m_Id = outState.getString(MID_KEY);
m_Nick = outState.getString(NICK_KEY);
m_TId = outState.getString(TID_KEY);
m_ThemeTitle = outState.getString(THEME_TITLE_KEY);
setTitle(m_ThemeTitle);
setSubtitle(m_Nick);
edMessage.setText(outState.getString(POST_TEXT_KEY));
}
*/
@JavascriptInterface
public void showMessage(final String message) {
getMainActivity().runOnUiThread(() -> Toast.makeText(getMainActivity(), message, Toast.LENGTH_LONG).show());
}
@JavascriptInterface
public void deleteMessages(final String[] checkBoxNames) {
getMainActivity().runOnUiThread(() -> {
if (checkBoxNames == null) {
Toast.makeText(getMainActivity(), R.string.no_messages_for_delete, Toast.LENGTH_LONG).show();
return;
}
final ArrayList<String> ids = new ArrayList<>();
Pattern p = Pattern.compile("message-id\\[(\\d+)\\]", Pattern.CASE_INSENSITIVE);
for (String checkBoxName : checkBoxNames) {
Matcher m = p.matcher(checkBoxName);
if (m.find()) {
ids.add(m.group(1));
}
}
if (ids.size() == 0) {
Toast.makeText(getMainActivity(), R.string.no_messages_for_delete, Toast.LENGTH_LONG).show();
return;
}
new MaterialDialog.Builder(getMainActivity())
.title(R.string.confirm_action)
.cancelable(true)
.content(String.format(App.getContext().getString(R.string.ask_delete_messages), ids.size()))
.positiveText(R.string.delete)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
m_SendTask = new DeleteTask(getMainActivity());
m_SendTask.execute(ids);
}
})
.negativeText(R.string.cancel)
.show();
});
}
@JavascriptInterface
public void startDeleteModeJs(final String count) {
getMainActivity().runOnUiThread(() -> startDeleteMode(count));
}
@JavascriptInterface
public void stopDeleteModeJs() {
Log.d("kek", "STOP");
if (!DeleteMode)
return;
getMainActivity().runOnUiThread(() -> stopDeleteMode(true));
}
private final class AnActionModeOfEpicProportions implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.add(R.string.delete)
.setIcon(R.drawable.delete)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(final ActionMode mode, MenuItem item) {
getWebView().loadUrl("javascript:deleteMessages('thread_form');");
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
stopDeleteMode(false);
}
}
ActionMode mMode;
private Boolean DeleteMode = false;
private void startDeleteMode(String count) {
if (!DeleteMode)
mMode = getMainActivity().startActionMode(new AnActionModeOfEpicProportions());
if (mMode != null)
mMode.setTitle("Сообщений:" + count);
DeleteMode = true;
}
private void stopDeleteMode(Boolean finishActionMode) {
if (finishActionMode && mMode != null)
mMode.finish();
DeleteMode = false;
}
public void deleteDialog() {
new MaterialDialog.Builder(getMainActivity())
.title(R.string.confirm_action)
.cancelable(true)
.content(R.string.ask_delete_dialog)
.positiveText(R.string.delete)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
ArrayList<String> ids = new ArrayList<>();
ids.add(m_TId);
m_SendTask = new DeleteDialogTask(getMainActivity(), ids);
m_SendTask.execute();
}
})
.negativeText(R.string.cancel)
.show();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(MID_KEY, m_Id);
outState.putString(NICK_KEY, m_Nick);
outState.putString(TID_KEY, m_TId);
outState.putString(THEME_TITLE_KEY, m_ThemeTitle);
outState.putString(POST_TEXT_KEY, edMessage.getText().toString());
}
@Override
public void onResume() {
super.onResume();
loadPrefs();
startUpdateTimer();
if (mPopupPanelView != null)
mPopupPanelView.resume();
}
private void startAdaptiveTimeOutService() {
if (!QmsNotifier.isUse(getContext()))
return;
App.reStartQmsService(true);
}
@Override
public void onPause() {
super.onPause();
startAdaptiveTimeOutService();
clearNotifTimer();
m_UpdateTimer.cancel();
m_UpdateTimer.purge();
if (mPopupPanelView != null)
mPopupPanelView.pause();
}
@Override
public void onStop() {
super.onStop();
m_UpdateTimer.cancel();
m_UpdateTimer.purge();
}
@Override
public void onDestroy() {
m_UpdateTimer.cancel();
m_UpdateTimer.purge();
if (mPopupPanelView != null) {
mPopupPanelView.destroy();
mPopupPanelView = null;
}
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return true;
}
private void clearNotifTimer() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getMainActivity());
SharedPreferences.Editor editor = preferences.edit();
editor.putFloat("qms.service.timeout.restart", 1);
editor.apply();
}
private void loadPrefs() {
m_UpdateTimeout = ExtPreferences.parseInt(App.getInstance().getPreferences(), "qms.chat.update_timer", 15) * 1000;
}
private void checkNewQms() {
try {
Client.getInstance().setQmsCount(QmsApi.getNewQmsCount(Client.getInstance()));
Client.getInstance().doOnMailListener();
} catch (IOException e) {
e.printStackTrace();
}
}
private String transformChatBody(String chatBody) {
checkNewQms();
if (m_ThemeTitle == null | m_Nick == null) {
Matcher m = Pattern.compile("<span id=\"chatInfo\"[^>]*>([^>]*?)\\|:\\|([^<]*)</span>").matcher(chatBody);
if (m.find()) {
m_Nick = m.group(1);
m_ThemeTitle = m.group(2);
}
}
HtmlBuilder htmlBuilder = new HtmlBuilder();
htmlBuilder.beginHtml("QMS");
htmlBuilder.beginBody("qms", "", Preferences.Topic.isShowAvatars());
// htmlBuilder.beginBody("qms", "onload=\"scrollToElement('bottom_element')\"", Preferences.Topic.isShowAvatars());
if (!Preferences.Topic.isShowAvatars())
chatBody = chatBody.replaceAll("<img[^>]*?class=\"avatar\"[^>]*>", "");
if (m_HtmlPreferences.isSpoilerByButton())
chatBody = HtmlPreferences.modifySpoiler(chatBody);
chatBody = HtmlPreferences.modifyBody(chatBody, Smiles.getSmilesDict());
chatBody = chatBody.replaceAll("(<a[^>]*?href=\"([^\"]*?savepice[^\"]*-)[\\w]*(\\.[^\"]*)\"[^>]*?>)[^<]*?(</a>)", "$1<img src=\"$2prev$3\">$4");
htmlBuilder.append(chatBody);
htmlBuilder.append("<div id=\"bottom_element\" name=\"bottom_element\"></div>");
htmlBuilder.endBody();
htmlBuilder.endHtml();
return htmlBuilder.getHtml().toString();
}
private void reLoadChatSafe() {
uiHandler.post(() -> setSubtitle(App.getContext().getString(R.string.refreshing)));
String chatBody = null;
Throwable ex = null;
Boolean updateTitle = false;
try {
String body;
if (TextUtils.isEmpty(m_Nick)) {
updateTitle = true;
Map<String, String> additionalHeaders = new HashMap<>();
body = QmsApi.getChat(Client.getInstance(), m_Id, m_TId, additionalHeaders);
if (additionalHeaders.containsKey("Nick"))
m_Nick = additionalHeaders.get("Nick");
if (additionalHeaders.containsKey("ThemeTitle"))
m_ThemeTitle = additionalHeaders.get("ThemeTitle");
} else {
body = QmsApi.getChat(Client.getInstance(), m_Id, m_TId);
}
if (body.length() == m_LastBodyLength) {
checkNewQms();
uiHandler.post(() -> {
// setLoading(false);
setSubtitle("");
});
return;
}
m_LastBodyLength = body.length();
chatBody = transformChatBody(body);
} catch (Throwable e) {
ex = e;
}
final Throwable finalEx = ex;
final String finalChatBody = chatBody;
final Boolean finalUpdateTitle = updateTitle;
uiHandler.post(() -> {
if (finalEx == null) {
if (finalUpdateTitle)
setTitle(m_ThemeTitle);
setSubtitle(m_Nick);
wvChat.loadDataWithBaseURL("http://4pda.ru/forum/", finalChatBody, "text/html", "UTF-8", null);
} else {
if ("Такого диалога не существует.".equals(finalEx.getMessage())) {
new MaterialDialog.Builder(getMainActivity())
.title(R.string.error)
.content(finalEx.getMessage())
.positiveText(R.string.ok)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
//showThread();
}
})
.show();
m_UpdateTimer.cancel();
m_UpdateTimer.purge();
} else {
Toast.makeText(getMainActivity(), AppLog.getLocalizedMessage(finalEx, finalEx.getLocalizedMessage()),
Toast.LENGTH_SHORT).show();
}
}
// setLoading(false);
setSubtitle("");
});
}
private void onPostChat(String chatBody, Boolean success, Throwable ex) {
if (success) {
edMessage.getText().clear();
wvChat.loadDataWithBaseURL("http://4pda.ru/forum/", chatBody, "text/html", "UTF-8", null);
} else {
if (ex != null)
AppLog.e(getMainActivity(), ex, () -> {
m_SendTask = new SendTask(getMainActivity());
m_SendTask.execute();
});
else
Toast.makeText(getMainActivity(), R.string.unknown_error,
Toast.LENGTH_SHORT).show();
}
}
private void startUpdateTimer() {
m_UpdateTimer.cancel();
m_UpdateTimer.purge();
m_UpdateTimer = new Timer();
m_UpdateTimer.schedule(new TimerTask() { // Определяем задачу
@Override
public void run() {
try {
if (m_SendTask != null && m_SendTask.getStatus() != AsyncTask.Status.FINISHED)
return;
reLoadChatSafe();
} catch (Throwable ex) {
AppLog.e(getMainActivity(), ex);
}
}
}, 0L, m_UpdateTimeout);
}
private void startSendMessage() {
if (emptyText) {
Toast toast = Toast.makeText(getContext(), R.string.EnterMessage_, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 64, App.getInstance().getResources().getDisplayMetrics()));
toast.show();
return;
}
m_MessageText = edMessage.getText().toString();
for (EditAttach attach : attachList) {
if (!m_MessageText.contains(attach.getId())) {
m_MessageText += "\n" + "[url=" + attach.getId() + "]" + attach.getId() + "[/url]";
}
}
m_SendTask = new SendTask(getMainActivity());
m_SendTask.execute();
}
@Override
public String Prefix() {
return "theme";
}
@Override
@JavascriptInterface
public void saveHtml(final String html) {
getMainActivity().runOnUiThread(() -> new SaveHtml(getMainActivity(), html, "qms"));
}
@Override
public AdvWebView getWebView() {
return wvChat;
}
private void showCompanionProfile() {
//ProfileWebViewActivity.startActivity(this, m_Id, m_Nick);
ProfileFragment.showProfile(m_Id, m_Nick);
}
@Override
public void showLinkMenu(final String link) {
if (TextUtils.isEmpty(link) || link.contains("HTMLOUT.ru")
|| link.equals("#")
|| link.startsWith("file:///")) return;
ExtUrl.showSelectActionDialog(mHandler, getContext(), m_ThemeTitle, "", link, "", "", "", m_Id, m_Nick);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.add(R.string.refresh)
.setIcon(R.drawable.refresh)
.setOnMenuItemClickListener(menuItem -> {
reload();
return true;
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(R.string.setting)
.setIcon(R.drawable.settings_white)
.setOnMenuItemClickListener(menuItem -> {
Intent intent = new Intent(getMainActivity(), QmsChatPreferencesActivity.class);
getMainActivity().startActivity(intent);
return true;
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
menu.add(R.string.delete_dialog)
.setIcon(R.drawable.delete)
.setOnMenuItemClickListener(menuItem -> {
deleteDialog();
return true;
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
menu.add(R.string.font_size)
.setOnMenuItemClickListener(menuItem -> {
showFontSizeDialog();
return true;
});
menu.add(R.string.profile_interlocutor)
.setOnMenuItemClickListener(menuItem -> {
showCompanionProfile();
return true;
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
/*
private void showThread() {
if (getIntent() != null && getIntent().getExtras() != null && getIntent().getExtras().containsKey(BaseFragmentActivity.SENDER_ACTIVITY)) {
if ("class org.softeg.slartus.forpdaplus.qms_2_0.QmsContactThemesActivity".equals(getIntent().getExtras().get(BaseFragmentActivity.SENDER_ACTIVITY))) {
finish();
return;
}
}
QmsContactThemesActivity.showThemes(getMainActivity(), m_Id, m_Nick);
//finish();
}
*/
private class SendTask extends AsyncTask<ArrayList<String>, Void, Boolean> {
private final MaterialDialog dialog;
String m_ChatBody;
private Throwable ex;
SendTask(Context context) {
dialog = new MaterialDialog.Builder(context)
.progress(true, 0)
.content(getString(R.string.sending_message))
.build();
}
@Override
protected Boolean doInBackground(ArrayList<String>... params) {
try {
m_ChatBody = transformChatBody(QmsApi.sendMessage(Client.getInstance(), m_Id, m_TId, m_MessageText,
getEncoding()));
return true;
} catch (Throwable e) {
ex = e;
return false;
}
}
// can use UI thread here
protected void onPreExecute() {
this.dialog.show();
// setLoading(false); //
}
// can use UI thread here
protected void onPostExecute(final Boolean success) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
// setLoading(false);
onPostChat(m_ChatBody, success, ex);
attachList.clear();
refreshAttachmentsInfo();
}
}
private class DeleteTask extends AsyncTask<ArrayList<String>, Void, Boolean> {
private final MaterialDialog dialog;
String m_ChatBody;
private Throwable ex;
DeleteTask(Context context) {
dialog = new MaterialDialog.Builder(context)
.progress(true, 0)
.content(R.string.deleting_messages)
.build();
}
@Override
protected Boolean doInBackground(ArrayList<String>... params) {
try {
m_ChatBody = transformChatBody(QmsApi.deleteMessages(Client.getInstance(),
m_Id, m_TId, params[0], getEncoding()));
return true;
} catch (Throwable e) {
ex = e;
return false;
}
}
// can use UI thread here
protected void onPreExecute() {
this.dialog.show();
}
// can use UI thread here
protected void onPostExecute(final Boolean success) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
onPostChat(m_ChatBody, success, ex);
stopDeleteMode(true);
}
}
private class DeleteDialogTask extends AsyncTask<ArrayList<String>, Void, Boolean> {
private final MaterialDialog dialog;
ArrayList<String> m_Ids;
private Throwable ex;
DeleteDialogTask(Context context, ArrayList<String> ids) {
m_Ids = ids;
dialog = new MaterialDialog.Builder(context)
.progress(true, 0)
.content(R.string.deleting_dialogs)
.build();
}
@Override
protected Boolean doInBackground(ArrayList<String>... params) {
try {
QmsApi.deleteDialogs(Client.getInstance(), m_Id, m_Ids);
return true;
} catch (Throwable e) {
ex = e;
return false;
}
}
// can use UI thread here
protected void onPreExecute() {
this.dialog.show();
}
// can use UI thread here
protected void onPostExecute(final Boolean success) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if (!success) {
if (ex != null)
AppLog.e(getMainActivity(), ex);
else
Toast.makeText(getMainActivity(), R.string.unknown_error,
Toast.LENGTH_SHORT).show();
}
stopDeleteMode(true);
//showThread();
}
}
private class MyWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Preferences.Notifications.Qms.readQmsDone();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
IntentActivity.tryShowUrl(getMainActivity(), mHandler, url, true, false, "");
return true;
}
}
//Upload file to savepic.ru
private List<EditAttach> attachList = new ArrayList<>();
private static final int MY_INTENT_CLICK = 302;
private void showAttachesListDialog() {
if (attachList.size() == 0) {
startAddAttachment();
return;
}
List<String> listItems = new ArrayList<>();
for (EditAttach attach : attachList)
listItems.add(attach.getName());
CharSequence[] items = listItems.toArray(new CharSequence[listItems.size()]);
new MaterialDialog.Builder(getMainActivity())
.cancelable(true)
.title(R.string.attachments)
.items(items)
.itemsCallback((dialog, itemView, which, text) -> edMessage.append("[url=" + attachList.get(which).getId() + "]" + attachList.get(which).getId() + "[/url]"))
.positiveText(R.string.do_download)
.onPositive((dialog, which) -> startAddAttachment())
.negativeText(R.string.ok)
.show();
}
private void startAddAttachment() {
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getActivity(), R.string.no_permission, Toast.LENGTH_SHORT).show();
return;
}
try {
Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
getIntent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
getIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
pickIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
chooserIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(chooserIntent, MY_INTENT_CLICK);
/*Intent imageintent = new Intent(
Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
imageintent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(imageintent, MY_INTENT_CLICK);*/
} catch (ActivityNotFoundException ex) {
Toast.makeText(getMainActivity(), R.string.no_app_for_get_image_file, Toast.LENGTH_LONG).show();
} catch (Exception ex) {
AppLog.e(getMainActivity(), ex);
}
}
private void saveAttachDirPath(String attachFilePath) {
String lastSelectDirPath = FileUtils.getDirPath(attachFilePath);
App.getInstance().getPreferences().edit().putString("EditPost.AttachDirPath", lastSelectDirPath).apply();
}
private class UpdateTask extends AsyncTask<String, Pair<String, Integer>, Boolean> {
private final MaterialDialog dialog;
private ProgressState m_ProgressState;
private List<String> attachFilePaths;
UpdateTask(Context context, List<String> attachFilePaths) {
this.attachFilePaths = attachFilePaths;
dialog = new MaterialDialog.Builder(context)
.progress(false, 100, false)
.content(R.string.sending_file)
.show();
}
UpdateTask(Context context, String newAttachFilePath) {
this(context, new ArrayList<>(Arrays.asList(new String[]{newAttachFilePath})));
}
private EditAttach editAttach;
@Override
protected Boolean doInBackground(String... params) {
try {
m_ProgressState = new ProgressState() {
@Override
public void update(String message, int percents) {
publishProgress(new Pair<>("", percents));
}
};
int i = 1;
for (String newAttachFilePath : attachFilePaths) {
publishProgress(new Pair<>(String.format(App.getContext().getString(R.string.format_sending_file), i++, attachFilePaths.size()), 0));
boolean found = false;
for (Cookie cookie1 : Client.getInstance().getCookies()) {
if (cookie1.getName().equals("PHPSESSID")) {
found = true;
break;
}
}
if (!found) {
CookieStore cookieStore = new BasicCookieStore();
HttpContext context = new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
new DefaultHttpClient().execute(new HttpPost("http://savepice.ru/"), context);
for (Cookie cookie : cookieStore.getCookies()) {
Log.d("save", "coolie name" + cookie.getName());
if (cookie.getName().equals("PHPSESSID")) {
Log.d("save", "try save cookie");
HttpHelper helper = new HttpHelper();
try {
helper.getCookieStore().getCookies();
helper.getCookieStore().addCookie(new SimpleCookie(cookie.getName(), cookie.getValue()));
helper.writeExternalCookies();
} finally {
helper.close();
}
}
}
}
String res = QmsApi.attachFile(Client.getInstance(), newAttachFilePath, m_ProgressState);
editAttach = new EditAttach("http://cdn1.savepice.ru" + res, "Изображение №" + attachList.size(), null, null);
}
return true;
} catch (Throwable e) {
ex = e;
return false;
}
}
@Override
protected void onProgressUpdate(Pair<String, Integer>... values) {
super.onProgressUpdate(values);
if (!TextUtils.isEmpty(values[0].first))
dialog.setContent(values[0].first);
dialog.setProgress(values[0].second);
}
// can use UI thread here
protected void onPreExecute() {
this.dialog.setCancelable(true);
this.dialog.setCanceledOnTouchOutside(false);
this.dialog.setOnCancelListener(dialogInterface -> {
if (m_ProgressState != null)
m_ProgressState.cancel();
cancel(false);
});
this.dialog.setProgress(0);
this.dialog.show();
}
private Throwable ex;
// can use UI thread here
protected void onPostExecute(final Boolean success) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if (success || (isCancelled() && editAttach != null)) {
attachList.add(editAttach);
refreshAttachmentsInfo();
} else {
if (ex != null)
AppLog.e(getMainActivity(), ex);
else
Toast.makeText(getMainActivity(), R.string.unknown_error, Toast.LENGTH_SHORT).show();
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCancelled(Boolean success) {
super.onCancelled(success);
if (success || (isCancelled() && editAttach != null)) {
attachList.add(editAttach);
refreshAttachmentsInfo();
} else {
if (ex != null)
AppLog.e(getMainActivity(), ex);
else
Toast.makeText(getMainActivity(), R.string.unknown_error, Toast.LENGTH_SHORT).show();
}
}
}
private void refreshAttachmentsInfo() {
btnAttachments.setText(attachList.size() + "");
}
}