package org.softeg.slartus.forpdaplus.listfragments.next;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.softeg.slartus.forpdaapi.IListItem;
import org.softeg.slartus.forpdaapi.ListInfo;
import org.softeg.slartus.forpdaapi.ReputationEvent;
import org.softeg.slartus.forpdaapi.ReputationsApi;
import org.softeg.slartus.forpdaapi.classes.ListData;
import org.softeg.slartus.forpdaapi.classes.ReputationsListData;
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.ForumUser;
import org.softeg.slartus.forpdaplus.classes.MenuListDialog;
import org.softeg.slartus.forpdaplus.classes.common.ExtUrl;
import org.softeg.slartus.forpdaplus.fragments.profile.ProfileFragment;
import org.softeg.slartus.forpdaplus.listtemplates.UserReputationBrickInfo;
import java.util.ArrayList;
import java.util.List;
/*
* Created by slinkin on 19.02.2015.
*/
public class UserReputationFragment extends BrickFragmentListBase {
public static final String USER_ID_KEY = "USER_ID_KEY";
public static final String USER_NICK_KEY = "USER_NICK_KEY";
public static final String USER_FROM_KEY = "USER_FROM_KEY";
public static void showActivity(Context context, CharSequence userId, Boolean from) {
Bundle args = new Bundle();
args.putString(USER_ID_KEY, userId.toString());
if (from)
args.putBoolean(USER_FROM_KEY, true);
MainActivity.showListFragment(userId.toString(), UserReputationBrickInfo.NAME, args);
}
@Override
public boolean closeTab() {
return false;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setArrow();
}
@Override
public void onResume() {
super.onResume();
setArrow();
}
@Override
public void onPause() {
super.onPause();
}
private String getUserId() {
return Args.getString(USER_ID_KEY);
}
private String getUserNick() {
return Args.getString(USER_NICK_KEY, "");
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(USER_ID_KEY, getUserId());
outState.putString(USER_NICK_KEY, getUserNick());
super.onSaveInstanceState(outState);
}
@Override
protected int getLoaderId() {
return ItemsLoader.ID;
}
@Override
protected BaseAdapter createAdapter() {
return new ListAdapter(getActivity(), getData().getItems());
}
@Override
protected int getViewResourceId() {
return R.layout.list_fragment;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
getActivity().openContextMenu(view);
}
@Override
public void onLoadFinished(Loader<ListData> loader, ListData data) {
super.onLoadFinished(loader, data);
if(data.getEx()==null){
if(data instanceof ReputationsListData){
if(getSupportActionBar()!=null)
setSubtitle(((ReputationsListData) data).getRep());
Args.putString(USER_NICK_KEY, ((ReputationsListData) data).getUser());
}
}
}
@Override
public View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup container,
Bundle savedInstanceState) {
View v = super.onCreateView(inflater, container, savedInstanceState);
addLoadMoreFooter(inflater.getContext());
return v;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
if (info.id == -1) return;
final ReputationEvent item = (ReputationEvent) getAdapter().getItem((int) info.id);
final List<MenuListDialog> list = new ArrayList<>();
if (item.getSourceUrl()!=null&&!item.getSourceUrl().contains("forum/index.php?showuser=")) {
list.add(new MenuListDialog(getString(R.string.jump_to_page), new Runnable() {
@Override
public void run() {
IntentActivity.tryShowUrl(getActivity(), new Handler(), item.getSourceUrl(), true, false);
}
}));
}
ForumUser.onCreateContextMenu(getActivity(), list, item.getUserId(), item.getUser());
ExtUrl.showContextDialog(getContext(), item.getUser(), list);
}
private static final String START_KEY = "START_KEY";
protected Bundle getLoadArgs() {
Bundle args =Args;
args.putInt(START_KEY, getData().getItems().size());
return args;
}
@Override
public boolean onBackPressed() {
return false;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
try {
MenuItem item;
if (Client.getInstance().getLogined() && !getUserId().equals(Client.getInstance().UserId)) {
item = menu.add(R.string.increase_reputation).setIcon(R.drawable.thumb_up);
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
plusRep();
return true;
}
});
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
item = menu.add(R.string.decrease_reputation).setIcon(R.drawable.thumb_down);
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
minusRep();
return true;
}
});
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
item = menu.add(R.string.Profile);
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
ProfileFragment.showProfile(getUserId(), getUserNick());
return true;
}
});
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
} finally {
super.onCreateOptionsMenu(menu, inflater);
}
}
@Override
protected AsyncTaskLoader<ListData> createLoader(int id, Bundle args) {
ItemsLoader loader = null;
if (id == ItemsLoader.ID) {
boolean needLoadRepImage;
if (!Client.getInstance().getLogined()){
getPreferences().edit().putBoolean("needLoadRepImage", false).remove("repPlusImage").apply();
needLoadRepImage = false;
}else {
needLoadRepImage = getPreferences().getBoolean("needLoadRepImage", false);
}
setLoading(true);
loader = new ItemsLoader(getActivity(), args, needLoadRepImage);
}
return loader;
}
private static class ItemsLoader extends AsyncTaskLoader<ListData> {
public static final int ID = App.getInstance().getUniqueIntValue();
ListData mApps;
private Bundle args;
private boolean needLoadRepImage;
public ItemsLoader(Context context, Bundle args, boolean needLoadRepImage) {
super(context);
this.args = args;
this.needLoadRepImage = needLoadRepImage;
}
public Bundle getArgs() {
return args;
}
@Override
public ListData loadInBackground() {
try {
if(needLoadRepImage){
String plusImage = Jsoup
.parse(Client.getInstance().performGet("http://4pda.ru/forum/index.php?act=rep&view=history&mid=2556269&mode=to&order=asc"))
.select("#ipbwrapper .borderwrap .ipbtable tbody")
.first().select("tr:nth-last-child(2) td img").first().attr("src");
if(plusImage!=null)
getPreferences().edit().putString("repPlusImage", plusImage).putBoolean("needLoadRepImage", false).apply();
}
ListInfo listInfo = new ListInfo();
listInfo.setFrom(getArgs().getBoolean(IS_REFRESH_KEY) ? 0 : getArgs().getInt(START_KEY));
return ReputationsApi.loadReputation(Client.getInstance(),
args.getString(USER_ID_KEY),
args.getBoolean(USER_FROM_KEY), listInfo,
getPreferences().getString("repPlusImage", "http://s.4pda.to/ShmfPSURw3VD2aNlTerb3hvYwGCMxd4z0muJ.gif"));
} catch (Throwable e) {
ListData forumPage = new ListData();
forumPage.setEx(e);
return forumPage;
}
}
@Override
public void deliverResult(ListData 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;
}
}
}
private static class ListAdapter extends BaseAdapter {
private final LayoutInflater mInflater;
protected ArrayList<? extends IListItem> mData;
public ListAdapter(Context context, ArrayList<? extends IListItem> data) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mData = data;
}
public void setData(ArrayList<? extends IListItem> data) {
mData = data;
}
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
}
@Override
public Object getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public android.view.View getView(int position, android.view.View view, android.view.ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
view = mInflater.inflate(R.layout.list_item_reputation, parent, false);
holder = new ViewHolder();
holder.Flag = (TextView) view.findViewById(R.id.imgFlag);
holder.TopLeft = (TextView) view.findViewById(R.id.txtTopLeft);
holder.TopRight = (TextView) view.findViewById(R.id.txtTopRight);
holder.Main = (TextView) view.findViewById(R.id.txtMain);
holder.SubMain = (TextView) view.findViewById(R.id.txtSubMain);
holder.progress = view.findViewById(R.id.progressBar);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
IListItem topic = mData.get(position);
holder.TopLeft.setText(topic.getTopLeft());
holder.TopRight.setText(topic.getTopRight());
holder.Main.setText(topic.getMain());
holder.SubMain.setText(topic.getSubMain());
setVisibility(holder.progress, topic.isInProgress() ? View.VISIBLE : View.INVISIBLE);
switch (topic.getState()) {
case IListItem.STATE_GREEN:
setVisibility(holder.Flag,View.VISIBLE);
holder.Flag.setText("+");
holder.Flag.setBackgroundResource(R.drawable.plusrep);
//holder.Flag.setImageResource(R.drawable.new_flag);
break;
case IListItem.STATE_RED:
setVisibility(holder.Flag,View.VISIBLE);
holder.Flag.setBackgroundResource(R.drawable.minusrep);
holder.Flag.setText("-");
//holder.Flag.setImageResource(R.drawable.old_flag);
break;
default:
setVisibility(holder.Flag,View.INVISIBLE);
// holder.Flag.setImageBitmap(null);
}
return view;
}
private void setVisibility(View v, int visibility) {
if (v.getVisibility() != visibility)
v.setVisibility(visibility);
}
class ViewHolder {
TextView Flag;
View progress;
TextView TopLeft;
TextView TopRight;
TextView Main;
TextView SubMain;
}
}
public void plusRep() {
plusRep(getUserId(), getUserNick());
}
public void minusRep() {
minusRep(getUserId(), getUserNick());
}
public void plusRep(String userId, String userNick) {
plusRep(getActivity(), new Handler(), "0", userId, userNick);
}
public void minusRep(String userId, String userNick) {
minusRep(getActivity(), new Handler(), "0", userId, userNick);
}
public static void plusRep(Activity activity, Handler handler, String userId, String userNick) {
plusRep(activity, handler, "0", userId, userNick);
}
public static void minusRep(Activity activity, Handler handler, String userId, String userNick) {
minusRep(activity, handler, "0", userId, userNick);
}
public static void plusRep(Activity activity, Handler handler, String postId, String userId, String userNick) {
showChangeRep(activity, handler, postId, userId, userNick, "add", App.getContext().getString(R.string.increase_reputation));
}
public static void minusRep(Activity activity, Handler handler, String postId, String userId, String userNick) {
showChangeRep(activity, handler, postId, userId, userNick, "minus", App.getContext().getString(R.string.decrease_reputation));
}
private static void showChangeRep(Activity activity, Handler handler, final String postId, String userId, String userNick, final String type, String title) {
ForumUser.startChangeRep(activity, handler, userId, userNick, postId, type, title);
}
}