implement asynchronous login to prevent several common crashes
This commit is contained in:
parent
b814311804
commit
9f40b7281c
13 changed files with 235 additions and 53 deletions
|
|
@ -70,6 +70,10 @@
|
||||||
android:name=".service.MusicService"
|
android:name=".service.MusicService"
|
||||||
android:enabled="true" />
|
android:enabled="true" />
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".service.LoginService"
|
||||||
|
android:enabled="true" />
|
||||||
|
|
||||||
<receiver android:name=".service.MediaButtonIntentReceiver">
|
<receiver android:name=".service.MediaButtonIntentReceiver">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.drawerlayout.widget.DrawerLayout;
|
import androidx.drawerlayout.widget.DrawerLayout;
|
||||||
|
|
||||||
|
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||||
import com.dkanada.gramophone.util.NavigationUtil;
|
import com.dkanada.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.appthemehelper.ThemeStore;
|
import com.kabouzeid.appthemehelper.ThemeStore;
|
||||||
import com.kabouzeid.appthemehelper.util.ATHUtil;
|
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.glide.CustomGlideRequest;
|
||||||
import com.dkanada.gramophone.helper.MusicPlayerRemote;
|
import com.dkanada.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.dkanada.gramophone.model.Song;
|
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.fragments.mainactivity.library.LibraryFragment;
|
||||||
import com.dkanada.gramophone.util.MusicUtil;
|
import com.dkanada.gramophone.util.MusicUtil;
|
||||||
import com.dkanada.gramophone.util.QueryUtil;
|
import com.dkanada.gramophone.util.QueryUtil;
|
||||||
|
|
@ -36,7 +36,7 @@ import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MainActivity extends AbsMusicPanelActivity {
|
public class MainActivity extends AbsMusicContentActivity {
|
||||||
private ActivityMainDrawerLayoutBinding binding;
|
private ActivityMainDrawerLayoutBinding binding;
|
||||||
private ActivityMainContentBinding contentBinding;
|
private ActivityMainContentBinding contentBinding;
|
||||||
private NavigationDrawerHeaderBinding navigationBinding;
|
private NavigationDrawerHeaderBinding navigationBinding;
|
||||||
|
|
@ -48,15 +48,22 @@ public class MainActivity extends AbsMusicPanelActivity {
|
||||||
@Nullable
|
@Nullable
|
||||||
private List<BaseItemDto> libraries;
|
private List<BaseItemDto> libraries;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Bundle state;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setDrawUnderStatusBar();
|
setDrawUnderStatusBar();
|
||||||
|
|
||||||
|
state = savedInstanceState;
|
||||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
|
||||||
binding.navigationView.setFitsSystemWindows(false);
|
binding.navigationView.setFitsSystemWindows(false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStateOnline() {
|
||||||
Menu menu = binding.navigationView.getMenu();
|
Menu menu = binding.navigationView.getMenu();
|
||||||
QueryUtil.getLibraries(media -> {
|
QueryUtil.getLibraries(media -> {
|
||||||
libraries = media;
|
libraries = media;
|
||||||
|
|
@ -84,7 +91,7 @@ public class MainActivity extends AbsMusicPanelActivity {
|
||||||
setUpDrawerLayout();
|
setUpDrawerLayout();
|
||||||
|
|
||||||
menu.getItem(0).setChecked(true);
|
menu.getItem(0).setChecked(true);
|
||||||
if (savedInstanceState == null) {
|
if (state == null) {
|
||||||
setCurrentFragment(LibraryFragment.newInstance());
|
setCurrentFragment(LibraryFragment.newInstance());
|
||||||
} else {
|
} else {
|
||||||
restoreCurrentFragment();
|
restoreCurrentFragment();
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,18 @@
|
||||||
package com.dkanada.gramophone.activities;
|
package com.dkanada.gramophone.activities;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
|
||||||
import com.dkanada.gramophone.App;
|
import com.dkanada.gramophone.App;
|
||||||
import com.dkanada.gramophone.R;
|
import com.dkanada.gramophone.R;
|
||||||
import com.dkanada.gramophone.activities.base.AbsBaseActivity;
|
import com.dkanada.gramophone.activities.base.AbsBaseActivity;
|
||||||
import com.dkanada.gramophone.model.User;
|
import com.dkanada.gramophone.model.User;
|
||||||
|
import com.dkanada.gramophone.service.LoginService;
|
||||||
import com.dkanada.gramophone.util.NavigationUtil;
|
import com.dkanada.gramophone.util.NavigationUtil;
|
||||||
import com.dkanada.gramophone.util.PreferenceUtil;
|
import com.dkanada.gramophone.util.PreferenceUtil;
|
||||||
|
|
||||||
import org.jellyfin.apiclient.interaction.EmptyResponse;
|
import java.util.List;
|
||||||
import org.jellyfin.apiclient.interaction.Response;
|
|
||||||
import org.jellyfin.apiclient.model.session.ClientCapabilities;
|
|
||||||
import org.jellyfin.apiclient.model.system.SystemInfo;
|
|
||||||
|
|
||||||
public class SplashActivity extends AbsBaseActivity {
|
public class SplashActivity extends AbsBaseActivity {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -31,40 +30,23 @@ public class SplashActivity extends AbsBaseActivity {
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
overridePendingTransition(0, R.anim.fade_quick);
|
overridePendingTransition(0, R.anim.fade_delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
Context context = this;
|
|
||||||
User user = App.getDatabase().userDao().getUser(PreferenceUtil.getInstance(this).getUser());
|
User user = App.getDatabase().userDao().getUser(PreferenceUtil.getInstance(this).getUser());
|
||||||
|
List<User> available = App.getDatabase().userDao().getUsers();
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null && available.size() != 0) {
|
||||||
|
NavigationUtil.startSelect(this);
|
||||||
|
} else if (user == null) {
|
||||||
NavigationUtil.startLogin(this);
|
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<SystemInfo>() {
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.dkanada.gramophone.activities.base;
|
package com.dkanada.gramophone.activities.base;
|
||||||
|
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
@ -15,11 +14,9 @@ import androidx.annotation.RequiresApi;
|
||||||
import androidx.core.graphics.ColorUtils;
|
import androidx.core.graphics.ColorUtils;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import com.dkanada.gramophone.App;
|
|
||||||
import com.dkanada.gramophone.R;
|
import com.dkanada.gramophone.R;
|
||||||
import com.dkanada.gramophone.databinding.SlidingMusicPanelLayoutBinding;
|
import com.dkanada.gramophone.databinding.SlidingMusicPanelLayoutBinding;
|
||||||
import com.dkanada.gramophone.helper.MusicPlayerRemote;
|
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.AbsPlayerFragment;
|
||||||
import com.dkanada.gramophone.fragments.player.MiniPlayerFragment;
|
import com.dkanada.gramophone.fragments.player.MiniPlayerFragment;
|
||||||
import com.dkanada.gramophone.fragments.player.NowPlayingScreen;
|
import com.dkanada.gramophone.fragments.player.NowPlayingScreen;
|
||||||
|
|
@ -46,15 +43,6 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(createContentView());
|
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();
|
currentNowPlayingScreen = PreferenceUtil.getInstance(this).getNowPlayingScreen();
|
||||||
|
|
||||||
// must implement AbsPlayerFragment
|
// must implement AbsPlayerFragment
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
import com.dkanada.gramophone.BuildConfig;
|
import com.dkanada.gramophone.BuildConfig;
|
||||||
|
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||||
import com.dkanada.gramophone.databinding.ActivityAlbumDetailBinding;
|
import com.dkanada.gramophone.databinding.ActivityAlbumDetailBinding;
|
||||||
import com.google.android.material.appbar.AppBarLayout;
|
import com.google.android.material.appbar.AppBarLayout;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
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.Album;
|
||||||
import com.dkanada.gramophone.model.Artist;
|
import com.dkanada.gramophone.model.Artist;
|
||||||
import com.dkanada.gramophone.model.Song;
|
import com.dkanada.gramophone.model.Song;
|
||||||
import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity;
|
|
||||||
import com.dkanada.gramophone.util.MusicUtil;
|
import com.dkanada.gramophone.util.MusicUtil;
|
||||||
import com.dkanada.gramophone.util.NavigationUtil;
|
import com.dkanada.gramophone.util.NavigationUtil;
|
||||||
import com.dkanada.gramophone.util.ThemeUtil;
|
import com.dkanada.gramophone.util.ThemeUtil;
|
||||||
|
|
@ -39,7 +39,7 @@ import org.jellyfin.apiclient.model.querying.ItemQuery;
|
||||||
|
|
||||||
import java.util.List;
|
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";
|
public static final String EXTRA_ALBUM = BuildConfig.APPLICATION_ID + ".extra.album";
|
||||||
|
|
||||||
private ActivityAlbumDetailBinding binding;
|
private ActivityAlbumDetailBinding binding;
|
||||||
|
|
@ -64,7 +64,10 @@ public class AlbumDetailActivity extends AbsMusicPanelActivity implements Palett
|
||||||
|
|
||||||
loadAlbumCover(album);
|
loadAlbumCover(album);
|
||||||
setAlbum(album);
|
setAlbum(album);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStateOnline() {
|
||||||
ItemQuery query = new ItemQuery();
|
ItemQuery query = new ItemQuery();
|
||||||
query.setParentId(album.id);
|
query.setParentId(album.id);
|
||||||
query.setSortBy(new String[]{"ParentIndexNumber", "IndexNumber"});
|
query.setSortBy(new String[]{"ParentIndexNumber", "IndexNumber"});
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
import com.dkanada.gramophone.BuildConfig;
|
import com.dkanada.gramophone.BuildConfig;
|
||||||
|
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||||
import com.dkanada.gramophone.adapter.song.SongAdapter;
|
import com.dkanada.gramophone.adapter.song.SongAdapter;
|
||||||
import com.dkanada.gramophone.databinding.ActivityArtistDetailBinding;
|
import com.dkanada.gramophone.databinding.ActivityArtistDetailBinding;
|
||||||
import com.google.android.material.appbar.AppBarLayout;
|
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.interfaces.PaletteColorHolder;
|
||||||
import com.dkanada.gramophone.model.Artist;
|
import com.dkanada.gramophone.model.Artist;
|
||||||
import com.dkanada.gramophone.model.Song;
|
import com.dkanada.gramophone.model.Song;
|
||||||
import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity;
|
|
||||||
import com.dkanada.gramophone.util.MusicUtil;
|
import com.dkanada.gramophone.util.MusicUtil;
|
||||||
import com.dkanada.gramophone.util.ThemeUtil;
|
import com.dkanada.gramophone.util.ThemeUtil;
|
||||||
import com.dkanada.gramophone.util.PreferenceUtil;
|
import com.dkanada.gramophone.util.PreferenceUtil;
|
||||||
|
|
@ -40,7 +40,7 @@ import org.jellyfin.apiclient.model.querying.ItemQuery;
|
||||||
|
|
||||||
import java.util.List;
|
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";
|
public static final String EXTRA_ARTIST = BuildConfig.APPLICATION_ID + ".extra.artist";
|
||||||
|
|
||||||
private ActivityArtistDetailBinding binding;
|
private ActivityArtistDetailBinding binding;
|
||||||
|
|
@ -69,7 +69,10 @@ public class ArtistDetailActivity extends AbsMusicPanelActivity implements Palet
|
||||||
|
|
||||||
loadArtistImage(artist);
|
loadArtistImage(artist);
|
||||||
setArtist(artist);
|
setArtist(artist);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStateOnline() {
|
||||||
ItemQuery albums = new ItemQuery();
|
ItemQuery albums = new ItemQuery();
|
||||||
albums.setArtistIds(new String[]{artist.id});
|
albums.setArtistIds(new String[]{artist.id});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.dkanada.gramophone.BuildConfig;
|
import com.dkanada.gramophone.BuildConfig;
|
||||||
|
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||||
import com.dkanada.gramophone.databinding.ActivityGenreDetailBinding;
|
import com.dkanada.gramophone.databinding.ActivityGenreDetailBinding;
|
||||||
import com.kabouzeid.appthemehelper.ThemeStore;
|
import com.kabouzeid.appthemehelper.ThemeStore;
|
||||||
import com.dkanada.gramophone.R;
|
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.helper.MusicPlayerRemote;
|
||||||
import com.dkanada.gramophone.interfaces.CabHolder;
|
import com.dkanada.gramophone.interfaces.CabHolder;
|
||||||
import com.dkanada.gramophone.model.Genre;
|
import com.dkanada.gramophone.model.Genre;
|
||||||
import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity;
|
|
||||||
import com.dkanada.gramophone.util.ThemeUtil;
|
import com.dkanada.gramophone.util.ThemeUtil;
|
||||||
import com.dkanada.gramophone.util.QueryUtil;
|
import com.dkanada.gramophone.util.QueryUtil;
|
||||||
import com.dkanada.gramophone.util.ViewUtil;
|
import com.dkanada.gramophone.util.ViewUtil;
|
||||||
|
|
@ -28,7 +28,7 @@ import org.jellyfin.apiclient.model.querying.ItemQuery;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
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";
|
public static final String EXTRA_GENRE = BuildConfig.APPLICATION_ID + ".extra.genre";
|
||||||
|
|
||||||
private ActivityGenreDetailBinding binding;
|
private ActivityGenreDetailBinding binding;
|
||||||
|
|
@ -52,7 +52,10 @@ public class GenreDetailActivity extends AbsMusicPanelActivity implements CabHol
|
||||||
|
|
||||||
setUpRecyclerView();
|
setUpRecyclerView();
|
||||||
setUpToolBar();
|
setUpToolBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStateOnline() {
|
||||||
ItemQuery query = new ItemQuery();
|
ItemQuery query = new ItemQuery();
|
||||||
query.setGenreIds(new String[]{genre.id});
|
query.setGenreIds(new String[]{genre.id});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.afollestad.materialcab.MaterialCab;
|
import com.afollestad.materialcab.MaterialCab;
|
||||||
import com.dkanada.gramophone.BuildConfig;
|
import com.dkanada.gramophone.BuildConfig;
|
||||||
|
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||||
import com.dkanada.gramophone.databinding.ActivityPlaylistDetailBinding;
|
import com.dkanada.gramophone.databinding.ActivityPlaylistDetailBinding;
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
|
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
|
||||||
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator;
|
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.Playlist;
|
||||||
import com.dkanada.gramophone.model.PlaylistSong;
|
import com.dkanada.gramophone.model.PlaylistSong;
|
||||||
import com.dkanada.gramophone.model.Song;
|
import com.dkanada.gramophone.model.Song;
|
||||||
import com.dkanada.gramophone.activities.base.AbsMusicPanelActivity;
|
|
||||||
import com.dkanada.gramophone.util.ThemeUtil;
|
import com.dkanada.gramophone.util.ThemeUtil;
|
||||||
import com.dkanada.gramophone.util.PlaylistUtil;
|
import com.dkanada.gramophone.util.PlaylistUtil;
|
||||||
import com.dkanada.gramophone.util.ViewUtil;
|
import com.dkanada.gramophone.util.ViewUtil;
|
||||||
|
|
@ -35,7 +35,7 @@ import org.jellyfin.apiclient.model.playlists.PlaylistItemQuery;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
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";
|
public static String EXTRA_PLAYLIST = BuildConfig.APPLICATION_ID + ".extra.playlist";
|
||||||
|
|
||||||
private ActivityPlaylistDetailBinding binding;
|
private ActivityPlaylistDetailBinding binding;
|
||||||
|
|
@ -62,7 +62,10 @@ public class PlaylistDetailActivity extends AbsMusicPanelActivity implements Cab
|
||||||
|
|
||||||
setUpRecyclerView();
|
setUpRecyclerView();
|
||||||
setUpToolbar();
|
setUpToolbar();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStateOnline() {
|
||||||
PlaylistItemQuery query = new PlaylistItemQuery();
|
PlaylistItemQuery query = new PlaylistItemQuery();
|
||||||
query.setId(playlist.id);
|
query.setId(playlist.id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.dkanada.gramophone.interfaces;
|
||||||
|
|
||||||
|
public interface StateListener {
|
||||||
|
void onStatePolling();
|
||||||
|
|
||||||
|
void onStateOnline();
|
||||||
|
|
||||||
|
void onStateOffline();
|
||||||
|
}
|
||||||
|
|
@ -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<SystemInfo>() {
|
||||||
|
@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));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,6 +13,7 @@ import androidx.core.util.Pair;
|
||||||
|
|
||||||
import com.dkanada.gramophone.activities.LoginActivity;
|
import com.dkanada.gramophone.activities.LoginActivity;
|
||||||
import com.dkanada.gramophone.activities.MainActivity;
|
import com.dkanada.gramophone.activities.MainActivity;
|
||||||
|
import com.dkanada.gramophone.activities.SelectActivity;
|
||||||
import com.dkanada.gramophone.model.Album;
|
import com.dkanada.gramophone.model.Album;
|
||||||
import com.dkanada.gramophone.model.Artist;
|
import com.dkanada.gramophone.model.Artist;
|
||||||
import com.dkanada.gramophone.model.Genre;
|
import com.dkanada.gramophone.model.Genre;
|
||||||
|
|
@ -48,6 +49,13 @@ public class NavigationUtil {
|
||||||
context.startActivity(intent);
|
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) {
|
public static void startMain(@NonNull final Context context) {
|
||||||
final Intent intent = new Intent(context, MainActivity.class);
|
final Intent intent = new Intent(context, MainActivity.class);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue