Remove slide up panel

This commit is contained in:
Andrew Rabert 2019-08-25 22:11:15 -04:00
parent 89ede8ff47
commit a6fa354622
3 changed files with 65 additions and 339 deletions

View File

@ -32,7 +32,6 @@ android {
dependencies { dependencies {
implementation 'com.esotericsoftware:kryo:4.0.2' implementation 'com.esotericsoftware:kryo:4.0.2'
implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.android.material:material:1.0.0'
implementation 'com.github.hannesa2:AndroidSlidingUpPanel:4.0.0'
implementation 'com.squareup.okhttp3:okhttp:4.1.0' implementation 'com.squareup.okhttp3:okhttp:4.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
} }

View File

@ -37,9 +37,6 @@ import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import com.sothree.slidinguppanel.SlidingUpPanelLayout.PanelState;
import net.nullsum.audinaut.R; import net.nullsum.audinaut.R;
import net.nullsum.audinaut.domain.MusicDirectory; import net.nullsum.audinaut.domain.MusicDirectory;
import net.nullsum.audinaut.domain.PlayerState; import net.nullsum.audinaut.domain.PlayerState;
@ -68,19 +65,11 @@ import java.util.List;
public class SubsonicFragmentActivity extends SubsonicActivity implements DownloadService.OnSongChangedListener { public class SubsonicFragmentActivity extends SubsonicActivity implements DownloadService.OnSongChangedListener {
private static boolean infoDialogDisplayed; private static boolean infoDialogDisplayed;
private static boolean sessionInitialized = false; private static boolean sessionInitialized = false;
private SlidingUpPanelLayout slideUpPanel;
private SlidingUpPanelLayout.PanelSlideListener panelSlideListener;
private boolean isPanelClosing = false;
private boolean resuming = false; private boolean resuming = false;
private NowPlayingFragment nowPlayingFragment; private NowPlayingFragment nowPlayingFragment;
private SubsonicFragment secondaryFragment; private SubsonicFragment secondaryFragment;
private Toolbar mainToolbar; private Toolbar mainToolbar;
private Toolbar nowPlayingToolbar;
private View bottomBar;
private ImageView coverArtView;
private TextView trackView;
private TextView artistView;
private ImageButton startButton; private ImageButton startButton;
private DownloadFile currentPlaying; private DownloadFile currentPlaying;
private ImageButton previousButton; private ImageButton previousButton;
@ -167,130 +156,81 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
} }
} }
slideUpPanel = findViewById(R.id.slide_up_panel);
panelSlideListener = new SlidingUpPanelLayout.PanelSlideListener() {
@Override
public void onPanelSlide(View panel, float slideOffset) {
}
@Override
public void onPanelStateChanged(View panel, PanelState previousState, PanelState newState) {
if (newState == PanelState.COLLAPSED) {
isPanelClosing = false;
if (bottomBar.getVisibility() == View.GONE) {
bottomBar.setVisibility(View.VISIBLE);
nowPlayingToolbar.setVisibility(View.GONE);
nowPlayingFragment.setPrimaryFragment(false);
setSupportActionBar(mainToolbar);
recreateSpinner();
}
} else if (newState == PanelState.EXPANDED) {
isPanelClosing = false;
currentFragment.stopActionMode();
// Disable custom view before switching
getSupportActionBar().setDisplayShowCustomEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(true);
bottomBar.setVisibility(View.GONE);
nowPlayingToolbar.setVisibility(View.VISIBLE);
setSupportActionBar(nowPlayingToolbar);
if (secondaryFragment == null) {
nowPlayingFragment.setPrimaryFragment(true);
} else {
secondaryFragment.setPrimaryFragment(true);
}
drawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
};
slideUpPanel.addPanelSlideListener(panelSlideListener);
if (getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD)) { if (getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD)) {
// Post this later so it actually runs
handler.postDelayed(this::openNowPlaying, 200);
getIntent().removeExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD); getIntent().removeExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD);
} }
bottomBar = findViewById(R.id.bottom_bar);
mainToolbar = findViewById(R.id.main_toolbar); mainToolbar = findViewById(R.id.main_toolbar);
nowPlayingToolbar = findViewById(R.id.now_playing_toolbar);
coverArtView = bottomBar.findViewById(R.id.album_art);
trackView = bottomBar.findViewById(R.id.track_name);
artistView = bottomBar.findViewById(R.id.artist_name);
setSupportActionBar(mainToolbar); setSupportActionBar(mainToolbar);
if (findViewById(R.id.fragment_container) != null && savedInstanceState == null) { if (findViewById(R.id.fragment_container) != null && savedInstanceState == null) {
nowPlayingFragment = new NowPlayingFragment(); nowPlayingFragment = new NowPlayingFragment();
FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.add(R.id.now_playing_fragment_container, nowPlayingFragment, nowPlayingFragment.getTag() + "");
trans.commit(); trans.commit();
} }
rewindButton = findViewById(R.id.download_rewind); if (currentFragment instanceof NowPlayingFragment) {
rewindButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) { rewindButton = findViewById(R.id.download_rewind);
@Override rewindButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
protected Void doInBackground() { @Override
if (getDownloadService() != null) { protected Void doInBackground() {
getDownloadService().rewind(); if (getDownloadService() != null) {
} getDownloadService().rewind();
return null; }
}
}.execute());
previousButton = findViewById(R.id.download_previous);
previousButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
if (getDownloadService() != null) {
getDownloadService().previous();
}
return null;
}
}.execute());
startButton = findViewById(R.id.download_start);
startButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
PlayerState state = getDownloadService().getPlayerState();
if (state == PlayerState.STARTED) {
getDownloadService().pause();
} else {
getDownloadService().start();
}
return null;
}
}.execute());
nextButton = findViewById(R.id.download_next);
nextButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
if (getDownloadService() != null) {
getDownloadService().next();
}
return null;
}
}.execute());
fastforwardButton = findViewById(R.id.download_fastforward);
fastforwardButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
if (getDownloadService() == null) {
return null; return null;
} }
}.execute());
getDownloadService().fastForward(); previousButton = findViewById(R.id.download_previous);
return null; previousButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
} @Override
}.execute()); protected Void doInBackground() {
if (getDownloadService() != null) {
getDownloadService().previous();
}
return null;
}
}.execute());
startButton = findViewById(R.id.download_start);
startButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
PlayerState state = getDownloadService().getPlayerState();
if (state == PlayerState.STARTED) {
getDownloadService().pause();
} else {
getDownloadService().start();
}
return null;
}
}.execute());
nextButton = findViewById(R.id.download_next);
nextButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
if (getDownloadService() != null) {
getDownloadService().next();
}
return null;
}
}.execute());
fastforwardButton = findViewById(R.id.download_fastforward);
fastforwardButton.setOnClickListener(v -> new SilentBackgroundTask<Void>(SubsonicFragmentActivity.this) {
@Override
protected Void doInBackground() {
if (getDownloadService() == null) {
return null;
}
getDownloadService().fastForward();
return null;
}
}.execute());
}
if (!infoDialogDisplayed) { if (!infoDialogDisplayed) {
infoDialogDisplayed = true; infoDialogDisplayed = true;
@ -313,10 +253,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
super.onNewIntent(intent); super.onNewIntent(intent);
if (currentFragment != null && intent.getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY) != null) { if (currentFragment != null && intent.getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY) != null) {
if (isNowPlayingOpen()) {
closeNowPlaying();
}
if (currentFragment instanceof SearchFragment) { if (currentFragment instanceof SearchFragment) {
String query = intent.getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY); String query = intent.getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY);
boolean autoplay = intent.getBooleanExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, false); boolean autoplay = intent.getBooleanExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, false);
@ -331,10 +267,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
SearchFragment fragment = new SearchFragment(); SearchFragment fragment = new SearchFragment();
replaceFragment(fragment, fragment.getSupportTag()); replaceFragment(fragment, fragment.getSupportTag());
} }
} else if (intent.getBooleanExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD, false)) {
if (!isNowPlayingOpen()) {
openNowPlaying();
}
} else { } else {
setIntent(intent); setIntent(intent);
} }
@ -388,7 +320,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
if (secondaryFragment != null) { if (secondaryFragment != null) {
savedInstanceState.putString(Constants.MAIN_NOW_PLAYING_SECONDARY, secondaryFragment.getTag()); savedInstanceState.putString(Constants.MAIN_NOW_PLAYING_SECONDARY, secondaryFragment.getTag());
} }
savedInstanceState.putInt(Constants.MAIN_SLIDE_PANEL_STATE, slideUpPanel.getPanelState().hashCode());
} }
@Override @Override
@ -414,18 +345,12 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
if (drawerToggle != null && backStack.size() > 0) { if (drawerToggle != null && backStack.size() > 0) {
drawerToggle.setDrawerIndicatorEnabled(false); drawerToggle.setDrawerIndicatorEnabled(false);
} }
if (savedInstanceState.getInt(Constants.MAIN_SLIDE_PANEL_STATE, -1) == SlidingUpPanelLayout.PanelState.EXPANDED.hashCode()) {
panelSlideListener.onPanelStateChanged(null, null, PanelState.EXPANDED);
}
} }
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (isNowPlayingOpen()) { if (isNowPlayingOpen()) {
if (secondaryFragment == null) { if (secondaryFragment != null) {
closeNowPlaying();
} else {
removeCurrent(); removeCurrent();
} }
} else { } else {
@ -448,20 +373,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
@Override @Override
public void replaceFragment(SubsonicFragment fragment, int tag, boolean replaceCurrent) { public void replaceFragment(SubsonicFragment fragment, int tag, boolean replaceCurrent) {
if (slideUpPanel != null && isNowPlayingOpen() && !isPanelClosing) { super.replaceFragment(fragment, tag, replaceCurrent);
secondaryFragment = fragment;
nowPlayingFragment.setPrimaryFragment(false);
secondaryFragment.setPrimaryFragment(true);
supportInvalidateOptionsMenu();
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
trans.hide(nowPlayingFragment);
trans.add(R.id.now_playing_fragment_container, secondaryFragment, tag + "");
trans.commit();
} else {
super.replaceFragment(fragment, tag, replaceCurrent);
}
} }
@Override @Override
@ -490,15 +402,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
} }
} }
@Override
protected void drawerItemSelected(String fragmentType) {
super.drawerItemSelected(fragmentType);
if (isNowPlayingOpen() && !resuming) {
closeNowPlaying();
}
}
@Override @Override
public void startFragmentActivity(String fragmentType) { public void startFragmentActivity(String fragmentType) {
// Create a transaction that does all of this // Create a transaction that does all of this
@ -532,19 +435,8 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
} }
} }
@Override
public void openNowPlaying() {
slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
}
@Override
public void closeNowPlaying() {
slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
isPanelClosing = true;
}
private boolean isNowPlayingOpen() { private boolean isNowPlayingOpen() {
return slideUpPanel.getPanelState() == PanelState.EXPANDED; return false;
} }
private SubsonicFragment getNewFragment(String fragmentType) { private SubsonicFragment getNewFragment(String fragmentType) {
@ -642,35 +534,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
MusicDirectory.Entry song = null; MusicDirectory.Entry song = null;
if (currentPlaying != null) { if (currentPlaying != null) {
song = currentPlaying.getSong(); song = currentPlaying.getSong();
trackView.setText(song.getTitle());
if (song.getArtist() != null) {
artistView.setVisibility(View.VISIBLE);
artistView.setText(song.getArtist());
} else {
artistView.setVisibility(View.GONE);
}
} else {
trackView.setText(R.string.main_title);
artistView.setText(R.string.main_artist);
} }
if (coverArtView != null) {
int height = coverArtView.getHeight();
if (height <= 0) {
int[] attrs = new int[]{R.attr.actionBarSize};
TypedArray typedArray = this.obtainStyledAttributes(attrs);
height = typedArray.getDimensionPixelSize(0, 0);
typedArray.recycle();
}
getImageLoader().loadImage(coverArtView, song, false, height, false);
}
previousButton.setVisibility(View.VISIBLE);
nextButton.setVisibility(View.VISIBLE);
rewindButton.setVisibility(View.GONE);
fastforwardButton.setVisibility(View.GONE);
} }
@Override @Override
@ -689,26 +553,10 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo
public void onStateUpdate(PlayerState playerState) { public void onStateUpdate(PlayerState playerState) {
int[] attrs = new int[]{(playerState == PlayerState.STARTED) ? R.attr.actionbar_pause : R.attr.actionbar_start}; int[] attrs = new int[]{(playerState == PlayerState.STARTED) ? R.attr.actionbar_pause : R.attr.actionbar_start};
TypedArray typedArray = this.obtainStyledAttributes(attrs); TypedArray typedArray = this.obtainStyledAttributes(attrs);
startButton.setImageResource(typedArray.getResourceId(0, 0));
typedArray.recycle(); typedArray.recycle();
} }
@Override @Override
public void onMetadataUpdate(MusicDirectory.Entry song, int fieldChange) { public void onMetadataUpdate(MusicDirectory.Entry song, int fieldChange) {
if (song != null && coverArtView != null && fieldChange == DownloadService.METADATA_UPDATED_COVER_ART) {
int height = coverArtView.getHeight();
if (height <= 0) {
int[] attrs = new int[]{R.attr.actionBarSize};
TypedArray typedArray = this.obtainStyledAttributes(attrs);
height = typedArray.getDimensionPixelSize(0, 0);
typedArray.recycle();
}
getImageLoader().loadImage(coverArtView, song, false, height, false);
// We need to update it immediately since it won't update if updater is not running for it
if (nowPlayingFragment != null && slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
nowPlayingFragment.onMetadataUpdate(song, fieldChange);
}
}
} }
} }

View File

@ -1,13 +1,11 @@
<com.sothree.slidinguppanel.SlidingUpPanelLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:sothree="http://schemas.android.com/apk/res-auto" xmlns:sothree="http://schemas.android.com/apk/res-auto"
android:id="@+id/slide_up_panel" android:id="@+id/slide_up_panel"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="bottom" android:gravity="bottom">
sothree:umanoDragView="@+id/slide_up_swipe_target"
sothree:umanoPanelHeight="?attr/actionBarSize"
sothree:umanoShadowHeight="4dp">
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -24,123 +22,4 @@
<include layout="@layout/abstract_fragment_container" /> <include layout="@layout/abstract_fragment_container" />
</FrameLayout> </FrameLayout>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/slide_up_swipe_target"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/actionbarBackgroundColor">
<androidx.appcompat.widget.Toolbar
android:id="@+id/now_playing_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="4dp"
android:theme="?attr/actionbarThemeStyle"
android:visibility="gone"
app:popupTheme="?attr/actionbarPopupStyle" />
<LinearLayout
android:id="@+id/bottom_bar"
style="@style/BasicButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:elevation="4dp"
android:orientation="horizontal">
<net.nullsum.audinaut.view.RecyclingImageView
android:id="@+id/album_art"
android:layout_width="?attr/actionBarSize"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="left|center"
android:scaleType="fitCenter" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical"
android:paddingLeft="8dip">
<TextView
android:id="@+id/track_name"
style="?attr/actionbarTitleStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="@string/main.title">
<requestFocus
android:duplicateParentState="true"
android:focusable="true"
android:focusableInTouchMode="true" />
</TextView>
<TextView
android:id="@+id/artist_name"
style="?attr/actionbarSubtitleStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="@string/main.artist" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1">
<ImageButton
android:id="@+id/download_rewind"
style="@style/PlaybackControl.BottomBar"
android:padding="2dp"
app:srcCompat="?attr/actionbar_rewind"
android:visibility="gone" />
<ImageButton
android:id="@+id/download_previous"
style="@style/PlaybackControl.BottomBar"
android:padding="2dp"
app:srcCompat="?attr/actionbar_backward" />
<ImageButton
android:id="@+id/download_start"
style="@style/PlaybackControl.BottomBar"
app:srcCompat="?attr/actionbar_start" />
<ImageButton
android:id="@+id/download_next"
style="@style/PlaybackControl.BottomBar"
android:padding="2dp"
app:srcCompat="?attr/actionbar_forward" />
<ImageButton
android:id="@+id/download_fastforward"
style="@style/PlaybackControl.BottomBar"
android:padding="2dp"
app:srcCompat="?attr/actionbar_fastforward"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
<FrameLayout
android:id="@+id/now_playing_fragment_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:clickable="true" />
</LinearLayout>
</com.sothree.slidinguppanel.SlidingUpPanelLayout>