diff --git a/app/build.gradle b/app/build.gradle index 7a33928c1..e0a8d68a4 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 c698ae060..3802c7e88 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 260165665..3bca55638 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 000000000..1b6150276 --- /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 f834001eb..000000000 --- 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 8552a0df2..94bc69d70 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