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. --- .../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 +++++++++++++++++++++ 7 files changed, 168 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/SettingsActivity.java (limited to 'app/src/main/java/ml') diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java index 26b5ede9..b832d423 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java @@ -31,10 +31,9 @@ class AppModule { @Provides @Named("oauth_without_authenticator") @Singleton - Retrofit provideOauthWithoutAuthenticatorRetrofit(OkHttpClient okHttpClient) { + Retrofit provideOauthWithoutAuthenticatorRetrofit() { return new Retrofit.Builder() .baseUrl(RedditUtils.OAUTH_API_BASE_URI) - .client(okHttpClient) .addConverterFactory(ScalarsConverterFactory.create()) .build(); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index 7c5a3da9..303ea2fb 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -559,6 +559,8 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe settingsLinearLayout.setOnClickListener(view -> { 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; + } +} -- cgit v1.2.3