From 33512eec2d35778536da8f783f6f23f9a9e14e58 Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Sat, 4 Sep 2021 21:14:43 +0200 Subject: [PATCH] Add dialog when server is unreachable --- .../play/repository/SystemRepository.java | 25 +++++++ .../play/ui/activity/MainActivity.java | 22 ++++++ .../dialog/ServerUnreachableDialog.java | 68 +++++++++++++++++++ .../play/viewmodel/MainViewModel.java | 10 +++ .../res/layout/dialog_server_unreachable.xml | 11 +++ app/src/main/res/navigation/nav_graph.xml | 7 +- 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/ServerUnreachableDialog.java create mode 100644 app/src/main/res/layout/dialog_server_unreachable.xml diff --git a/app/src/main/java/com/cappielloantonio/play/repository/SystemRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SystemRepository.java index 32301a97..feecc53c 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SystemRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SystemRepository.java @@ -3,6 +3,7 @@ package com.cappielloantonio.play.repository; import android.app.Application; import androidx.annotation.NonNull; +import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; import com.cappielloantonio.play.interfaces.SystemCallback; @@ -11,6 +12,7 @@ import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import retrofit2.Call; import retrofit2.Callback; +import retrofit2.Response; public class SystemRepository { private static final String TAG = "SongRepository"; @@ -49,4 +51,27 @@ public class SystemRepository { } }); } + + public MutableLiveData ping() { + MutableLiveData pingResult = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getSystemClient() + .ping() + .enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.isSuccessful() && response.body() != null) { + pingResult.postValue(true); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + pingResult.postValue(false); + } + }); + + return pingResult; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/activity/MainActivity.java b/app/src/main/java/com/cappielloantonio/play/ui/activity/MainActivity.java index 963db2da..ac0a1a31 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/activity/MainActivity.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/activity/MainActivity.java @@ -3,6 +3,7 @@ package com.cappielloantonio.play.ui.activity; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Bundle; +import android.util.Log; import android.view.View; import androidx.annotation.NonNull; @@ -21,6 +22,8 @@ import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.base.BaseActivity; import com.cappielloantonio.play.ui.fragment.PlayerBottomSheetFragment; +import com.cappielloantonio.play.ui.fragment.dialog.PlaylistEditorDialog; +import com.cappielloantonio.play.ui.fragment.dialog.ServerUnreachableDialog; import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.MainViewModel; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -58,6 +61,12 @@ public class MainActivity extends BaseActivity { init(); } + @Override + protected void onResume() { + super.onResume(); + pingServer(); + } + @Override protected void onDestroy() { super.onDestroy(); @@ -187,6 +196,8 @@ public class MainActivity extends BaseActivity { navController.navigate(R.id.action_landingFragment_to_loginFragment); } else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.settingsFragment) { navController.navigate(R.id.action_settingsFragment_to_loginFragment); + } else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.homeFragment) { + navController.navigate(R.id.action_homeFragment_to_loginFragment); } } @@ -235,4 +246,15 @@ public class MainActivity extends BaseActivity { unregisterReceiver(connectivityStatusBroadcastReceiver); } } + + private void pingServer() { + if (PreferenceUtil.getInstance(this).getToken() != null) { + mainViewModel.ping().observe(this, isPingSuccessfull -> { + if(!isPingSuccessfull) { + ServerUnreachableDialog dialog = new ServerUnreachableDialog(); + dialog.show(getSupportFragmentManager(), null); + } + }); + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/ServerUnreachableDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/ServerUnreachableDialog.java new file mode 100644 index 00000000..67a66e54 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/dialog/ServerUnreachableDialog.java @@ -0,0 +1,68 @@ +package com.cappielloantonio.play.ui.fragment.dialog; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.os.Bundle; +import android.view.LayoutInflater; + +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.navigation.NavOptions; +import androidx.navigation.fragment.NavHostFragment; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.databinding.DialogServerUnreachableBinding; +import com.cappielloantonio.play.ui.activity.MainActivity; + +import java.util.Objects; + +public class ServerUnreachableDialog extends DialogFragment { + private static final String TAG = "ServerUnreachableDialog"; + + private DialogServerUnreachableBinding bind; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + bind = DialogServerUnreachableBinding.inflate(LayoutInflater.from(requireContext())); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_AlertDialog); + + builder.setView(bind.getRoot()) + .setTitle(R.string.server_unreachable_dialog_title) + .setPositiveButton(R.string.server_unreachable_dialog_positive_button, (dialog, id) -> dialog.cancel()) + .setNeutralButton(R.string.server_unreachable_dialog_neutral_button, (dialog, id) -> { }) + .setNegativeButton(R.string.server_unreachable_dialog_negative_button, (dialog, id) -> dialog.cancel()); + + return builder.create(); + } + + @Override + public void onStart() { + super.onStart(); + + setButtonAction(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void setButtonAction() { + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.colorAccent, null)); + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorAccent, null)); + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorAccent, null)); + + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + + if (activity != null) { + activity.goToLogin(); + } + + Objects.requireNonNull(getDialog()).dismiss(); + }); + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/MainViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/MainViewModel.java index 93d4fc3e..f845ac00 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/MainViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/MainViewModel.java @@ -4,21 +4,31 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.repository.SystemRepository; public class MainViewModel extends AndroidViewModel { private static final String TAG = "SearchViewModel"; + private final SystemRepository systemRepository; + private final Application application; public MainViewModel(@NonNull Application application) { super(application); this.application = application; + + systemRepository = new SystemRepository(application); } public boolean isQueueLoaded() { QueueRepository queueRepository = new QueueRepository(application); return queueRepository.count() != 0; } + + public LiveData ping() { + return systemRepository.ping(); + } } diff --git a/app/src/main/res/layout/dialog_server_unreachable.xml b/app/src/main/res/layout/dialog_server_unreachable.xml new file mode 100644 index 00000000..3db49515 --- /dev/null +++ b/app/src/main/res/layout/dialog_server_unreachable.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 1976f35f..4343cc4e 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_graph" app:startDestination="@id/landingFragment"> - - +