diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml
index dd08719b..43d6177f 100644
--- a/.idea/assetWizardSettings.xml
+++ b/.idea/assetWizardSettings.xml
@@ -35,9 +35,9 @@
diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 4b09346a..63209b6a 100644
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser
index e2b6be3f..b1d13576 100644
Binary files a/.idea/caches/gradle_models.ser and b/.idea/caches/gradle_models.ser differ
diff --git a/app/build.gradle b/app/build.gradle
index 67c0ed85..0f78862a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -58,8 +58,8 @@ dependencies {
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$rootProject.archLifecycleVersion"
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
- implementation 'com.squareup.retrofit2:retrofit:2.5.0'
- implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'
+ implementation 'com.squareup.retrofit2:retrofit:2.6.1'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.6.1'
implementation 'jp.wasabeef:glide-transformations:4.0.0'
implementation 'com.google.dagger:dagger:2.17'
annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
@@ -80,4 +80,5 @@ dependencies {
implementation 'com.evernote:android-state:1.4.1'
annotationProcessor 'com.evernote:android-state-processor:1.4.1'
implementation "androidx.work:work-runtime:2.2.0"
+ implementation "androidx.preference:preference:1.1.0-rc01"
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 674b1642..5b41bd5d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -20,9 +20,14 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
+
{
drawer.closeDrawers();
+ Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
+ startActivity(intent);
});
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
index f18e3c5a..138747d3 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
@@ -60,7 +60,6 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
private static final String IS_IN_LAZY_MODE_STATE = "IILMS";
- @BindView(R.id.coordinator_layout_post_fragment) CoordinatorLayout mCoordinatorLayout;
@BindView(R.id.recycler_view_post_fragment) RecyclerView mPostRecyclerView;
@BindView(R.id.progress_bar_post_fragment) CircleProgressBar mProgressBar;
@BindView(R.id.fetch_post_info_linear_layout_post_fragment) LinearLayout mFetchPostInfoLinearLayout;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java
index 7343f259..98287035 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java
@@ -496,8 +496,8 @@ public class PostImageActivity extends AppCompatActivity implements FlairBottomS
startActivity(intent);
finish();
} else {
- mMemu.getItem(R.id.action_send_post_image_activity).setEnabled(true);
- mMemu.getItem(R.id.action_send_post_image_activity).getIcon().setAlpha(255);
+ mMemu.findItem(R.id.action_send_post_image_activity).setEnabled(true);
+ mMemu.findItem(R.id.action_send_post_image_activity).getIcon().setAlpha(255);
if (submitImagePostEvent.errorMessage == null || submitImagePostEvent.errorMessage.equals("")) {
Snackbar.make(coordinatorLayout, R.string.post_failed, Snackbar.LENGTH_SHORT).show();
} else {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java
index f9204444..1e9e5a02 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java
@@ -489,6 +489,9 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS
public void onSubmitVideoPostEvent(SubmitVideoPostEvent submitVideoPostEvent) {
isPosting = false;
mPostingSnackbar.dismiss();
+ mMemu.findItem(R.id.action_send_post_video_activity).setEnabled(true);
+ mMemu.findItem(R.id.action_send_post_video_activity).getIcon().setAlpha(255);
+
if(submitVideoPostEvent.postSuccess) {
Intent intent = new Intent(this, ViewUserDetailActivity.class);
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY,
@@ -498,8 +501,6 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS
} else if(submitVideoPostEvent.errorProcessingVideo) {
Snackbar.make(coordinatorLayout, R.string.error_processing_video, Snackbar.LENGTH_SHORT).show();
} else {
- mMemu.getItem(R.id.action_send_post_video_activity).setEnabled(true);
- mMemu.getItem(R.id.action_send_post_video_activity).getIcon().setAlpha(255);
if (submitVideoPostEvent.errorMessage == null || submitVideoPostEvent.errorMessage.equals("")) {
Snackbar.make(coordinatorLayout, R.string.post_failed, Snackbar.LENGTH_SHORT).show();
} else {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java
index 0a90e9a4..e53f43e5 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PullNotificationWorker.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import Account.Account;
+import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
@@ -37,6 +38,10 @@ public class PullNotificationWorker extends Worker {
@Named("oauth_without_authenticator")
Retrofit mOauthWithoutAuthenticatorRetrofit;
+ @Inject
+ @Named("no_oauth")
+ Retrofit mRetrofit;
+
@Inject
RedditDataRoomDatabase redditDataRoomDatabase;
@@ -56,9 +61,10 @@ public class PullNotificationWorker extends Worker {
List accounts = redditDataRoomDatabase.accountDao().getAllAccounts();
for(int accountIndex = 0; accountIndex < accounts.size(); accountIndex++) {
Account account = accounts.get(accountIndex);
+
String accountName = account.getUsername();
- Response response = fetchMessages(account);
+ Response response = fetchMessages(account, 1);
if(response != null && response.isSuccessful()) {
Log.i("workmanager", "has response");
@@ -162,56 +168,81 @@ public class PullNotificationWorker extends Worker {
Log.i("workmanager", "message size " + messages.size());
} else {
- Log.i("workmanager", "retry1");
- return Result.retry();
+ Log.i("workmanager", "no message");
+ return Result.success();
}
} else {
if(response != null) {
- Log.i("workmanager", "retry2 " + response.code());
+ Log.i("workmanager", "retry1 " + response.code());
}
return Result.retry();
}
}
- } catch (IOException | JSONException e) {
+ } catch (IOException e) {
e.printStackTrace();
- Log.i("workmanager", "retry3");
+ Log.i("workmanager", "retry2");
return Result.retry();
+ } catch (JSONException e) {
+ e.printStackTrace();
+ Log.i("workmanager", "json failure");
+ return Result.failure();
}
Log.i("workmanager", "success");
return Result.success();
}
- private Response fetchMessages(Account account) throws IOException, JSONException {
- Response response = mOauthWithoutAuthenticatorRetrofit.create(RedditAPI.class)
+ private Response fetchMessages(Account account, int retryCount) throws IOException, JSONException {
+ if(retryCount < 0) {
+ return null;
+ }
+
+ Call call = mOauthWithoutAuthenticatorRetrofit.create(RedditAPI.class)
.getMessages(RedditUtils.getOAuthHeader(account.getAccessToken()),
- FetchMessages.WHERE_UNREAD, null).execute();
+ FetchMessages.WHERE_INBOX, null);
+ Response response = call.execute();
if(response.isSuccessful()) {
return response;
} else {
if(response.code() == 401) {
- String refreshToken = account.getRefreshToken();
-
- Map params = new HashMap<>();
- params.put(RedditUtils.GRANT_TYPE_KEY, RedditUtils.GRANT_TYPE_REFRESH_TOKEN);
- params.put(RedditUtils.REFRESH_TOKEN_KEY, refreshToken);
-
- Response accessTokenResponse = mOauthWithoutAuthenticatorRetrofit.create(RedditAPI.class)
- .getAccessToken(RedditUtils.getHttpBasicAuthHeader(), params).execute();
- if(accessTokenResponse.isSuccessful() && accessTokenResponse.body() != null) {
- JSONObject jsonObject = new JSONObject((String) accessTokenResponse.body());
- String newAccessToken = jsonObject.getString(RedditUtils.ACCESS_TOKEN_KEY);
- account.setAccessToken(newAccessToken);
- redditDataRoomDatabase.accountDao().changeAccessToken(account.getUsername(), newAccessToken);
-
- return fetchMessages(account);
- } else {
- return null;
+ String accessToken = refreshAccessToken(account);
+ if(!accessToken.equals("")) {
+ return fetchMessages(account, retryCount - 1);
}
+
+ return null;
} else {
return null;
}
}
}
+
+ private String refreshAccessToken(Account account) {
+ String refreshToken = account.getRefreshToken();
+
+ RedditAPI api = mRetrofit.create(RedditAPI.class);
+
+ Map params = new HashMap<>();
+ params.put(RedditUtils.GRANT_TYPE_KEY, RedditUtils.GRANT_TYPE_REFRESH_TOKEN);
+ params.put(RedditUtils.REFRESH_TOKEN_KEY, refreshToken);
+
+ Call accessTokenCall = api.getAccessToken(RedditUtils.getHttpBasicAuthHeader(), params);
+ try {
+ Response response = accessTokenCall.execute();
+ if(response.isSuccessful() && response.body() != null) {
+ JSONObject jsonObject = new JSONObject(response.body().toString());
+ String newAccessToken = jsonObject.getString(RedditUtils.ACCESS_TOKEN_KEY);
+ redditDataRoomDatabase.accountDao().changeAccessToken(account.getUsername(), newAccessToken);
+
+ Log.i("access token", newAccessToken);
+ return newAccessToken;
+ }
+ return "";
+ } catch (IOException | JSONException e) {
+ e.printStackTrace();
+ }
+
+ return "";
+ }
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SettingsActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SettingsActivity.java
new file mode 100644
index 00000000..1ae29994
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SettingsActivity.java
@@ -0,0 +1,103 @@
+package ml.docilealligator.infinityforreddit;
+
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.Window;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import Settings.MainPreferenceFragment;
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class SettingsActivity extends AppCompatActivity implements
+ PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+
+ private static final String TITLE_STATE = "TS";
+
+ @BindView(R.id.toolbar_settings_activity) Toolbar toolbar;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.settings_activity);
+
+ ButterKnife.bind(this);
+
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ Window window = getWindow();
+ if((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) {
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
+ }
+ window.setNavigationBarColor(ContextCompat.getColor(this, R.color.navBarColor));
+ }
+
+ setSupportActionBar(toolbar);
+
+ if (savedInstanceState == null) {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.frame_layout_settings_activity, new MainPreferenceFragment())
+ .commit();
+ } else {
+ setTitle(savedInstanceState.getCharSequence(TITLE_STATE));
+ }
+ getSupportFragmentManager().addOnBackStackChangedListener(() -> {
+ if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
+ setTitle(R.string.settings_activity_label);
+ }
+ });
+
+
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if(item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putCharSequence(TITLE_STATE, getTitle());
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ if (getSupportFragmentManager().popBackStackImmediate()) {
+ return true;
+ }
+ return super.onSupportNavigateUp();
+ }
+
+ @Override
+ public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
+ // Instantiate the new Fragment
+ final Bundle args = pref.getExtras();
+ final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
+ getClassLoader(),
+ pref.getFragment());
+ fragment.setArguments(args);
+ fragment.setTargetFragment(caller, 0);
+
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_layout_settings_activity, fragment)
+ .addToBackStack(null)
+ .commit();
+ setTitle(pref.getTitle());
+ return true;
+ }
+}
diff --git a/app/src/main/res/drawable-night/ic_error_outline_black_24dp.xml b/app/src/main/res/drawable-night/ic_error_outline_black_24dp.xml
new file mode 100644
index 00000000..e7d3eb31
--- /dev/null
+++ b/app/src/main/res/drawable-night/ic_error_outline_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable-night/ic_outline_access_time_24px.xml b/app/src/main/res/drawable-night/ic_outline_access_time_24px.xml
new file mode 100644
index 00000000..a846b915
--- /dev/null
+++ b/app/src/main/res/drawable-night/ic_outline_access_time_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable-night/ic_outline_color_lens_24px.xml b/app/src/main/res/drawable-night/ic_outline_color_lens_24px.xml
new file mode 100644
index 00000000..d1bc2624
--- /dev/null
+++ b/app/src/main/res/drawable-night/ic_outline_color_lens_24px.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable-night/ic_outline_notifications_24px.xml b/app/src/main/res/drawable-night/ic_outline_notifications_24px.xml
new file mode 100644
index 00000000..43d52df4
--- /dev/null
+++ b/app/src/main/res/drawable-night/ic_outline_notifications_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_outline_access_time_24px.xml b/app/src/main/res/drawable/ic_outline_access_time_24px.xml
new file mode 100644
index 00000000..dcb0d6ec
--- /dev/null
+++ b/app/src/main/res/drawable/ic_outline_access_time_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_outline_color_lens_24px.xml b/app/src/main/res/drawable/ic_outline_color_lens_24px.xml
new file mode 100644
index 00000000..d1bc2624
--- /dev/null
+++ b/app/src/main/res/drawable/ic_outline_color_lens_24px.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_outline_notifications_24px.xml b/app/src/main/res/drawable/ic_outline_notifications_24px.xml
new file mode 100644
index 00000000..0c2c90a7
--- /dev/null
+++ b/app/src/main/res/drawable/ic_outline_notifications_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/fragment_post.xml b/app/src/main/res/layout/fragment_post.xml
index dcacaf49..9083b01d 100644
--- a/app/src/main/res/layout/fragment_post.xml
+++ b/app/src/main/res/layout/fragment_post.xml
@@ -3,7 +3,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:id="@+id/coordinator_layout_post_fragment"
tools:application="ml.docilealligator.infinityforreddit.PostFragment">
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
new file mode 100644
index 00000000..99955ed6
--- /dev/null
+++ b/app/src/main/res/values/arrays.xml
@@ -0,0 +1,33 @@
+
+
+ - 1 hour
+ - 2 hours
+ - 3 hours
+ - 4 hours
+ - 6 hours
+ - 12 hours
+ - 1 day
+
+
+
+ - 1
+ - 2
+ - 3
+ - 4
+ - 6
+ - 12
+ - 24
+
+
+
+ - Light Theme
+ - Dark Theme
+ - Device Default
+
+
+
+ - 0
+ - 1
+ - 2
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5a245f76..dba73658 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -13,7 +13,8 @@
Subreddits
Edit Post
Edit Comment
- Inbox
+ Inbox
+ Settings
Open navigation drawer
Close navigation drawer
@@ -239,4 +240,14 @@
Post
Account Switched. So all other pages are gone.
+
+ Account
+ Notification
+ Enable Notifications
+ Check Notifications Interval
+ Theme
+ Light Theme
+ Dark Theme
+ Device default
+ Enable NSFW
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 0b20ce0e..2b97cc0d 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -60,4 +60,8 @@
- @color/primaryTextColor
+
+
diff --git a/app/src/main/res/xml/main_preferences.xml b/app/src/main/res/xml/main_preferences.xml
new file mode 100644
index 00000000..5d624d7f
--- /dev/null
+++ b/app/src/main/res/xml/main_preferences.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/notification_preferences.xml b/app/src/main/res/xml/notification_preferences.xml
new file mode 100644
index 00000000..1bb81106
--- /dev/null
+++ b/app/src/main/res/xml/notification_preferences.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
\ No newline at end of file