mirror of https://github.com/ThmmyNoLife/mTHMMY
Ezerous
8 years ago
3 changed files with 384 additions and 5 deletions
@ -0,0 +1,87 @@ |
|||
package gr.thmmy.mthmmy.sections.forum; |
|||
|
|||
import android.support.v7.widget.RecyclerView; |
|||
import android.view.LayoutInflater; |
|||
import android.view.View; |
|||
import android.view.ViewGroup; |
|||
import android.widget.TextView; |
|||
|
|||
import java.util.List; |
|||
|
|||
import gr.thmmy.mthmmy.R; |
|||
import gr.thmmy.mthmmy.data.TopicSummary; |
|||
import gr.thmmy.mthmmy.sections.recent.RecentFragment; |
|||
|
|||
|
|||
/** |
|||
* {@link RecyclerView.Adapter} that can display a {@link TopicSummary} and makes a call to the |
|||
* specified {@link RecentFragment.OnListFragmentInteractionListener}. |
|||
*/ |
|||
public class ForumAdapter extends RecyclerView.Adapter<ForumAdapter.ViewHolder> { |
|||
private final List<TopicSummary> recentList; |
|||
private final ForumFragment.OnListFragmentInteractionListener mListener; |
|||
|
|||
public ForumAdapter(List<TopicSummary> topicSummaryList, ForumFragment.OnListFragmentInteractionListener listener) { |
|||
this.recentList = topicSummaryList; |
|||
mListener = listener; |
|||
} |
|||
|
|||
|
|||
@Override |
|||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
|||
View view = LayoutInflater.from(parent.getContext()) |
|||
.inflate(R.layout.fragment_recent_row, parent, false); |
|||
return new ViewHolder(view); |
|||
} |
|||
|
|||
|
|||
@Override |
|||
public void onBindViewHolder(final ViewHolder holder, final int position) { |
|||
|
|||
holder.mTitleView.setText(recentList.get(position).getTitle()); |
|||
holder.mDateTimeView.setText(recentList.get(position).getDateTimeModified()); |
|||
holder.mUserView.setText("by " + recentList.get(position).getLastUser()); |
|||
|
|||
holder.topic = recentList.get(position); |
|||
|
|||
holder.mView.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
|
|||
if (null != mListener) { |
|||
// Notify the active callbacks interface (the activity, if the
|
|||
// fragment is attached to one) that an item has been selected.
|
|||
mListener.onFragmentInteraction(holder.topic); //?
|
|||
|
|||
} |
|||
|
|||
} |
|||
}); |
|||
} |
|||
|
|||
@Override |
|||
public int getItemCount() { |
|||
return recentList.size(); |
|||
} |
|||
|
|||
public class ViewHolder extends RecyclerView.ViewHolder { |
|||
public final View mView; |
|||
public final TextView mTitleView; |
|||
public final TextView mUserView; |
|||
public final TextView mDateTimeView; |
|||
public TopicSummary topic; |
|||
|
|||
public ViewHolder(View view) { |
|||
super(view); |
|||
mView = view; |
|||
mTitleView = (TextView) view.findViewById(R.id.title); |
|||
mUserView = (TextView) view.findViewById(R.id.lastUser); |
|||
mDateTimeView = (TextView) view.findViewById(R.id.dateTime); |
|||
} |
|||
|
|||
// @Override
|
|||
// public String toString() {
|
|||
// return super.toString() + " '" + mContentView.getText() + "'";
|
|||
// }
|
|||
} |
|||
} |
@ -0,0 +1,289 @@ |
|||
package gr.thmmy.mthmmy.sections.forum; |
|||
|
|||
import android.content.Context; |
|||
import android.os.AsyncTask; |
|||
import android.os.Bundle; |
|||
import android.support.v4.app.Fragment; |
|||
import android.support.v4.widget.SwipeRefreshLayout; |
|||
import android.support.v7.widget.LinearLayoutManager; |
|||
import android.util.Log; |
|||
import android.view.LayoutInflater; |
|||
import android.view.View; |
|||
import android.view.ViewGroup; |
|||
import android.widget.ProgressBar; |
|||
import android.widget.RelativeLayout; |
|||
import android.widget.Toast; |
|||
|
|||
import org.jsoup.Jsoup; |
|||
import org.jsoup.nodes.Document; |
|||
import org.jsoup.select.Elements; |
|||
|
|||
import java.io.IOException; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
import gr.thmmy.mthmmy.R; |
|||
import gr.thmmy.mthmmy.activities.BaseActivity; |
|||
import gr.thmmy.mthmmy.data.TopicSummary; |
|||
import gr.thmmy.mthmmy.session.SessionManager; |
|||
import gr.thmmy.mthmmy.utils.CustomRecyclerView; |
|||
import okhttp3.HttpUrl; |
|||
import okhttp3.OkHttpClient; |
|||
import okhttp3.Request; |
|||
import okhttp3.Response; |
|||
|
|||
/** |
|||
* A simple {@link Fragment} subclass. |
|||
* Activities that contain this fragment must implement the |
|||
* {@link ForumFragment.OnListFragmentInteractionListener} interface |
|||
* to handle interaction events. |
|||
* Use the {@link ForumFragment#newInstance} factory method to |
|||
* create an instance of this fragment. |
|||
*/ |
|||
public class ForumFragment extends Fragment |
|||
{ |
|||
private static final String TAG = "ForumFragment"; |
|||
// Fragment initialization parameters, e.g. ARG_SECTION_NUMBER
|
|||
private static final String ARG_SECTION_NUMBER = "SectionNumber"; |
|||
private int sectionNumber; |
|||
|
|||
private ProgressBar progressBar; |
|||
private SwipeRefreshLayout swipeRefreshLayout; |
|||
private ForumAdapter forumAdapter; |
|||
|
|||
private List<TopicSummary> topicSummaries; |
|||
|
|||
private OnListFragmentInteractionListener mListener; |
|||
|
|||
private OkHttpClient client; |
|||
|
|||
// Required empty public constructor
|
|||
public ForumFragment() { |
|||
} |
|||
|
|||
/** |
|||
* Use ONLY this factory method to create a new instance of |
|||
* this fragment using the provided parameters. |
|||
* |
|||
* @param sectionNumber |
|||
* @return A new instance of fragment Forum. |
|||
*/ |
|||
public static ForumFragment newInstance(int sectionNumber) { |
|||
ForumFragment fragment = new ForumFragment(); |
|||
Bundle args = new Bundle(); |
|||
args.putInt(ARG_SECTION_NUMBER, sectionNumber); |
|||
fragment.setArguments(args); |
|||
return fragment; |
|||
} |
|||
|
|||
public int getSectionNumber() { |
|||
return sectionNumber; |
|||
} |
|||
|
|||
@Override |
|||
public void onCreate(Bundle savedInstanceState) { |
|||
super.onCreate(savedInstanceState); |
|||
|
|||
sectionNumber = getArguments().getInt(ARG_SECTION_NUMBER); |
|||
|
|||
client = BaseActivity.getClient(); |
|||
|
|||
topicSummaries = new ArrayList<>(); |
|||
|
|||
|
|||
if (sectionNumber == 1) //?
|
|||
Log.d(TAG, "onCreate"); |
|||
} |
|||
|
|||
@Override |
|||
public void onActivityCreated(Bundle savedInstanceState) { |
|||
super.onActivityCreated(savedInstanceState); |
|||
if (sectionNumber == 1)//temp
|
|||
{ |
|||
if (topicSummaries.isEmpty()) |
|||
new RecentTask().execute(); |
|||
|
|||
|
|||
} |
|||
Log.d(TAG, "onActivityCreated"); |
|||
} |
|||
|
|||
@Override |
|||
public void onStart() { |
|||
super.onStart(); |
|||
if (sectionNumber == 1) |
|||
Log.d(TAG, "onStart"); |
|||
} |
|||
|
|||
@Override |
|||
public void onResume() { |
|||
super.onResume(); |
|||
if (sectionNumber == 1) |
|||
Log.d(TAG, "onResume"); |
|||
} |
|||
|
|||
@Override |
|||
public void onPause() { |
|||
super.onPause(); |
|||
if (sectionNumber == 1) |
|||
Log.d(TAG, "onPause"); |
|||
} |
|||
|
|||
@Override |
|||
public void onStop() { |
|||
super.onStop(); |
|||
if (sectionNumber == 1) |
|||
Log.d(TAG, "onStop"); |
|||
} |
|||
|
|||
|
|||
@Override |
|||
public View onCreateView(LayoutInflater inflater, ViewGroup container, |
|||
Bundle savedInstanceState) { |
|||
// Inflate the layout for this fragment
|
|||
final View rootView = inflater.inflate(R.layout.fragment_recent, container, false); |
|||
|
|||
// Set the adapter
|
|||
if (rootView instanceof RelativeLayout) { |
|||
progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); |
|||
forumAdapter = new ForumAdapter(topicSummaries, mListener); |
|||
|
|||
CustomRecyclerView recyclerView = (CustomRecyclerView) rootView.findViewById(R.id.list); |
|||
recyclerView.setLayoutManager(new LinearLayoutManager(rootView.findViewById(R.id.list).getContext())); |
|||
recyclerView.setAdapter(forumAdapter); |
|||
|
|||
swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swiperefresh); |
|||
swipeRefreshLayout.setOnRefreshListener( |
|||
new SwipeRefreshLayout.OnRefreshListener() { |
|||
@Override |
|||
public void onRefresh() { |
|||
new RecentTask().execute(); |
|||
|
|||
} |
|||
|
|||
} |
|||
); |
|||
|
|||
|
|||
} |
|||
|
|||
return rootView; |
|||
} |
|||
|
|||
@Override |
|||
public void onAttach(Context context) { |
|||
super.onAttach(context); |
|||
if (context instanceof OnListFragmentInteractionListener) { |
|||
mListener = (OnListFragmentInteractionListener) context; |
|||
|
|||
} else { |
|||
throw new RuntimeException(context.toString() |
|||
+ " must implement OnFragmentInteractionListener"); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void onDetach() { |
|||
super.onDetach(); |
|||
mListener = null; |
|||
} |
|||
|
|||
/** |
|||
* This interface must be implemented by activities that contain this |
|||
* fragment to allow an interaction in this fragment to be communicated |
|||
* to the activity and potentially other fragments contained in that |
|||
* activity. |
|||
*/ |
|||
public interface OnListFragmentInteractionListener { |
|||
// TODO: Update argument type and name
|
|||
void onFragmentInteraction(TopicSummary topicSummary); |
|||
} |
|||
|
|||
//---------------------------------------ASYNC TASK-----------------------------------
|
|||
|
|||
public class RecentTask extends AsyncTask<Void, Void, Integer> { |
|||
private static final String TAG = "RecentTask"; |
|||
private final HttpUrl thmmyUrl = SessionManager.indexUrl; |
|||
|
|||
private Document document; |
|||
|
|||
|
|||
protected void onPreExecute() { |
|||
|
|||
progressBar.setVisibility(ProgressBar.VISIBLE); |
|||
} |
|||
|
|||
protected Integer doInBackground(Void... voids) { |
|||
|
|||
Request request = new Request.Builder() |
|||
.url(thmmyUrl) |
|||
.build(); |
|||
try { |
|||
Response response = client.newCall(request).execute(); |
|||
document = Jsoup.parse(response.body().string()); |
|||
parse(document); |
|||
return 0; |
|||
} catch (IOException e) { |
|||
Log.d("DEB", "ERROR", e); |
|||
return 1; |
|||
} catch (Exception e) { |
|||
Log.d("DEB", "ERROR", e); |
|||
return 2; |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
protected void onPostExecute(Integer result) { |
|||
|
|||
if (result == 0) |
|||
forumAdapter.notifyDataSetChanged(); |
|||
else if (result == 1) |
|||
Toast.makeText(getActivity(), "Network error", Toast.LENGTH_SHORT).show(); |
|||
|
|||
progressBar.setVisibility(ProgressBar.INVISIBLE); |
|||
swipeRefreshLayout.setRefreshing(false); |
|||
} |
|||
|
|||
private void parse(Document document) { |
|||
Elements recent = document.select("#block8 :first-child div"); |
|||
if (recent.size() == 30) { |
|||
topicSummaries.clear(); |
|||
|
|||
for (int i = 0; i < recent.size(); i += 3) { |
|||
String link = recent.get(i).child(0).attr("href"); |
|||
String title = recent.get(i).child(0).attr("title"); |
|||
|
|||
String lastUser = recent.get(i + 1).text(); |
|||
Pattern pattern = Pattern.compile("\\b (.*)"); |
|||
Matcher matcher = pattern.matcher(lastUser); |
|||
if (matcher.find()) |
|||
lastUser = matcher.group(1); |
|||
else { |
|||
Log.e(TAG, "Parsing failed (lastUser)!"); |
|||
return; |
|||
} |
|||
|
|||
String dateTime = recent.get(i + 2).text(); |
|||
pattern = Pattern.compile("\\[(.*)\\]"); |
|||
matcher = pattern.matcher(dateTime); |
|||
if (matcher.find()) |
|||
dateTime = matcher.group(1); |
|||
else { |
|||
Log.e(TAG, "Parsing failed (dateTime)!"); |
|||
return; |
|||
} |
|||
|
|||
|
|||
topicSummaries.add(new TopicSummary(link, title, lastUser, dateTime)); |
|||
} |
|||
|
|||
return; |
|||
} |
|||
Log.e(TAG, "Parsing failed!"); |
|||
} |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue