From 49d25314d561e8f01b4d3c5dad5fdf95babad287 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Tue, 1 Jan 2019 23:32:03 +0800 Subject: Display user name and user icon in each post when loading posts in specific subreddits. --- .../main/java/SubredditDatabase/SubredditDao.java | 2 +- app/src/main/java/User/FetchUserData.java | 50 ++++ app/src/main/java/User/ParseUserData.java | 72 ++++++ app/src/main/java/User/User.java | 58 +++++ app/src/main/java/User/UserDao.java | 18 ++ app/src/main/java/User/UserData.java | 4 - app/src/main/java/User/UserRoomDatabase.java | 26 +++ .../infinityforreddit/FetchMyInfo.java | 42 ++++ .../infinityforreddit/FetchUserInfo.java | 42 ---- .../infinityforreddit/InsertUserDataAsyncTask.java | 36 +++ .../infinityforreddit/JSONUtils.java | 18 +- .../infinityforreddit/LoadUserDataAsyncTask.java | 64 ++++++ .../infinityforreddit/MainActivity.java | 12 +- .../infinityforreddit/ParseMyInfo.java | 68 ++++++ .../infinityforreddit/ParsePost.java | 32 +-- .../infinityforreddit/ParseUserInfo.java | 66 ------ .../ml/docilealligator/infinityforreddit/Post.java | 37 ++- .../infinityforreddit/PostRecyclerViewAdapter.java | 251 ++++++++++++++------- .../infinityforreddit/RedditAPI.java | 4 +- .../infinityforreddit/RedditUtils.java | 4 +- .../infinityforreddit/SharedPreferencesUtils.java | 4 +- .../ViewSubredditDetailActivity.java | 2 +- 22 files changed, 671 insertions(+), 241 deletions(-) create mode 100644 app/src/main/java/User/FetchUserData.java create mode 100644 app/src/main/java/User/ParseUserData.java create mode 100644 app/src/main/java/User/User.java create mode 100644 app/src/main/java/User/UserDao.java delete mode 100644 app/src/main/java/User/UserData.java create mode 100644 app/src/main/java/User/UserRoomDatabase.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java delete mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/InsertUserDataAsyncTask.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/LoadUserDataAsyncTask.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/ParseMyInfo.java delete mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserInfo.java (limited to 'app') diff --git a/app/src/main/java/SubredditDatabase/SubredditDao.java b/app/src/main/java/SubredditDatabase/SubredditDao.java index 9b2fcabb..e7b564f7 100644 --- a/app/src/main/java/SubredditDatabase/SubredditDao.java +++ b/app/src/main/java/SubredditDatabase/SubredditDao.java @@ -20,6 +20,6 @@ public interface SubredditDao { @Query("SELECT * from subreddits WHERE name = :namePrefixed") LiveData getSubredditLiveDataByNamePrefixed(String namePrefixed); - @Query("SELECT * from subreddits WHERE name = :namePrefixed") + @Query("SELECT * from subreddits WHERE name = :namePrefixed LIMIT 1") SubredditData getSubredditData(String namePrefixed); } diff --git a/app/src/main/java/User/FetchUserData.java b/app/src/main/java/User/FetchUserData.java new file mode 100644 index 00000000..edaa3b14 --- /dev/null +++ b/app/src/main/java/User/FetchUserData.java @@ -0,0 +1,50 @@ +package User; + +import android.support.annotation.NonNull; +import android.util.Log; + +import ml.docilealligator.infinityforreddit.RedditAPI; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Retrofit; + +public class FetchUserData { + public interface FetchUserDataListener { + void onFetchUserDataSuccess(User user); + void onFetchUserDataFail(); + } + + public static void fetchUserData(final Retrofit retrofit, String userName, + final FetchUserDataListener fetchUserDataListener) { + RedditAPI api = retrofit.create(RedditAPI.class); + + Call userInfo = api.getUserData(userName); + userInfo.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + if(response.isSuccessful()) { + ParseUserData.parseMyInfo(response.body(), new ParseUserData.ParseUserDataListener() { + @Override + public void onParseUserDataSuccess(User user) { + fetchUserDataListener.onFetchUserDataSuccess(user); + } + + @Override + public void onParseUserDataFail() { + fetchUserDataListener.onFetchUserDataFail(); + } + }); + } else { + Log.i("call failed", response.message()); + fetchUserDataListener.onFetchUserDataFail(); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.i("call failed", t.getMessage()); + fetchUserDataListener.onFetchUserDataFail(); + } + }); + } +} diff --git a/app/src/main/java/User/ParseUserData.java b/app/src/main/java/User/ParseUserData.java new file mode 100644 index 00000000..b6a7a39c --- /dev/null +++ b/app/src/main/java/User/ParseUserData.java @@ -0,0 +1,72 @@ +package User; + +import android.os.AsyncTask; +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import ml.docilealligator.infinityforreddit.JSONUtils; + +public class ParseUserData { + interface ParseUserDataListener { + void onParseUserDataSuccess(User user); + void onParseUserDataFail(); + } + + static void parseMyInfo(String response, ParseUserDataListener parseUserDataListener) { + new ParseUserDataAsyncTask(response, parseUserDataListener).execute(); + } + + private static class ParseUserDataAsyncTask extends AsyncTask { + private JSONObject jsonResponse; + private ParseUserDataListener parseUserDataListener; + private boolean parseFailed; + + private User user; + + ParseUserDataAsyncTask(String response, ParseUserDataListener parseUserDataListener){ + try { + jsonResponse = new JSONObject(response); + this.parseUserDataListener = parseUserDataListener; + parseFailed = false; + } catch (JSONException e) { + Log.i("user data json error", e.getMessage()); + parseUserDataListener.onParseUserDataFail(); + } + } + + @Override + protected Void doInBackground(Void... voids) { + try { + jsonResponse = jsonResponse.getJSONObject(JSONUtils.DATA_KEY); + String userName = jsonResponse.getString(JSONUtils.NAME_KEY); + String iconImageUrl = jsonResponse.getString(JSONUtils.ICON_IMG_KEY); + String bannerImageUrl = ""; + if(!jsonResponse.isNull(JSONUtils.SUBREDDIT_KEY)) { + bannerImageUrl = jsonResponse.getJSONObject(JSONUtils.SUBREDDIT_KEY).getString(JSONUtils.BANNER_IMG_KEY); + } + int linkKarma = jsonResponse.getInt(JSONUtils.LINK_KARMA_KEY); + int commentKarma = jsonResponse.getInt(JSONUtils.COMMENT_KARMA_KEY); + int karma = linkKarma + commentKarma; + boolean isGold = jsonResponse.getBoolean(JSONUtils.IS_GOLD_KEY); + boolean isFriend = jsonResponse.getBoolean(JSONUtils.IS_FRIEND_KEY); + + user = new User(userName, iconImageUrl, bannerImageUrl, karma, isGold, isFriend); + } catch (JSONException e) { + parseFailed = true; + Log.i("parse user data error", e.getMessage()); + } + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + if(!parseFailed) { + parseUserDataListener.onParseUserDataSuccess(user); + } else { + parseUserDataListener.onParseUserDataFail(); + } + } + } +} diff --git a/app/src/main/java/User/User.java b/app/src/main/java/User/User.java new file mode 100644 index 00000000..3fd8dcb3 --- /dev/null +++ b/app/src/main/java/User/User.java @@ -0,0 +1,58 @@ +package User; + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; +import android.support.annotation.NonNull; + +@Entity(tableName = "users") +public class User { + @PrimaryKey + @NonNull + @ColumnInfo(name = "user_name") + private String userName; + @ColumnInfo(name = "icon") + private String icon; + @ColumnInfo(name = "banner") + private String banner; + @ColumnInfo(name = "karma") + private int karma; + @ColumnInfo(name = "is_gold") + private boolean isGold; + @ColumnInfo(name = "is_friend") + private boolean isFriend; + + User(@NonNull String userName, String icon, String banner, int karma, boolean isGold, boolean isFriend) { + this.userName = userName; + this.icon = icon; + this.banner = banner; + this.karma = karma; + this.isGold = isGold; + this.isFriend = isFriend; + } + + @NonNull + public String getUserName() { + return userName; + } + + public String getIcon() { + return icon; + } + + public String getBanner() { + return banner; + } + + public int getKarma() { + return karma; + } + + public boolean isGold() { + return isGold; + } + + public boolean isFriend() { + return isFriend; + } +} diff --git a/app/src/main/java/User/UserDao.java b/app/src/main/java/User/UserDao.java new file mode 100644 index 00000000..ec6bb7e2 --- /dev/null +++ b/app/src/main/java/User/UserDao.java @@ -0,0 +1,18 @@ +package User; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; +import android.arch.persistence.room.Query; + +@Dao +public interface UserDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insert(User user); + + @Query("DELETE FROM users") + void deleteAllUsers(); + + @Query("SELECT * FROM users WHERE user_name = :userName LIMIT 1") + User getUserData(String userName); +} diff --git a/app/src/main/java/User/UserData.java b/app/src/main/java/User/UserData.java deleted file mode 100644 index 2846cfb6..00000000 --- a/app/src/main/java/User/UserData.java +++ /dev/null @@ -1,4 +0,0 @@ -package User; - -public class UserData { -} diff --git a/app/src/main/java/User/UserRoomDatabase.java b/app/src/main/java/User/UserRoomDatabase.java new file mode 100644 index 00000000..31ca1259 --- /dev/null +++ b/app/src/main/java/User/UserRoomDatabase.java @@ -0,0 +1,26 @@ +package User; + +import android.arch.persistence.room.Database; +import android.arch.persistence.room.Room; +import android.arch.persistence.room.RoomDatabase; +import android.content.Context; + +@Database(entities = {User.class}, version = 1) +public abstract class UserRoomDatabase extends RoomDatabase { + private static UserRoomDatabase INSTANCE; + + public abstract UserDao userDao(); + + public static UserRoomDatabase getDatabase(final Context context) { + if(INSTANCE == null) { + synchronized (UserRoomDatabase.class) { + if(INSTANCE == null) { + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + UserRoomDatabase.class, "users") + .build(); + } + } + } + return INSTANCE; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java new file mode 100644 index 00000000..d638db9c --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java @@ -0,0 +1,42 @@ +package ml.docilealligator.infinityforreddit; + +import android.content.SharedPreferences; +import android.support.annotation.NonNull; +import android.util.Log; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Retrofit; + +class FetchMyInfo { + + interface FetchUserMyListener { + void onFetchMyInfoSuccess(String response); + void onFetchMyInfoFail(); + } + + static void fetchMyInfo(final Retrofit retrofit, SharedPreferences authInfoSharedPreferences, + final FetchUserMyListener fetchUserMyListener) { + RedditAPI api = retrofit.create(RedditAPI.class); + + String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); + Call userInfo = api.getMyInfo(RedditUtils.getOAuthHeader(accessToken)); + userInfo.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + if(response.isSuccessful()) { + fetchUserMyListener.onFetchMyInfoSuccess(response.body()); + } else { + Log.i("call failed", response.message()); + fetchUserMyListener.onFetchMyInfoFail(); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.i("call failed", t.getMessage()); + fetchUserMyListener.onFetchMyInfoFail(); + } + }); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java deleted file mode 100644 index bddfc14e..00000000 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchUserInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -package ml.docilealligator.infinityforreddit; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; -import android.util.Log; - -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Retrofit; - -class FetchUserInfo { - - interface FetchUserInfoListener { - void onFetchUserInfoSuccess(String response); - void onFetchUserInfoFail(); - } - - static void fetchUserInfo(final Retrofit retrofit, SharedPreferences authInfoSharedPreferences, - final FetchUserInfoListener fetchUserInfoListener) { - RedditAPI api = retrofit.create(RedditAPI.class); - - String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); - Call userInfo = api.getUserInfo(RedditUtils.getOAuthHeader(accessToken)); - userInfo.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - if(response.isSuccessful()) { - fetchUserInfoListener.onFetchUserInfoSuccess(response.body()); - } else { - Log.i("call failed", response.message()); - fetchUserInfoListener.onFetchUserInfoFail(); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.i("call failed", t.getMessage()); - fetchUserInfoListener.onFetchUserInfoFail(); - } - }); - } -} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/InsertUserDataAsyncTask.java b/app/src/main/java/ml/docilealligator/infinityforreddit/InsertUserDataAsyncTask.java new file mode 100644 index 00000000..823e014e --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/InsertUserDataAsyncTask.java @@ -0,0 +1,36 @@ +package ml.docilealligator.infinityforreddit; + +import android.os.AsyncTask; + +import User.User; +import User.UserDao; + +public class InsertUserDataAsyncTask extends AsyncTask { + private UserDao userDao; + private User user; + private InsertUserDataCallback insertUserDataCallback; + + public interface InsertUserDataCallback { + void insertSuccess(); + } + + public InsertUserDataAsyncTask(UserDao userDao, User user, InsertUserDataCallback insertUserDataCallback) { + this.userDao = userDao; + this.user = user; + this.insertUserDataCallback = insertUserDataCallback; + } + + @Override + protected Void doInBackground(Void... voids) { + userDao.insert(user); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + super.onPostExecute(aVoid); + if(insertUserDataCallback != null) { + insertUserDataCallback.insertSuccess(); + } + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/JSONUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/JSONUtils.java index 32cbd1bd..163de76d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/JSONUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/JSONUtils.java @@ -4,14 +4,14 @@ package ml.docilealligator.infinityforreddit; * Created by alex on 2/25/18. */ -class JSONUtils { - static final String DATA_KEY = "data"; +public class JSONUtils { + public static final String DATA_KEY = "data"; static final String AFTER_KEY = "after"; static final String MODHASH_KEY = "modhash"; static final String CHILDREN_KEY = "children"; static final String COUNT_KEY = "count"; static final String TITLE_KEY = "title"; - static final String NAME_KEY = "name"; + public static final String NAME_KEY = "name"; static final String SUBREDDIT_NAME_PREFIX_KEY = "subreddit_name_prefixed"; static final String SELFTEXT_HTML_KEY = "selftext_html"; static final String AUTHOR_KEY = "author"; @@ -51,13 +51,13 @@ class JSONUtils { static final String DEPTH_KEY = "depth"; static final String ID_KEY = "id"; static final String SCORE_HIDDEN_KEY = "score_hidden"; - static final String SUBREDDIT_KEY = "subreddit"; - static final String BANNER_IMG_KEY = "banner_img"; + public static final String SUBREDDIT_KEY = "subreddit"; + public static final String BANNER_IMG_KEY = "banner_img"; static final String BANNER_BACKGROUND_IMAGE_KEY = "banner_background_image"; - static final String ICON_IMG_KEY = "icon_img"; + public static final String ICON_IMG_KEY = "icon_img"; static final String COMMUNITY_ICON_KEY = "community_icon"; - static final String LINK_KARMA_KEY = "link_karma"; - static final String COMMENT_KARMA_KEY = "comment_karma"; + public static final String LINK_KARMA_KEY = "link_karma"; + public static final String COMMENT_KARMA_KEY = "comment_karma"; static final String DISPLAY_NAME = "display_name"; static final String SUBREDDIT_TYPE_KEY = "subreddit_type"; static final String SUBREDDIT_TYPE_VALUE_USER = "user"; @@ -66,4 +66,6 @@ class JSONUtils { static final String ACTIVE_USER_COUNT_KEY = "active_user_count"; static final String DISPLAY_NAME_PREFIXED_KEY = "display_name_prefixed"; static final String LINK_ID_KEY = "link_id"; + public static final String IS_GOLD_KEY = "is_gold"; + public static final String IS_FRIEND_KEY = "is_friend"; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/LoadUserDataAsyncTask.java b/app/src/main/java/ml/docilealligator/infinityforreddit/LoadUserDataAsyncTask.java new file mode 100644 index 00000000..be8c182c --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/LoadUserDataAsyncTask.java @@ -0,0 +1,64 @@ +package ml.docilealligator.infinityforreddit; + +import android.os.AsyncTask; + +import User.FetchUserData; +import User.User; +import User.UserDao; +import retrofit2.Retrofit; + +public class LoadUserDataAsyncTask extends AsyncTask { + interface LoadUserDataAsyncTaskListener { + void loadUserDataSuccess(String iconImageUrl); + } + + private UserDao userDao; + private String userName; + private String iconImageUrl; + private boolean hasUserInDb; + private Retrofit retrofit; + private LoadUserDataAsyncTaskListener loadUserDataAsyncTaskListener; + + LoadUserDataAsyncTask(UserDao userDao, String userName, Retrofit retrofit, LoadUserDataAsyncTaskListener loadUserDataAsyncTaskListener) { + this.userDao = userDao; + this.userName = userName; + this.retrofit = retrofit; + this.loadUserDataAsyncTaskListener = loadUserDataAsyncTaskListener; + } + + @Override + protected Void doInBackground(Void... voids) { + if(userDao.getUserData(userName) != null) { + iconImageUrl = userDao.getUserData(userName).getIcon(); + hasUserInDb = true; + } else { + hasUserInDb = false; + } + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + super.onPostExecute(aVoid); + if(hasUserInDb) { + loadUserDataAsyncTaskListener.loadUserDataSuccess(iconImageUrl); + } else { + FetchUserData.fetchUserData(retrofit, userName, new FetchUserData.FetchUserDataListener() { + @Override + public void onFetchUserDataSuccess(User user) { + new InsertUserDataAsyncTask(userDao, user, new InsertUserDataAsyncTask.InsertUserDataCallback() { + @Override + public void insertSuccess() { + loadUserDataAsyncTaskListener.loadUserDataSuccess(user.getIcon()); + } + }).execute(); + } + + @Override + public void onFetchUserDataFail() { + loadUserDataAsyncTaskListener.loadUserDataSuccess(""); + } + }); + } + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index 00ca7f15..773ec885 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -202,12 +202,12 @@ public class MainActivity extends AppCompatActivity { private void loadUserData(Bundle savedInstanceState) { if (savedInstanceState == null) { if (!mFetchUserInfoSuccess) { - FetchUserInfo.fetchUserInfo(mOauthRetrofit, mAuthInfoSharedPreferences, new FetchUserInfo.FetchUserInfoListener() { + FetchMyInfo.fetchMyInfo(mOauthRetrofit, mAuthInfoSharedPreferences, new FetchMyInfo.FetchUserMyListener() { @Override - public void onFetchUserInfoSuccess(String response) { - ParseUserInfo.parseUserInfo(response, new ParseUserInfo.ParseUserInfoListener() { + public void onFetchMyInfoSuccess(String response) { + ParseMyInfo.parseMyInfo(response, new ParseMyInfo.ParseMyInfoListener() { @Override - public void onParseUserInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) { + public void onParseMyInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) { mNameTextView.setText(name); if (!mProfileImageUrl.equals("")) { glide.load(profileImageUrl).into(mProfileImageView); @@ -233,14 +233,14 @@ public class MainActivity extends AppCompatActivity { } @Override - public void onParseUserInfoFail() { + public void onParseMyInfoFail() { mFetchUserInfoSuccess = false; } }); } @Override - public void onFetchUserInfoFail() { + public void onFetchMyInfoFail() { mFetchUserInfoSuccess = false; } }); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseMyInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseMyInfo.java new file mode 100644 index 00000000..87d0a200 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseMyInfo.java @@ -0,0 +1,68 @@ +package ml.docilealligator.infinityforreddit; + +import android.os.AsyncTask; +import android.text.Html; +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +class ParseMyInfo { + interface ParseMyInfoListener { + void onParseMyInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma); + void onParseMyInfoFail(); + } + + static void parseMyInfo(String response, ParseMyInfoListener parseMyInfoListener) { + new ParseMyInfoAsyncTask(response, parseMyInfoListener).execute(); + } + + private static class ParseMyInfoAsyncTask extends AsyncTask { + private JSONObject jsonResponse; + private ParseMyInfoListener parseMyInfoListener; + private boolean parseFailed; + + private String name; + private String profileImageUrl; + private String bannerImageUrl; + private int karma; + + ParseMyInfoAsyncTask(String response, ParseMyInfoListener parseMyInfoListener){ + try { + jsonResponse = new JSONObject(response); + this.parseMyInfoListener = parseMyInfoListener; + parseFailed = false; + } catch (JSONException e) { + Log.i("user info json error", e.getMessage()); + parseMyInfoListener.onParseMyInfoFail(); + } + } + + @Override + protected Void doInBackground(Void... voids) { + try { + name = jsonResponse.getString(JSONUtils.NAME_KEY); + profileImageUrl = Html.fromHtml(jsonResponse.getString(JSONUtils.ICON_IMG_KEY)).toString(); + if(!jsonResponse.isNull(JSONUtils.SUBREDDIT_KEY)) { + bannerImageUrl = Html.fromHtml(jsonResponse.getJSONObject(JSONUtils.SUBREDDIT_KEY).getString(JSONUtils.BANNER_IMG_KEY)).toString(); + } + int linkKarma = jsonResponse.getInt(JSONUtils.LINK_KARMA_KEY); + int commentKarma = jsonResponse.getInt(JSONUtils.COMMENT_KARMA_KEY); + karma = linkKarma + commentKarma; + } catch (JSONException e) { + parseFailed = true; + Log.i("parse comment error", e.getMessage()); + } + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + if(!parseFailed) { + parseMyInfoListener.onParseMyInfoSuccess(name, profileImageUrl, bannerImageUrl, karma); + } else { + parseMyInfoListener.onParseMyInfoFail(); + } + } + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java index f5f2120f..eb404f95 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java @@ -59,6 +59,7 @@ class ParsePost { String id = data.getString(JSONUtils.ID_KEY); String fullName = data.getString(JSONUtils.NAME_KEY); String subredditNamePrefixed = data.getString(JSONUtils.SUBREDDIT_NAME_PREFIX_KEY); + String author = data.getString(JSONUtils.AUTHOR_KEY); long postTime = data.getLong(JSONUtils.CREATED_UTC_KEY) * 1000; String title = data.getString(JSONUtils.TITLE_KEY); int score = data.getInt(JSONUtils.SCORE_KEY); @@ -95,11 +96,11 @@ class ParsePost { //Cross post data = data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0); parseData(data, permalink, newPosts, id, fullName, subredditNamePrefixed, - formattedPostTime, title, previewUrl, previewWidth, previewHeight, + author, formattedPostTime, title, previewUrl, previewWidth, previewHeight, score, voteType, gilded, nsfw, stickied, true, i); } else { parseData(data, permalink, newPosts, id, fullName, subredditNamePrefixed, - formattedPostTime, title, previewUrl, previewWidth, previewHeight, + author, formattedPostTime, title, previewUrl, previewWidth, previewHeight, score, voteType, gilded, nsfw, stickied, false, i); } } @@ -121,9 +122,10 @@ class ParsePost { } private static void parseData(JSONObject data, String permalink, ArrayList bestPostData, - String id, String fullName, String subredditNamePrefixed, String formattedPostTime, - String title, String previewUrl, int previewWidth, int previewHeight ,int score, int voteType, int gilded, - boolean nsfw, boolean stickied, boolean isCrosspost, int i) throws JSONException { + String id, String fullName, String subredditNamePrefixed, String author, + String formattedPostTime, String title, String previewUrl, int previewWidth, + int previewHeight ,int score, int voteType, int gilded, + boolean nsfw, boolean stickied, boolean isCrosspost, int i) throws JSONException { boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY); String url = data.getString(JSONUtils.URL_KEY); @@ -132,7 +134,7 @@ class ParsePost { //Text post Log.i("text", Integer.toString(i)); int postType = Post.TEXT_TYPE; - Post post = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) { post.setSelfText(""); @@ -144,7 +146,7 @@ class ParsePost { //No preview link post Log.i("no preview link", Integer.toString(i)); int postType = Post.NO_PREVIEW_LINK_TYPE; - Post linkPost = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) { @@ -161,7 +163,7 @@ class ParsePost { int postType = Post.VIDEO_TYPE; String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY); - Post videoPost = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post videoPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost, true); @@ -179,7 +181,7 @@ class ParsePost { int postType = Post.GIF_VIDEO_TYPE; String videoUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); String gifDownloadUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); - Post post = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, title, + Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost, false); @@ -197,7 +199,7 @@ class ParsePost { String videoUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY) .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY); - Post post = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, title, + Post post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost, true); @@ -213,7 +215,7 @@ class ParsePost { Log.i("image", Integer.toString(i)); int postType = Post.IMAGE_TYPE; - Post imagePost = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post imagePost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, url, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); @@ -226,7 +228,7 @@ class ParsePost { //Text post but with a preview Log.i("text with image", Integer.toString(i)); int postType = Post.TEXT_TYPE; - Post textWithImagePost = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post textWithImagePost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); textWithImagePost.setPreviewWidth(previewWidth); @@ -242,7 +244,7 @@ class ParsePost { //Link post Log.i("link", Integer.toString(i)); int postType = Post.LINK_TYPE; - Post linkPost = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) { @@ -263,7 +265,7 @@ class ParsePost { //Image post Log.i("CP image", Integer.toString(i)); int postType = Post.IMAGE_TYPE; - Post linkPost = new Post(id, fullName, subredditNamePrefixed, formattedPostTime, + Post linkPost = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); linkPost.setPreviewWidth(previewWidth); @@ -273,7 +275,7 @@ class ParsePost { //CP No Preview Link post Log.i("CP no preview link", Integer.toString(i)); int postType = Post.NO_PREVIEW_LINK_TYPE; - bestPostData.add(new Post(id, fullName, subredditNamePrefixed, formattedPostTime, title, + bestPostData.add(new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title, url, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost)); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserInfo.java deleted file mode 100644 index 40e162df..00000000 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserInfo.java +++ /dev/null @@ -1,66 +0,0 @@ -package ml.docilealligator.infinityforreddit; - -import android.os.AsyncTask; -import android.text.Html; -import android.util.Log; - -import org.json.JSONException; -import org.json.JSONObject; - -class ParseUserInfo { - interface ParseUserInfoListener { - void onParseUserInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma); - void onParseUserInfoFail(); - } - - static void parseUserInfo(String response, ParseUserInfoListener parseUserInfoListener) { - new ParseUserInfoAsyncTask(response, parseUserInfoListener).execute(); - } - - private static class ParseUserInfoAsyncTask extends AsyncTask { - private JSONObject jsonResponse; - private ParseUserInfoListener parseUserInfoListener; - private boolean parseFailed; - - private String name; - private String profileImageUrl; - private String bannerImageUrl; - private int karma; - - ParseUserInfoAsyncTask(String response, ParseUserInfoListener parseUserInfoListener){ - try { - jsonResponse = new JSONObject(response); - this.parseUserInfoListener = parseUserInfoListener; - parseFailed = false; - } catch (JSONException e) { - Log.i("user info json error", e.getMessage()); - parseUserInfoListener.onParseUserInfoFail(); - } - } - - @Override - protected Void doInBackground(Void... voids) { - try { - name = jsonResponse.getString(JSONUtils.NAME_KEY); - profileImageUrl = Html.fromHtml(jsonResponse.getString(JSONUtils.ICON_IMG_KEY)).toString(); - bannerImageUrl = Html.fromHtml(jsonResponse.getJSONObject(JSONUtils.SUBREDDIT_KEY).getString(JSONUtils.BANNER_IMG_KEY)).toString(); - int linkKarma = jsonResponse.getInt(JSONUtils.LINK_KARMA_KEY); - int commentKarma = jsonResponse.getInt(JSONUtils.COMMENT_KARMA_KEY); - karma = linkKarma + commentKarma; - } catch (JSONException e) { - parseFailed = true; - Log.i("parse comment error", e.getMessage()); - } - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - if(!parseFailed) { - parseUserInfoListener.onParseUserInfoSuccess(name, profileImageUrl, bannerImageUrl, karma); - } else { - parseUserInfoListener.onParseUserInfoFail(); - } - } - } -} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java index ab853001..ad08fcbe 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java @@ -19,6 +19,8 @@ class Post implements Parcelable { private String fullName; private String subredditNamePrefixed; private String subredditIconUrl; + private String author; + private String authorIconUrl; private String postTime; private String title; private String selfText; @@ -40,12 +42,13 @@ class Post implements Parcelable { private boolean isDownloadableGifOrVideo; private Post crosspostParentPost; - Post(String id, String fullName, String subredditNamePrefixed, String postTime, String title, - String previewUrl, String permalink, int score, int postType, int voteType, int gilded, - boolean nsfw, boolean stickied, boolean isCrosspost, boolean isDashVideo) { + Post(String id, String fullName, String subredditNamePrefixed, String author, String postTime, + String title, String previewUrl, String permalink, int score, int postType, int voteType, + int gilded, boolean nsfw, boolean stickied, boolean isCrosspost, boolean isDashVideo) { this.id = id; this.fullName = fullName; this.subredditNamePrefixed = subredditNamePrefixed; + this.author = author; this.postTime = postTime; this.title = title; this.previewUrl = previewUrl; @@ -60,12 +63,13 @@ class Post implements Parcelable { this.isDashVideo = isDashVideo; } - Post(String id, String fullName, String subredditNamePrefixed, String postTime, String title, - String previewUrl, String url, String permalink, int score, int postType, int voteType, - int gilded, boolean nsfw, boolean stickied, boolean isCrosspost) { + Post(String id, String fullName, String subredditNamePrefixed, String author, String postTime, + String title, String previewUrl, String url, String permalink, int score, int postType, + int voteType, int gilded, boolean nsfw, boolean stickied, boolean isCrosspost) { this.id = id; this.fullName = fullName; this.subredditNamePrefixed = subredditNamePrefixed; + this.author = author; this.postTime = postTime; this.title = title; this.previewUrl = previewUrl; @@ -80,12 +84,13 @@ class Post implements Parcelable { this.isCrosspost = isCrosspost; } - Post(String id, String fullName, String subredditNamePrefixed, String postTime, String title, - String permalink, int score, int postType, int voteType, int gilded, boolean nsfw, + Post(String id, String fullName, String subredditNamePrefixed, String author, String postTime, + String title, String permalink, int score, int postType, int voteType, int gilded, boolean nsfw, boolean stickied, boolean isCrosspost) { this.id = id; this.fullName = fullName; this.subredditNamePrefixed = subredditNamePrefixed; + this.author = author; this.postTime = postTime; this.title = title; this.permalink = RedditUtils.API_BASE_URI + permalink; @@ -103,6 +108,8 @@ class Post implements Parcelable { fullName = in.readString(); subredditNamePrefixed = in.readString(); subredditIconUrl = in.readString(); + author = in.readString(); + authorIconUrl = in.readString(); postTime = in.readString(); title = in.readString(); selfText = in.readString(); @@ -156,6 +163,18 @@ class Post implements Parcelable { this.subredditIconUrl = subredditIconUrl; } + public String getAuthor() { + return author; + } + + public String getAuthorIconUrl() { + return authorIconUrl; + } + + public void setAuthorIconUrl(String authorIconUrl) { + this.authorIconUrl = authorIconUrl; + } + public String getPostTime() { return postTime; } @@ -279,6 +298,8 @@ class Post implements Parcelable { parcel.writeString(fullName); parcel.writeString(subredditNamePrefixed); parcel.writeString(subredditIconUrl); + parcel.writeString(author); + parcel.writeString(authorIconUrl); parcel.writeString(postTime); parcel.writeString(title); parcel.writeString(selfText); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index f9c3332c..aeec7593 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -38,6 +38,8 @@ import com.bumptech.glide.request.target.Target; import CustomView.AspectRatioGifImageView; import SubredditDatabase.SubredditDao; import SubredditDatabase.SubredditRoomDatabase; +import User.UserDao; +import User.UserRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.BlurTransformation; @@ -54,6 +56,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter { - if(mContext != null && getItemCount() > 0) { - if(!iconImageUrl.equals("")) { - glide.load(iconImageUrl) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon)) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - return false; - } + ((DataViewHolder) holder).cardView.setOnClickListener(view -> { + if(canStartActivity) { + canStartActivity = false; + + Intent intent = new Intent(mContext, ViewPostDetailActivity.class); + intent.putExtra(ViewPostDetailActivity.EXTRA_TITLE, title); + intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, post); + mContext.startActivity(intent); + } + }); - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - if(resource instanceof Animatable) { - //This is a gif - //((Animatable) resource).start(); - ((DataViewHolder) holder).subredditIconGifImageView.startAnimation(); + if(hasMultipleSubreddits) { + if(post.getSubredditIconUrl() == null) { + new LoadSubredditIconAsyncTask(subredditDao, subredditName, + iconImageUrl -> { + if(mContext != null && getItemCount() > 0) { + if(!iconImageUrl.equals("")) { + glide.load(iconImageUrl) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .error(glide.load(R.drawable.subreddit_default_icon)) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + return false; } - return false; - } - }) - .into(((DataViewHolder) holder).subredditIconGifImageView); - } else { - glide.load(R.drawable.subreddit_default_icon) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .into(((DataViewHolder) holder).subredditIconGifImageView); - } - if(holder.getAdapterPosition() >= 0) { - post.setSubredditIconUrl(iconImageUrl); + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if(resource instanceof Animatable) { + //This is a gif + //((Animatable) resource).start(); + ((DataViewHolder) holder).subredditIconGifImageView.startAnimation(); + } + return false; + } + }) + .into(((DataViewHolder) holder).subredditIconGifImageView); + } else { + glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .into(((DataViewHolder) holder).subredditIconGifImageView); + } + + if(holder.getAdapterPosition() >= 0) { + post.setSubredditIconUrl(iconImageUrl); + } } - } - }).execute(); - } else if(!post.getSubredditIconUrl().equals("")) { - glide.load(post.getSubredditIconUrl()) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon)) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - if(resource instanceof Animatable) { - //This is a gif - //((Animatable) resource).start(); - ((DataViewHolder) holder).subredditIconGifImageView.startAnimation(); + }).execute(); + } else if(!post.getSubredditIconUrl().equals("")) { + glide.load(post.getSubredditIconUrl()) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .error(glide.load(R.drawable.subreddit_default_icon)) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + return false; } - return false; - } - }) - .into(((DataViewHolder) holder).subredditIconGifImageView); - } else { - glide.load(R.drawable.subreddit_default_icon) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .into(((DataViewHolder) holder).subredditIconGifImageView); - } - ((DataViewHolder) holder).cardView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if(canStartActivity) { - canStartActivity = false; - Intent intent = new Intent(mContext, ViewPostDetailActivity.class); - intent.putExtra(ViewPostDetailActivity.EXTRA_TITLE, title); - intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, post); - mContext.startActivity(intent); - } + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if(resource instanceof Animatable) { + //This is a gif + //((Animatable) resource).start(); + ((DataViewHolder) holder).subredditIconGifImageView.startAnimation(); + } + return false; + } + }) + .into(((DataViewHolder) holder).subredditIconGifImageView); + } else { + glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .into(((DataViewHolder) holder).subredditIconGifImageView); } - }); - ((DataViewHolder) holder).subredditIconGifImageView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { + ((DataViewHolder) holder).subredditIconGifImageView.setOnClickListener(view -> { if(canStartActivity) { canStartActivity = false; Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); @@ -218,26 +220,107 @@ class PostRecyclerViewAdapter extends PagedListAdapter { + if(mContext != null && getItemCount() > 0) { + if(!iconImageUrl.equals("")) { + glide.load(iconImageUrl) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .error(glide.load(R.drawable.subreddit_default_icon)) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if(resource instanceof Animatable) { + //This is a gif + //((Animatable) resource).start(); + ((DataViewHolder) holder).subredditIconGifImageView.startAnimation(); + } + return false; + } + }) + .into(((DataViewHolder) holder).subredditIconGifImageView); + } else { + glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .into(((DataViewHolder) holder).subredditIconGifImageView); + } + + if(holder.getAdapterPosition() >= 0) { + post.setAuthorIconUrl(iconImageUrl); + } + } + }).execute(); + } else if(!post.getAuthorIconUrl().equals("")) { + glide.load(post.getAuthorIconUrl()) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .error(glide.load(R.drawable.subreddit_default_icon)) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if(resource instanceof Animatable) { + //This is a gif + //((Animatable) resource).start(); + ((DataViewHolder) holder).subredditIconGifImageView.startAnimation(); + } + return false; + } + }) + .into(((DataViewHolder) holder).subredditIconGifImageView); + } else { + glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) + .into(((DataViewHolder) holder).subredditIconGifImageView); } - }); - ((DataViewHolder) holder).subredditNameTextView.setText(subredditName); + ((DataViewHolder) holder).subredditIconGifImageView.setOnClickListener(view -> { + if(canStartActivity) { + canStartActivity = false; + Intent intent = new Intent(mContext, ViewUserDetailActivity.class); + mContext.startActivity(intent); + } + }); + + ((DataViewHolder) holder).subredditNameTextView.setText(author); - ((DataViewHolder) holder).subredditNameTextView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { + ((DataViewHolder) holder).subredditNameTextView.setOnClickListener(view -> { if(canStartActivity) { canStartActivity = false; - Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, - post.getSubredditNamePrefixed().substring(2)); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY, - post.getSubredditNamePrefixed()); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false); + Intent intent = new Intent(mContext, ViewUserDetailActivity.class); mContext.startActivity(intent); } - } - }); + }); + } + ((DataViewHolder) holder).postTimeTextView.setText(postTime); ((DataViewHolder) holder).titleTextView.setText(title); ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore())); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java index 94da1c58..657f10d6 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java @@ -27,7 +27,7 @@ public interface RedditAPI { Call getSubscribedThing(@Query("after") String lastItem, @HeaderMap Map headers); @GET("api/v1/me?raw_json=1") - Call getUserInfo(@HeaderMap Map headers); + Call getMyInfo(@HeaderMap Map headers); @FormUrlEncoded @POST("api/vote") @@ -39,6 +39,6 @@ public interface RedditAPI { @GET("r/{subredditName}.json?raw_json=1&limit=25") Call getPost(@Path("subredditName") String subredditName, @Query("after") String lastItem); - @GET("user/{username}/about.json/raw_json=1") + @GET("user/{username}/about.json?raw_json=1") Call getUserData(@Path("username") String username); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditUtils.java index d9ad429d..ad081cc2 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditUtils.java @@ -9,7 +9,7 @@ import java.util.Map; * Created by alex on 2/23/18. */ -class RedditUtils { +public class RedditUtils { static final String OAUTH_URL ="https://www.reddit.com/api/v1/authorize.compact"; static final String OAUTH_API_BASE_URI = "https://oauth.reddit.com"; static final String API_BASE_URI = "https://www.reddit.com"; @@ -53,7 +53,7 @@ class RedditUtils { return params; } - static Map getOAuthHeader(String accessToken) { + public static Map getOAuthHeader(String accessToken) { Map params = new HashMap<>(); params.put(RedditUtils.AUTHORIZATION_KEY, RedditUtils.AUTHORIZATION_BASE + accessToken); params.put(RedditUtils.USER_AGENT_KEY, RedditUtils.USER_AGENT); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SharedPreferencesUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SharedPreferencesUtils.java index fe0784db..5ab2286d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SharedPreferencesUtils.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SharedPreferencesUtils.java @@ -4,11 +4,11 @@ package ml.docilealligator.infinityforreddit; * Created by alex on 2/23/18. */ -class SharedPreferencesUtils { +public class SharedPreferencesUtils { static final String AUTH_CODE_FILE_KEY = "Auth_Code_Pref"; static final String USER_INFO_FILE_KEY = "User_Info"; static final String AUTH_CODE_KEY = "code"; - static final String ACCESS_TOKEN_KEY = "accessToken"; + public static final String ACCESS_TOKEN_KEY = "accessToken"; static final String REFRESH_TOKEN_KEY = "refreshToken"; static final String QUERY_ACCESS_TOKEN_TIME_KEY = "queryAccessTokenTime"; static final String ACCESS_TOKEN_EXPIRE_INTERVAL_KEY = "accessTokenExpireInterval"; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java index 1c63ffac..38b1ba0d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java @@ -273,7 +273,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity { private static class InsertSubredditDataAsyncTask extends AsyncTask { - private final SubredditDao mSubredditDao; + private SubredditDao mSubredditDao; private SubredditData subredditData; InsertSubredditDataAsyncTask(SubredditRoomDatabase subredditDb, SubredditData subredditData) { -- cgit v1.2.3