From 9f40b7281cc6ff7867a45c870070df67c01c0f11 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 27 Apr 2021 12:22:42 +0900 Subject: [PATCH] implement asynchronous login to prevent several common crashes --- app/src/main/AndroidManifest.xml | 4 + .../gramophone/activities/MainActivity.java | 13 +++- .../gramophone/activities/SplashActivity.java | 42 +++-------- .../base/AbsMusicContentActivity.java | 75 +++++++++++++++++++ .../base/AbsMusicPanelActivity.java | 12 --- .../details/AlbumDetailActivity.java | 7 +- .../details/ArtistDetailActivity.java | 7 +- .../details/GenreDetailActivity.java | 7 +- .../details/PlaylistDetailActivity.java | 7 +- .../gramophone/interfaces/StateListener.java | 9 +++ .../gramophone/service/LoginService.java | 73 ++++++++++++++++++ .../service/receivers/NetworkReceiver.java | 24 ++++++ .../gramophone/util/NavigationUtil.java | 8 ++ 13 files changed, 235 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicContentActivity.java create mode 100644 app/src/main/java/com/dkanada/gramophone/interfaces/StateListener.java create mode 100644 app/src/main/java/com/dkanada/gramophone/service/LoginService.java create mode 100644 app/src/main/java/com/dkanada/gramophone/service/receivers/NetworkReceiver.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 90d7078b..4aae60cf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -70,6 +70,10 @@ android:name=".service.MusicService" android:enabled="true" /> + + diff --git a/app/src/main/java/com/dkanada/gramophone/activities/MainActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/MainActivity.java index 41a4ec08..f2e5904f 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/MainActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/MainActivity.java @@ -14,6 +14,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.drawerlayout.widget.DrawerLayout; +import com.dkanada.gramophone.activities.base.AbsMusicContentActivity; import com.dkanada.gramophone.util.NavigationUtil; import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.util.ATHUtil; @@ -26,7 +27,6 @@ import com.dkanada.gramophone.R; import com.dkanada.gramophone.glide.CustomGlideRequest; import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.model.Song; -import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity; import com.dkanada.gramophone.fragments.mainactivity.library.LibraryFragment; import com.dkanada.gramophone.util.MusicUtil; import com.dkanada.gramophone.util.QueryUtil; @@ -36,7 +36,7 @@ import org.jellyfin.apiclient.model.dto.BaseItemDto; import java.util.List; -public class MainActivity extends AbsMusicPanelActivity { +public class MainActivity extends AbsMusicContentActivity { private ActivityMainDrawerLayoutBinding binding; private ActivityMainContentBinding contentBinding; private NavigationDrawerHeaderBinding navigationBinding; @@ -48,15 +48,22 @@ public class MainActivity extends AbsMusicPanelActivity { @Nullable private List libraries; + @Nullable + private Bundle state; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setDrawUnderStatusBar(); + state = savedInstanceState; if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { binding.navigationView.setFitsSystemWindows(false); } + } + @Override + public void onStateOnline() { Menu menu = binding.navigationView.getMenu(); QueryUtil.getLibraries(media -> { libraries = media; @@ -84,7 +91,7 @@ public class MainActivity extends AbsMusicPanelActivity { setUpDrawerLayout(); menu.getItem(0).setChecked(true); - if (savedInstanceState == null) { + if (state == null) { setCurrentFragment(LibraryFragment.newInstance()); } else { restoreCurrentFragment(); diff --git a/app/src/main/java/com/dkanada/gramophone/activities/SplashActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/SplashActivity.java index 83cc604a..05b9132e 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/SplashActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/SplashActivity.java @@ -1,19 +1,18 @@ package com.dkanada.gramophone.activities; -import android.content.Context; +import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import com.dkanada.gramophone.App; import com.dkanada.gramophone.R; import com.dkanada.gramophone.activities.base.AbsBaseActivity; import com.dkanada.gramophone.model.User; +import com.dkanada.gramophone.service.LoginService; import com.dkanada.gramophone.util.NavigationUtil; import com.dkanada.gramophone.util.PreferenceUtil; -import org.jellyfin.apiclient.interaction.EmptyResponse; -import org.jellyfin.apiclient.interaction.Response; -import org.jellyfin.apiclient.model.session.ClientCapabilities; -import org.jellyfin.apiclient.model.system.SystemInfo; +import java.util.List; public class SplashActivity extends AbsBaseActivity { @Override @@ -31,40 +30,23 @@ public class SplashActivity extends AbsBaseActivity { @Override public void onPause() { super.onPause(); - overridePendingTransition(0, R.anim.fade_quick); + overridePendingTransition(0, R.anim.fade_delay); } @Override protected void onResume() { super.onResume(); - Context context = this; User user = App.getDatabase().userDao().getUser(PreferenceUtil.getInstance(this).getUser()); + List available = App.getDatabase().userDao().getUsers(); - if (user == null) { + if (user == null && available.size() != 0) { + NavigationUtil.startSelect(this); + } else if (user == null) { NavigationUtil.startLogin(this); - return; + } else { + startService(new Intent(this, LoginService.class)); + new Handler().postDelayed(() -> NavigationUtil.startMain(this), 1000); } - - App.getApiClient().ChangeServerLocation(user.server); - App.getApiClient().SetAuthenticationInfo(user.token, user.id); - App.getApiClient().GetSystemInfoAsync(new Response() { - @Override - public void onResponse(SystemInfo result) { - ClientCapabilities clientCapabilities = new ClientCapabilities(); - clientCapabilities.setSupportsMediaControl(true); - clientCapabilities.setSupportsPersistentIdentifier(true); - - App.getApiClient().ensureWebSocket(); - App.getApiClient().ReportCapabilities(clientCapabilities, new EmptyResponse()); - - NavigationUtil.startMain(context); - } - - @Override - public void onError(Exception exception) { - NavigationUtil.startLogin(context); - } - }); } } diff --git a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicContentActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicContentActivity.java new file mode 100644 index 00000000..98369fc5 --- /dev/null +++ b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicContentActivity.java @@ -0,0 +1,75 @@ +package com.dkanada.gramophone.activities.base; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.os.Bundle; + +import androidx.annotation.NonNull; + +import com.dkanada.gramophone.App; +import com.dkanada.gramophone.interfaces.StateListener; +import com.dkanada.gramophone.service.LoginService; +import com.dkanada.gramophone.util.NavigationUtil; + +public abstract class AbsMusicContentActivity extends AbsMusicPanelActivity implements StateListener { + private final BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, @NonNull Intent intent) { + if (intent.getAction() == null) return; + + switch(intent.getAction()) { + case LoginService.STATE_ONLINE: + onStateOnline(); + break; + case LoginService.STATE_OFFLINE: + NavigationUtil.startLogin(context); + break; + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + final IntentFilter filter = new IntentFilter(); + filter.addAction(LoginService.STATE_POLLING); + filter.addAction(LoginService.STATE_ONLINE); + filter.addAction(LoginService.STATE_OFFLINE); + + registerReceiver(receiver, filter); + + if (App.getApiClient() == null) { + startService(new Intent(this, LoginService.class)); + } else { + onStateOnline(); + } + } + + @Override + protected void onResume() { + super.onResume(); + + if (App.getApiClient() == null) { + startService(new Intent(this, LoginService.class)); + } + } + + @Override + protected void onDestroy() { + unregisterReceiver(receiver); + + super.onDestroy(); + } + + @Override + public void onStatePolling() { + } + + @Override + public void onStateOffline() { + } +} diff --git a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java index 52c0e6cd..2f35ec69 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/base/AbsMusicPanelActivity.java @@ -1,7 +1,6 @@ package com.dkanada.gramophone.activities.base; import android.animation.ValueAnimator; -import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.view.View; @@ -15,11 +14,9 @@ import androidx.annotation.RequiresApi; import androidx.core.graphics.ColorUtils; import androidx.fragment.app.Fragment; -import com.dkanada.gramophone.App; import com.dkanada.gramophone.R; import com.dkanada.gramophone.databinding.SlidingMusicPanelLayoutBinding; import com.dkanada.gramophone.helper.MusicPlayerRemote; -import com.dkanada.gramophone.activities.SplashActivity; import com.dkanada.gramophone.fragments.player.AbsPlayerFragment; import com.dkanada.gramophone.fragments.player.MiniPlayerFragment; import com.dkanada.gramophone.fragments.player.NowPlayingScreen; @@ -46,15 +43,6 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl super.onCreate(savedInstanceState); setContentView(createContentView()); - // TODO use a fragment for the splash activity - if (App.getApiClient() == null) { - Intent intent = new Intent(this, SplashActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); - startActivity(intent); - finish(); - return; - } - currentNowPlayingScreen = PreferenceUtil.getInstance(this).getNowPlayingScreen(); // must implement AbsPlayerFragment diff --git a/app/src/main/java/com/dkanada/gramophone/activities/details/AlbumDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/details/AlbumDetailActivity.java index ac4f5d9a..7241a711 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/details/AlbumDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/details/AlbumDetailActivity.java @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialdialogs.util.DialogUtils; import com.dkanada.gramophone.BuildConfig; +import com.dkanada.gramophone.activities.base.AbsMusicContentActivity; import com.dkanada.gramophone.databinding.ActivityAlbumDetailBinding; import com.google.android.material.appbar.AppBarLayout; import com.kabouzeid.appthemehelper.util.ColorUtil; @@ -29,7 +30,6 @@ import com.dkanada.gramophone.interfaces.PaletteColorHolder; import com.dkanada.gramophone.model.Album; import com.dkanada.gramophone.model.Artist; import com.dkanada.gramophone.model.Song; -import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity; import com.dkanada.gramophone.util.MusicUtil; import com.dkanada.gramophone.util.NavigationUtil; import com.dkanada.gramophone.util.ThemeUtil; @@ -39,7 +39,7 @@ import org.jellyfin.apiclient.model.querying.ItemQuery; import java.util.List; -public class AlbumDetailActivity extends AbsMusicPanelActivity implements PaletteColorHolder, CabHolder, AppBarLayout.OnOffsetChangedListener { +public class AlbumDetailActivity extends AbsMusicContentActivity implements PaletteColorHolder, CabHolder, AppBarLayout.OnOffsetChangedListener { public static final String EXTRA_ALBUM = BuildConfig.APPLICATION_ID + ".extra.album"; private ActivityAlbumDetailBinding binding; @@ -64,7 +64,10 @@ public class AlbumDetailActivity extends AbsMusicPanelActivity implements Palett loadAlbumCover(album); setAlbum(album); + } + @Override + public void onStateOnline() { ItemQuery query = new ItemQuery(); query.setParentId(album.id); query.setSortBy(new String[]{"ParentIndexNumber", "IndexNumber"}); diff --git a/app/src/main/java/com/dkanada/gramophone/activities/details/ArtistDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/details/ArtistDetailActivity.java index d40bec7e..96c64d81 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/details/ArtistDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/details/ArtistDetailActivity.java @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialdialogs.util.DialogUtils; import com.dkanada.gramophone.BuildConfig; +import com.dkanada.gramophone.activities.base.AbsMusicContentActivity; import com.dkanada.gramophone.adapter.song.SongAdapter; import com.dkanada.gramophone.databinding.ActivityArtistDetailBinding; import com.google.android.material.appbar.AppBarLayout; @@ -30,7 +31,6 @@ import com.dkanada.gramophone.interfaces.CabHolder; import com.dkanada.gramophone.interfaces.PaletteColorHolder; import com.dkanada.gramophone.model.Artist; import com.dkanada.gramophone.model.Song; -import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity; import com.dkanada.gramophone.util.MusicUtil; import com.dkanada.gramophone.util.ThemeUtil; import com.dkanada.gramophone.util.PreferenceUtil; @@ -40,7 +40,7 @@ import org.jellyfin.apiclient.model.querying.ItemQuery; import java.util.List; -public class ArtistDetailActivity extends AbsMusicPanelActivity implements PaletteColorHolder, CabHolder, AppBarLayout.OnOffsetChangedListener { +public class ArtistDetailActivity extends AbsMusicContentActivity implements PaletteColorHolder, CabHolder, AppBarLayout.OnOffsetChangedListener { public static final String EXTRA_ARTIST = BuildConfig.APPLICATION_ID + ".extra.artist"; private ActivityArtistDetailBinding binding; @@ -69,7 +69,10 @@ public class ArtistDetailActivity extends AbsMusicPanelActivity implements Palet loadArtistImage(artist); setArtist(artist); + } + @Override + public void onStateOnline() { ItemQuery albums = new ItemQuery(); albums.setArtistIds(new String[]{artist.id}); diff --git a/app/src/main/java/com/dkanada/gramophone/activities/details/GenreDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/details/GenreDetailActivity.java index a010f22a..e89f93e9 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/details/GenreDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/details/GenreDetailActivity.java @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialcab.MaterialCab; import com.dkanada.gramophone.BuildConfig; +import com.dkanada.gramophone.activities.base.AbsMusicContentActivity; import com.dkanada.gramophone.databinding.ActivityGenreDetailBinding; import com.kabouzeid.appthemehelper.ThemeStore; import com.dkanada.gramophone.R; @@ -18,7 +19,6 @@ import com.dkanada.gramophone.adapter.song.SongAdapter; import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.interfaces.CabHolder; import com.dkanada.gramophone.model.Genre; -import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity; import com.dkanada.gramophone.util.ThemeUtil; import com.dkanada.gramophone.util.QueryUtil; import com.dkanada.gramophone.util.ViewUtil; @@ -28,7 +28,7 @@ import org.jellyfin.apiclient.model.querying.ItemQuery; import java.util.ArrayList; -public class GenreDetailActivity extends AbsMusicPanelActivity implements CabHolder { +public class GenreDetailActivity extends AbsMusicContentActivity implements CabHolder { public static final String EXTRA_GENRE = BuildConfig.APPLICATION_ID + ".extra.genre"; private ActivityGenreDetailBinding binding; @@ -52,7 +52,10 @@ public class GenreDetailActivity extends AbsMusicPanelActivity implements CabHol setUpRecyclerView(); setUpToolBar(); + } + @Override + public void onStateOnline() { ItemQuery query = new ItemQuery(); query.setGenreIds(new String[]{genre.id}); diff --git a/app/src/main/java/com/dkanada/gramophone/activities/details/PlaylistDetailActivity.java b/app/src/main/java/com/dkanada/gramophone/activities/details/PlaylistDetailActivity.java index a940f077..4bfd645b 100644 --- a/app/src/main/java/com/dkanada/gramophone/activities/details/PlaylistDetailActivity.java +++ b/app/src/main/java/com/dkanada/gramophone/activities/details/PlaylistDetailActivity.java @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialcab.MaterialCab; import com.dkanada.gramophone.BuildConfig; +import com.dkanada.gramophone.activities.base.AbsMusicContentActivity; import com.dkanada.gramophone.databinding.ActivityPlaylistDetailBinding; import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator; @@ -26,7 +27,6 @@ import com.dkanada.gramophone.interfaces.CabHolder; import com.dkanada.gramophone.model.Playlist; import com.dkanada.gramophone.model.PlaylistSong; import com.dkanada.gramophone.model.Song; -import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity; import com.dkanada.gramophone.util.ThemeUtil; import com.dkanada.gramophone.util.PlaylistUtil; import com.dkanada.gramophone.util.ViewUtil; @@ -35,7 +35,7 @@ import org.jellyfin.apiclient.model.playlists.PlaylistItemQuery; import java.util.ArrayList; -public class PlaylistDetailActivity extends AbsMusicPanelActivity implements CabHolder { +public class PlaylistDetailActivity extends AbsMusicContentActivity implements CabHolder { public static String EXTRA_PLAYLIST = BuildConfig.APPLICATION_ID + ".extra.playlist"; private ActivityPlaylistDetailBinding binding; @@ -62,7 +62,10 @@ public class PlaylistDetailActivity extends AbsMusicPanelActivity implements Cab setUpRecyclerView(); setUpToolbar(); + } + @Override + public void onStateOnline() { PlaylistItemQuery query = new PlaylistItemQuery(); query.setId(playlist.id); diff --git a/app/src/main/java/com/dkanada/gramophone/interfaces/StateListener.java b/app/src/main/java/com/dkanada/gramophone/interfaces/StateListener.java new file mode 100644 index 00000000..a38a3315 --- /dev/null +++ b/app/src/main/java/com/dkanada/gramophone/interfaces/StateListener.java @@ -0,0 +1,9 @@ +package com.dkanada.gramophone.interfaces; + +public interface StateListener { + void onStatePolling(); + + void onStateOnline(); + + void onStateOffline(); +} diff --git a/app/src/main/java/com/dkanada/gramophone/service/LoginService.java b/app/src/main/java/com/dkanada/gramophone/service/LoginService.java new file mode 100644 index 00000000..90c172b5 --- /dev/null +++ b/app/src/main/java/com/dkanada/gramophone/service/LoginService.java @@ -0,0 +1,73 @@ +package com.dkanada.gramophone.service; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import com.dkanada.gramophone.App; +import com.dkanada.gramophone.BuildConfig; +import com.dkanada.gramophone.R; +import com.dkanada.gramophone.model.User; +import com.dkanada.gramophone.util.PreferenceUtil; + +import org.jellyfin.apiclient.interaction.EmptyResponse; +import org.jellyfin.apiclient.interaction.Response; +import org.jellyfin.apiclient.model.session.ClientCapabilities; +import org.jellyfin.apiclient.model.system.SystemInfo; + +public class LoginService extends Service { + public static final String PACKAGE_NAME = BuildConfig.APPLICATION_ID; + + public static final String STATE_POLLING = PACKAGE_NAME + ".unknown"; + public static final String STATE_ONLINE = PACKAGE_NAME + ".online"; + public static final String STATE_OFFLINE = PACKAGE_NAME + ".offline"; + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + sendBroadcast(new Intent(STATE_POLLING)); + authenticate(); + + return super.onStartCommand(intent, flags, startId); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + private void authenticate() { + User user = App.getDatabase().userDao().getUser(PreferenceUtil.getInstance(this).getUser()); + Context context = this; + + if (user == null) { + Toast.makeText(this, context.getResources().getString(R.string.error_unexpected), Toast.LENGTH_SHORT).show(); + return; + } + + App.getApiClient().ChangeServerLocation(user.server); + App.getApiClient().SetAuthenticationInfo(user.token, user.id); + App.getApiClient().GetSystemInfoAsync(new Response() { + @Override + public void onResponse(SystemInfo result) { + ClientCapabilities clientCapabilities = new ClientCapabilities(); + clientCapabilities.setSupportsMediaControl(true); + clientCapabilities.setSupportsPersistentIdentifier(true); + + App.getApiClient().ensureWebSocket(); + App.getApiClient().ReportCapabilities(clientCapabilities, new EmptyResponse()); + + sendBroadcast(new Intent(STATE_ONLINE)); + } + + @Override + public void onError(Exception exception) { + sendBroadcast(new Intent(STATE_OFFLINE)); + } + }); + } +} diff --git a/app/src/main/java/com/dkanada/gramophone/service/receivers/NetworkReceiver.java b/app/src/main/java/com/dkanada/gramophone/service/receivers/NetworkReceiver.java new file mode 100644 index 00000000..93dc8dec --- /dev/null +++ b/app/src/main/java/com/dkanada/gramophone/service/receivers/NetworkReceiver.java @@ -0,0 +1,24 @@ +package com.dkanada.gramophone.service.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +import com.dkanada.gramophone.service.LoginService; + +public class NetworkReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo netInfo = cm.getActiveNetworkInfo(); + + // network info will be null in airplane mode + if (netInfo != null && netInfo.isConnected()) { + context.sendBroadcast(new Intent(LoginService.STATE_ONLINE)); + } else { + context.sendBroadcast(new Intent(LoginService.STATE_OFFLINE)); + } + } +} diff --git a/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java b/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java index ec835e34..9707c797 100644 --- a/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/dkanada/gramophone/util/NavigationUtil.java @@ -13,6 +13,7 @@ import androidx.core.util.Pair; import com.dkanada.gramophone.activities.LoginActivity; import com.dkanada.gramophone.activities.MainActivity; +import com.dkanada.gramophone.activities.SelectActivity; import com.dkanada.gramophone.model.Album; import com.dkanada.gramophone.model.Artist; import com.dkanada.gramophone.model.Genre; @@ -48,6 +49,13 @@ public class NavigationUtil { context.startActivity(intent); } + public static void startSelect(@NonNull final Context context) { + final Intent intent = new Intent(context, SelectActivity.class); + + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + context.startActivity(intent); + } + public static void startMain(@NonNull final Context context) { final Intent intent = new Intent(context, MainActivity.class);