diff --git a/app/src/main/java/com/github/gotify/init/InitializationActivity.java b/app/src/main/java/com/github/gotify/init/InitializationActivity.java new file mode 100644 index 0000000..7acaa70 --- /dev/null +++ b/app/src/main/java/com/github/gotify/init/InitializationActivity.java @@ -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 callback, + final Callback.ErrorCallback errorCallback) { + VersionApi versionApi = ClientFactory.versionApi(settings.url()); + Api.withLogging(versionApi::getVersionAsync) + .handleInUIThread(this, callback, errorCallback); + } +} diff --git a/app/src/main/res/layout/splash.xml b/app/src/main/res/layout/splash.xml new file mode 100644 index 0000000..758cf40 --- /dev/null +++ b/app/src/main/res/layout/splash.xml @@ -0,0 +1,24 @@ + + + + + +