From dc0506a5acc3dc45630c0dd8434169852d6b7c78 Mon Sep 17 00:00:00 2001 From: Ezerous Date: Thu, 29 Jun 2017 16:14:31 +0300 Subject: [PATCH] More ParseTask stuff --- .../activities/board/BoardActivity.java | 66 ++++++++----------- .../activities/main/forum/ForumFragment.java | 60 ++++++----------- .../main/recent/RecentFragment.java | 14 +--- .../activities/topic/TopicActivity.java | 7 +- .../thmmy/mthmmy/session/SessionManager.java | 4 +- .../java/gr/thmmy/mthmmy/utils/ParseTask.java | 25 ++++++- 6 files changed, 74 insertions(+), 102 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java index 57a97093..d25a2340 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java @@ -13,7 +13,6 @@ import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.Toast; -import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; @@ -21,17 +20,15 @@ import org.jsoup.select.Elements; import java.util.ArrayList; import java.util.Objects; -import javax.net.ssl.SSLHandshakeException; - import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.base.BaseActivity; import gr.thmmy.mthmmy.model.Board; import gr.thmmy.mthmmy.model.Bookmark; import gr.thmmy.mthmmy.model.ThmmyPage; import gr.thmmy.mthmmy.model.Topic; +import gr.thmmy.mthmmy.utils.ParseTask; +import gr.thmmy.mthmmy.utils.exceptions.ParseException; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; -import okhttp3.Request; -import okhttp3.Response; import timber.log.Timber; public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMoreListener { @@ -176,47 +173,15 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo *

BoardTask's {@link AsyncTask#execute execute} method needs a boards's url as String * parameter!

*/ - private class BoardTask extends AsyncTask { + private class BoardTask extends ParseTask { @Override protected void onPreExecute() { if (!isLoadingMore) progressBar.setVisibility(ProgressBar.VISIBLE); if (newTopicFAB.getVisibility() != View.GONE) newTopicFAB.setEnabled(false); } - @Override - protected Void doInBackground(String... boardUrl) { - Request request = new Request.Builder() - .url(boardUrl[0]) - .build(); - try { - Response response = client.newCall(request).execute(); - parseBoard(Jsoup.parse(response.body().string())); - } catch (SSLHandshakeException e) { - Timber.w("Certificate problem (please switch to unsafe connection)."); - } catch (Exception e) { - Timber.e(e, "Exception"); - } - return null; - } - - @Override - protected void onPostExecute(Void voids) { - if (boardTitle == null || Objects.equals(boardTitle, "") - || !Objects.equals(boardTitle, parsedTitle)) { - boardTitle = parsedTitle; - toolbar.setTitle(boardTitle); - thisPageBookmark = new Bookmark(boardTitle, ThmmyPage.getBoardId(boardUrl)); - } - - //Parse was successful - ++pagesLoaded; - if (newTopicFAB.getVisibility() != View.GONE) newTopicFAB.setEnabled(true); - progressBar.setVisibility(ProgressBar.INVISIBLE); - boardAdapter.notifyDataSetChanged(); - isLoadingMore = false; - } - - private void parseBoard(Document boardPage) { + @Override //TODO should throw ParseException + public void parse(Document boardPage) throws ParseException { parsedTitle = boardPage.select("div.nav a.nav").last().text(); //Removes loading item @@ -320,5 +285,26 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo } } } + + @Override + protected void postParsing(ResultCode result) { + //TODO if (result == ResultCode.SUCCESS)... + if (boardTitle == null || Objects.equals(boardTitle, "") + || !Objects.equals(boardTitle, parsedTitle)) { + boardTitle = parsedTitle; + toolbar.setTitle(boardTitle); + thisPageBookmark = new Bookmark(boardTitle, ThmmyPage.getBoardId(boardUrl)); + } + + //Parse was successful + ++pagesLoaded; + if (newTopicFAB.getVisibility() != View.GONE) newTopicFAB.setEnabled(true); + progressBar.setVisibility(ProgressBar.INVISIBLE); + boardAdapter.notifyDataSetChanged(); + isLoadingMore = false; + } + + } + } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java index 8ca74bdb..b8e3c140 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/forum/ForumFragment.java @@ -10,16 +10,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.RelativeLayout; -import android.widget.Toast; import com.bignerdranch.expandablerecyclerview.ExpandableRecyclerAdapter; -import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -29,12 +26,11 @@ import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.Board; import gr.thmmy.mthmmy.model.Category; import gr.thmmy.mthmmy.session.SessionManager; +import gr.thmmy.mthmmy.utils.ParseTask; import gr.thmmy.mthmmy.utils.exceptions.ParseException; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; - import okhttp3.HttpUrl; import okhttp3.Request; -import okhttp3.Response; import timber.log.Timber; /** @@ -153,9 +149,8 @@ public class ForumFragment extends BaseFragment //---------------------------------------ASYNC TASK----------------------------------- - private class ForumTask extends AsyncTask { + private class ForumTask extends ParseTask { private HttpUrl forumUrl = SessionManager.forumUrl; //may change upon collapse/expand - private Document document; private final List fetchedCategories; @@ -167,43 +162,16 @@ public class ForumFragment extends BaseFragment progressBar.setVisibility(ProgressBar.VISIBLE); } - protected Integer doInBackground(Void... voids) { - Request request = new Request.Builder() + @Override + protected Request prepareRequest(String... params) { + return new Request.Builder() .url(forumUrl) .build(); - try { - Response response = client.newCall(request).execute(); - document = Jsoup.parse(response.body().string()); - parse(document); - categories.clear(); - categories.addAll(fetchedCategories); - fetchedCategories.clear(); - return 0; - } catch (ParseException e) { - Timber.e(e, "ParseException"); - return 1; - } catch (IOException e) { - Timber.i(e, "Network Error"); - return 2; - } catch (Exception e) { - Timber.e(e, "Exception"); - return 3; - } - } - protected void onPostExecute(Integer result) { - - if (result == 0) - forumAdapter.notifyParentDataSetChanged(false); - else if (result == 2) - Toast.makeText(getActivity(), "Network error", Toast.LENGTH_SHORT).show(); - - progressBar.setVisibility(ProgressBar.INVISIBLE); - } - - private void parse(Document document) throws ParseException { + @Override + public void parse(Document document) throws ParseException { Elements categoryBlocks = document.select(".tborder:not([style])>table[cellpadding=5]"); if (categoryBlocks.size() != 0) { for(Element categoryBlock: categoryBlocks) @@ -229,9 +197,21 @@ public class ForumFragment extends BaseFragment } else throw new ParseException("Parsing failed"); + + categories.clear(); + categories.addAll(fetchedCategories); + fetchedCategories.clear(); + } + + @Override + protected void postParsing(ParseTask.ResultCode result) { + if (result == ResultCode.SUCCESS) + forumAdapter.notifyParentDataSetChanged(false); + + progressBar.setVisibility(ProgressBar.INVISIBLE); } - public void setUrl(String string) + public void setUrl(String string) //TODO delete and simplify e.g. in prepareRequest possible? { forumUrl = HttpUrl.parse(string); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index 8f4a9663..293338d2 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -10,7 +10,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.RelativeLayout; -import android.widget.Toast; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; @@ -28,7 +27,6 @@ import gr.thmmy.mthmmy.utils.CustomRecyclerView; import gr.thmmy.mthmmy.utils.ParseTask; import gr.thmmy.mthmmy.utils.exceptions.ParseException; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; -import okhttp3.Request; import timber.log.Timber; @@ -143,13 +141,6 @@ public class RecentFragment extends BaseFragment { progressBar.setVisibility(ProgressBar.VISIBLE); } - @Override - protected Request prepareRequest(String... strings) { - return new Request.Builder() - .url(strings[0]) - .build(); - } - @Override public void parse(Document document) throws ParseException { @@ -187,12 +178,9 @@ public class RecentFragment extends BaseFragment { @Override - protected void onPostExecute(ParseTask.ResultCode result) { - + protected void postParsing(ParseTask.ResultCode result) { if (result == ResultCode.SUCCESS) recentAdapter.notifyDataSetChanged(); - else if (result == ResultCode.NETWORK_ERROR) - Toast.makeText(getActivity(), "Network error", Toast.LENGTH_SHORT).show(); //Fixme, sometimes activity isn't ready progressBar.setVisibility(ProgressBar.INVISIBLE); swipeRefreshLayout.setRefreshing(false); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java index 74dcadac..c959d091 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java @@ -49,7 +49,6 @@ import gr.thmmy.mthmmy.model.Post; import gr.thmmy.mthmmy.model.ThmmyPage; import gr.thmmy.mthmmy.utils.ParseHelpers; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; - import okhttp3.MultipartBody; import okhttp3.Request; import okhttp3.RequestBody; @@ -698,10 +697,10 @@ public class TopicActivity extends BaseActivity { //subject = document.select("input[name=subject]").first().attr("value"); topic = document.select("input[name=topic]").first().attr("value"); } catch (IOException e) { - Timber.e("Post failed.", e); + Timber.e(e,"Post failed."); return false; } catch (Selector.SelectorParseException e) { - Timber.e("Post failed.", e); + Timber.e(e,"Post failed."); return false; } @@ -735,7 +734,7 @@ public class TopicActivity extends BaseActivity { return true; } } catch (IOException e) { - Timber.e("Post failed.", e); + Timber.e(e,"Post failed."); return false; } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java b/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java index 93b37b46..b5b56bfe 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java +++ b/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java @@ -317,7 +317,7 @@ public class SessionManager { if (userName != null && !userName.isEmpty()) return userName; - Timber.e("ParseException", new ParseException("Parsing failed(username extraction)")); + Timber.e(new ParseException("Parsing failed(username extraction)"),"ParseException"); return "User"; //return a default username } @@ -341,7 +341,7 @@ public class SessionManager { if (link != null && !link.isEmpty()) return link; } - Timber.e("ParseException", new ParseException("Parsing failed(logoutLink extraction)")); + Timber.e(new ParseException("Parsing failed(logoutLink extraction)"),"ParseException"); return "https://www.thmmy.gr/smf/index.php?action=logout"; //return a default link } //----------------------------------OTHER FUNCTIONS END----------------------------------------- diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/ParseTask.java b/app/src/main/java/gr/thmmy/mthmmy/utils/ParseTask.java index cd85ce20..9ce5a882 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/ParseTask.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/ParseTask.java @@ -1,6 +1,7 @@ package gr.thmmy.mthmmy.utils; import android.os.AsyncTask; +import android.widget.Toast; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -9,16 +10,30 @@ import java.io.IOException; import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.utils.exceptions.ParseException; - import okhttp3.Request; import okhttp3.Response; import timber.log.Timber; +/** + * An {@link AsyncTask} class to be inherited for asynchronous parsing. + * Do NOT override doInBackground() and onPostExecute directly. + * Default usage while executing is ParseTask.execute(urlToParse), however feel free to override + * and modify prepareRequest() as needed. + */ public abstract class ParseTask extends AsyncTask { protected enum ResultCode { SUCCESS, PARSING_ERROR, NETWORK_ERROR, OTHER_ERROR } + protected abstract void parse (Document document) throws ParseException; + protected abstract void postParsing (ParseTask.ResultCode result); //ResultCode.NETWORK_ERROR is handled automatically + + protected Request prepareRequest(String... params) { + return new Request.Builder() + .url(params[0]) + .build(); + } + @Override protected ResultCode doInBackground(String... params) { Request request = prepareRequest(params); @@ -42,7 +57,11 @@ public abstract class ParseTask extends AsyncTask