diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f6bbf47f..01ee2031 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -55,11 +55,14 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java
index 0fcd6ffd..eb81596d 100644
--- a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java
@@ -28,6 +28,7 @@ import android.text.Spanned;
import android.util.TypedValue;
import android.view.Menu;
+import com.google.firebase.iid.FirebaseInstanceId;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -38,6 +39,9 @@ import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
+import okhttp3.ResponseBody;
+import retrofit2.Call;
+import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
@@ -96,6 +100,11 @@ public class BaseActivity extends AppCompatActivity {
return preferences.getString("accessToken", null);
}
+ protected boolean arePushNotificationsEnabled() {
+ SharedPreferences preferences = getSharedPreferences(getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
+ return preferences.getBoolean("notificationsEnabled", true);
+ }
+
protected String getBaseUrl() {
SharedPreferences preferences = getSharedPreferences(getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
return "https://" + preferences.getString("domain", null);
@@ -161,4 +170,32 @@ public class BaseActivity extends AppCompatActivity {
}
return super.onCreateOptionsMenu(menu);
}
+
+ protected void enablePushNotifications() {
+ tuskyAPI.register(getBaseUrl(), getAccessToken(), FirebaseInstanceId.getInstance().getToken()).enqueue(new Callback() {
+ @Override
+ public void onResponse(Call call, retrofit2.Response response) {
+
+ }
+
+ @Override
+ public void onFailure(Call call, Throwable t) {
+
+ }
+ });
+ }
+
+ protected void disablePushNotifications() {
+ tuskyAPI.unregister(getBaseUrl(), getAccessToken()).enqueue(new Callback() {
+ @Override
+ public void onResponse(Call call, retrofit2.Response response) {
+
+ }
+
+ @Override
+ public void onFailure(Call call, Throwable t) {
+
+ }
+ });
+ }
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java b/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java
index 67cf7e56..5f7ef030 100644
--- a/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/LoginActivity.java
@@ -56,10 +56,6 @@ public class LoginActivity extends AppCompatActivity {
@BindView(R.id.button_login) Button button;
@BindView(R.id.no_account) TextView noAccount;
- protected void createMastodonAPI() {
- // Don't do this in this activity, since we don't know a domain yet
- }
-
/**
* Chain together the key-value pairs into a query string, for either appending to a URL or
* as the content of an HTTP request.
diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java
index cd93ca7b..d5240dcb 100644
--- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java
@@ -39,7 +39,6 @@ import android.widget.TextView;
import com.arlib.floatingsearchview.FloatingSearchView;
import com.arlib.floatingsearchview.suggestions.SearchSuggestionsAdapter;
import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion;
-import com.google.firebase.iid.FirebaseInstanceId;
import com.keylesspalace.tusky.entity.Account;
import com.mikepenz.google_material_typeface_library.GoogleMaterial;
import com.mikepenz.materialdrawer.AccountHeader;
@@ -61,7 +60,6 @@ import java.util.Stack;
import butterknife.BindView;
import butterknife.ButterKnife;
-import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@@ -175,17 +173,7 @@ public class MainActivity extends BaseActivity {
}
// Setup push notifications
- tuskyAPI.register(getBaseUrl(), getAccessToken(), FirebaseInstanceId.getInstance().getToken()).enqueue(new Callback() {
- @Override
- public void onResponse(Call call, Response response) {
- Log.d(TAG, "tusky-api reponse: " + response.message());
- }
-
- @Override
- public void onFailure(Call call, Throwable t) {
- Log.d(TAG, "tusky-api failure: " + t.getMessage());
- }
- });
+ if (arePushNotificationsEnabled()) enablePushNotifications();
}
@Override
@@ -277,17 +265,7 @@ public class MainActivity extends BaseActivity {
}
private void logout() {
- tuskyAPI.unregister(getBaseUrl(), getAccessToken()).enqueue(new Callback() {
- @Override
- public void onResponse(Call call, Response response) {
-
- }
-
- @Override
- public void onFailure(Call call, Throwable t) {
-
- }
- });
+ if (arePushNotificationsEnabled()) disablePushNotifications();
SharedPreferences preferences = getSharedPreferences(getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
diff --git a/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java b/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java
index 9455a805..aa934251 100644
--- a/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java
+++ b/app/src/main/java/com/keylesspalace/tusky/MyFirebaseMessagingService.java
@@ -55,6 +55,13 @@ public class MyFirebaseMessagingService extends FirebaseMessagingService {
Log.d(TAG, notificationId);
+ SharedPreferences preferences = getSharedPreferences(getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
+ boolean enabled = preferences.getBoolean("notificationsEnabled", true);
+
+ if (!enabled) {
+ return;
+ }
+
createMastodonAPI();
mastodonAPI.notification(notificationId).enqueue(new Callback() {
@@ -152,9 +159,13 @@ public class MyFirebaseMessagingService extends FirebaseMessagingService {
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
+ Intent deleteIntent = new Intent(this, NotificationClearBroadcastReceiver.class);
+ PendingIntent deletePendingIntent = PendingIntent.getBroadcast(this, 0, deleteIntent, PendingIntent.FLAG_CANCEL_CURRENT);
+
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notify)
.setContentIntent(resultPendingIntent)
+ .setDeleteIntent(deletePendingIntent)
.setDefaults(0); // So it doesn't ring twice, notify only in Target callback
if (currentNotifications.length() == 1) {
diff --git a/app/src/main/java/com/keylesspalace/tusky/NotificationClearBroadcastReceiver.java b/app/src/main/java/com/keylesspalace/tusky/NotificationClearBroadcastReceiver.java
new file mode 100644
index 00000000..fedbb70f
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/NotificationClearBroadcastReceiver.java
@@ -0,0 +1,16 @@
+package com.keylesspalace.tusky;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+
+public class NotificationClearBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ SharedPreferences notificationPreferences = context.getSharedPreferences("Notifications", Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = notificationPreferences.edit();
+ editor.putString("current", "[]");
+ editor.apply();
+ }
+}
diff --git a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.java b/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.java
index 17fd82c7..5664c354 100644
--- a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.java
@@ -68,6 +68,14 @@ public class PreferencesActivity extends BaseActivity
startActivity(intent);
finish();
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
+ } else if (key.equals("notificationsEnabled")) {
+ boolean notificationsEnabled = sharedPreferences.getBoolean("notificationsEnabled", true);
+
+ if (notificationsEnabled) {
+ enablePushNotifications();
+ } else {
+ disablePushNotifications();
+ }
}
}
diff --git a/app/src/main/res/menu/status_more_for_user.xml b/app/src/main/res/menu/status_more_for_user.xml
index ba2936ca..274ce367 100644
--- a/app/src/main/res/menu/status_more_for_user.xml
+++ b/app/src/main/res/menu/status_more_for_user.xml
@@ -1,6 +1,8 @@
\ 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 38ca3db1..1a3c34c3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -133,4 +133,5 @@
%1$s, %2$s, and %3$s
%1$s and %2$s
%d new interactions
+ Push notifications
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index ecd57b22..323a49fd 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -1,23 +1,28 @@
-
+
+
-
-