Add a RecyclerView for subscribed subreddits in navigation drawer, rewrite some code and minor bugs fixed

This commit is contained in:
Alex Ning 2018-07-28 13:45:01 +08:00
parent 0e6d4ae525
commit e3653eb503
18 changed files with 415 additions and 187 deletions

View File

@ -23,7 +23,7 @@
<PersistentState>
<option name="values">
<map>
<entry key="url" value="jar:file:/home/alex/Android%20Studio/plugins/android/lib/android.jar!/images/material_design_icons/file/ic_file_download_black_24dp.xml" />
<entry key="url" value="jar:file:/home/alex/Android%20Studio/plugins/android/lib/android.jar!/images/material_design_icons/action/ic_account_circle_black_24dp.xml" />
</map>
</option>
</PersistentState>
@ -33,8 +33,8 @@
</option>
<option name="values">
<map>
<entry key="color" value="ffffff" />
<entry key="outputName" value="ic_file_download_white_24dp" />
<entry key="color" value="9e9e9e" />
<entry key="outputName" value="ic_account_circle_grey_24dp" />
<entry key="sourceFile" value="$USER_HOME$" />
</map>
</option>

View File

@ -25,7 +25,7 @@
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@ -50,6 +50,7 @@ class AcquireAccessToken {
editor.putString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, newAccessToken);
editor.apply();
Log.i("access token", newAccessToken);
mAcquireAccessTokenListener.onAcquireAccessTokenSuccess();
} catch (JSONException e) {
e.printStackTrace();

View File

@ -5,6 +5,7 @@ import android.app.Fragment;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
@ -169,7 +170,11 @@ public class BestPostFragment extends Fragment {
mProgressBar.setVisibility(View.VISIBLE);
StringRequest bestPostRequest = new StringRequest(Request.Method.GET, RedditUtils.OAUTH_API_BASE_URI + RedditUtils.BEST_POST_SUFFIX, new Response.Listener<String>() {
Uri uri = Uri.parse(RedditUtils.OAUTH_API_BASE_URI + RedditUtils.BEST_POST_SUFFIX)
.buildUpon().appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE)
.build();
StringRequest bestPostRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(getActivity() != null) {
@ -196,7 +201,7 @@ public class BestPostFragment extends Fragment {
Log.i("Best post fetch error", "Error parsing data");
mProgressBar.setVisibility(View.GONE);
}
}).parseBestPost(response, null);
}).parseBestPost(response, new ArrayList<BestPostData>());
}
}
}, new Response.ErrorListener() {

View File

@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
@ -92,7 +93,11 @@ class BestPostPaginationScrollListener extends RecyclerView.OnScrollListener {
loadSuccess = false;
mPaginationSynchronizer.setLoading(true);
StringRequest bestPostRequest = new StringRequest(Request.Method.GET, RedditUtils.OAUTH_API_BASE_URI + RedditUtils.BEST_POST_SUFFIX + "&" + RedditUtils.AFTER_KEY + "=" + mLastItem, new Response.Listener<String>() {
Uri uri = Uri.parse(RedditUtils.OAUTH_API_BASE_URI + RedditUtils.BEST_POST_SUFFIX)
.buildUpon().appendQueryParameter(RedditUtils.AFTER_KEY, mLastItem)
.appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE).build();
StringRequest bestPostRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);

View File

@ -1,5 +1,97 @@
package ml.docilealligator.infinityforreddit;
class FetchSubscribedSubreddits {
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import java.util.ArrayList;
import java.util.Map;
class FetchSubscribedSubreddits {
interface FetchSubscribedSubredditsListener {
void onFetchSubscribedSubredditsSuccess(ArrayList<SubredditData> subredditData);
void onFetchSubscribedSubredditsFail();
}
private Context context;
private RequestQueue requestQueue;
private FetchSubscribedSubredditsListener mFetchSubscribedSubredditsListener;
private ArrayList<SubredditData> mSubredditData;
private String mLastItem;
FetchSubscribedSubreddits(Context context, RequestQueue requestQueue, ArrayList<SubredditData> subredditData) {
this.context = context;
this.requestQueue = requestQueue;
mSubredditData = subredditData;
}
void fetchSubscribedSubreddits(FetchSubscribedSubredditsListener fetchUserInfoListener, final int refreshTime) {
if(refreshTime < 0) {
mFetchSubscribedSubredditsListener.onFetchSubscribedSubredditsFail();
return;
}
Uri uri = Uri.parse(RedditUtils.OAUTH_API_BASE_URI + RedditUtils.SUBSCRIBED_SUBREDDITS)
.buildUpon().appendQueryParameter(RedditUtils.AFTER_KEY, mLastItem)
.appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE).build();
mFetchSubscribedSubredditsListener = fetchUserInfoListener;
StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
new ParseSubscribedSubreddits().parseSubscribedSubreddits(response, mSubredditData,
new ParseSubscribedSubreddits.ParseSubscribedSubredditsListener() {
@Override
public void onParseSubscribedSubredditsSuccess(ArrayList<SubredditData> subredditData, String lastItem) {
mSubredditData = subredditData;
mLastItem = lastItem;
Log.i("last item", lastItem);
if(mLastItem.equals("null")) {
mFetchSubscribedSubredditsListener.onFetchSubscribedSubredditsSuccess(mSubredditData);
} else {
fetchSubscribedSubreddits(mFetchSubscribedSubredditsListener, refreshTime);
}
}
@Override
public void onParseSubscribedSubredditsFail() {
}
});
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(error instanceof AuthFailureError) {
new AcquireAccessToken(context).refreshAccessToken(requestQueue, new AcquireAccessToken.AcquireAccessTokenListener() {
@Override
public void onAcquireAccessTokenSuccess() {
fetchSubscribedSubreddits(mFetchSubscribedSubredditsListener, refreshTime - 1);
}
@Override
public void onAcquireAccessTokenFail() {}
});
} else {
mFetchSubscribedSubredditsListener.onFetchSubscribedSubredditsFail();
}
}
}) {
@Override
public Map<String, String> getHeaders() {
String accessToken = context.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
return RedditUtils.getOAuthHeader(accessToken);
}
};
commentRequest.setTag(FetchComment.class);
requestQueue.add(commentRequest);
}
}

View File

@ -1,6 +1,7 @@
package ml.docilealligator.infinityforreddit;
import android.content.Context;
import android.net.Uri;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
@ -33,11 +34,15 @@ class FetchUserInfo {
}
mFetchUserInfoListener = fetchUserInfoListener;
StringRequest commentRequest = new StringRequest(Request.Method.GET, RedditUtils.OAUTH_API_BASE_URI + RedditUtils.USER_INFO_SUFFIX, new Response.Listener<String>() {
Uri uri = Uri.parse(RedditUtils.OAUTH_API_BASE_URI + RedditUtils.USER_INFO_SUFFIX)
.buildUpon().appendQueryParameter(RedditUtils.RAW_JSON_KEY, RedditUtils.RAW_JSON_VALUE)
.build();
StringRequest commentRequest = new StringRequest(Request.Method.GET, uri.toString(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
mFetchUserInfoListener.onFetchUserInfoSuccess(response);
}
}, new Response.ErrorListener() {
@Override

View File

@ -56,4 +56,5 @@ class JSONUtils {
static final String ICON_IMG_KEY = "icon_img";
static final String LINK_KARMA_KEY = "link_karma";
static final String COMMENT_KARMA_KEY = "comment_karma";
static final String DISPLAY_NAME = "display_name";
}

View File

@ -6,14 +6,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
@ -22,10 +21,13 @@ import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import de.hdodenhof.circleimageview.CircleImageView;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
public class MainActivity extends AppCompatActivity {
private String nameState = "NS";
private String profileImageUrlState = "PIUS";
@ -36,6 +38,7 @@ public class MainActivity extends AppCompatActivity
private TextView mKarmaTextView;
private CircleImageView mProfileImageView;
private ImageView mBannerImageView;
private RecyclerView mSubscribedSubredditRecyclerView;
private Fragment mFragment;
private RequestManager glide;
@ -46,6 +49,8 @@ public class MainActivity extends AppCompatActivity
private String mKarma;
private boolean mFetchUserInfoSuccess;
private ArrayList<SubredditData> mSubredditData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -59,15 +64,15 @@ public class MainActivity extends AppCompatActivity
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View header = navigationView.getHeaderView(0);
View header = findViewById(R.id.nav_header_main_activity);
mNameTextView = header.findViewById(R.id.name_text_view_nav_header_main);
mKarmaTextView = header.findViewById(R.id.karma_text_view_nav_header_main);
mProfileImageView = header.findViewById(R.id.profile_image_view_nav_header_main);
mBannerImageView = header.findViewById(R.id.banner_image_view_nav_header_main);
mSubscribedSubredditRecyclerView = findViewById(R.id.subscribed_subreddit_recycler_view_main_activity);
mSubscribedSubredditRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mName = getSharedPreferences(SharedPreferencesUtils.USER_INFO_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.USER_KEY, "");
mProfileImageUrl = getSharedPreferences(SharedPreferencesUtils.USER_INFO_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.PROFILE_IMAGE_URL_KEY, "");
mBannerImageUrl = getSharedPreferences(SharedPreferencesUtils.USER_INFO_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.BANNER_IMAGE_URL_KEY, "");
@ -102,7 +107,7 @@ public class MainActivity extends AppCompatActivity
new FetchUserInfo(this, Volley.newRequestQueue(this)).queryUserInfo(new FetchUserInfo.FetchUserInfoListener() {
@Override
public void onFetchUserInfoSuccess(String response) {
new ParseUserInfo().parseUserInfo(MainActivity.this, response, new ParseUserInfo.ParseUserInfoListener() {
new ParseUserInfo().parseUserInfo(response, new ParseUserInfo.ParseUserInfoListener() {
@Override
public void onParseUserInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) {
mNameTextView.setText(name);
@ -142,6 +147,26 @@ public class MainActivity extends AppCompatActivity
}
}, 1);
}
new FetchSubscribedSubreddits(this, Volley.newRequestQueue(this), new ArrayList<SubredditData>())
.fetchSubscribedSubreddits(new FetchSubscribedSubreddits.FetchSubscribedSubredditsListener() {
@Override
public void onFetchSubscribedSubredditsSuccess(ArrayList<SubredditData> subredditData) {
Collections.sort(subredditData, new Comparator<SubredditData>() {
@Override
public int compare(SubredditData subredditData, SubredditData t1) {
return subredditData.getName().toLowerCase().compareTo(t1.getName().toLowerCase());
}
});
mSubredditData = subredditData;
mSubscribedSubredditRecyclerView.setAdapter(new SubscribedSubredditRecyclerViewAdapter(
MainActivity.this, mSubredditData));
}
@Override
public void onFetchSubscribedSubredditsFail() {
}
}, 1);
}
@Override
@ -154,53 +179,6 @@ public class MainActivity extends AppCompatActivity
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

View File

@ -59,9 +59,6 @@ class ParseBestPost {
protected Void doInBackground(Void... voids) {
try {
JSONArray allData = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
if(bestPostData == null) {
bestPostData = new ArrayList<>();
}
lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY);
for(int i = 0; i < allData.length(); i++) {
@ -199,106 +196,4 @@ class ParseBestPost {
}
}
}
/*private void parseData(JSONObject data, String permalink, ArrayList<BestPostData> bestPostData,
String id, String fullName, String subredditName, String formattedPostTime, String title,
int score, int voteType, boolean nsfw, int i) throws JSONException {
boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY);
if(!data.has(JSONUtils.PREVIEW_KEY)) {
String url = data.getString(JSONUtils.URL_KEY);
if(url.contains(permalink)) {
//Text post
Log.i("text", Integer.toString(i));
int postType = BestPostData.TEXT_TYPE;
BestPostData postData = new BestPostData(id, fullName, subredditName, formattedPostTime, title, permalink, score, postType, voteType, nsfw);
postData.setSelfText(data.getString(JSONUtils.SELF_TEXT_KEY).trim());
bestPostData.add(postData);
} else {
//No preview link post
Log.i("no preview link", Integer.toString(i));
int postType = BestPostData.NO_PREVIEW_LINK_TYPE;
BestPostData post = new BestPostData(id, fullName, subredditName, formattedPostTime, title, permalink, score, postType, voteType, nsfw);
post.setLinkUrl(url);
bestPostData.add(post);
}
} else if (!isVideo) {
JSONObject variations = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0);
String previewUrl = variations.getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
if (variations.has(JSONUtils.VARIANTS_KEY)) {
if (variations.getJSONObject(JSONUtils.VARIANTS_KEY).has(JSONUtils.MP4_KEY)) {
//Gif video
Log.i("gif video", Integer.toString(i));
int postType = BestPostData.GIF_VIDEO_TYPE;
String videoUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
BestPostData post = new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw);
post.setVideoUrl(videoUrl);
bestPostData.add(post);
} else if (variations.getJSONObject(JSONUtils.VARIANTS_KEY).has(JSONUtils.GIF_KEY)) {
//Gif post
Log.i("gif", Integer.toString(i));
int postType = BestPostData.GIF_TYPE;
String gifUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
BestPostData post = new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw);
post.setGifUrl(gifUrl);
bestPostData.add(post);
} else {
if(data.getJSONObject(JSONUtils.PREVIEW_KEY).has(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY)) {
//Gif link post
Log.i("gif link", Integer.toString(i));
int postType = BestPostData.LINK_TYPE;
String gifUrl = data.getString(JSONUtils.URL_KEY);
BestPostData gifLinkPostData = new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw);
gifLinkPostData.setLinkUrl(gifUrl);
bestPostData.add(gifLinkPostData);
} else {
if(!data.isNull(JSONUtils.MEDIA_KEY)) {
//Video link post
Log.i("video link", Integer.toString(i));
int postType = BestPostData.LINK_TYPE;
String videoUrl = data.getString(JSONUtils.URL_KEY);
BestPostData videoLinkPostData = new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw);
videoLinkPostData.setLinkUrl(videoUrl);
bestPostData.add(videoLinkPostData);
} else {
if(data.getBoolean(JSONUtils.IS_REDDIT_MEDIA_DOMAIN)) {
//Image post
Log.i("image", Integer.toString(i));
int postType = BestPostData.IMAGE_TYPE;
bestPostData.add(new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw));
} else {
//Link post
Log.i("link", Integer.toString(i));
int postType = BestPostData.LINK_TYPE;
String linkUrl = data.getString(JSONUtils.URL_KEY);
BestPostData linkPostData = new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw);
linkPostData.setLinkUrl(linkUrl);
bestPostData.add(linkPostData);
}
}
}
}
} else {
//Image post
Toast.makeText(mContext, "Fixed post" + Integer.toString(i), Toast.LENGTH_SHORT).show();
Log.i("fixed image", Integer.toString(i));
int postType = BestPostData.IMAGE_TYPE;
bestPostData.add(new BestPostData(id, fullName, subredditName, formattedPostTime, title, previewUrl, permalink, score, postType, voteType, nsfw));
}
} else {
//Video post
Log.i("video", Integer.toString(i));
JSONObject redditVideoObject = data.getJSONObject(JSONUtils.MEDIA_KEY).getJSONObject(JSONUtils.REDDIT_VIDEO_KEY);
int postType = BestPostData.VIDEO_TYPE;
String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY);
String videoPreviewUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
BestPostData videoPostData = new BestPostData(id, fullName, subredditName, formattedPostTime, title, videoPreviewUrl, permalink, score, postType, voteType, nsfw);
videoPostData.setVideoUrl(videoUrl);
bestPostData.add(videoPostData);
}
}*/
}

View File

@ -1,4 +1,72 @@
package ml.docilealligator.infinityforreddit;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
class ParseSubscribedSubreddits {
interface ParseSubscribedSubredditsListener {
void onParseSubscribedSubredditsSuccess(ArrayList<SubredditData> subredditData, String lastItem);
void onParseSubscribedSubredditsFail();
}
private ParseSubscribedSubredditsListener mParseSubscribedSubredditsListener;
void parseSubscribedSubreddits(String response, ArrayList<SubredditData> subredditData,
ParseSubscribedSubredditsListener parseSubscribedSubredditsListener) {
mParseSubscribedSubredditsListener = parseSubscribedSubredditsListener;
new ParseSubscribedSubredditsAsyncTask(response, subredditData).execute();
}
private class ParseSubscribedSubredditsAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONObject jsonResponse;
private boolean parseFailed;
private String lastItem;
private ArrayList<SubredditData> subredditData;
private ArrayList<SubredditData> newSubredditData;
ParseSubscribedSubredditsAsyncTask(String response, ArrayList<SubredditData> subredditData){
try {
jsonResponse = new JSONObject(response);
parseFailed = false;
this.subredditData = subredditData;
newSubredditData = new ArrayList<>();
} catch (JSONException e) {
Log.i("user info json error", e.getMessage());
mParseSubscribedSubredditsListener.onParseSubscribedSubredditsFail();
}
}
@Override
protected Void doInBackground(Void... voids) {
try {
JSONArray children = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
for(int i = 0; i < children.length(); i++) {
String name = children.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.DISPLAY_NAME);
String iconUrl = children.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.ICON_IMG_KEY);
newSubredditData.add(new SubredditData(name, iconUrl));
}
lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY);
} catch (JSONException e) {
parseFailed = true;
Log.i("parse comment error", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if(!parseFailed) {
subredditData.addAll(newSubredditData);
mParseSubscribedSubredditsListener.onParseSubscribedSubredditsSuccess(subredditData, lastItem);
} else {
mParseSubscribedSubredditsListener.onParseSubscribedSubredditsFail();
}
}
}
}

View File

@ -1,6 +1,5 @@
package ml.docilealligator.infinityforreddit;
import android.content.Context;
import android.os.AsyncTask;
import android.text.Html;
import android.util.Log;
@ -14,13 +13,11 @@ class ParseUserInfo {
void onParseUserInfoFail();
}
private Context mContext;
private ParseUserInfoListener mParseUserInfoListener;
void parseUserInfo(Context context, String response, ParseUserInfoListener parseUserInfoListener) {
void parseUserInfo(String response, ParseUserInfoListener parseUserInfoListener) {
mParseUserInfoListener = parseUserInfoListener;
mContext = context;
new ParseUserInfo.ParseUserInfoAsyncTask(response).execute();
new ParseUserInfoAsyncTask(response).execute();
}
private class ParseUserInfoAsyncTask extends AsyncTask<Void, Void, Void> {

View File

@ -14,9 +14,12 @@ class RedditUtils {
static final String ACQUIRE_ACCESS_TOKEN_URL = "https://www.reddit.com/api/v1/access_token";
static final String OAUTH_API_BASE_URI = "https://oauth.reddit.com";
static final String API_BASE_URI = "https://www.reddit.com";
static final String BEST_POST_SUFFIX = "/best?raw_json=1";
static final String RAW_JSON_KEY ="raw_json";
static final String RAW_JSON_VALUE = "1";
static final String BEST_POST_SUFFIX = "/best";
static final String VOTE_SUFFIX = "/api/vote";
static final String USER_INFO_SUFFIX = "/api/v1/me?raw_json=1";
static final String USER_INFO_SUFFIX = "/api/v1/me";
static final String SUBSCRIBED_SUBREDDITS = "/subreddits/mine/subscriber";
static final String CLIENT_ID_KEY = "client_id";
static final String CLIENT_ID = "";

View File

@ -1,4 +1,50 @@
package ml.docilealligator.infinityforreddit;
class SubredditData {
import android.os.Parcel;
import android.os.Parcelable;
class SubredditData implements Parcelable {
private String name;
private String iconUrl;
SubredditData(String name, String iconUrl) {
this.name = name;
this.iconUrl = iconUrl;
}
protected SubredditData(Parcel in) {
name = in.readString();
iconUrl = in.readString();
}
public static final Creator<SubredditData> CREATOR = new Creator<SubredditData>() {
@Override
public SubredditData createFromParcel(Parcel in) {
return new SubredditData(in);
}
@Override
public SubredditData[] newArray(int size) {
return new SubredditData[size];
}
};
public String getName() {
return name;
}
public String getIconUrl() {
return iconUrl;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeString(iconUrl);
}
}

View File

@ -1,4 +1,65 @@
package ml.docilealligator.infinityforreddit;
class SubscribedSubredditRecyclerViewAdapter {
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import java.util.ArrayList;
import de.hdodenhof.circleimageview.CircleImageView;
class SubscribedSubredditRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context mContext;
ArrayList<SubredditData> mSubredditData;
RequestManager glide;
SubscribedSubredditRecyclerViewAdapter(Context context, ArrayList<SubredditData> subredditData) {
mContext = context;
mSubredditData = subredditData;
glide = Glide.with(context);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new SubredditViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_subscribed_subreddit, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(!mSubredditData.get(i).getIconUrl().equals("")) {
glide.load(mSubredditData.get(i).getIconUrl()).into(((SubredditViewHolder) viewHolder).iconCircleImageView);
} else {
glide.load(R.drawable.subreddit_default_icon).into(((SubredditViewHolder) viewHolder).iconCircleImageView);
}
((SubredditViewHolder) viewHolder).subredditNameTextView.setText(mSubredditData.get(i).getName());
}
@Override
public int getItemCount() {
return mSubredditData.size();
}
@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
glide.clear(((SubredditViewHolder) holder).iconCircleImageView);
}
private class SubredditViewHolder extends RecyclerView.ViewHolder {
private CircleImageView iconCircleImageView;
private TextView subredditNameTextView;
public SubredditViewHolder(View itemView) {
super(itemView);
iconCircleImageView = itemView.findViewById(R.id.subreddit_icon_circle_image_view_item_subscribed_subreddit);
subredditNameTextView = itemView.findViewById(R.id.subreddit_name_text_view_item_subscribed_subreddit);
}
}
}

View File

@ -18,9 +18,59 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/nav_header_main_activity"
layout="@layout/nav_header_main" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="32dp"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_account_circle_grey_24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/profile"
android:textColor="@android:color/black"
android:layout_gravity="center_vertical"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#E0E0E0"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/subscriptions"
android:layout_margin="16dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/subscribed_subreddit_recycler_view_main_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

View File

@ -1,6 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content"
android:padding="16dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground">
</android.support.constraint.ConstraintLayout>
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/subreddit_icon_circle_image_view_item_subscribed_subreddit"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="32dp"/>
<TextView
android:id="@+id/subreddit_name_text_view_item_subscribed_subreddit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:layout_gravity="center_vertical"/>
</LinearLayout>

View File

@ -15,4 +15,7 @@
<string name="nsfw">NSFW</string>
<string name="karma_info">Karma: %1$d</string>
<string name="profile">Profile</string>
<string name="subscriptions">Subscriptions</string>
</resources>