Add dialog when server is unreachable

This commit is contained in:
CappielloAntonio 2021-09-04 21:14:43 +02:00
parent 652aa1426d
commit 33512eec2d
6 changed files with 141 additions and 2 deletions

View file

@ -3,6 +3,7 @@ package com.cappielloantonio.play.repository;
import android.app.Application; import android.app.Application;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.interfaces.SystemCallback; import com.cappielloantonio.play.interfaces.SystemCallback;
@ -11,6 +12,7 @@ import com.cappielloantonio.play.subsonic.models.SubsonicResponse;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response;
public class SystemRepository { public class SystemRepository {
private static final String TAG = "SongRepository"; private static final String TAG = "SongRepository";
@ -49,4 +51,27 @@ public class SystemRepository {
} }
}); });
} }
public MutableLiveData<Boolean> ping() {
MutableLiveData<Boolean> pingResult = new MutableLiveData<>();
App.getSubsonicClientInstance(application, false)
.getSystemClient()
.ping()
.enqueue(new Callback<SubsonicResponse>() {
@Override
public void onResponse(@NonNull Call<SubsonicResponse> call, @NonNull Response<SubsonicResponse> response) {
if (response.isSuccessful() && response.body() != null) {
pingResult.postValue(true);
}
}
@Override
public void onFailure(@NonNull Call<SubsonicResponse> call, @NonNull Throwable t) {
pingResult.postValue(false);
}
});
return pingResult;
}
} }

View file

@ -3,6 +3,7 @@ package com.cappielloantonio.play.ui.activity;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -21,6 +22,8 @@ import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.ui.activity.base.BaseActivity; import com.cappielloantonio.play.ui.activity.base.BaseActivity;
import com.cappielloantonio.play.ui.fragment.PlayerBottomSheetFragment; 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.util.PreferenceUtil;
import com.cappielloantonio.play.viewmodel.MainViewModel; import com.cappielloantonio.play.viewmodel.MainViewModel;
import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomnavigation.BottomNavigationView;
@ -58,6 +61,12 @@ public class MainActivity extends BaseActivity {
init(); init();
} }
@Override
protected void onResume() {
super.onResume();
pingServer();
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
@ -187,6 +196,8 @@ public class MainActivity extends BaseActivity {
navController.navigate(R.id.action_landingFragment_to_loginFragment); navController.navigate(R.id.action_landingFragment_to_loginFragment);
} else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.settingsFragment) { } else if (Objects.requireNonNull(navController.getCurrentDestination()).getId() == R.id.settingsFragment) {
navController.navigate(R.id.action_settingsFragment_to_loginFragment); 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); 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);
}
});
}
}
} }

View file

@ -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();
});
}
}

View file

@ -4,21 +4,31 @@ import android.app.Application;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SystemRepository;
public class MainViewModel extends AndroidViewModel { public class MainViewModel extends AndroidViewModel {
private static final String TAG = "SearchViewModel"; private static final String TAG = "SearchViewModel";
private final SystemRepository systemRepository;
private final Application application; private final Application application;
public MainViewModel(@NonNull Application application) { public MainViewModel(@NonNull Application application) {
super(application); super(application);
this.application = application; this.application = application;
systemRepository = new SystemRepository(application);
} }
public boolean isQueueLoaded() { public boolean isQueueLoaded() {
QueueRepository queueRepository = new QueueRepository(application); QueueRepository queueRepository = new QueueRepository(application);
return queueRepository.count() != 0; return queueRepository.count() != 0;
} }
public LiveData<Boolean> ping() {
return systemRepository.ping();
}
} }

View file

@ -0,0 +1,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="aaaaaa" />
</LinearLayout>

View file

@ -4,7 +4,6 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph" android:id="@+id/nav_graph"
app:startDestination="@id/landingFragment"> app:startDestination="@id/landingFragment">
<fragment <fragment
android:id="@+id/landingFragment" android:id="@+id/landingFragment"
android:name="com.cappielloantonio.play.ui.fragment.LandingFragment" android:name="com.cappielloantonio.play.ui.fragment.LandingFragment"
@ -21,7 +20,6 @@
app:popUpTo="@id/landingFragment" app:popUpTo="@id/landingFragment"
app:popUpToInclusive="true" /> app:popUpToInclusive="true" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/loginFragment" android:id="@+id/loginFragment"
android:name="com.cappielloantonio.play.ui.fragment.LoginFragment" android:name="com.cappielloantonio.play.ui.fragment.LoginFragment"
@ -38,6 +36,11 @@
android:name="com.cappielloantonio.play.ui.fragment.HomeFragment" android:name="com.cappielloantonio.play.ui.fragment.HomeFragment"
android:label="HomeFragment" android:label="HomeFragment"
tools:layout="@layout/fragment_home"> tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_homeFragment_to_loginFragment"
app:destination="@id/loginFragment"
app:popUpTo="@id/homeFragment"
app:popUpToInclusive="true" />
<action <action
android:id="@+id/action_homeFragment_to_songListPageFragment" android:id="@+id/action_homeFragment_to_songListPageFragment"
app:destination="@id/songListPageFragment" /> app:destination="@id/songListPageFragment" />