package org.softeg.slartus.forpdaplus.fragments.profile;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
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.ValueCallback;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import org.softeg.slartus.forpdaapi.Profile;
import org.softeg.slartus.forpdaapi.ProfileApi;
import org.softeg.slartus.forpdacommon.FileUtils;
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 org.softeg.slartus.forpdaplus.fragments.qms.QmsChatFragment;
import org.softeg.slartus.forpdaplus.fragments.qms.QmsContactThemes;
import org.softeg.slartus.forpdaplus.fragments.search.SearchSettingsDialogFragment;
import org.softeg.slartus.forpdaplus.listfragments.next.UserReputationFragment;
import org.softeg.slartus.forpdaplus.prefs.Preferences;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
/**
* Created by radiationx on 31.10.15.
*/
public class ProfileFragment extends WebViewFragment implements LoaderManager.LoaderCallbacks<Profile>{
public static final String USER_ID_KEY = "UserIdKey";
public static final String USER_NAME_KEY = "UserNameKey";
private String title;
@Override
public WebViewClient getWebViewClient() {
return new MyWebViewClient();
}
@Override
public String getTitle() {
return title;
}
@Override
public String getUrl() {
return "http://4pda.ru/forum/index.php?showuser=" + getUserId();
}
@Override
public void reload() {
startLoadData();
}
@Override
public AsyncTask getAsyncTask() {
return null;
}
@Override
public boolean closeTab() {
return false;
}
@Override
public boolean onBackPressed() {
return false;
}
@Override
public String Prefix() {
return "profile";
}
private static final String TAG = "ProfileWebViewFragment";
private AdvWebView m_WebView;
protected Bundle args;
@Override
public void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
args = new Bundle();
if (getArguments() != null) {
args = getArguments();
}
if (savedInstanceState != null) {
args = savedInstanceState;
}
}
private String getUserId() {
return args.getString(USER_ID_KEY);
}
private String getUserNick() {
return args.getString(USER_NAME_KEY, "");
}
private Boolean isDialog() {
return args.getBoolean("DIALOG", false);
}
@Override
public AdvWebView getWebView(){
return m_WebView;
}
public static void showProfile(String userId, String userNick){
MainActivity.addTab(userNick, "http://4pda.ru/forum/index.php?showuser=" + userId, newInstance(userId, userNick));
}
public static ProfileFragment newInstance(String userId, String userNick) {
Bundle args = new Bundle();
args.putString(USER_ID_KEY, userId);
args.putString(USER_NAME_KEY, userNick);
ProfileFragment fragment = new ProfileFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onActivityCreated(android.os.Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
startLoadData();
}
@Override
public void onSaveInstanceState(android.os.Bundle outState) {
if (args != null)
outState.putAll(args);
super.onSaveInstanceState(outState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.profile_web_view_fragment, container, false);
initSwipeRefreshLayout();
// getDialog().setTitle("Профиль");
assert view != null;
m_WebView = (AdvWebView) findViewById(R.id.wvBody);
registerForContextMenu(m_WebView);
m_WebView.getSettings().setLoadWithOverviewMode(false);
m_WebView.getSettings().setUseWideViewPort(true);
m_WebView.getSettings().setDefaultFontSize(Preferences.Topic.getFontSize());
m_WebView.addJavascriptInterface(this, "HTMLOUT");
m_WebView.setWebViewClient(new MyWebViewClient());
return view;
}
private final static int FILECHOOSER_RESULTCODE = 1;
@JavascriptInterface
public void showChooseCssDialog() {
getMainActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
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 && requestCode == FILECHOOSER_RESULTCODE) {
String attachFilePath = FileUtils.getRealPathFromURI(getMainActivity(), data.getData());
String cssData = FileUtils.readFileText(attachFilePath)
.replace("\\", "\\\\")
.replace("'", "\\'").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "");
if (Build.VERSION.SDK_INT < 19)
m_WebView.loadUrl("javascript:window['HtmlInParseLessContent']('" + cssData + "');");
else
m_WebView.evaluateJavascript("window['HtmlInParseLessContent']('" + cssData + "')",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
}
);
}
}
protected void startLoadData() {
Bundle args = new Bundle();
args.putString(USER_ID_KEY, getUserId());
setLoading(true);
if (getLoaderManager().getLoader(ItemsLoader.ID) != null)
getLoaderManager().restartLoader(ItemsLoader.ID, args, this);
else
getLoaderManager().initLoader(ItemsLoader.ID, args, this);
}
private void showBody(Profile profile) {
title = profile.getNick().toString();
super.showBody();
m_WebView.loadDataWithBaseURL("http://4pda.ru/forum/", profile.getHtmlBody(), "text/html", "UTF-8", null);
if (profile.getNick() != null)
args.putString(USER_NAME_KEY, profile.getNick().toString());
if (getMainActivity() != null)
setTitle(profile.getNick());
}
@Override
public Loader<Profile> onCreateLoader(int id, Bundle args) {
ItemsLoader loader = null;
if (id == ItemsLoader.ID) {
setLoading(true);
loader = new ItemsLoader(getMainActivity(), args);
}
return loader;
}
@Override
public void onLoadFinished(Loader<Profile> loader, Profile data) {
if (data != null && data.getError() != null) {
AppLog.e(getMainActivity(), data.getError());
} else if (data != null) {
showBody(data);
}
setLoading(false);
}
@Override
public void onLoaderReset(Loader<Profile> loader) {
setLoading(false);
}
private static class ProfileHtmlBuilder extends HtmlBuilder {
@Override
protected String getStyle() {
//return "/android_asset/profile/css/" + (App.getInstance().isWhiteTheme() ? "profile_white.css" : "profile_black.css");
return App.getInstance().getThemeCssFileName();
}
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
if (tryShowQms_2_0(getMainActivity(), url))
return true;
if (IntentActivity.tryShowUrl(getMainActivity(), new Handler(), url, true, false,
Client.getInstance().getAuthKey()))
return true;
return true;
}
public boolean tryShowQms_2_0(Activity context, String url) {
Matcher m = PatternExtensions.compile("4pda.ru/forum/index.php\\?act=qms&mid=(\\d+)&t=(\\d+)").matcher(url);
if (m.find()) {
//QmsChatActivity.openChat(context, m.group(1), getUserNick(), m.group(2), null);
QmsChatFragment.openChat(m.group(1), getUserNick(), m.group(2), null);
return true;
}
m = PatternExtensions.compile("4pda.ru/forum/index.php\\?act=qms&mid=(\\d+)").matcher(url);
if (m.find()) {
//QmsContactThemesActivity.showThemes(context, m.group(1), getUserNick());
QmsContactThemes.showThemes(m.group(1), getUserNick());
return true;
}
return false;
}
}
private static class ItemsLoader extends AsyncTaskLoader<Profile> {
public static final int ID = App.getInstance().getUniqueIntValue();
Profile mApps;
private Bundle args;
public ItemsLoader(Context context, Bundle args) {
super(context);
this.args = args;
}
public Bundle getArgs() {
return args;
}
@Override
public Profile loadInBackground() {
try {
Profile profile = ProfileApi.getProfile(Client.getInstance(),
args.getString(USER_ID_KEY),
App.getInstance().getPreferences().getBoolean("isSquareAvarars", false) ? "" : "circle");
ProfileHtmlBuilder builder = new ProfileHtmlBuilder();
builder.beginHtml(profile.getNick().toString());
builder.beginBody("profile");
builder.append(profile.getHtmlBody());
builder.append("<script>\n" +
" (function () {\n" +
" var trans = document.querySelectorAll(\"input[type=radio]\")\n" +
" for (var i = 0, len = trans.length; i < len; i++) {\n" +
" trans[i].onchange = function () {\n" +
" window.HTMLOUT.setPrimaryDevice(this.value)\n" +
" };\n" +
" }\n" +
" }());\n" +
" </script>");
builder.endBody();
builder.endHtml();
profile.setHtmlBody(builder.getHtml().toString());
return profile;
} catch (Throwable e) {
Profile res = new Profile();
res.setError(e);
return res;
}
}
@Override
public void deliverResult(Profile apps) {
mApps = apps;
if (isStarted()) {
super.deliverResult(apps);
}
}
@Override
protected void onStartLoading() {
if (mApps != null) {
// If we currently have a result available, deliver it
// immediately.
deliverResult(mApps);
}
if (takeContentChanged() || mApps == null) {
// If the data has changed since the last time it was loaded
// or is not currently available, start a load.
forceLoad();
}
}
@Override
protected void onStopLoading() {
// Attempt to cancel the current load task if possible.
cancelLoad();
}
@Override
protected void onReset() {
super.onReset();
// Ensure the loader is stopped
onStopLoading();
// At this point we can release the resources associated with 'apps'
// if needed.
if (mApps != null) {
mApps = null;
}
}
}
public void run(final Runnable runnable) {
if (Build.VERSION.SDK_INT < 17) {
runnable.run();
} else {
getMainActivity().runOnUiThread(runnable);
}
}
@JavascriptInterface
public void setPrimaryDevice(final String id) {
run(new Runnable() {
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
Map<String, String> additionalHeaders = new HashMap<String, String>();
additionalHeaders.put("auth_key", Client.getInstance().getAuthKey());
try {
Client.getInstance().performPost("http://4pda.ru/forum/index.php?act=profile-xhr&action=dev-primary&md_id=" + id, additionalHeaders);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
Toast.makeText(getMainActivity(), "Основное устройство изменено", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if (Client.getInstance().getLogined() && getUserId() != null && !getUserId().equals(Client.getInstance().UserId)) {
menu.add(getString(R.string.MessagesQms)).setIcon(R.drawable.pencil)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
QmsContactThemes.showThemes(getUserId(), getUserNick());
return true;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
menu.add(getString(R.string.Reputation))
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
CharSequence[] items = {getString(R.string.do_vote_good), getString(R.string.do_vote_bad), getString(R.string.look), getString(R.string.change_reputation)};
new MaterialDialog.Builder(getMainActivity())
.title(R.string.reputation)
.items(items)
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog dialog, View view, int i, CharSequence items) {
switch (i) {
case 0:
UserReputationFragment.plusRep(getMainActivity(), new Handler(), getUserId(), getUserNick());
break;
case 1:
UserReputationFragment.minusRep(getMainActivity(), new Handler(), getUserId(), getUserNick());
break;
case 2:
UserReputationFragment.showActivity(getMainActivity(), getUserId(), false);
break;
case 3:
UserReputationFragment.showActivity(getMainActivity(), getUserId(), true);
break;
}
}
})
.show();
return true;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(R.string.topics)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
MainActivity.startForumSearch(SearchSettingsDialogFragment.createUserTopicsSearchSettings(getUserNick()));
return true;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(R.string.posts)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
MainActivity.startForumSearch(SearchSettingsDialogFragment.createUserPostsSearchSettings(getUserNick()));
return true;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(R.string.link)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
ExtUrl.showSelectActionDialog(getMainActivity(), getString(R.string.link_to_profile), "http://4pda.ru/forum/index.php?showuser=" + getUserId());
return true;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
}