Submitting posts to subreddit is available now. Fixed User's posts cannot be all loaded.

This commit is contained in:
Alex Ning 2019-07-11 16:32:27 +08:00
parent 36d24523b6
commit d8669c94e8
17 changed files with 249 additions and 78 deletions

View File

@ -19,7 +19,8 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity android:name=".SubscribedThingListingActivity" <activity
android:name=".SubscribedThingListingActivity"
android:label="@string/subscriptions" android:label="@string/subscriptions"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar" />
@ -30,7 +31,8 @@
<activity <activity
android:name=".PostTextActivity" android:name=".PostTextActivity"
android:label="@string/post_text_activity_label" android:label="@string/post_text_activity_label"
android:parentActivityName=".MainActivity" /> android:parentActivityName=".MainActivity"
android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".CommentActivity" android:name=".CommentActivity"
android:label="@string/comment_activity_label" android:label="@string/comment_activity_label"

View File

@ -17,4 +17,5 @@ interface AppComponent {
void inject(ViewUserDetailActivity viewUserDetailActivity); void inject(ViewUserDetailActivity viewUserDetailActivity);
void inject(CommentActivity commentActivity); void inject(CommentActivity commentActivity);
void inject(SubscribedThingListingActivity subscribedThingListingActivity); void inject(SubscribedThingListingActivity subscribedThingListingActivity);
void inject(PostTextActivity postTextActivity);
} }

View File

@ -121,7 +121,9 @@ public class CommentActivity extends AppCompatActivity {
finish(); finish();
} }
}); });
return true;
} }
return super.onOptionsItemSelected(item);
return false;
} }
} }

View File

@ -70,4 +70,5 @@ public class JSONUtils {
static final String JSON_KEY = "json"; static final String JSON_KEY = "json";
static final String THINGS_KEY = "things"; static final String THINGS_KEY = "things";
static final String PARENT_ID_KEY = "parent_id"; static final String PARENT_ID_KEY = "parent_id";
static final String ERRORS_KEY = "errors";
} }

View File

@ -2,12 +2,13 @@ package ml.docilealligator.infinityforreddit;
import android.util.Log; import android.util.Log;
import java.util.ArrayList;
import java.util.Locale;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.paging.PageKeyedDataSource; import androidx.paging.PageKeyedDataSource;
import java.util.ArrayList;
import java.util.Locale;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Retrofit; import retrofit2.Retrofit;
@ -114,7 +115,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
loadSubredditPostsAfter(params, callback); loadSubredditPostsAfter(params, callback);
break; break;
case TYPE_USER: case TYPE_USER:
loadUserPostsAfter(params, callback); loadUserPostsAfter(params, callback, null);
break; break;
case TYPE_SEARCH: case TYPE_SEARCH:
loadSearchPostsAfter(params, callback); loadSearchPostsAfter(params, callback);
@ -157,8 +158,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
@ -170,7 +171,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
bestPost.enqueue(new Callback<String>() { bestPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() {
@Override @Override
@ -192,8 +193,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
@ -204,7 +205,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
Call<String> getPost = api.getSubredditBestPosts(name, null, RedditUtils.getOAuthHeader(accessToken)); Call<String> getPost = api.getSubredditBestPosts(name, null, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, ParsePost.parsePosts(response.body(), locale,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@ -233,8 +234,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
@ -245,7 +246,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
Call<String> getPost = api.getSubredditBestPosts(name, params.key, RedditUtils.getOAuthHeader(accessToken)); Call<String> getPost = api.getSubredditBestPosts(name, params.key, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() {
@Override @Override
@ -267,8 +268,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
@ -279,7 +280,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
Call<String> getPost = api.getUserBestPosts(name, lastItem, RedditUtils.getOAuthHeader(accessToken)); Call<String> getPost = api.getUserBestPosts(name, lastItem, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, ParsePost.parsePosts(response.body(), locale,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@ -311,42 +312,48 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
} }
private void loadUserPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback) { private void loadUserPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback, String lastItem) {
String after = lastItem == null ? params.key : lastItem;
RedditAPI api = retrofit.create(RedditAPI.class); RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> getPost = api.getUserBestPosts(name, params.key, RedditUtils.getOAuthHeader(accessToken)); Call<String> getPost = api.getUserBestPosts(name, after, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
callback.onResult(newPosts, lastItem); if(newPosts.size() == 0 && !lastItem.equals("null")) {
paginationNetworkStateLiveData.postValue(NetworkState.LOADED); loadUserPostsAfter(params, callback, lastItem);
} else {
callback.onResult(newPosts, lastItem);
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
} }
@Override @Override
public void onParsePostsListingFail() { public void onParsePostsListingFail() {
Log.i("Best post", "Error parsing data"); Log.i("User posts", "Error parsing data");
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
} }
}); });
} else { } else {
Log.i("Best post", response.message()); Log.i("User posts", response.message());
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message())); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message()));
} }
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
@ -357,7 +364,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
Call<String> getPost = api.searchPosts(name, null, RedditUtils.getOAuthHeader(accessToken)); Call<String> getPost = api.searchPosts(name, null, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, ParsePost.parsePosts(response.body(), locale,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@ -386,8 +393,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); initialLoadStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });
@ -398,7 +405,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
Call<String> getPost = api.searchPosts(name, params.key, RedditUtils.getOAuthHeader(accessToken)); Call<String> getPost = api.searchPosts(name, params.key, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(Call<String> call, retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, new ParsePost.ParsePostsListingListener() {
@Override @Override
@ -409,19 +416,19 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override @Override
public void onParsePostsListingFail() { public void onParsePostsListingFail() {
Log.i("Best post", "Error parsing data"); Log.i("Search post", "Error parsing data");
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data")); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, "Error parsing data"));
} }
}); });
} else { } else {
Log.i("Best post", response.message()); Log.i("Search post", response.message());
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message())); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, response.message()));
} }
} }
@Override @Override
public void onFailure(Call<String> call, Throwable t) { public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
String errorMessage = t == null ? "unknown error" : t.getMessage(); String errorMessage = t.getMessage();
paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage)); paginationNetworkStateLiveData.postValue(new NetworkState(NetworkState.Status.FAILED, errorMessage));
} }
}); });

View File

@ -145,7 +145,6 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
canStartActivity = false; canStartActivity = false;
Intent intent = new Intent(mContext, ViewPostDetailActivity.class); Intent intent = new Intent(mContext, ViewPostDetailActivity.class);
intent.putExtra(ViewPostDetailActivity.EXTRA_TITLE, title);
intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, post); intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, post);
intent.putExtra(ViewPostDetailActivity.EXTRA_POST_LIST_POSITION, position); intent.putExtra(ViewPostDetailActivity.EXTRA_POST_LIST_POSITION, position);
mContext.startActivity(intent); mContext.startActivity(intent);

View File

@ -1,8 +1,10 @@
package ml.docilealligator.infinityforreddit; package ml.docilealligator.infinityforreddit;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
@ -12,15 +14,23 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager; import com.bumptech.glide.RequestManager;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.snackbar.Snackbar;
import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import pl.droidsonroids.gif.GifImageView; import pl.droidsonroids.gif.GifImageView;
import retrofit2.Retrofit;
public class PostTextActivity extends AppCompatActivity { public class PostTextActivity extends AppCompatActivity {
@ -28,6 +38,7 @@ public class PostTextActivity extends AppCompatActivity {
private static final int SUBREDDIT_SELECTION_REQUEST_CODE = 0; private static final int SUBREDDIT_SELECTION_REQUEST_CODE = 0;
@BindView(R.id.coordinator_layout_post_detail_activity) CoordinatorLayout coordinatorLayout;
@BindView(R.id.subreddit_icon_gif_image_view_post_text_activity) GifImageView iconGifImageView; @BindView(R.id.subreddit_icon_gif_image_view_post_text_activity) GifImageView iconGifImageView;
@BindView(R.id.subreddit_name_text_view_post_text_activity) TextView subreditNameTextView; @BindView(R.id.subreddit_name_text_view_post_text_activity) TextView subreditNameTextView;
@BindView(R.id.rules_button_post_text_activity) Button rulesButton; @BindView(R.id.rules_button_post_text_activity) Button rulesButton;
@ -35,6 +46,15 @@ public class PostTextActivity extends AppCompatActivity {
@BindView(R.id.post_text_content_edit_text_post_text_activity) EditText contentEditText; @BindView(R.id.post_text_content_edit_text_post_text_activity) EditText contentEditText;
private RequestManager mGlide; private RequestManager mGlide;
private Locale mLocale;
@Inject
@Named("oauth")
Retrofit mOauthRetrofit;
@Inject
@Named("auth_info")
SharedPreferences sharedPreferences;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -43,11 +63,14 @@ public class PostTextActivity extends AppCompatActivity {
ButterKnife.bind(this); ButterKnife.bind(this);
((Infinity) getApplication()).getmAppComponent().inject(this);
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp); Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp);
actionBar.setHomeAsUpIndicator(upArrow); actionBar.setHomeAsUpIndicator(upArrow);
mGlide = Glide.with(this); mGlide = Glide.with(this);
mLocale = getResources().getConfiguration().locale;
if(getIntent().hasExtra(EXTRA_SUBREDDIT_NAME)) { if(getIntent().hasExtra(EXTRA_SUBREDDIT_NAME)) {
subreditNameTextView.setText(getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME)); subreditNameTextView.setText(getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME));
@ -63,12 +86,44 @@ public class PostTextActivity extends AppCompatActivity {
}); });
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.post_text_activity, menu);
return true;
}
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case android.R.id.home: case android.R.id.home:
finish(); finish();
return true; return true;
case R.id.action_send_post_text_activity:
item.setEnabled(false);
item.getIcon().setAlpha(130);
Snackbar postingSnackbar = Snackbar.make(coordinatorLayout, R.string.posting, Snackbar.LENGTH_INDEFINITE);
postingSnackbar.show();
SubmitPost.submitPostText(mOauthRetrofit, sharedPreferences, mLocale, subreditNameTextView.getText().toString(),
titleEditText.getText().toString(), contentEditText.getText().toString(),
false, new SubmitPost.SubmitPostListener() {
@Override
public void submitSuccessful(Post post) {
Intent intent = new Intent(PostTextActivity.this, ViewPostDetailActivity.class);
intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, post);
startActivity(intent);
finish();
}
@Override
public void submitFailed() {
postingSnackbar.dismiss();
item.setEnabled(true);
item.getIcon().setAlpha(255);
Snackbar.make(coordinatorLayout, R.string.post_failed, Snackbar.LENGTH_SHORT);
}
});
return true;
} }
return false; return false;

View File

@ -78,4 +78,8 @@ public interface RedditAPI {
@FormUrlEncoded @FormUrlEncoded
@POST("/api/del") @POST("/api/del")
Call<String> delete(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params); Call<String> delete(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
@FormUrlEncoded
@POST("/api/submit")
Call<String> submit(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
} }

View File

@ -49,10 +49,18 @@ public class RedditUtils {
static final String SR_NAME_KEY = "sr_name"; static final String SR_NAME_KEY = "sr_name";
static final String API_TYPE_KEY = "api_type"; static final String API_TYPE_KEY = "api_type";
static final String API_TYPE_JSON = "json";
static final String RETURN_RTJSON_KEY = "return_rtjson"; static final String RETURN_RTJSON_KEY = "return_rtjson";
static final String TEXT_KEY = "text"; static final String TEXT_KEY = "text";
static final String THING_ID_KEY = "thing_id"; static final String THING_ID_KEY = "thing_id";
static final String SR_KEY = "sr";
static final String TITLE_KEY = "title";
static final String NSFW_KEY = "nsfw";
static final String KIND_KEY = "kind";
static final String KIND_TEXT = "text";
static final String KIND_SELF = "self";
static Map<String, String> getHttpBasicAuthHeader() { static Map<String, String> getHttpBasicAuthHeader() {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
String credentials = String.format("%s:%s", RedditUtils.CLIENT_ID, ""); String credentials = String.format("%s:%s", RedditUtils.CLIENT_ID, "");

View File

@ -0,0 +1,109 @@
package ml.docilealligator.infinityforreddit;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
class SubmitPost {
interface SubmitPostListener {
void submitSuccessful(Post post);
void submitFailed();
}
static void submitPostText(Retrofit oauthRetrofit, SharedPreferences authInfoSharedPreferences,
Locale locale, String subredditName, String title, String text, boolean isNSFW,
SubmitPostListener submitPostListener) {
RedditAPI api = oauthRetrofit.create(RedditAPI.class);
String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.API_TYPE_KEY, RedditUtils.API_TYPE_JSON);
params.put(RedditUtils.SR_KEY, subredditName);
params.put(RedditUtils.TITLE_KEY, title);
params.put(RedditUtils.KIND_KEY, RedditUtils.KIND_TEXT);
params.put(RedditUtils.TEXT_KEY, text);
params.put(RedditUtils.NSFW_KEY, Boolean.toString(isNSFW));
Call<String> submitPostCall = api.submit(RedditUtils.getOAuthHeader(accessToken), params);
submitPostCall.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
Log.i("code", "asfd" + response.body());
if(response.isSuccessful()) {
try {
getSubmittedPost(response.body(), oauthRetrofit, authInfoSharedPreferences, locale,
submitPostListener);
} catch (JSONException e) {
e.printStackTrace();
submitPostListener.submitFailed();
}
} else {
Log.i("call_failed", response.message());
submitPostListener.submitFailed();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call_failed", call.request().url().toString());
submitPostListener.submitFailed();
}
});
}
private static void getSubmittedPost(String response, Retrofit oauthRetrofit,
SharedPreferences authInfoSharedPreferences, Locale locale,
SubmitPostListener submitPostListener) throws JSONException {
JSONObject responseObject = new JSONObject(response);
if(responseObject.getJSONObject(JSONUtils.JSON_KEY).getJSONArray(JSONUtils.ERRORS_KEY).length() != 0) {
submitPostListener.submitFailed();
return;
}
String postId = responseObject.getJSONObject(JSONUtils.JSON_KEY).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.ID_KEY);
RedditAPI api = oauthRetrofit.create(RedditAPI.class);
String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
Call<String> getPostCall = api.getPost(postId, RedditUtils.getOAuthHeader(accessToken));
getPostCall.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePost(response.body(), locale, new ParsePost.ParsePostListener() {
@Override
public void onParsePostSuccess(Post post) {
submitPostListener.submitSuccessful(post);
}
@Override
public void onParsePostFail() {
submitPostListener.submitFailed();
}
});
} else {
Log.i("call_failed", response.message());
submitPostListener.submitFailed();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call_failed", call.request().url().toString());
submitPostListener.submitFailed();
}
});
}
}

View File

@ -33,7 +33,7 @@ public class SubredditSelectionActivity extends AppCompatActivity {
SubscribedSubredditsListingFragment fragment = new SubscribedSubredditsListingFragment(); SubscribedSubredditsListingFragment fragment = new SubscribedSubredditsListingFragment();
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(PostFragment.POST_TYPE_KEY, PostDataSource.TYPE_FRONT_PAGE); bundle.putBoolean(SubscribedSubredditsListingFragment.EXTRA_IS_SUBREDDIT_SELECTION, true);
fragment.setArguments(bundle); fragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_subreddit_selection_activity, fragment).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_subreddit_selection_activity, fragment).commit();
} }

View File

@ -60,11 +60,9 @@ public class SubscribedSubredditsListingFragment extends Fragment {
SubscribedSubredditsRecyclerViewAdapter adapter; SubscribedSubredditsRecyclerViewAdapter adapter;
if(getArguments().getBoolean(EXTRA_IS_SUBREDDIT_SELECTION)) { if(getArguments().getBoolean(EXTRA_IS_SUBREDDIT_SELECTION)) {
adapter = new SubscribedSubredditsRecyclerViewAdapter(mActivity); adapter = new SubscribedSubredditsRecyclerViewAdapter(mActivity, (name, iconUrl) -> ((SubredditSelectionActivity) mActivity).getSelectedSubreddit(name, iconUrl));
} else { } else {
adapter = new SubscribedSubredditsRecyclerViewAdapter(mActivity, (name, iconUrl) -> { adapter = new SubscribedSubredditsRecyclerViewAdapter(mActivity);
((SubredditSelectionActivity) mActivity).getSelectedSubreddit(name, iconUrl);
});
} }

View File

@ -129,7 +129,11 @@ public class SubscribedThingListingActivity extends AppCompatActivity {
public Fragment getItem(int position) { public Fragment getItem(int position) {
switch (position) { switch (position) {
case 0: { case 0: {
return new SubscribedSubredditsListingFragment(); SubscribedSubredditsListingFragment fragment = new SubscribedSubredditsListingFragment();
Bundle bundle = new Bundle();
bundle.putBoolean(SubscribedSubredditsListingFragment.EXTRA_IS_SUBREDDIT_SELECTION, false);
fragment.setArguments(bundle);
return fragment;
} }
default: default:
{ {

View File

@ -38,7 +38,6 @@ import static ml.docilealligator.infinityforreddit.CommentActivity.WRITE_COMMENT
public class ViewPostDetailActivity extends AppCompatActivity { public class ViewPostDetailActivity extends AppCompatActivity {
static final String EXTRA_TITLE = "ET";
static final String EXTRA_POST_DATA = "EPD"; static final String EXTRA_POST_DATA = "EPD";
static final String EXTRA_POST_LIST_POSITION = "EPLI"; static final String EXTRA_POST_LIST_POSITION = "EPLI";
@ -185,38 +184,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
} }
}); });
} }
/*mCommentProgressbar.setVisibility(View.GONE);
if (expandedComments.size() > 0) {
if(mAdapter == null) {
mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
if(!isLoadingMoreChildren) {
View view = mNestedScrollView.getChildAt(mNestedScrollView.getChildCount() - 1);
int diff = view.getBottom() - (mNestedScrollView.getHeight() +
mNestedScrollView.getScrollY());
if(diff == 0) {
fetchMoreComments(mChildrenStartingIndex);
}
}
});
}
mAdapter = new CommentRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
mOauthRetrofit, mGlide, mSharedPreferences, mPost,
mPost.getSubredditNamePrefixed(), mLocale, new CommentRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
@Override
public void updatePost(Post post) {
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
}
});
mRecyclerView.setAdapter(mAdapter);
//mCommentCardView.setVisibility(View.VISIBLE);
} else {
mNoCommentWrapperLinearLayout.setVisibility(View.VISIBLE);
mGlide.load(R.drawable.no_comment_placeholder).into(mNoCommentImageView);
}*/
} }
@Override @Override

View File

@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/coordinator_layout_post_detail_activity"
tools:context=".PostTextActivity"> tools:context=".PostTextActivity">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_send_post_text_activity"
android:orderInCategory="1"
android:title="@string/action_send"
android:icon="@drawable/ic_send_white_24dp"
app:showAsAction="ifRoom" />
</menu>

View File

@ -80,6 +80,9 @@
<string name="send_comment_failed">Could not send this comment</string> <string name="send_comment_failed">Could not send this comment</string>
<string name="parse_sent_comment_failed">The comment is sent but unable to get the sent comment</string> <string name="parse_sent_comment_failed">The comment is sent but unable to get the sent comment</string>
<string name="posting">Posting</string>
<string name="post_failed">Could not post it</string>
<string name="download_completed">Download completed</string> <string name="download_completed">Download completed</string>
<string name="download_failed">Download Failed</string> <string name="download_failed">Download Failed</string>