diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/base/BaseActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/base/BaseActivity.java index 16483ea2..4794cf9e 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/base/BaseActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/base/BaseActivity.java @@ -4,7 +4,6 @@ import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java index 92e505cb..c68befd8 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/ProfileActivity.java @@ -125,8 +125,7 @@ public class ProfileActivity extends BaseActivity implements LatestPostsFragment .transform(new CircleTransform()) .into(thumbnailView); usernameView = (TextView) findViewById(R.id.profile_activity_username); - if (username == null || Objects.equals(username, "")) usernameView.setText("Username"); - else usernameView.setText(username); + if (username != null && !Objects.equals(username, "")) usernameView.setText(username); personalTextView = (TextView) findViewById(R.id.profile_activity_personal_text); viewPager = (ViewPager) findViewById(R.id.profile_tab_container); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/latestPosts/LatestPostsFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/latestPosts/LatestPostsFragment.java index 99b52db1..01786f3b 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/latestPosts/LatestPostsFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/latestPosts/LatestPostsFragment.java @@ -48,7 +48,6 @@ public class LatestPostsFragment extends BaseFragment implements LatestPostsAdap * are added in {@link LatestPostsTask}. */ private ArrayList parsedTopicSummaries; - private RecyclerView mainContent; private LatestPostsAdapter latestPostsAdapter; private int numberOfPages = -1; private int pagesLoaded = 0; @@ -90,7 +89,7 @@ public class LatestPostsFragment extends BaseFragment implements LatestPostsAdap Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_latest_posts, container, false); latestPostsAdapter = new LatestPostsAdapter(fragmentInteractionListener, parsedTopicSummaries); - mainContent = (RecyclerView) rootView.findViewById(R.id.profile_latest_posts_recycler); + RecyclerView mainContent = (RecyclerView) rootView.findViewById(R.id.profile_latest_posts_recycler); mainContent.setAdapter(latestPostsAdapter); final LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); mainContent.setLayoutManager(layoutManager); @@ -193,9 +192,7 @@ public class LatestPostsFragment extends BaseFragment implements LatestPostsAdap } //Parse was successful progressBar.setVisibility(ProgressBar.INVISIBLE); - latestPostsAdapter = new LatestPostsAdapter(fragmentInteractionListener, parsedTopicSummaries); - mainContent.swapAdapter(latestPostsAdapter, false); - //latestPostsAdapter.notifyDataSetChanged(); + latestPostsAdapter.notifyDataSetChanged(); isLoadingMore = 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 85766993..0a2d1e66 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 @@ -23,13 +23,13 @@ import org.jsoup.nodes.Document; import java.io.IOException; import java.util.ArrayList; -import java.util.List; import java.util.Objects; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.activities.LoginActivity; import gr.thmmy.mthmmy.activities.base.BaseActivity; import gr.thmmy.mthmmy.model.Post; +import gr.thmmy.mthmmy.utils.ParseHelpers; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; import mthmmy.utils.Report; import okhttp3.Request; @@ -58,7 +58,8 @@ public class TopicActivity extends BaseActivity { public static final String BUNDLE_TOPIC_TITLE = "TOPIC_TITLE"; private static TopicTask topicTask; //About posts - private List postsList; + private TopicAdapter topicAdapter; + private ArrayList postsList; private static final int NO_POST_FOCUS = -1; private static int postFocus = NO_POST_FOCUS; private static int postFocusPosition = 0; @@ -119,8 +120,9 @@ public class TopicActivity extends BaseActivity { recyclerView.setHasFixedSize(true); LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(layoutManager); - recyclerView.setAdapter(new TopicAdapter(getApplicationContext(), progressBar, postsList, - new TopicTask())); + topicAdapter = new TopicAdapter(getApplicationContext(), progressBar, postsList, + topicTask); + recyclerView.setAdapter(topicAdapter); replyFAB = (FloatingActionButton) findViewById(R.id.topic_fab); //TODO hide fab while logged out replyFAB.setEnabled(false); @@ -383,11 +385,7 @@ public class TopicActivity extends BaseActivity { switch (parseResult) { case SUCCESS: progressBar.setVisibility(ProgressBar.INVISIBLE); - - - recyclerView.swapAdapter(new TopicAdapter(getApplicationContext(), progressBar, - postsList, new TopicTask()), false); - + topicAdapter.customNotifyDataSetChanged(); replyFAB.setEnabled(true); //Set current page @@ -421,7 +419,7 @@ public class TopicActivity extends BaseActivity { * @see org.jsoup.Jsoup Jsoup */ private void parse(Document topic) { - String language = TopicParser.defineLanguage(topic); + ParseHelpers.Language language = ParseHelpers.Language.getLanguage(topic); //Finds topic title if missing if (topicTitle == null || Objects.equals(topicTitle, "")) { @@ -448,7 +446,9 @@ public class TopicActivity extends BaseActivity { } } - postsList = TopicParser.parseTopic(topic, language); + postsList.clear(); + postsList.addAll(TopicParser.parseTopic(topic, language)); + //postsList = TopicParser.parseTopic(topic, language); } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java index 64278cab..dae50a99 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java @@ -425,6 +425,15 @@ class TopicAdapter extends RecyclerView.Adapter { holder.post.setOnTouchListener(new CustomTouchListener(holder.post, holder.cardView)); } + void customNotifyDataSetChanged() { + viewProperties.clear(); + for (int i = 0; i < postsList.size(); ++i) { + //Initializes properties, array's values will be false by default + viewProperties.add(new boolean[3]); + } + notifyDataSetChanged(); + } + @Override public int getItemCount() { return postsList.size(); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java index 34066a3c..538dec17 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java @@ -21,23 +21,13 @@ import mthmmy.utils.Report; /** * Singleton used for parsing a topic. - *

Class contains the methods:

  • {@link #parseUsersViewingThisTopic(Document, String)}
  • - *
  • {@link #parseCurrentPageIndex(Document, String)}
  • - *
  • {@link #parseTopicNumberOfPages(Document, int, String)}
  • - *
  • {@link #parseTopic(Document, String)}
  • - *
  • {@link #defineLanguage(Document)}

+ *

Class contains the methods:

  • {@link #parseUsersViewingThisTopic(Document, + * gr.thmmy.mthmmy.utils.ParseHelpers.Language)}
  • + *
  • {@link #parseCurrentPageIndex(Document, gr.thmmy.mthmmy.utils.ParseHelpers.Language)}
  • + *
  • {@link #parseTopicNumberOfPages(Document, int, gr.thmmy.mthmmy.utils.ParseHelpers.Language)}
  • + *
  • {@link #parseTopic(Document, gr.thmmy.mthmmy.utils.ParseHelpers.Language)}
  • */ class TopicParser { - //Languages supported - /** - * String constant containing one of the supported forum languages - */ - private static final String LANGUAGE_GREEK = "Greek"; - /** - * String constant containing one of the supported forum languages - */ - private static final String LANGUAGE_ENGLISH = "English"; - //User colors private static final int USER_COLOR_BLACK = Color.parseColor("#000000"); private static final int USER_COLOR_RED = Color.parseColor("#F44336"); @@ -56,13 +46,14 @@ class TopicParser { * Returns users currently viewing this topic. * * @param topic {@link Document} object containing this topic's source code - * @param language a String containing this topic's language set, this is returned by - * {@link #defineLanguage(Document)} + * @param language a {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language} containing this topic's + * language set, this is returned by + * {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language#getLanguage(Document)} * @return String containing html with the usernames of users * @see org.jsoup.Jsoup Jsoup */ - static String parseUsersViewingThisTopic(Document topic, String language) { - if (Objects.equals(language, LANGUAGE_GREEK)) + static String parseUsersViewingThisTopic(Document topic, ParseHelpers.Language language) { + if (language.is(ParseHelpers.Language.GREEK)) return topic.select("td:containsOwn(διαβάζουν αυτό το θέμα)").first().html(); return topic.select("td:containsOwn(are viewing this topic)").first().html(); } @@ -71,15 +62,16 @@ class TopicParser { * Returns current topic's page index. * * @param topic {@link Document} object containing this topic's source code - * @param language a String containing this topic's language set, this is returned by - * {@link #defineLanguage(Document)} + * @param language a {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language} containing this topic's + * language set, this is returned by + * {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language#getLanguage(Document)} * @return int containing parsed topic's current page * @see org.jsoup.Jsoup Jsoup */ - static int parseCurrentPageIndex(Document topic, String language) { + static int parseCurrentPageIndex(Document topic, ParseHelpers.Language language) { int parsedPage = 1; - if (Objects.equals(language, LANGUAGE_GREEK)) { + if (language.is(ParseHelpers.Language.GREEK)) { Elements findCurrentPage = topic.select("td:contains(Σελίδες:)>b"); for (Element item : findCurrentPage) { @@ -108,15 +100,16 @@ class TopicParser { * * @param topic {@link Document} object containing this topic's source code * @param currentPage an int containing current page of this topic - * @param language a String containing this topic's language set, this is returned by - * {@link #defineLanguage(Document)} + * @param language a {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language} containing this topic's + * language set, this is returned by + * {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language#getLanguage(Document)} * @return int containing the number of pages * @see org.jsoup.Jsoup Jsoup */ - static int parseTopicNumberOfPages(Document topic, int currentPage, String language) { + static int parseTopicNumberOfPages(Document topic, int currentPage, ParseHelpers.Language language) { int returnPages = 1; - if (Objects.equals(language, LANGUAGE_GREEK)) { + if (language.is(ParseHelpers.Language.GREEK)) { Elements pages = topic.select("td:contains(Σελίδες:)>a.navPages"); if (pages.size() != 0) { @@ -145,19 +138,20 @@ class TopicParser { * This method parses all the information of a topic and it's posts. * * @param topic {@link Document} object containing this topic's source code - * @param language a String containing this topic's language set, this is returned by - * {@link #defineLanguage(Document)} + * @param language a {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language} containing this topic's + * language set, this is returned by + * {@link gr.thmmy.mthmmy.utils.ParseHelpers.Language#getLanguage(Document)} * @return {@link ArrayList} of {@link Post}s * @see org.jsoup.Jsoup Jsoup */ - static ArrayList parseTopic(Document topic, String language) { + static ArrayList parseTopic(Document topic, ParseHelpers.Language language) { //Method's variables final int NO_INDEX = -1; ArrayList parsedPostsList = new ArrayList<>(); Elements postRows; //Each row is a post - if (Objects.equals(language, LANGUAGE_GREEK)) + if (language.is(ParseHelpers.Language.GREEK)) postRows = topic.select("form[id=quickModForm]>table>tbody>tr:matches(στις)"); else { postRows = topic.select("form[id=quickModForm]>table>tbody>tr:matches(on)"); @@ -213,7 +207,7 @@ class TopicParser { //Language dependent parsing Element userName; - if (Objects.equals(language, LANGUAGE_GREEK)) { + if (language.is(ParseHelpers.Language.GREEK)) { //Finds username and profile's url userName = thisRow.select("a[title^=Εμφάνιση προφίλ του μέλους]").first(); if (userName == null) { //Deleted profile @@ -343,7 +337,7 @@ class TopicParser { Element usersExtraInfo = userName.parent().nextElementSibling(); //Get sibling "div" List infoList = Arrays.asList(usersExtraInfo.html().split("
    ")); - if (Objects.equals(language, LANGUAGE_GREEK)) { + if (language.is(ParseHelpers.Language.GREEK)) { for (String line : infoList) { if (line.contains("Μηνύματα:")) { postsLineIndex = infoList.indexOf(line); @@ -423,23 +417,6 @@ class TopicParser { return parsedPostsList; } - /** - * Returns one of the supported forum languages. - *

    Forum supports:

    • {@link #LANGUAGE_ENGLISH}
    • - *
    • {@link #LANGUAGE_GREEK}

    - * - * @param topic {@link Document} object containing this topic's source code - * @return String containing the language of a topic - * @see org.jsoup.Jsoup Jsoup - */ - static String defineLanguage(Document topic) { - if (topic.select("h3").text().contains("Καλώς ορίσατε")) { - return LANGUAGE_GREEK; - } else { //Default is english (eg. guest's language) - return LANGUAGE_ENGLISH; - } - } - /** * Returns the color of a user according to user's rank on forum. * diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/Category.java b/app/src/main/java/gr/thmmy/mthmmy/model/Category.java index 648c0bb9..ce43c42d 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/Category.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/Category.java @@ -12,7 +12,7 @@ public class Category implements Parent private final String title; private final String categoryURL; private boolean expanded = false; - private List boards; + private final List boards; public Category(String title, String categoryURL) { this.title = title; diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/ParseHelpers.java b/app/src/main/java/gr/thmmy/mthmmy/utils/ParseHelpers.java index 24fb958e..83da1c7c 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/ParseHelpers.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/ParseHelpers.java @@ -1,5 +1,6 @@ package gr.thmmy.mthmmy.utils; +import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; @@ -8,6 +9,52 @@ import java.util.ArrayList; public class ParseHelpers { private static final String TAG = "ParseHelpers"; + public enum Language { + GREEK, ENGLISH, ENGLISH_GUEST, PAGE_INCOMPLETE, UNDEFINED_LANGUAGE; + + /** + * Returns one of the supported forum languages. + *

    Forum supports:

    • {@link #ENGLISH}
    • + *
    • {@link #GREEK}

    + * + * @param page {@link Document} object containing this page's source code + * @return String containing the language of a topic + * @see org.jsoup.Jsoup Jsoup + */ + public static Language getLanguage(Document page) { + Element welcoming = page.select("h3").first(); + if (welcoming == null) { + if (page.select("div[id=myuser]").first().text().contains("Welcome")) + return ENGLISH_GUEST; + return PAGE_INCOMPLETE; + } else if (welcoming.text().contains("Καλώς ορίσατε")) return GREEK; + else if (welcoming.text().contains("Hey")) return ENGLISH; + else return UNDEFINED_LANGUAGE; + } + + public boolean is(Language other) { + return this == ENGLISH && other == ENGLISH_GUEST || + this == ENGLISH_GUEST && other == ENGLISH || + this == other; + } + } + + public enum State { + UNAUTHORIZED_OR_MISSING, NEW_PM, READY; + + public static State getState(Document page) { + Elements warnings = page.select("form[id=frmLogin] tr.catbg~tr>td.windowbg"); + if (warnings != null) { + for (Element warning : warnings) { + if (warning.text().contains("The topic or board you are looking for appears " + + "to be either missing or off limits to you.")) + return UNAUTHORIZED_OR_MISSING; + } + } + return READY; + } + } + public static String youtubeEmbeddedFix(Element html) { //Fixes embedded videos Elements noembedTag = html.select("noembed"); diff --git a/app/src/main/res/layout-v21/activity_profile.xml b/app/src/main/res/layout-v21/activity_profile.xml index 288ac7ba..9c057147 100644 --- a/app/src/main/res/layout-v21/activity_profile.xml +++ b/app/src/main/res/layout-v21/activity_profile.xml @@ -68,6 +68,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:text="@string/username" android:textColor="@color/accent" android:textSize="25sp"/> diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 51b3db32..ea3999e3 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -67,6 +67,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:text="@string/username" android:textColor="@color/accent" android:textSize="25sp"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7226450f..dc72f670 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,7 +25,6 @@ Last post Topics Subject - Locked/Sticky Started by: %1$s Stats Last post on: %1$s @@ -44,6 +43,7 @@ last + Username General Statistics Statistics Posting Activity