package org.softeg.slartus.forpdaplus.listfragments.next;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
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.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.softeg.slartus.forpdaapi.Forum;
import org.softeg.slartus.forpdaapi.ForumsApi;
import org.softeg.slartus.forpdaapi.ProgressState;
import org.softeg.slartus.forpdaapi.classes.ForumsData;
import org.softeg.slartus.forpdaapi.search.SearchSettings;
import org.softeg.slartus.forpdaplus.App;
import org.softeg.slartus.forpdaplus.Client;
import org.softeg.slartus.forpdaplus.MainActivity;
import org.softeg.slartus.forpdaplus.R;
import org.softeg.slartus.forpdaplus.classes.common.ExtUrl;
import org.softeg.slartus.forpdaplus.common.AppLog;
import org.softeg.slartus.forpdaplus.db.ForumsTable;
import org.softeg.slartus.forpdaplus.fragments.GeneralFragment;
import org.softeg.slartus.forpdaplus.fragments.search.SearchSettingsDialogFragment;
import org.softeg.slartus.forpdaplus.listfragments.ForumTopicsListFragment;
import org.softeg.slartus.forpdaplus.listfragments.TopicsListFragment;
import org.softeg.slartus.forpdaplus.listtemplates.BrickInfo;
import org.softeg.slartus.forpdaplus.listtemplates.ForumBrickInfo;
import org.softeg.slartus.forpdaplus.prefs.Preferences;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/*
* Created by slartus on 24.02.2015.
*/
public class ForumFragment extends GeneralFragment implements LoaderManager.LoaderCallbacks<ForumFragment.ForumBranch> {
private static final String DATA_KEY = "BrickFragmentListBase.DATA_KEY";
private static final String SCROLL_POSITION_KEY = "SCROLL_POSITION_KEY";
public static final String FORUM_ID_KEY = "FORUM_ID_KEY";
public static final String FORUM_TITLE_KEY = "FORUM_TITLE_KEY";
private RecyclerView mListView;
private TextView mEmptyTextView;
private ForumFragment.ForumBranch mData = createListData();
private SearchSettings mSearchSetting = SearchSettingsDialogFragment.createForumSearchSettings();
private ForumsAdapter mAdapter;
private String m_ForumId = null;
boolean lastImageDownload = MainActivity.getPreferences().getBoolean("forum.list.show_images", true);
@Override
public boolean closeTab() {
return false;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
removeArrow();
if (getArguments() != null)
m_ForumId = getArguments().getString(FORUM_ID_KEY, null);
if (savedInstanceState != null) {
m_Name = savedInstanceState.getString(NAME_KEY, m_Name);
m_Title = savedInstanceState.getString(TITLE_KEY, m_Title);
m_NeedLogin = savedInstanceState.getBoolean(NEED_LOGIN_KEY, m_NeedLogin);
if (savedInstanceState.containsKey(DATA_KEY)) {
mData = (ForumFragment.ForumBranch) savedInstanceState.getSerializable(DATA_KEY);
}
}
if (m_ForumId == null) {
m_ForumId = Preferences.List.getStartForumId();
}
setTitle(m_Title);
initAdapter();
}
@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.add(R.string.mark_forum_as_read)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
markAsRead();
return false;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(R.string.set_forum_starting)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Forum f = mData.getCrumbs().get(mData.getCrumbs().size() - 1);
Preferences.List.setStartForum(f.getId(),
f.getTitle());
Toast.makeText(getActivity(), R.string.forum_setted_to_start, Toast.LENGTH_SHORT).show();
return false;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
menu.add(R.string.refresh_forum_struct)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
new MaterialDialog.Builder(getActivity())
.title(R.string.attention)
.content(R.string.forum_refresh_content)
.positiveText(R.string.refresh)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
new UpdateForumStructTask(getActivity()).execute();
}
})
.negativeText(R.string.cancel).show();
return false;
}
})
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
@Override
public void onPause() {
super.onPause();
MainActivity.searchSettings = SearchSettingsDialogFragment.createDefaultSearchSettings();
}
@Override
public void onResume() {
super.onResume();
removeArrow();
MainActivity.searchSettings = mSearchSetting;
if(lastImageDownload==MainActivity.getPreferences().getBoolean("forum.list.show_images", true)){
mAdapter.notifyDataSetChangedWithLayout();
if(mListView!=null) mListView.refreshDrawableState();
lastImageDownload = MainActivity.getPreferences().getBoolean("forum.list.show_images", true);
}
}
private void markAsRead() {
if (!Client.getInstance().getLogined()) {
Toast.makeText(getActivity(), R.string.need_login, Toast.LENGTH_SHORT).show();
return;
}
new MaterialDialog.Builder(getActivity())
.title(R.string.confirm_action)
.content(getString(R.string.mark_forum_as_read)+"?")
.positiveText(R.string.yes)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
Toast.makeText(getActivity(), R.string.request_sent, Toast.LENGTH_SHORT).show();
new Thread(new Runnable() {
public void run() {
Throwable ex = null;
try {
Forum f = mData.getCrumbs().get(mData.getCrumbs().size() - 1);
ForumsApi.markForumAsRead(Client.getInstance(), f.getId() == null ? "-1" : f.getId());
} catch (Throwable e) {
ex = e;
}
final Throwable finalEx = ex;
mHandler.post(new Runnable() {
public void run() {
try {
if (finalEx != null) {
Toast.makeText(getActivity(), R.string.error, Toast.LENGTH_SHORT).show();
AppLog.e(getActivity(), finalEx);
} else {
Toast.makeText(getActivity(), R.string.forum_setted_read, Toast.LENGTH_SHORT).show();
}
} catch (Exception ex) {
AppLog.e(getActivity(), ex);
}
}
});
}
}).start();
}
})
.negativeText(R.string.cancel)
.show();
}
protected ForumFragment.ForumBranch createListData() {
return new ForumFragment.ForumBranch();
}
protected RecyclerView getListView() {
return mListView;
}
protected ForumFragment.ForumBranch getData() {
return mData;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mListView.setLayoutManager(mLayoutManager);
if (savedInstanceState != null && savedInstanceState.containsKey(SCROLL_POSITION_KEY)) {
mListView.scrollToPosition(savedInstanceState.getInt(SCROLL_POSITION_KEY));
}
setListViewAdapter();
if (mData.getItems().size() == 0)
reloadData();
}
@Override
public View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.forum_fragment, container, false);
assert view != null;
mListView = (RecyclerView) findViewById(android.R.id.list);
registerForContextMenu(mListView);
mEmptyTextView = (TextView) findViewById(android.R.id.empty);
return view;
}
public void reloadData() {
loadData(true);
}
@Override
public void startLoad() {
reloadData();
}
@Override
public void loadData(final boolean isRefresh) {
loadForum(m_ForumId);
}
public void loadForum(String forumId) {
Bundle args = new Bundle();
args.putString(FORUM_ID_KEY, forumId);
setLoading(true);
if (getLoaderManager().getLoader(getLoaderId()) != null)
getLoaderManager().restartLoader(getLoaderId(), args, this);
else
getLoaderManager().initLoader(getLoaderId(), args, this);
}
private int getLoaderId() {
return ForumLoader.ID;
}
@Override
public Loader<ForumFragment.ForumBranch> onCreateLoader(int id, Bundle args) {
Loader<ForumBranch> loader = null;
if (id == getLoaderId()) {
setLoading(true);
loader = createLoader(id, args);
}
return loader;
}
private Loader<ForumBranch> createLoader(int id, Bundle args) {
ForumLoader loader = null;
if (id == ForumLoader.ID) {
setLoading(true);
loader = new ForumLoader(getActivity(), args);
}
return loader;
}
@Override
public void onLoadFinished(Loader<ForumFragment.ForumBranch> loader, ForumFragment.ForumBranch data) {
if (data != null && data.getError() != null) {
AppLog.e(getActivity(), data.getError());
} else if (data != null) {
if (data.getItems().size() == 0 && data.getItems().size() > 1) {
Forum forum = data.getItems().get(data.getItems().size() - 1);
ForumTopicsListFragment.showForumTopicsList(getActivity(), forum.getId(), forum.getTitle());
return;
}
mData.getItems().clear();
mData.getItems().addAll(data.getItems());
mData.getCrumbs().clear();
mData.getCrumbs().addAll(data.getCrumbs());
notifyDataSetChanged();
mListView.refreshDrawableState();
mListView.scrollToPosition(0);
}
setLoading(false);
}
@Override
public void onLoaderReset(Loader<ForumFragment.ForumBranch> loader) {
}
protected void setEmptyText(String s) {
mEmptyTextView.setText(s);
}
protected void setLoading(Boolean loading) {
try {
if (getActivity() == null) return;
// if (loading) {
// setEmptyText("Загрузка..");
// } else {
// setEmptyText("Нет данных");
// }
} catch (Throwable ignore) {
android.util.Log.e("TAG", ignore.toString());
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(NAME_KEY, m_Name);
outState.putString(TITLE_KEY, m_Title);
outState.putBoolean(NEED_LOGIN_KEY, m_NeedLogin);
outState.putString(FORUM_ID_KEY, m_ForumId);
outState.putSerializable(DATA_KEY, mData);
try {
if (mListView != null) {
outState.putInt(SCROLL_POSITION_KEY,
((LinearLayoutManager) mListView.getLayoutManager()).findFirstCompletelyVisibleItemPosition());
}
} catch (Throwable ex) {
AppLog.e(ex);
}
}
protected void notifyDataSetChanged() {
mAdapter.notifyDataSetChanged();
}
protected void setListViewAdapter() {
mListView.setAdapter(mAdapter);
}
protected void initAdapter() {
mAdapter = new ForumsAdapter(mData.getCrumbs(), mData.getItems(), new ForumsAdapter.OnClickListener() {
@Override
public void onItemClick(View v) {
int itemPosition = mListView.getChildPosition(v);
Forum forum = mData.getItems().get(itemPosition - mData.getCrumbs().size());
if (forum.isHasForums()) {
loadForum(forum.getId());
SearchSettings searchSettings = new SearchSettings();
searchSettings.setSource("all");
searchSettings.getForumsIds().add(forum.getId() + "");
mSearchSetting = searchSettings;
MainActivity.searchSettings = mSearchSetting;
} else {
ForumTopicsListFragment.showForumTopicsList(getActivity(), forum.getId(), forum.getTitle());
}
}
@Override
public void onHeaderClick(View v) {
int itemPosition = mListView.getChildPosition(v);
Forum forum = mData.getCrumbs().get(itemPosition);
loadForum(forum.getId());
}
@Override
public void onHeaderTopicsClick(View v) {
int itemPosition = mListView.getChildPosition(v);
Forum forum = mData.getCrumbs().get(itemPosition);
ForumTopicsListFragment.showForumTopicsList(getActivity(), forum.getId(), forum.getTitle());
}
}, new ForumsAdapter.OnLongClickListener() {
private void show(String id){
ExtUrl.showSelectActionDialog(getMainActivity(), getString(R.string.link), "http://4pda.ru/forum/index.php?showforum="+id);
}
@Override
public void onItemClick(View v) {
show(mData.getItems().get(mListView.getChildPosition(v) - mData.getCrumbs().size()).getId());
}
@Override
public void onHeaderClick(View v) {
show(mData.getCrumbs().get(mListView.getChildPosition(v)).getId());
}
@Override
public void onHeaderTopicsClick(View v) {
show(mData.getCrumbs().get(mListView.getChildPosition(v)).getId());
}
});
}
public static final String NAME_KEY = "NAME_KEY";
public static final String TITLE_KEY = "TITLE_KEY";
public static final String NEED_LOGIN_KEY = "NEED_LOGIN_KEY";
private String m_Title;
private String m_Name;
private Boolean m_NeedLogin = false;
/**
* Заголовок списка
*/
public String getListTitle() {
return m_Title;
}
/**
* Уникальный идентификатор списка
*/
public String getListName() {
return m_Name;
}
@Override
public boolean onBackPressed() {
if (mData.getCrumbs().size() > 1) {
loadForum(mData.getCrumbs().get(mData.getCrumbs().size() - 2).getId());
return true;
}
return false;
}
public Fragment setBrickInfo(BrickInfo listTemplate) {
m_Title = listTemplate.getTitle();
m_Name = listTemplate.getName();
m_NeedLogin = listTemplate.getNeedLogin();
return this;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return false;
}
public static void showActivity(Context context, String forumId, String topicId) {
Bundle args = new Bundle();
if (!TextUtils.isEmpty(forumId))
args.putString(ForumFragment.FORUM_ID_KEY, forumId);
if (!TextUtils.isEmpty(topicId))
args.putString(TopicsListFragment.KEY_TOPIC_ID, topicId);
Log.e("kek", forumId+" : "+topicId);
MainActivity.showListFragment(forumId+topicId, new ForumBrickInfo().getName(), args);
}
public static class ForumBranch implements Serializable {
private Throwable error;
private List<Forum> mCrumbs = null;
public List<Forum> getCrumbs() {
if (mCrumbs == null)
mCrumbs = new ArrayList<Forum>();
return mCrumbs;
}
private List<Forum> mItems = null;
public List<Forum> getItems() {
if (mItems == null)
mItems = new ArrayList<Forum>();
return mItems;
}
public Throwable getError() {
return error;
}
public void setError(Throwable error) {
this.error = error;
}
}
private static class ForumsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public interface OnClickListener {
void onItemClick(View v);
void onHeaderClick(View v);
void onHeaderTopicsClick(View v);
}
public interface OnLongClickListener {
void onItemClick(View v);
void onHeaderClick(View v);
void onHeaderTopicsClick(View v);
}
private List<Forum> mDataset;
private OnClickListener mOnClickListener;
private OnLongClickListener mOnLongClickListener;
private List<Forum> mHeaderset;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mText1;
public TextView mText2;
public ImageView mImageView;
public ViewHolder(View v) {
super(v);
mText1 = (TextView) v.findViewById(android.R.id.text1);
mText2 = (TextView) v.findViewById(android.R.id.text2);
mImageView = (ImageView) v.findViewById(R.id.imageView3);
}
}
public static class HeaderViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mText;
public HeaderViewHolder(View v) {
super(v);
mText = (TextView) v.findViewById(R.id.textView3);
}
}
private Forum getItem(int position) {
switch (getItemViewType(position)) {
case HEADER_CURRENT_NOTOPICS_VIEW_TYPE:
case HEADER_CURRENT_VIEW_TYPE:
case HEADER_VIEW_TYPE:
return mHeaderset.get(position);
case DATA_VIEW_TYPE:
return mDataset.get(position - mHeaderset.size());
}
return null;
}
private final int HEADER_VIEW_TYPE = 0;
private final int HEADER_CURRENT_VIEW_TYPE = 1;
private final int HEADER_CURRENT_NOTOPICS_VIEW_TYPE = 2;
private final int DATA_VIEW_TYPE = 3;
@Override
public int getItemViewType(int position) {
// Just as an example, return 0 or 2 depending on position
// Note that unlike in ListView adapters, types don't have to be contiguous
if (position < mHeaderset.size()) {
if (position == mHeaderset.size() - 1) {
if (!mHeaderset.get(position).isHasTopics())
return HEADER_CURRENT_NOTOPICS_VIEW_TYPE;
return HEADER_CURRENT_VIEW_TYPE;
}
return HEADER_VIEW_TYPE;
}
return DATA_VIEW_TYPE;
}
private Boolean mIsShowImages = true;
// Provide a suitable constructor (depends on the kind of dataset)
public ForumsAdapter(List<Forum> headerDataset, List<Forum> myDataset,
OnClickListener onClickListener, OnLongClickListener onLongClickListener) {
mHeaderset = headerDataset;
mDataset = myDataset;
mOnClickListener = onClickListener;
mOnLongClickListener = onLongClickListener;
mIsShowImages = Preferences.Forums.isShowImages();
}
public void notifyDataSetChangedWithLayout() {
// mIsShowImages = Preferences.Forums.isShowImages();
notifyDataSetChanged();
}
// Create new views (invoked by the layout manager)
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
switch (viewType) {
case DATA_VIEW_TYPE:
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.forum_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
if (!mIsShowImages)
viewHolder.mImageView.setVisibility(View.GONE);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnClickListener.onItemClick(v);
}
});
v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnLongClickListener.onItemClick(v);
return true;
}
});
return viewHolder;
case HEADER_VIEW_TYPE:
final View headerV = LayoutInflater.from(parent.getContext())
.inflate(R.layout.forum_header_item, parent, false);
HeaderViewHolder headerViewHolder = new HeaderViewHolder(headerV);
headerV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnClickListener.onHeaderClick(v);
}
});
headerV.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnLongClickListener.onHeaderClick(v);
return true;
}
});
return headerViewHolder;
case HEADER_CURRENT_VIEW_TYPE:
final View headerCV = LayoutInflater.from(parent.getContext())
.inflate(R.layout.forum_header_current_item, parent, false);
HeaderViewHolder headerCViewHolder = new HeaderViewHolder(headerCV);
headerCV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnClickListener.onHeaderTopicsClick(v);
}
});
headerCV.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnLongClickListener.onHeaderTopicsClick(v);
return true;
}
});
return headerCViewHolder;
case HEADER_CURRENT_NOTOPICS_VIEW_TYPE:
final View headerCNV = LayoutInflater.from(parent.getContext())
.inflate(R.layout.forum_header_notopics_item, parent, false);
HeaderViewHolder headerCNViewHolder = new HeaderViewHolder(headerCNV);
headerCNV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnClickListener.onHeaderClick(v);
}
});
headerCNV.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnLongClickListener.onHeaderClick(v);
return false;
}
});
return headerCNViewHolder;
}
// create a new view
return null;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
Forum forum = getItem(position);
switch (viewType) {
case DATA_VIEW_TYPE:
ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.mText1.setText(forum.getTitle());
viewHolder.mText2.setText(forum.getDescription());
if (forum.getIconUrl() != null && mIsShowImages) {
ImageLoader.getInstance().displayImage(forum.getIconUrl(),
((ViewHolder) holder).mImageView,
new ImageLoadingListener() {
@Override
public void onLoadingStarted(String p1, View p2) {
p2.setVisibility(View.INVISIBLE);
//holder.mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String p1, View p2, FailReason p3) {
// holder.mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingComplete(String p1, View p2, Bitmap p3) {
p2.setVisibility(View.VISIBLE);
// holder.mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingCancelled(String p1, View p2) {
}
});
}
break;
case HEADER_VIEW_TYPE:
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
headerViewHolder.mText.setText(forum.getTitle());
break;
case HEADER_CURRENT_VIEW_TYPE:
HeaderViewHolder headerCViewHolder = (HeaderViewHolder) holder;
headerCViewHolder.mText.setText(forum.getTitle());
break;
case HEADER_CURRENT_NOTOPICS_VIEW_TYPE:
HeaderViewHolder headerCNViewHolder = (HeaderViewHolder) holder;
headerCNViewHolder.mText.setText(forum.getTitle());
break;
}
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mHeaderset.size() + mDataset.size();
}
}
private static class ForumLoader extends AsyncTaskLoader<ForumFragment.ForumBranch> {
public static final int ID = App.getInstance().getUniqueIntValue();
ForumFragment.ForumBranch mApps;
private Bundle args;
public ForumLoader(Context context, Bundle args) {
super(context);
this.args = args;
}
public Bundle getArgs() {
return args;
}
@Override
public ForumFragment.ForumBranch loadInBackground() {
try {
return ForumsTable.getForums(args.getString(FORUM_ID_KEY));
} catch (Throwable e) {
ForumFragment.ForumBranch forumPage = new ForumFragment.ForumBranch();
forumPage.setError(e);
return forumPage;
}
}
@Override
public void deliverResult(ForumFragment.ForumBranch 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 Handler mHandler = new Handler();
private class UpdateForumStructTask extends AsyncTask<String, String, ForumsData> {
private final MaterialDialog dialog;
public UpdateForumStructTask(Context context) {
dialog = new MaterialDialog.Builder(context)
.progress(true,0)
.cancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
cancel(true);
}
})
.content(R.string.refreshing_forum_struct)
.build();
}
protected void onCancelled() {
Toast.makeText(getActivity(), R.string.canceled_refreshing_forum_struct, Toast.LENGTH_SHORT).show();
}
@Override
protected ForumsData doInBackground(String... forums) {
try {
if (isCancelled()) return null;
ForumsData res = ForumsApi.loadForums(Client.getInstance(), new ProgressState() {
@Override
public void update(String message, int percents) {
publishProgress(String.format("%s %d", message, percents));
}
});
publishProgress(App.getContext().getString(R.string.update_base));
ForumsTable.updateForums(res.getItems());
return res;
} catch (Throwable e) {
ForumsData res = new ForumsData();
res.setError(e);
return res;
}
}
@Override
protected void onProgressUpdate(final String... progress) {
mHandler.post(new Runnable() {
public void run() {
dialog.setContent(progress[0]);
}
});
}
protected void onPreExecute() {
try {
this.dialog.show();
} catch (Exception ex) {
AppLog.e(null, ex);
}
}
protected void onPostExecute(final ForumsData data) {
try {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
} catch (Exception ex) {
AppLog.e(null, ex);
}
loadData(true);
if (data != null) {
if (data.getError() != null) {
AppLog.e(getActivity(), data.getError());
}
}
}
}
}