diff --git a/app/build.gradle b/app/build.gradle
index d51c78f9..5ea34e53 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -76,6 +76,10 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'me.zhanghai.android.fastscroll:library:1.1.2'
+ def toroVersion = '3.7.0.2010003'
+ implementation "im.ene.toro3:toro:$toroVersion"
+ implementation "im.ene.toro3:toro-ext-exoplayer:$toroVersion"
+
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b665b78b..08f83a69 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,14 +21,20 @@
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:replace="android:label">
-
+
-
+ android:theme="@style/AppTheme.NoActionBar" />
generalReasons;
+ private ArrayList rulesReasons;
+ private ReportReasonRecyclerViewAdapter mAdapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ ((Infinity) getApplication()).getAppComponent().inject(this);
+
+ setImmersiveModeNotApplicable();
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_report);
+
+ ButterKnife.bind(this);
+
+ applyCustomTheme();
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isChangeStatusBarIconColor()) {
+ addOnOffsetChangedListener(appBarLayout);
+ }
+
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ mFullname = getIntent().getStringExtra(EXTRA_THING_FULLNAME);
+ mSubredditName = getIntent().getStringExtra(EXTRA_SUBREDDIT_NAME);
+
+ if (savedInstanceState != null) {
+ mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE);
+ mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE);
+
+ if (!mNullAccessToken && mAccessToken == null) {
+ getCurrentAccount();
+ }
+
+ generalReasons = savedInstanceState.getParcelableArrayList(GENERAL_REASONS_STATE);
+ rulesReasons = savedInstanceState.getParcelableArrayList(RULES_REASON_STATE);
+ } else {
+ getCurrentAccount();
+ }
+
+ if (generalReasons != null) {
+ mAdapter = new ReportReasonRecyclerViewAdapter(mCustomThemeWrapper, generalReasons);
+ } else {
+ mAdapter = new ReportReasonRecyclerViewAdapter(mCustomThemeWrapper, ReportReason.getGeneralReasons(this));
+ }
+ recyclerView.setLayoutManager(new LinearLayoutManager(this));
+ recyclerView.setAdapter(mAdapter);
+
+ if (rulesReasons == null) {
+ FetchRules.fetchRules(mRetrofit, mSubredditName, new FetchRules.FetchRulesListener() {
+ @Override
+ public void success(ArrayList rules) {
+ mAdapter.setRules(ReportReason.convertRulesToReasons(rules));
+ }
+
+ @Override
+ public void failed() {
+ Snackbar.make(coordinatorLayout, R.string.error_loading_rules_without_retry, Snackbar.LENGTH_SHORT).show();
+ }
+ });
+ } else {
+ mAdapter.setRules(rulesReasons);
+ }
+ }
+
+ private void getCurrentAccount() {
+ new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> {
+ if (account == null) {
+ mNullAccessToken = true;
+ } else {
+ mAccessToken = account.getAccessToken();
+ }
+ }).execute();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.report_activity, menu);
+ applyMenuItemTheme(menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ case R.id.action_send_report_activity:
+ ReportReason reportReason = mAdapter.getSelectedReason();
+ if (reportReason != null) {
+ Toast.makeText(ReportActivity.this, R.string.reporting, Toast.LENGTH_SHORT).show();
+ ReportThing.reportThing(mOauthRetrofit, mAccessToken, mFullname, mSubredditName,
+ reportReason.getReasonType(), reportReason.getReportReason(), new ReportThing.ReportThingListener() {
+ @Override
+ public void success() {
+ Toast.makeText(ReportActivity.this, R.string.report_successful, Toast.LENGTH_SHORT).show();
+ finish();
+ }
+
+ @Override
+ public void failed() {
+ Toast.makeText(ReportActivity.this, R.string.report_failed, Toast.LENGTH_SHORT).show();
+ }
+ });
+ } else {
+ Toast.makeText(ReportActivity.this, R.string.report_reason_not_selected, Toast.LENGTH_SHORT).show();
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken);
+ outState.putString(ACCESS_TOKEN_STATE, mAccessToken);
+ if (mAdapter != null) {
+ outState.putParcelableArrayList(GENERAL_REASONS_STATE, mAdapter.getGeneralReasons());
+ outState.putParcelableArrayList(RULES_REASON_STATE, mAdapter.getRules());
+ }
+ }
+
+ @Override
+ protected SharedPreferences getSharedPreferences() {
+ return mSharedPreferences;
+ }
+
+ @Override
+ protected CustomThemeWrapper getCustomThemeWrapper() {
+ return mCustomThemeWrapper;
+ }
+
+ @Override
+ protected void applyCustomTheme() {
+ coordinatorLayout.setBackgroundColor(mCustomThemeWrapper.getBackgroundColor());
+ applyAppBarLayoutAndToolbarTheme(appBarLayout, toolbar);
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/RulesActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/RulesActivity.java
index 925efd0e..2c5cb05c 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/RulesActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/RulesActivity.java
@@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit.Activity;
import android.content.SharedPreferences;
import android.content.res.ColorStateList;
-import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
@@ -22,9 +21,6 @@ import com.google.android.material.appbar.AppBarLayout;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
import java.util.ArrayList;
@@ -36,15 +32,10 @@ import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.Adapter.RulesRecyclerViewAdapter;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.Event.SwitchAccountEvent;
+import ml.docilealligator.infinityforreddit.FetchRules;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R;
-import ml.docilealligator.infinityforreddit.RedditAPI;
import ml.docilealligator.infinityforreddit.Rule;
-import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
-import ml.docilealligator.infinityforreddit.Utils.Utils;
-import retrofit2.Call;
-import retrofit2.Callback;
-import retrofit2.Response;
import retrofit2.Retrofit;
public class RulesActivity extends BaseActivity {
@@ -116,7 +107,26 @@ public class RulesActivity extends BaseActivity {
mAdapter = new RulesRecyclerViewAdapter(this, mCustomThemeWrapper);
recyclerView.setAdapter(mAdapter);
- fetchRules();
+ //fetchRules();
+
+ FetchRules.fetchRules(mRetrofit, mSubredditName, new FetchRules.FetchRulesListener() {
+ @Override
+ public void success(ArrayList rules) {
+ progressBar.setVisibility(View.GONE);
+ if (rules == null || rules.size() == 0) {
+ errorTextView.setVisibility(View.VISIBLE);
+ errorTextView.setText(R.string.no_rule);
+ errorTextView.setOnClickListener(view -> {
+ });
+ }
+ mAdapter.changeDataset(rules);
+ }
+
+ @Override
+ public void failed() {
+ displayError();
+ }
+ });
}
@Override
@@ -137,7 +147,7 @@ public class RulesActivity extends BaseActivity {
errorTextView.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
}
- private void fetchRules() {
+ /*private void fetchRules() {
progressBar.setVisibility(View.VISIBLE);
errorTextView.setVisibility(View.GONE);
@@ -175,13 +185,34 @@ public class RulesActivity extends BaseActivity {
displayError();
}
});
- }
+ }*/
private void displayError() {
progressBar.setVisibility(View.GONE);
errorTextView.setVisibility(View.VISIBLE);
errorTextView.setText(R.string.error_loading_rules);
- errorTextView.setOnClickListener(view -> fetchRules());
+ errorTextView.setOnClickListener(view -> {
+ progressBar.setVisibility(View.VISIBLE);
+ errorTextView.setVisibility(View.GONE);
+ FetchRules.fetchRules(mRetrofit, mSubredditName, new FetchRules.FetchRulesListener() {
+ @Override
+ public void success(ArrayList rules) {
+ progressBar.setVisibility(View.GONE);
+ if (rules == null || rules.size() == 0) {
+ errorTextView.setVisibility(View.VISIBLE);
+ errorTextView.setText(R.string.no_rule);
+ errorTextView.setOnClickListener(view -> {
+ });
+ }
+ mAdapter.changeDataset(rules);
+ }
+
+ @Override
+ public void failed() {
+ displayError();
+ }
+ });
+ });
}
@Override
@@ -205,7 +236,7 @@ public class RulesActivity extends BaseActivity {
finish();
}
- private static class ParseRulesAsyncTask extends AsyncTask, ArrayList> {
+ /*private static class ParseRulesAsyncTask extends AsyncTask, ArrayList> {
private String response;
private ParseRulesAsyncTaskListener parseRulesAsyncTaskListener;
@@ -248,5 +279,5 @@ public class RulesActivity extends BaseActivity {
void parseFailed();
}
- }
+ }*/
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ThemePreviewActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ThemePreviewActivity.java
index 83478a2f..f8275d66 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ThemePreviewActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ThemePreviewActivity.java
@@ -323,11 +323,11 @@ public class ThemePreviewActivity extends AppCompatActivity {
primaryTextView.setTextColor(customTheme.primaryTextColor);
secondaryTextView.setTextColor(customTheme.secondaryTextColor);
bottomNavigationView.setBackgroundTint(ColorStateList.valueOf(customTheme.bottomAppBarBackgroundColor));
- int primaryIconColor = customTheme.primaryIconColor;
- subscriptionsBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- multiRedditBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- messageBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- profileBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ int bottomAppBarIconColor = customTheme.bottomAppBarIconColor;
+ subscriptionsBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ multiRedditBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ messageBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ profileBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
applyTabLayoutTheme(tabLayout);
applyFABTheme(fab);
unsubscribedColor = customTheme.unsubscribed;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java
index 92d04927..f3e4d0aa 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java
@@ -64,14 +64,14 @@ import ml.docilealligator.infinityforreddit.Event.PostUpdateEventToDetailActivit
import ml.docilealligator.infinityforreddit.Event.PostUpdateEventToPostList;
import ml.docilealligator.infinityforreddit.Event.SwitchAccountEvent;
import ml.docilealligator.infinityforreddit.FetchComment;
-import ml.docilealligator.infinityforreddit.FetchPost;
+import ml.docilealligator.infinityforreddit.Post.FetchPost;
import ml.docilealligator.infinityforreddit.Flair;
import ml.docilealligator.infinityforreddit.Fragment.FlairBottomSheetFragment;
import ml.docilealligator.infinityforreddit.Fragment.PostCommentSortTypeBottomSheetFragment;
-import ml.docilealligator.infinityforreddit.HidePost;
+import ml.docilealligator.infinityforreddit.Post.HidePost;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.ParseComment;
-import ml.docilealligator.infinityforreddit.ParsePost;
+import ml.docilealligator.infinityforreddit.Post.ParsePost;
import ml.docilealligator.infinityforreddit.Post.Post;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.ReadMessage;
@@ -473,6 +473,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
hideItem.setVisible(true);
hideItem.setTitle(R.string.action_hide_post);
}
+
+ mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
} else {
saveItem.setVisible(false);
hideItem.setVisible(false);
@@ -622,6 +624,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
hideItem.setVisible(true);
hideItem.setTitle(R.string.action_hide_post);
}
+
+ mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
} else {
saveItem.setVisible(false);
hideItem.setVisible(false);
@@ -931,6 +935,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
hideItem.setVisible(true);
hideItem.setTitle(R.string.action_hide_post);
}
+
+ mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
} else {
saveItem.setVisible(false);
hideItem.setVisible(false);
@@ -1264,6 +1270,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
hideItem.setVisible(true);
hideItem.setTitle(R.string.action_hide_post);
}
+
+ mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
} else {
saveItem.setVisible(false);
hideItem.setVisible(false);
@@ -1481,6 +1489,11 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
flairBottomSheetFragment.setArguments(bundle);
flairBottomSheetFragment.show(getSupportFragmentManager(), flairBottomSheetFragment.getTag());
return true;
+ case R.id.action_report_view_post_detail_activity:
+ Intent intent = new Intent(this, ReportActivity.class);
+ intent.putExtra(ReportActivity.EXTRA_SUBREDDIT_NAME, mPost.getSubredditName());
+ intent.putExtra(ReportActivity.EXTRA_THING_FULLNAME, mPost.getFullName());
+ startActivity(intent);
case android.R.id.home:
onBackPressed();
return true;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java
index 419a5e08..f22b6361 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java
@@ -41,6 +41,9 @@ import com.google.android.material.tabs.TabLayout;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
import javax.inject.Inject;
import javax.inject.Named;
@@ -119,6 +122,10 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
TextView nSubscribersTextView;
@BindView(R.id.online_subscriber_count_text_view_view_subreddit_detail_activity)
TextView nOnlineSubscribersTextView;
+ @BindView(R.id.since_text_view_view_subreddit_detail_activity)
+ TextView sinceTextView;
+ @BindView(R.id.creation_time_text_view_view_subreddit_detail_activity)
+ TextView creationTimeTextView;
@BindView(R.id.description_text_view_view_subreddit_detail_activity)
TextView descriptionTextView;
@BindView(R.id.bottom_navigation_view_subreddit_detail_activity)
@@ -322,6 +329,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
setSupportActionBar(toolbar);
glide = Glide.with(this);
+ Locale locale = getResources().getConfiguration().locale;
mSubredditViewModel = new ViewModelProvider(this,
new SubredditViewModel.Factory(getApplication(), mRedditDataRoomDatabase, subredditName))
@@ -370,6 +378,8 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
subredditNameTextView.setText(subredditFullName);
String nSubscribers = getString(R.string.subscribers_number_detail, subredditData.getNSubscribers());
nSubscribersTextView.setText(nSubscribers);
+ creationTimeTextView.setText(new SimpleDateFormat("MMM d, yyyy",
+ locale).format(subredditData.getCreatedUTC()));
if (subredditData.getDescription().equals("")) {
descriptionTextView.setVisibility(View.GONE);
} else {
@@ -416,13 +426,15 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
int primaryTextColor = mCustomThemeWrapper.getPrimaryTextColor();
nSubscribersTextView.setTextColor(primaryTextColor);
nOnlineSubscribersTextView.setTextColor(primaryTextColor);
+ sinceTextView.setTextColor(primaryTextColor);
+ creationTimeTextView.setTextColor(primaryTextColor);
descriptionTextView.setTextColor(primaryTextColor);
bottomNavigationView.setBackgroundTint(ColorStateList.valueOf(mCustomThemeWrapper.getBottomAppBarBackgroundColor()));
- int primaryIconColor = mCustomThemeWrapper.getPrimaryIconColor();
- subscriptionsBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- multiRedditBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- messageBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- profileBottomAppBar.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ int bottomAppBarIconColor = mCustomThemeWrapper.getBottomAppBarIconColor();
+ subscriptionsBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ multiRedditBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ messageBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ profileBottomAppBar.setColorFilter(bottomAppBarIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
applyTabLayoutTheme(tabLayout);
applyFABTheme(fab);
unsubscribedColor = mCustomThemeWrapper.getUnsubscribed();
@@ -706,6 +718,16 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
sidebarIntent.putExtra(ViewSidebarActivity.EXTRA_SUBREDDIT_NAME, subredditName);
startActivity(sidebarIntent);
return true;
+ case R.id.action_share_view_subreddit_detail_activity:
+ Intent shareIntent = new Intent(Intent.ACTION_SEND);
+ shareIntent.setType("text/plain");
+ shareIntent.putExtra(Intent.EXTRA_TEXT, "https://www.reddit.com/r/" + subredditName);
+ if (shareIntent.resolveActivity(getPackageManager()) != null) {
+ startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
+ } else {
+ Toast.makeText(this, R.string.no_app, Toast.LENGTH_SHORT).show();
+ }
+ return true;
}
return false;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java
index 8af8944c..c6bda8bd 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java
@@ -40,6 +40,9 @@ import com.google.android.material.tabs.TabLayout;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
import javax.inject.Inject;
import javax.inject.Named;
@@ -116,6 +119,10 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
Chip subscribeUserChip;
@BindView(R.id.karma_text_view_view_user_detail_activity)
TextView karmaTextView;
+ @BindView(R.id.cakeday_text_view_view_user_detail_activity)
+ TextView cakedayTextView;
+ @BindView(R.id.description_text_view_view_user_detail_activity)
+ TextView descriptionTextView;
@Inject
@Named("no_oauth")
Retrofit mRetrofit;
@@ -274,15 +281,14 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
subscribedUserDao = mRedditDataRoomDatabase.subscribedUserDao();
glide = Glide.with(this);
+ Locale locale = getResources().getConfiguration().locale;
userViewModel = new ViewModelProvider(this, new UserViewModel.Factory(getApplication(), mRedditDataRoomDatabase, username))
.get(UserViewModel.class);
userViewModel.getUserLiveData().observe(this, userData -> {
if (userData != null) {
if (userData.getBanner().equals("")) {
- bannerImageView.setOnClickListener(view -> {
- //Do nothing since the user has no banner image
- });
+ bannerImageView.setOnClickListener(null);
} else {
glide.load(userData.getBanner()).into(bannerImageView);
bannerImageView.setOnClickListener(view -> {
@@ -297,9 +303,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
glide.load(getDrawable(R.drawable.subreddit_default_icon))
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0)))
.into(iconGifImageView);
- iconGifImageView.setOnClickListener(view -> {
- //Do nothing since the user has no icon image
- });
+ iconGifImageView.setOnClickListener(null);
} else {
glide.load(userData.getIconUrl())
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0)))
@@ -387,8 +391,17 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
if (!title.equals(userFullName)) {
getSupportActionBar().setTitle(userFullName);
}
- String karma = getString(R.string.karma_info, userData.getKarma());
+ String karma = getString(R.string.karma_info_user_detail, userData.getKarma(), userData.getLinkKarma(), userData.getCommentKarma());
karmaTextView.setText(karma);
+ cakedayTextView.setText(getString(R.string.cakeday_info, new SimpleDateFormat("MMM d, yyyy",
+ locale).format(userData.getCakeday())));
+
+ if (userData.getDescription() == null || userData.getDescription().equals("")) {
+ descriptionTextView.setVisibility(View.GONE);
+ } else {
+ descriptionTextView.setVisibility(View.VISIBLE);
+ descriptionTextView.setText(userData.getDescription());
+ }
}
});
@@ -432,6 +445,8 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
subscribedColor = mCustomThemeWrapper.getSubscribed();
userNameTextView.setTextColor(mCustomThemeWrapper.getUsername());
karmaTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
+ cakedayTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
+ descriptionTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
subscribeUserChip.setTextColor(mCustomThemeWrapper.getChipTextColor());
applyTabLayoutTheme(tabLayout);
}
@@ -621,6 +636,16 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
case R.id.action_change_post_layout_view_user_detail_activity:
postLayoutBottomSheetFragment.show(getSupportFragmentManager(), postLayoutBottomSheetFragment.getTag());
return true;
+ case R.id.action_share_view_user_detail_activity:
+ Intent shareIntent = new Intent(Intent.ACTION_SEND);
+ shareIntent.setType("text/plain");
+ shareIntent.putExtra(Intent.EXTRA_TEXT, "https://www.reddit.com/user/" + username);
+ if (shareIntent.resolveActivity(getPackageManager()) != null) {
+ startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
+ } else {
+ Toast.makeText(this, R.string.no_app, Toast.LENGTH_SHORT).show();
+ }
+ return true;
}
return false;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
index c29f0940..eb2ba7ae 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
@@ -834,7 +834,6 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter ((CommentViewHolder) holder).authorTextView.performClick());
} else if (comment.getAuthorFlair() != null && !comment.getAuthorFlair().equals("")) {
((CommentViewHolder) holder).authorFlairTextView.setVisibility(View.VISIBLE);
((CommentViewHolder) holder).authorFlairTextView.setText(comment.getAuthorFlair());
@@ -924,39 +923,6 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter {
- if (((CommentViewHolder) holder).bottomConstraintLayout.getLayoutParams().height == 0) {
- ((CommentViewHolder) holder).bottomConstraintLayout.getLayoutParams().height = LinearLayout.LayoutParams.WRAP_CONTENT;
- ((CommentViewHolder) holder).topScoreTextView.setVisibility(View.GONE);
- ((ViewPostDetailActivity) mActivity).delayTransition();
- } else {
- ((ViewPostDetailActivity) mActivity).delayTransition();
- ((CommentViewHolder) holder).bottomConstraintLayout.getLayoutParams().height = 0;
- ((CommentViewHolder) holder).topScoreTextView.setVisibility(View.VISIBLE);
- }
- };
- ((CommentViewHolder) holder).linearLayout.setOnClickListener(hideToolbarOnClickListener);
- ((CommentViewHolder) holder).commentMarkdownView.setOnClickListener(hideToolbarOnClickListener);
- ((CommentViewHolder) holder).commentTimeTextView.setOnClickListener(hideToolbarOnClickListener);
- }
-
- ((CommentViewHolder) holder).moreButton.setOnClickListener(view -> {
- Bundle bundle = new Bundle();
- if (!mPost.isArchived() && !mPost.isLocked() && comment.getAuthor().equals(mAccountName)) {
- bundle.putString(CommentMoreBottomSheetFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
- }
- bundle.putParcelable(CommentMoreBottomSheetFragment.EXTRA_COMMENT, comment);
- if (mIsSingleCommentThreadMode) {
- bundle.putInt(CommentMoreBottomSheetFragment.EXTRA_POSITION, holder.getAdapterPosition() - 2);
- } else {
- bundle.putInt(CommentMoreBottomSheetFragment.EXTRA_POSITION, holder.getAdapterPosition() - 1);
- }
- CommentMoreBottomSheetFragment commentMoreBottomSheetFragment = new CommentMoreBottomSheetFragment();
- commentMoreBottomSheetFragment.setArguments(bundle);
- commentMoreBottomSheetFragment.show(mActivity.getSupportFragmentManager(), commentMoreBottomSheetFragment.getTag());
- });
-
if (comment.hasReply()) {
if (comment.isExpanded()) {
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_less_grey_24dp);
@@ -997,239 +963,11 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter {
- if (mAccessToken == null) {
- Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (mPost.isArchived()) {
- Toast.makeText(mActivity, R.string.archived_post_reply_unavailable, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (mPost.isLocked()) {
- Toast.makeText(mActivity, R.string.locked_post_reply_unavailable, Toast.LENGTH_SHORT).show();
- return;
- }
-
- Intent intent = new Intent(mActivity, CommentActivity.class);
- intent.putExtra(CommentActivity.EXTRA_PARENT_DEPTH_KEY, comment.getDepth() + 1);
- intent.putExtra(CommentActivity.EXTRA_COMMENT_PARENT_TEXT_KEY, comment.getCommentMarkdown());
- intent.putExtra(CommentActivity.EXTRA_PARENT_FULLNAME_KEY, comment.getFullName());
- intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, true);
-
- int parentPosition = mIsSingleCommentThreadMode ? holder.getAdapterPosition() - 2 : holder.getAdapterPosition() - 1;
- intent.putExtra(CommentActivity.EXTRA_PARENT_POSITION_KEY, parentPosition);
- mActivity.startActivityForResult(intent, CommentActivity.WRITE_COMMENT_REQUEST_CODE);
- });
-
- ((CommentViewHolder) holder).upvoteButton.setOnClickListener(view -> {
- if (mPost.isArchived()) {
- Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (mAccessToken == null) {
- Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
- return;
- }
-
- int previousVoteType = comment.getVoteType();
- String newVoteType;
-
- ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
-
- if (previousVoteType != CommentData.VOTE_TYPE_UPVOTE) {
- //Not upvoted before
- comment.setVoteType(CommentData.VOTE_TYPE_UPVOTE);
- newVoteType = RedditUtils.DIR_UPVOTE;
- ((CommentViewHolder) holder).upvoteButton.setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
- } else {
- //Upvoted before
- comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
- newVoteType = RedditUtils.DIR_UNVOTE;
- ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
- }
-
- ((CommentViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()));
- ((CommentViewHolder) holder).topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()) + " pts");
-
- VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
- @Override
- public void onVoteThingSuccess(int position) {
- if (newVoteType.equals(RedditUtils.DIR_UPVOTE)) {
- comment.setVoteType(CommentData.VOTE_TYPE_UPVOTE);
- ((CommentViewHolder) holder).upvoteButton.setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
- } else {
- comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
- ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
- }
-
- ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()));
- ((CommentViewHolder) holder).topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()) + " pts");
- }
-
- @Override
- public void onVoteThingFail(int position) {
- }
- }, comment.getFullName(), newVoteType, holder.getAdapterPosition());
- });
-
- ((CommentViewHolder) holder).downvoteButton.setOnClickListener(view -> {
- if (mPost.isArchived()) {
- Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (mAccessToken == null) {
- Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
- return;
- }
-
- int previousVoteType = comment.getVoteType();
- String newVoteType;
-
- ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
-
- if (previousVoteType != CommentData.VOTE_TYPE_DOWNVOTE) {
- //Not downvoted before
- comment.setVoteType(CommentData.VOTE_TYPE_DOWNVOTE);
- newVoteType = RedditUtils.DIR_DOWNVOTE;
- ((CommentViewHolder) holder).downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
- } else {
- //Downvoted before
- comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
- newVoteType = RedditUtils.DIR_UNVOTE;
- ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
- }
-
- ((CommentViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()));
- ((CommentViewHolder) holder).topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()) + " pts");
-
- VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
- @Override
- public void onVoteThingSuccess(int position1) {
- if (newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) {
- comment.setVoteType(CommentData.VOTE_TYPE_DOWNVOTE);
- ((CommentViewHolder) holder).downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
- } else {
- comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
- ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
- }
-
- ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((CommentViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()));
- ((CommentViewHolder) holder).topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
- comment.getScore() + comment.getVoteType()) + " pts");
- }
-
- @Override
- public void onVoteThingFail(int position1) {
- }
- }, comment.getFullName(), newVoteType, holder.getAdapterPosition());
- });
-
if (comment.isSaved()) {
((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
} else {
((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
}
-
- ((CommentViewHolder) holder).saveButton.setOnClickListener(view -> {
- if (comment.isSaved()) {
- comment.setSaved(false);
- SaveThing.unsaveThing(mOauthRetrofit, mAccessToken, comment.getFullName(), new SaveThing.SaveThingListener() {
- @Override
- public void success() {
- comment.setSaved(false);
- ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
- Toast.makeText(mActivity, R.string.comment_unsaved_success, Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void failed() {
- comment.setSaved(true);
- ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
- Toast.makeText(mActivity, R.string.comment_unsaved_failed, Toast.LENGTH_SHORT).show();
- }
- });
- } else {
- comment.setSaved(true);
- SaveThing.saveThing(mOauthRetrofit, mAccessToken, comment.getFullName(), new SaveThing.SaveThingListener() {
- @Override
- public void success() {
- comment.setSaved(true);
- ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
- Toast.makeText(mActivity, R.string.comment_saved_success, Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void failed() {
- comment.setSaved(false);
- ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
- Toast.makeText(mActivity, R.string.comment_saved_failed, Toast.LENGTH_SHORT).show();
- }
- });
- }
- });
-
- ((CommentViewHolder) holder).authorTextView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
- intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, comment.getAuthor());
- mActivity.startActivity(intent);
- });
-
- ((CommentViewHolder) holder).expandButton.setOnClickListener(view -> {
- if (((CommentViewHolder) holder).expandButton.getVisibility() == View.VISIBLE) {
- int commentPosition = mIsSingleCommentThreadMode ? holder.getAdapterPosition() - 2 : holder.getAdapterPosition() - 1;
- if(commentPosition >= 0 && commentPosition < mVisibleComments.size()) {
- if (mVisibleComments.get(commentPosition).isExpanded()) {
- collapseChildren(commentPosition);
- ((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_more_grey_24dp);
- } else {
- comment.setExpanded(true);
- ArrayList newList = new ArrayList<>();
- expandChildren(mVisibleComments.get(commentPosition).getChildren(), newList, 0);
- mVisibleComments.get(commentPosition).setExpanded(true);
- mVisibleComments.addAll(commentPosition + 1, newList);
-
- if (mIsSingleCommentThreadMode) {
- notifyItemRangeInserted(commentPosition + 3, newList.size());
- } else {
- notifyItemRangeInserted(commentPosition + 2, newList.size());
- }
- ((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_less_grey_24dp);
- }
- }
- }
- });
-
- ((CommentViewHolder) holder).commentMarkdownView.setOnLongClickListener(view -> {
- ((CommentViewHolder) holder).expandButton.performClick();
- return true;
- });
-
- ((CommentViewHolder) holder).itemView.setOnLongClickListener(view -> {
- ((CommentViewHolder) holder).expandButton.performClick();
- return true;
- });
} else if (holder instanceof LoadMoreChildCommentsViewHolder) {
CommentData placeholder;
placeholder = mIsSingleCommentThreadMode ? mVisibleComments.get(holder.getAdapterPosition() - 2)
@@ -2208,6 +1946,287 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter authorTextView.performClick());
+
+ View.OnClickListener hideToolbarOnClickListener = view -> {
+ if (mCommentToolbarHideOnClick) {
+ if (bottomConstraintLayout.getLayoutParams().height == 0) {
+ bottomConstraintLayout.getLayoutParams().height = LinearLayout.LayoutParams.WRAP_CONTENT;
+ topScoreTextView.setVisibility(View.GONE);
+ ((ViewPostDetailActivity) mActivity).delayTransition();
+ } else {
+ ((ViewPostDetailActivity) mActivity).delayTransition();
+ bottomConstraintLayout.getLayoutParams().height = 0;
+ topScoreTextView.setVisibility(View.VISIBLE);
+ }
+ }
+ };
+ linearLayout.setOnClickListener(hideToolbarOnClickListener);
+ commentMarkdownView.setOnClickListener(hideToolbarOnClickListener);
+ commentTimeTextView.setOnClickListener(hideToolbarOnClickListener);
+
+ moreButton.setOnClickListener(view -> {
+ CommentData comment = getCurrentComment();
+ Bundle bundle = new Bundle();
+ if (!mPost.isArchived() && !mPost.isLocked() && comment.getAuthor().equals(mAccountName)) {
+ bundle.putString(CommentMoreBottomSheetFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
+ }
+ bundle.putParcelable(CommentMoreBottomSheetFragment.EXTRA_COMMENT, comment);
+ if (mIsSingleCommentThreadMode) {
+ bundle.putInt(CommentMoreBottomSheetFragment.EXTRA_POSITION, getAdapterPosition() - 2);
+ } else {
+ bundle.putInt(CommentMoreBottomSheetFragment.EXTRA_POSITION, getAdapterPosition() - 1);
+ }
+ CommentMoreBottomSheetFragment commentMoreBottomSheetFragment = new CommentMoreBottomSheetFragment();
+ commentMoreBottomSheetFragment.setArguments(bundle);
+ commentMoreBottomSheetFragment.show(mActivity.getSupportFragmentManager(), commentMoreBottomSheetFragment.getTag());
+ });
+
+ replyButton.setOnClickListener(view -> {
+ if (mAccessToken == null) {
+ Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (mPost.isArchived()) {
+ Toast.makeText(mActivity, R.string.archived_post_reply_unavailable, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (mPost.isLocked()) {
+ Toast.makeText(mActivity, R.string.locked_post_reply_unavailable, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ CommentData comment = getCurrentComment();
+
+ Intent intent = new Intent(mActivity, CommentActivity.class);
+ intent.putExtra(CommentActivity.EXTRA_PARENT_DEPTH_KEY, comment.getDepth() + 1);
+ intent.putExtra(CommentActivity.EXTRA_COMMENT_PARENT_TEXT_KEY, comment.getCommentMarkdown());
+ intent.putExtra(CommentActivity.EXTRA_PARENT_FULLNAME_KEY, comment.getFullName());
+ intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, true);
+
+ int parentPosition = mIsSingleCommentThreadMode ? getAdapterPosition() - 2 : getAdapterPosition() - 1;
+ intent.putExtra(CommentActivity.EXTRA_PARENT_POSITION_KEY, parentPosition);
+ mActivity.startActivityForResult(intent, CommentActivity.WRITE_COMMENT_REQUEST_CODE);
+ });
+
+ upvoteButton.setOnClickListener(view -> {
+ if (mPost.isArchived()) {
+ Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (mAccessToken == null) {
+ Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ CommentData comment = getCurrentComment();
+ int previousVoteType = comment.getVoteType();
+ String newVoteType;
+
+ downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+
+ if (previousVoteType != CommentData.VOTE_TYPE_UPVOTE) {
+ //Not upvoted before
+ comment.setVoteType(CommentData.VOTE_TYPE_UPVOTE);
+ newVoteType = RedditUtils.DIR_UPVOTE;
+ upvoteButton.setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mUpvotedColor);
+ } else {
+ //Upvoted before
+ comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
+ newVoteType = RedditUtils.DIR_UNVOTE;
+ upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mCommentIconAndInfoColor);
+ }
+
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()));
+ topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()) + " pts");
+
+ VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
+ @Override
+ public void onVoteThingSuccess(int position) {
+ if (newVoteType.equals(RedditUtils.DIR_UPVOTE)) {
+ comment.setVoteType(CommentData.VOTE_TYPE_UPVOTE);
+ upvoteButton.setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mUpvotedColor);
+ } else {
+ comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
+ upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mCommentIconAndInfoColor);
+ }
+
+ downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()));
+ topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()) + " pts");
+ }
+
+ @Override
+ public void onVoteThingFail(int position) {
+ }
+ }, comment.getFullName(), newVoteType, getAdapterPosition());
+ });
+
+ downvoteButton.setOnClickListener(view -> {
+ if (mPost.isArchived()) {
+ Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (mAccessToken == null) {
+ Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ CommentData comment = getCurrentComment();
+ int previousVoteType = comment.getVoteType();
+ String newVoteType;
+
+ upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+
+ if (previousVoteType != CommentData.VOTE_TYPE_DOWNVOTE) {
+ //Not downvoted before
+ comment.setVoteType(CommentData.VOTE_TYPE_DOWNVOTE);
+ newVoteType = RedditUtils.DIR_DOWNVOTE;
+ downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mDownvotedColor);
+ } else {
+ //Downvoted before
+ comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
+ newVoteType = RedditUtils.DIR_UNVOTE;
+ downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mCommentIconAndInfoColor);
+ }
+
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()));
+ topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()) + " pts");
+
+ VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
+ @Override
+ public void onVoteThingSuccess(int position1) {
+ if (newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) {
+ comment.setVoteType(CommentData.VOTE_TYPE_DOWNVOTE);
+ downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mDownvotedColor);
+ } else {
+ comment.setVoteType(CommentData.VOTE_TYPE_NO_VOTE);
+ downvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mCommentIconAndInfoColor);
+ }
+
+ upvoteButton.setColorFilter(mCommentIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()));
+ topScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
+ comment.getScore() + comment.getVoteType()) + " pts");
+ }
+
+ @Override
+ public void onVoteThingFail(int position1) {
+ }
+ }, comment.getFullName(), newVoteType, getAdapterPosition());
+ });
+
+ saveButton.setOnClickListener(view -> {
+ CommentData comment = getCurrentComment();
+ if (comment.isSaved()) {
+ comment.setSaved(false);
+ SaveThing.unsaveThing(mOauthRetrofit, mAccessToken, comment.getFullName(), new SaveThing.SaveThingListener() {
+ @Override
+ public void success() {
+ comment.setSaved(false);
+ saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
+ Toast.makeText(mActivity, R.string.comment_unsaved_success, Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void failed() {
+ comment.setSaved(true);
+ saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
+ Toast.makeText(mActivity, R.string.comment_unsaved_failed, Toast.LENGTH_SHORT).show();
+ }
+ });
+ } else {
+ comment.setSaved(true);
+ SaveThing.saveThing(mOauthRetrofit, mAccessToken, comment.getFullName(), new SaveThing.SaveThingListener() {
+ @Override
+ public void success() {
+ comment.setSaved(true);
+ saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
+ Toast.makeText(mActivity, R.string.comment_saved_success, Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void failed() {
+ comment.setSaved(false);
+ saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
+ Toast.makeText(mActivity, R.string.comment_saved_failed, Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ });
+
+ authorTextView.setOnClickListener(view -> {
+ Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
+ intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, getCurrentComment().getAuthor());
+ mActivity.startActivity(intent);
+ });
+
+ expandButton.setOnClickListener(view -> {
+ if (expandButton.getVisibility() == View.VISIBLE) {
+ int commentPosition = mIsSingleCommentThreadMode ? getAdapterPosition() - 2 : getAdapterPosition() - 1;
+ if(commentPosition >= 0 && commentPosition < mVisibleComments.size()) {
+ CommentData comment = getCurrentComment();
+ if (mVisibleComments.get(commentPosition).isExpanded()) {
+ collapseChildren(commentPosition);
+ expandButton.setImageResource(R.drawable.ic_expand_more_grey_24dp);
+ } else {
+ comment.setExpanded(true);
+ ArrayList newList = new ArrayList<>();
+ expandChildren(mVisibleComments.get(commentPosition).getChildren(), newList, 0);
+ mVisibleComments.get(commentPosition).setExpanded(true);
+ mVisibleComments.addAll(commentPosition + 1, newList);
+
+ if (mIsSingleCommentThreadMode) {
+ notifyItemRangeInserted(commentPosition + 3, newList.size());
+ } else {
+ notifyItemRangeInserted(commentPosition + 2, newList.size());
+ }
+ expandButton.setImageResource(R.drawable.ic_expand_less_grey_24dp);
+ }
+ }
+ }
+ });
+
+ commentMarkdownView.setOnLongClickListener(view -> {
+ expandButton.performClick();
+ return true;
+ });
+
+ itemView.setOnLongClickListener(view -> {
+ expandButton.performClick();
+ return true;
+ });
+ }
+
+ private CommentData getCurrentComment() {
+ CommentData comment;
+ if (mIsSingleCommentThreadMode) {
+ comment = mVisibleComments.get(getAdapterPosition() - 2);
+ } else {
+ comment = mVisibleComments.get(getAdapterPosition() - 1);
+ }
+
+ return comment;
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java
index 38aa8b00..3623fb54 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java
@@ -1,14 +1,13 @@
package ml.docilealligator.infinityforreddit.Adapter;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-import android.text.Html;
-import android.text.Spannable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -38,13 +37,29 @@ import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
+import com.google.android.exoplayer2.metadata.Metadata;
+import com.google.android.exoplayer2.source.TrackGroupArray;
+import com.google.android.exoplayer2.text.Cue;
+import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
+import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
+import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.material.card.MaterialCardView;
import com.libRG.CustomTextView;
import org.greenrobot.eventbus.EventBus;
+import java.util.List;
+
import butterknife.BindView;
import butterknife.ButterKnife;
+import im.ene.toro.CacheManager;
+import im.ene.toro.ToroPlayer;
+import im.ene.toro.ToroUtil;
+import im.ene.toro.exoplayer.ExoCreator;
+import im.ene.toro.exoplayer.ExoPlayerViewHelper;
+import im.ene.toro.exoplayer.Playable;
+import im.ene.toro.media.PlaybackInfo;
+import im.ene.toro.widget.Container;
import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity;
@@ -68,7 +83,6 @@ import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.SaveThing;
import ml.docilealligator.infinityforreddit.User.UserDao;
-import ml.docilealligator.infinityforreddit.Utils.GlideImageGetter;
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.Utils.Utils;
@@ -79,10 +93,16 @@ import retrofit2.Retrofit;
* Created by alex on 2/25/18.
*/
-public class PostRecyclerViewAdapter extends PagedListAdapter {
- private static final int VIEW_TYPE_DATA = 0;
- private static final int VIEW_TYPE_ERROR = 1;
- private static final int VIEW_TYPE_LOADING = 2;
+public class PostRecyclerViewAdapter extends PagedListAdapter implements CacheManager {
+ private static final int VIEW_TYPE_POST_CARD_VIDEO_TYPE_AUTOPLAY = 1;
+ private static final int VIEW_TYPE_POST_CARD_VIDEO_AND_GIF_PREVIEW_TYPE = 2;
+ private static final int VIEW_TYPE_POST_CARD_IMAGE_AND_GIF_AUTOPLAY_TYPE = 3;
+ private static final int VIEW_TYPE_POST_CARD_LINK_TYPE = 4;
+ private static final int VIEW_TYPE_POST_CARD_NO_PREVIEW_LINK_TYPE = 5;
+ private static final int VIEW_TYPE_POST_CARD_TEXT_TYPE = 6;
+ private static final int VIEW_TYPE_POST_COMPACT = 7;
+ private static final int VIEW_TYPE_ERROR = 8;
+ private static final int VIEW_TYPE_LOADING = 9;
private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() {
@Override
public boolean areItemsTheSame(@NonNull Post post, @NonNull Post t1) {
@@ -140,8 +160,10 @@ public class PostRecyclerViewAdapter extends PagedListAdapter {
- if (canStartActivity) {
- canStartActivity = false;
-
- Intent intent = new Intent(mActivity, ViewPostDetailActivity.class);
- intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, post);
- intent.putExtra(ViewPostDetailActivity.EXTRA_POST_LIST_POSITION, position);
- mActivity.startActivity(intent);
- }
- });
-
- ((PostViewHolder) holder).subredditTextView.setText(subredditNamePrefixed);
- ((PostViewHolder) holder).userTextView.setText(authorPrefixed);
- ((PostViewHolder) holder).userTextView.setOnClickListener(view -> {
- if (canStartActivity) {
- canStartActivity = false;
- Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
- intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, post.getAuthor());
- mActivity.startActivity(intent);
- }
- });
+ ((PostBaseViewHolder) holder).subredditTextView.setText(subredditNamePrefixed);
+ ((PostBaseViewHolder) holder).userTextView.setText(authorPrefixed);
if (mDisplaySubredditName) {
if (authorPrefixed.equals(subredditNamePrefixed)) {
@@ -279,13 +329,13 @@ public class PostRecyclerViewAdapter extends PagedListAdapter= 0) {
@@ -298,11 +348,11 @@ public class PostRecyclerViewAdapter extends PagedListAdapter= 0) {
@@ -331,33 +381,13 @@ public class PostRecyclerViewAdapter extends PagedListAdapter {
- if (canStartActivity) {
- canStartActivity = false;
- if (post.getSubredditNamePrefixed().startsWith("u/")) {
- Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
- intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY,
- post.getSubredditNamePrefixed().substring(2));
- mActivity.startActivity(intent);
- } else {
- Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
- intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
- post.getSubredditName());
- mActivity.startActivity(intent);
- }
- }
- });
-
- ((PostViewHolder) holder).iconGifImageView.setOnClickListener(view ->
- ((PostViewHolder) holder).subredditTextView.performClick());
} else {
if (post.getAuthorIconUrl() == null) {
String authorName = post.getAuthor().equals("[deleted]") ? post.getSubredditNamePrefixed().substring(2) : post.getAuthor();
@@ -366,13 +396,13 @@ public class PostRecyclerViewAdapter extends PagedListAdapter= 0) {
@@ -385,426 +415,141 @@ public class PostRecyclerViewAdapter extends PagedListAdapter {
- if (canStartActivity) {
- canStartActivity = false;
- if (post.getSubredditNamePrefixed().startsWith("u/")) {
- Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
- intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, post.getAuthor());
- mActivity.startActivity(intent);
- } else {
- Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
- intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
- post.getSubredditName());
- mActivity.startActivity(intent);
- }
- }
- });
-
- ((PostViewHolder) holder).iconGifImageView.setOnClickListener(view ->
- ((PostViewHolder) holder).userTextView.performClick());
}
if (mShowElapsedTime) {
- ((PostViewHolder) holder).postTimeTextView.setText(
+ ((PostBaseViewHolder) holder).postTimeTextView.setText(
Utils.getElapsedTime(mActivity, post.getPostTimeMillis()));
} else {
- ((PostViewHolder) holder).postTimeTextView.setText(postTime);
+ ((PostBaseViewHolder) holder).postTimeTextView.setText(post.getPostTime());
}
- ((PostViewHolder) holder).titleTextView.setText(title);
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
+ ((PostBaseViewHolder) holder).titleTextView.setText(post.getTitle());
+ ((PostBaseViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
if (post.isLocked()) {
- ((PostViewHolder) holder).lockedImageView.setVisibility(View.VISIBLE);
+ ((PostBaseViewHolder) holder).lockedImageView.setVisibility(View.VISIBLE);
}
- if (nsfw) {
- if (!(mActivity instanceof FilteredThingActivity)) {
- ((PostViewHolder) holder).nsfwTextView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, FilteredThingActivity.class);
- intent.putExtra(FilteredThingActivity.EXTRA_NAME, post.getSubredditNamePrefixed().substring(2));
- intent.putExtra(FilteredThingActivity.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
- intent.putExtra(FilteredThingActivity.EXTRA_FILTER, Post.NSFW_TYPE);
- mActivity.startActivity(intent);
- });
- }
- ((PostViewHolder) holder).nsfwTextView.setVisibility(View.VISIBLE);
+ if (post.isNSFW()) {
+ ((PostBaseViewHolder) holder).nsfwTextView.setVisibility(View.VISIBLE);
}
- if (spoiler) {
- ((PostViewHolder) holder).spoilerTextView.setVisibility(View.VISIBLE);
+ if (post.isSpoiler()) {
+ ((PostBaseViewHolder) holder).spoilerTextView.setVisibility(View.VISIBLE);
}
if (flair != null && !flair.equals("")) {
- ((PostViewHolder) holder).flairTextView.setVisibility(View.VISIBLE);
- Spannable flairHTML;
- GlideImageGetter glideImageGetter = new GlideImageGetter(((PostViewHolder) holder).flairTextView);
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
- flairHTML = (Spannable) Html.fromHtml(flair, Html.FROM_HTML_MODE_LEGACY, glideImageGetter, null);
- } else {
- flairHTML = (Spannable) Html.fromHtml(flair, glideImageGetter, null);
- }
- ((PostViewHolder) holder).flairTextView.setText(flairHTML);
+ Utils.setHTMLWithImageToTextView(((PostBaseViewHolder) holder).flairTextView, flair);
}
if (nAwards > 0) {
- ((PostViewHolder) holder).awardsTextView.setVisibility(View.VISIBLE);
+ ((PostBaseViewHolder) holder).awardsTextView.setVisibility(View.VISIBLE);
if (nAwards == 1) {
- ((PostViewHolder) holder).awardsTextView.setText(mActivity.getString(R.string.one_award));
+ ((PostBaseViewHolder) holder).awardsTextView.setText(mActivity.getString(R.string.one_award));
} else {
- ((PostViewHolder) holder).awardsTextView.setText(mActivity.getString(R.string.n_awards, nAwards));
+ ((PostBaseViewHolder) holder).awardsTextView.setText(mActivity.getString(R.string.n_awards, nAwards));
}
}
- switch (voteType) {
+ switch (post.getVoteType()) {
case 1:
//Upvoted
- ((PostViewHolder) holder).upvoteButton.setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
+ ((PostBaseViewHolder) holder).upvoteButton.setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ ((PostBaseViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
break;
case -1:
//Downvoted
- ((PostViewHolder) holder).downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
+ ((PostBaseViewHolder) holder).downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ ((PostBaseViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
break;
}
- if (post.getPostType() != Post.TEXT_TYPE && post.getPostType() != Post.NO_PREVIEW_LINK_TYPE) {
- ((PostViewHolder) holder).relativeLayout.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).imageView.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).imageView
- .setRatio((float) post.getPreviewHeight() / post.getPreviewWidth());
- loadImage(holder, post);
- }
-
if (mPostType == PostDataSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) {
- ((PostViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
- mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostViewHolder) holder).stickiedPostImageView);
+ ((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
+ mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView);
}
- if (isArchived) {
- ((PostViewHolder) holder).archivedImageView.setVisibility(View.VISIBLE);
+ if (post.isArchived()) {
+ ((PostBaseViewHolder) holder).archivedImageView.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).upvoteButton
+ ((PostBaseViewHolder) holder).upvoteButton
.setColorFilter(mVoteAndReplyUnavailableVoteButtonColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).downvoteButton
+ ((PostBaseViewHolder) holder).downvoteButton
.setColorFilter(mVoteAndReplyUnavailableVoteButtonColor, android.graphics.PorterDuff.Mode.SRC_IN);
}
if (post.isCrosspost()) {
- ((PostViewHolder) holder).crosspostImageView.setVisibility(View.VISIBLE);
+ ((PostBaseViewHolder) holder).crosspostImageView.setVisibility(View.VISIBLE);
}
- if (!(mActivity instanceof FilteredThingActivity)) {
- ((PostViewHolder) holder).typeTextView.setOnClickListener(view -> mCallback.typeChipClicked(post.getPostType()));
- }
-
- switch (post.getPostType()) {
- case Post.IMAGE_TYPE:
- ((PostViewHolder) holder).typeTextView.setText(R.string.image);
-
- final String imageUrl = post.getUrl();
- ((PostViewHolder) holder).imageView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, ViewImageActivity.class);
- intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl);
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName
- + "-" + id + ".jpg");
- intent.putExtra(ViewImageActivity.POST_TITLE_KEY, post.getTitle());
- mActivity.startActivity(intent);
- });
-
- if (post.getPreviewWidth() <= 0 || post.getPreviewHeight() <= 0) {
- ((PostViewHolder) holder).imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
- ((PostViewHolder) holder).imageView.getLayoutParams().height = (int) (400 * mScale);
- }
- break;
- case Post.LINK_TYPE:
- ((PostViewHolder) holder).typeTextView.setText(R.string.link);
-
- ((PostViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
- String domain = Uri.parse(post.getUrl()).getHost();
- ((PostViewHolder) holder).linkTextView.setText(domain);
-
- ((PostViewHolder) holder).imageView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, LinkResolverActivity.class);
- Uri uri = Uri.parse(post.getUrl());
- if (uri.getScheme() == null && uri.getHost() == null) {
- intent.setData(LinkResolverActivity.getRedditUriByPath(post.getUrl()));
- } else {
- intent.setData(uri);
- }
- mActivity.startActivity(intent);
- });
- break;
- case Post.GIF_TYPE:
- ((PostViewHolder) holder).typeTextView.setText(R.string.gif);
-
- final Uri gifVideoUri = Uri.parse(post.getVideoUrl());
- ((PostViewHolder) holder).imageView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, ViewGIFActivity.class);
- intent.setData(gifVideoUri);
- intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, subredditName
- + "-" + id + ".gif");
- intent.putExtra(ViewGIFActivity.GIF_URL_KEY, post.getVideoUrl());
- intent.putExtra(ViewGIFActivity.POST_TITLE_KEY, post.getTitle());
- mActivity.startActivity(intent);
- });
-
- ((PostViewHolder) holder).playButtonImageView.setVisibility(View.VISIBLE);
- break;
- case Post.VIDEO_TYPE:
- ((PostViewHolder) holder).typeTextView.setText(R.string.video);
-
- final Uri videoUri = Uri.parse(post.getVideoUrl());
- ((PostViewHolder) holder).imageView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- intent.setData(videoUri);
- intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_DOWNLOAD_URL, post.getVideoDownloadUrl());
- intent.putExtra(ViewVideoActivity.EXTRA_SUBREDDIT, subredditName);
- intent.putExtra(ViewVideoActivity.EXTRA_ID, fullName);
- intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, post.getTitle());
- mActivity.startActivity(intent);
- });
-
- ((PostViewHolder) holder).playButtonImageView.setVisibility(View.VISIBLE);
- break;
- case Post.NO_PREVIEW_LINK_TYPE:
- ((PostViewHolder) holder).typeTextView.setText(R.string.link);
-
- String noPreviewLinkUrl = post.getUrl();
- ((PostViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
- String noPreviewLinkDomain = Uri.parse(noPreviewLinkUrl).getHost();
- ((PostViewHolder) holder).linkTextView.setText(noPreviewLinkDomain);
- ((PostViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).noPreviewLinkImageView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, LinkResolverActivity.class);
- Uri uri = Uri.parse(post.getUrl());
- if (uri.getScheme() == null && uri.getHost() == null) {
- intent.setData(LinkResolverActivity.getRedditUriByPath(post.getUrl()));
- } else {
- intent.setData(uri);
- }
- mActivity.startActivity(intent);
- });
- break;
- case Post.TEXT_TYPE:
- ((PostViewHolder) holder).typeTextView.setText(R.string.text);
- if (post.getSelfTextPlainTrimmed() != null && !post.getSelfTextPlainTrimmed().equals("")) {
- ((PostViewHolder) holder).contentTextView.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).contentTextView.setText(post.getSelfTextPlainTrimmed());
- }
- break;
- }
-
- ((PostViewHolder) holder).upvoteButton.setOnClickListener(view -> {
- if (mAccessToken == null) {
- Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (isArchived) {
- Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
- return;
- }
-
- ColorFilter previousUpvoteButtonColorFilter = ((PostViewHolder) holder).upvoteButton.getColorFilter();
- ColorFilter previousDownvoteButtonColorFilter = ((PostViewHolder) holder).downvoteButton.getColorFilter();
- int previousScoreTextViewColor = ((PostViewHolder) holder).scoreTextView.getCurrentTextColor();
-
- int previousVoteType = post.getVoteType();
- String newVoteType;
-
- ((PostViewHolder) holder).downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
-
- if (previousVoteType != 1) {
- //Not upvoted before
- post.setVoteType(1);
- newVoteType = RedditUtils.DIR_UPVOTE;
- ((PostViewHolder) holder).upvoteButton
- .setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
- } else {
- //Upvoted before
- post.setVoteType(0);
- newVoteType = RedditUtils.DIR_UNVOTE;
- ((PostViewHolder) holder).upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mPostIconAndInfoColor);
- }
-
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
-
- VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
- @Override
- public void onVoteThingSuccess(int position1) {
- if (newVoteType.equals(RedditUtils.DIR_UPVOTE)) {
- post.setVoteType(1);
- ((PostViewHolder) holder).upvoteButton
- .setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
- } else {
- post.setVoteType(0);
- ((PostViewHolder) holder).upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mPostIconAndInfoColor);
- }
-
- ((PostViewHolder) holder).downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
-
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
-
- @Override
- public void onVoteThingFail(int position1) {
- Toast.makeText(mActivity, R.string.vote_failed, Toast.LENGTH_SHORT).show();
- post.setVoteType(previousVoteType);
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + previousVoteType));
- ((PostViewHolder) holder).upvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
- ((PostViewHolder) holder).downvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
- ((PostViewHolder) holder).scoreTextView.setTextColor(previousScoreTextViewColor);
-
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
- }, fullName, newVoteType, holder.getAdapterPosition());
- });
-
- ((PostViewHolder) holder).downvoteButton.setOnClickListener(view -> {
- if (mAccessToken == null) {
- Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (isArchived) {
- Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
- return;
- }
-
- ColorFilter previousUpvoteButtonColorFilter = ((PostViewHolder) holder).upvoteButton.getColorFilter();
- ColorFilter previousDownvoteButtonColorFilter = ((PostViewHolder) holder).downvoteButton.getColorFilter();
- int previousScoreTextViewColor = ((PostViewHolder) holder).scoreTextView.getCurrentTextColor();
-
- int previousVoteType = post.getVoteType();
- String newVoteType;
-
- ((PostViewHolder) holder).upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
-
- if (previousVoteType != -1) {
- //Not downvoted before
- post.setVoteType(-1);
- newVoteType = RedditUtils.DIR_DOWNVOTE;
- ((PostViewHolder) holder).downvoteButton
- .setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
- } else {
- //Downvoted before
- post.setVoteType(0);
- newVoteType = RedditUtils.DIR_UNVOTE;
- ((PostViewHolder) holder).downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mPostIconAndInfoColor);
- }
-
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
-
- VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
- @Override
- public void onVoteThingSuccess(int position1) {
- if (newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) {
- post.setVoteType(-1);
- ((PostViewHolder) holder).downvoteButton
- .setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
- } else {
- post.setVoteType(0);
- ((PostViewHolder) holder).downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setTextColor(mPostIconAndInfoColor);
- }
-
- ((PostViewHolder) holder).upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
-
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
-
- @Override
- public void onVoteThingFail(int position1) {
- Toast.makeText(mActivity, R.string.vote_failed, Toast.LENGTH_SHORT).show();
- post.setVoteType(previousVoteType);
- ((PostViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + previousVoteType));
- ((PostViewHolder) holder).upvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
- ((PostViewHolder) holder).downvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
- ((PostViewHolder) holder).scoreTextView.setTextColor(previousScoreTextViewColor);
-
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
- }, fullName, newVoteType, holder.getAdapterPosition());
- });
-
- ((PostViewHolder) holder).commentsCountTextView.setText(Integer.toString(post.getNComments()));
+ ((PostBaseViewHolder) holder).commentsCountTextView.setText(Integer.toString(post.getNComments()));
if (post.isSaved()) {
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
+ ((PostBaseViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
} else {
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
+ ((PostBaseViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
}
- ((PostViewHolder) holder).saveButton.setOnClickListener(view -> {
- if (mAccessToken == null) {
- Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
- return;
- }
-
- if (post.isSaved()) {
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
- SaveThing.unsaveThing(mOauthRetrofit, mAccessToken, post.getFullName(),
- new SaveThing.SaveThingListener() {
- @Override
- public void success() {
- post.setSaved(false);
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
- Toast.makeText(mActivity, R.string.post_unsaved_success, Toast.LENGTH_SHORT).show();
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
-
- @Override
- public void failed() {
- post.setSaved(true);
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
- Toast.makeText(mActivity, R.string.post_unsaved_failed, Toast.LENGTH_SHORT).show();
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
- });
+ if (holder instanceof PostVideoAutoplayViewHolder) {
+ ((PostVideoAutoplayViewHolder) holder).aspectRatioFrameLayout.setAspectRatio((float) post.getPreviewWidth() / post.getPreviewHeight());
+ ((PostVideoAutoplayViewHolder) holder).bindVideoUri(Uri.parse(post.getVideoUrl()));
+ } else if (holder instanceof PostGifAndVideoPreviewViewHolder) {
+ if (post.getPostType() == Post.VIDEO_TYPE) {
+ ((PostGifAndVideoPreviewViewHolder) holder).typeTextView.setText(mActivity.getString(R.string.video));
} else {
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
- SaveThing.saveThing(mOauthRetrofit, mAccessToken, post.getFullName(),
- new SaveThing.SaveThingListener() {
- @Override
- public void success() {
- post.setSaved(true);
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
- Toast.makeText(mActivity, R.string.post_saved_success, Toast.LENGTH_SHORT).show();
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
-
- @Override
- public void failed() {
- post.setSaved(false);
- ((PostViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
- Toast.makeText(mActivity, R.string.post_saved_failed, Toast.LENGTH_SHORT).show();
- EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
- }
- });
+ ((PostGifAndVideoPreviewViewHolder) holder).typeTextView.setText(mActivity.getString(R.string.gif));
}
- });
+ ((PostGifAndVideoPreviewViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
+ ((PostGifAndVideoPreviewViewHolder) holder).imageView
+ .setRatio((float) post.getPreviewHeight() / post.getPreviewWidth());
+ loadImage(holder, post);
- ((PostViewHolder) holder).shareButton.setOnClickListener(view -> shareLink(post));
+ if (post.getPreviewWidth() <= 0 || post.getPreviewHeight() <= 0) {
+ ((PostGifAndVideoPreviewViewHolder) holder).imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+ ((PostGifAndVideoPreviewViewHolder) holder).imageView.getLayoutParams().height = (int) (400 * mScale);
+ }
+ } else if (holder instanceof PostImageAndGifAutoplayTypeViewHolder) {
+ if (post.getPostType() == Post.GIF_TYPE) {
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).typeTextView.setText(mActivity.getString(R.string.gif));
+ } else {
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).typeTextView.setText(mActivity.getString(R.string.image));
+ }
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).imageView
+ .setRatio((float) post.getPreviewHeight() / post.getPreviewWidth());
+ loadImage(holder, post);
+
+ if (post.getPreviewWidth() <= 0 || post.getPreviewHeight() <= 0) {
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).imageView.getLayoutParams().height = (int) (400 * mScale);
+ }
+ } else if (holder instanceof PostLinkTypeViewHolder) {
+ ((PostLinkTypeViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
+ ((PostLinkTypeViewHolder) holder).imageView
+ .setRatio((float) post.getPreviewHeight() / post.getPreviewWidth());
+ loadImage(holder, post);
+
+ ((PostLinkTypeViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
+ String domain = Uri.parse(post.getUrl()).getHost();
+ ((PostLinkTypeViewHolder) holder).linkTextView.setText(domain);
+ } else if (holder instanceof PostNoPreviewLinkTypeViewHolder) {
+ String noPreviewLinkUrl = post.getUrl();
+ ((PostNoPreviewLinkTypeViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
+ String noPreviewLinkDomain = Uri.parse(noPreviewLinkUrl).getHost();
+ ((PostNoPreviewLinkTypeViewHolder) holder).linkTextView.setText(noPreviewLinkDomain);
+ } else if (holder instanceof PostTextTypeViewHolder) {
+ if (post.getSelfTextPlainTrimmed() != null && !post.getSelfTextPlainTrimmed().equals("")) {
+ ((PostTextTypeViewHolder) holder).contentTextView.setVisibility(View.VISIBLE);
+ ((PostTextTypeViewHolder) holder).contentTextView.setText(post.getSelfTextPlainTrimmed());
+ }
+ }
}
} else if (holder instanceof PostCompactViewHolder) {
Post post = getItem(position);
@@ -1359,15 +1104,16 @@ public class PostRecyclerViewAdapter extends PagedListAdapter imageRequestBuilder = mGlide.load(post.getPreviewUrl()).listener(new RequestListener() {
+ if (holder instanceof PostImageAndGifAutoplayTypeViewHolder) {
+ String url = mAutoplay && post.getPostType() == Post.GIF_TYPE ? post.getUrl() : post.getPreviewUrl();
+ RequestBuilder imageRequestBuilder = mGlide.load(url).listener(new RequestListener() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
- ((PostViewHolder) holder).progressBar.setVisibility(View.GONE);
- ((PostViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).errorRelativeLayout.setOnClickListener(view -> {
- ((PostViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
- ((PostViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).progressBar.setVisibility(View.GONE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).errorRelativeLayout.setOnClickListener(view -> {
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
loadImage(holder, post);
});
return false;
@@ -1375,17 +1121,73 @@ public class PostRecyclerViewAdapter extends PagedListAdapter target, DataSource dataSource, boolean isFirstResource) {
- ((PostViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
- ((PostViewHolder) holder).progressBar.setVisibility(View.GONE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
+ ((PostImageAndGifAutoplayTypeViewHolder) holder).progressBar.setVisibility(View.GONE);
return false;
}
});
if ((post.isNSFW() && mNeedBlurNSFW) || post.isSpoiler() && mNeedBlurSpoiler) {
imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
- .into(((PostViewHolder) holder).imageView);
+ .into(((PostImageAndGifAutoplayTypeViewHolder) holder).imageView);
} else {
- imageRequestBuilder.into(((PostViewHolder) holder).imageView);
+ imageRequestBuilder.into(((PostImageAndGifAutoplayTypeViewHolder) holder).imageView);
+ }
+ } else if (holder instanceof PostGifAndVideoPreviewViewHolder) {
+ RequestBuilder imageRequestBuilder = mGlide.load(post.getPreviewUrl()).listener(new RequestListener() {
+ @Override
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
+ ((PostGifAndVideoPreviewViewHolder) holder).progressBar.setVisibility(View.GONE);
+ ((PostGifAndVideoPreviewViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE);
+ ((PostGifAndVideoPreviewViewHolder) holder).errorRelativeLayout.setOnClickListener(view -> {
+ ((PostGifAndVideoPreviewViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
+ ((PostGifAndVideoPreviewViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
+ loadImage(holder, post);
+ });
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
+ ((PostGifAndVideoPreviewViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
+ ((PostGifAndVideoPreviewViewHolder) holder).progressBar.setVisibility(View.GONE);
+ return false;
+ }
+ });
+
+ if ((post.isNSFW() && mNeedBlurNSFW) || post.isSpoiler() && mNeedBlurSpoiler) {
+ imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
+ .into(((PostGifAndVideoPreviewViewHolder) holder).imageView);
+ } else {
+ imageRequestBuilder.into(((PostGifAndVideoPreviewViewHolder) holder).imageView);
+ }
+ } else if (holder instanceof PostLinkTypeViewHolder) {
+ RequestBuilder imageRequestBuilder = mGlide.load(post.getPreviewUrl()).listener(new RequestListener() {
+ @Override
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
+ ((PostLinkTypeViewHolder) holder).progressBar.setVisibility(View.GONE);
+ ((PostLinkTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE);
+ ((PostLinkTypeViewHolder) holder).errorRelativeLayout.setOnClickListener(view -> {
+ ((PostLinkTypeViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
+ ((PostLinkTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
+ loadImage(holder, post);
+ });
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
+ ((PostLinkTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
+ ((PostLinkTypeViewHolder) holder).progressBar.setVisibility(View.GONE);
+ return false;
+ }
+ });
+
+ if ((post.isNSFW() && mNeedBlurNSFW) || post.isSpoiler() && mNeedBlurSpoiler) {
+ imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
+ .into(((PostLinkTypeViewHolder) holder).imageView);
+ } else {
+ imageRequestBuilder.into(((PostLinkTypeViewHolder) holder).imageView);
}
} else if (holder instanceof PostCompactViewHolder) {
String previewUrl = post.getThumbnailPreviewUrl().equals("") ? post.getPreviewUrl() : post.getThumbnailPreviewUrl();
@@ -1434,20 +1236,6 @@ public class PostRecyclerViewAdapter extends PagedListAdapter= super.getItemCount()) {
+ return null;
+ }
+ return getItem(order);
+ }
+
+ @Nullable
+ @Override
+ public Integer getOrderForKey(@NonNull Object key) {
+ if (getCurrentList() != null && key instanceof Post) {
+ return getCurrentList().indexOf(key);
+ }
+
+ return null;
+ }
+
public interface Callback {
void retryLoadingMore();
void typeChipClicked(int filter);
}
- class PostViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.card_view_item_post)
+ class PostBaseViewHolder extends RecyclerView.ViewHolder {
MaterialCardView cardView;
- @BindView(R.id.icon_gif_image_view_item_post)
AspectRatioGifImageView iconGifImageView;
- @BindView(R.id.subreddit_name_text_view_item_post)
TextView subredditTextView;
- @BindView(R.id.user_text_view_item_post)
TextView userTextView;
- @BindView(R.id.stickied_post_image_view_item_post)
ImageView stickiedPostImageView;
- @BindView(R.id.post_time_text_view_best_item_post)
TextView postTimeTextView;
- @BindView(R.id.title_text_view_best_item_post)
TextView titleTextView;
- @BindView(R.id.type_text_view_item_post)
CustomTextView typeTextView;
- @BindView(R.id.archived_image_view_item_post)
ImageView archivedImageView;
- @BindView(R.id.locked_image_view_item_post)
ImageView lockedImageView;
- @BindView(R.id.crosspost_image_view_item_post)
ImageView crosspostImageView;
- @BindView(R.id.nsfw_text_view_item_post)
CustomTextView nsfwTextView;
- @BindView(R.id.spoiler_custom_text_view_item_post)
CustomTextView spoilerTextView;
- @BindView(R.id.flair_custom_text_view_item_post)
CustomTextView flairTextView;
- @BindView(R.id.awards_text_view_item_post)
CustomTextView awardsTextView;
- @BindView(R.id.link_text_view_item_post)
- TextView linkTextView;
- @BindView(R.id.image_view_wrapper_item_post)
- RelativeLayout relativeLayout;
- @BindView(R.id.progress_bar_item_post)
- ProgressBar progressBar;
- @BindView(R.id.image_view_best_post_item)
- AspectRatioGifImageView imageView;
- @BindView(R.id.play_button_image_view_item_post)
- ImageView playButtonImageView;
- @BindView(R.id.load_image_error_relative_layout_item_post)
- RelativeLayout errorRelativeLayout;
- @BindView(R.id.image_view_no_preview_link_item_post)
- ImageView noPreviewLinkImageView;
- @BindView(R.id.content_text_view_item_post)
- TextView contentTextView;
- @BindView(R.id.bottom_constraint_layout_item_post)
ConstraintLayout bottomConstraintLayout;
- @BindView(R.id.plus_button_item_post)
ImageView upvoteButton;
- @BindView(R.id.score_text_view_item_post)
TextView scoreTextView;
- @BindView(R.id.minus_button_item_post)
ImageView downvoteButton;
- @BindView(R.id.comments_count_item_post)
TextView commentsCountTextView;
- @BindView(R.id.save_button_item_post)
ImageView saveButton;
- @BindView(R.id.share_button_item_post)
ImageView shareButton;
- PostViewHolder(View itemView) {
+ PostBaseViewHolder(@NonNull View itemView) {
super(itemView);
- ButterKnife.bind(this, itemView);
- scoreTextView.setOnClickListener(view -> {
- //Do nothing in order to prevent clicking this to start ViewPostDetailActivity
- });
+ }
+
+ void setBaseView(MaterialCardView cardView,
+ AspectRatioGifImageView iconGifImageView,
+ TextView subredditTextView,
+ TextView userTextView,
+ ImageView stickiedPostImageView,
+ TextView postTimeTextView,
+ TextView titleTextView,
+ CustomTextView typeTextView,
+ ImageView archivedImageView,
+ ImageView lockedImageView,
+ ImageView crosspostImageView,
+ CustomTextView nsfwTextView,
+ CustomTextView spoilerTextView,
+ CustomTextView flairTextView,
+ CustomTextView awardsTextView,
+ ConstraintLayout bottomConstraintLayout,
+ ImageView upvoteButton,
+ TextView scoreTextView,
+ ImageView downvoteButton,
+ TextView commentsCountTextView,
+ ImageView saveButton,
+ ImageView shareButton) {
+ this.cardView = cardView;
+ this.iconGifImageView = iconGifImageView;
+ this.subredditTextView = subredditTextView;
+ this.userTextView = userTextView;
+ this.stickiedPostImageView = stickiedPostImageView;
+ this.postTimeTextView = postTimeTextView;
+ this.titleTextView = titleTextView;
+ this.typeTextView = typeTextView;
+ this.archivedImageView = archivedImageView;
+ this.lockedImageView = lockedImageView;
+ this.crosspostImageView = crosspostImageView;
+ this.nsfwTextView = nsfwTextView;
+ this.spoilerTextView = spoilerTextView;
+ this.flairTextView = flairTextView;
+ this.awardsTextView = awardsTextView;
+ this.bottomConstraintLayout = bottomConstraintLayout;
+ this.upvoteButton = upvoteButton;
+ this.scoreTextView = scoreTextView;
+ this.downvoteButton = downvoteButton;
+ this.commentsCountTextView = commentsCountTextView;
+ this.saveButton = saveButton;
+ this.shareButton = shareButton;
+
+ scoreTextView.setOnClickListener(null);
if (mVoteButtonsOnTheRight) {
ConstraintSet constraintSet = new ConstraintSet();
@@ -1665,7 +1488,6 @@ public class PostRecyclerViewAdapter extends PagedListAdapter {
+ if (canStartActivity) {
+ canStartActivity = false;
+
+ Intent intent = new Intent(mActivity, ViewPostDetailActivity.class);
+ intent.putExtra(ViewPostDetailActivity.EXTRA_POST_DATA, getItem(getAdapterPosition()));
+ intent.putExtra(ViewPostDetailActivity.EXTRA_POST_LIST_POSITION, getAdapterPosition());
+ mActivity.startActivity(intent);
+ }
+ });
+
+ userTextView.setOnClickListener(view -> {
+ if (canStartActivity) {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ canStartActivity = false;
+ Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
+ intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, post.getAuthor());
+ mActivity.startActivity(intent);
+ }
+ }
+ });
+
+ if (mDisplaySubredditName) {
+ subredditTextView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ if (canStartActivity) {
+ canStartActivity = false;
+ if (post.getSubredditNamePrefixed().startsWith("u/")) {
+ Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
+ intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY,
+ post.getSubredditNamePrefixed().substring(2));
+ mActivity.startActivity(intent);
+ } else {
+ Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
+ intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
+ post.getSubredditName());
+ mActivity.startActivity(intent);
+ }
+ }
+ }
+ });
+
+ iconGifImageView.setOnClickListener(view -> subredditTextView.performClick());
+ } else {
+ subredditTextView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ if (canStartActivity) {
+ canStartActivity = false;
+ if (post.getSubredditNamePrefixed().startsWith("u/")) {
+ Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
+ intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, post.getAuthor());
+ mActivity.startActivity(intent);
+ } else {
+ Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
+ intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
+ post.getSubredditName());
+ mActivity.startActivity(intent);
+ }
+ }
+ }
+ });
+
+ iconGifImageView.setOnClickListener(view -> userTextView.performClick());
+ }
+
+ if (!(mActivity instanceof FilteredThingActivity)) {
+ nsfwTextView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ Intent intent = new Intent(mActivity, FilteredThingActivity.class);
+ intent.putExtra(FilteredThingActivity.EXTRA_NAME, post.getSubredditNamePrefixed().substring(2));
+ intent.putExtra(FilteredThingActivity.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
+ intent.putExtra(FilteredThingActivity.EXTRA_FILTER, Post.NSFW_TYPE);
+ mActivity.startActivity(intent);
+ }
+ });
+ typeTextView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ mCallback.typeChipClicked(post.getPostType());
+ }
+ });
+ }
+
+ upvoteButton.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ if (mAccessToken == null) {
+ Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (post.isArchived()) {
+ Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ ColorFilter previousUpvoteButtonColorFilter = upvoteButton.getColorFilter();
+ ColorFilter previousDownvoteButtonColorFilter = downvoteButton.getColorFilter();
+ int previousScoreTextViewColor = scoreTextView.getCurrentTextColor();
+
+ int previousVoteType = post.getVoteType();
+ String newVoteType;
+
+ downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+
+ if (previousVoteType != 1) {
+ //Not upvoted before
+ post.setVoteType(1);
+ newVoteType = RedditUtils.DIR_UPVOTE;
+ upvoteButton
+ .setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mUpvotedColor);
+ } else {
+ //Upvoted before
+ post.setVoteType(0);
+ newVoteType = RedditUtils.DIR_UNVOTE;
+ upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mPostIconAndInfoColor);
+ }
+
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
+
+ VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
+ @Override
+ public void onVoteThingSuccess(int position1) {
+ if (newVoteType.equals(RedditUtils.DIR_UPVOTE)) {
+ post.setVoteType(1);
+ upvoteButton
+ .setColorFilter(mUpvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mUpvotedColor);
+ } else {
+ post.setVoteType(0);
+ upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mPostIconAndInfoColor);
+ }
+
+ downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
+
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+
+ @Override
+ public void onVoteThingFail(int position1) {
+ Toast.makeText(mActivity, R.string.vote_failed, Toast.LENGTH_SHORT).show();
+ post.setVoteType(previousVoteType);
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + previousVoteType));
+ upvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
+ downvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
+ scoreTextView.setTextColor(previousScoreTextViewColor);
+
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+ }, post.getFullName(), newVoteType, getAdapterPosition());
+ }
+ });
+
+ downvoteButton.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ if (mAccessToken == null) {
+ Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (post.isArchived()) {
+ Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ ColorFilter previousUpvoteButtonColorFilter = upvoteButton.getColorFilter();
+ ColorFilter previousDownvoteButtonColorFilter = downvoteButton.getColorFilter();
+ int previousScoreTextViewColor = scoreTextView.getCurrentTextColor();
+
+ int previousVoteType = post.getVoteType();
+ String newVoteType;
+
+ upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+
+ if (previousVoteType != -1) {
+ //Not downvoted before
+ post.setVoteType(-1);
+ newVoteType = RedditUtils.DIR_DOWNVOTE;
+ downvoteButton
+ .setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mDownvotedColor);
+ } else {
+ //Downvoted before
+ post.setVoteType(0);
+ newVoteType = RedditUtils.DIR_UNVOTE;
+ downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mPostIconAndInfoColor);
+ }
+
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
+
+ VoteThing.voteThing(mActivity, mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() {
+ @Override
+ public void onVoteThingSuccess(int position1) {
+ if (newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) {
+ post.setVoteType(-1);
+ downvoteButton
+ .setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mDownvotedColor);
+ } else {
+ post.setVoteType(0);
+ downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setTextColor(mPostIconAndInfoColor);
+ }
+
+ upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
+
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+
+ @Override
+ public void onVoteThingFail(int position1) {
+ Toast.makeText(mActivity, R.string.vote_failed, Toast.LENGTH_SHORT).show();
+ post.setVoteType(previousVoteType);
+ scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + previousVoteType));
+ upvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
+ downvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
+ scoreTextView.setTextColor(previousScoreTextViewColor);
+
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+ }, post.getFullName(), newVoteType, getAdapterPosition());
+ }
+ });
+
+ saveButton.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ if (mAccessToken == null) {
+ Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (post.isSaved()) {
+ saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
+ SaveThing.unsaveThing(mOauthRetrofit, mAccessToken, post.getFullName(),
+ new SaveThing.SaveThingListener() {
+ @Override
+ public void success() {
+ post.setSaved(false);
+ saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
+ Toast.makeText(mActivity, R.string.post_unsaved_success, Toast.LENGTH_SHORT).show();
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+
+ @Override
+ public void failed() {
+ post.setSaved(true);
+ saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
+ Toast.makeText(mActivity, R.string.post_unsaved_failed, Toast.LENGTH_SHORT).show();
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+ });
+ } else {
+ saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
+ SaveThing.saveThing(mOauthRetrofit, mAccessToken, post.getFullName(),
+ new SaveThing.SaveThingListener() {
+ @Override
+ public void success() {
+ post.setSaved(true);
+ saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
+ Toast.makeText(mActivity, R.string.post_saved_success, Toast.LENGTH_SHORT).show();
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+
+ @Override
+ public void failed() {
+ post.setSaved(false);
+ saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
+ Toast.makeText(mActivity, R.string.post_saved_failed, Toast.LENGTH_SHORT).show();
+ EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
+ }
+ });
+ }
+ }
+ });
+
+ shareButton.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ shareLink(post);
+ }
+ });
+ }
+ }
+
+ class PostVideoAutoplayViewHolder extends PostBaseViewHolder implements ToroPlayer {
+ @BindView(R.id.card_view_item_post_video_type_autoplay)
+ MaterialCardView cardView;
+ @BindView(R.id.icon_gif_image_view_item_post_video_type_autoplay)
+ AspectRatioGifImageView iconGifImageView;
+ @BindView(R.id.subreddit_name_text_view_item_post_video_type_autoplay)
+ TextView subredditTextView;
+ @BindView(R.id.user_text_view_item_post_video_type_autoplay)
+ TextView userTextView;
+ @BindView(R.id.stickied_post_image_view_item_post_video_type_autoplay)
+ ImageView stickiedPostImageView;
+ @BindView(R.id.post_time_text_view_best_item_post_video_type_autoplay)
+ TextView postTimeTextView;
+ @BindView(R.id.title_text_view_best_item_post_video_type_autoplay)
+ TextView titleTextView;
+ @BindView(R.id.type_text_view_item_post_video_type_autoplay)
+ CustomTextView typeTextView;
+ @BindView(R.id.archived_image_view_item_post_video_type_autoplay)
+ ImageView archivedImageView;
+ @BindView(R.id.locked_image_view_item_post_video_type_autoplay)
+ ImageView lockedImageView;
+ @BindView(R.id.crosspost_image_view_item_post_video_type_autoplay)
+ ImageView crosspostImageView;
+ @BindView(R.id.nsfw_text_view_item_post_video_type_autoplay)
+ CustomTextView nsfwTextView;
+ @BindView(R.id.spoiler_custom_text_view_item_post_video_type_autoplay)
+ CustomTextView spoilerTextView;
+ @BindView(R.id.flair_custom_text_view_item_post_video_type_autoplay)
+ CustomTextView flairTextView;
+ @BindView(R.id.awards_text_view_item_post_video_type_autoplay)
+ CustomTextView awardsTextView;
+ @BindView(R.id.aspect)
+ AspectRatioFrameLayout aspectRatioFrameLayout;
+ @BindView(R.id.player_view_item_post_video_type_autoplay)
+ PlayerView videoPlayer;
+ @BindView(R.id.mute_exo_playback_control_view)
+ ImageView muteButton;
+ @BindView(R.id.fullscreen_exo_playback_control_view)
+ ImageView fullscreenButton;
+ @BindView(R.id.bottom_constraint_layout_item_post_video_type_autoplay)
+ ConstraintLayout bottomConstraintLayout;
+ @BindView(R.id.plus_button_item_post_video_type_autoplay)
+ ImageView upvoteButton;
+ @BindView(R.id.score_text_view_item_post_video_type_autoplay)
+ TextView scoreTextView;
+ @BindView(R.id.minus_button_item_post_video_type_autoplay)
+ ImageView downvoteButton;
+ @BindView(R.id.comments_count_item_post_video_type_autoplay)
+ TextView commentsCountTextView;
+ @BindView(R.id.save_button_item_post_video_type_autoplay)
+ ImageView saveButton;
+ @BindView(R.id.share_button_item_post_video_type_autoplay)
+ ImageView shareButton;
+
+ @Nullable
+ ExoPlayerViewHelper helper;
+ private Uri mediaUri;
+ private float volume = 0f;
+
+ PostVideoAutoplayViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ setBaseView(cardView,
+ iconGifImageView,
+ subredditTextView,
+ userTextView,
+ stickiedPostImageView,
+ postTimeTextView,
+ titleTextView,
+ typeTextView,
+ archivedImageView,
+ lockedImageView,
+ crosspostImageView,
+ nsfwTextView,
+ spoilerTextView,
+ flairTextView,
+ awardsTextView,
+ bottomConstraintLayout,
+ upvoteButton,
+ scoreTextView,
+ downvoteButton,
+ commentsCountTextView,
+ saveButton,
+ shareButton);
+
+ aspectRatioFrameLayout.setOnClickListener(null);
+
+ muteButton.setOnClickListener(view -> {
+ if (helper != null) {
+ if (helper.getVolume() != 0) {
+ muteButton.setImageDrawable(mActivity.getDrawable(R.drawable.ic_mute_white_rounded_18dp));
+ helper.setVolume(0f);
+ volume = 0f;
+ } else {
+ muteButton.setImageDrawable(mActivity.getDrawable(R.drawable.ic_unmute_white_rounded_18dp));
+ helper.setVolume(1f);
+ volume = 1f;
+ }
+ }
+ });
+
+ fullscreenButton.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ Intent intent = new Intent(mActivity, ViewVideoActivity.class);
+ intent.setData(Uri.parse(post.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_DOWNLOAD_URL, post.getVideoDownloadUrl());
+ intent.putExtra(ViewVideoActivity.EXTRA_SUBREDDIT, post.getSubredditName());
+ intent.putExtra(ViewVideoActivity.EXTRA_ID, post.getId());
+ intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, post.getTitle());
+ mActivity.startActivity(intent);
+ }
+ });
+ }
+
+ void bindVideoUri(Uri videoUri) {
+ mediaUri = videoUri;
+ }
+
+ @NonNull
+ @Override
+ public View getPlayerView() {
+ return videoPlayer;
+ }
+
+ @NonNull
+ @Override
+ public PlaybackInfo getCurrentPlaybackInfo() {
+ return helper != null ? helper.getLatestPlaybackInfo() : new PlaybackInfo();
+ }
+
+ @Override
+ public void initialize(@NonNull Container container, @NonNull PlaybackInfo playbackInfo) {
+ if (helper == null) {
+ helper = new ExoPlayerViewHelper(this, mediaUri, null, mExoCreator);
+ helper.addEventListener(new Playable.EventListener() {
+ @Override
+ public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
+ if (!trackGroups.isEmpty()) {
+ for (int i = 0; i < trackGroups.length; i++) {
+ String mimeType = trackGroups.get(i).getFormat(0).sampleMimeType;
+ if (mimeType != null && mimeType.contains("audio")) {
+ helper.setVolume(volume);
+ muteButton.setVisibility(View.VISIBLE);
+ if (volume != 0f) {
+ muteButton.setImageDrawable(mActivity.getDrawable(R.drawable.ic_unmute_white_rounded_18dp));
+ } else {
+ muteButton.setImageDrawable(mActivity.getDrawable(R.drawable.ic_mute_white_rounded_18dp));
+ }
+ break;
+ }
+ }
+ } else {
+ muteButton.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onMetadata(Metadata metadata) {
+
+ }
+
+ @Override
+ public void onCues(List cues) {
+
+ }
+ });
+ }
+ helper.initialize(container, playbackInfo);
+ }
+
+ @Override
+ public void play() {
+ if (helper != null) helper.play();
+ }
+
+ @Override
+ public void pause() {
+ if (helper != null) helper.pause();
+ }
+
+ @Override
+ public boolean isPlaying() {
+ return helper != null && helper.isPlaying();
+ }
+
+ @Override
+ public void release() {
+ if (helper != null) {
+ helper.release();
+ helper = null;
+ }
+ }
+
+ @Override
+ public boolean wantsToPlay() {
+ return ToroUtil.visibleAreaOffset(this, itemView.getParent()) >= 0.85;
+ }
+
+ @Override
+ public int getPlayerOrder() {
+ return getAdapterPosition();
+ }
+ }
+
+ class PostGifAndVideoPreviewViewHolder extends PostBaseViewHolder {
+ @BindView(R.id.card_view_item_post_gif_type_autoplay)
+ MaterialCardView cardView;
+ @BindView(R.id.icon_gif_image_view_item_post_gif_type_autoplay)
+ AspectRatioGifImageView iconGifImageView;
+ @BindView(R.id.subreddit_name_text_view_item_post_gif_type_autoplay)
+ TextView subredditTextView;
+ @BindView(R.id.user_text_view_item_post_gif_type_autoplay)
+ TextView userTextView;
+ @BindView(R.id.stickied_post_image_view_item_post_gif_type_autoplay)
+ ImageView stickiedPostImageView;
+ @BindView(R.id.post_time_text_view_best_item_post_gif_type_autoplay)
+ TextView postTimeTextView;
+ @BindView(R.id.title_text_view_best_item_post_gif_type_autoplay)
+ TextView titleTextView;
+ @BindView(R.id.type_text_view_item_post_gif_type_autoplay)
+ CustomTextView typeTextView;
+ @BindView(R.id.archived_image_view_item_post_gif_type_autoplay)
+ ImageView archivedImageView;
+ @BindView(R.id.locked_image_view_item_post_gif_type_autoplay)
+ ImageView lockedImageView;
+ @BindView(R.id.crosspost_image_view_item_post_gif_type_autoplay)
+ ImageView crosspostImageView;
+ @BindView(R.id.nsfw_text_view_item_post_gif_type_autoplay)
+ CustomTextView nsfwTextView;
+ @BindView(R.id.spoiler_custom_text_view_item_post_gif_type_autoplay)
+ CustomTextView spoilerTextView;
+ @BindView(R.id.flair_custom_text_view_item_post_gif_type_autoplay)
+ CustomTextView flairTextView;
+ @BindView(R.id.awards_text_view_item_post_gif_type_autoplay)
+ CustomTextView awardsTextView;
+ @BindView(R.id.image_view_wrapper_item_post_gif_type_autoplay)
+ RelativeLayout relativeLayout;
+ @BindView(R.id.progress_bar_item_post_gif_type_autoplay)
+ ProgressBar progressBar;
+ @BindView(R.id.image_view_item_post_gif_type_autoplay)
+ AspectRatioGifImageView imageView;
+ @BindView(R.id.load_image_error_relative_layout_item_post_gif_type_autoplay)
+ RelativeLayout errorRelativeLayout;
+ @BindView(R.id.bottom_constraint_layout_item_post_gif_type_autoplay)
+ ConstraintLayout bottomConstraintLayout;
+ @BindView(R.id.plus_button_item_post_gif_type_autoplay)
+ ImageView upvoteButton;
+ @BindView(R.id.score_text_view_item_post_gif_type_autoplay)
+ TextView scoreTextView;
+ @BindView(R.id.minus_button_item_post_gif_type_autoplay)
+ ImageView downvoteButton;
+ @BindView(R.id.comments_count_item_post_gif_type_autoplay)
+ TextView commentsCountTextView;
+ @BindView(R.id.save_button_item_post_gif_type_autoplay)
+ ImageView saveButton;
+ @BindView(R.id.share_button_item_post_gif_type_autoplay)
+ ImageView shareButton;
+
+ PostGifAndVideoPreviewViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ setBaseView(cardView,
+ iconGifImageView,
+ subredditTextView,
+ userTextView,
+ stickiedPostImageView,
+ postTimeTextView,
+ titleTextView,
+ typeTextView,
+ archivedImageView,
+ lockedImageView,
+ crosspostImageView,
+ nsfwTextView,
+ spoilerTextView,
+ flairTextView,
+ awardsTextView,
+ bottomConstraintLayout,
+ upvoteButton,
+ scoreTextView,
+ downvoteButton,
+ commentsCountTextView,
+ saveButton,
+ shareButton);
+
+ progressBar.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent));
+
+ imageView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ if (post.getPostType() == Post.VIDEO_TYPE) {
+ Intent intent = new Intent(mActivity, ViewVideoActivity.class);
+ intent.setData(Uri.parse(post.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_DOWNLOAD_URL, post.getVideoDownloadUrl());
+ intent.putExtra(ViewVideoActivity.EXTRA_SUBREDDIT, post.getSubredditName());
+ intent.putExtra(ViewVideoActivity.EXTRA_ID, post.getFullName());
+ intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, post.getTitle());
+ mActivity.startActivity(intent);
+ } else if (post.getPostType() == Post.GIF_TYPE) {
+ Intent intent = new Intent(mActivity, ViewGIFActivity.class);
+ intent.setData(Uri.parse(post.getVideoUrl()));
+ intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, post.getSubredditName()
+ + "-" + post.getId() + ".gif");
+ intent.putExtra(ViewGIFActivity.GIF_URL_KEY, post.getVideoUrl());
+ intent.putExtra(ViewGIFActivity.POST_TITLE_KEY, post.getTitle());
+ mActivity.startActivity(intent);
+ }
+ }
+ });
+ }
+ }
+
+ class PostImageAndGifAutoplayTypeViewHolder extends PostBaseViewHolder {
+ @BindView(R.id.card_view_item_post_image_type)
+ MaterialCardView cardView;
+ @BindView(R.id.icon_gif_image_view_item_post_image_type)
+ AspectRatioGifImageView iconGifImageView;
+ @BindView(R.id.subreddit_name_text_view_item_post_image_type)
+ TextView subredditTextView;
+ @BindView(R.id.user_text_view_item_post_image_type)
+ TextView userTextView;
+ @BindView(R.id.stickied_post_image_view_item_post_image_type)
+ ImageView stickiedPostImageView;
+ @BindView(R.id.post_time_text_view_best_item_post_image_type)
+ TextView postTimeTextView;
+ @BindView(R.id.title_text_view_best_item_post_image_type)
+ TextView titleTextView;
+ @BindView(R.id.type_text_view_item_post_image_type)
+ CustomTextView typeTextView;
+ @BindView(R.id.archived_image_view_item_post_image_type)
+ ImageView archivedImageView;
+ @BindView(R.id.locked_image_view_item_post_image_type)
+ ImageView lockedImageView;
+ @BindView(R.id.crosspost_image_view_item_post_image_type)
+ ImageView crosspostImageView;
+ @BindView(R.id.nsfw_text_view_item_post_image_type)
+ CustomTextView nsfwTextView;
+ @BindView(R.id.spoiler_custom_text_view_item_post_image_type)
+ CustomTextView spoilerTextView;
+ @BindView(R.id.flair_custom_text_view_item_post_image_type)
+ CustomTextView flairTextView;
+ @BindView(R.id.awards_text_view_item_post_image_type)
+ CustomTextView awardsTextView;
+ @BindView(R.id.image_view_wrapper_item_post_image_type)
+ RelativeLayout relativeLayout;
+ @BindView(R.id.progress_bar_item_post_image_type)
+ ProgressBar progressBar;
+ @BindView(R.id.image_view_best_post_item)
+ AspectRatioGifImageView imageView;
+ @BindView(R.id.load_image_error_relative_layout_item_post_image_type)
+ RelativeLayout errorRelativeLayout;
+ @BindView(R.id.bottom_constraint_layout_item_post_image_type)
+ ConstraintLayout bottomConstraintLayout;
+ @BindView(R.id.plus_button_item_post_image_type)
+ ImageView upvoteButton;
+ @BindView(R.id.score_text_view_item_post_image_type)
+ TextView scoreTextView;
+ @BindView(R.id.minus_button_item_post_image_type)
+ ImageView downvoteButton;
+ @BindView(R.id.comments_count_item_post_image_type)
+ TextView commentsCountTextView;
+ @BindView(R.id.save_button_item_post_image_type)
+ ImageView saveButton;
+ @BindView(R.id.share_button_item_post_image_type)
+ ImageView shareButton;
+
+ PostImageAndGifAutoplayTypeViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ setBaseView(cardView,
+ iconGifImageView,
+ subredditTextView,
+ userTextView,
+ stickiedPostImageView,
+ postTimeTextView,
+ titleTextView,
+ typeTextView,
+ archivedImageView,
+ lockedImageView,
+ crosspostImageView,
+ nsfwTextView,
+ spoilerTextView,
+ flairTextView,
+ awardsTextView,
+ bottomConstraintLayout,
+ upvoteButton,
+ scoreTextView,
+ downvoteButton,
+ commentsCountTextView,
+ saveButton,
+ shareButton);
+
+ progressBar.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent));
+
+ imageView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ Intent intent = new Intent(mActivity, ViewImageActivity.class);
+ intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, post.getUrl());
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, post.getSubredditName()
+ + "-" + post.getId() + ".jpg");
+ intent.putExtra(ViewImageActivity.POST_TITLE_KEY, post.getTitle());
+ mActivity.startActivity(intent);
+ }
+ });
+ }
+ }
+
+ class PostLinkTypeViewHolder extends PostBaseViewHolder {
+ @BindView(R.id.card_view_item_post_link_type)
+ MaterialCardView cardView;
+ @BindView(R.id.icon_gif_image_view_item_post_link_type)
+ AspectRatioGifImageView iconGifImageView;
+ @BindView(R.id.subreddit_name_text_view_item_post_link_type)
+ TextView subredditTextView;
+ @BindView(R.id.user_text_view_item_post_link_type)
+ TextView userTextView;
+ @BindView(R.id.stickied_post_image_view_item_post_link_type)
+ ImageView stickiedPostImageView;
+ @BindView(R.id.post_time_text_view_best_item_post_link_type)
+ TextView postTimeTextView;
+ @BindView(R.id.title_text_view_best_item_post_link_type)
+ TextView titleTextView;
+ @BindView(R.id.type_text_view_item_post_link_type)
+ CustomTextView typeTextView;
+ @BindView(R.id.archived_image_view_item_post_link_type)
+ ImageView archivedImageView;
+ @BindView(R.id.locked_image_view_item_post_link_type)
+ ImageView lockedImageView;
+ @BindView(R.id.crosspost_image_view_item_post_link_type)
+ ImageView crosspostImageView;
+ @BindView(R.id.nsfw_text_view_item_post_link_type)
+ CustomTextView nsfwTextView;
+ @BindView(R.id.spoiler_custom_text_view_item_post_link_type)
+ CustomTextView spoilerTextView;
+ @BindView(R.id.flair_custom_text_view_item_post_link_type)
+ CustomTextView flairTextView;
+ @BindView(R.id.awards_text_view_item_post_link_type)
+ CustomTextView awardsTextView;
+ @BindView(R.id.link_text_view_item_post_link_type)
+ TextView linkTextView;
+ @BindView(R.id.image_view_wrapper_item_post_link_type)
+ RelativeLayout relativeLayout;
+ @BindView(R.id.progress_bar_item_post_link_type)
+ ProgressBar progressBar;
+ @BindView(R.id.image_view_best_post_item)
+ AspectRatioGifImageView imageView;
+ @BindView(R.id.load_image_error_relative_layout_item_post_link_type)
+ RelativeLayout errorRelativeLayout;
+ @BindView(R.id.bottom_constraint_layout_item_post_link_type)
+ ConstraintLayout bottomConstraintLayout;
+ @BindView(R.id.plus_button_item_post_link_type)
+ ImageView upvoteButton;
+ @BindView(R.id.score_text_view_item_post_link_type)
+ TextView scoreTextView;
+ @BindView(R.id.minus_button_item_post_link_type)
+ ImageView downvoteButton;
+ @BindView(R.id.comments_count_item_post_link_type)
+ TextView commentsCountTextView;
+ @BindView(R.id.save_button_item_post_link_type)
+ ImageView saveButton;
+ @BindView(R.id.share_button_item_post_link_type)
+ ImageView shareButton;
+
+ PostLinkTypeViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ setBaseView(cardView,
+ iconGifImageView,
+ subredditTextView,
+ userTextView,
+ stickiedPostImageView,
+ postTimeTextView,
+ titleTextView,
+ typeTextView,
+ archivedImageView,
+ lockedImageView,
+ crosspostImageView,
+ nsfwTextView,
+ spoilerTextView,
+ flairTextView,
+ awardsTextView,
+ bottomConstraintLayout,
+ upvoteButton,
+ scoreTextView,
+ downvoteButton,
+ commentsCountTextView,
+ saveButton,
+ shareButton);
+
+ linkTextView.setTextColor(mSecondaryTextColor);
+ progressBar.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent));
+
+ imageView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ Intent intent = new Intent(mActivity, LinkResolverActivity.class);
+ Uri uri = Uri.parse(post.getUrl());
+ if (uri.getScheme() == null && uri.getHost() == null) {
+ intent.setData(LinkResolverActivity.getRedditUriByPath(post.getUrl()));
+ } else {
+ intent.setData(uri);
+ }
+ mActivity.startActivity(intent);
+ }
+ });
+ }
+ }
+
+ class PostNoPreviewLinkTypeViewHolder extends PostBaseViewHolder {
+ @BindView(R.id.card_view_item_post_no_preview_link_type)
+ MaterialCardView cardView;
+ @BindView(R.id.icon_gif_image_view_item_post_no_preview_link_type)
+ AspectRatioGifImageView iconGifImageView;
+ @BindView(R.id.subreddit_name_text_view_item_post_no_preview_link_type)
+ TextView subredditTextView;
+ @BindView(R.id.user_text_view_item_post_no_preview_link_type)
+ TextView userTextView;
+ @BindView(R.id.stickied_post_image_view_item_post_no_preview_link_type)
+ ImageView stickiedPostImageView;
+ @BindView(R.id.post_time_text_view_best_item_post_no_preview_link_type)
+ TextView postTimeTextView;
+ @BindView(R.id.title_text_view_best_item_post_no_preview_link_type)
+ TextView titleTextView;
+ @BindView(R.id.type_text_view_item_post_no_preview_link_type)
+ CustomTextView typeTextView;
+ @BindView(R.id.archived_image_view_item_post_no_preview_link_type)
+ ImageView archivedImageView;
+ @BindView(R.id.locked_image_view_item_post_no_preview_link_type)
+ ImageView lockedImageView;
+ @BindView(R.id.crosspost_image_view_item_post_no_preview_link_type)
+ ImageView crosspostImageView;
+ @BindView(R.id.nsfw_text_view_item_post_no_preview_link_type)
+ CustomTextView nsfwTextView;
+ @BindView(R.id.spoiler_custom_text_view_item_post_no_preview_link_type)
+ CustomTextView spoilerTextView;
+ @BindView(R.id.flair_custom_text_view_item_post_no_preview_link_type)
+ CustomTextView flairTextView;
+ @BindView(R.id.awards_text_view_item_post_no_preview_link_type)
+ CustomTextView awardsTextView;
+ @BindView(R.id.link_text_view_item_post_no_preview_link_type)
+ TextView linkTextView;
+ @BindView(R.id.image_view_no_preview_link_item_post_no_preview_link_type)
+ ImageView noPreviewLinkImageView;
+ @BindView(R.id.bottom_constraint_layout_item_post_no_preview_link_type)
+ ConstraintLayout bottomConstraintLayout;
+ @BindView(R.id.plus_button_item_post_no_preview_link_type)
+ ImageView upvoteButton;
+ @BindView(R.id.score_text_view_item_post_no_preview_link_type)
+ TextView scoreTextView;
+ @BindView(R.id.minus_button_item_post_no_preview_link_type)
+ ImageView downvoteButton;
+ @BindView(R.id.comments_count_item_post_no_preview_link_type)
+ TextView commentsCountTextView;
+ @BindView(R.id.save_button_item_post_no_preview_link_type)
+ ImageView saveButton;
+ @BindView(R.id.share_button_item_post_no_preview_link_type)
+ ImageView shareButton;
+
+ PostNoPreviewLinkTypeViewHolder(View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ setBaseView(cardView,
+ iconGifImageView,
+ subredditTextView,
+ userTextView,
+ stickiedPostImageView,
+ postTimeTextView,
+ titleTextView,
+ typeTextView,
+ archivedImageView,
+ lockedImageView,
+ crosspostImageView,
+ nsfwTextView,
+ spoilerTextView,
+ flairTextView,
+ awardsTextView,
+ bottomConstraintLayout,
+ upvoteButton,
+ scoreTextView,
+ downvoteButton,
+ commentsCountTextView,
+ saveButton,
+ shareButton);
+
+ linkTextView.setTextColor(mSecondaryTextColor);
+ noPreviewLinkImageView.setBackgroundColor(mNoPreviewLinkBackgroundColor);
+
+ noPreviewLinkImageView.setOnClickListener(view -> {
+ Post post = getItem(getAdapterPosition());
+ if (post != null) {
+ Intent intent = new Intent(mActivity, LinkResolverActivity.class);
+ Uri uri = Uri.parse(post.getUrl());
+ if (uri.getScheme() == null && uri.getHost() == null) {
+ intent.setData(LinkResolverActivity.getRedditUriByPath(post.getUrl()));
+ } else {
+ intent.setData(uri);
+ }
+ mActivity.startActivity(intent);
+ }
+ });
+ }
+ }
+
+ class PostTextTypeViewHolder extends PostBaseViewHolder {
+ @BindView(R.id.card_view_item_post_text_type)
+ MaterialCardView cardView;
+ @BindView(R.id.icon_gif_image_view_item_post_text_type)
+ AspectRatioGifImageView iconGifImageView;
+ @BindView(R.id.subreddit_name_text_view_item_post_text_type)
+ TextView subredditTextView;
+ @BindView(R.id.user_text_view_item_post_text_type)
+ TextView userTextView;
+ @BindView(R.id.stickied_post_image_view_item_post_text_type)
+ ImageView stickiedPostImageView;
+ @BindView(R.id.post_time_text_view_best_item_post_text_type)
+ TextView postTimeTextView;
+ @BindView(R.id.title_text_view_best_item_post_text_type)
+ TextView titleTextView;
+ @BindView(R.id.type_text_view_item_post_text_type)
+ CustomTextView typeTextView;
+ @BindView(R.id.archived_image_view_item_post_text_type)
+ ImageView archivedImageView;
+ @BindView(R.id.locked_image_view_item_post_text_type)
+ ImageView lockedImageView;
+ @BindView(R.id.crosspost_image_view_item_post_text_type)
+ ImageView crosspostImageView;
+ @BindView(R.id.nsfw_text_view_item_post_text_type)
+ CustomTextView nsfwTextView;
+ @BindView(R.id.spoiler_custom_text_view_item_post_text_type)
+ CustomTextView spoilerTextView;
+ @BindView(R.id.flair_custom_text_view_item_post_text_type)
+ CustomTextView flairTextView;
+ @BindView(R.id.awards_text_view_item_post_text_type)
+ CustomTextView awardsTextView;
+ @BindView(R.id.content_text_view_item_post_text_type)
+ TextView contentTextView;
+ @BindView(R.id.bottom_constraint_layout_item_post_text_type)
+ ConstraintLayout bottomConstraintLayout;
+ @BindView(R.id.plus_button_item_post_text_type)
+ ImageView upvoteButton;
+ @BindView(R.id.score_text_view_item_post_text_type)
+ TextView scoreTextView;
+ @BindView(R.id.minus_button_item_post_text_type)
+ ImageView downvoteButton;
+ @BindView(R.id.comments_count_item_post_text_type)
+ TextView commentsCountTextView;
+ @BindView(R.id.save_button_item_post_text_type)
+ ImageView saveButton;
+ @BindView(R.id.share_button_item_post_text_type)
+ ImageView shareButton;
+
+ PostTextTypeViewHolder (View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ setBaseView(cardView,
+ iconGifImageView,
+ subredditTextView,
+ userTextView,
+ stickiedPostImageView,
+ postTimeTextView,
+ titleTextView,
+ typeTextView,
+ archivedImageView,
+ lockedImageView,
+ crosspostImageView,
+ nsfwTextView,
+ spoilerTextView,
+ flairTextView,
+ awardsTextView,
+ bottomConstraintLayout,
+ upvoteButton,
+ scoreTextView,
+ downvoteButton,
+ commentsCountTextView,
+ saveButton,
+ shareButton);
+
+ contentTextView.setTextColor(mPostContentColor);
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/ReportReasonRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/ReportReasonRecyclerViewAdapter.java
new file mode 100644
index 00000000..8bbc3991
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/ReportReasonRecyclerViewAdapter.java
@@ -0,0 +1,130 @@
+package ml.docilealligator.infinityforreddit.Adapter;
+
+import android.content.res.ColorStateList;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.ReportReason;
+
+public class ReportReasonRecyclerViewAdapter extends RecyclerView.Adapter {
+
+ private ArrayList generalReasons;
+ private ArrayList rules;
+ private int primaryTextColor;
+ private int colorAccent;
+
+ public ReportReasonRecyclerViewAdapter(CustomThemeWrapper customThemeWrapper, ArrayList generalReasons) {
+ this.generalReasons = generalReasons;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ colorAccent = customThemeWrapper.getColorAccent();
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return new ReasonViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_report_reason, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof ReasonViewHolder) {
+ ReportReason reportReason;
+ if (position >= generalReasons.size()) {
+ reportReason = rules.get(holder.getAdapterPosition() - generalReasons.size());
+ } else {
+ reportReason = generalReasons.get(holder.getAdapterPosition());
+ }
+ ((ReasonViewHolder) holder).reasonTextView.setText(reportReason.getReportReason());
+ ((ReasonViewHolder) holder).checkBox.setChecked(reportReason.isSelected());
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return rules == null ? generalReasons.size() : rules.size() + generalReasons.size();
+ }
+
+ public void setRules(ArrayList reportReasons) {
+ this.rules = reportReasons;
+ notifyDataSetChanged();
+ }
+
+ public ReportReason getSelectedReason() {
+ for (ReportReason reportReason : rules) {
+ if (reportReason.isSelected()) {
+ return reportReason;
+ }
+ }
+
+ for (ReportReason reportReason : generalReasons) {
+ if (reportReason.isSelected()) {
+ return reportReason;
+ }
+ }
+
+ return null;
+ }
+
+ public ArrayList getGeneralReasons() {
+ return generalReasons;
+ }
+
+ public ArrayList getRules() {
+ return rules;
+ }
+
+ class ReasonViewHolder extends RecyclerView.ViewHolder {
+
+ @BindView(R.id.reason_text_view_item_report_reason)
+ TextView reasonTextView;
+ @BindView(R.id.check_box_item_report_reason)
+ CheckBox checkBox;
+
+ ReasonViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+
+ reasonTextView.setTextColor(primaryTextColor);
+ checkBox.setButtonTintList(ColorStateList.valueOf(colorAccent));
+
+ checkBox.setOnClickListener(view -> {
+ for (int i = 0; i < generalReasons.size(); i++) {
+ if (generalReasons.get(i).isSelected()) {
+ generalReasons.get(i).setSelected(false);
+ notifyItemChanged(i);
+
+ }
+ }
+
+ if (rules != null) {
+ for (int i = 0; i < rules.size(); i++) {
+ if (rules.get(i).isSelected()) {
+ rules.get(i).setSelected(false);
+ notifyItemChanged(i + generalReasons.size());
+ }
+ }
+ }
+
+ if (getAdapterPosition() >= generalReasons.size()) {
+ rules.get(getAdapterPosition() - generalReasons.size()).setSelected(checkBox.isChecked());
+ } else {
+ generalReasons.get(getAdapterPosition()).setSelected(checkBox.isChecked());
+ }
+ });
+
+ itemView.setOnClickListener(view -> checkBox.performClick());
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
index d8dcc56e..351ab8f8 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
@@ -21,6 +21,7 @@ import ml.docilealligator.infinityforreddit.Activity.PostImageActivity;
import ml.docilealligator.infinityforreddit.Activity.PostLinkActivity;
import ml.docilealligator.infinityforreddit.Activity.PostTextActivity;
import ml.docilealligator.infinityforreddit.Activity.PostVideoActivity;
+import ml.docilealligator.infinityforreddit.Activity.ReportActivity;
import ml.docilealligator.infinityforreddit.Activity.RulesActivity;
import ml.docilealligator.infinityforreddit.Activity.SearchActivity;
import ml.docilealligator.infinityforreddit.Activity.SearchResultActivity;
@@ -161,4 +162,6 @@ public interface AppComponent {
void inject(EditMultiRedditActivity editMultiRedditActivity);
void inject(SelectedSubredditsActivity selectedSubredditsActivity);
+
+ void inject(ReportActivity reportActivity);
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java
index fe483c3c..a15c01ab 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java
@@ -6,6 +6,11 @@ import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
+import com.google.android.exoplayer2.database.ExoDatabaseProvider;
+import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor;
+import com.google.android.exoplayer2.upstream.cache.SimpleCache;
+
+import java.io.File;
import java.util.concurrent.TimeUnit;
import javax.inject.Named;
@@ -13,6 +18,10 @@ import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
+import im.ene.toro.exoplayer.Config;
+import im.ene.toro.exoplayer.ExoCreator;
+import im.ene.toro.exoplayer.MediaSourceBuilder;
+import im.ene.toro.exoplayer.ToroExo;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.Utils.CustomThemeSharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
@@ -147,4 +156,14 @@ class AppModule {
@Named("amoled_theme") SharedPreferences amoledThemeSharedPreferences) {
return new CustomThemeWrapper(lightThemeSharedPreferences, darkThemeSharedPreferences, amoledThemeSharedPreferences);
}
+
+ @Provides
+ @Singleton
+ ExoCreator provideExoCreator() {
+ SimpleCache cache = new SimpleCache(new File(mApplication.getCacheDir(), "/toro_cache"),
+ new LeastRecentlyUsedCacheEvictor(200 * 1024 * 1024), new ExoDatabaseProvider(mApplication));
+ Config config = new Config.Builder(mApplication).setMediaSourceBuilder(MediaSourceBuilder.LOOPING).setCache(cache)
+ .build();
+ return ToroExo.with(mApplication).getCreator(config);
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/BroadcastReceiver/NetworkWifiStatusReceiver.java b/app/src/main/java/ml/docilealligator/infinityforreddit/BroadcastReceiver/NetworkWifiStatusReceiver.java
new file mode 100644
index 00000000..fb8d3ae4
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/BroadcastReceiver/NetworkWifiStatusReceiver.java
@@ -0,0 +1,22 @@
+package ml.docilealligator.infinityforreddit.BroadcastReceiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class NetworkWifiStatusReceiver extends BroadcastReceiver {
+ private NetworkWifiStatusReceiverListener networkWifiStatusReceiverListener;
+
+ public interface NetworkWifiStatusReceiverListener {
+ void networkStatusChange();
+ }
+
+ public NetworkWifiStatusReceiver(NetworkWifiStatusReceiverListener listener) {
+ networkWifiStatusReceiverListener = listener;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ networkWifiStatusReceiverListener.networkStatusChange();
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomTheme.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomTheme.java
index 1c105ad3..7fbd3359 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomTheme.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomTheme.java
@@ -51,6 +51,8 @@ public class CustomTheme {
public int bottomAppBarBackgroundColor;
@ColumnInfo(name = "primary_icon_color")
public int primaryIconColor;
+ @ColumnInfo(name = "bottom_app_bar_icon_color")
+ public int bottomAppBarIconColor;
@ColumnInfo(name = "post_icon_and_info_color")
public int postIconAndInfoColor;
@ColumnInfo(name = "comment_icon_and_info_color")
@@ -193,57 +195,58 @@ public class CustomTheme {
customTheme.commentBackgroundColor = customThemeSettingsItems.get(16).colorValue;
customTheme.bottomAppBarBackgroundColor = customThemeSettingsItems.get(17).colorValue;
customTheme.primaryIconColor = customThemeSettingsItems.get(18).colorValue;
- customTheme.postIconAndInfoColor = customThemeSettingsItems.get(19).colorValue;
- customTheme.commentIconAndInfoColor = customThemeSettingsItems.get(20).colorValue;
- customTheme.fabIconColor = customThemeSettingsItems.get(21).colorValue;
- customTheme.toolbarPrimaryTextAndIconColor = customThemeSettingsItems.get(22).colorValue;
- customTheme.toolbarSecondaryTextColor = customThemeSettingsItems.get(23).colorValue;
- customTheme.circularProgressBarBackground = customThemeSettingsItems.get(24).colorValue;
- customTheme.tabLayoutWithExpandedCollapsingToolbarTabBackground = customThemeSettingsItems.get(25).colorValue;
- customTheme.tabLayoutWithExpandedCollapsingToolbarTextColor = customThemeSettingsItems.get(26).colorValue;
- customTheme.tabLayoutWithExpandedCollapsingToolbarTabIndicator = customThemeSettingsItems.get(27).colorValue;
- customTheme.tabLayoutWithCollapsedCollapsingToolbarTabBackground = customThemeSettingsItems.get(28).colorValue;
- customTheme.tabLayoutWithCollapsedCollapsingToolbarTextColor = customThemeSettingsItems.get(29).colorValue;
- customTheme.tabLayoutWithCollapsedCollapsingToolbarTabIndicator = customThemeSettingsItems.get(30).colorValue;
- customTheme.upvoted = customThemeSettingsItems.get(31).colorValue;
- customTheme.downvoted = customThemeSettingsItems.get(32).colorValue;
- customTheme.postTypeBackgroundColor = customThemeSettingsItems.get(33).colorValue;
- customTheme.postTypeTextColor = customThemeSettingsItems.get(34).colorValue;
- customTheme.spoilerBackgroundColor = customThemeSettingsItems.get(35).colorValue;
- customTheme.spoilerTextColor = customThemeSettingsItems.get(36).colorValue;
- customTheme.nsfwBackgroundColor = customThemeSettingsItems.get(37).colorValue;
- customTheme.nsfwTextColor = customThemeSettingsItems.get(38).colorValue;
- customTheme.flairBackgroundColor = customThemeSettingsItems.get(39).colorValue;
- customTheme.flairTextColor = customThemeSettingsItems.get(40).colorValue;
- customTheme.awardsBackgroundColor = customThemeSettingsItems.get(41).colorValue;
- customTheme.awardsTextColor = customThemeSettingsItems.get(42).colorValue;
- customTheme.archivedTint = customThemeSettingsItems.get(43).colorValue;
- customTheme.lockedIconTint = customThemeSettingsItems.get(44).colorValue;
- customTheme.crosspostIconTint = customThemeSettingsItems.get(45).colorValue;
- customTheme.stickiedPostIconTint = customThemeSettingsItems.get(46).colorValue;
- customTheme.subscribed = customThemeSettingsItems.get(47).colorValue;
- customTheme.unsubscribed = customThemeSettingsItems.get(48).colorValue;
- customTheme.username = customThemeSettingsItems.get(49).colorValue;
- customTheme.subreddit = customThemeSettingsItems.get(50).colorValue;
- customTheme.authorFlairTextColor = customThemeSettingsItems.get(51).colorValue;
- customTheme.submitter = customThemeSettingsItems.get(52).colorValue;
- customTheme.moderator = customThemeSettingsItems.get(53).colorValue;
- customTheme.singleCommentThreadBackgroundColor = customThemeSettingsItems.get(54).colorValue;
- customTheme.unreadMessageBackgroundColor = customThemeSettingsItems.get(55).colorValue;
- customTheme.dividerColor = customThemeSettingsItems.get(56).colorValue;
- customTheme.noPreviewLinkBackgroundColor = customThemeSettingsItems.get(57).colorValue;
- customTheme.voteAndReplyUnavailableButtonColor = customThemeSettingsItems.get(58).colorValue;
- customTheme.commentVerticalBarColor1 = customThemeSettingsItems.get(59).colorValue;
- customTheme.commentVerticalBarColor2 = customThemeSettingsItems.get(60).colorValue;
- customTheme.commentVerticalBarColor3 = customThemeSettingsItems.get(61).colorValue;
- customTheme.commentVerticalBarColor4 = customThemeSettingsItems.get(62).colorValue;
- customTheme.commentVerticalBarColor5 = customThemeSettingsItems.get(63).colorValue;
- customTheme.commentVerticalBarColor6 = customThemeSettingsItems.get(64).colorValue;
- customTheme.commentVerticalBarColor7 = customThemeSettingsItems.get(65).colorValue;
- customTheme.navBarColor = customThemeSettingsItems.get(66).colorValue;
- customTheme.isLightStatusBar = customThemeSettingsItems.get(67).isEnabled;
- customTheme.isLightNavBar = customThemeSettingsItems.get(68).isEnabled;
- customTheme.isChangeStatusBarIconColorAfterToolbarCollapsedInImmersiveInterface = customThemeSettingsItems.get(69).isEnabled;
+ customTheme.bottomAppBarIconColor = customThemeSettingsItems.get(19).colorValue;
+ customTheme.postIconAndInfoColor = customThemeSettingsItems.get(20).colorValue;
+ customTheme.commentIconAndInfoColor = customThemeSettingsItems.get(21).colorValue;
+ customTheme.fabIconColor = customThemeSettingsItems.get(22).colorValue;
+ customTheme.toolbarPrimaryTextAndIconColor = customThemeSettingsItems.get(23).colorValue;
+ customTheme.toolbarSecondaryTextColor = customThemeSettingsItems.get(24).colorValue;
+ customTheme.circularProgressBarBackground = customThemeSettingsItems.get(25).colorValue;
+ customTheme.tabLayoutWithExpandedCollapsingToolbarTabBackground = customThemeSettingsItems.get(26).colorValue;
+ customTheme.tabLayoutWithExpandedCollapsingToolbarTextColor = customThemeSettingsItems.get(27).colorValue;
+ customTheme.tabLayoutWithExpandedCollapsingToolbarTabIndicator = customThemeSettingsItems.get(28).colorValue;
+ customTheme.tabLayoutWithCollapsedCollapsingToolbarTabBackground = customThemeSettingsItems.get(29).colorValue;
+ customTheme.tabLayoutWithCollapsedCollapsingToolbarTextColor = customThemeSettingsItems.get(30).colorValue;
+ customTheme.tabLayoutWithCollapsedCollapsingToolbarTabIndicator = customThemeSettingsItems.get(31).colorValue;
+ customTheme.upvoted = customThemeSettingsItems.get(32).colorValue;
+ customTheme.downvoted = customThemeSettingsItems.get(33).colorValue;
+ customTheme.postTypeBackgroundColor = customThemeSettingsItems.get(34).colorValue;
+ customTheme.postTypeTextColor = customThemeSettingsItems.get(35).colorValue;
+ customTheme.spoilerBackgroundColor = customThemeSettingsItems.get(36).colorValue;
+ customTheme.spoilerTextColor = customThemeSettingsItems.get(37).colorValue;
+ customTheme.nsfwBackgroundColor = customThemeSettingsItems.get(38).colorValue;
+ customTheme.nsfwTextColor = customThemeSettingsItems.get(39).colorValue;
+ customTheme.flairBackgroundColor = customThemeSettingsItems.get(40).colorValue;
+ customTheme.flairTextColor = customThemeSettingsItems.get(41).colorValue;
+ customTheme.awardsBackgroundColor = customThemeSettingsItems.get(42).colorValue;
+ customTheme.awardsTextColor = customThemeSettingsItems.get(43).colorValue;
+ customTheme.archivedTint = customThemeSettingsItems.get(44).colorValue;
+ customTheme.lockedIconTint = customThemeSettingsItems.get(45).colorValue;
+ customTheme.crosspostIconTint = customThemeSettingsItems.get(46).colorValue;
+ customTheme.stickiedPostIconTint = customThemeSettingsItems.get(47).colorValue;
+ customTheme.subscribed = customThemeSettingsItems.get(48).colorValue;
+ customTheme.unsubscribed = customThemeSettingsItems.get(49).colorValue;
+ customTheme.username = customThemeSettingsItems.get(50).colorValue;
+ customTheme.subreddit = customThemeSettingsItems.get(51).colorValue;
+ customTheme.authorFlairTextColor = customThemeSettingsItems.get(52).colorValue;
+ customTheme.submitter = customThemeSettingsItems.get(53).colorValue;
+ customTheme.moderator = customThemeSettingsItems.get(54).colorValue;
+ customTheme.singleCommentThreadBackgroundColor = customThemeSettingsItems.get(55).colorValue;
+ customTheme.unreadMessageBackgroundColor = customThemeSettingsItems.get(56).colorValue;
+ customTheme.dividerColor = customThemeSettingsItems.get(57).colorValue;
+ customTheme.noPreviewLinkBackgroundColor = customThemeSettingsItems.get(58).colorValue;
+ customTheme.voteAndReplyUnavailableButtonColor = customThemeSettingsItems.get(59).colorValue;
+ customTheme.commentVerticalBarColor1 = customThemeSettingsItems.get(60).colorValue;
+ customTheme.commentVerticalBarColor2 = customThemeSettingsItems.get(61).colorValue;
+ customTheme.commentVerticalBarColor3 = customThemeSettingsItems.get(62).colorValue;
+ customTheme.commentVerticalBarColor4 = customThemeSettingsItems.get(63).colorValue;
+ customTheme.commentVerticalBarColor5 = customThemeSettingsItems.get(64).colorValue;
+ customTheme.commentVerticalBarColor6 = customThemeSettingsItems.get(65).colorValue;
+ customTheme.commentVerticalBarColor7 = customThemeSettingsItems.get(66).colorValue;
+ customTheme.navBarColor = customThemeSettingsItems.get(67).colorValue;
+ customTheme.isLightStatusBar = customThemeSettingsItems.get(68).isEnabled;
+ customTheme.isLightNavBar = customThemeSettingsItems.get(69).isEnabled;
+ customTheme.isChangeStatusBarIconColorAfterToolbarCollapsedInImmersiveInterface = customThemeSettingsItems.get(70).isEnabled;
return customTheme;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeSettingsItem.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeSettingsItem.java
index 531f6e8d..b32fcf1a 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeSettingsItem.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeSettingsItem.java
@@ -130,6 +130,10 @@ public class CustomThemeSettingsItem implements Parcelable {
context.getString(R.string.theme_item_primary_icon_color),
context.getString(R.string.theme_item_primary_icon_color_detail),
customTheme.primaryIconColor));
+ customThemeSettingsItems.add(new CustomThemeSettingsItem(
+ context.getString(R.string.theme_item_bottom_app_bar_icon_color),
+ context.getString(R.string.theme_item_bottom_app_bar_icon_color_detail),
+ customTheme.bottomAppBarIconColor));
customThemeSettingsItems.add(new CustomThemeSettingsItem(
context.getString(R.string.theme_item_post_icon_and_info_color),
context.getString(R.string.theme_item_post_icon_and_info_color_detail),
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeWrapper.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeWrapper.java
index ff30966d..aef072c9 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeWrapper.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomTheme/CustomThemeWrapper.java
@@ -127,6 +127,11 @@ public class CustomThemeWrapper {
getDefaultColor("#000000", "#FFFFFF", "#FFFFFF"));
}
+ public int getBottomAppBarIconColor() {
+ return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.BOTTOM_APP_BAR_ICON_COLOR,
+ getDefaultColor("#000000", "#FFFFFF", "#FFFFFF"));
+ }
+
public int getPostIconAndInfoColor() {
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.POST_ICON_AND_INFO_COLOR,
getDefaultColor("#8A000000", "#B3FFFFFF", "#B3FFFFFF"));
@@ -449,6 +454,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#FFFFFF");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#FFFFFF");
customTheme.primaryIconColor = Color.parseColor("#000000");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#000000");
customTheme.postIconAndInfoColor = Color.parseColor("#8A000000");
customTheme.commentIconAndInfoColor = Color.parseColor("#8A000000");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -525,6 +531,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#242424");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#121212");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -601,6 +608,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#000000");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#000000");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -677,6 +685,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#FFFFFF");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#FFFFFF");
customTheme.primaryIconColor = Color.parseColor("#000000");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#000000");
customTheme.postIconAndInfoColor = Color.parseColor("#3C4043");
customTheme.commentIconAndInfoColor = Color.parseColor("#3C4043");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#3C4043");
@@ -753,6 +762,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#242424");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#121212");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -829,6 +839,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#000000");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#000000");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -905,6 +916,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#FFFFFF");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#FFFFFF");
customTheme.primaryIconColor = Color.parseColor("#000000");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#000000");
customTheme.postIconAndInfoColor = Color.parseColor("#8A000000");
customTheme.commentIconAndInfoColor = Color.parseColor("#8A000000");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -981,6 +993,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#242424");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#121212");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -1057,6 +1070,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#000000");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#000000");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#B3FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -1133,6 +1147,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#393A59");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#393A59");
customTheme.primaryIconColor = Color.parseColor("#FFFFFF");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#FFFFFF");
customTheme.postIconAndInfoColor = Color.parseColor("#FFFFFF");
customTheme.commentIconAndInfoColor = Color.parseColor("#FFFFFF");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#FFFFFF");
@@ -1209,6 +1224,7 @@ public class CustomThemeWrapper {
customTheme.commentBackgroundColor = Color.parseColor("#C0F0F4");
customTheme.bottomAppBarBackgroundColor = Color.parseColor("#D48AE0");
customTheme.primaryIconColor = Color.parseColor("#000000");
+ customTheme.bottomAppBarIconColor = Color.parseColor("#000000");
customTheme.postIconAndInfoColor = Color.parseColor("#000000");
customTheme.commentIconAndInfoColor = Color.parseColor("#000000");
customTheme.toolbarPrimaryTextAndIconColor = Color.parseColor("#3C4043");
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/CustomToroContainer.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/CustomToroContainer.java
new file mode 100644
index 00000000..40e3fe3e
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CustomView/CustomToroContainer.java
@@ -0,0 +1,27 @@
+package ml.docilealligator.infinityforreddit.CustomView;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.annotation.Nullable;
+
+import im.ene.toro.widget.Container;
+
+public class CustomToroContainer extends Container {
+ public CustomToroContainer(Context context) {
+ super(context);
+ }
+
+ public CustomToroContainer(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomToroContainer(Context context, @Nullable AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ public void onWindowVisibilityChanged(int visibility) {
+ super.onWindowVisibilityChanged(visibility);
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Event/ChangeVideoAutoplayEvent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Event/ChangeVideoAutoplayEvent.java
new file mode 100644
index 00000000..76e7a589
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Event/ChangeVideoAutoplayEvent.java
@@ -0,0 +1,9 @@
+package ml.docilealligator.infinityforreddit.Event;
+
+public class ChangeVideoAutoplayEvent {
+ public String autoplay;
+
+ public ChangeVideoAutoplayEvent(String autoplay) {
+ this.autoplay = autoplay;
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Event/ChangeWifiStatusEvent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Event/ChangeWifiStatusEvent.java
new file mode 100644
index 00000000..2c25b8c9
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Event/ChangeWifiStatusEvent.java
@@ -0,0 +1,8 @@
+package ml.docilealligator.infinityforreddit.Event;
+
+public class ChangeWifiStatusEvent {
+ public boolean isConnectedToWifi;
+ public ChangeWifiStatusEvent(boolean isConnectedToWifi) {
+ this.isConnectedToWifi = isConnectedToWifi;
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchRules.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchRules.java
new file mode 100644
index 00000000..604fe82f
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchRules.java
@@ -0,0 +1,101 @@
+package ml.docilealligator.infinityforreddit;
+
+import android.os.AsyncTask;
+
+import androidx.annotation.NonNull;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+
+import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
+import ml.docilealligator.infinityforreddit.Utils.Utils;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+
+public class FetchRules {
+ public interface FetchRulesListener {
+ void success(ArrayList rules);
+ void failed();
+ }
+
+ public static void fetchRules(Retrofit retrofit, String subredditName, FetchRulesListener fetchRulesListener) {
+
+ RedditAPI api = retrofit.create(RedditAPI.class);
+ Call rulesCall = api.getRules(subredditName);
+ rulesCall.enqueue(new Callback() {
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+ if (response.isSuccessful()) {
+ new ParseRulesAsyncTask(response.body(), new ParseRulesAsyncTask.ParseRulesAsyncTaskListener() {
+ @Override
+ public void parseSuccessful(ArrayList rules) {
+ fetchRulesListener.success(rules);
+ }
+
+ @Override
+ public void parseFailed() {
+ fetchRulesListener.failed();
+ }
+ }).execute();
+ } else {
+ fetchRulesListener.failed();
+ }
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+ fetchRulesListener.failed();
+ }
+ });
+ }
+
+ private static class ParseRulesAsyncTask extends AsyncTask, ArrayList> {
+ private String response;
+ private ParseRulesAsyncTask.ParseRulesAsyncTaskListener parseRulesAsyncTaskListener;
+
+ ParseRulesAsyncTask(String response, ParseRulesAsyncTask.ParseRulesAsyncTaskListener parseRulesAsyncTaskListener) {
+ this.response = response;
+ this.parseRulesAsyncTaskListener = parseRulesAsyncTaskListener;
+ }
+
+ @Override
+ protected ArrayList doInBackground(Void... voids) {
+ try {
+ JSONArray rulesArray = new JSONObject(response).getJSONArray(JSONUtils.RULES_KEY);
+ ArrayList rules = new ArrayList<>();
+ for (int i = 0; i < rulesArray.length(); i++) {
+ String shortName = rulesArray.getJSONObject(i).getString(JSONUtils.SHORT_NAME_KEY);
+ String description = null;
+ if (rulesArray.getJSONObject(i).has(JSONUtils.DESCRIPTION_KEY)) {
+ description = Utils.modifyMarkdown(rulesArray.getJSONObject(i).getString(JSONUtils.DESCRIPTION_KEY));
+ }
+ rules.add(new Rule(shortName, description));
+ }
+ return rules;
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(ArrayList rules) {
+ if (rules != null) {
+ parseRulesAsyncTaskListener.parseSuccessful(rules);
+ } else {
+ parseRulesAsyncTaskListener.parseFailed();
+ }
+ }
+
+ interface ParseRulesAsyncTaskListener {
+ void parseSuccessful(ArrayList rules);
+
+ void parseFailed();
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/CommentMoreBottomSheetFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/CommentMoreBottomSheetFragment.java
index d339b5f6..fd97f1d4 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/CommentMoreBottomSheetFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/CommentMoreBottomSheetFragment.java
@@ -22,6 +22,7 @@ import com.deishelon.roundedbottomsheet.RoundedBottomSheetDialogFragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.Activity.EditCommentActivity;
+import ml.docilealligator.infinityforreddit.Activity.ReportActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity;
import ml.docilealligator.infinityforreddit.CommentData;
@@ -44,6 +45,8 @@ public class CommentMoreBottomSheetFragment extends RoundedBottomSheetDialogFrag
TextView shareTextView;
@BindView(R.id.copy_text_view_comment_more_bottom_sheet_fragment)
TextView copyTextView;
+ @BindView(R.id.report_view_comment_more_bottom_sheet_fragment)
+ TextView reportTextView;
private AppCompatActivity activity;
public CommentMoreBottomSheetFragment() {
// Required empty public constructor
@@ -119,6 +122,15 @@ public class CommentMoreBottomSheetFragment extends RoundedBottomSheetDialogFrag
copyTextBottomSheetFragment.show(activity.getSupportFragmentManager(), copyTextBottomSheetFragment.getTag());
});
+ reportTextView.setOnClickListener(view -> {
+ Intent intent = new Intent(activity, ReportActivity.class);
+ intent.putExtra(ReportActivity.EXTRA_SUBREDDIT_NAME, commentData.getSubredditName());
+ intent.putExtra(ReportActivity.EXTRA_THING_FULLNAME, commentData.getFullName());
+ activity.startActivity(intent);
+
+ dismiss();
+ });
+
return rootView;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/PostFragment.java
index 07ef965a..9d058e3b 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/PostFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/PostFragment.java
@@ -46,19 +46,26 @@ import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
+import im.ene.toro.exoplayer.ExoCreator;
+import im.ene.toro.media.PlaybackInfo;
+import im.ene.toro.media.VolumeInfo;
+import im.ene.toro.widget.Container;
import ml.docilealligator.infinityforreddit.Activity.BaseActivity;
import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity;
import ml.docilealligator.infinityforreddit.Activity.MainActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity;
import ml.docilealligator.infinityforreddit.Adapter.PostRecyclerViewAdapter;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.CustomView.CustomToroContainer;
import ml.docilealligator.infinityforreddit.Event.ChangeDefaultPostLayoutEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeNSFWBlurEvent;
import ml.docilealligator.infinityforreddit.Event.ChangePostLayoutEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeShowAbsoluteNumberOfVotesEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeShowElapsedTimeEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeSpoilerBlurEvent;
+import ml.docilealligator.infinityforreddit.Event.ChangeVideoAutoplayEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeVoteButtonsPositionEvent;
+import ml.docilealligator.infinityforreddit.Event.ChangeWifiStatusEvent;
import ml.docilealligator.infinityforreddit.Event.PostUpdateEventToPostList;
import ml.docilealligator.infinityforreddit.Event.ShowDividerInCompactLayoutPreferenceEvent;
import ml.docilealligator.infinityforreddit.FragmentCommunicator;
@@ -71,8 +78,12 @@ import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.SortType;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
+import ml.docilealligator.infinityforreddit.Utils.Utils;
import retrofit2.Retrofit;
+import static im.ene.toro.media.PlaybackInfo.INDEX_UNSET;
+import static im.ene.toro.media.PlaybackInfo.TIME_UNSET;
+
/**
* A simple {@link Fragment} subclass.
@@ -94,7 +105,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
@BindView(R.id.swipe_refresh_layout_post_fragment)
SwipeRefreshLayout mSwipeRefreshLayout;
@BindView(R.id.recycler_view_post_fragment)
- RecyclerView mPostRecyclerView;
+ CustomToroContainer mPostRecyclerView;
@BindView(R.id.fetch_post_info_linear_layout_post_fragment)
LinearLayout mFetchPostInfoLinearLayout;
@BindView(R.id.fetch_post_info_image_view_post_fragment)
@@ -121,6 +132,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
SharedPreferences mPostLayoutSharedPreferences;
@Inject
CustomThemeWrapper customThemeWrapper;
+ @Inject
+ ExoCreator exoCreator;
private RequestManager mGlide;
private AppCompatActivity activity;
private LinearLayoutManager mLinearLayoutManager;
@@ -151,6 +164,9 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (isInLazyMode && isLazyModePaused) {
resumeLazyMode(false);
}
+ if (mAdapter != null && mPostRecyclerView != null) {
+ mPostRecyclerView.onWindowVisibilityChanged(View.VISIBLE);
+ }
}
private boolean scrollPostsByCount(int count) {
@@ -323,12 +339,6 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
int filter = getArguments().getInt(EXTRA_FILTER);
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
boolean nsfw = mSharedPreferences.getBoolean(SharedPreferencesUtils.NSFW_KEY, false);
- boolean needBlurNsfw = mSharedPreferences.getBoolean(SharedPreferencesUtils.BLUR_NSFW_KEY, true);
- boolean needBlurSpoiler = mSharedPreferences.getBoolean(SharedPreferencesUtils.BLUR_SPOILER_KEY, false);
- boolean voteButtonsOnTheRight = mSharedPreferences.getBoolean(SharedPreferencesUtils.VOTE_BUTTONS_ON_THE_RIGHT_KEY, false);
- boolean showElapsedTime = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ELAPSED_TIME_KEY, false);
- boolean showDividerInCompactLayout = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_DIVIDER_IN_COMPACT_LAYOUT, true);
- boolean showAbsoluteNumberOfVotes = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ABSOLUTE_NUMBER_OF_VOTES, true);
int defaultPostLayout = Integer.parseInt(mSharedPreferences.getString(SharedPreferencesUtils.DEFAULT_POST_LAYOUT_KEY, "0"));
if (postType == PostDataSource.TYPE_SEARCH) {
@@ -342,9 +352,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
customThemeWrapper, accessToken, postType, postLayout, true,
- needBlurNsfw, needBlurSpoiler, voteButtonsOnTheRight, showElapsedTime,
- showDividerInCompactLayout, showAbsoluteNumberOfVotes,
- new PostRecyclerViewAdapter.Callback() {
+ mSharedPreferences, exoCreator, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
mPostViewModel.retryLoadingMore();
@@ -407,9 +415,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
customThemeWrapper, accessToken, postType, postLayout, displaySubredditName,
- needBlurNsfw, needBlurSpoiler, voteButtonsOnTheRight, showElapsedTime,
- showDividerInCompactLayout, showAbsoluteNumberOfVotes,
- new PostRecyclerViewAdapter.Callback() {
+ mSharedPreferences, exoCreator, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
mPostViewModel.retryLoadingMore();
@@ -457,9 +463,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
customThemeWrapper, accessToken, postType, postLayout, true,
- needBlurNsfw, needBlurSpoiler, voteButtonsOnTheRight, showElapsedTime,
- showDividerInCompactLayout, showAbsoluteNumberOfVotes,
- new PostRecyclerViewAdapter.Callback() {
+ mSharedPreferences, exoCreator, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
mPostViewModel.retryLoadingMore();
@@ -505,9 +509,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
customThemeWrapper, accessToken, postType, postLayout, true,
- needBlurNsfw, needBlurSpoiler, voteButtonsOnTheRight, showElapsedTime,
- showDividerInCompactLayout, showAbsoluteNumberOfVotes,
- new PostRecyclerViewAdapter.Callback() {
+ mSharedPreferences, exoCreator, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
mPostViewModel.retryLoadingMore();
@@ -546,9 +548,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
customThemeWrapper, accessToken, postType, postLayout, true,
- needBlurNsfw, needBlurSpoiler, voteButtonsOnTheRight, showElapsedTime,
- showDividerInCompactLayout, showAbsoluteNumberOfVotes,
- new PostRecyclerViewAdapter.Callback() {
+ mSharedPreferences, exoCreator, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
mPostViewModel.retryLoadingMore();
@@ -569,6 +569,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
mPostRecyclerView.setAdapter(mAdapter);
+ mPostRecyclerView.setCacheManager(mAdapter);
+ mPostRecyclerView.setPlayerInitializer(order -> {
+ VolumeInfo volumeInfo = new VolumeInfo(true, 0f);
+ return new PlaybackInfo(INDEX_UNSET, TIME_UNSET, volumeInfo);
+ });
+
mPostViewModel.getPosts().observe(this, posts -> mAdapter.submitList(posts));
mPostViewModel.hasPost().observe(this, hasPost -> {
@@ -846,6 +852,31 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
}
+ @Subscribe
+ public void onChangeVideoAutoplayEvent(ChangeVideoAutoplayEvent changeVideoAutoplayEvent) {
+ if (mAdapter != null) {
+ boolean autoplay = false;
+ if (changeVideoAutoplayEvent.autoplay.equals(SharedPreferencesUtils.VIDEO_AUTOPLAY_VALUE_ALWAYS_ON)) {
+ autoplay = true;
+ } else if (changeVideoAutoplayEvent.autoplay.equals(SharedPreferencesUtils.VIDEO_AUTOPLAY_VALUE_ON_WIFI)) {
+ autoplay = Utils.isConnectedToWifi(activity);
+ }
+ mAdapter.setAutoplay(autoplay);
+ refreshAdapter();
+ }
+ }
+
+ @Subscribe
+ public void onChangeWifiStatusEvent(ChangeWifiStatusEvent changeWifiStatusEvent) {
+ if (mAdapter != null) {
+ String autoplay = mSharedPreferences.getString(SharedPreferencesUtils.VIDEO_AUTOPLAY, SharedPreferencesUtils.VIDEO_AUTOPLAY_VALUE_NEVER);
+ if (autoplay.equals(SharedPreferencesUtils.VIDEO_AUTOPLAY_VALUE_ON_WIFI)) {
+ mAdapter.setAutoplay(changeWifiStatusEvent.isConnectedToWifi);
+ refreshAdapter();
+ }
+ }
+ }
+
private void refreshAdapter() {
int previousPosition = -1;
if (mLinearLayoutManager != null) {
@@ -872,6 +903,9 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (isInLazyMode) {
pauseLazyMode(false);
}
+ if (mAdapter != null && mPostRecyclerView != null) {
+ mPostRecyclerView.onWindowVisibilityChanged(View.GONE);
+ }
}
@Override
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java
index df5a1100..90478a08 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java
@@ -1,6 +1,8 @@
package ml.docilealligator.infinityforreddit;
import android.app.Application;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
@@ -10,8 +12,15 @@ import com.evernote.android.state.StateSaver;
import com.livefront.bridge.Bridge;
import com.livefront.bridge.SavedStateHandler;
+import org.greenrobot.eventbus.EventBus;
+
+import ml.docilealligator.infinityforreddit.BroadcastReceiver.NetworkWifiStatusReceiver;
+import ml.docilealligator.infinityforreddit.Event.ChangeWifiStatusEvent;
+import ml.docilealligator.infinityforreddit.Utils.Utils;
+
public class Infinity extends Application {
private AppComponent mAppComponent;
+ private NetworkWifiStatusReceiver mNetworkWifiStatusReceiver;
@Override
public void onCreate() {
@@ -32,6 +41,10 @@ public class Infinity extends Application {
StateSaver.restoreInstanceState(target, state);
}
});
+
+ mNetworkWifiStatusReceiver =
+ new NetworkWifiStatusReceiver(() -> EventBus.getDefault().post(new ChangeWifiStatusEvent(Utils.isConnectedToWifi(getApplicationContext()))));
+ registerReceiver(mNetworkWifiStatusReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
public AppComponent getAppComponent() {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java
index bb64d7df..73854808 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java
@@ -25,6 +25,7 @@ class ParseSubredditData {
String subredditFullName = subredditDataJsonObject.getString(JSONUtils.DISPLAY_NAME_KEY);
String description = subredditDataJsonObject.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
String sidebarDescription = subredditDataJsonObject.getString(JSONUtils.DESCRIPTION_KEY).trim();
+ long createdUTC = subredditDataJsonObject.getLong(JSONUtils.CREATED_UTC_KEY) * 1000;
String bannerImageUrl;
if (subredditDataJsonObject.isNull(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY)) {
@@ -52,7 +53,7 @@ class ParseSubredditData {
}
return new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description,
- sidebarDescription, nSubscribers);
+ sidebarDescription, nSubscribers, createdUTC);
}
interface ParseSubredditDataListener {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java
index 97827fc2..97da7db6 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java
@@ -99,9 +99,10 @@ class ParseSubscribedThing {
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
String sidebarDescription = data.getString(JSONUtils.DESCRIPTION_KEY);
int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY);
+ long createdUTC = data.getLong(JSONUtils.CREATED_UTC_KEY);
newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl, accountName, isFavorite));
newSubredditData.add(new SubredditData(id, subredditFullName, iconUrl,
- bannerImageUrl, description, sidebarDescription, nSubscribers));
+ bannerImageUrl, description, sidebarDescription, nSubscribers, createdUTC));
}
}
lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java
index 73932c34..f3766d05 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java
@@ -38,11 +38,13 @@ public class ParseUserData {
}
int linkKarma = userDataJson.getInt(JSONUtils.LINK_KARMA_KEY);
int commentKarma = userDataJson.getInt(JSONUtils.COMMENT_KARMA_KEY);
- int karma = linkKarma + commentKarma;
+ long cakeday = userDataJson.getLong(JSONUtils.CREATED_UTC_KEY) * 1000;
boolean isGold = userDataJson.getBoolean(JSONUtils.IS_GOLD_KEY);
boolean isFriend = userDataJson.getBoolean(JSONUtils.IS_FRIEND_KEY);
+ String description = userDataJson.getJSONObject(JSONUtils.SUBREDDIT_KEY).getString(JSONUtils.PUBLIC_DESCRIPTION_KEY);
- return new UserData(userName, iconImageUrl, bannerImageUrl, karma, isGold, isFriend, canBeFollowed);
+ return new UserData(userName, iconImageUrl, bannerImageUrl, linkKarma, commentKarma, cakeday,
+ isGold, isFriend, canBeFollowed, description);
}
interface ParseUserDataListener {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchPost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/FetchPost.java
similarity index 94%
rename from app/src/main/java/ml/docilealligator/infinityforreddit/FetchPost.java
rename to app/src/main/java/ml/docilealligator/infinityforreddit/Post/FetchPost.java
index 9f0c93ba..ccbec648 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchPost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/FetchPost.java
@@ -1,10 +1,10 @@
-package ml.docilealligator.infinityforreddit;
+package ml.docilealligator.infinityforreddit.Post;
import androidx.annotation.NonNull;
import java.util.Locale;
-import ml.docilealligator.infinityforreddit.Post.Post;
+import ml.docilealligator.infinityforreddit.RedditAPI;
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
import retrofit2.Call;
import retrofit2.Callback;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/HidePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/HidePost.java
similarity index 95%
rename from app/src/main/java/ml/docilealligator/infinityforreddit/HidePost.java
rename to app/src/main/java/ml/docilealligator/infinityforreddit/Post/HidePost.java
index 39f6a2fb..ab031fa5 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/HidePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/HidePost.java
@@ -1,10 +1,11 @@
-package ml.docilealligator.infinityforreddit;
+package ml.docilealligator.infinityforreddit.Post;
import androidx.annotation.NonNull;
import java.util.HashMap;
import java.util.Map;
+import ml.docilealligator.infinityforreddit.RedditAPI;
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
import retrofit2.Call;
import retrofit2.Callback;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/ParsePost.java
similarity index 98%
rename from app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
rename to app/src/main/java/ml/docilealligator/infinityforreddit/Post/ParsePost.java
index 3a4845e1..ba59f855 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/ParsePost.java
@@ -1,4 +1,4 @@
-package ml.docilealligator.infinityforreddit;
+package ml.docilealligator.infinityforreddit.Post;
import android.os.AsyncTask;
import android.text.Html;
@@ -8,12 +8,11 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
import java.util.Calendar;
+import java.util.LinkedHashSet;
import java.util.Locale;
import ml.docilealligator.infinityforreddit.Fragment.PostFragment;
-import ml.docilealligator.infinityforreddit.Post.Post;
import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
import ml.docilealligator.infinityforreddit.Utils.Utils;
@@ -357,7 +356,7 @@ public class ParsePost {
}
public interface ParsePostsListingListener {
- void onParsePostsListingSuccess(ArrayList newPostData, String lastItem);
+ void onParsePostsListingSuccess(LinkedHashSet newPostData, String lastItem);
void onParsePostsListingFail();
}
@@ -376,7 +375,7 @@ public class ParsePost {
private boolean nsfw;
private ParsePostsListingListener parsePostsListingListener;
private ParsePostListener parsePostListener;
- private ArrayList newPosts;
+ private LinkedHashSet newPosts;
private Post post;
private String lastItem;
private boolean parseFailed;
@@ -392,7 +391,7 @@ public class ParsePost {
this.nPosts = nPosts;
this.filter = filter;
this.nsfw = nsfw;
- newPosts = new ArrayList<>();
+ newPosts = new LinkedHashSet<>();
parseFailed = false;
} catch (JSONException e) {
e.printStackTrace();
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java
index d8b98ad8..b5aa1f1c 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java
@@ -3,6 +3,8 @@ package ml.docilealligator.infinityforreddit.Post;
import android.os.Parcel;
import android.os.Parcelable;
+import androidx.annotation.Nullable;
+
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
/**
@@ -506,4 +508,12 @@ public class Post implements Parcelable {
parcel.writeByte((byte) (isCrosspost ? 1 : 0));
parcel.writeString(crosspostParentId);
}
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (!(obj instanceof Post)) {
+ return false;
+ }
+ return ((Post) obj).id.equals(id);
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Post/PostDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/PostDataSource.java
index 19536c47..b26eef79 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Post/PostDataSource.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/PostDataSource.java
@@ -5,10 +5,11 @@ import androidx.lifecycle.MutableLiveData;
import androidx.paging.PageKeyedDataSource;
import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Locale;
import ml.docilealligator.infinityforreddit.NetworkState;
-import ml.docilealligator.infinityforreddit.ParsePost;
import ml.docilealligator.infinityforreddit.RedditAPI;
import ml.docilealligator.infinityforreddit.SortType;
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
@@ -42,6 +43,7 @@ public class PostDataSource extends PageKeyedDataSource {
private int filter;
private String userWhere;
private String multiRedditPath;
+ private LinkedHashSet postLinkedHashSet;
private MutableLiveData paginationNetworkStateLiveData;
private MutableLiveData initialLoadStateLiveData;
@@ -62,6 +64,7 @@ public class PostDataSource extends PageKeyedDataSource {
this.sortType = sortType == null ? new SortType(SortType.Type.BEST) : sortType;
this.filter = filter;
this.nsfw = nsfw;
+ postLinkedHashSet = new LinkedHashSet<>();
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String path, int postType,
@@ -97,6 +100,7 @@ public class PostDataSource extends PageKeyedDataSource {
}
this.filter = filter;
this.nsfw = nsfw;
+ postLinkedHashSet = new LinkedHashSet<>();
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
@@ -113,6 +117,7 @@ public class PostDataSource extends PageKeyedDataSource {
userWhere = where;
this.filter = filter;
this.nsfw = nsfw;
+ postLinkedHashSet = new LinkedHashSet<>();
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, String query,
@@ -129,6 +134,7 @@ public class PostDataSource extends PageKeyedDataSource {
this.sortType = sortType == null ? new SortType(SortType.Type.RELEVANCE) : sortType;
this.filter = filter;
this.nsfw = nsfw;
+ postLinkedHashSet = new LinkedHashSet<>();
}
MutableLiveData getPaginationNetworkStateLiveData() {
@@ -234,7 +240,7 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
String nextPageKey;
if (lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
@@ -243,13 +249,15 @@ public class PostDataSource extends PageKeyedDataSource {
}
if (newPosts.size() != 0) {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(true);
} else if (nextPageKey != null) {
loadBestPostsInitial(callback, nextPageKey);
return;
} else {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(false);
}
@@ -296,11 +304,18 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
if (newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
loadBestPostsAfter(params, callback, lastItem);
} else {
- callback.onResult(newPosts, lastItem);
+ int currentPostsSize = postLinkedHashSet.size();
+ postLinkedHashSet.addAll(newPosts);
+ if (currentPostsSize == postLinkedHashSet.size()) {
+ callback.onResult(new ArrayList<>(), lastItem);
+ } else {
+ List newPostsList = new ArrayList<>(postLinkedHashSet).subList(currentPostsSize, postLinkedHashSet.size());
+ callback.onResult(newPostsList, lastItem);
+ }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
}
@@ -366,7 +381,7 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
String nextPageKey;
if (lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
@@ -375,13 +390,15 @@ public class PostDataSource extends PageKeyedDataSource {
}
if (newPosts.size() != 0) {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(true);
} else if (nextPageKey != null) {
loadSubredditPostsInitial(callback, nextPageKey);
return;
} else {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(false);
}
@@ -439,11 +456,18 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
if (newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
loadSubredditPostsAfter(params, callback, lastItem);
} else {
- callback.onResult(newPosts, lastItem);
+ int currentPostsSize = postLinkedHashSet.size();
+ postLinkedHashSet.addAll(newPosts);
+ if (currentPostsSize == postLinkedHashSet.size()) {
+ callback.onResult(new ArrayList<>(), lastItem);
+ } else {
+ List newPostsList = new ArrayList<>(postLinkedHashSet).subList(currentPostsSize, postLinkedHashSet.size());
+ callback.onResult(newPostsList, lastItem);
+ }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
}
@@ -493,7 +517,7 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
String nextPageKey;
if (lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
@@ -502,13 +526,15 @@ public class PostDataSource extends PageKeyedDataSource {
}
if (newPosts.size() != 0) {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(true);
} else if (nextPageKey != null) {
loadUserPostsInitial(callback, nextPageKey);
return;
} else {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(false);
}
@@ -562,11 +588,18 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
if (newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
loadUserPostsAfter(params, callback, lastItem);
} else {
- callback.onResult(newPosts, lastItem);
+ int currentPostsSize = postLinkedHashSet.size();
+ postLinkedHashSet.addAll(newPosts);
+ if (currentPostsSize == postLinkedHashSet.size()) {
+ callback.onResult(new ArrayList<>(), lastItem);
+ } else {
+ List newPostsList = new ArrayList<>(postLinkedHashSet).subList(currentPostsSize, postLinkedHashSet.size());
+ callback.onResult(newPostsList, lastItem);
+ }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
}
@@ -638,7 +671,7 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
String nextPageKey;
if (lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
@@ -647,13 +680,15 @@ public class PostDataSource extends PageKeyedDataSource {
}
if (newPosts.size() != 0) {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(true);
} else if (nextPageKey != null) {
loadSearchPostsInitial(callback, nextPageKey);
return;
} else {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(false);
}
@@ -727,11 +762,18 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
if (newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
loadSearchPostsAfter(params, callback, lastItem);
} else {
- callback.onResult(newPosts, lastItem);
+ int currentPostsSize = postLinkedHashSet.size();
+ postLinkedHashSet.addAll(newPosts);
+ if (currentPostsSize == postLinkedHashSet.size()) {
+ callback.onResult(new ArrayList<>(), lastItem);
+ } else {
+ List newPostsList = new ArrayList<>(postLinkedHashSet).subList(currentPostsSize, postLinkedHashSet.size());
+ callback.onResult(newPostsList, lastItem);
+ }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
}
@@ -780,7 +822,7 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
String nextPageKey;
if (lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
@@ -789,13 +831,15 @@ public class PostDataSource extends PageKeyedDataSource {
}
if (newPosts.size() != 0) {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(true);
} else if (nextPageKey != null) {
loadMultiRedditPostsInitial(callback, nextPageKey);
return;
} else {
- callback.onResult(newPosts, null, nextPageKey);
+ postLinkedHashSet.addAll(newPosts);
+ callback.onResult(new ArrayList<>(newPosts), null, nextPageKey);
hasPostLiveData.postValue(false);
}
@@ -849,11 +893,18 @@ public class PostDataSource extends PageKeyedDataSource {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
- public void onParsePostsListingSuccess(ArrayList newPosts, String lastItem) {
+ public void onParsePostsListingSuccess(LinkedHashSet newPosts, String lastItem) {
if (newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
loadMultiRedditPostsAfter(params, callback, lastItem);
} else {
- callback.onResult(newPosts, lastItem);
+ int currentPostsSize = postLinkedHashSet.size();
+ postLinkedHashSet.addAll(newPosts);
+ if (currentPostsSize == postLinkedHashSet.size()) {
+ callback.onResult(new ArrayList<>(), lastItem);
+ } else {
+ List newPostsList = new ArrayList<>(postLinkedHashSet).subList(currentPostsSize, postLinkedHashSet.size());
+ callback.onResult(newPostsList, lastItem);
+ }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubmitPost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/SubmitPost.java
similarity index 99%
rename from app/src/main/java/ml/docilealligator/infinityforreddit/SubmitPost.java
rename to app/src/main/java/ml/docilealligator/infinityforreddit/Post/SubmitPost.java
index 6a93edf1..e7479e36 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubmitPost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/SubmitPost.java
@@ -1,4 +1,4 @@
-package ml.docilealligator.infinityforreddit;
+package ml.docilealligator.infinityforreddit.Post;
import android.graphics.Bitmap;
import android.os.AsyncTask;
@@ -20,7 +20,7 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
-import ml.docilealligator.infinityforreddit.Post.Post;
+import ml.docilealligator.infinityforreddit.RedditAPI;
import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
import okhttp3.MediaType;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java
index 371e31e9..113e1604 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java
@@ -304,4 +304,8 @@ public interface RedditAPI {
@GET("/api/multi/multipath/")
Call getMultiRedditInfo(@HeaderMap Map headers, @Query("multipath") String multipath);
+
+ @FormUrlEncoded
+ @POST("/api/report")
+ Call report(@HeaderMap Map headers, @FieldMap Map params);
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java
index 539bd20e..8743c4c9 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java
@@ -26,7 +26,7 @@ import ml.docilealligator.infinityforreddit.User.UserDao;
import ml.docilealligator.infinityforreddit.User.UserData;
@Database(entities = {Account.class, SubredditData.class, SubscribedSubredditData.class, UserData.class,
- SubscribedUserData.class, MultiReddit.class, CustomTheme.class}, version = 7)
+ SubscribedUserData.class, MultiReddit.class, CustomTheme.class}, version = 8)
public abstract class RedditDataRoomDatabase extends RoomDatabase {
private static RedditDataRoomDatabase INSTANCE;
@@ -37,7 +37,7 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RedditDataRoomDatabase.class, "reddit_data")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5,
- MIGRATION_5_6, MIGRATION_6_7)
+ MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8)
.build();
}
}
@@ -165,4 +165,25 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
database.execSQL("ALTER TABLE custom_themes ADD COLUMN awards_text_color INTEGER DEFAULT " + Color.parseColor("#FFFFFF") + " NOT NULL");
}
};
+
+ private static final Migration MIGRATION_7_8 = new Migration(7, 8) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ database.execSQL("CREATE TABLE users_temp " +
+ "(name TEXT NOT NULL PRIMARY KEY, icon TEXT, banner TEXT, " +
+ "link_karma INTEGER NOT NULL, comment_karma INTEGER DEFAULT 0 NOT NULL, created_utc INTEGER DEFAULT 0 NOT NULL," +
+ "is_gold INTEGER NOT NULL, is_friend INTEGER NOT NULL, can_be_followed INTEGER NOT NULL," +
+ "description TEXT)");
+ database.execSQL(
+ "INSERT INTO users_temp(name, icon, banner, link_karma, is_gold, is_friend, can_be_followed) SELECT * FROM users");
+ database.execSQL("DROP TABLE users");
+ database.execSQL("ALTER TABLE users_temp RENAME TO users");
+
+ database.execSQL("ALTER TABLE subreddits"
+ + " ADD COLUMN created_utc INTEGER DEFAULT 0 NOT NULL");
+
+ database.execSQL("ALTER TABLE custom_themes"
+ + " ADD COLUMN bottom_app_bar_icon_color INTEGER DEFAULT " + Color.parseColor("#000000") + " NOT NULL");
+ }
+ };
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ReportReason.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ReportReason.java
new file mode 100644
index 00000000..cedda1d8
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ReportReason.java
@@ -0,0 +1,90 @@
+package ml.docilealligator.infinityforreddit;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+
+public class ReportReason implements Parcelable {
+ public static final String REASON_TYPE_SITE_REASON = "site_reason";
+ public static final String REASON_TYPE_RULE_REASON = "rule_reason";
+ public static final String REASON_TYPE_OTHER_REASON = "other_reason";
+ public static final String REASON_SITE_REASON_SELECTED = "site_reason_selected";
+ public static final String REASON_RULE_REASON_SELECTED = "rule_reason_selected";
+ public static final String REASON_OTHER = "other";
+
+ private String reportReason;
+ private String reasonType;
+ private boolean isSelected;
+
+ public ReportReason(String reportReason, String reasonType) {
+ this.reportReason = reportReason;
+ this.reasonType = reasonType;
+ this.isSelected = false;
+ }
+
+ protected ReportReason(Parcel in) {
+ reportReason = in.readString();
+ reasonType = in.readString();
+ isSelected = in.readByte() != 0;
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public ReportReason createFromParcel(Parcel in) {
+ return new ReportReason(in);
+ }
+
+ @Override
+ public ReportReason[] newArray(int size) {
+ return new ReportReason[size];
+ }
+ };
+
+ public String getReportReason() {
+ return reportReason;
+ }
+
+ public String getReasonType() {
+ return reasonType;
+ }
+
+ public boolean isSelected() {
+ return isSelected;
+ }
+
+ public void setSelected(boolean selected) {
+ isSelected = selected;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int i) {
+ parcel.writeString(reportReason);
+ parcel.writeString(reasonType);
+ parcel.writeByte((byte) (isSelected ? 1 : 0));
+ }
+
+ public static ArrayList getGeneralReasons(Context context) {
+ ArrayList reportReasons = new ArrayList<>();
+ reportReasons.add(new ReportReason(context.getString(R.string.report_reason_general_spam), REASON_TYPE_SITE_REASON));
+ reportReasons.add(new ReportReason(context.getString(R.string.report_reason_general_copyright_issue), REASON_TYPE_SITE_REASON));
+ reportReasons.add(new ReportReason(context.getString(R.string.report_reason_general_child_pornography), REASON_TYPE_SITE_REASON));
+ reportReasons.add(new ReportReason(context.getString(R.string.report_reason_general_abusive_content), REASON_TYPE_SITE_REASON));
+ return reportReasons;
+ }
+
+ public static ArrayList convertRulesToReasons(ArrayList rules) {
+ ArrayList reportReasons = new ArrayList<>();
+ for (Rule r : rules) {
+ reportReasons.add(new ReportReason(r.getShortName(), REASON_TYPE_RULE_REASON));
+ }
+
+ return reportReasons;
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ReportThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ReportThing.java
new file mode 100644
index 00000000..8a617179
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ReportThing.java
@@ -0,0 +1,54 @@
+package ml.docilealligator.infinityforreddit;
+
+import androidx.annotation.NonNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import ml.docilealligator.infinityforreddit.Utils.RedditUtils;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+
+public class ReportThing {
+
+ public interface ReportThingListener {
+ void success();
+ void failed();
+ }
+
+ public static void reportThing(Retrofit oauthRetrofit, String accessToken, String thingFullname,
+ String subredditName, String reasonType, String reason,
+ ReportThingListener reportThingListener) {
+ Map header = RedditUtils.getOAuthHeader(accessToken);
+ Map params = new HashMap<>();
+ params.put(RedditUtils.THING_ID_KEY, thingFullname);
+ params.put(RedditUtils.SR_NAME_KEY, subredditName);
+ params.put(reasonType, reason);
+ if (reasonType.equals(ReportReason.REASON_TYPE_SITE_REASON)) {
+ params.put(RedditUtils.REASON_KEY, ReportReason.REASON_SITE_REASON_SELECTED);
+ } else if (reasonType.equals(ReportReason.REASON_TYPE_RULE_REASON)) {
+ params.put(RedditUtils.REASON_KEY, ReportReason.REASON_RULE_REASON_SELECTED);
+ } else {
+ params.put(RedditUtils.REASON_KEY, ReportReason.REASON_OTHER);
+ }
+ params.put(RedditUtils.API_TYPE_KEY, RedditUtils.API_TYPE_JSON);
+
+ oauthRetrofit.create(RedditAPI.class).report(header, params).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+ if (response.isSuccessful()) {
+ reportThingListener.success();
+ } else {
+ reportThingListener.failed();
+ }
+ }
+
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull Throwable t) {
+ reportThingListener.failed();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Service/SubmitPostService.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Service/SubmitPostService.java
index cfce40c8..cedf9730 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Service/SubmitPostService.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Service/SubmitPostService.java
@@ -39,7 +39,7 @@ import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.NotificationUtils;
import ml.docilealligator.infinityforreddit.Post.Post;
import ml.docilealligator.infinityforreddit.R;
-import ml.docilealligator.infinityforreddit.SubmitPost;
+import ml.docilealligator.infinityforreddit.Post.SubmitPost;
import retrofit2.Retrofit;
public class SubmitPostService extends Service {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Settings/MainPreferenceFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Settings/MainPreferenceFragment.java
index 1aea7212..f0b61023 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Settings/MainPreferenceFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Settings/MainPreferenceFragment.java
@@ -7,7 +7,7 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.annotation.NonNull;
-import androidx.preference.Preference;
+import androidx.preference.ListPreference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
@@ -19,6 +19,7 @@ import javax.inject.Named;
import ml.docilealligator.infinityforreddit.Event.ChangeNSFWBlurEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeNSFWEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeSpoilerBlurEvent;
+import ml.docilealligator.infinityforreddit.Event.ChangeVideoAutoplayEvent;
import ml.docilealligator.infinityforreddit.Event.RecreateActivityEvent;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R;
@@ -39,18 +40,22 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat {
setPreferencesFromResource(R.xml.main_preferences, rootKey);
((Infinity) activity.getApplication()).getAppComponent().inject(this);
+ ListPreference videoAutoplaySwitch = findPreference(SharedPreferencesUtils.VIDEO_AUTOPLAY);
SwitchPreference confirmToExitSwitch = findPreference(SharedPreferencesUtils.CONFIRM_TO_EXIT);
SwitchPreference nsfwSwitch = findPreference(SharedPreferencesUtils.NSFW_KEY);
SwitchPreference blurNSFWSwitch = findPreference(SharedPreferencesUtils.BLUR_NSFW_KEY);
SwitchPreference blurSpoilerSwitch = findPreference(SharedPreferencesUtils.BLUR_SPOILER_KEY);
+ if (videoAutoplaySwitch != null) {
+ videoAutoplaySwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ EventBus.getDefault().post(new ChangeVideoAutoplayEvent((String) newValue));
+ return true;
+ });
+ }
if (confirmToExitSwitch != null) {
- confirmToExitSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- EventBus.getDefault().post(new RecreateActivityEvent());
- return true;
- }
+ confirmToExitSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ EventBus.getDefault().post(new RecreateActivityEvent());
+ return true;
});
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDatabase/SubredditData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDatabase/SubredditData.java
index 486bd0a7..6c73f459 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDatabase/SubredditData.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditDatabase/SubredditData.java
@@ -23,9 +23,11 @@ public class SubredditData {
private String sidebarDescription;
@ColumnInfo(name = "subscribers_count")
private int nSubscribers;
+ @ColumnInfo(name = "created_utc")
+ private long createdUTC;
public SubredditData(@NonNull String id, String name, String iconUrl, String bannerUrl,
- String description, String sidebarDescription, int nSubscribers) {
+ String description, String sidebarDescription, int nSubscribers, long createdUTC) {
this.id = id;
this.name = name;
this.iconUrl = iconUrl;
@@ -33,6 +35,7 @@ public class SubredditData {
this.description = description;
this.sidebarDescription = sidebarDescription;
this.nSubscribers = nSubscribers;
+ this.createdUTC = createdUTC;
}
@NonNull
@@ -63,4 +66,8 @@ public class SubredditData {
public int getNSubscribers() {
return nSubscribers;
}
+
+ public long getCreatedUTC() {
+ return createdUTC;
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/User/UserData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/User/UserData.java
index f207685e..8ad00b49 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/User/UserData.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/User/UserData.java
@@ -15,23 +15,33 @@ public class UserData {
private String iconUrl;
@ColumnInfo(name = "banner")
private String banner;
- @ColumnInfo(name = "karma")
- private int karma;
+ @ColumnInfo(name = "link_karma")
+ private int linkKarma;
+ @ColumnInfo(name = "comment_karma")
+ private int commentKarma;
+ @ColumnInfo(name = "created_utc")
+ private long cakeday;
@ColumnInfo(name = "is_gold")
private boolean isGold;
@ColumnInfo(name = "is_friend")
private boolean isFriend;
@ColumnInfo(name = "can_be_followed")
private boolean canBeFollowed;
+ @ColumnInfo(name = "description")
+ private String description;
- public UserData(@NonNull String name, String iconUrl, String banner, int karma, boolean isGold, boolean isFriend, boolean canBeFollowed) {
+ public UserData(@NonNull String name, String iconUrl, String banner, int linkKarma, int commentKarma,
+ long cakeday, boolean isGold, boolean isFriend, boolean canBeFollowed, String description) {
this.name = name;
this.iconUrl = iconUrl;
this.banner = banner;
- this.karma = karma;
+ this.commentKarma = commentKarma;
+ this.linkKarma = linkKarma;
+ this.cakeday = cakeday;
this.isGold = isGold;
this.isFriend = isFriend;
this.canBeFollowed = canBeFollowed;
+ this.description = description;
}
@NonNull
@@ -47,8 +57,20 @@ public class UserData {
return banner;
}
+ public int getLinkKarma() {
+ return linkKarma;
+ }
+
+ public int getCommentKarma() {
+ return commentKarma;
+ }
+
public int getKarma() {
- return karma;
+ return linkKarma + commentKarma;
+ }
+
+ public long getCakeday() {
+ return cakeday;
}
public boolean isGold() {
@@ -62,4 +84,8 @@ public class UserData {
public boolean isCanBeFollowed() {
return canBeFollowed;
}
+
+ public String getDescription() {
+ return description;
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/CustomThemeSharedPreferencesUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/CustomThemeSharedPreferencesUtils.java
index 6e08559b..295013f1 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/CustomThemeSharedPreferencesUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/CustomThemeSharedPreferencesUtils.java
@@ -29,6 +29,7 @@ public class CustomThemeSharedPreferencesUtils {
public static final String COMMENT_BACKGROUND_COLOR = "commentBackgroundColor";
public static final String BOTTOM_APP_BAR_BACKGROUND_COLOR = "bottomAppBarBackgroundColor";
public static final String PRIMARY_ICON_COLOR = "primaryIconColor";
+ public static final String BOTTOM_APP_BAR_ICON_COLOR = "bottomAppBarIconColor";
public static final String POST_ICON_AND_INFO_COLOR = "postIconAndInfoColor";
public static final String COMMENT_ICON_AND_INFO_COLOR = "commentIconAndInfoColor";
public static final String TOOLBAR_PRIMARY_TEXT_AND_ICON_COLOR = "toolbarPrimaryTextAndIconColor";
@@ -96,6 +97,7 @@ public class CustomThemeSharedPreferencesUtils {
editor.putInt(COMMENT_BACKGROUND_COLOR, customTheme.commentBackgroundColor);
editor.putInt(BOTTOM_APP_BAR_BACKGROUND_COLOR, customTheme.bottomAppBarBackgroundColor);
editor.putInt(PRIMARY_ICON_COLOR, customTheme.primaryIconColor);
+ editor.putInt(BOTTOM_APP_BAR_ICON_COLOR, customTheme.bottomAppBarIconColor);
editor.putInt(POST_ICON_AND_INFO_COLOR, customTheme.postIconAndInfoColor);
editor.putInt(COMMENT_ICON_AND_INFO_COLOR, customTheme.commentIconAndInfoColor);
editor.putInt(TOOLBAR_PRIMARY_TEXT_AND_ICON_COLOR, customTheme.toolbarPrimaryTextAndIconColor);
@@ -118,6 +120,8 @@ public class CustomThemeSharedPreferencesUtils {
editor.putInt(NSFW_TEXT_COLOR, customTheme.nsfwTextColor);
editor.putInt(FLAIR_BACKGROUND_COLOR, customTheme.flairBackgroundColor);
editor.putInt(FLAIR_TEXT_COLOR, customTheme.flairTextColor);
+ editor.putInt(AWARDS_BACKGROUND_COLOR, customTheme.awardsBackgroundColor);
+ editor.putInt(AWARDS_TEXT_COLOR, customTheme.awardsTextColor);
editor.putInt(ARCHIVED_ICON_TINT, customTheme.archivedTint);
editor.putInt(LOCKED_ICON_TINT, customTheme.lockedIconTint);
editor.putInt(CROSSPOST_ICON_TINT, customTheme.crosspostIconTint);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/RedditUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/RedditUtils.java
index 2e7c93c8..b42cbff1 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/RedditUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/RedditUtils.java
@@ -84,6 +84,8 @@ public class RedditUtils {
public static final String MULTIPATH_KEY = "multipath";
public static final String MODEL_KEY = "model";
+ public static final String REASON_KEY = "reason";
+
public static Map getHttpBasicAuthHeader() {
Map params = new HashMap<>();
String credentials = String.format("%s:%s", RedditUtils.CLIENT_ID, "");
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java
index ec523487..63ab550e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java
@@ -76,6 +76,10 @@ public class SharedPreferencesUtils {
public static final String VOLUME_KEYS_NAVIGATE_POSTS = "volume_keys_navigate_posts";
public static final String MUTE_VIDEO = "mute_video";
public static final String OPEN_LINK_IN_APP = "open_link_in_app";
+ public static final String VIDEO_AUTOPLAY = "video_autoplay";
+ public static final String VIDEO_AUTOPLAY_VALUE_ALWAYS_ON = "2";
+ public static final String VIDEO_AUTOPLAY_VALUE_ON_WIFI = "1";
+ public static final String VIDEO_AUTOPLAY_VALUE_NEVER = "0";
public static final String LOCK_JUMP_TO_NEXT_TOP_LEVEL_COMMENT_BUTTON = "lock_jump_to_next_top_level_comment_button";
public static final String SWIPE_UP_TO_HIDE_JUMP_TO_NEXT_TOP_LEVEL_COMMENT_BUTTON = "swipe_up_to_hide_jump_to_next_top_level_comments_button";
public static final String SHOW_TOP_LEVEL_COMMENTS_FIRST = "show_top_level_comments_first";
@@ -89,10 +93,10 @@ public class SharedPreferencesUtils {
public static final String CUSTOMIZE_DARK_THEME = "customize_dark_theme";
public static final String CUSTOMIZE_AMOLED_THEME = "customize_amoled_theme";
public static final String MANAGE_THEMES = "manage_themes";
- public static final String DELETE_ALL_SUBREDDITS_DATA_IN_DATABASE= "delete_all_subreddits_data_in_database";
- public static final String DELETE_ALL_USERS_DATA_IN_DATABASE= "delete_all_users_data_in_database";
- public static final String DELETE_ALL_SORT_TYPE_DATA_IN_DATABASE= "delete_all_sort_type_data_in_database";
- public static final String DELETE_ALL_POST_LAYOUT_DATA_IN_DATABASE= "delete_all_post_layout_data_in_database";
+ public static final String DELETE_ALL_SUBREDDITS_DATA_IN_DATABASE = "delete_all_subreddits_data_in_database";
+ public static final String DELETE_ALL_USERS_DATA_IN_DATABASE = "delete_all_users_data_in_database";
+ public static final String DELETE_ALL_SORT_TYPE_DATA_IN_DATABASE = "delete_all_sort_type_data_in_database";
+ public static final String DELETE_ALL_POST_LAYOUT_DATA_IN_DATABASE = "delete_all_post_layout_data_in_database";
public static final String DELETE_ALL_THEMES_IN_DATABASE = "delete_all_themes_in_database";
public static final String RESET_ALL_SETTINGS = "reset_all_settings";
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/Utils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/Utils.java
index f3788ff8..e6726cbb 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/Utils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/Utils.java
@@ -1,6 +1,9 @@
package ml.docilealligator.infinityforreddit.Utils;
import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkInfo;
import android.text.Html;
import android.text.Spannable;
import android.widget.TextView;
@@ -87,4 +90,18 @@ public class Utils {
}
textView.setText(html);
}
+
+ public static boolean isConnectedToWifi(Context context) {
+ ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (connMgr != null) {
+ for (Network network : connMgr.getAllNetworks()) {
+ NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
+ if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+ return networkInfo.isConnected();
+ }
+ }
+ }
+
+ return false;
+ }
}
diff --git a/app/src/main/res/drawable/exo_player_autoplay_button_background.xml b/app/src/main/res/drawable/exo_player_autoplay_button_background.xml
new file mode 100644
index 00000000..0ad9af8e
--- /dev/null
+++ b/app/src/main/res/drawable/exo_player_autoplay_button_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_fullscreen_white_rounded_18dp.xml b/app/src/main/res/drawable/ic_fullscreen_white_rounded_18dp.xml
new file mode 100644
index 00000000..9977b60f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_fullscreen_white_rounded_18dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_mute_white_rounded_18dp.xml b/app/src/main/res/drawable/ic_mute_white_rounded_18dp.xml
new file mode 100644
index 00000000..b4f8f660
--- /dev/null
+++ b/app/src/main/res/drawable/ic_mute_white_rounded_18dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_pause_white_rounded_18dp.xml b/app/src/main/res/drawable/ic_pause_white_rounded_18dp.xml
new file mode 100644
index 00000000..479c57b0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_pause_white_rounded_18dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_play_arrow_white_rounded_18dp.xml b/app/src/main/res/drawable/ic_play_arrow_white_rounded_18dp.xml
new file mode 100644
index 00000000..3400b3ac
--- /dev/null
+++ b/app/src/main/res/drawable/ic_play_arrow_white_rounded_18dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_report_black_24dp.xml b/app/src/main/res/drawable/ic_report_black_24dp.xml
new file mode 100644
index 00000000..6e07b06d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_report_black_24dp.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_unmute_white_rounded_18dp.xml b/app/src/main/res/drawable/ic_unmute_white_rounded_18dp.xml
new file mode 100644
index 00000000..90b8f85d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_unmute_white_rounded_18dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_report.xml b/app/src/main/res/layout/activity_report.xml
new file mode 100644
index 00000000..845c9ecc
--- /dev/null
+++ b/app/src/main/res/layout/activity_report.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_view_gif.xml b/app/src/main/res/layout/activity_view_gif.xml
index 8740679c..cce51370 100644
--- a/app/src/main/res/layout/activity_view_gif.xml
+++ b/app/src/main/res/layout/activity_view_gif.xml
@@ -5,7 +5,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/parent_relative_layout_view_gif_activity"
- android:background="@android:color/black"
+ android:background="#000000"
+ android:keepScreenOn="true"
tools:application="ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity">
-
+ app:layout_constraintBottom_toTopOf="@id/online_subscriber_count_text_view_view_subreddit_detail_activity"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@id/barrier"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintHorizontal_bias="0" />
+ android:textSize="?attr/font_default"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@id/barrier"
+ app:layout_constraintTop_toBottomOf="@id/subscriber_count_text_view_view_subreddit_detail_activity"
+ app:layout_constraintHorizontal_bias="0" />
-
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_view_video.xml b/app/src/main/res/layout/activity_view_video.xml
index 906770fe..8f23ea26 100644
--- a/app/src/main/res/layout/activity_view_video.xml
+++ b/app/src/main/res/layout/activity_view_video.xml
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@android:color/black"
+ android:background="#000000"
android:id="@+id/relative_layout_view_video_activity"
android:keepScreenOn="true"
tools:application="ml.docilealligator.infinityforreddit.Activity.ViewVideoActivity">
diff --git a/app/src/main/res/layout/exo_autoplay_playback_control_view.xml b/app/src/main/res/layout/exo_autoplay_playback_control_view.xml
new file mode 100644
index 00000000..7280717b
--- /dev/null
+++ b/app/src/main/res/layout/exo_autoplay_playback_control_view.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_comment_more_bottom_sheet.xml b/app/src/main/res/layout/fragment_comment_more_bottom_sheet.xml
index d60fe273..ddd3e572 100644
--- a/app/src/main/res/layout/fragment_comment_more_bottom_sheet.xml
+++ b/app/src/main/res/layout/fragment_comment_more_bottom_sheet.xml
@@ -81,6 +81,24 @@
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_post.xml b/app/src/main/res/layout/fragment_post.xml
index 7862ba25..94d2f551 100644
--- a/app/src/main/res/layout/fragment_post.xml
+++ b/app/src/main/res/layout/fragment_post.xml
@@ -10,7 +10,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_post_link_type.xml b/app/src/main/res/layout/item_post_link_type.xml
new file mode 100644
index 00000000..43f51b10
--- /dev/null
+++ b/app/src/main/res/layout/item_post_link_type.xml
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_post_no_preview_link_type.xml b/app/src/main/res/layout/item_post_no_preview_link_type.xml
new file mode 100644
index 00000000..a6ef9eeb
--- /dev/null
+++ b/app/src/main/res/layout/item_post_no_preview_link_type.xml
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_post_text_type.xml b/app/src/main/res/layout/item_post_text_type.xml
new file mode 100644
index 00000000..cc7a3bb9
--- /dev/null
+++ b/app/src/main/res/layout/item_post_text_type.xml
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_post_video_and_gif_preview_type.xml b/app/src/main/res/layout/item_post_video_and_gif_preview_type.xml
new file mode 100644
index 00000000..c3549df4
--- /dev/null
+++ b/app/src/main/res/layout/item_post_video_and_gif_preview_type.xml
@@ -0,0 +1,328 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_post_video_type_autoplay.xml b/app/src/main/res/layout/item_post_video_type_autoplay.xml
new file mode 100644
index 00000000..138090d8
--- /dev/null
+++ b/app/src/main/res/layout/item_post_video_type_autoplay.xml
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_report_reason.xml b/app/src/main/res/layout/item_report_reason.xml
new file mode 100644
index 00000000..08d6900b
--- /dev/null
+++ b/app/src/main/res/layout/item_report_reason.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/report_activity.xml b/app/src/main/res/menu/report_activity.xml
new file mode 100644
index 00000000..8445d412
--- /dev/null
+++ b/app/src/main/res/menu/report_activity.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/view_post_detail_activity.xml b/app/src/main/res/menu/view_post_detail_activity.xml
index a9871051..32f83c41 100644
--- a/app/src/main/res/menu/view_post_detail_activity.xml
+++ b/app/src/main/res/menu/view_post_detail_activity.xml
@@ -74,4 +74,11 @@
android:title="@string/action_edit_flair"
app:showAsAction="never"
android:visible="false" />
+
+
\ 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 eeef2439..9365ed2e 100644
--- a/app/src/main/res/menu/view_subreddit_detail_activity.xml
+++ b/app/src/main/res/menu/view_subreddit_detail_activity.xml
@@ -39,4 +39,10 @@
android:orderInCategory="6"
android:title="@string/action_view_side_bar"
app:showAsAction="never" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/view_user_detail_activity.xml b/app/src/main/res/menu/view_user_detail_activity.xml
index fe991f16..18c3ef16 100644
--- a/app/src/main/res/menu/view_user_detail_activity.xml
+++ b/app/src/main/res/menu/view_user_detail_activity.xml
@@ -31,4 +31,10 @@
android:orderInCategory="5"
android:title="@string/action_change_post_layout"
app:showAsAction="never" />
+
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 4adfdff9..b415b0f5 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -47,6 +47,18 @@
- 1
+
+ - Always On
+ - Only on Wifi
+ - Never
+
+
+
+ - 2
+ - 1
+ - 0
+
+
- 1s
- 2s
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index fb7082dd..c12d7105 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,6 +25,7 @@
Theme Preview
Edit Multireddit
Selected Subreddits
+ Report
Open navigation drawer
Close navigation drawer
@@ -57,6 +58,7 @@
Delete Multireddit
Share
Preview
+ Report
Error occurred when parsing the JSON response
Error Retrieving the token
@@ -90,6 +92,9 @@
NSFW
Karma: %1$d
+ Karma:\n%1$d (%2$d + %3$d)
+ Cakeday:\n%1$s
+ Since:
Profile
Following
@@ -193,6 +198,7 @@
No rule
Error loading rules.\nTap to retry.
+ Error Loading Rules
Search in
All subreddits
@@ -311,6 +317,7 @@
Interface
Gestures & Buttons
Open Link In App
+ Video Autoplay
Immersive Interface
Ignore Navigation Bar in Immersive Interface
Prevent the Bottom Navigation Bar Having Extra Padding
@@ -524,7 +531,9 @@
Bottom Navigation Bar Color
Applied to: Bottom navigation bar
Primary Icon Color
- Applied to: Icons in the bottom navigation bar and the navigation drawer.
+ Applied to: Icons in the navigation drawer.
+ Bottom Navigation Bar Icon Color
+ Applied to: Icons in the bottom navigation bar
Post Icon and Info Color
Applied to: Icons, score and the number of comments in posts
Comment Icon and Info Color
@@ -696,4 +705,15 @@
%1$d Awards
1 Award
+ Report
+ Reporting
+ Reported
+ Report failed
+ You haven\'t selected a reason
+
+ It Is Spam
+ It Contains Copyright Issue
+ It Contains Child Pornography
+ It Contains Abusive Content
+
diff --git a/app/src/main/res/xml/main_preferences.xml b/app/src/main/res/xml/main_preferences.xml
index 8622a87f..1074a90e 100644
--- a/app/src/main/res/xml/main_preferences.xml
+++ b/app/src/main/res/xml/main_preferences.xml
@@ -28,6 +28,14 @@
app:key="open_link_in_app"
app:title="@string/settings_open_link_in_app_title" />
+
+