Add init activity

This commit is contained in:
Jannis Mattheis
2018-11-02 13:56:30 +01:00
parent 356ac2ae68
commit 296ba0d669
2 changed files with 149 additions and 0 deletions

View File

@@ -0,0 +1,125 @@
package com.github.gotify.init;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import com.github.gotify.NotificationSupport;
import com.github.gotify.R;
import com.github.gotify.Settings;
import com.github.gotify.api.Api;
import com.github.gotify.api.Callback;
import com.github.gotify.api.ClientFactory;
import com.github.gotify.client.ApiException;
import com.github.gotify.client.api.VersionApi;
import com.github.gotify.client.model.User;
import com.github.gotify.client.model.VersionInfo;
import com.github.gotify.log.Log;
import com.github.gotify.log.UncaughtExceptionHandler;
import com.github.gotify.login.LoginActivity;
import com.github.gotify.messages.MessagesActivity;
import com.github.gotify.service.WebSocketService;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
public class InitializationActivity extends AppCompatActivity {
private Settings settings;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.init(this);
setContentView(R.layout.splash);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationSupport.createChannels(
(NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE));
}
UncaughtExceptionHandler.registerCurrentThread();
settings = new Settings(this);
Log.i("Entering " + getClass().getSimpleName());
if (settings.tokenExists()) {
tryAuthenticate();
} else {
showLogin();
}
}
private void showLogin() {
startActivity(new Intent(this, LoginActivity.class));
finish();
}
private void tryAuthenticate() {
Api.withLogging(ClientFactory.userApiWithToken(settings)::currentUserAsync)
.handleInUIThread(this, this::authenticated, this::failed);
}
private void failed(ApiException exception) {
if (exception.getCode() == 0) {
dialog(getString(R.string.not_available, settings.url()));
return;
}
if (exception.getCode() == 401) {
dialog(getString(R.string.auth_failed));
return;
}
String response = exception.getResponseBody();
response = response.substring(0, Math.min(200, response.length()));
dialog(getString(R.string.other_error, settings.url(), exception.getCode(), response));
}
private void dialog(String message) {
new AlertDialog.Builder(this)
.setTitle(R.string.oops)
.setMessage(message)
.setPositiveButton(R.string.retry, (a, b) -> tryAuthenticate())
.setNegativeButton(R.string.logout, (a, b) -> showLogin())
.show();
}
private void authenticated(User user) {
Log.i("Authenticated as " + user.getName());
settings.user(user.getName(), user.isAdmin());
requestVersion(
() -> {
startActivity(new Intent(this, MessagesActivity.class));
finish();
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(new Intent(this, WebSocketService.class));
} else {
startService(new Intent(this, WebSocketService.class));
}
}
private void requestVersion(Runnable runnable) {
requestVersion(
(version) -> {
Log.i("Server version: " + version.getVersion() + "@" + version.getBuildDate());
settings.serverVersion(version.getVersion());
runnable.run();
},
(e) -> {
runnable.run();
});
}
private void requestVersion(
final Callback.SuccessCallback<VersionInfo> callback,
final Callback.ErrorCallback errorCallback) {
VersionApi versionApi = ClientFactory.versionApi(settings.url());
Api.withLogging(versionApi::getVersionAsync)
.handleInUIThread(this, callback, errorCallback);
}
}