2017-02-16 19:52:55 +01:00
|
|
|
/* Copyright 2017 Andrew Dawson
|
|
|
|
*
|
2017-04-10 02:12:31 +02:00
|
|
|
* This file is a part of Tusky.
|
2017-02-16 19:52:55 +01:00
|
|
|
*
|
2017-04-10 02:12:31 +02:00
|
|
|
* 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.
|
2017-02-16 19:52:55 +01:00
|
|
|
*
|
|
|
|
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
2017-04-10 02:12:31 +02:00
|
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
|
|
* Public License for more details.
|
2017-02-16 19:52:55 +01:00
|
|
|
*
|
2017-04-10 02:12:31 +02:00
|
|
|
* You should have received a copy of the GNU General Public License along with Tusky; if not,
|
|
|
|
* see <http://www.gnu.org/licenses>. */
|
2017-02-16 19:52:55 +01:00
|
|
|
|
|
|
|
package com.keylesspalace.tusky;
|
|
|
|
|
2017-04-28 05:29:42 +02:00
|
|
|
import android.app.AlarmManager;
|
|
|
|
import android.app.PendingIntent;
|
2017-03-08 22:34:13 +01:00
|
|
|
import android.content.Context;
|
2017-03-07 13:05:51 +01:00
|
|
|
import android.content.Intent;
|
2017-03-08 22:34:13 +01:00
|
|
|
import android.content.SharedPreferences;
|
2017-02-16 19:52:55 +01:00
|
|
|
import android.graphics.Color;
|
|
|
|
import android.graphics.PorterDuff;
|
|
|
|
import android.graphics.drawable.Drawable;
|
|
|
|
import android.os.Bundle;
|
2017-04-28 05:29:42 +02:00
|
|
|
import android.os.SystemClock;
|
2017-03-20 03:38:39 +01:00
|
|
|
import android.preference.PreferenceManager;
|
2017-02-16 19:52:55 +01:00
|
|
|
import android.support.annotation.Nullable;
|
|
|
|
import android.support.v7.app.AppCompatActivity;
|
2017-03-08 23:19:03 +01:00
|
|
|
import android.text.Spanned;
|
2017-02-16 19:52:55 +01:00
|
|
|
import android.util.TypedValue;
|
|
|
|
import android.view.Menu;
|
|
|
|
|
2017-03-15 23:45:59 +01:00
|
|
|
import com.google.firebase.iid.FirebaseInstanceId;
|
2017-03-08 23:19:03 +01:00
|
|
|
import com.google.gson.Gson;
|
|
|
|
import com.google.gson.GsonBuilder;
|
|
|
|
|
2017-03-08 22:34:13 +01:00
|
|
|
import java.io.IOException;
|
|
|
|
|
2017-03-15 01:34:27 +01:00
|
|
|
import okhttp3.Dispatcher;
|
2017-03-08 22:34:13 +01:00
|
|
|
import okhttp3.Interceptor;
|
|
|
|
import okhttp3.OkHttpClient;
|
|
|
|
import okhttp3.Request;
|
|
|
|
import okhttp3.Response;
|
2017-03-15 23:45:59 +01:00
|
|
|
import okhttp3.ResponseBody;
|
|
|
|
import retrofit2.Call;
|
|
|
|
import retrofit2.Callback;
|
2017-03-08 22:34:13 +01:00
|
|
|
import retrofit2.Retrofit;
|
|
|
|
import retrofit2.converter.gson.GsonConverterFactory;
|
|
|
|
|
2017-02-16 19:52:55 +01:00
|
|
|
public class BaseActivity extends AppCompatActivity {
|
2017-03-20 03:38:39 +01:00
|
|
|
private static final String TAG = "BaseActivity"; // logging tag
|
|
|
|
|
2017-03-08 22:34:13 +01:00
|
|
|
protected MastodonAPI mastodonAPI;
|
2017-03-12 08:31:20 +01:00
|
|
|
protected TuskyAPI tuskyAPI;
|
2017-03-15 01:34:27 +01:00
|
|
|
protected Dispatcher mastodonApiDispatcher;
|
2017-04-28 05:29:42 +02:00
|
|
|
protected PendingIntent serviceAlarmIntent;
|
2017-03-08 22:34:13 +01:00
|
|
|
|
2017-02-16 19:52:55 +01:00
|
|
|
@Override
|
|
|
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
2017-03-09 00:27:37 +01:00
|
|
|
|
2017-04-05 21:10:52 +02:00
|
|
|
redirectIfNotLoggedIn();
|
2017-03-09 00:27:37 +01:00
|
|
|
createMastodonAPI();
|
2017-03-12 08:31:20 +01:00
|
|
|
createTuskyAPI();
|
2017-03-09 00:27:37 +01:00
|
|
|
|
2017-04-28 05:29:42 +02:00
|
|
|
/* There isn't presently a way to globally change the theme of a whole application at
|
|
|
|
* runtime, just individual activities. So, each activity has to set its theme before any
|
|
|
|
* views are created. */
|
2017-02-16 19:52:55 +01:00
|
|
|
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("lightTheme", false)) {
|
|
|
|
setTheme(R.style.AppTheme_Light);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-15 01:34:27 +01:00
|
|
|
@Override
|
|
|
|
protected void onDestroy() {
|
2017-03-15 20:32:26 +01:00
|
|
|
if(mastodonApiDispatcher != null) mastodonApiDispatcher.cancelAll();
|
2017-03-15 01:34:27 +01:00
|
|
|
super.onDestroy();
|
|
|
|
}
|
|
|
|
|
2017-03-07 13:05:51 +01:00
|
|
|
@Override
|
|
|
|
public void finish() {
|
|
|
|
super.finish();
|
|
|
|
overridePendingTransitionExit();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void startActivity(Intent intent) {
|
|
|
|
super.startActivity(intent);
|
|
|
|
overridePendingTransitionEnter();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void overridePendingTransitionEnter() {
|
|
|
|
overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void overridePendingTransitionExit() {
|
|
|
|
overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);
|
|
|
|
}
|
|
|
|
|
2017-04-21 00:56:36 +02:00
|
|
|
protected SharedPreferences getPrivatePreferences() {
|
|
|
|
return getSharedPreferences(getString(R.string.preferences_file_key), Context.MODE_PRIVATE);
|
|
|
|
}
|
|
|
|
|
2017-03-08 22:34:13 +01:00
|
|
|
protected String getAccessToken() {
|
2017-04-21 00:56:36 +02:00
|
|
|
SharedPreferences preferences = getPrivatePreferences();
|
2017-03-08 22:34:13 +01:00
|
|
|
return preferences.getString("accessToken", null);
|
|
|
|
}
|
|
|
|
|
2017-03-15 23:45:59 +01:00
|
|
|
protected boolean arePushNotificationsEnabled() {
|
2017-03-20 03:38:39 +01:00
|
|
|
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
2017-03-15 23:45:59 +01:00
|
|
|
return preferences.getBoolean("notificationsEnabled", true);
|
|
|
|
}
|
|
|
|
|
2017-03-08 22:34:13 +01:00
|
|
|
protected String getBaseUrl() {
|
2017-04-21 00:56:36 +02:00
|
|
|
SharedPreferences preferences = getPrivatePreferences();
|
2017-03-08 22:34:13 +01:00
|
|
|
return "https://" + preferences.getString("domain", null);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void createMastodonAPI() {
|
2017-03-15 01:34:27 +01:00
|
|
|
mastodonApiDispatcher = new Dispatcher();
|
|
|
|
|
2017-03-08 23:19:03 +01:00
|
|
|
Gson gson = new GsonBuilder()
|
|
|
|
.registerTypeAdapter(Spanned.class, new SpannedTypeAdapter())
|
2017-04-26 00:31:27 +02:00
|
|
|
.registerTypeAdapter(StringWithEmoji.class, new StringWithEmojiTypeAdapter())
|
2017-03-08 23:19:03 +01:00
|
|
|
.create();
|
|
|
|
|
2017-04-11 23:07:56 +02:00
|
|
|
OkHttpClient okHttpClient = OkHttpUtils.getCompatibleClientBuilder()
|
2017-03-08 22:34:13 +01:00
|
|
|
.addInterceptor(new Interceptor() {
|
|
|
|
@Override
|
|
|
|
public Response intercept(Chain chain) throws IOException {
|
|
|
|
Request originalRequest = chain.request();
|
|
|
|
|
2017-03-10 03:55:07 +01:00
|
|
|
Request.Builder builder = originalRequest.newBuilder();
|
|
|
|
String accessToken = getAccessToken();
|
|
|
|
if (accessToken != null) {
|
2017-04-11 23:07:56 +02:00
|
|
|
builder.header("Authorization", String.format("Bearer %s",
|
|
|
|
accessToken));
|
2017-03-10 03:55:07 +01:00
|
|
|
}
|
2017-03-08 22:34:13 +01:00
|
|
|
Request newRequest = builder.build();
|
|
|
|
|
|
|
|
return chain.proceed(newRequest);
|
|
|
|
}
|
|
|
|
})
|
2017-03-15 01:34:27 +01:00
|
|
|
.dispatcher(mastodonApiDispatcher)
|
2017-03-08 22:34:13 +01:00
|
|
|
.build();
|
|
|
|
|
|
|
|
Retrofit retrofit = new Retrofit.Builder()
|
|
|
|
.baseUrl(getBaseUrl())
|
|
|
|
.client(okHttpClient)
|
2017-03-08 23:19:03 +01:00
|
|
|
.addConverterFactory(GsonConverterFactory.create(gson))
|
2017-03-08 22:34:13 +01:00
|
|
|
.build();
|
|
|
|
|
|
|
|
mastodonAPI = retrofit.create(MastodonAPI.class);
|
|
|
|
}
|
|
|
|
|
2017-03-12 08:31:20 +01:00
|
|
|
protected void createTuskyAPI() {
|
2017-04-28 05:29:42 +02:00
|
|
|
if (BuildConfig.USES_PUSH_NOTIFICATIONS) {
|
|
|
|
Retrofit retrofit = new Retrofit.Builder()
|
|
|
|
.baseUrl(getString(R.string.tusky_api_url))
|
|
|
|
.client(OkHttpUtils.getCompatibleClient())
|
|
|
|
.build();
|
2017-03-12 08:31:20 +01:00
|
|
|
|
2017-04-28 05:29:42 +02:00
|
|
|
tuskyAPI = retrofit.create(TuskyAPI.class);
|
|
|
|
}
|
2017-03-12 08:31:20 +01:00
|
|
|
}
|
|
|
|
|
2017-04-05 21:10:52 +02:00
|
|
|
protected void redirectIfNotLoggedIn() {
|
2017-04-21 00:56:36 +02:00
|
|
|
SharedPreferences preferences = getPrivatePreferences();
|
2017-04-05 21:10:52 +02:00
|
|
|
String domain = preferences.getString("domain", null);
|
|
|
|
String accessToken = preferences.getString("accessToken", null);
|
2017-04-05 22:35:22 +02:00
|
|
|
if (domain == null || accessToken == null) {
|
|
|
|
Intent intent = new Intent(this, LoginActivity.class);
|
2017-04-05 21:10:52 +02:00
|
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
|
startActivity(intent);
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-16 19:52:55 +01:00
|
|
|
@Override
|
|
|
|
public boolean onCreateOptionsMenu(Menu menu) {
|
|
|
|
TypedValue value = new TypedValue();
|
|
|
|
int color;
|
|
|
|
if (getTheme().resolveAttribute(R.attr.toolbar_icon_tint, value, true)) {
|
|
|
|
color = value.data;
|
|
|
|
} else {
|
|
|
|
color = Color.WHITE;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < menu.size(); i++) {
|
|
|
|
Drawable icon = menu.getItem(i).getIcon();
|
|
|
|
if (icon != null) {
|
|
|
|
icon.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return super.onCreateOptionsMenu(menu);
|
|
|
|
}
|
2017-03-15 23:45:59 +01:00
|
|
|
|
|
|
|
protected void enablePushNotifications() {
|
2017-04-28 05:29:42 +02:00
|
|
|
if (BuildConfig.USES_PUSH_NOTIFICATIONS) {
|
|
|
|
tuskyAPI.register(getBaseUrl(), getAccessToken(), FirebaseInstanceId.getInstance().getToken()).enqueue(new Callback<ResponseBody>() {
|
|
|
|
@Override
|
|
|
|
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
|
|
|
|
Log.d(TAG, "Enable push notifications response: " + response.message());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onFailure(Call<ResponseBody> call, Throwable t) {
|
|
|
|
Log.d(TAG, "Enable push notifications failed: " + t.getMessage());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
// Start up the MessagingService on a repeating interval for "pull" notifications.
|
|
|
|
long checkInterval = 60 * 1000; // * 10;
|
|
|
|
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
|
|
|
|
Intent intent = new Intent(this, MessagingService.class);
|
|
|
|
final int SERVICE_REQUEST_CODE = 8574603; // This number is arbitrary.
|
|
|
|
serviceAlarmIntent = PendingIntent.getService(this, SERVICE_REQUEST_CODE, intent,
|
|
|
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
|
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
|
|
|
SystemClock.elapsedRealtime(), checkInterval, serviceAlarmIntent);
|
|
|
|
}
|
2017-03-15 23:45:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void disablePushNotifications() {
|
2017-04-28 05:29:42 +02:00
|
|
|
if (BuildConfig.USES_PUSH_NOTIFICATIONS) {
|
|
|
|
tuskyAPI.unregister(getBaseUrl(), getAccessToken()).enqueue(new Callback<ResponseBody>() {
|
|
|
|
@Override
|
|
|
|
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
|
|
|
|
Log.d(TAG, "Disable push notifications response: " + response.message());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onFailure(Call<ResponseBody> call, Throwable t) {
|
|
|
|
Log.d(TAG, "Disable push notifications failed: " + t.getMessage());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else if (serviceAlarmIntent != null) {
|
|
|
|
// Cancel the repeating call for "pull" notifications.
|
|
|
|
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
|
|
|
|
alarmManager.cancel(serviceAlarmIntent);
|
|
|
|
}
|
2017-03-15 23:45:59 +01:00
|
|
|
}
|
2017-02-16 19:52:55 +01:00
|
|
|
}
|