aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Ning <chineseperson5@gmail.com>2019-07-26 02:50:32 +0000
committerAlex Ning <chineseperson5@gmail.com>2019-07-26 02:50:32 +0000
commit1fc84239069fa19da7f7c7b0b0825717aad4999c (patch)
tree92b11e3f9e7f6839ae931700b1f13314e67a20d8
parent66ed3d8f1670c56b7a8b8de78fbf99686dc5d6a1 (diff)
downloadinfinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.tar
infinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.tar.gz
infinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.tar.bz2
infinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.tar.lz
infinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.tar.xz
infinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.tar.zst
infinity-for-reddit-1fc84239069fa19da7f7c7b0b0825717aad4999c.zip
Sorting posts is now available. Minor bugs fixed.
Diffstat (limited to '')
-rw-r--r--.idea/assetWizardSettings.xml4
-rw-r--r--.idea/caches/build_file_checksums.serbin533 -> 533 bytes
-rw-r--r--.idea/caches/gradle_models.serbin254881 -> 254866 bytes
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java59
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java3
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java21
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java162
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java25
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java39
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java1
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java23
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java50
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java10
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java1
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java88
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java33
-rw-r--r--app/src/main/res/drawable/ic_outline_sort_24px.xml9
-rw-r--r--app/src/main/res/layout/activity_post_video.xml8
-rw-r--r--app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml97
-rw-r--r--app/src/main/res/layout/sort_type_bottom_sheet.xml97
-rw-r--r--app/src/main/res/menu/main_activity.xml13
-rw-r--r--app/src/main/res/menu/view_subreddit_detail_activity.xml13
-rw-r--r--app/src/main/res/values/strings.xml12
23 files changed, 633 insertions, 135 deletions
diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml
index 6645f2bb..6449e76a 100644
--- a/.idea/assetWizardSettings.xml
+++ b/.idea/assetWizardSettings.xml
@@ -35,9 +35,9 @@
<map>
<entry key="assetSourceType" value="FILE" />
<entry key="color" value="ffffff" />
- <entry key="outputName" value="ic_outline_add_photo_24px" />
+ <entry key="outputName" value="ic_outline_sort_24px" />
<entry key="overrideSize" value="true" />
- <entry key="sourceFile" value="$USER_HOME$/Downloads/outline-add_photo_alternate-24px.svg" />
+ <entry key="sourceFile" value="$USER_HOME$/Downloads/outline-sort-24px.svg" />
</map>
</option>
</PersistentState>
diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 1c28698e..4b5c0b5d 100644
--- a/.idea/caches/build_file_checksums.ser
+++ b/.idea/caches/build_file_checksums.ser
Binary files differ
diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser
index cce3e832..80643aa1 100644
--- a/.idea/caches/gradle_models.ser
+++ b/.idea/caches/gradle_models.ser
Binary files differ
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java
index 7df67fd1..efb651a4 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java
@@ -37,7 +37,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import pl.droidsonroids.gif.GifImageView;
import retrofit2.Retrofit;
-public class MainActivity extends AppCompatActivity {
+public class MainActivity extends AppCompatActivity implements SortTypeBottomSheetFragment.SortTypeSelectionCallback {
private static final String FRAGMENT_OUT_STATE = "FOS";
private static final String FETCH_USER_INFO_STATE = "FUIS";
@@ -52,8 +52,6 @@ public class MainActivity extends AppCompatActivity {
@BindView(R.id.settings_linear_layout_main_activity) LinearLayout settingsLinearLayout;
@BindView(R.id.fab_main_activity) FloatingActionButton fab;
- private BottomSheetDialog dialog;
-
private TextView mNameTextView;
private TextView mKarmaTextView;
private GifImageView mProfileImageView;
@@ -62,6 +60,8 @@ public class MainActivity extends AppCompatActivity {
private Fragment mFragment;
private RequestManager glide;
private AppBarLayout.LayoutParams params;
+ private BottomSheetDialog postTypedialog;
+ private SortTypeBottomSheetFragment sortTypeBottomSheetFragment;
private String mName;
private String mProfileImageUrl;
@@ -92,16 +92,18 @@ public class MainActivity extends AppCompatActivity {
ButterKnife.bind(this);
- View dialogView = View.inflate(this, R.layout.post_type_bottom_sheet, null);
- LinearLayout textTypeLinearLayout = dialogView.findViewById(R.id.text_type_linear_layout_post_type_bottom_sheet);
- LinearLayout linkTypeLinearLayout = dialogView.findViewById(R.id.link_type_linear_layout_post_type_bottom_sheet);
- LinearLayout imageTypeLinearLayout = dialogView.findViewById(R.id.image_type_linear_layout_post_type_bottom_sheet);
- LinearLayout videoTypeLinearLayout = dialogView.findViewById(R.id.video_type_linear_layout_post_type_bottom_sheet);
+ ((Infinity) getApplication()).getmAppComponent().inject(this);
- dialog = new BottomSheetDialog(this);
- dialog.setContentView(dialogView);
+ View postTypeDialogView = View.inflate(this, R.layout.post_type_bottom_sheet, null);
+ LinearLayout textTypeLinearLayout = postTypeDialogView.findViewById(R.id.text_type_linear_layout_post_type_bottom_sheet);
+ LinearLayout linkTypeLinearLayout = postTypeDialogView.findViewById(R.id.link_type_linear_layout_post_type_bottom_sheet);
+ LinearLayout imageTypeLinearLayout = postTypeDialogView.findViewById(R.id.image_type_linear_layout_post_type_bottom_sheet);
+ LinearLayout videoTypeLinearLayout = postTypeDialogView.findViewById(R.id.video_type_linear_layout_post_type_bottom_sheet);
- ((Infinity) getApplication()).getmAppComponent().inject(this);
+ postTypedialog = new BottomSheetDialog(this);
+ postTypedialog.setContentView(postTypeDialogView);
+
+ sortTypeBottomSheetFragment = new SortTypeBottomSheetFragment();
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -120,11 +122,7 @@ public class MainActivity extends AppCompatActivity {
startActivityForResult(loginIntent, LOGIN_ACTIVITY_REQUEST_CODE);
} else {
if (savedInstanceState == null) {
- mFragment = new PostFragment();
- Bundle bundle = new Bundle();
- bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE);
- mFragment.setArguments(bundle);
- getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit();
+ replaceFragment(PostDataSource.SORT_TYPE_BEST);
} else {
mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit();
@@ -186,30 +184,37 @@ public class MainActivity extends AppCompatActivity {
textTypeLinearLayout.setOnClickListener(view -> {
Intent intent = new Intent(MainActivity.this, PostTextActivity.class);
startActivity(intent);
- dialog.dismiss();
+ postTypedialog.dismiss();
});
linkTypeLinearLayout.setOnClickListener(view -> {
Intent intent = new Intent(MainActivity.this, PostLinkActivity.class);
startActivity(intent);
- dialog.dismiss();
+ postTypedialog.dismiss();
});
imageTypeLinearLayout.setOnClickListener(view -> {
Intent intent = new Intent(MainActivity.this, PostImageActivity.class);
startActivity(intent);
- dialog.dismiss();
+ postTypedialog.dismiss();
});
videoTypeLinearLayout.setOnClickListener(view -> {
Intent intent = new Intent(MainActivity.this, PostVideoActivity.class);
startActivity(intent);
- dialog.dismiss();
+ postTypedialog.dismiss();
});
- fab.setOnClickListener(view -> {
- dialog.show();
- });
+ fab.setOnClickListener(view -> postTypedialog.show());
+ }
+
+ private void replaceFragment(String sortType) {
+ mFragment = new PostFragment();
+ Bundle bundle = new Bundle();
+ bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE);
+ bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType);
+ mFragment.setArguments(bundle);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit();
}
private void loadUserData() {
@@ -301,6 +306,9 @@ public class MainActivity extends AppCompatActivity {
public boolean onOptionsItemSelected(MenuItem item) {
if (mFragment instanceof FragmentCommunicator) {
switch (item.getItemId()) {
+ case R.id.action_sort_main_activity:
+ sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag());
+ return true;
case R.id.action_search_main_activity:
Intent intent = new Intent(this, SearchActivity.class);
startActivity(intent);
@@ -351,4 +359,9 @@ public class MainActivity extends AppCompatActivity {
outState.putBoolean(FETCH_USER_INFO_STATE, mFetchUserInfoSuccess);
outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode);
}
+
+ @Override
+ public void sortTypeSelected(String sortType) {
+ replaceFragment(sortType);
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java
index 2edb526e..1a9bfe93 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java
@@ -1,6 +1,7 @@
package ml.docilealligator.infinityforreddit;
import android.os.AsyncTask;
+import android.text.Html;
import android.util.Log;
import androidx.annotation.Nullable;
@@ -223,7 +224,7 @@ class ParseComment {
if(!singleCommentData.isNull(JSONUtils.BODY_HTML_KEY)) {
commentContent = singleCommentData.getString(JSONUtils.BODY_HTML_KEY).trim();
}
- String permalink = singleCommentData.getString(JSONUtils.PERMALINK_KEY);
+ String permalink = Html.fromHtml(singleCommentData.getString(JSONUtils.PERMALINK_KEY)).toString();
int score = singleCommentData.getInt(JSONUtils.SCORE_KEY);
long submitTime = singleCommentData.getLong(JSONUtils.CREATED_UTC_KEY) * 1000;
boolean scoreHidden = singleCommentData.getBoolean(JSONUtils.SCORE_HIDDEN_KEY);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
index a2146668..a1f614ce 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
@@ -1,6 +1,7 @@
package ml.docilealligator.infinityforreddit;
import android.os.AsyncTask;
+import android.text.Html;
import android.util.Log;
import org.json.JSONArray;
@@ -122,7 +123,7 @@ class ParsePost {
parsePostListener.onParsePostSuccess(post);
}
} else {
- if(newPosts != null) {
+ if(parsePostsListingListener != null) {
parsePostsListingListener.onParsePostsListingFail();
} else {
parsePostListener.onParsePostFail();
@@ -160,7 +161,7 @@ class ParsePost {
postTimeCalendar.setTimeInMillis(postTime);
String formattedPostTime = new SimpleDateFormat("MMM d, YYYY, HH:mm",
locale).format(postTimeCalendar.getTime());
- String permalink = data.getString(JSONUtils.PERMALINK_KEY);
+ String permalink = Html.fromHtml(data.getString(JSONUtils.PERMALINK_KEY)).toString();
String previewUrl = "";
int previewWidth = -1;
@@ -194,7 +195,7 @@ class ParsePost {
Post post;
boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY);
- String url = data.getString(JSONUtils.URL_KEY);
+ String url = Html.fromHtml(data.getString(JSONUtils.URL_KEY)).toString();
if(!data.has(JSONUtils.PREVIEW_KEY) && previewUrl.equals("")) {
if(url.contains(permalink)) {
@@ -224,8 +225,8 @@ class ParsePost {
}
} else {
if(previewUrl.equals("")) {
- previewUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0)
- .getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY);
+ previewUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY).getJSONArray(JSONUtils.IMAGES_KEY).getJSONObject(0)
+ .getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY)).toString();
}
if(isVideo) {
@@ -233,7 +234,7 @@ class ParsePost {
Log.i("video", Integer.toString(i));
JSONObject redditVideoObject = data.getJSONObject(JSONUtils.MEDIA_KEY).getJSONObject(JSONUtils.REDDIT_VIDEO_KEY);
int postType = Post.VIDEO_TYPE;
- String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY);
+ String videoUrl = Html.fromHtml(redditVideoObject.getString(JSONUtils.DASH_URL_KEY)).toString();
post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, permalink, score, postType, voteType,
@@ -249,8 +250,8 @@ class ParsePost {
//Gif video post (MP4)
Log.i("gif video mp4", Integer.toString(i));
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);
+ String videoUrl = Html.fromHtml(variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY)).toString();
+ String gifDownloadUrl = Html.fromHtml(variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY)).toString();
post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType,
@@ -264,8 +265,8 @@ class ParsePost {
//Gif video post (Dash)
Log.i("gif video dash", Integer.toString(i));
int postType = Post.GIF_VIDEO_TYPE;
- String videoUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY)
- .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY);
+ String videoUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY)
+ .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY)).toString();
post = new Post(id, fullName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType,
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
index 09d5451a..2a96524e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
@@ -24,12 +24,21 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
static final int TYPE_USER = 2;
static final int TYPE_SEARCH = 3;
+ static final String SORT_TYPE_BEST = "best";
+ static final String SORT_TYPE_HOT = "hot";
+ static final String SORT_TYPE_NEW = "new";
+ static final String SORT_TYPE_RANDOM = "random";
+ static final String SORT_TYPE_RISING = "rising";
+ static final String SORT_TYPE_TOP = "top";
+ static final String SORT_TYPE_CONTROVERSIAL = "controversial";
+
private Retrofit retrofit;
private String accessToken;
private Locale locale;
private String subredditName;
private String query;
private int postType;
+ private String sortType;
private OnPostFetchedCallback onPostFetchedCallback;
private MutableLiveData<NetworkState> paginationNetworkStateLiveData;
@@ -40,17 +49,33 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private LoadParams<String> params;
private LoadCallback<String, Post> callback;
- PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, OnPostFetchedCallback onPostFetchedCallback) {
+ PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
+ OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData();
this.postType = postType;
+ this.sortType = sortType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
- PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, OnPostFetchedCallback onPostFetchedCallback) {
+ PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
+ String sortType, OnPostFetchedCallback onPostFetchedCallback) {
+ this.retrofit = retrofit;
+ this.accessToken = accessToken;
+ this.locale = locale;
+ this.subredditName = subredditName;
+ paginationNetworkStateLiveData = new MutableLiveData();
+ initialLoadStateLiveData = new MutableLiveData();
+ this.postType = postType;
+ this.sortType = sortType;
+ this.onPostFetchedCallback = onPostFetchedCallback;
+ }
+
+ PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
+ OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -62,7 +87,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
- int postType, OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, String sortType, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -71,6 +96,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData();
this.postType = postType;
+ this.sortType = sortType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@@ -140,35 +166,54 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private void loadBestPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> bestPost = api.getBestPosts(null, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> bestPost = api.getBestPosts(sortType, null, RedditUtils.getOAuthHeader(accessToken));
bestPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if (response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1,
- new ParsePost.ParsePostsListingListener() {
- @Override
- public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0) {
- onPostFetchedCallback.noPost();
- } else {
- onPostFetchedCallback.hasPost();
- }
+ if(sortType.equals(SORT_TYPE_RANDOM)) {
+ ParsePost.parsePost(response.body(), locale, new ParsePost.ParsePostListener() {
+ @Override
+ public void onParsePostSuccess(Post post) {
+ ArrayList<Post> singlePostList = new ArrayList<>();
+ singlePostList.add(post);
+ onPostFetchedCallback.hasPost();
+ callback.onResult(singlePostList, null, null);
+ initialLoadStateLiveData.postValue(NetworkState.LOADED);
+ }
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null, null);
- } else {
- callback.onResult(newPosts, null, lastItem);
+ @Override
+ public void onParsePostFail() {
+ Log.i("Post fetch error", "Error parsing data");
+ initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
+ }
+ });
+ } else {
+ ParsePost.parsePosts(response.body(), locale, -1,
+ new ParsePost.ParsePostsListingListener() {
+ @Override
+ public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
+ if(newPosts.size() == 0) {
+ onPostFetchedCallback.noPost();
+ } else {
+ onPostFetchedCallback.hasPost();
+ }
+
+ if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
+ callback.onResult(newPosts, null, null);
+ } else {
+ callback.onResult(newPosts, null, lastItem);
+ }
+ initialLoadStateLiveData.postValue(NetworkState.LOADED);
}
- initialLoadStateLiveData.postValue(NetworkState.LOADED);
- }
- @Override
- public void onParsePostsListingFail() {
- Log.i("Post fetch error", "Error parsing data");
- initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
- }
- });
+ @Override
+ public void onParsePostsListingFail() {
+ Log.i("Post fetch error", "Error parsing data");
+ initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
+ }
+ });
+ }
} else {
Log.i("Post fetch error", response.message());
initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message()));
@@ -185,7 +230,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private void loadBestPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> bestPost = api.getBestPosts(params.key, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> bestPost = api.getBestPosts(sortType, params.key, RedditUtils.getOAuthHeader(accessToken));
bestPost.enqueue(new Callback<String>() {
@Override
@@ -224,35 +269,54 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private void loadSubredditPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> getPost = api.getSubredditBestPosts(subredditName, null, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> getPost = api.getSubredditBestPosts(subredditName, sortType, null, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1,
- new ParsePost.ParsePostsListingListener() {
- @Override
- public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0) {
- onPostFetchedCallback.noPost();
- } else {
- onPostFetchedCallback.hasPost();
- }
+ if(sortType.equals(SORT_TYPE_RANDOM)) {
+ ParsePost.parsePost(response.body(), locale, new ParsePost.ParsePostListener() {
+ @Override
+ public void onParsePostSuccess(Post post) {
+ ArrayList<Post> singlePostList = new ArrayList<>();
+ singlePostList.add(post);
+ onPostFetchedCallback.hasPost();
+ callback.onResult(singlePostList, null, null);
+ initialLoadStateLiveData.postValue(NetworkState.LOADED);
+ }
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null, null);
- } else {
- callback.onResult(newPosts, null, lastItem);
+ @Override
+ public void onParsePostFail() {
+ Log.i("Post fetch error", "Error parsing data");
+ initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
+ }
+ });
+ } else {
+ ParsePost.parsePosts(response.body(), locale, -1,
+ new ParsePost.ParsePostsListingListener() {
+ @Override
+ public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
+ if(newPosts.size() == 0) {
+ onPostFetchedCallback.noPost();
+ } else {
+ onPostFetchedCallback.hasPost();
+ }
+
+ if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
+ callback.onResult(newPosts, null, null);
+ } else {
+ callback.onResult(newPosts, null, lastItem);
+ }
+ initialLoadStateLiveData.postValue(NetworkState.LOADED);
}
- initialLoadStateLiveData.postValue(NetworkState.LOADED);
- }
- @Override
- public void onParsePostsListingFail() {
- Log.i("Post fetch error", "Error parsing data");
- initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
- }
- });
+ @Override
+ public void onParsePostsListingFail() {
+ Log.i("Post fetch error", "Error parsing data");
+ initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
+ }
+ });
+ }
} else {
Log.i("Post fetch error", response.message());
initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message()));
@@ -269,7 +333,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private void loadSubredditPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> getPost = api.getSubredditBestPosts(subredditName, params.key, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> getPost = api.getSubredditBestPosts(subredditName, sortType, params.key, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java
index 117f3cad..31e91c54 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java
@@ -14,18 +14,32 @@ class PostDataSourceFactory extends DataSource.Factory {
private String subredditName;
private String query;
private int postType;
+ private String sortType;
private PostDataSource.OnPostFetchedCallback onPostFetchedCallback;
private PostDataSource postDataSource;
private MutableLiveData<PostDataSource> postDataSourceLiveData;
- PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType,
+ PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
+ this.sortType = sortType;
+ this.onPostFetchedCallback = onPostFetchedCallback;
+ }
+
+ PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
+ int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ this.retrofit = retrofit;
+ this.accessToken = accessToken;
+ this.locale = locale;
+ this.subredditName = subredditName;
+ postDataSourceLiveData = new MutableLiveData<>();
+ this.postType = postType;
+ this.sortType = sortType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@@ -41,7 +55,7 @@ class PostDataSourceFactory extends DataSource.Factory {
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
- String query, int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ String query, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -49,15 +63,18 @@ class PostDataSourceFactory extends DataSource.Factory {
this.query = query;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
+ this.sortType = sortType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@Override
public DataSource create() {
if(postType == PostDataSource.TYPE_FRONT_PAGE) {
- postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, onPostFetchedCallback);
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback);
} else if(postType == PostDataSource.TYPE_SEARCH) {
- postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query, postType, onPostFetchedCallback);
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query, postType, sortType, onPostFetchedCallback);
+ } else if(postType == PostDataSource.TYPE_SUBREDDIT) {
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback);
} else {
postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback);
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
index 3fde7f58..7196e640 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
@@ -48,6 +48,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
static final String EXTRA_SUBREDDIT_NAME = "EN";
static final String EXTRA_QUERY = "EQ";
static final String EXTRA_POST_TYPE = "EPT";
+ static final String EXTRA_SORT_TYPE = "EST";
private static final String IS_IN_LAZY_MODE_STATE = "IILMS";
@@ -166,6 +167,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
});
int postType = getArguments().getInt(EXTRA_POST_TYPE);
+ String sortType = getArguments().getString(EXTRA_SORT_TYPE);
String accessToken = activity.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
@@ -178,9 +180,29 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mAdapter = new PostRecyclerViewAdapter(activity, mRetrofit,
mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore());
+ factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
+ getResources().getConfiguration().locale, subredditName, query, postType, sortType, new PostDataSource.OnPostFetchedCallback() {
+ @Override
+ public void hasPost() {
+ mFetchPostInfoLinearLayout.setVisibility(View.GONE);
+ }
+
+ @Override
+ public void noPost() {
+ mFetchPostInfoLinearLayout.setOnClickListener(view -> {
+ //Do nothing
+ });
+ showErrorView(R.string.no_posts);
+ }
+ });
+ } else if(postType == PostDataSource.TYPE_SUBREDDIT) {
+ String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
+
+ mAdapter = new PostRecyclerViewAdapter(activity, mRetrofit,
+ mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore());
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, subredditName, query, postType, new PostDataSource.OnPostFetchedCallback() {
+ getResources().getConfiguration().locale, subredditName, postType, sortType, new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
@@ -194,12 +216,10 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
showErrorView(R.string.no_posts);
}
});
- } else if(postType != PostDataSource.TYPE_FRONT_PAGE) {
- if(postType == PostDataSource.TYPE_USER) {
- CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mFetchPostInfoLinearLayout.getLayoutParams();
- params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
- mFetchPostInfoLinearLayout.setLayoutParams(params);
- }
+ } else if(postType == PostDataSource.TYPE_USER) {
+ CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mFetchPostInfoLinearLayout.getLayoutParams();
+ params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
+ mFetchPostInfoLinearLayout.setLayoutParams(params);
String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
@@ -207,7 +227,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore());
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, subredditName, postType, new PostDataSource.OnPostFetchedCallback() {
+ getResources().getConfiguration().locale, subredditName, postType, sortType,
+ new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
@@ -226,7 +247,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mSharedPreferences, postType, () -> mPostViewModel.retryLoadingMore());
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, postType, new PostDataSource.OnPostFetchedCallback() {
+ getResources().getConfiguration().locale, postType, sortType, new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java
index 4aec1ddc..bc750c2a 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java
@@ -260,6 +260,7 @@ public class PostImageActivity extends AppCompatActivity implements FlairBottomS
imageUri = null;
selectAgainTextView.setVisibility(View.GONE);
mGlide.clear(imageView);
+ imageView.setVisibility(View.GONE);
constraintLayout.setVisibility(View.VISIBLE);
});
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java
index b4c266eb..81553663 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java
@@ -13,9 +13,9 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
-import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
+import android.widget.VideoView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -77,7 +77,7 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS
@BindView(R.id.capture_fab_post_video_activity) FloatingActionButton captureFab;
@BindView(R.id.select_from_library_fab_post_video_activity) FloatingActionButton selectFromLibraryFab;
@BindView(R.id.select_again_text_view_post_video_activity) TextView selectAgainTextView;
- @BindView(R.id.image_view_post_video_activity) ImageView imageView;
+ @BindView(R.id.video_view_post_video_activity) VideoView videoView;
private String iconUrl;
private String subredditName;
@@ -248,19 +248,26 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS
startActivityForResult(Intent.createChooser(intent,getResources().getString(R.string.select_from_gallery)), PICK_VIDEO_REQUEST_CODE);
});
+ videoView.setOnPreparedListener(mediaPlayer -> {
+ mediaPlayer.setLooping(true);
+ mediaPlayer.setVolume(0, 0);
+ });
+
selectAgainTextView.setOnClickListener(view -> {
videoUri = null;
selectAgainTextView.setVisibility(View.GONE);
- mGlide.clear(imageView);
+ videoView.stopPlayback();
+ videoView.setVisibility(View.GONE);
constraintLayout.setVisibility(View.VISIBLE);
});
}
private void loadImage() {
constraintLayout.setVisibility(View.GONE);
- imageView.setVisibility(View.VISIBLE);
+ videoView.setVisibility(View.VISIBLE);
selectAgainTextView.setVisibility(View.VISIBLE);
- mGlide.asBitmap().load(videoUri).into(imageView);
+ videoView.setVideoURI(videoUri);
+ videoView.start();
}
private void displaySubredditIcon() {
@@ -377,6 +384,12 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS
}
@Override
+ protected void onStop() {
+ super.onStop();
+ videoView.stopPlayback();
+ }
+
+ @Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SUBREDDIT_NAME_STATE, subredditName);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java
index 21e7d03d..3c5548f8 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java
@@ -19,9 +19,9 @@ public class PostViewModel extends ViewModel {
private LiveData<NetworkState> initialLoadingState;
private LiveData<PagedList<Post>> posts;
- public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType,
+ public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
- postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, onPostFetchedCallback);
+ postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
(Function<PostDataSource, LiveData<NetworkState>>) PostDataSource::getInitialLoadStateLiveData);
@@ -37,6 +37,24 @@ public class PostViewModel extends ViewModel {
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
+ String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback);
+
+ initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
+ dataSource -> dataSource.getInitialLoadStateLiveData());
+ paginationNetworkState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
+ dataSource -> dataSource.getPaginationNetworkStateLiveData());
+
+ PagedList.Config pagedListConfig =
+ (new PagedList.Config.Builder())
+ .setEnablePlaceholders(false)
+ .setPageSize(25)
+ .build();
+
+ posts = (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
+ }
+
+ public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback);
@@ -55,9 +73,9 @@ public class PostViewModel extends ViewModel {
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
- int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
- query, postType, onPostFetchedCallback);
+ query, postType, sortType, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
dataSource -> dataSource.getInitialLoadStateLiveData());
@@ -104,14 +122,27 @@ public class PostViewModel extends ViewModel {
private String subredditName;
private String query;
private int postType;
+ private String sortType;
private PostDataSource.OnPostFetchedCallback onPostFetchedCallback;
- public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType,
+ public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.postType = postType;
+ this.sortType = sortType;
+ this.onPostFetchedCallback = onPostFetchedCallback;
+ }
+
+ public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
+ String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ this.retrofit = retrofit;
+ this.accessToken = accessToken;
+ this.locale = locale;
+ this.subredditName = subredditName;
+ this.postType = postType;
+ this.sortType = sortType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@@ -126,13 +157,14 @@ public class PostViewModel extends ViewModel {
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
- int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.subredditName = subredditName;
this.query = query;
this.postType = postType;
+ this.sortType = sortType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@@ -140,9 +172,11 @@ public class PostViewModel extends ViewModel {
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if(postType == PostDataSource.TYPE_FRONT_PAGE) {
- return (T) new PostViewModel(retrofit, accessToken, locale, postType, onPostFetchedCallback);
+ return (T) new PostViewModel(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback);
} else if(postType == PostDataSource.TYPE_SEARCH){
- return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, onPostFetchedCallback);
+ return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, sortType, onPostFetchedCallback);
+ } else if(postType == PostDataSource.TYPE_SUBREDDIT) {
+ return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback);
} else {
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback);
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java
index 9ad7d23d..0aba1d50 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java
@@ -41,12 +41,12 @@ public interface RedditAPI {
@GET("comments/{id}.json?raw_json=1")
Call<String> getPost(@Path("id") String id, @HeaderMap Map<String, String> headers);
- @GET("best?raw_json=1")
- Call<String> getBestPosts(@Query("after") String lastItem, @HeaderMap Map<String, String> headers);
+ @GET("{sortType}?raw_json=1")
+ Call<String> getBestPosts(@Path("sortType") String sortType, @Query("after") String lastItem, @HeaderMap Map<String, String> headers);
- @GET("r/{subredditName}.json?raw_json=1&limit=25")
- Call<String> getSubredditBestPosts(@Path("subredditName") String subredditName, @Query("after") String lastItem,
- @HeaderMap Map<String, String> headers);
+ @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=25")
+ Call<String> getSubredditBestPosts(@Path("subredditName") String subredditName, @Path("sortType") String sortType,
+ @Query("after") String lastItem, @HeaderMap Map<String, String> headers);
@GET("user/{username}/submitted.json?raw_json=1&limit=25")
Call<String> getUserBestPosts(@Path("username") String username, @Query("after") String lastItem,
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java
index a677b058..b8f304bd 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java
@@ -102,6 +102,7 @@ public class SearchResultActivity extends AppCompatActivity {
PostFragment mFragment = new PostFragment();
Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SEARCH);
+ bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, mSubredditName);
bundle.putString(PostFragment.EXTRA_QUERY, mQuery);
mFragment.setArguments(bundle);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java
new file mode 100644
index 00000000..1af128a0
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SortTypeBottomSheetFragment.java
@@ -0,0 +1,88 @@
+package ml.docilealligator.infinityforreddit;
+
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class SortTypeBottomSheetFragment extends BottomSheetDialogFragment {
+
+ interface SortTypeSelectionCallback {
+ void sortTypeSelected(String sortType);
+ }
+
+ @BindView(R.id.best_type_text_view_sort_type_bottom_sheet_fragment) TextView bestTypeTextView;
+ @BindView(R.id.hot_type_text_view_sort_type_bottom_sheet_fragment) TextView hotTypeTextView;
+ @BindView(R.id.new_type_text_view_sort_type_bottom_sheet_fragment) TextView newTypeTextView;
+ @BindView(R.id.random_type_text_view_sort_type_bottom_sheet_fragment) TextView randomTypeTextView;
+ @BindView(R.id.rising_type_text_view_sort_type_bottom_sheet_fragment) TextView risingTypeTextView;
+ @BindView(R.id.top_type_text_view_sort_type_bottom_sheet_fragment) TextView topTypeTextView;
+ @BindView(R.id.controversial_type_text_view_sort_type_bottom_sheet_fragment) TextView controversialTypeTextView;
+
+ public SortTypeBottomSheetFragment() {
+ // Required empty public constructor
+ }
+
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_sort_type_bottom_sheet, container, false);
+ ButterKnife.bind(this, rootView);
+
+ Activity activity = getActivity();
+
+ bestTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_BEST);
+ dismiss();
+ });
+
+ hotTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_HOT);
+ dismiss();
+ });
+
+ newTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_NEW);
+ dismiss();
+ });
+
+ randomTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_RANDOM);
+ dismiss();
+ });
+
+ risingTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_RISING);
+ dismiss();
+ });
+
+ topTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_TOP);
+ dismiss();
+ });
+
+ controversialTypeTextView.setOnClickListener(view -> {
+ ((SortTypeSelectionCallback) activity).sortTypeSelected(PostDataSource.SORT_TYPE_BEST);
+ dismiss();
+ });
+
+ return rootView;
+ }
+
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java
index 4c6abc3e..e6ff9bfe 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java
@@ -43,7 +43,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import pl.droidsonroids.gif.GifImageView;
import retrofit2.Retrofit;
-public class ViewSubredditDetailActivity extends AppCompatActivity {
+public class ViewSubredditDetailActivity extends AppCompatActivity implements SortTypeBottomSheetFragment.SortTypeSelectionCallback {
public static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN";
@@ -72,6 +72,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
private Menu mMenu;
private AppBarLayout.LayoutParams params;
private BottomSheetDialog dialog;
+ private SortTypeBottomSheetFragment sortTypeBottomSheetFragment;
private SubscribedSubredditDao subscribedSubredditDao;
private SubredditViewModel mSubredditViewModel;
@@ -95,6 +96,8 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
ButterKnife.bind(this);
+ ((Infinity) getApplication()).getmAppComponent().inject(this);
+
View dialogView = View.inflate(this, R.layout.post_type_bottom_sheet, null);
LinearLayout textTypeLinearLayout = dialogView.findViewById(R.id.text_type_linear_layout_post_type_bottom_sheet);
LinearLayout linkTypeLinearLayout = dialogView.findViewById(R.id.link_type_linear_layout_post_type_bottom_sheet);
@@ -104,7 +107,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
dialog = new BottomSheetDialog(this);
dialog.setContentView(dialogView);
- ((Infinity) getApplication()).getmAppComponent().inject(this);
+ sortTypeBottomSheetFragment = new SortTypeBottomSheetFragment();
params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
@@ -259,12 +262,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
});
if(savedInstanceState == null) {
- mFragment = new PostFragment();
- Bundle bundle = new Bundle();
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName);
- bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
- mFragment.setArguments(bundle);
- getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
+ replaceFragment(PostDataSource.SORT_TYPE_BEST);
} else {
mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY);
if(mFragment == null) {
@@ -272,6 +270,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
Bundle bundle = new Bundle();
bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName);
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
+ bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
mFragment.setArguments(bundle);
}
isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE);
@@ -335,6 +334,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
case android.R.id.home:
finish();
return true;
+ case R.id.action_sort_view_subreddit_detail_activity:
+ sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag());
+ return true;
case R.id.action_search_view_subreddit_detail_activity:
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, subredditName);
@@ -367,6 +369,16 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
return false;
}
+ private void replaceFragment(String sortType) {
+ mFragment = new PostFragment();
+ Bundle bundle = new Bundle();
+ bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName);
+ bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
+ bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType);
+ mFragment.setArguments(bundle);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
+ }
+
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
@@ -378,6 +390,11 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
Snackbar.make(coordinatorLayout, resId, Snackbar.LENGTH_SHORT).show();
}
+ @Override
+ public void sortTypeSelected(String sortType) {
+ replaceFragment(sortType);
+ }
+
private static class InsertSubredditDataAsyncTask extends AsyncTask<Void, Void, Void> {
private SubredditDao mSubredditDao;
diff --git a/app/src/main/res/drawable/ic_outline_sort_24px.xml b/app/src/main/res/drawable/ic_outline_sort_24px.xml
new file mode 100644
index 00000000..e795d2a2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_outline_sort_24px.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z"/>
+</vector>
diff --git a/app/src/main/res/layout/activity_post_video.xml b/app/src/main/res/layout/activity_post_video.xml
index f0df4eea..d1c3ed58 100644
--- a/app/src/main/res/layout/activity_post_video.xml
+++ b/app/src/main/res/layout/activity_post_video.xml
@@ -166,13 +166,11 @@
android:textColor="@color/colorAccent"
android:visibility="gone" />
- <ImageView
- android:id="@+id/image_view_post_video_activity"
+ <VideoView
+ android:id="@+id/video_view_post_video_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:scaleType="fitStart"
- android:adjustViewBounds="true"
- android:visibility="gone" />
+ android:visibility="gone"/>
</LinearLayout>
diff --git a/app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml b/app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml
new file mode 100644
index 00000000..bdf38858
--- /dev/null
+++ b/app/src/main/res/layout/fragment_sort_type_bottom_sheet.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical" android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="16dp"
+ android:text="@string/sort"
+ android:textSize="18sp" />
+
+ <TextView
+ android:id="@+id/best_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_best"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/hot_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_hot"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/new_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_new"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/random_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_random"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/rising_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_rising"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/top_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_top"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/controversial_type_text_view_sort_type_bottom_sheet_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_rising"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/sort_type_bottom_sheet.xml b/app/src/main/res/layout/sort_type_bottom_sheet.xml
new file mode 100644
index 00000000..5951b431
--- /dev/null
+++ b/app/src/main/res/layout/sort_type_bottom_sheet.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical" android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="16dp"
+ android:text="@string/sort"
+ android:textSize="18sp" />
+
+ <TextView
+ android:id="@+id/best_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_best"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/hot_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_hot"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/new_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_new"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/random_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_random"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/rising_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_rising"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/top_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_top"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+ <TextView
+ android:id="@+id/controversial_type_text_view_sort_type_bottom_sheet"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sort_rising"
+ android:textColor="@color/primaryTextColor"
+ android:textSize="18sp"
+ android:padding="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?attr/selectableItemBackground" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/menu/main_activity.xml b/app/src/main/res/menu/main_activity.xml
index 2d4d02ad..43cb0785 100644
--- a/app/src/main/res/menu/main_activity.xml
+++ b/app/src/main/res/menu/main_activity.xml
@@ -4,21 +4,28 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="ml.docilealligator.infinityforreddit.MainActivity">
<item
- android:id="@+id/action_search_main_activity"
+ android:id="@+id/action_sort_main_activity"
android:orderInCategory="1"
android:title="@string/action_search"
+ android:icon="@drawable/ic_outline_sort_24px"
+ app:showAsAction="ifRoom" />
+
+ <item
+ android:id="@+id/action_search_main_activity"
+ android:orderInCategory="2"
+ android:title="@string/action_search"
android:icon="@drawable/ic_search_white_24dp"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_refresh_main_activity"
- android:orderInCategory="2"
+ android:orderInCategory="3"
android:title="@string/action_refresh"
app:showAsAction="never" />
<item
android:id="@+id/action_lazy_mode_main_activity"
- android:orderInCategory="3"
+ android:orderInCategory="4"
android:title="@string/action_start_lazy_mode"
app:showAsAction="never" />
</menu> \ No newline at end of file
diff --git a/app/src/main/res/menu/view_subreddit_detail_activity.xml b/app/src/main/res/menu/view_subreddit_detail_activity.xml
index 41e83e7d..9dcdb633 100644
--- a/app/src/main/res/menu/view_subreddit_detail_activity.xml
+++ b/app/src/main/res/menu/view_subreddit_detail_activity.xml
@@ -4,21 +4,28 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="ml.docilealligator.infinityforreddit.ViewSubredditDetailActivity">
<item
- android:id="@+id/action_search_view_subreddit_detail_activity"
+ android:id="@+id/action_sort_view_subreddit_detail_activity"
android:orderInCategory="1"
android:title="@string/action_search"
+ android:icon="@drawable/ic_outline_sort_24px"
+ app:showAsAction="ifRoom" />
+
+ <item
+ android:id="@+id/action_search_view_subreddit_detail_activity"
+ android:orderInCategory="2"
+ android:title="@string/action_search"
android:icon="@drawable/ic_search_white_24dp"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_refresh_view_subreddit_detail_activity"
- android:orderInCategory="2"
+ android:orderInCategory="3"
android:title="@string/action_refresh"
android:icon="@drawable/ic_refresh_white_24dp"
app:showAsAction="never" />
<item
android:id="@+id/action_lazy_mode_view_subreddit_detail_activity"
- android:orderInCategory="3"
+ android:orderInCategory="4"
android:title="@string/action_start_lazy_mode"
app:showAsAction="never" />
</menu> \ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c7c521ad..80775602 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -133,4 +133,16 @@
<string name="all_subreddits">All subreddits</string>
<string name="error_loading_post">Error loading this post.\nTap to retry.</string>
+
+ <string name="sort">Sort</string>
+ <string name="sort_best">Best</string>
+ <string name="sort_hot">Hot</string>
+ <string name="sort_new">New</string>
+ <string name="sort_random">Random</string>
+ <string name="sort_rising">Rising</string>
+ <string name="sort_top">Top</string>
+ <string name="sort_controversial">Controversial</string>
+
+ <!-- TODO: Remove or change this placeholder text -->
+ <string name="hello_blank_fragment">Hello blank fragment</string>
</resources>