diff --git a/app/build.gradle b/app/build.gradle
index 7a33928c..e0a8d68a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -57,6 +57,7 @@ dependencies {
compile "com.github.chrisbanes:PhotoView:2.1.3"
compile "com.mikepenz:google-material-typeface:3.0.1.0.original@aar"
compile "com.theartofdev.edmodo:android-image-cropper:2.5.1"
+ compile 'com.evernote:android-job:1.2.0'
//room
compile "android.arch.persistence.room:runtime:1.0.0-rc1"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c698ae06..3802c7e8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -98,7 +98,6 @@
-
> notifications =
+ mastodonApi.notifications(null, null, null).execute();
+ if (notifications.isSuccessful()) {
+ onNotificationsReceived(notifications.body());
+ } else {
+ return Result.FAILURE;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ return Result.FAILURE;
+ }
+ return Result.SUCCESS;
+ }
+
+ private void onNotificationsReceived(List notificationList) {
+ SharedPreferences notificationsPreferences = context.getSharedPreferences(
+ "Notifications", Context.MODE_PRIVATE);
+ Set currentIds = notificationsPreferences.getStringSet(
+ "current_ids", new HashSet());
+ for (Notification notification : notificationList) {
+ String id = notification.id;
+ if (!currentIds.contains(id)) {
+ currentIds.add(id);
+ NotificationMaker.make(context, NOTIFY_ID, notification);
+ }
+ }
+ notificationsPreferences.edit()
+ .putStringSet("current_ids", currentIds)
+ .apply();
+ }
+ }
+}
diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java
index 26016566..3bca5563 100644
--- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java
+++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java
@@ -19,6 +19,7 @@ import android.app.Application;
import android.arch.persistence.room.Room;
import android.net.Uri;
+import com.evernote.android.job.JobManager;
import com.jakewharton.picasso.OkHttp3Downloader;
import com.keylesspalace.tusky.db.AppDatabase;
import com.keylesspalace.tusky.util.OkHttpUtils;
@@ -56,5 +57,7 @@ public class TuskyApplication extends Application {
.allowMainThreadQueries()
.addMigrations(AppDatabase.MIGRATION_2_3)
.build();
+
+ JobManager.create(this).addJobCreator(new NotificationPullJobCreator(this));
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/network/AuthInterceptor.java b/app/src/main/java/com/keylesspalace/tusky/network/AuthInterceptor.java
new file mode 100644
index 00000000..1b615027
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/network/AuthInterceptor.java
@@ -0,0 +1,53 @@
+package com.keylesspalace.tusky.network;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.keylesspalace.tusky.R;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+
+/**
+ * Created by charlag on 31/10/17.
+ */
+
+public final class AuthInterceptor implements Interceptor, SharedPreferences.OnSharedPreferenceChangeListener {
+
+ private static final String TOKEN_KEY = "accessToken";
+
+ @Nullable
+ private String token;
+
+ public AuthInterceptor(Context context) {
+ SharedPreferences preferences = context.getSharedPreferences(
+ context.getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
+ token = preferences.getString(TOKEN_KEY, null);
+ preferences.registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public Response intercept(@NonNull Chain chain) throws IOException {
+ Request originalRequest = chain.request();
+
+ Request.Builder builder = originalRequest.newBuilder();
+ if (token != null) {
+ builder.header("Authorization", String.format("Bearer %s", token));
+ }
+ Request newRequest = builder.build();
+
+ return chain.proceed(newRequest);
+ }
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ if (key.equals(TOKEN_KEY)) {
+ token = sharedPreferences.getString(TOKEN_KEY, null);
+ }
+ }
+}
diff --git a/app/src/main/java/com/keylesspalace/tusky/service/PullNotificationService.java b/app/src/main/java/com/keylesspalace/tusky/service/PullNotificationService.java
deleted file mode 100644
index f834001e..00000000
--- a/app/src/main/java/com/keylesspalace/tusky/service/PullNotificationService.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/* Copyright 2017 Andrew Dawson
- *
- * This file is a part of Tusky.
- *
- * This program is free software; you can redistribute it and/or modify it under the terms of the
- * GNU General Public License as published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- * Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with Tusky; if not,
- * see . */
-
-package com.keylesspalace.tusky.service;
-
-import android.app.IntentService;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.support.annotation.NonNull;
-import android.text.Spanned;
-import android.util.Log;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.keylesspalace.tusky.R;
-import com.keylesspalace.tusky.entity.Notification;
-import com.keylesspalace.tusky.json.SpannedTypeAdapter;
-import com.keylesspalace.tusky.network.MastodonApi;
-import com.keylesspalace.tusky.util.OkHttpUtils;
-import com.keylesspalace.tusky.util.NotificationMaker;
-
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import okhttp3.Interceptor;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import retrofit2.Call;
-import retrofit2.Callback;
-import retrofit2.Response;
-import retrofit2.Retrofit;
-import retrofit2.converter.gson.GsonConverterFactory;
-
-public class PullNotificationService extends IntentService {
- public static final int NOTIFY_ID = 6; // This is an arbitrary number.
-
- private MastodonApi mastodonApi;
-
- public PullNotificationService() {
- super("Tusky Pull Notification Service");
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
-
- Log.d("PullNotifications", "pulling for notification");
-
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(
- getApplicationContext());
- boolean enabled = preferences.getBoolean("notificationsEnabled", true);
- if (!enabled) {
- return;
- }
-
- createMastodonApi();
-
- mastodonApi.notifications(null, null, null).enqueue(new Callback>() {
- @Override
- public void onResponse(@NonNull Call> call,
- @NonNull Response> response) {
- if (response.isSuccessful()) {
- onNotificationsReceived(response.body());
- }
- }
-
- @Override
- public void onFailure(@NonNull Call> call, @NonNull Throwable t) {}
- });
- }
-
- private void createMastodonApi() {
- SharedPreferences preferences = getSharedPreferences(
- getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
- final String domain = preferences.getString("domain", null);
- final String accessToken = preferences.getString("accessToken", null);
-
- OkHttpClient okHttpClient = OkHttpUtils.getCompatibleClientBuilder()
- .addInterceptor(new Interceptor() {
- @Override
- public okhttp3.Response intercept(@NonNull Chain chain) throws IOException {
- Request originalRequest = chain.request();
-
- Request.Builder builder = originalRequest.newBuilder()
- .header("Authorization", String.format("Bearer %s", accessToken));
-
- Request newRequest = builder.build();
-
- return chain.proceed(newRequest);
- }
- })
- .build();
-
- Gson gson = new GsonBuilder()
- .registerTypeAdapter(Spanned.class, new SpannedTypeAdapter())
- .create();
-
- Retrofit retrofit = new Retrofit.Builder()
- .baseUrl("https://" + domain)
- .client(okHttpClient)
- .addConverterFactory(GsonConverterFactory.create(gson))
- .build();
-
- mastodonApi = retrofit.create(MastodonApi.class);
- }
-
- private void onNotificationsReceived(List notificationList) {
- SharedPreferences notificationsPreferences = getSharedPreferences(
- "Notifications", Context.MODE_PRIVATE);
- Set currentIds = notificationsPreferences.getStringSet(
- "current_ids", new HashSet());
- for (Notification notification : notificationList) {
- String id = notification.id;
- if (!currentIds.contains(id)) {
- currentIds.add(id);
- NotificationMaker.make(this, NOTIFY_ID, notification);
- }
- }
- notificationsPreferences.edit()
- .putStringSet("current_ids", currentIds)
- .apply();
- }
-}
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
index 8552a0df..94bc69d7 100644
--- a/app/src/main/res/values/array.xml
+++ b/app/src/main/res/values/array.xml
@@ -1,8 +1,6 @@
- - 5 minutes
- - 10 minutes
- 15 minutes
- 20 minutes
- 25 minutes
@@ -13,8 +11,6 @@
- - 5
- - 10
- 15
- 20
- 25