From 9bad5024ff2fe13d9fe366ed40a2ea8662620c18 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Wed, 21 Aug 2019 16:21:17 +0800 Subject: Fixed getting same notifications for different accounts (for real this time). Add a settings acivity but with no use now. Minor bugs fixed. Minor UI tweaks. --- app/src/main/AndroidManifest.xml | 7 +- .../main/java/Settings/MainPreferenceFragment.java | 18 ++++ .../Settings/NotificationPreferenceFragment.java | 20 ++++ .../infinityforreddit/AppModule.java | 3 +- .../infinityforreddit/MainActivity.java | 2 + .../infinityforreddit/PostFragment.java | 1 - .../infinityforreddit/PostImageActivity.java | 4 +- .../infinityforreddit/PostVideoActivity.java | 5 +- .../infinityforreddit/PullNotificationWorker.java | 83 +++++++++++------ .../infinityforreddit/SettingsActivity.java | 103 +++++++++++++++++++++ .../drawable-night/ic_error_outline_black_24dp.xml | 9 ++ .../drawable-night/ic_outline_access_time_24px.xml | 9 ++ .../drawable-night/ic_outline_color_lens_24px.xml | 21 +++++ .../ic_outline_notifications_24px.xml | 9 ++ .../res/drawable/ic_outline_access_time_24px.xml | 9 ++ .../res/drawable/ic_outline_color_lens_24px.xml | 21 +++++ .../res/drawable/ic_outline_notifications_24px.xml | 9 ++ app/src/main/res/layout/fragment_post.xml | 1 - app/src/main/res/layout/settings_activity.xml | 26 ++++++ app/src/main/res/values/arrays.xml | 33 +++++++ app/src/main/res/values/strings.xml | 13 ++- app/src/main/res/values/styles.xml | 4 + app/src/main/res/xml/main_preferences.xml | 25 +++++ app/src/main/res/xml/notification_preferences.xml | 20 ++++ 24 files changed, 419 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/Settings/MainPreferenceFragment.java create mode 100644 app/src/main/java/Settings/NotificationPreferenceFragment.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/SettingsActivity.java create mode 100644 app/src/main/res/drawable-night/ic_error_outline_black_24dp.xml create mode 100644 app/src/main/res/drawable-night/ic_outline_access_time_24px.xml create mode 100644 app/src/main/res/drawable-night/ic_outline_color_lens_24px.xml create mode 100644 app/src/main/res/drawable-night/ic_outline_notifications_24px.xml create mode 100644 app/src/main/res/drawable/ic_outline_access_time_24px.xml create mode 100644 app/src/main/res/drawable/ic_outline_color_lens_24px.xml create mode 100644 app/src/main/res/drawable/ic_outline_notifications_24px.xml create mode 100644 app/src/main/res/layout/settings_activity.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/xml/main_preferences.xml create mode 100644 app/src/main/res/xml/notification_preferences.xml (limited to 'app/src/main') 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 -- cgit v1.2.3