From 366b3d35ae8d3a410678e90f3382e457c7d9445e Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 27 Apr 2015 18:09:40 -0700 Subject: Merge work for #259 after project structure change --- .../dsub/activity/DownloadActivity.java | 62 ----- .../dsub/activity/SubsonicActivity.java | 81 ++++--- .../dsub/activity/SubsonicFragmentActivity.java | 137 ++++++++--- .../dsub/fragments/NowPlayingFragment.java | 181 ++++++++------- .../dsub/fragments/SelectBookmarkFragment.java | 3 +- .../dsub/fragments/SelectDirectoryFragment.java | 5 +- .../dsub/fragments/SubsonicFragment.java | 254 +++++++++++---------- .../dsub/provider/DSubWidgetProvider.java | 5 +- .../java/github/daneren2005/dsub/util/Util.java | 27 ++- 9 files changed, 402 insertions(+), 353 deletions(-) delete mode 100644 app/src/main/java/github/daneren2005/dsub/activity/DownloadActivity.java (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/DownloadActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/DownloadActivity.java deleted file mode 100644 index e13a8b8c..00000000 --- a/app/src/main/java/github/daneren2005/dsub/activity/DownloadActivity.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - This file is part of Subsonic. - - Subsonic is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Subsonic is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Subsonic. If not, see . - - Copyright 2009 (C) Sindre Mehus - */ -package github.daneren2005.dsub.activity; - -import github.daneren2005.dsub.R; -import android.os.Bundle; -import android.view.MotionEvent; -import github.daneren2005.dsub.fragments.NowPlayingFragment; - -import android.widget.EditText; - -import github.daneren2005.dsub.util.Constants; - -public class DownloadActivity extends SubsonicActivity { - private static final String TAG = DownloadActivity.class.getSimpleName(); - private EditText playlistNameView; - - /** - * Called when the activity is first created. - */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.download_activity); - - if (findViewById(R.id.fragment_container) != null && savedInstanceState == null) { - currentFragment = new NowPlayingFragment(); - if(getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD_VIEW)) { - Bundle args = new Bundle(); - args.putBoolean(Constants.INTENT_EXTRA_NAME_DOWNLOAD_VIEW, true); - currentFragment.setArguments(args); - } - currentFragment.setPrimaryFragment(true); - getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, currentFragment, currentFragment.getSupportTag() + "").commit(); - } - } - - @Override - public boolean onTouchEvent(MotionEvent me) { - if(currentFragment != null && currentFragment.getGestureDetector() != null) { - return currentFragment.getGestureDetector().onTouchEvent(me); - } else { - return false; - } - } -} diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java index 4651eb0b..17f22586 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java @@ -118,7 +118,16 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte super.onCreate(bundle); startService(new Intent(this, DownloadService.class)); setVolumeControlStream(AudioManager.STREAM_MUSIC); - + + if(getIntent().hasExtra(Constants.FRAGMENT_POSITION)) { + lastSelectedPosition = getIntent().getIntExtra(Constants.FRAGMENT_POSITION, 0); + } + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + View actionbar = getLayoutInflater().inflate(R.layout.actionbar_spinner, null); actionBarSpinner = (Spinner)actionbar.findViewById(R.id.spinner); spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item); @@ -130,14 +139,6 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); - if(getIntent().hasExtra(Constants.FRAGMENT_POSITION)) { - lastSelectedPosition = getIntent().getIntExtra(Constants.FRAGMENT_POSITION, 0); - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. if(drawerToggle != null) { drawerToggle.syncState(); @@ -160,7 +161,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte restart(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); } - + populateDrawer(); UpdateView.addActiveActivity(); } @@ -210,7 +211,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte LayoutInflater layoutInflater = getLayoutInflater(); layoutInflater.inflate(viewId, rootView); } - + drawerList = (ListView) findViewById(R.id.left_drawer); drawerList.setOnItemClickListener(new ListView.OnItemClickListener() { @Override @@ -299,7 +300,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte primaryContainer = findViewById(R.id.fragment_container); } } - + @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); @@ -370,10 +371,11 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte public void onNewIntent(Intent intent) { super.onNewIntent(intent); } - + @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); + SubsonicFragment currentFragment = getCurrentFragment(); if(drawerOpen) { menuInflater.inflate(R.menu.drawer_menu, menu); } else if(currentFragment != null) { @@ -399,7 +401,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte return true; } - return currentFragment.onOptionsItemSelected(item); + return getCurrentFragment().onOptionsItemSelected(item); } @Override @@ -415,7 +417,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } return super.onKeyDown(keyCode, event); } - + @Override public void setTitle(CharSequence title) { if(title != null && !title.equals(getSupportActionBar().getTitle())) { @@ -426,7 +428,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte public void setSubtitle(CharSequence title) { getSupportActionBar().setSubtitle(title); } - + @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { int top = spinnerAdapter.getCount() - 1; @@ -439,9 +441,9 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte @Override public void onNothingSelected(AdapterView parent) { - + } - + private void populateDrawer() { SharedPreferences prefs = Util.getPreferences(this); boolean podcastsEnabled = prefs.getBoolean(Constants.PREFERENCES_KEY_PODCASTS_ENABLED, true); @@ -449,7 +451,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte boolean sharedEnabled = prefs.getBoolean(Constants.PREFERENCES_KEY_SHARED_ENABLED, true) && !Util.isOffline(this); boolean chatEnabled = prefs.getBoolean(Constants.PREFERENCES_KEY_CHAT_ENABLED, true) && !Util.isOffline(this); boolean adminEnabled = prefs.getBoolean(Constants.PREFERENCES_KEY_ADMIN_ENABLED, true) && !Util.isOffline(this); - + if(drawerItems == null || !enabledItems[0] == podcastsEnabled || !enabledItems[1] == bookmarksEnabled || !enabledItems[2] == sharedEnabled || !enabledItems[3] == chatEnabled || !enabledItems[4] == adminEnabled) { drawerItems = getResources().getStringArray(R.array.drawerItems); drawerItemsDescriptions = getResources().getStringArray(R.array.drawerItemsDescriptions); @@ -488,7 +490,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte if(!getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD_VIEW)) { drawerItemsVisibleList.set(8, false); } - + drawerList.setAdapter(drawerAdapter = new DrawerAdapter(this, drawerItemsList, drawerItemsIconsList, drawerItemsVisibleList)); enabledItems[0] = podcastsEnabled; enabledItems[1] = bookmarksEnabled; @@ -517,15 +519,15 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } } } - + private void drawerItemSelected(int position, View view) { startFragmentActivity(drawerItemsDescriptions[position]); - + if(lastSelectedView != view) { if(lastSelectedView != null) { lastSelectedView.setTextAppearance(this, R.style.DSub_TextViewStyle); } - + lastSelectedView = (TextView) view.findViewById(R.id.drawer_name); lastSelectedView.setTextAppearance(this, R.style.DSub_TextViewStyle_Bold); lastSelectedPosition = position; @@ -575,6 +577,10 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } } + protected SubsonicFragment getCurrentFragment() { + return this.currentFragment; + } + public void replaceFragment(SubsonicFragment fragment, int tag) { replaceFragment(fragment, tag, false); } @@ -628,11 +634,11 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte backStack.remove(backStack.size() - 1); } } - + // Add fragment to the right container trans.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right); trans.add(R.id.fragment_second_container, fragment, tag + ""); - + // Commit it all trans.commit(); } @@ -656,7 +662,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte trans.commit(); } else { FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); - + // Remove old right fragment trans.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left); trans.remove(oldFrag); @@ -682,7 +688,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte secondaryContainer.startAnimation(AnimationUtils.loadAnimation(this, R.anim.exit_to_right)); secondaryContainer.setVisibility(View.GONE); } - + trans.commit(); } recreateSpinner(); @@ -697,10 +703,10 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte currentFragment.invalidate(); populateDrawer(); } - + supportInvalidateOptionsMenu(); } - + protected void recreateSpinner() { if(currentFragment == null || currentFragment.getTitle() == null) { return; @@ -745,7 +751,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte theme = theme.substring(0, theme.indexOf("_fullscreen")); Util.setTheme(this, theme); } - + Util.applyTheme(this, theme); } private void applyFullscreen() { @@ -754,8 +760,8 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte // Hide additional elements on higher Android versions if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_FULLSCREEN | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; getWindow().getDecorView().setSystemUiVisibility(flags); } else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { @@ -786,7 +792,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte if(finished) { return null; } - + // If service is not available, request it to start and wait for it. for (int i = 0; i < 5; i++) { DownloadService downloadService = DownloadService.getInstance(); @@ -799,7 +805,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } return DownloadService.getInstance(); } - + public static String getThemeName() { return theme; } @@ -811,6 +817,13 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte return touchscreen; } + public void openNowPlaying() { + + } + public void closeNowPlaying() { + + } + private void setUncaughtExceptionHandler() { Thread.UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler(); if (!(handler instanceof SubsonicActivity.SubsonicUncaughtExceptionHandler)) { diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index 6614e09d..b534adc5 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -31,14 +31,16 @@ import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; +import com.sothree.slidinguppanel.SlidingUpPanelLayout; + import java.io.File; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -53,6 +55,7 @@ import github.daneren2005.dsub.fragments.AdminFragment; import github.daneren2005.dsub.fragments.ChatFragment; import github.daneren2005.dsub.fragments.DownloadFragment; import github.daneren2005.dsub.fragments.MainFragment; +import github.daneren2005.dsub.fragments.NowPlayingFragment; import github.daneren2005.dsub.fragments.SearchFragment; import github.daneren2005.dsub.fragments.SelectArtistFragment; import github.daneren2005.dsub.fragments.SelectBookmarkFragment; @@ -66,7 +69,6 @@ import github.daneren2005.dsub.service.DownloadService; import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.service.MusicServiceFactory; import github.daneren2005.dsub.updates.Updater; -import github.daneren2005.dsub.util.BackgroundTask; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.FileUtil; import github.daneren2005.dsub.util.SilentBackgroundTask; @@ -83,6 +85,12 @@ public class SubsonicFragmentActivity extends SubsonicActivity { private static boolean sessionInitialized = false; private static long ALLOWED_SKEW = 30000L; + private Handler handler = new Handler(); + private SlidingUpPanelLayout slideUpPanel; + private NowPlayingFragment nowPlayingFragment; + private Toolbar mainToolbar; + private Toolbar nowPlayingToolbar; + private ScheduledExecutorService executorService; private View bottomBar; private View coverArtView; @@ -105,14 +113,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity { if(drawerAdapter != null) { drawerAdapter.setDownloadVisible(true); } - } else if(getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD)) { - DownloadService service = getDownloadService(); - if((service != null && service.getCurrentPlaying() != null)) { - getIntent().removeExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD); - Intent intent = new Intent(); - intent.setClass(this, DownloadActivity.class); - startActivity(intent); - } } setContentView(R.layout.abstract_fragment_activity); @@ -128,49 +128,99 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } currentFragment = getNewFragment(fragmentType); - + if("".equals(fragmentType) || fragmentType == null || firstRun) { // Initial startup stuff if(!sessionInitialized) { loadSession(); } } - + currentFragment.setPrimaryFragment(true); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, currentFragment, currentFragment.getSupportTag() + "").commit(); - + if(getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_QUERY) != null) { SearchFragment fragment = new SearchFragment(); replaceFragment(fragment, fragment.getSupportTag()); } - + // If a album type is set, switch to that album type view String albumType = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE); if(albumType != null) { SubsonicFragment fragment = new SelectDirectoryFragment(); - + Bundle args = new Bundle(); args.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, albumType); args.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 20); args.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0); - + fragment.setArguments(args); replaceFragment(fragment, fragment.getSupportTag()); } } - bottomBar = findViewById(R.id.bottom_bar); - bottomBar.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - Intent intent = new Intent(); - intent.setClass(v.getContext(), DownloadActivity.class); - startActivity(intent); + slideUpPanel = (SlidingUpPanelLayout) findViewById(R.id.slide_up_panel); + slideUpPanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { + @Override + public void onPanelSlide(View panel, float slideOffset) { + + } + + @Override + public void onPanelCollapsed(View panel) { + bottomBar.setVisibility(View.VISIBLE); + nowPlayingToolbar.setVisibility(View.GONE); + nowPlayingFragment.setPrimaryFragment(false); + setSupportActionBar(mainToolbar); + } + + @Override + public void onPanelExpanded(View panel) { + bottomBar.setVisibility(View.GONE); + nowPlayingToolbar.setVisibility(View.VISIBLE); + setSupportActionBar(nowPlayingToolbar); + nowPlayingFragment.setPrimaryFragment(true); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + drawerToggle.setDrawerIndicatorEnabled(true); + } + + @Override + public void onPanelAnchored(View panel) { + + } + + @Override + public void onPanelHidden(View panel) { + } }); + + if(getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD)) { + // Post this later so it actually runs + handler.postDelayed(new Runnable() { + @Override + public void run() { + openNowPlaying(); + } + }, 200); + } + + bottomBar = findViewById(R.id.bottom_bar); + mainToolbar = (Toolbar) findViewById(R.id.main_toolbar); + nowPlayingToolbar = (Toolbar) findViewById(R.id.now_playing_toolbar); coverArtView = bottomBar.findViewById(R.id.album_art); trackView = (TextView) bottomBar.findViewById(R.id.track_name); artistView = (TextView) bottomBar.findViewById(R.id.artist_name); + setSupportActionBar(mainToolbar); + + nowPlayingFragment = new NowPlayingFragment(); + FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); + trans.add(R.id.now_playing_fragment_container, nowPlayingFragment, nowPlayingFragment.getTag() + ""); + trans.commit(); + ImageButton previousButton = (ImageButton) findViewById(R.id.download_previous); previousButton.setOnClickListener(new View.OnClickListener() { @Override @@ -262,7 +312,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } } - + @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -300,7 +350,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity { public void onResume() { super.onResume(); - final Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { @@ -369,7 +418,9 @@ public class SubsonicFragmentActivity extends SubsonicActivity { @Override public void onBackPressed() { - if(onBackPressedSupport()) { + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } else if(onBackPressedSupport()) { if(!Util.disableExitPrompt(this) && lastBackPressTime < (System.currentTimeMillis() - 4000)) { lastBackPressTime = System.currentTimeMillis(); Util.toast(this, R.string.main_back_confirm); @@ -379,6 +430,15 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } + @Override + protected SubsonicFragment getCurrentFragment() { + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + return nowPlayingFragment; + } else { + return super.getCurrentFragment(); + } + } + @Override public void replaceFragment(SubsonicFragment fragment, int tag, boolean replaceCurrent) { super.replaceFragment(fragment, tag, replaceCurrent); @@ -393,24 +453,24 @@ public class SubsonicFragmentActivity extends SubsonicActivity { drawerToggle.setDrawerIndicatorEnabled(true); } } - + @Override public void startFragmentActivity(String fragmentType) { // Create a transaction that does all of this FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); - + // Clear existing stack for(int i = backStack.size() - 1; i >= 0; i--) { trans.remove(backStack.get(i)); } trans.remove(currentFragment); backStack.clear(); - + // Create new stack currentFragment = getNewFragment(fragmentType); currentFragment.setPrimaryFragment(true); trans.add(R.id.fragment_container, currentFragment, currentFragment.getSupportTag() + ""); - + // Done, cleanup trans.commit(); supportInvalidateOptionsMenu(); @@ -426,7 +486,16 @@ public class SubsonicFragmentActivity extends SubsonicActivity { drawerToggle.setDrawerIndicatorEnabled(true); } } - + + @Override + public void openNowPlaying() { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); + } + @Override + public void closeNowPlaying() { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } + private SubsonicFragment getNewFragment(String fragmentType) { if("Artist".equals(fragmentType)) { return new SelectArtistFragment(); @@ -447,7 +516,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } else { return new MainFragment(); } - } + } private void update() { DownloadService downloadService = getDownloadService(); @@ -502,7 +571,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { if(ServerInfo.canSavePlayQueue(this) && !Util.isOffline(this)) { loadRemotePlayQueue(); } - + sessionInitialized = true; } private void loadSettings() { @@ -551,7 +620,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { return true; } } - + private void loadBookmarks() { final Context context = this; new SilentBackgroundTask(context) { @@ -562,7 +631,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { return null; } - + @Override public void error(Throwable error) { Log.e(TAG, "Failed to get bookmarks", error); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java index fa7e3404..953b429a 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java @@ -20,6 +20,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; @@ -141,6 +142,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis startFlipped = true; } } + primaryFragment = false; } @Override @@ -153,11 +155,8 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { rootView = inflater.inflate(R.layout.download, container, false); setTitle(R.string.button_bar_now_playing); - + mainLayout = rootView.findViewById(R.id.download_layout); - if(!primaryFragment) { - mainLayout.setVisibility(View.GONE); - } WindowManager w = context.getWindowManager(); Display d = w.getDefaultDisplay(); @@ -397,7 +396,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } else { // Immediately skip to the next song downloadService.next(true); - + // Otherwise set rating to 1 setRating(entry, 1); rateBadButton.setImageResource(R.drawable.ic_action_rating_bad_selected); @@ -470,35 +469,35 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis }); progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onStopTrackingTouch(final SeekBar seekBar) { - new SilentBackgroundTask(context) { - @Override - protected Void doInBackground() throws Throwable { - getDownloadService().seekTo(progressBar.getProgress()); - return null; - } - - @Override - protected void done(Void result) { - seekInProgress = false; - NowPlayingFragment.this.onProgressChanged(); - } - }.execute(); - } - - @Override - public void onStartTrackingTouch(final SeekBar seekBar) { + @Override + public void onStopTrackingTouch(final SeekBar seekBar) { + new SilentBackgroundTask(context) { + @Override + protected Void doInBackground() throws Throwable { + getDownloadService().seekTo(progressBar.getProgress()); + return null; + } + + @Override + protected void done(Void result) { + seekInProgress = false; + NowPlayingFragment.this.onProgressChanged(); + } + }.execute(); + } + + @Override + public void onStartTrackingTouch(final SeekBar seekBar) { seekInProgress = true; - } + } - @Override - public void onProgressChanged(final SeekBar seekBar, final int position, final boolean fromUser) { + @Override + public void onProgressChanged(final SeekBar seekBar, final int position, final boolean fromUser) { if (fromUser) { Util.toast(context, Util.formatDuration(position / 1000), true); setControlsVisible(true); } - } + } }); playlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override @@ -543,13 +542,6 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis registerForContextMenu(playlistView); - DownloadService downloadService = getDownloadService(); - if (downloadService != null && context.getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, false)) { - context.getIntent().removeExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE); - warnIfStorageUnavailable(); - downloadService.setShufflePlayEnabled(true); - } - if(Build.MODEL.equals("Nexus 4") || Build.MODEL.equals("GT-I9100")) { View slider = rootView.findViewById(R.id.download_slider); slider.setPadding(0, 0, 0, 0); @@ -603,7 +595,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis if(menuItemSelected(menuItem.getItemId(), null)) { return true; } - + return super.onOptionsItemSelected(menuItem); } @@ -640,7 +632,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis if(!primaryFragment) { return false; } - + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo(); DownloadFile downloadFile = (DownloadFile) playlistView.getItemAtPosition(info.position); return menuItemSelected(menuItem.getItemId(), downloadFile) || super.onContextItemSelected(menuItem); @@ -840,7 +832,9 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis @Override public void onResume() { super.onResume(); - + onResumeHandlers(); + } + private void onResumeHandlers() { final Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override @@ -897,25 +891,43 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis @Override public void onPause() { super.onPause(); + onPauseHandlers(); + } + private void onPauseHandlers() { executorService.shutdown(); if(getDownloadService() != null) { getDownloadService().stopRemoteScan(); } + playlistFlipper.setDisplayedChild(0); } - + @Override public void setPrimaryFragment(boolean primary) { super.setPrimaryFragment(primary); if(rootView != null) { if(primary) { - mainLayout.setVisibility(View.VISIBLE); - updateButtons(); + onResumeHandlers(); } else { - mainLayout.setVisibility(View.GONE); + onPauseHandlers(); } } } + @Override + public void setTitle(int title) { + this.title = context.getResources().getString(title); + if(this.primaryFragment) { + context.setTitle(this.title); + } + } + @Override + public void setSubtitle(CharSequence title) { + this.subtitle = title; + if(this.primaryFragment) { + context.setSubtitle(title); + } + } + private void scheduleHideControls() { if (hideControlsFuture != null) { hideControlsFuture.cancel(false); @@ -953,7 +965,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis if(context == null) { return; } - + if(Util.isOffline(context)) { bookmarkButton.setVisibility(View.GONE); rateBadButton.setVisibility(View.GONE); @@ -970,6 +982,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } // Scroll to current playing/downloading. + @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void scrollToCurrent() { if (getDownloadService() == null || songListAdapter == null) { scrollWhenLoaded = true; @@ -1042,26 +1055,26 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis public void onStopTrackingTouch(SeekBar seekBar) { } }); - lengthBar.setProgress(length - 1); + lengthBar.setProgress(length - 1); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.menu_set_timer) - .setView(dialogView) - .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - int length = getMinutes(lengthBar.getProgress()); + .setView(dialogView) + .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + int length = getMinutes(lengthBar.getProgress()); - SharedPreferences.Editor editor = prefs.edit(); - editor.putString(Constants.PREFERENCES_KEY_SLEEP_TIMER_DURATION, Integer.toString(length)); - editor.commit(); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(Constants.PREFERENCES_KEY_SLEEP_TIMER_DURATION, Integer.toString(length)); + editor.commit(); - getDownloadService().setSleepTimerDuration(length); - getDownloadService().startSleepTimer(); - context.supportInvalidateOptionsMenu(); - } - }) - .setNegativeButton(R.string.common_cancel, null); + getDownloadService().setSleepTimerDuration(length); + getDownloadService().startSleepTimer(); + context.supportInvalidateOptionsMenu(); + } + }) + .setNegativeButton(R.string.common_cancel, null); AlertDialog dialog = builder.create(); dialog.show(); } @@ -1086,7 +1099,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis playlistFlipper.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.push_up_in)); playlistFlipper.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.push_up_out)); playlistFlipper.setDisplayedChild(1); - + UpdateView.triggerUpdate(); } } @@ -1124,7 +1137,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis protected Void doInBackground() throws Throwable { currentPlayingIndex = downloadService.getCurrentPlayingIndex() + 1; size = downloadService.size(); - + return null; } @@ -1132,14 +1145,14 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis protected void done(Void result) { List list; list = downloadService.getSongs(); - + if(downloadService.isShufflePlayEnabled()) { emptyTextView.setText(R.string.download_shuffle_loading); } else { emptyTextView.setText(R.string.download_empty); } - + if(songListAdapter == null || refresh) { songList = new ArrayList(); songList.addAll(list); @@ -1149,7 +1162,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis songList.addAll(list); songListAdapter.notifyDataSetChanged(); } - + emptyTextView.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE); currentRevision = downloadService.getDownloadListUpdateRevision(); @@ -1170,7 +1183,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis default: break; } - + if(scrollWhenLoaded) { scrollToCurrent(); scrollWhenLoaded = false; @@ -1193,7 +1206,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis if (downloadService == null || onCurrentChangedTask != null) { return; } - + onCurrentChangedTask = new SilentBackgroundTask(context) { int currentPlayingIndex; int currentPlayingSize; @@ -1254,7 +1267,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } } }; - + if(onDownloadListChangedTask == null) { onCurrentChangedTask.execute(); } @@ -1390,33 +1403,33 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } }.execute(); } - + private void createBookmark() { DownloadService downloadService = getDownloadService(); if(downloadService == null) { return; } - + final DownloadFile currentDownload = downloadService.getCurrentPlaying(); if(currentDownload == null) { return; } - + View dialogView = context.getLayoutInflater().inflate(R.layout.create_bookmark, null); final EditText commentBox = (EditText)dialogView.findViewById(R.id.comment_text); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.download_save_bookmark_title) - .setView(dialogView) - .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - String comment = commentBox.getText().toString(); + .setView(dialogView) + .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + String comment = commentBox.getText().toString(); - createBookmark(currentDownload, comment); - } - }) - .setNegativeButton(R.string.common_cancel, null); + createBookmark(currentDownload, comment); + } + }) + .setNegativeButton(R.string.common_cancel, null); AlertDialog dialog = builder.create(); dialog.show(); } @@ -1425,13 +1438,13 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis if(downloadService == null) { return; } - + final Entry currentSong = currentDownload.getSong(); final int position = downloadService.getPlayerPosition(); final Bookmark oldBookmark = currentSong.getBookmark(); currentSong.setBookmark(new Bookmark(position)); bookmarkButton.setImageResource(R.drawable.ic_menu_bookmark_selected); - + new SilentBackgroundTask(context) { @Override protected Void doInBackground() throws Throwable { @@ -1453,12 +1466,12 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis Util.toast(context, R.string.download_save_bookmark); setControlsVisible(true); } - + @Override protected void error(Throwable error) { Log.w(TAG, "Failed to create bookmark", error); currentSong.setBookmark(oldBookmark); - + // If no bookmark at start, then return to no bookmark if(oldBookmark == null) { int bookmark; @@ -1469,14 +1482,14 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } bookmarkButton.setImageResource(bookmark); } - + String msg; if(error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); } else { msg = context.getResources().getString(R.string.download_save_bookmark_failed) + getErrorMessage(error); } - + Util.toast(context, msg, false); } }.execute(); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java index c71d99f6..830e2957 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java @@ -25,7 +25,6 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import github.daneren2005.dsub.R; -import github.daneren2005.dsub.activity.DownloadActivity; import github.daneren2005.dsub.domain.Bookmark; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.service.DownloadService; @@ -110,7 +109,7 @@ public class SelectBookmarkFragment extends SelectListFragment playlists = new ArrayList(); playlists.addAll(musicService.getPlaylists(false, context, this)); - + // Iterate through and remove all non owned public playlists Iterator it = playlists.iterator(); while(it.hasNext()) { @@ -1003,7 +1010,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR it.remove(); } } - + return playlists; } @@ -1016,7 +1023,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR @Override public View getView(int position, View convertView, ViewGroup parent) { Playlist playlist = getItem(position); - + // Create new if not getting a convert view to use PlaylistSongView view; if(convertView instanceof PlaylistSongView) { @@ -1033,21 +1040,21 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.playlist_add_to) - .setAdapter(playlistAdapter, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - if (which > 0) { - addToPlaylist(playlists.get(which), songs); - } else { - createNewPlaylist(songs, false); + .setAdapter(playlistAdapter, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if (which > 0) { + addToPlaylist(playlists.get(which), songs); + } else { + createNewPlaylist(songs, false); + } } - } - }); + }); AlertDialog dialog = builder.create(); dialog.show(); } @Override - protected void error(Throwable error) { + protected void error(Throwable error) { String msg; if (error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); @@ -1075,7 +1082,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } @Override - protected void error(Throwable error) { + protected void error(Throwable error) { String msg; if (error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); @@ -1087,7 +1094,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } }.execute(); } - + protected void createNewPlaylist(final List songs, final boolean getSuggestion) { View layout = context.getLayoutInflater().inflate(R.layout.save_playlist, null); final EditText playlistNameView = (EditText) layout.findViewById(R.id.save_playlist_name); @@ -1115,34 +1122,34 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.download_playlist_title) - .setMessage(R.string.download_playlist_name) - .setView(layout) - .setPositiveButton(R.string.common_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - String playlistName = String.valueOf(playlistNameView.getText()); - if(overwriteCheckBox.isChecked()) { - overwritePlaylist(songs, playlistName, getDownloadService().getSuggestedPlaylistId()); - } else { - createNewPlaylist(songs, playlistName); - - if(getSuggestion) { - DownloadService downloadService = getDownloadService(); - if(downloadService != null) { - downloadService.setSuggestedPlaylistName(playlistName, null); + .setMessage(R.string.download_playlist_name) + .setView(layout) + .setPositiveButton(R.string.common_save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + String playlistName = String.valueOf(playlistNameView.getText()); + if(overwriteCheckBox.isChecked()) { + overwritePlaylist(songs, playlistName, getDownloadService().getSuggestedPlaylistId()); + } else { + createNewPlaylist(songs, playlistName); + + if(getSuggestion) { + DownloadService downloadService = getDownloadService(); + if(downloadService != null) { + downloadService.setSuggestedPlaylistName(playlistName, null); + } } } } - } - }) - .setNegativeButton(R.string.common_cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }) - .setCancelable(true); - + }) + .setNegativeButton(R.string.common_cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }) + .setCancelable(true); + AlertDialog dialog = builder.create(); dialog.show(); } @@ -1184,7 +1191,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } @Override - protected void error(Throwable error) { + protected void error(Throwable error) { String msg; if (error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); @@ -1197,6 +1204,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR }.execute(); } + @TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1) public void displaySongInfo(final Entry song) { Integer duration = null; Integer bitrate = null; @@ -1209,12 +1217,12 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR if(file.exists()) { MediaMetadataRetriever metadata = new MediaMetadataRetriever(); metadata.setDataSource(file.getAbsolutePath()); - + String tmp = metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); duration = Integer.parseInt((tmp != null) ? tmp : "0") / 1000; format = FileUtil.getExtension(file.getName()); size = file.length(); - + // If no duration try to read bitrate tag if(duration == null) { tmp = metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); @@ -1224,7 +1232,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR // Divide by 1000 so in kbps bitrate = (int) (size / duration) / 1000 * 8; } - + if(Util.isOffline(context)) { song.setGenre(metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)); String year = metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR); @@ -1286,7 +1294,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR Util.info(context, song.getTitle(), msg); } - + protected void playVideo(Entry entry) { if(entryExists(entry)) { playExternalPlayer(entry); @@ -1315,7 +1323,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR intent.putExtra(Intent.EXTRA_TITLE, entry.getTitle()); List intents = context.getPackageManager() - .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); if(intents != null && intents.size() > 0) { startActivity(intent); }else { @@ -1373,7 +1381,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR public void deleteRecursively(Artist artist) { deleteRecursively(FileUtil.getArtistDirectory(context, artist)); } - + public void deleteRecursively(Entry album) { deleteRecursively(FileUtil.getAlbumDirectory(context, album)); @@ -1490,7 +1498,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR intent.putExtra(Intent.EXTRA_TEXT, share.getUrl()); context.startActivity(Intent.createChooser(intent, context.getResources().getString(R.string.share_via))); } - + public GestureDetector getGestureDetector() { return gestureScanner; } @@ -1515,7 +1523,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR public void onClick(DialogInterface dialog, int id) { final Bookmark oldBookmark = song.getBookmark(); song.setBookmark(null); - + new SilentBackgroundTask(context) { @Override protected Void doInBackground() throws Throwable { @@ -1528,7 +1536,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR @Override protected void error(Throwable error) { song.setBookmark(oldBookmark); - + String msg; if (error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); @@ -1546,7 +1554,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR AlertDialog dialog = builder.create(); dialog.show(); } - + protected void playNow(List entries) { playNow(entries, null, null); } @@ -1558,7 +1566,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR break; } } - + // If no bookmark found, just play from start if(bookmark == null) { playNow(entries, 0, playlistName, playlistId); @@ -1585,17 +1593,17 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR if(downloadService == null) { return null; } - + downloadService.clear(); downloadService.download(entries, false, true, true, false, entries.indexOf(song), position); downloadService.setSuggestedPlaylistName(playlistName, playlistId); return null; } - + @Override protected void done(Void result) { - Util.startActivityWithoutTransition(context, DownloadActivity.class); + context.openNowPlaying(); } }.execute(); } @@ -1657,19 +1665,19 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR View layout = context.getLayoutInflater().inflate(R.layout.rating, null); final RatingBar ratingBar = (RatingBar) layout.findViewById(R.id.rating_bar); ratingBar.setRating((float) entry.getRating()); - + AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(context.getResources().getString(R.string.rating_title, entry.getTitle())) - .setView(layout) - .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - int rating = (int) ratingBar.getRating(); - setRating(entry, rating, onRatingChange); - } - }) - .setNegativeButton(R.string.common_cancel, null); - + .setView(layout) + .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + int rating = (int) ratingBar.getRating(); + setRating(entry, rating, onRatingChange); + } + }) + .setNegativeButton(R.string.common_cancel, null); + AlertDialog dialog = builder.create(); dialog.show(); } @@ -1684,7 +1692,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR if(onRatingChange != null) { onRatingChange.ratingChange(rating); } - + new SilentBackgroundTask(context) { @Override protected Void doInBackground() throws Throwable { @@ -1711,7 +1719,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR if(onRatingChange != null) { onRatingChange.ratingChange(oldRating); } - + String msg; if (error instanceof OfflineException || error instanceof ServerTooOldException) { msg = getErrorMessage(error); @@ -1723,16 +1731,16 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } }.execute(); } - + protected abstract class EntryInstanceUpdater { private Entry entry; - + public EntryInstanceUpdater(Entry entry) { this.entry = entry; } - + public abstract void update(Entry found); - + public void execute() { DownloadService downloadService = getDownloadService(); if(downloadService != null && !entry.isDirectory()) { @@ -1745,12 +1753,12 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR serializeChanges = true; } } - + if(serializeChanges) { downloadService.serializeQueue(); } } - + Entry find = UpdateView.findEntry(entry); if(find != null) { update(find); @@ -1810,7 +1818,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } if(result) { - Util.startActivityWithoutTransition(context, DownloadActivity.class); + context.openNowPlaying(); } } } diff --git a/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java b/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java index 444b6cff..7cb3ce8b 100644 --- a/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java +++ b/app/src/main/java/github/daneren2005/dsub/provider/DSubWidgetProvider.java @@ -39,7 +39,6 @@ import android.util.Log; import android.view.View; import android.widget.RemoteViews; import github.daneren2005.dsub.R; -import github.daneren2005.dsub.activity.DownloadActivity; import github.daneren2005.dsub.activity.SubsonicActivity; import github.daneren2005.dsub.activity.SubsonicFragmentActivity; import github.daneren2005.dsub.domain.MusicDirectory; @@ -270,9 +269,7 @@ public class DSubWidgetProvider extends AppWidgetProvider { /** * Link up various button actions using {@link PendingIntent}. * - * @param playerActive True if player is active in background, which means - * widget click will launch {@link DownloadActivity}, - * otherwise we launch {@link github.daneren2005.dsub.activity.SubsonicFragmentActivity}. + * @param playerActive @param playerActive True if player is active in background. Launch {@link github.daneren2005.dsub.activity.SubsonicFragmentActivity}. */ private void linkButtons(Context context, RemoteViews views, boolean playerActive) { Intent intent = new Intent(context, SubsonicFragmentActivity.class); diff --git a/app/src/main/java/github/daneren2005/dsub/util/Util.java b/app/src/main/java/github/daneren2005/dsub/util/Util.java index 75d8d5dd..876dc648 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Util.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Util.java @@ -48,6 +48,7 @@ import android.view.Gravity; import android.widget.TextView; import android.widget.Toast; import github.daneren2005.dsub.R; +import github.daneren2005.dsub.activity.SubsonicFragmentActivity; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.domain.PlayerState; import github.daneren2005.dsub.domain.RepeatMode; @@ -256,14 +257,26 @@ public final class Util { } public static void applyTheme(Context context, String theme) { - if ("dark".equals(theme)) { - context.setTheme(R.style.Theme_DSub_Dark); - } else if ("black".equals(theme)) { - context.setTheme(R.style.Theme_DSub_Black); - } else if ("holo".equals(theme)) { - context.setTheme(R.style.Theme_DSub_Holo); + if(context instanceof SubsonicFragmentActivity) { + if ("dark".equals(theme)) { + context.setTheme(R.style.Theme_DSub_Dark_No_Actionbar); + } else if ("black".equals(theme)) { + context.setTheme(R.style.Theme_DSub_Black_No_Actionbar); + } else if ("holo".equals(theme)) { + context.setTheme(R.style.Theme_DSub_Holo_No_Actionbar); + } else { + context.setTheme(R.style.Theme_DSub_Light_No_Actionbar); + } } else { - context.setTheme(R.style.Theme_DSub_Light); + if ("dark".equals(theme)) { + context.setTheme(R.style.Theme_DSub_Dark); + } else if ("black".equals(theme)) { + context.setTheme(R.style.Theme_DSub_Black); + } else if ("holo".equals(theme)) { + context.setTheme(R.style.Theme_DSub_Holo); + } else { + context.setTheme(R.style.Theme_DSub_Light); + } } SharedPreferences prefs = Util.getPreferences(context); -- cgit v1.2.3 From a72e12ae06fafe1885aa763ffa04faa84afb9523 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 28 Apr 2015 17:31:59 -0700 Subject: #259 Bunch of fixes/improvements to swipe up bar --- .../dsub/activity/SubsonicActivity.java | 28 +++++++++---- .../dsub/activity/SubsonicFragmentActivity.java | 49 ++++++++++++++++++---- .../github/daneren2005/dsub/util/ImageLoader.java | 5 ++- .../abstract_fragment_container.xml | 4 +- .../main/res/layout/abstract_fragment_activity.xml | 24 +++++++---- .../res/layout/abstract_fragment_container.xml | 6 +++ app/src/main/res/values-large/dimens.xml | 2 + app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 2 + 9 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/layout/abstract_fragment_container.xml (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java index 17f22586..814598c5 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java @@ -128,14 +128,9 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - View actionbar = getLayoutInflater().inflate(R.layout.actionbar_spinner, null); - actionBarSpinner = (Spinner)actionbar.findViewById(R.id.spinner); - spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item); - spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - actionBarSpinner.setOnItemSelectedListener(this); - actionBarSpinner.setAdapter(spinnerAdapter); - - getSupportActionBar().setCustomView(actionbar); + if(spinnerAdapter == null) { + createCustomActionBarView(); + } getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); @@ -151,6 +146,17 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } } + protected void createCustomActionBarView() { + View customActionbar = getLayoutInflater().inflate(R.layout.actionbar_spinner, null); + actionBarSpinner = (Spinner)customActionbar.findViewById(R.id.spinner); + spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + actionBarSpinner.setOnItemSelectedListener(this); + actionBarSpinner.setAdapter(spinnerAdapter); + + getSupportActionBar().setCustomView(customActionbar); + } + @Override protected void onResume() { super.onResume(); @@ -520,7 +526,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } } - private void drawerItemSelected(int position, View view) { + protected void drawerItemSelected(int position, View view) { startFragmentActivity(drawerItemsDescriptions[position]); if(lastSelectedView != view) { @@ -711,6 +717,9 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte if(currentFragment == null || currentFragment.getTitle() == null) { return; } + if(spinnerAdapter == null) { + createCustomActionBarView(); + } if(backStack.size() > 0) { spinnerAdapter.clear(); @@ -733,6 +742,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte getSupportActionBar().setDisplayShowCustomEnabled(true); } } else if(!isTv()) { + getSupportActionBar().setTitle(currentFragment.getTitle()); getSupportActionBar().setDisplayShowCustomEnabled(false); } } diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index b534adc5..83d5bce8 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -36,6 +36,7 @@ import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.TextView; import com.sothree.slidinguppanel.SlidingUpPanelLayout; @@ -93,7 +94,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { private ScheduledExecutorService executorService; private View bottomBar; - private View coverArtView; + private ImageView coverArtView; private TextView trackView; private TextView artistView; private ImageButton startButton; @@ -172,18 +173,31 @@ public class SubsonicFragmentActivity extends SubsonicActivity { nowPlayingToolbar.setVisibility(View.GONE); nowPlayingFragment.setPrimaryFragment(false); setSupportActionBar(mainToolbar); + + if(getSupportActionBar().getCustomView() == null) { + createCustomActionBarView(); + } + recreateSpinner(); + if(drawerToggle != null && backStack.size() > 0) { + drawerToggle.setDrawerIndicatorEnabled(false); + } else { + drawerToggle.setDrawerIndicatorEnabled(true); + } } @Override public void onPanelExpanded(View panel) { + // Disable custom view before switching + getSupportActionBar().setDisplayShowCustomEnabled(false); + bottomBar.setVisibility(View.GONE); nowPlayingToolbar.setVisibility(View.VISIBLE); setSupportActionBar(nowPlayingToolbar); nowPlayingFragment.setPrimaryFragment(true); + drawerToggle.setDrawerIndicatorEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setHomeButtonEnabled(true); - drawerToggle.setDrawerIndicatorEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(coverArtView.getDrawable()); } @Override @@ -210,7 +224,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { bottomBar = findViewById(R.id.bottom_bar); mainToolbar = (Toolbar) findViewById(R.id.main_toolbar); nowPlayingToolbar = (Toolbar) findViewById(R.id.now_playing_toolbar); - coverArtView = bottomBar.findViewById(R.id.album_art); + coverArtView = (ImageView) bottomBar.findViewById(R.id.album_art); trackView = (TextView) bottomBar.findViewById(R.id.track_name); artistView = (TextView) bottomBar.findViewById(R.id.artist_name); @@ -454,6 +468,15 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } + @Override + protected void drawerItemSelected(int position, View view) { + super.drawerItemSelected(position, view); + + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } + } + @Override public void startFragmentActivity(String fragmentType) { // Create a transaction that does all of this @@ -539,11 +562,23 @@ public class SubsonicFragmentActivity extends SubsonicActivity { trackView.setText(song.getTitle()); artistView.setText(song.getArtist()); } else { - trackView.setText("Title"); - artistView.setText("Artist"); + trackView.setText(R.string.main_title); + artistView.setText(R.string.main_artist); } - getImageLoader().loadImage(coverArtView, song, false, false); + SilentBackgroundTask task = getImageLoader().loadImage(coverArtView, song, false, coverArtView.getHeight(), false); + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + if(task == null) { + getSupportActionBar().setHomeAsUpIndicator(coverArtView.getDrawable()); + } else { + task.setOnCompletionListener(new Runnable() { + @Override + public void run() { + getSupportActionBar().setHomeAsUpIndicator(coverArtView.getDrawable()); + } + }); + } + } int[] attrs = new int[] {(state == PlayerState.STARTED) ? R.attr.media_button_pause : R.attr.media_button_start}; TypedArray typedArray = this.obtainStyledAttributes(attrs); startButton.setImageResource(typedArray.getResourceId(0, 0)); diff --git a/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java b/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java index 1a0e8242..65ef46fe 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java +++ b/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java @@ -192,8 +192,11 @@ public class ImageLoader { } public SilentBackgroundTask loadImage(View view, MusicDirectory.Entry entry, boolean large, boolean crossfade) { - // TODO: If we know this a artist, try to load artist info instead int size = large ? imageSizeLarge : imageSizeDefault; + return loadImage(view, entry, large, size, crossfade); + } + public SilentBackgroundTask loadImage(View view, MusicDirectory.Entry entry, boolean large, int size, boolean crossfade) { + // TODO: If we know this a artist, try to load artist info instead if(entry != null && !entry.isAlbum() && ServerInfo.checkServerVersion(context, "1.11") && !Util.isOffline(context)) { SilentBackgroundTask task = new ArtistImageTask(view.getContext(), entry, size, imageSizeLarge, large, view, crossfade); task.execute(); diff --git a/app/src/main/res/layout-large-land/abstract_fragment_container.xml b/app/src/main/res/layout-large-land/abstract_fragment_container.xml index 5e3b1561..3901710f 100644 --- a/app/src/main/res/layout-large-land/abstract_fragment_container.xml +++ b/app/src/main/res/layout-large-land/abstract_fragment_container.xml @@ -2,8 +2,8 @@ + android:layout_height="match_parent" + android:layout_marginTop="?attr/actionBarSize"> - + + android:textSize="@dimen/BottomBar.Text.Major" + android:text="@string/main.title" + android:ellipsize="marquee" + android:marqueeRepeatLimit="marquee_forever" + android:scrollHorizontally="true" + android:focusable="true" + android:focusableInTouchMode="true"> + + + + android:textSize="@dimen/BottomBar.Text.Minor" + android:text="@string/main.artist"/> diff --git a/app/src/main/res/layout/abstract_fragment_container.xml b/app/src/main/res/layout/abstract_fragment_container.xml new file mode 100644 index 00000000..f13356c4 --- /dev/null +++ b/app/src/main/res/layout/abstract_fragment_container.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-large/dimens.xml b/app/src/main/res/values-large/dimens.xml index b08dda86..fe8f1a6c 100644 --- a/app/src/main/res/values-large/dimens.xml +++ b/app/src/main/res/values-large/dimens.xml @@ -4,4 +4,6 @@ 54dip 96dip 210dip + 18sp + 16sp \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index be3e843d..9759e1c2 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,4 +4,6 @@ 46dip 78dip 120dip + 13sp + 12sp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b897cad6..8e7ae537 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,6 +79,8 @@ @string/main.albums_genres Press back again to exit Completed scan of Server + Artist + Title Search Shuffle -- cgit v1.2.3 From 0f801b780e82943bde5b3e7d96af1c6b29ba4edc Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 28 Apr 2015 17:45:51 -0700 Subject: Fix background update running on hidden NowPlayingFragment --- .../daneren2005/dsub/fragments/NowPlayingFragment.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java index 953b429a..80183c40 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java @@ -832,7 +832,11 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis @Override public void onResume() { super.onResume(); - onResumeHandlers(); + if(this.primaryFragment) { + onResumeHandlers(); + } else { + update(); + } } private void onResumeHandlers() { final Handler handler = new Handler(); @@ -894,11 +898,14 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis onPauseHandlers(); } private void onPauseHandlers() { - executorService.shutdown(); - if(getDownloadService() != null) { - getDownloadService().stopRemoteScan(); + if(executorService != null) { + executorService.shutdown(); + if (getDownloadService() != null) { + getDownloadService().stopRemoteScan(); + } + executorService = null; + playlistFlipper.setDisplayedChild(0); } - playlistFlipper.setDisplayedChild(0); } @Override -- cgit v1.2.3 From 40706126b2588d3ae75ba875855d786dc772b054 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 7 May 2015 14:25:38 -0700 Subject: #493 Start of adding header to drawer --- app/app.iml | 2 + app/build.gradle | 1 + .../dsub/activity/SubsonicActivity.java | 45 ++++++++++++++++++++-- .../daneren2005/dsub/fragments/MainFragment.java | 21 +--------- .../github/daneren2005/dsub/util/ImageLoader.java | 4 +- app/src/main/res/layout/drawer_header.xml | 42 ++++++++++++++++++++ app/src/main/res/layout/drawer_list_item.xml | 5 ++- app/src/main/res/values-v16/themes.xml | 2 +- 8 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/layout/drawer_header.xml (limited to 'app/src/main/java/github') diff --git a/app/app.iml b/app/app.iml index 6e923bd8..da1edd11 100644 --- a/app/app.iml +++ b/app/app.iml @@ -75,6 +75,7 @@ + @@ -113,6 +114,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index e17e8256..56da71aa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,6 +34,7 @@ dependencies { compile 'com.android.support:mediarouter-v7:22.1.1' compile 'com.google.android.gms:play-services-cast:7.0.0' compile 'com.sothree.slidinguppanel:library:3.0.0' + compile 'de.hdodenhof:circleimageview:1.2.1' compile group: 'org.fourthline.cling', name: 'cling-core', version:'2.0.1' compile group: 'org.fourthline.cling', name: 'cling-support', version:'2.0.1' compile group: 'org.eclipse.jetty', name: 'jetty-server', version:'8.1.16.v20140903' diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java index 814598c5..cb09728c 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java @@ -51,6 +51,7 @@ import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; +import android.widget.ImageView; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; @@ -68,6 +69,7 @@ import github.daneren2005.dsub.service.DownloadService; import github.daneren2005.dsub.service.HeadphoneListenerService; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.adapter.DrawerAdapter; import github.daneren2005.dsub.view.UpdateView; @@ -97,6 +99,10 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte ActionBarDrawerToggle drawerToggle; DrawerAdapter drawerAdapter; ListView drawerList; + View drawerHeader; + ImageView drawerUserAvatar; + TextView drawerServerName; + TextView drawerUserName; TextView lastSelectedView = null; int lastSelectedPosition = 0; boolean drawerOpen = false; @@ -222,7 +228,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte drawerList.setOnItemClickListener(new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, final View view, final int position, long id) { - final int actualPosition = drawerAdapter.getActualPosition(position); + final int actualPosition = drawerAdapter.getActualPosition(position - 1); if("Settings".equals(drawerItemsDescriptions[actualPosition])) { startActivity(new Intent(SubsonicActivity.this, SettingsActivity.class)); drawer.closeDrawers(); @@ -239,7 +245,13 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } }); + drawerHeader = getLayoutInflater().inflate(R.layout.drawer_header, drawerList, false); + drawerServerName = (TextView) drawerHeader.findViewById(R.id.header_server_name); + drawerUserName = (TextView) drawerHeader.findViewById(R.id.header_user_name); + drawerUserAvatar = (ImageView) drawerHeader.findViewById(R.id.header_user_avatar); + updateDrawerHeader(); + drawerList.addHeaderView(drawerHeader, null, false); if(!isTv()) { drawer = (DrawerLayout) findViewById(R.id.drawer_layout); @@ -265,7 +277,7 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } if (lastSelectedView == null && drawerList.getCount() > lastSelectedPosition) { - lastSelectedView = (TextView) drawerList.getChildAt(lastSelectedPosition).findViewById(R.id.drawer_name); + lastSelectedView = (TextView) drawerList.getChildAt(lastSelectedPosition + 1).findViewById(R.id.drawer_name); if (lastSelectedView != null) { lastSelectedView.setTextAppearance(SubsonicActivity.this, R.style.DSub_TextViewStyle_Bold); } @@ -514,11 +526,11 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } } - if(drawerList.getChildAt(lastSelectedPosition) == null) { + if(drawerList.getChildAt(lastSelectedPosition + 1) == null) { lastSelectedView = null; drawerAdapter.setSelectedPosition(lastSelectedPosition); } else { - lastSelectedView = (TextView) drawerList.getChildAt(lastSelectedPosition).findViewById(R.id.drawer_name); + lastSelectedView = (TextView) drawerList.getChildAt(lastSelectedPosition + 1).findViewById(R.id.drawer_name); if(lastSelectedView != null) { lastSelectedView.setTextAppearance(SubsonicActivity.this, R.style.DSub_TextViewStyle_Bold); } @@ -834,6 +846,31 @@ public class SubsonicActivity extends ActionBarActivity implements OnItemSelecte } + public void setActiveServer(int instance) { + if (Util.getActiveServer(this) != instance) { + final DownloadService service = getDownloadService(); + if (service != null) { + new SilentBackgroundTask(this) { + @Override + protected Void doInBackground() throws Throwable { + service.clearIncomplete(); + return null; + } + }.execute(); + + } + Util.setActiveServer(this, instance); + invalidate(); + UserUtil.refreshCurrentUser(this, false, true); + updateDrawerHeader(); + } + } + private void updateDrawerHeader() { + drawerServerName.setText(Util.getServerName(this)); + drawerUserName.setText(UserUtil.getCurrentUsername(this)); + getImageLoader().loadAvatar(this, drawerUserAvatar, UserUtil.getCurrentUsername(this)); + } + private void setUncaughtExceptionHandler() { Thread.UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler(); if (!(handler instanceof SubsonicActivity.SubsonicUncaughtExceptionHandler)) { diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index ae38534a..71c135aa 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -140,7 +140,7 @@ public class MainFragment extends SubsonicFragment { } int activeServer = menuItem.getItemId() - MENU_ITEM_SERVER_BASE; - setActiveServer(activeServer); + context.setActiveServer(activeServer); return true; } @@ -252,25 +252,6 @@ public class MainFragment extends SubsonicFragment { } } - private void setActiveServer(int instance) { - if (Util.getActiveServer(context) != instance) { - final DownloadService service = getDownloadService(); - if (service != null) { - new SilentBackgroundTask(context) { - @Override - protected Void doInBackground() throws Throwable { - service.clearIncomplete(); - return null; - } - }.execute(); - - } - Util.setActiveServer(context, instance); - context.invalidate(); - UserUtil.refreshCurrentUser(context, false, true); - } - } - private void toggleOffline() { boolean isOffline = Util.isOffline(context); Util.setOffline(context, !isOffline); diff --git a/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java b/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java index 65ef46fe..54b4085d 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java +++ b/app/src/main/java/github/daneren2005/dsub/util/ImageLoader.java @@ -285,6 +285,7 @@ public class ImageLoader { view.setImageDrawable(drawable); return null; } + view.setImageDrawable(null); SilentBackgroundTask task = new AvatarTask(context, view, username); task.execute(); @@ -587,7 +588,6 @@ public class ImageLoader { } } catch (Throwable x) { Log.e(TAG, "Failed to download album art.", x); - cancelled.set(true); } return null; @@ -597,6 +597,8 @@ public class ImageLoader { protected void done(Void result) { if(mDrawable != null) { mView.setImageDrawable(mDrawable); + } else { + mView.setImageResource(R.drawable.ic_social_person); } } } diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml new file mode 100644 index 00000000..00441b73 --- /dev/null +++ b/app/src/main/res/layout/drawer_header.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/drawer_list_item.xml b/app/src/main/res/layout/drawer_list_item.xml index 5f17c9e9..607b3658 100644 --- a/app/src/main/res/layout/drawer_list_item.xml +++ b/app/src/main/res/layout/drawer_list_item.xml @@ -20,7 +20,8 @@ android:id="@+id/drawer_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="26sp" android:singleLine="true" - android:textColor="?android:textColorPrimary"/> + android:textColor="?android:textColorPrimary" + android:textAppearance="?android:attr/textAppearanceLarge" + style="DSub.TextViewStyle"/> diff --git a/app/src/main/res/values-v16/themes.xml b/app/src/main/res/values-v16/themes.xml index 013ac0aa..a14b6a1b 100644 --- a/app/src/main/res/values-v16/themes.xml +++ b/app/src/main/res/values-v16/themes.xml @@ -1,7 +1,7 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 3db670e6..2d2ebd7d 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -7,10 +7,16 @@ + + + + + + @@ -37,6 +43,9 @@ + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b1422ad6..d3f9bcb2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,17 +1,26 @@ - #F1F0E6 #FF33B5E5 #FFFFFF #434343 #000000 - #ff33b5e5 #80000000 - #8033b5e5 #ff0099cc #ff33b5e5 #ffffbb33 #ff99cc00 #ffff4444 + + #2196f3 + #1e88e5 + #448aff + + #f44336 + #e53935 + #ff5252 + + #009688 + #00897b + #64ffda \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index cfe446f3..83fa4a42 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -29,15 +29,6 @@ match_parent wrap_content - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index ecba7592..fb47af81 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ - @@ -97,6 +112,9 @@ - - - - - - - + + -- cgit v1.2.3 From 302dd4b2e8ea0514cd489295f403edd4bfba33f1 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Wed, 24 Jun 2015 18:32:20 -0700 Subject: Make UpdateView be template based for easier use --- .../daneren2005/dsub/adapter/MainAdapter.java | 3 +- .../daneren2005/dsub/adapter/SearchAdapter.java | 4 +- .../daneren2005/dsub/view/AlbumListCountView.java | 6 +- .../github/daneren2005/dsub/view/AlbumView.java | 23 ++-- .../daneren2005/dsub/view/ArtistEntryView.java | 15 +-- .../github/daneren2005/dsub/view/ArtistView.java | 13 +- .../daneren2005/dsub/view/BasicHeaderView.java | 6 +- .../daneren2005/dsub/view/BasicListView.java | 7 +- .../github/daneren2005/dsub/view/GenreView.java | 5 +- .../daneren2005/dsub/view/PlaylistSongView.java | 16 +-- .../github/daneren2005/dsub/view/PlaylistView.java | 11 +- .../daneren2005/dsub/view/PodcastChannelView.java | 11 +- .../github/daneren2005/dsub/view/SettingView.java | 20 +-- .../github/daneren2005/dsub/view/ShareView.java | 5 +- .../github/daneren2005/dsub/view/SongView.java | 149 ++++++++++----------- .../github/daneren2005/dsub/view/UpdateView.java | 43 ++---- .../github/daneren2005/dsub/view/UpdateView2.java | 47 +++++++ .../github/daneren2005/dsub/view/UserView.java | 10 +- 18 files changed, 183 insertions(+), 211 deletions(-) create mode 100644 app/src/main/java/github/daneren2005/dsub/view/UpdateView2.java (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/MainAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/MainAdapter.java index e451bc19..8f1f1c38 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/MainAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/MainAdapter.java @@ -59,8 +59,7 @@ public class MainAdapter extends SectionAdapter { if(viewType == VIEW_TYPE_ALBUM_LIST) { updateView.setObject(context.getResources().getString(item)); } else { - // Hacky method to make sure updateBackground is called in background thread - updateView.setObject(item, null); + updateView.setObject(item); } } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SearchAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SearchAdapter.java index f395216e..c1185702 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SearchAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SearchAdapter.java @@ -85,10 +85,10 @@ public class SearchAdapter extends SectionAdapter { UpdateView view = holder.getUpdateView(); if(viewType == VIEW_TYPE_ALBUM_CELL || viewType == VIEW_TYPE_ALBUM_LINE) { AlbumView albumView = (AlbumView) view; - albumView.setObject(item, imageLoader); + albumView.setObject((Entry) item, imageLoader); } else if(viewType == VIEW_TYPE_SONG) { SongView songView = (SongView) view; - songView.setObject(item, false); + songView.setObject((Entry) item, false); } else if(viewType == VIEW_TYPE_ARTIST) { view.setObject(item); } diff --git a/app/src/main/java/github/daneren2005/dsub/view/AlbumListCountView.java b/app/src/main/java/github/daneren2005/dsub/view/AlbumListCountView.java index 81695f53..a1b14f61 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/AlbumListCountView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/AlbumListCountView.java @@ -32,12 +32,11 @@ import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.FileUtil; import github.daneren2005.dsub.util.Util; -public class AlbumListCountView extends UpdateView { +public class AlbumListCountView extends UpdateView2 { private final String TAG = AlbumListCountView.class.getSimpleName(); private TextView titleView; private TextView countView; - private int albumListString; private int startCount; private int count = 0; @@ -50,8 +49,7 @@ public class AlbumListCountView extends UpdateView { countView = (TextView) findViewById(R.id.basic_count_count); } - protected void setObjectImpl(Object obj1, Object obj2) { - this.albumListString = (Integer) obj1; + protected void setObjectImpl(Integer albumListString, Void dummy) { titleView.setText(albumListString); SharedPreferences prefs = Util.getPreferences(context); diff --git a/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java b/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java index 69f2ef13..3104864a 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/AlbumView.java @@ -20,7 +20,6 @@ package github.daneren2005.dsub.view; import android.content.Context; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageButton; @@ -31,17 +30,13 @@ import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.util.FileUtil; import github.daneren2005.dsub.util.ImageLoader; -import github.daneren2005.dsub.util.Util; + import java.io.File; -import java.util.List; -public class AlbumView extends UpdateView { +public class AlbumView extends UpdateView2 { private static final String TAG = AlbumView.class.getSimpleName(); - private Context context; - private MusicDirectory.Entry album; private File file; - private View coverArtView; private TextView titleView; private TextView artistView; @@ -49,7 +44,6 @@ public class AlbumView extends UpdateView { public AlbumView(Context context, boolean cell) { super(context); - this.context = context; if(cell) { LayoutInflater.from(context).inflate(R.layout.album_cell_item, this, true); @@ -72,8 +66,7 @@ public class AlbumView extends UpdateView { this.showArtist = showArtist; } - protected void setObjectImpl(Object obj1, Object obj2) { - this.album = (MusicDirectory.Entry) obj1; + protected void setObjectImpl(MusicDirectory.Entry album, ImageLoader imageLoader) { titleView.setText(album.getAlbumDisplay()); String artist = ""; if(showArtist) { @@ -88,23 +81,23 @@ public class AlbumView extends UpdateView { artist += album.getYear(); } artistView.setText(album.getArtist() == null ? "" : artist); - imageTask = ((ImageLoader)obj2).loadImage(coverArtView, album, false, true); + imageTask = imageLoader.loadImage(coverArtView, album, false, true); file = null; } @Override protected void updateBackground() { if(file == null) { - file = FileUtil.getAlbumDirectory(context, album); + file = FileUtil.getAlbumDirectory(context, item); } exists = file.exists(); - isStarred = album.isStarred(); - isRated = album.getRating(); + isStarred = item.isStarred(); + isRated = item.getRating(); } public MusicDirectory.Entry getEntry() { - return album; + return item; } public File getFile() { diff --git a/app/src/main/java/github/daneren2005/dsub/view/ArtistEntryView.java b/app/src/main/java/github/daneren2005/dsub/view/ArtistEntryView.java index 71bdeb78..f6a6adb3 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/ArtistEntryView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/ArtistEntryView.java @@ -19,7 +19,6 @@ package github.daneren2005.dsub.view; import android.content.Context; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageButton; @@ -28,26 +27,21 @@ import android.widget.TextView; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.util.FileUtil; -import github.daneren2005.dsub.util.ImageLoader; -import github.daneren2005.dsub.util.Util; + import java.io.File; /** * Used to display albums in a {@code ListView}. * * @author Sindre Mehus */ -public class ArtistEntryView extends UpdateView { +public class ArtistEntryView extends UpdateView { private static final String TAG = ArtistEntryView.class.getSimpleName(); - private Context context; - private MusicDirectory.Entry artist; private File file; - private TextView titleView; public ArtistEntryView(Context context) { super(context); - this.context = context; LayoutInflater.from(context).inflate(R.layout.basic_list_item, this, true); titleView = (TextView) findViewById(R.id.item_name); @@ -61,8 +55,7 @@ public class ArtistEntryView extends UpdateView { }); } - protected void setObjectImpl(Object obj) { - this.artist = (MusicDirectory.Entry) obj; + protected void setObjectImpl(MusicDirectory.Entry artist) { titleView.setText(artist.getTitle()); file = FileUtil.getArtistDirectory(context, artist); } @@ -70,7 +63,7 @@ public class ArtistEntryView extends UpdateView { @Override protected void updateBackground() { exists = file.exists(); - isStarred = artist.isStarred(); + isStarred = item.isStarred(); } public File getFile() { diff --git a/app/src/main/java/github/daneren2005/dsub/view/ArtistView.java b/app/src/main/java/github/daneren2005/dsub/view/ArtistView.java index c255be69..d86c5d26 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/ArtistView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/ArtistView.java @@ -35,18 +35,14 @@ import java.io.File; * * @author Sindre Mehus */ -public class ArtistView extends UpdateView { +public class ArtistView extends UpdateView { private static final String TAG = ArtistView.class.getSimpleName(); - - private Context context; - private Artist artist; - private File file; + private File file; private TextView titleView; public ArtistView(Context context) { super(context); - this.context = context; LayoutInflater.from(context).inflate(R.layout.basic_list_item, this, true); titleView = (TextView) findViewById(R.id.item_name); @@ -60,8 +56,7 @@ public class ArtistView extends UpdateView { }); } - protected void setObjectImpl(Object obj) { - this.artist = (Artist) obj; + protected void setObjectImpl(Artist artist) { titleView.setText(artist.getName()); file = FileUtil.getArtistDirectory(context, artist); } @@ -69,7 +64,7 @@ public class ArtistView extends UpdateView { @Override protected void updateBackground() { exists = file.exists(); - isStarred = artist.isStarred(); + isStarred = item.isStarred(); } public File getFile() { diff --git a/app/src/main/java/github/daneren2005/dsub/view/BasicHeaderView.java b/app/src/main/java/github/daneren2005/dsub/view/BasicHeaderView.java index b5dad2d1..01aa42e1 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/BasicHeaderView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/BasicHeaderView.java @@ -21,7 +21,7 @@ import android.widget.TextView; import github.daneren2005.dsub.R; -public class BasicHeaderView extends UpdateView { +public class BasicHeaderView extends UpdateView { TextView nameView; public BasicHeaderView(Context context) { @@ -34,7 +34,7 @@ public class BasicHeaderView extends UpdateView { nameView = (TextView) findViewById(R.id.item_name); } - protected void setObjectImpl(Object obj) { - nameView.setText((String) obj); + protected void setObjectImpl(String string) { + nameView.setText(string); } } diff --git a/app/src/main/java/github/daneren2005/dsub/view/BasicListView.java b/app/src/main/java/github/daneren2005/dsub/view/BasicListView.java index 3169f903..ca7e8993 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/BasicListView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/BasicListView.java @@ -24,12 +24,11 @@ import android.widget.TextView; import github.daneren2005.dsub.R; -public class BasicListView extends UpdateView { +public class BasicListView extends UpdateView { private TextView titleView; public BasicListView(Context context) { super(context, false); - this.context = context; LayoutInflater.from(context).inflate(R.layout.basic_list_item, this, true); titleView = (TextView) findViewById(R.id.item_name); @@ -39,7 +38,7 @@ public class BasicListView extends UpdateView { moreButton.setVisibility(View.GONE); } - protected void setObjectImpl(Object obj) { - titleView.setText((String) obj); + protected void setObjectImpl(String string) { + titleView.setText(string); } } diff --git a/app/src/main/java/github/daneren2005/dsub/view/GenreView.java b/app/src/main/java/github/daneren2005/dsub/view/GenreView.java index 8dbcf89d..b29aefba 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/GenreView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/GenreView.java @@ -25,7 +25,7 @@ import android.widget.TextView; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.Genre; -public class GenreView extends UpdateView { +public class GenreView extends UpdateView { private static final String TAG = GenreView.class.getSimpleName(); private TextView titleView; @@ -41,8 +41,7 @@ public class GenreView extends UpdateView { albumsView = (TextView) findViewById(R.id.genre_albums); } - public void setObjectImpl(Object obj) { - Genre genre = (Genre) obj; + public void setObjectImpl(Genre genre) { titleView.setText(genre.getName()); if(genre.getAlbumCount() != null) { diff --git a/app/src/main/java/github/daneren2005/dsub/view/PlaylistSongView.java b/app/src/main/java/github/daneren2005/dsub/view/PlaylistSongView.java index 0264a785..581b92e4 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/PlaylistSongView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/PlaylistSongView.java @@ -34,16 +34,12 @@ import github.daneren2005.dsub.util.FileUtil; import github.daneren2005.dsub.util.SyncUtil; import github.daneren2005.dsub.util.Util; -public class PlaylistSongView extends UpdateView { +public class PlaylistSongView extends UpdateView2> { private static final String TAG = PlaylistSongView.class.getSimpleName(); - private Context context; - private Playlist playlist; - private TextView titleView; private TextView countView; private int count = 0; - private List songs; public PlaylistSongView(Context context) { super(context, false); @@ -54,9 +50,7 @@ public class PlaylistSongView extends UpdateView { countView = (TextView) findViewById(R.id.basic_count_count); } - protected void setObjectImpl(Object obj1, Object obj2) { - this.playlist = (Playlist) obj1; - this.songs = (List) obj2; + protected void setObjectImpl(Playlist playlist, List songs) { count = 0; titleView.setText(playlist.getName()); // Make sure to hide initially so it's not present briefly before update @@ -69,11 +63,11 @@ public class PlaylistSongView extends UpdateView { count = 0; // Don't try to lookup playlist for Create New - if(!"-1".equals(playlist.getId())) { - MusicDirectory cache = FileUtil.deserialize(context, Util.getCacheName(context, "playlist", playlist.getId()), MusicDirectory.class); + if(!"-1".equals(item.getId())) { + MusicDirectory cache = FileUtil.deserialize(context, Util.getCacheName(context, "playlist", item.getId()), MusicDirectory.class); if(cache != null) { // Try to find song instances in the given playlists - for(MusicDirectory.Entry song: songs) { + for(MusicDirectory.Entry song: item2) { if(cache.getChildren().contains(song)) { count++; } diff --git a/app/src/main/java/github/daneren2005/dsub/view/PlaylistView.java b/app/src/main/java/github/daneren2005/dsub/view/PlaylistView.java index 29d5cc1c..cb7bd186 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/PlaylistView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/PlaylistView.java @@ -33,17 +33,13 @@ import github.daneren2005.dsub.util.SyncUtil; * * @author Sindre Mehus */ -public class PlaylistView extends UpdateView { +public class PlaylistView extends UpdateView { private static final String TAG = PlaylistView.class.getSimpleName(); - private Context context; - private Playlist playlist; - private TextView titleView; public PlaylistView(Context context) { super(context); - this.context = context; LayoutInflater.from(context).inflate(R.layout.basic_list_item, this, true); titleView = (TextView) findViewById(R.id.item_name); @@ -52,13 +48,12 @@ public class PlaylistView extends UpdateView { moreButton = (ImageView) findViewById(R.id.item_more); } - protected void setObjectImpl(Object obj) { - this.playlist = (Playlist) obj; + protected void setObjectImpl(Playlist playlist) { titleView.setText(playlist.getName()); } @Override protected void updateBackground() { - pinned = SyncUtil.isSyncedPlaylist(context, playlist.getId()); + pinned = SyncUtil.isSyncedPlaylist(context, item.getId()); } } diff --git a/app/src/main/java/github/daneren2005/dsub/view/PodcastChannelView.java b/app/src/main/java/github/daneren2005/dsub/view/PodcastChannelView.java index ada8019e..4878ad67 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/PodcastChannelView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/PodcastChannelView.java @@ -30,18 +30,14 @@ import github.daneren2005.dsub.util.SyncUtil; import github.daneren2005.dsub.util.FileUtil; import java.io.File; -public class PodcastChannelView extends UpdateView { +public class PodcastChannelView extends UpdateView { private static final String TAG = PodcastChannelView.class.getSimpleName(); - private Context context; - private PodcastChannel channel; private File file; - private TextView titleView; public PodcastChannelView(Context context) { super(context); - this.context = context; LayoutInflater.from(context).inflate(R.layout.basic_list_item, this, true); titleView = (TextView) findViewById(R.id.item_name); @@ -55,8 +51,7 @@ public class PodcastChannelView extends UpdateView { }); } - protected void setObjectImpl(Object obj) { - channel = (PodcastChannel) obj; + protected void setObjectImpl(PodcastChannel channel) { if(channel.getName() != null) { titleView.setText(channel.getName()); } else { @@ -67,7 +62,7 @@ public class PodcastChannelView extends UpdateView { @Override protected void updateBackground() { - if(SyncUtil.isSyncedPodcast(context, channel.getId())) { + if(SyncUtil.isSyncedPodcast(context, item.getId())) { if(exists) { shaded = false; exists = false; diff --git a/app/src/main/java/github/daneren2005/dsub/view/SettingView.java b/app/src/main/java/github/daneren2005/dsub/view/SettingView.java index 63b2c844..d46dc5d2 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/SettingView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/SettingView.java @@ -26,13 +26,10 @@ import github.daneren2005.dsub.domain.User; import static github.daneren2005.dsub.domain.User.Setting; -public class SettingView extends UpdateView { +public class SettingView extends UpdateView2 { private final TextView titleView; private final CheckBox checkBox; - private Setting setting; - private boolean enabled = false; - public SettingView(Context context) { super(context, false); this.context = context; @@ -43,21 +40,19 @@ public class SettingView extends UpdateView { checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if(setting != null) { - setting.setValue(isChecked); + if(item != null) { + item.setValue(isChecked); } } }); checkBox.setClickable(false); } - protected void setObjectImpl(Object obj, Object editable) { - this.setting = (Setting) obj; - + protected void setObjectImpl(Setting setting, Boolean isEditable) { // Can't edit non-role parts String name = setting.getName(); if(name.indexOf("Role") == -1) { - editable = false; + item2 = false; } int res = -1; @@ -100,13 +95,12 @@ public class SettingView extends UpdateView { checkBox.setChecked(false); } - enabled = (Boolean) editable; - checkBox.setEnabled(enabled); + checkBox.setEnabled(item2); } @Override public boolean isCheckable() { - return this.enabled; + return item2; } public void setChecked(boolean checked) { diff --git a/app/src/main/java/github/daneren2005/dsub/view/ShareView.java b/app/src/main/java/github/daneren2005/dsub/view/ShareView.java index bfb5b198..12294369 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/ShareView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/ShareView.java @@ -31,7 +31,7 @@ import java.util.Locale; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.Share; -public class ShareView extends UpdateView { +public class ShareView extends UpdateView { private static final String TAG = ShareView.class.getSimpleName(); private TextView titleView; @@ -53,8 +53,7 @@ public class ShareView extends UpdateView { }); } - public void setObjectImpl(Object obj) { - Share share = (Share) obj; + public void setObjectImpl(Share share) { titleView.setText(share.getName()); if(share.getExpires() != null) { descriptionView.setText(context.getResources().getString(R.string.share_expires, new SimpleDateFormat("E MMM d, yyyy", Locale.ENGLISH).format(share.getExpires()))); diff --git a/app/src/main/java/github/daneren2005/dsub/view/SongView.java b/app/src/main/java/github/daneren2005/dsub/view/SongView.java index 49a09578..fadf100e 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/SongView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/SongView.java @@ -38,20 +38,18 @@ import java.io.File; * * @author Sindre Mehus */ -public class SongView extends UpdateView implements Checkable { - private static final String TAG = SongView.class.getSimpleName(); - - private MusicDirectory.Entry song; - - private CheckedTextView checkedTextView; - private TextView titleTextView; - private TextView artistTextView; - private TextView durationTextView; - private TextView statusTextView; +public class SongView extends UpdateView2 implements Checkable { + private static final String TAG = SongView.class.getSimpleName(); + + private CheckedTextView checkedTextView; + private TextView titleTextView; + private TextView artistTextView; + private TextView durationTextView; + private TextView statusTextView; private ImageView statusImageView; private ImageView bookmarkButton; private View bottomRowView; - + private DownloadService downloadService; private long revision = -1; private DownloadFile downloadFile; @@ -68,30 +66,29 @@ public class SongView extends UpdateView implements Checkable { private boolean isBookmarked = false; private boolean bookmarked = false; - public SongView(Context context) { - super(context); - LayoutInflater.from(context).inflate(R.layout.song_list_item, this, true); + public SongView(Context context) { + super(context); + LayoutInflater.from(context).inflate(R.layout.song_list_item, this, true); - checkedTextView = (CheckedTextView) findViewById(R.id.song_check); - titleTextView = (TextView) findViewById(R.id.song_title); - artistTextView = (TextView) findViewById(R.id.song_artist); - durationTextView = (TextView) findViewById(R.id.song_duration); - statusTextView = (TextView) findViewById(R.id.song_status); + checkedTextView = (CheckedTextView) findViewById(R.id.song_check); + titleTextView = (TextView) findViewById(R.id.song_title); + artistTextView = (TextView) findViewById(R.id.song_artist); + durationTextView = (TextView) findViewById(R.id.song_duration); + statusTextView = (TextView) findViewById(R.id.song_status); statusImageView = (ImageView) findViewById(R.id.song_status_icon); ratingBar = (RatingBar) findViewById(R.id.song_rating); - starButton = (ImageButton) findViewById(R.id.song_star); - starButton.setFocusable(false); + starButton = (ImageButton) findViewById(R.id.song_star); + starButton.setFocusable(false); bookmarkButton = (ImageButton) findViewById(R.id.song_bookmark); bookmarkButton.setFocusable(false); moreButton = (ImageView) findViewById(R.id.more_button); bottomRowView = findViewById(R.id.song_bottom); - } + } + + public void setObjectImpl(MusicDirectory.Entry song, Boolean checkable) { + this.checkable = checkable; - public void setObjectImpl(Object obj1, Object obj2) { - this.song = (MusicDirectory.Entry) obj1; - checkable = (Boolean) obj2; - - StringBuilder artist = new StringBuilder(40); + StringBuilder artist = new StringBuilder(40); boolean isPodcast = song instanceof PodcastEpisode; if(!song.isVideo() || isPodcast) { @@ -105,11 +102,11 @@ public class SongView extends UpdateView implements Checkable { else if(song.getArtist() != null) { artist.append(song.getArtist()); } - + if(isPodcast) { String status = ((PodcastEpisode) song).getStatus(); int statusRes = -1; - + if("error".equals(status)) { statusRes = R.string.song_details_error; } else if("skipped".equals(status)) { @@ -117,7 +114,7 @@ public class SongView extends UpdateView implements Checkable { } else if("downloading".equals(status)) { statusRes = R.string.song_details_downloading; } - + if(statusRes != -1) { artist.append(" ("); artist.append(getContext().getString(statusRes)); @@ -131,16 +128,16 @@ public class SongView extends UpdateView implements Checkable { bottomRowView.setVisibility(View.GONE); statusTextView.setText(Util.formatDuration(song.getDuration())); } - + String title = song.getTitle(); Integer track = song.getTrack(); if(track != null && Util.getDisplayTrack(context)) { title = String.format("%02d", track) + " " + title; } - titleTextView.setText(title); + titleTextView.setText(title); artistTextView.setText(artist); - checkedTextView.setVisibility(checkable ? View.VISIBLE : View.GONE); + checkedTextView.setVisibility(checkable ? View.VISIBLE : View.GONE); this.setBackgroundColor(0x00000000); ratingBar.setVisibility(View.GONE); @@ -150,28 +147,28 @@ public class SongView extends UpdateView implements Checkable { loaded = false; dontChangeDownloadFile = false; } - + public void setDownloadFile(DownloadFile downloadFile) { this.downloadFile = downloadFile; dontChangeDownloadFile = true; } - + public DownloadFile getDownloadFile() { return downloadFile; } - + @Override protected void updateBackground() { - if (downloadService == null) { + if (downloadService == null) { downloadService = DownloadService.getInstance(); if(downloadService == null) { return; } - } + } long newRevision = downloadService.getDownloadListUpdateRevision(); if((revision != newRevision && dontChangeDownloadFile == false) || downloadFile == null) { - downloadFile = downloadService.forSong(song); + downloadFile = downloadService.forSong(item); revision = newRevision; } @@ -179,27 +176,27 @@ public class SongView extends UpdateView implements Checkable { isSaved = downloadFile.isSaved(); partialFile = downloadFile.getPartialFile(); partialFileExists = partialFile.exists(); - isStarred = song.isStarred(); - isBookmarked = song.getBookmark() != null; - isRated = song.getRating(); - + isStarred = item.isStarred(); + isBookmarked = item.getBookmark() != null; + isRated = item.getRating(); + // Check if needs to load metadata: check against all fields that we know are null in offline mode - if(song.getBitRate() == null && song.getDuration() == null && song.getDiscNumber() == null && isWorkDone) { - song.loadMetadata(downloadFile.getCompleteFile()); + if(item.getBitRate() == null && item.getDuration() == null && item.getDiscNumber() == null && isWorkDone) { + item.loadMetadata(downloadFile.getCompleteFile()); loaded = true; } } @Override - protected void update() { + protected void update() { if(loaded) { - setObjectImpl(song, checkedTextView.getVisibility() == View.VISIBLE); + setObjectImpl(item, checkedTextView.getVisibility() == View.VISIBLE); + } + if (downloadService == null || downloadFile == null) { + return; } - if (downloadService == null || downloadFile == null) { - return; - } - if(song.isStarred()) { + if(item.isStarred()) { if(!starred) { starButton.setVisibility(View.VISIBLE); starred = true; @@ -211,13 +208,13 @@ public class SongView extends UpdateView implements Checkable { } } - if (isWorkDone) { + if (isWorkDone) { int moreImage = isSaved ? R.drawable.download_pinned : R.drawable.download_cached; if(moreImage != this.moreImage) { moreButton.setImageResource(moreImage); this.moreImage = moreImage; } - } else if(this.moreImage != R.drawable.download_none_light) { + } else if(this.moreImage != R.drawable.download_none_light) { int[] attrs = new int[] {R.attr.download_none}; TypedArray typedArray = context.obtainStyledAttributes(attrs); moreButton.setImageResource(typedArray.getResourceId(0, 0)); @@ -225,7 +222,7 @@ public class SongView extends UpdateView implements Checkable { this.moreImage = R.drawable.download_none_light; } - if (downloadFile.isDownloading() && !downloadFile.isDownloadCancelled() && partialFileExists) { + if (downloadFile.isDownloading() && !downloadFile.isDownloadCancelled() && partialFileExists) { double percentage = (partialFile.length() * 100.0) / downloadFile.getEstimatedSize(); percentage = Math.min(percentage, 100); statusTextView.setText((int)percentage + " %"); @@ -233,24 +230,24 @@ public class SongView extends UpdateView implements Checkable { statusImageView.setVisibility(View.VISIBLE); rightImage = true; } - } else if(rightImage) { - statusTextView.setText(null); + } else if(rightImage) { + statusTextView.setText(null); statusImageView.setVisibility(View.GONE); rightImage = false; - } + } - boolean playing = downloadService.getCurrentPlaying() == downloadFile; - if (playing) { + boolean playing = downloadService.getCurrentPlaying() == downloadFile; + if (playing) { if(!this.playing) { this.playing = playing; int[] attrs = new int[] {R.attr.media_button_start}; TypedArray typedArray = context.obtainStyledAttributes(attrs); - titleTextView.setCompoundDrawablesWithIntrinsicBounds(typedArray.getResourceId(0, 0), 0, 0, 0); + titleTextView.setCompoundDrawablesWithIntrinsicBounds(typedArray.getResourceId(0, 0), 0, 0, 0); } - } else { + } else { if(this.playing) { this.playing = playing; - titleTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); + titleTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); } } @@ -290,24 +287,24 @@ public class SongView extends UpdateView implements Checkable { rating = isRated; } - } + } - @Override - public void setChecked(boolean b) { - checkedTextView.setChecked(b); - } + @Override + public void setChecked(boolean b) { + checkedTextView.setChecked(b); + } - @Override - public boolean isChecked() { - return checkedTextView.isChecked(); - } + @Override + public boolean isChecked() { + return checkedTextView.isChecked(); + } - @Override - public void toggle() { - checkedTextView.toggle(); - } + @Override + public void toggle() { + checkedTextView.toggle(); + } public MusicDirectory.Entry getEntry() { - return song; + return item; } } diff --git a/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java b/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java index 44831c60..8e1029df 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java @@ -20,7 +20,6 @@ package github.daneren2005.dsub.view; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.Color; import android.os.Handler; import android.os.Looper; import android.support.v7.widget.RecyclerView; @@ -38,20 +37,20 @@ import java.util.List; import java.util.WeakHashMap; import github.daneren2005.dsub.domain.MusicDirectory; -import github.daneren2005.dsub.util.ImageLoader; import github.daneren2005.dsub.R; import github.daneren2005.dsub.util.SilentBackgroundTask; -public class UpdateView extends LinearLayout { +public abstract class UpdateView extends LinearLayout { private static final String TAG = UpdateView.class.getSimpleName(); private static final WeakHashMap INSTANCES = new WeakHashMap(); - private static Handler backgroundHandler; - private static Handler uiHandler; + protected static Handler backgroundHandler; + protected static Handler uiHandler; private static Runnable updateRunnable; private static int activeActivities = 0; protected Context context; + protected T item; protected RatingBar ratingBar; protected ImageButton starButton; protected ImageView moreButton; @@ -91,37 +90,16 @@ public class UpdateView extends LinearLayout { } - public void setObject(Object obj) { + public void setObject(T obj) { + item = obj; setObjectImpl(obj); updateBackground(); update(); } - public void setObject(Object obj1, Object obj2) { - if(imageTask != null) { - imageTask.cancel(); - imageTask = null; - } - - setObjectImpl(obj1, obj2); - backgroundHandler.post(new Runnable() { - @Override - public void run() { - updateBackground(); - uiHandler.post(new Runnable() { - @Override - public void run() { - update(); - } - }); - } - }); - } - protected void setObjectImpl(Object obj) { - - } - protected void setObjectImpl(Object obj1, Object obj2) { - + public void setObject(T obj1, Object obj2) { + setObject(obj1, null); } + protected abstract void setObjectImpl(T obj); private static synchronized void startUpdater() { if(uiHandler != null) { @@ -310,7 +288,7 @@ public class UpdateView extends LinearLayout { this.view = view; } - public UpdateView getUpdateView() { + public UpdateView getUpdateView() { return updateView; } public View getView() { @@ -324,3 +302,4 @@ public class UpdateView extends LinearLayout { } } } + diff --git a/app/src/main/java/github/daneren2005/dsub/view/UpdateView2.java b/app/src/main/java/github/daneren2005/dsub/view/UpdateView2.java new file mode 100644 index 00000000..0f0b5455 --- /dev/null +++ b/app/src/main/java/github/daneren2005/dsub/view/UpdateView2.java @@ -0,0 +1,47 @@ +package github.daneren2005.dsub.view; + +import android.content.Context; + +public abstract class UpdateView2 extends UpdateView { + protected T2 item2; + + public UpdateView2(Context context) { + super(context); + } + + public UpdateView2(Context context, boolean autoUpdate) { + super(context, autoUpdate); + } + + public final void setObject(T1 obj1) { + setObject(obj1, null); + } + @Override + public void setObject(T1 obj1, Object obj2) { + item = obj1; + item2 = (T2) obj2; + if(imageTask != null) { + imageTask.cancel(); + imageTask = null; + } + + setObjectImpl(item, item2); + backgroundHandler.post(new Runnable() { + @Override + public void run() { + updateBackground(); + uiHandler.post(new Runnable() { + @Override + public void run() { + update(); + } + }); + } + }); + } + + protected final void setObjectImpl(T1 obj1) { + setObjectImpl(obj1, null); + } + protected abstract void setObjectImpl(T1 obj1, T2 obj2); +} diff --git a/app/src/main/java/github/daneren2005/dsub/view/UserView.java b/app/src/main/java/github/daneren2005/dsub/view/UserView.java index dec8dbef..a97d755b 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/UserView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/UserView.java @@ -25,15 +25,12 @@ import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.User; import github.daneren2005.dsub.util.ImageLoader; -public class UserView extends UpdateView { - private User user; - +public class UserView extends UpdateView2 { private TextView usernameView; private ImageView avatarView; public UserView(Context context) { super(context, false); - this.context = context; LayoutInflater.from(context).inflate(R.layout.user_list_item, this, true); usernameView = (TextView) findViewById(R.id.item_name); @@ -46,9 +43,8 @@ public class UserView extends UpdateView { }); } - protected void setObjectImpl(Object obj, Object obj2) { - this.user = (User) obj; + protected void setObjectImpl(User user, ImageLoader imageLoader) { usernameView.setText(user.getUsername()); - imageTask = ((ImageLoader)obj2).loadAvatar(context, avatarView, user.getUsername()); + imageTask = imageLoader.loadAvatar(context, avatarView, user.getUsername()); } } -- cgit v1.2.3 From 09ba1ad3a2f9e9ad7fd634b2c34d95016dc8315b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Wed, 24 Jun 2015 18:47:56 -0700 Subject: Move settings initiation to before super so we don't crash setting up drawer header on first run --- .../dsub/activity/SubsonicFragmentActivity.java | 28 ++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index 95ec7c15..bdbdd44c 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -105,6 +105,24 @@ public class SubsonicFragmentActivity extends SubsonicActivity { @Override public void onCreate(Bundle savedInstanceState) { + if(savedInstanceState == null) { + String fragmentType = getIntent().getStringExtra(Constants.INTENT_EXTRA_FRAGMENT_TYPE); + boolean firstRun = false; + if (fragmentType == null) { + fragmentType = Util.openToTab(this); + if (fragmentType != null) { + firstRun = true; + } + } + + if ("".equals(fragmentType) || fragmentType == null || firstRun) { + // Initial startup stuff + if (!sessionInitialized) { + loadSession(); + } + } + } + super.onCreate(savedInstanceState); if (getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_EXIT)) { stopService(new Intent(this, DownloadService.class)); @@ -119,12 +137,10 @@ public class SubsonicFragmentActivity extends SubsonicActivity { UserUtil.seedCurrentUser(this); if (findViewById(R.id.fragment_container) != null && savedInstanceState == null) { String fragmentType = getIntent().getStringExtra(Constants.INTENT_EXTRA_FRAGMENT_TYPE); - boolean firstRun = false; if(fragmentType == null) { fragmentType = Util.openToTab(this); if(fragmentType != null) { getIntent().putExtra(Constants.INTENT_EXTRA_FRAGMENT_TYPE, fragmentType); - firstRun = true; switch(fragmentType) { case "Home": @@ -159,14 +175,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } currentFragment = getNewFragment(fragmentType); - - if("".equals(fragmentType) || fragmentType == null || firstRun) { - // Initial startup stuff - if(!sessionInitialized) { - loadSession(); - } - } - currentFragment.setPrimaryFragment(true); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, currentFragment, currentFragment.getSupportTag() + "").commit(); -- cgit v1.2.3 From 4de9c5147d1722f00deb0ae475b8f23464226147 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Wed, 24 Jun 2015 19:38:39 -0700 Subject: Hide NowPlaying bar when starting with nothing playing (can't hide later since layout bug keeps a placeholder there) + close bar after clearing queue --- .../dsub/activity/SubsonicFragmentActivity.java | 48 ++++++++++++---------- .../dsub/fragments/NowPlayingFragment.java | 2 +- .../main/res/layout/abstract_fragment_activity.xml | 4 +- 3 files changed, 31 insertions(+), 23 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index bdbdd44c..c7661080 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -36,6 +36,7 @@ import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; @@ -94,6 +95,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { private Toolbar nowPlayingToolbar; private ScheduledExecutorService executorService; + private View slideUpFrame; private View bottomBar; private ImageView coverArtView; private TextView trackView; @@ -258,6 +260,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { }, 200); } + slideUpFrame = findViewById(R.id.slide_up_frame); bottomBar = findViewById(R.id.bottom_bar); mainToolbar = (Toolbar) findViewById(R.id.main_toolbar); nowPlayingToolbar = (Toolbar) findViewById(R.id.now_playing_toolbar); @@ -601,30 +604,33 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } MusicDirectory.Entry song = null; - if(current != null) { - song = current.getSong(); - trackView.setText(song.getTitle()); - artistView.setText(song.getArtist()); - } else { - trackView.setText(R.string.main_title); - artistView.setText(R.string.main_artist); - } + if(current != null || slideUpFrame.getVisibility() != View.GONE) { + slideUpFrame.setVisibility(View.VISIBLE); + if (current != null) { + song = current.getSong(); + trackView.setText(song.getTitle()); + artistView.setText(song.getArtist()); + } 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(); + 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); } - getImageLoader().loadImage(coverArtView, song, false, height, false); - } - int[] attrs = new int[] {(state == PlayerState.STARTED) ? R.attr.actionbar_pause : R.attr.actionbar_start}; - TypedArray typedArray = this.obtainStyledAttributes(attrs); - startButton.setImageResource(typedArray.getResourceId(0, 0)); - typedArray.recycle(); + int[] attrs = new int[]{(state == PlayerState.STARTED) ? R.attr.actionbar_pause : R.attr.actionbar_start}; + TypedArray typedArray = this.obtainStyledAttributes(attrs); + startButton.setImageResource(typedArray.getResourceId(0, 0)); + typedArray.recycle(); + } } public void checkUpdates() { diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java index 151a66ca..0f9d9f68 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java @@ -738,7 +738,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis @Override protected void done(Void result) { - onDownloadListChanged(); + context.closeNowPlaying(); } }.execute(); } diff --git a/app/src/main/res/layout/abstract_fragment_activity.xml b/app/src/main/res/layout/abstract_fragment_activity.xml index bf8d9640..44ac35fd 100644 --- a/app/src/main/res/layout/abstract_fragment_activity.xml +++ b/app/src/main/res/layout/abstract_fragment_activity.xml @@ -27,9 +27,11 @@ + android:orientation="vertical" + android:visibility="gone"> Date: Thu, 25 Jun 2015 22:48:14 -0700 Subject: Revert previous change since it causes bar to not show up at start --- .../dsub/activity/SubsonicFragmentActivity.java | 45 ++++++++++------------ .../main/res/layout/abstract_fragment_activity.xml | 3 +- 2 files changed, 22 insertions(+), 26 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index c7661080..f7ba429f 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -604,33 +604,30 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } MusicDirectory.Entry song = null; - if(current != null || slideUpFrame.getVisibility() != View.GONE) { - slideUpFrame.setVisibility(View.VISIBLE); - if (current != null) { - song = current.getSong(); - trackView.setText(song.getTitle()); - artistView.setText(song.getArtist()); - } else { - trackView.setText(R.string.main_title); - artistView.setText(R.string.main_artist); - } + if (current != null) { + song = current.getSong(); + trackView.setText(song.getTitle()); + artistView.setText(song.getArtist()); + } 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); + 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(); } - - int[] attrs = new int[]{(state == PlayerState.STARTED) ? R.attr.actionbar_pause : R.attr.actionbar_start}; - TypedArray typedArray = this.obtainStyledAttributes(attrs); - startButton.setImageResource(typedArray.getResourceId(0, 0)); - typedArray.recycle(); + getImageLoader().loadImage(coverArtView, song, false, height, false); } + + int[] attrs = new int[]{(state == PlayerState.STARTED) ? R.attr.actionbar_pause : R.attr.actionbar_start}; + TypedArray typedArray = this.obtainStyledAttributes(attrs); + startButton.setImageResource(typedArray.getResourceId(0, 0)); + typedArray.recycle(); } public void checkUpdates() { diff --git a/app/src/main/res/layout/abstract_fragment_activity.xml b/app/src/main/res/layout/abstract_fragment_activity.xml index 44ac35fd..672698de 100644 --- a/app/src/main/res/layout/abstract_fragment_activity.xml +++ b/app/src/main/res/layout/abstract_fragment_activity.xml @@ -30,8 +30,7 @@ android:id="@+id/slide_up_frame" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:visibility="gone"> + android:orientation="vertical"> Date: Thu, 25 Jun 2015 08:57:26 -0700 Subject: Reimplement hiding bottom bar using setPanelState(HIDDEN) --- .../daneren2005/dsub/activity/SubsonicFragmentActivity.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index f7ba429f..43bd15c7 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -597,6 +597,9 @@ public class SubsonicFragmentActivity extends SubsonicActivity { DownloadFile current = downloadService.getCurrentPlaying(); PlayerState state = downloadService.getPlayerState(); if(current == currentPlaying && state == currentState) { + if(current == null && slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.HIDDEN); + } return; } else { currentPlaying = current; @@ -608,9 +611,12 @@ public class SubsonicFragmentActivity extends SubsonicActivity { song = current.getSong(); trackView.setText(song.getTitle()); artistView.setText(song.getArtist()); - } else { - trackView.setText(R.string.main_title); - artistView.setText(R.string.main_artist); + + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.HIDDEN) { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } + } else if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { + slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.HIDDEN); } if (coverArtView != null) { -- cgit v1.2.3 From 03da89a7a0a3dd2c642bc8c5a7f12ed04d1ffc46 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 25 Jun 2015 17:46:04 -0700 Subject: #525 Implement swipe remove on DownloadFragment --- .../dsub/fragments/DownloadFragment.java | 52 ++++++++++++++++++++++ .../daneren2005/dsub/service/DownloadService.java | 10 +++++ 2 files changed, 62 insertions(+) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java index 5a3d63ad..b89a25c5 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java @@ -16,10 +16,17 @@ package github.daneren2005.dsub.fragments; import android.content.DialogInterface; +import android.os.Bundle; import android.os.Handler; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -39,6 +46,7 @@ import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.adapter.DownloadFileAdapter; +import github.daneren2005.dsub.view.SongView; import github.daneren2005.dsub.view.UpdateView; public class DownloadFragment extends SelectRecyclerFragment { @@ -50,6 +58,50 @@ public class DownloadFragment extends SelectRecyclerFragment { pullToRefresh = false; } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { + super.onCreateView(inflater, container, bundle); + + ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) { + @Override + public boolean onMove(RecyclerView recyclerView, final RecyclerView.ViewHolder fromHolder, final RecyclerView.ViewHolder toHolder) { + new SilentBackgroundTask(context) { + private int from; + private int to; + + @Override + protected Void doInBackground() throws Throwable { + from = fromHolder.getAdapterPosition(); + to = toHolder.getAdapterPosition(); + getDownloadService().swap(false, from, to); + return null; + } + + @Override + protected void done(Void result) { + adapter.notifyItemMoved(from, to); + } + }.execute(); + + return true; + } + + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + SongView songView = (SongView) ((UpdateView.UpdateViewHolder) viewHolder).getUpdateView(); + DownloadFile downloadFile = songView.getDownloadFile(); + + DownloadService downloadService = getDownloadService(); + downloadService.removeBackground(downloadFile); + adapter.removeItem(downloadFile); + currentRevision = downloadService.getDownloadListUpdateRevision(); + } + }); + touchHelper.attachToRecyclerView(recyclerView); + + return rootView; + } + @Override public void onResume() { super.onResume(); diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java index bf68c450..2e3217d2 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java @@ -739,6 +739,16 @@ public class DownloadService extends Service { setNextPlaying(); } } + public synchronized void removeBackground(DownloadFile downloadFile) { + if (downloadFile == currentDownloading && downloadFile != currentPlaying && downloadFile != nextPlaying) { + currentDownloading.cancelDownload(); + currentDownloading = null; + } + + backgroundDownloadList.remove(downloadFile); + revision++; + checkDownloads(); + } public synchronized void delete(List songs) { for (MusicDirectory.Entry song : songs) { -- cgit v1.2.3 From c90da12d795ad13d538a85a3c7fa11f5d5bc1e1b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 25 Jun 2015 17:46:37 -0700 Subject: #517 Replace ContextMenu with PopupMenu --- .../daneren2005/dsub/adapter/SectionAdapter.java | 35 +++++++------ .../daneren2005/dsub/fragments/AdminFragment.java | 15 +++--- .../daneren2005/dsub/fragments/MainFragment.java | 10 ++++ .../dsub/fragments/NowPlayingFragment.java | 59 +++++----------------- .../daneren2005/dsub/fragments/SearchFragment.java | 23 ++------- .../dsub/fragments/SelectArtistFragment.java | 21 ++------ .../dsub/fragments/SelectBookmarkFragment.java | 25 +++------ .../dsub/fragments/SelectDirectoryFragment.java | 28 ++-------- .../dsub/fragments/SelectGenreFragment.java | 12 +++++ .../dsub/fragments/SelectPlaylistFragment.java | 27 ++++------ .../dsub/fragments/SelectPodcastsFragment.java | 26 ++++------ .../dsub/fragments/SelectRecyclerFragment.java | 1 - .../dsub/fragments/SelectShareFragment.java | 16 +++--- .../dsub/fragments/SelectVideoFragment.java | 18 ++----- .../dsub/fragments/SelectYearFragment.java | 12 +++++ .../dsub/fragments/SimilarArtistFragment.java | 20 ++------ .../dsub/fragments/SubsonicFragment.java | 52 +++++++++---------- .../daneren2005/dsub/fragments/UserFragment.java | 11 ++++ app/src/main/res/menu/nowplaying_context.xml | 4 -- .../main/res/menu/nowplaying_context_offline.xml | 4 -- app/src/main/res/values-de/strings.xml | 3 +- app/src/main/res/values-es/strings.xml | 3 +- app/src/main/res/values-fr/strings.xml | 3 +- app/src/main/res/values-hu/strings.xml | 3 +- app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values/strings.xml | 3 +- 26 files changed, 165 insertions(+), 270 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java index f57012b5..6f5def3e 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java @@ -16,8 +16,12 @@ package github.daneren2005.dsub.adapter; import android.content.Context; +import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -39,8 +43,6 @@ public abstract class SectionAdapter extends RecyclerView.Adapter> sections; protected boolean singleSectionHeader; protected OnItemClickedListener onItemClickedListener; - protected UpdateView contextView; - protected T contextItem; private List selected = new ArrayList<>(); protected SectionAdapter() {} @@ -100,9 +102,19 @@ public abstract class SectionAdapter extends RecyclerView.Adapter extends RecyclerView.Adapter onItemClickedListener) { this.onItemClickedListener = onItemClickedListener; } @@ -324,5 +325,7 @@ public abstract class SectionAdapter extends RecyclerView.Adapter { void onItemClicked(T item); + void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, T item); + boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, T item); } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/AdminFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/AdminFragment.java index f3f9eb64..69164036 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/AdminFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/AdminFragment.java @@ -17,6 +17,7 @@ package github.daneren2005.dsub.fragments; import android.os.Bundle; import android.view.ContextMenu; +import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -37,6 +38,7 @@ import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.UserUtil; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.adapter.UserAdapter; +import github.daneren2005.dsub.view.UpdateView; public class AdminFragment extends SelectRecyclerFragment { private static String TAG = AdminFragment.class.getSimpleName(); @@ -57,21 +59,16 @@ public class AdminFragment extends SelectRecyclerFragment { } @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - - MenuInflater inflater = context.getMenuInflater(); + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, User item) { if(UserUtil.isCurrentAdmin()) { - inflater.inflate(R.menu.admin_context, menu); + menuInflater.inflate(R.menu.admin_context, menu); } else if(UserUtil.isCurrentRole(User.SETTINGS)) { - inflater.inflate(R.menu.admin_context_user, menu); + menuInflater.inflate(R.menu.admin_context_user, menu); } } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - User user = adapter.getContextItem(); - + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, User user) { switch(menuItem.getItemId()) { case R.id.admin_change_email: UserUtil.changeEmail(context, user); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index 96e1d326..0e67b80d 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -31,6 +31,8 @@ import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.service.MusicServiceFactory; import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.view.ChangeLog; +import github.daneren2005.dsub.view.UpdateView; + import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -401,4 +403,12 @@ public class MainFragment extends SelectRecyclerFragment { showVideos(); } } + + @Override + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Integer item) {} + + @Override + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Integer item) { + return false; + } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java index 0f9d9f68..1b652f57 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java @@ -541,7 +541,6 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } } }); - registerForContextMenu(playlistView); if(Build.MODEL.equals("Nexus 4") || Build.MODEL.equals("GT-I9100")) { View slider = rootView.findViewById(R.id.download_slider); @@ -602,42 +601,25 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis } @Override - public void onCreateContextMenu(android.view.ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - if(!primaryFragment) { - return; + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, DownloadFile downloadFile) { + if(Util.isOffline(context)) { + menuInflater.inflate(R.menu.nowplaying_context_offline, menu); + } else { + menuInflater.inflate(R.menu.nowplaying_context, menu); + menu.findItem(R.id.menu_star).setTitle(downloadFile.getSong().isStarred() ? R.string.common_unstar : R.string.common_star); } - UpdateView targetView = songListAdapter.getContextView(); - menuInfo = new AdapterView.AdapterContextMenuInfo(targetView, 0, 0); - - if (view == playlistView) { - DownloadFile downloadFile = songListAdapter.getContextItem(); - - android.view.MenuInflater inflater = context.getMenuInflater(); - if(Util.isOffline(context)) { - inflater.inflate(R.menu.nowplaying_context_offline, menu); - } else { - inflater.inflate(R.menu.nowplaying_context, menu); - menu.findItem(R.id.menu_star).setTitle(downloadFile.getSong().isStarred() ? R.string.common_unstar : R.string.common_star); - } - if (downloadFile.getSong().getParent() == null) { - menu.findItem(R.id.menu_show_album).setVisible(false); - menu.findItem(R.id.menu_show_artist).setVisible(false); - } - - hideMenuItems(menu, (AdapterView.AdapterContextMenuInfo) menuInfo); + if (downloadFile.getSong().getParent() == null) { + menu.findItem(R.id.menu_show_album).setVisible(false); + menu.findItem(R.id.menu_show_artist).setVisible(false); } + + hideMenuItems(menu, updateView); } @Override - public boolean onContextItemSelected(android.view.MenuItem menuItem) { - if(!primaryFragment) { - return false; - } - - DownloadFile downloadFile = songListAdapter.getContextItem(); - return menuItemSelected(menuItem.getItemId(), downloadFile) || super.onContextItemSelected(menuItem); + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, DownloadFile downloadFile) { + return menuItemSelected(menuItem.getItemId(), downloadFile); } private boolean menuItemSelected(int menuItemId, final DownloadFile song) { @@ -705,20 +687,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis replaceFragment(fragment); return true; - } case R.id.menu_remove: - new SilentBackgroundTask(context) { - @Override - protected Void doInBackground() throws Throwable { - getDownloadService().remove(song); - return null; - } - - @Override - protected void done(Void result) { - onDownloadListChanged(); - } - }.execute(); - return true; + } case R.id.menu_delete: List songs = new ArrayList(1); songs.add(song.getSong()); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SearchFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SearchFragment.java index 20a87e7d..96b32d8d 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SearchFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SearchFragment.java @@ -123,32 +123,17 @@ public class SearchFragment extends SubsonicFragment implements SectionAdapter.O } @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - UpdateView targetView = adapter.getContextView(); - menuInfo = new AdapterView.AdapterContextMenuInfo(targetView, 0, 0); - - Serializable item = adapter.getContextItem(); - onCreateContextMenu(menu, view, menuInfo, item); + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Serializable item) { + onCreateContextMenuSupport(menu, menuInflater, updateView, item); if(item instanceof MusicDirectory.Entry && !((MusicDirectory.Entry) item).isVideo() && !Util.isOffline(context)) { menu.removeItem(R.id.song_menu_remove_playlist); } - recreateContextMenu(menu); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - Serializable item = adapter.getContextItem(); - if(onContextItemSelected(menuItem, item)) { - return true; - } - - return true; + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Serializable item) { + return onContextItemSelected(menuItem, item); } @Override diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectArtistFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectArtistFragment.java index 8a2b7153..a9d5afd6 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectArtistFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectArtistFragment.java @@ -79,27 +79,14 @@ public class SelectArtistFragment extends SelectRecyclerFragment impleme } @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - UpdateView targetView = adapter.getContextView(); - menuInfo = new AdapterView.AdapterContextMenuInfo(targetView, 0, 0); - - Artist artist = adapter.getContextItem(); - - onCreateContextMenu(menu, view, menuInfo, artist); + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Artist item) { + onCreateContextMenuSupport(menu, menuInflater, updateView, item); recreateContextMenu(menu); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo(); - Artist artist = adapter.getContextItem(); - - return onContextItemSelected(menuItem, artist); + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Artist item) { + return onContextItemSelected(menuItem, item); } @Override diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java index a774a287..e326e3e2 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectBookmarkFragment.java @@ -19,6 +19,7 @@ package github.daneren2005.dsub.fragments; import android.view.ContextMenu; +import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -43,21 +44,13 @@ public class SelectBookmarkFragment extends SelectRecyclerFragment updateView, MusicDirectory.Entry item) { + menuInflater.inflate(R.menu.select_bookmark_context, menu); + hideMenuItems(menu, updateView); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - MusicDirectory.Entry bookmark = adapter.getContextItem(); - + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, MusicDirectory.Entry bookmark) { switch(menuItem.getItemId()) { case R.id.bookmark_menu_info: displayBookmarkInfo(bookmark); @@ -66,12 +59,8 @@ public class SelectBookmarkFragment extends SelectRecyclerFragment updateView, Entry entry) { if(Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_PLAY_NOW_AFTER, false) && menuItem.getItemId() == R.id.song_menu_play_now) { List songs = new ArrayList(); songs.add(entry); @@ -388,7 +370,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section playNow(songs); return true; } - + if(onContextItemSelected(menuItem, entry)) { return true; } @@ -404,7 +386,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section deletePodcastEpisode((PodcastEpisode) entry); break; } - + return true; } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectGenreFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectGenreFragment.java index fe012f62..cb57c280 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectGenreFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectGenreFragment.java @@ -16,6 +16,9 @@ package github.daneren2005.dsub.fragments; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -26,6 +29,7 @@ import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.adapter.GenreAdapter; +import github.daneren2005.dsub.view.UpdateView; import java.util.List; @@ -64,4 +68,12 @@ public class SelectGenreFragment extends SelectRecyclerFragment { replaceFragment(fragment); } + + @Override + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Genre item) {} + + @Override + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Genre item) { + return false; + } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java index 49589971..7a4c708e 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java @@ -7,6 +7,7 @@ import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.RecyclerView; import android.view.ContextMenu; +import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -31,6 +32,7 @@ import github.daneren2005.dsub.util.LoadingTask; import github.daneren2005.dsub.util.UserUtil; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.adapter.PlaylistAdapter; +import github.daneren2005.dsub.view.UpdateView; import java.util.ArrayList; import java.util.Arrays; @@ -40,23 +42,19 @@ public class SelectPlaylistFragment extends SelectRecyclerFragment { private static final String TAG = SelectPlaylistFragment.class.getSimpleName(); @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - - MenuInflater inflater = context.getMenuInflater(); + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Playlist playlist) { if (Util.isOffline(context)) { - inflater.inflate(R.menu.select_playlist_context_offline, menu); + menuInflater.inflate(R.menu.select_playlist_context_offline, menu); } else { - inflater.inflate(R.menu.select_playlist_context, menu); + menuInflater.inflate(R.menu.select_playlist_context, menu); - Playlist playlist = adapter.getContextItem(); if(SyncUtil.isSyncedPlaylist(context, playlist.getId())) { menu.removeItem(R.id.playlist_menu_sync); } else { menu.removeItem(R.id.playlist_menu_stop_sync); } - + if(!ServerInfo.checkServerVersion(context, "1.8")) { menu.removeItem(R.id.playlist_update_info); } else if(playlist.getPublic() != null && playlist.getPublic() == true && playlist.getId().indexOf(".m3u") == -1 && !UserUtil.getCurrentUsername(context).equals(playlist.getOwner())) { @@ -69,13 +67,7 @@ public class SelectPlaylistFragment extends SelectRecyclerFragment { } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - Playlist playlist = adapter.getContextItem(); - + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Playlist playlist) { SubsonicFragment fragment; Bundle args; FragmentTransaction trans; @@ -119,10 +111,9 @@ public class SelectPlaylistFragment extends SelectRecyclerFragment { case R.id.playlist_update_info: updatePlaylistInfo(playlist); break; - default: - return false; } - return true; + + return false; } @Override diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java index 520d0414..f8afce6e 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java @@ -18,6 +18,8 @@ import android.support.v7.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; @@ -37,6 +39,7 @@ import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.UserUtil; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.adapter.PodcastChannelAdapter; +import github.daneren2005.dsub.view.UpdateView; import java.util.ArrayList; import java.util.List; @@ -61,35 +64,26 @@ public class SelectPodcastsFragment extends SelectRecyclerFragment updateView, PodcastChannel podcast) { if(!Util.isOffline(context) && UserUtil.canPodcast()) { - inflater.inflate(R.menu.select_podcasts_context, menu); + menuInflater.inflate(R.menu.select_podcasts_context, menu); - PodcastChannel podcast = adapter.getContextItem(); if(SyncUtil.isSyncedPodcast(context, podcast.getId())) { menu.removeItem(R.id.podcast_menu_sync); } else { menu.removeItem(R.id.podcast_menu_stop_sync); } } else { - inflater.inflate(R.menu.select_podcasts_context_offline, menu); + menuInflater.inflate(R.menu.select_podcasts_context_offline, menu); } recreateContextMenu(menu); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - PodcastChannel channel = adapter.getContextItem(); + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, PodcastChannel channel) { switch (menuItem.getItemId()) { case R.id.podcast_menu_sync: syncPodcast(channel); @@ -104,7 +98,7 @@ public class SelectPodcastsFragment extends SelectRecyclerFragment(context) { @Override diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java index 526a4312..0c3b27f8 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java @@ -89,7 +89,6 @@ public abstract class SelectRecyclerFragment extends SubsonicFragment impleme } else { recyclerView.setAdapter(adapter = getAdapter(objects)); } - registerForContextMenu(recyclerView); return rootView; } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectShareFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectShareFragment.java index 3d79b7b9..65723618 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectShareFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectShareFragment.java @@ -19,6 +19,8 @@ import android.support.v7.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.CheckBox; @@ -41,25 +43,19 @@ import github.daneren2005.dsub.util.LoadingTask; import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.adapter.ShareAdapter; +import github.daneren2005.dsub.view.UpdateView; public class SelectShareFragment extends SelectRecyclerFragment { private static final String TAG = SelectShareFragment.class.getSimpleName(); @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - android.view.MenuInflater inflater = context.getMenuInflater(); - inflater.inflate(R.menu.select_share_context, menu); + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Share item) { + menuInflater.inflate(R.menu.select_share_context, menu); recreateContextMenu(menu); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - Share share = adapter.getContextItem(); + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Share share) { switch (menuItem.getItemId()) { case R.id.share_menu_share: shareExternal(share); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectVideoFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectVideoFragment.java index bf25db77..0a79b3d5 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectVideoFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectVideoFragment.java @@ -16,6 +16,8 @@ package github.daneren2005.dsub.fragments; import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; @@ -60,23 +62,13 @@ public class SelectVideoFragment extends SelectRecyclerFragment updateView, MusicDirectory.Entry item) { + onCreateContextMenuSupport(menu, menuInflater, updateView, item); recreateContextMenu(menu); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if (menuItem.getGroupId() != getSupportTag()) { - return false; - } - - MusicDirectory.Entry entry = adapter.getContextItem(); + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, MusicDirectory.Entry entry) { return onContextItemSelected(menuItem, entry); } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java index a89bc280..4e1e51e5 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java @@ -16,6 +16,9 @@ package github.daneren2005.dsub.fragments; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -29,6 +32,7 @@ import github.daneren2005.dsub.adapter.SectionAdapter; import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ProgressListener; +import github.daneren2005.dsub.view.UpdateView; public class SelectYearFragment extends SelectRecyclerFragment { @@ -69,4 +73,12 @@ public class SelectYearFragment extends SelectRecyclerFragment { replaceFragment(fragment); } + + @Override + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, String item) {} + + @Override + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, String item) { + return false; + } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SimilarArtistFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SimilarArtistFragment.java index 088b6d00..5677e445 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SimilarArtistFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SimilarArtistFragment.java @@ -16,12 +16,9 @@ package github.daneren2005.dsub.fragments; import android.os.Bundle; -import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; import github.daneren2005.dsub.R; import github.daneren2005.dsub.adapter.ArtistAdapter; @@ -84,24 +81,13 @@ public class SimilarArtistFragment extends SelectRecyclerFragment { } @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - UpdateView targetView = adapter.getContextView(); - menuInfo = new AdapterView.AdapterContextMenuInfo(targetView, 0, 0); - - Artist artist = adapter.getContextItem(); - onCreateContextMenu(menu, view, menuInfo, artist); - + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, Artist item) { + onCreateContextMenuSupport(menu, menuInflater, updateView, item); recreateContextMenu(menu); } @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - Artist artist = adapter.getContextItem(); + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, Artist artist) { return onContextItemSelected(menuItem, artist); } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java index a155e807..c5c5a132 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -34,21 +34,17 @@ import android.os.Bundle; import android.os.StatFs; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.internal.view.ContextThemeWrapper; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; -import android.view.ContextMenu; import android.view.GestureDetector; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; @@ -195,17 +191,15 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR return false; } - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo, Object selected) { - MenuInflater inflater = context.getMenuInflater(); - + public void onCreateContextMenuSupport(Menu menu, MenuInflater menuInflater, UpdateView updateView, Object selected) { if(selected instanceof Entry) { Entry entry = (Entry) selected; if(entry instanceof PodcastEpisode && !entry.isVideo()) { if(Util.isOffline(context)) { - inflater.inflate(R.menu.select_podcast_episode_context_offline, menu); + menuInflater.inflate(R.menu.select_podcast_episode_context_offline, menu); } else { - inflater.inflate(R.menu.select_podcast_episode_context, menu); + menuInflater.inflate(R.menu.select_podcast_episode_context, menu); if(entry.getBookmark() == null) { menu.removeItem(R.id.bookmark_menu_delete); @@ -214,10 +208,10 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } else if (entry.isDirectory()) { if(Util.isOffline(context)) { - inflater.inflate(R.menu.select_album_context_offline, menu); + menuInflater.inflate(R.menu.select_album_context_offline, menu); } else { - inflater.inflate(R.menu.select_album_context, menu); + menuInflater.inflate(R.menu.select_album_context, menu); if(Util.isTagBrowsing(context)) { menu.removeItem(R.id.menu_rate); @@ -226,10 +220,10 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR menu.findItem(entry.isDirectory() ? R.id.album_menu_star : R.id.song_menu_star).setTitle(entry.isStarred() ? R.string.common_unstar : R.string.common_star); } else if(!entry.isVideo()) { if(Util.isOffline(context)) { - inflater.inflate(R.menu.select_song_context_offline, menu); + menuInflater.inflate(R.menu.select_song_context_offline, menu); } else { - inflater.inflate(R.menu.select_song_context, menu); + menuInflater.inflate(R.menu.select_song_context, menu); if(entry.getBookmark() == null) { menu.removeItem(R.id.bookmark_menu_delete); @@ -238,28 +232,28 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR menu.findItem(entry.isDirectory() ? R.id.album_menu_star : R.id.song_menu_star).setTitle(entry.isStarred() ? R.string.common_unstar : R.string.common_star); } else { if(Util.isOffline(context)) { - inflater.inflate(R.menu.select_video_context_offline, menu); + menuInflater.inflate(R.menu.select_video_context_offline, menu); } else { - inflater.inflate(R.menu.select_video_context, menu); + menuInflater.inflate(R.menu.select_video_context, menu); } } } else if(selected instanceof Artist) { Artist artist = (Artist) selected; if(Util.isOffline(context)) { - inflater.inflate(R.menu.select_artist_context_offline, menu); + menuInflater.inflate(R.menu.select_artist_context_offline, menu); } else { - inflater.inflate(R.menu.select_artist_context, menu); + menuInflater.inflate(R.menu.select_artist_context, menu); menu.findItem(R.id.artist_menu_star).setTitle(artist.isStarred() ? R.string.common_unstar : R.string.common_star); } } - hideMenuItems(menu, (AdapterView.AdapterContextMenuInfo) menuInfo); + hideMenuItems(menu, updateView); } - protected void hideMenuItems(ContextMenu menu, AdapterView.AdapterContextMenuInfo info) { + protected void hideMenuItems(Menu menu, UpdateView updateView) { if(!ServerInfo.checkServerVersion(context, "1.8")) { menu.setGroupVisible(R.id.server_1_8, false); menu.setGroupVisible(R.id.hide_star, false); @@ -290,8 +284,8 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR if(!Util.isOffline(context)) { // If we are looking at a standard song view, get downloadFile to cache what options to show - if(info.targetView instanceof SongView) { - SongView songView = (SongView) info.targetView; + if(updateView instanceof SongView) { + SongView songView = (SongView) updateView; DownloadFile downloadFile = songView.getDownloadFile(); try { @@ -314,17 +308,17 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } } // Apply similar logic to album views - else if(info.targetView instanceof AlbumView || info.targetView instanceof ArtistView || info.targetView instanceof ArtistEntryView) { + else if(updateView instanceof AlbumView || updateView instanceof ArtistView || updateView instanceof ArtistEntryView) { File folder = null; int id = 0; - if(info.targetView instanceof AlbumView) { - folder = ((AlbumView) info.targetView).getFile(); + if(updateView instanceof AlbumView) { + folder = ((AlbumView) updateView).getFile(); id = R.id.album_menu_delete; - } else if(info.targetView instanceof ArtistView) { - folder = ((ArtistView) info.targetView).getFile(); + } else if(updateView instanceof ArtistView) { + folder = ((ArtistView) updateView).getFile(); id = R.id.artist_menu_delete; - } else if(info.targetView instanceof ArtistEntryView) { - folder = ((ArtistEntryView) info.targetView).getFile(); + } else if(updateView instanceof ArtistEntryView) { + folder = ((ArtistEntryView) updateView).getFile(); id = R.id.artist_menu_delete; } @@ -339,7 +333,7 @@ public class SubsonicFragment extends Fragment implements SwipeRefreshLayout.OnR } } - protected void recreateContextMenu(ContextMenu menu) { + protected void recreateContextMenu(Menu menu) { List menuItems = new ArrayList(); for(int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java index 25196d66..bdd0472b 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java @@ -16,6 +16,8 @@ package github.daneren2005.dsub.fragments; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import java.util.List; @@ -29,6 +31,7 @@ import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.UserUtil; import github.daneren2005.dsub.adapter.SettingsAdapter; +import github.daneren2005.dsub.view.UpdateView; public class UserFragment extends SelectRecyclerFragment{ private User user; @@ -93,4 +96,12 @@ public class UserFragment extends SelectRecyclerFragment{ public void onItemClicked(User.Setting item) { } + + @Override + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, User.Setting item) {} + + @Override + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, User.Setting item) { + return false; + } } diff --git a/app/src/main/res/menu/nowplaying_context.xml b/app/src/main/res/menu/nowplaying_context.xml index c9347353..845a98c8 100644 --- a/app/src/main/res/menu/nowplaying_context.xml +++ b/app/src/main/res/menu/nowplaying_context.xml @@ -18,10 +18,6 @@ android:id="@+id/menu_lyrics" android:title="@string/download.menu_lyrics"/> - - diff --git a/app/src/main/res/menu/nowplaying_context_offline.xml b/app/src/main/res/menu/nowplaying_context_offline.xml index 24b23a8d..9ce63d79 100644 --- a/app/src/main/res/menu/nowplaying_context_offline.xml +++ b/app/src/main/res/menu/nowplaying_context_offline.xml @@ -14,10 +14,6 @@ android:id="@+id/menu_show_album" android:title="@string/download.menu_show_album"/> - - diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 97ab596b..e77d0aa7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -190,8 +190,7 @@ Playing shuffle Zeige Album Liedtext - Entferne aus Warteschlange - Alle entfernen + Alle entfernen Bildschirm an Mischen Umschalten diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index cd255e13..b91bc929 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -176,8 +176,7 @@ Reproduciendo en aleatorio Mostrar disco Letras - Eliminar de la cola - Borrar todo + Borrar todo Pantalla encendida Aleatorio Cambiar diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 759e3fd8..d547a261 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -175,8 +175,7 @@ Lecture au hasard Afficher l\'album Paroles - Enlever de la queue - Enlever tout + Enlever tout Ecran actif Hasard Basculer diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6222989a..6a28c051 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -186,8 +186,7 @@ Sorrend keverése Ugrás az albumhoz Dalszöveg - Eltávolítás a várólistáról - Összes eltávolítása + Összes eltávolítása Kijelző be Sorrend keverése Váltás diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index cfae3ea0..a3bb71be 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -108,7 +108,6 @@ Воспроизводится случайно Показать альбом Текст - Убрать из очереди Очистить Включить подсветку Перемешать diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bb0a997b..877b510f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -190,8 +190,7 @@ Playing shuffle Show Album Lyrics - Remove from queue - Remove all + Remove all Screen on Shuffle Toggle -- cgit v1.2.3 From fa3746db84c2afd4d7f3edb2c5728e2c9cf27a7b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 25 Jun 2015 17:47:02 -0700 Subject: #517 Missed in previous commit --- .../dsub/fragments/DownloadFragment.java | 48 ++++++++-------------- 1 file changed, 17 insertions(+), 31 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java index b89a25c5..36653ff5 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/DownloadFragment.java @@ -162,6 +162,23 @@ public class DownloadFragment extends SelectRecyclerFragment { } + @Override + public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, DownloadFile downloadFile) { + MusicDirectory.Entry selectedItem = downloadFile.getSong(); + onCreateContextMenuSupport(menu, menuInflater, updateView, selectedItem); + if(!selectedItem.isVideo() && !Util.isOffline(context)) { + menu.removeItem(R.id.song_menu_remove_playlist); + } + + recreateContextMenu(menu); + } + + @Override + public boolean onContextItemSelected(MenuItem menuItem, UpdateView updateView, DownloadFile downloadFile) { + MusicDirectory.Entry selectedItem = downloadFile.getSong(); + return onContextItemSelected(menuItem, selectedItem); + } + @Override public boolean onOptionsItemSelected(MenuItem menuItem) { if(super.onOptionsItemSelected(menuItem)) { @@ -193,37 +210,6 @@ public class DownloadFragment extends SelectRecyclerFragment { return false; } - @Override - public void onCreateContextMenu(android.view.ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - UpdateView targetView = adapter.getContextView(); - menuInfo = new AdapterView.AdapterContextMenuInfo(targetView, 0, 0); - - DownloadFile downloadFile = adapter.getContextItem(); - MusicDirectory.Entry selectedItem = downloadFile.getSong(); - onCreateContextMenu(menu, view, menuInfo, selectedItem); - if(!selectedItem.isVideo() && !Util.isOffline(context)) { - menu.removeItem(R.id.song_menu_remove_playlist); - } - - recreateContextMenu(menu); - } - - @Override - public boolean onContextItemSelected(MenuItem menuItem) { - if(menuItem.getGroupId() != getSupportTag()) { - return false; - } - - DownloadFile downloadFile = adapter.getContextItem(); - MusicDirectory.Entry selectedItem = downloadFile.getSong(); - if(onContextItemSelected(menuItem, selectedItem)) { - return true; - } - - return true; - } - private void update() { DownloadService downloadService = getDownloadService(); if (downloadService == null || objects == null || adapter == null) { -- cgit v1.2.3 From a3f294cd6773585fa59753e25101e4029004495f Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 26 Jun 2015 17:37:44 -0700 Subject: Format playlist creation date --- .../dsub/fragments/SelectPlaylistFragment.java | 2 +- app/src/main/java/github/daneren2005/dsub/util/Util.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java index 7a4c708e..5b7e68a6 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPlaylistFragment.java @@ -217,7 +217,7 @@ public class SelectPlaylistFragment extends SelectRecyclerFragment { ((playlist.getComment() == null) ? "" : playlist.getComment()) + "\nSong Count: " + playlist.getSongCount() + ((playlist.getPublic() == null) ? "" : ("\nPublic: " + playlist.getPublic())) + - "\nCreation Date: " + playlist.getCreated().replace('T', ' '); + "\nCreated: " + Util.formatDate(context, playlist.getCreated()); Util.info(context, playlist.getName(), message); } diff --git a/app/src/main/java/github/daneren2005/dsub/util/Util.java b/app/src/main/java/github/daneren2005/dsub/util/Util.java index f44bc672..a3728d29 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Util.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Util.java @@ -53,6 +53,7 @@ import github.daneren2005.dsub.activity.SubsonicFragmentActivity; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.domain.PlayerState; import github.daneren2005.dsub.domain.RepeatMode; +import github.daneren2005.dsub.domain.ServerInfo; import github.daneren2005.dsub.receiver.MediaButtonIntentReceiver; import github.daneren2005.dsub.service.DownloadService; @@ -70,10 +71,12 @@ import java.lang.reflect.Method; import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.NumberFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.Locale; +import java.util.TimeZone; /** * @author Sindre Mehus @@ -829,6 +832,19 @@ public final class Util { return builder.toString(); } + public static String formatDate(Context context, String dateString) { + try { + boolean isDateNormalized = ServerInfo.checkServerVersion(context, "1.11"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH); + if (isDateNormalized) { + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + + return formatDate(dateFormat.parse(dateString)); + } catch(ParseException e) { + return dateString; + } + } public static String formatDate(Date date) { if(date == null) { return "Never"; -- cgit v1.2.3 From a78354743c4862c8faac3e925176f86a78df9d63 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 2 Jul 2015 18:02:38 -0700 Subject: #332 Start of long multi select --- .../dsub/activity/SubsonicFragmentActivity.java | 4 + .../daneren2005/dsub/adapter/EntryGridAdapter.java | 13 +--- .../daneren2005/dsub/adapter/SectionAdapter.java | 86 +++++++++++++++++++--- .../dsub/fragments/SelectDirectoryFragment.java | 13 ++++ .../github/daneren2005/dsub/view/SongView.java | 16 +--- .../github/daneren2005/dsub/view/UpdateView.java | 4 + app/src/main/res/menu/select_song_context.xml | 31 -------- .../main/res/menu/select_song_context_offline.xml | 21 ------ app/src/main/res/values-de/strings.xml | 3 +- app/src/main/res/values-es/strings.xml | 3 +- app/src/main/res/values-fr/strings.xml | 3 +- app/src/main/res/values-hu/strings.xml | 3 +- app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values/strings.xml | 5 +- app/src/main/res/values/themes.xml | 3 + 15 files changed, 108 insertions(+), 101 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index 43bd15c7..0e9101f8 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -838,4 +838,8 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } } + + public Toolbar getActiveToolbar() { + return slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED ? nowPlayingToolbar : mainToolbar; + } } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java index 48b278ec..0c699b89 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/EntryGridAdapter.java @@ -41,7 +41,6 @@ public class EntryGridAdapter extends SectionAdapter { private ImageLoader imageLoader; private boolean largeAlbums; private boolean showArtist = false; - private boolean checkable = true; private View header; public EntryGridAdapter(Context context, List entries, ImageLoader imageLoader, boolean largeCell) { @@ -83,14 +82,7 @@ public class EntryGridAdapter extends SectionAdapter { albumView.setObject(entry, imageLoader); } else if(viewType == VIEW_TYPE_SONG) { SongView songView = (SongView) view; - songView.setObject(entry, checkable && !entry.isVideo()); - } - } - - @Override - public void setChecked(UpdateView updateView, boolean checked) { - if(updateView instanceof SongView) { - ((SongView) updateView).setChecked(checked); + songView.setObject(entry, checkable && !entry.isVideo() && currentActionMode != null); } } @@ -122,9 +114,6 @@ public class EntryGridAdapter extends SectionAdapter { public void setShowArtist(boolean showArtist) { this.showArtist = showArtist; } - public void setCheckable(boolean checkable) { - this.checkable = checkable; - } public void removeAt(int index) { sections.get(0).remove(index); diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java index 6f5def3e..b5592520 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java @@ -18,7 +18,9 @@ package github.daneren2005.dsub.adapter; import android.content.Context; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; import android.util.Log; +import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -30,6 +32,7 @@ import java.util.Arrays; import java.util.List; import github.daneren2005.dsub.R; +import github.daneren2005.dsub.activity.SubsonicFragmentActivity; import github.daneren2005.dsub.view.BasicHeaderView; import github.daneren2005.dsub.view.UpdateView; import github.daneren2005.dsub.view.UpdateView.UpdateViewHolder; @@ -43,7 +46,9 @@ public abstract class SectionAdapter extends RecyclerView.Adapter> sections; protected boolean singleSectionHeader; protected OnItemClickedListener onItemClickedListener; - private List selected = new ArrayList<>(); + protected List selected = new ArrayList<>(); + protected ActionMode currentActionMode; + protected boolean checkable = true; protected SectionAdapter() {} public SectionAdapter(Context context, List section) { @@ -80,7 +85,7 @@ public abstract class SectionAdapter extends RecyclerView.Adapter extends RecyclerView.Adapter extends RecyclerView.Adapter extends RecyclerView.Adapter holder) { + final UpdateView updateView = holder.getUpdateView(); + if (context instanceof SubsonicFragmentActivity && currentActionMode == null) { + final SubsonicFragmentActivity fragmentActivity = (SubsonicFragmentActivity) context; + Toolbar toolbar = fragmentActivity.getActiveToolbar(); + + toolbar.startActionMode(new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + currentActionMode = mode; + fragmentActivity.onCreateOptionsMenu(menu); + + T item = holder.getItem(); + selected.add(item); + setChecked(updateView, true); + + notifyDataSetChanged(); + mode.setTitle(context.getResources().getString(R.string.select_album_n_selected, selected.size())); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (fragmentActivity.onOptionsItemSelected(item)) { + currentActionMode.finish(); + return true; + } else { + return false; + } + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + currentActionMode = null; + selected.clear(); + notifyDataSetChanged(); + } + }); + } + } public interface OnItemClickedListener { void onItemClicked(T item); diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 9f66a27e..ed6afd46 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -420,6 +420,19 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } playNow(Arrays.asList(entry)); + } else { + List songs = new ArrayList(); + + if(Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_PLAY_NOW_AFTER, false)) { + Iterator it = entries.listIterator(entries.indexOf(entry)); + while(it.hasNext()) { + songs.add((Entry) it.next()); + } + } else { + songs.add(entry); + } + + playNow(songs); } } diff --git a/app/src/main/java/github/daneren2005/dsub/view/SongView.java b/app/src/main/java/github/daneren2005/dsub/view/SongView.java index fadf100e..e789c5de 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/SongView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/SongView.java @@ -38,7 +38,7 @@ import java.io.File; * * @author Sindre Mehus */ -public class SongView extends UpdateView2 implements Checkable { +public class SongView extends UpdateView2 { private static final String TAG = SongView.class.getSimpleName(); private CheckedTextView checkedTextView; @@ -290,18 +290,8 @@ public class SongView extends UpdateView2 impleme } @Override - public void setChecked(boolean b) { - checkedTextView.setChecked(b); - } - - @Override - public boolean isChecked() { - return checkedTextView.isChecked(); - } - - @Override - public void toggle() { - checkedTextView.toggle(); + public void setChecked(boolean checked) { + checkedTextView.setChecked(checked); } public MusicDirectory.Entry getEntry() { diff --git a/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java b/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java index 8e1029df..5043e7bc 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/UpdateView.java @@ -27,6 +27,7 @@ import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; +import android.widget.Checkable; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; @@ -265,6 +266,9 @@ public abstract class UpdateView extends LinearLayout { public boolean isCheckable() { return checkable; } + public void setChecked(boolean checked) { + + } public void onClick() { diff --git a/app/src/main/res/menu/select_song_context.xml b/app/src/main/res/menu/select_song_context.xml index d8fc211c..eae8a8bc 100644 --- a/app/src/main/res/menu/select_song_context.xml +++ b/app/src/main/res/menu/select_song_context.xml @@ -6,37 +6,6 @@ android:id="@+id/song_menu_info" android:title="@string/common.info" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - Alle auswählen %d Lieder ausgewählt. - %d Lieder deselektiert. - Mehr + Mehr Offline Suche... Fehler: Keine SD-Karte verfügbar. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b91bc929..3c2593e2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -130,8 +130,7 @@ Seleccionar todo Seleccionadas %d canciones - %d canciones deseleccionadas - Más + Más Offline Buscando... Error: No hay tarjeta SD disponible diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d547a261..cea3c77d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -129,8 +129,7 @@ Tout sélectionner %d pistes sélectionnées. - %d pistes désélectionnées. - Plus + Plus Déconnecté Recherche en cours... Erreur : Aucune carte SD card disponible. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 6a28c051..816e605a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -139,8 +139,7 @@ Összes jelölése be/ki %d dal kijelölve. - %d dal visszavonva. - Továbbiak + Továbbiak Offline Keresés... Hiba: SD kártya nem áll rendelkezésre! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a3bb71be..0f904d95 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -89,7 +89,6 @@ Выбрать все %d композиций выбрано. - Выбор снят с %d композиций. Еще Оффлайн Выполняется поиск... diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 877b510f..f7c91da3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -141,9 +141,8 @@ Offline media Select all - %d tracks selected. - %d tracks unselected. - More + %d selected. + More Offline Searching... Error: No SD card available. diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index fb47af81..76f0250c 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -51,6 +51,7 @@ @style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse @style/ThemeOverlay.AppCompat.Light @style/DarkSpinnerItem + true -- cgit v1.2.3 From 7bcf42f2c996b7777a999eef8c666a7f07d5f73e Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 7 Jul 2015 08:39:10 -0700 Subject: Fix Offline text while offline --- .../github/daneren2005/dsub/fragments/MainFragment.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index 0e67b80d..5e9da68b 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -98,11 +98,11 @@ public class MainFragment extends SelectRecyclerFragment { List> sections = new ArrayList<>(); List headers = new ArrayList<>(); - List offline = Arrays.asList(R.string.main_offline); - sections.add(offline); - headers.add(null); - if (!Util.isOffline(context)) { + List offline = Arrays.asList(R.string.main_offline); + sections.add(offline); + headers.add(null); + List albums = new ArrayList<>(); albums.add(R.string.main_albums_newest); albums.add(R.string.main_albums_random); @@ -126,6 +126,10 @@ public class MainFragment extends SelectRecyclerFragment { sections.add(videos); headers.add("videos"); } + } else { + List online = Arrays.asList(R.string.main_online); + sections.add(online); + headers.add(null); } return new MainAdapter(context, headers, sections, this); @@ -175,9 +179,6 @@ public class MainFragment extends SelectRecyclerFragment { SharedPreferences.Editor editor = Util.getPreferences(context).edit(); editor.putInt(Constants.PREFERENCES_KEY_RECENT_COUNT + Util.getActiveServer(context), 0); editor.commit(); - - // TODO: Clear immediately so doesn't still show when pressing back - // setMostRecentCount(0); } SubsonicFragment fragment = new SelectDirectoryFragment(); @@ -379,7 +380,7 @@ public class MainFragment extends SelectRecyclerFragment { @Override public void onItemClicked(Integer item) { - if(item == R.string.main_offline) { + if(item == R.string.main_offline || item == R.string.main_online) { toggleOffline(); } else if (item == R.string.main_albums_newest) { showAlbumList("newest"); -- cgit v1.2.3 From 000598bf01c49129be03aa3e8b2d5be14a9fa2e7 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 7 Jul 2015 08:39:35 -0700 Subject: Don't show refresh when pulling local data --- .../daneren2005/dsub/adapter/SectionAdapter.java | 11 +++ .../daneren2005/dsub/fragments/MainFragment.java | 1 + .../dsub/fragments/SelectRecyclerFragment.java | 84 ++++++++++++++-------- .../dsub/fragments/SelectYearFragment.java | 7 ++ 4 files changed, 74 insertions(+), 29 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java index b5592520..e8e2bc4a 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java @@ -71,6 +71,17 @@ public abstract class SectionAdapter extends RecyclerView.Adapter section) { + this.sections = new ArrayList<>(); + this.sections.add(section); + notifyDataSetChanged(); + } + public void replaceExistingData(List headers, List> sections) { + this.headers = headers; + this.sections = sections; + notifyDataSetChanged(); + } + @Override public UpdateViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(viewType == VIEW_TYPE_HEADER) { diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index 5e9da68b..be3fedf7 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -45,6 +45,7 @@ public class MainFragment extends SelectRecyclerFragment { super(); pullToRefresh = false; serialize = false; + backgroundUpdate = false; } @Override diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java index 0c3b27f8..f91048b9 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java @@ -15,6 +15,7 @@ package github.daneren2005.dsub.fragments; +import android.content.Context; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; @@ -43,12 +44,13 @@ public abstract class SelectRecyclerFragment extends SubsonicFragment impleme private static final String TAG = SelectRecyclerFragment.class.getSimpleName(); protected RecyclerView recyclerView; protected SectionAdapter adapter; - protected BackgroundTask> currentTask; + protected UpdateTask currentTask; protected List objects; protected boolean serialize = true; protected boolean largeAlbums = false; protected int columns; protected boolean pullToRefresh = true; + protected boolean backgroundUpdate = true; @Override public void onCreate(Bundle bundle) { @@ -113,44 +115,30 @@ public abstract class SelectRecyclerFragment extends SubsonicFragment impleme if(titleRes != 0) { setTitle(getTitleResource()); } - recyclerView.setVisibility(View.GONE); + if(backgroundUpdate) { + recyclerView.setVisibility(View.GONE); + } // Cancel current running task before starting another one if(currentTask != null) { currentTask.cancel(); } - currentTask = new TabBackgroundTask>(this) { - @Override - protected List doInBackground() throws Throwable { - MusicService musicService = MusicServiceFactory.getMusicService(context); - - objects = new ArrayList(); + currentTask = new UpdateTask(this, refresh); - try { - objects = getObjects(musicService, refresh, this); - } catch (Exception x) { - Log.e(TAG, "Failed to load", x); - } + if(backgroundUpdate) { + currentTask.execute(); + } else { + objects = new ArrayList(); - return objects; + try { + objects = getObjects(null, refresh, null); + } catch (Exception x) { + Log.e(TAG, "Failed to load", x); } - @Override - protected void done(List result) { - if (result != null && !result.isEmpty()) { - recyclerView.setAdapter(adapter = getAdapter(result)); - - onFinishRefresh(); - recyclerView.setVisibility(View.VISIBLE); - } else { - setEmpty(true); - } - - currentTask = null; - } - }; - currentTask.execute(); + currentTask.done(objects); + } } private void setupLayoutManager() { @@ -165,4 +153,42 @@ public abstract class SelectRecyclerFragment extends SubsonicFragment impleme public void onFinishRefresh() { } + + private class UpdateTask extends TabBackgroundTask> { + private boolean refresh; + + public UpdateTask(SubsonicFragment fragment, boolean refresh) { + super(fragment); + this.refresh = refresh; + } + + @Override + public List doInBackground() throws Exception { + MusicService musicService = MusicServiceFactory.getMusicService(context); + + objects = new ArrayList(); + + try { + objects = getObjects(musicService, refresh, this); + } catch (Exception x) { + Log.e(TAG, "Failed to load", x); + } + + return objects; + } + + @Override + public void done(List result) { + if (result != null && !result.isEmpty()) { + recyclerView.setAdapter(adapter = getAdapter(result)); + + onFinishRefresh(); + recyclerView.setVisibility(View.VISIBLE); + } else { + setEmpty(true); + } + + currentTask = null; + } + } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java index 4e1e51e5..22676d8b 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectYearFragment.java @@ -36,6 +36,13 @@ import github.daneren2005.dsub.view.UpdateView; public class SelectYearFragment extends SelectRecyclerFragment { + public SelectYearFragment() { + super(); + pullToRefresh = false; + serialize = false; + backgroundUpdate = false; + } + @Override public int getOptionsMenu() { return R.menu.empty; -- cgit v1.2.3 From 4676b6ab68acd6d601958b1b4df45953b8dd090b Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 7 Jul 2015 19:13:03 -0700 Subject: Fix panel state when rotating with panel expanded --- .../daneren2005/dsub/activity/SubsonicFragmentActivity.java | 13 +++++++++---- .../main/java/github/daneren2005/dsub/util/Constants.java | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index 0e9101f8..276a89d0 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -90,12 +90,12 @@ public class SubsonicFragmentActivity extends SubsonicActivity { private Handler handler = new Handler(); private SlidingUpPanelLayout slideUpPanel; + private SlidingUpPanelLayout.PanelSlideListener panelSlideListener; private NowPlayingFragment nowPlayingFragment; private Toolbar mainToolbar; private Toolbar nowPlayingToolbar; private ScheduledExecutorService executorService; - private View slideUpFrame; private View bottomBar; private ImageView coverArtView; private TextView trackView; @@ -201,7 +201,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } slideUpPanel = (SlidingUpPanelLayout) findViewById(R.id.slide_up_panel); - slideUpPanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { + panelSlideListener = new SlidingUpPanelLayout.PanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { @@ -248,7 +248,8 @@ public class SubsonicFragmentActivity extends SubsonicActivity { public void onPanelHidden(View panel) { } - }); + }; + slideUpPanel.setPanelSlideListener(panelSlideListener); if(getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD)) { // Post this later so it actually runs @@ -260,7 +261,6 @@ public class SubsonicFragmentActivity extends SubsonicActivity { }, 200); } - slideUpFrame = findViewById(R.id.slide_up_frame); bottomBar = findViewById(R.id.bottom_bar); mainToolbar = (Toolbar) findViewById(R.id.main_toolbar); nowPlayingToolbar = (Toolbar) findViewById(R.id.now_playing_toolbar); @@ -451,6 +451,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putString(Constants.MAIN_NOW_PLAYING, nowPlayingFragment.getTag()); + savedInstanceState.putInt(Constants.MAIN_SLIDE_PANEL_STATE, slideUpPanel.getPanelState().hashCode()); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { @@ -462,6 +463,10 @@ public class SubsonicFragmentActivity extends SubsonicActivity { if(drawerToggle != null && backStack.size() > 0) { drawerToggle.setDrawerIndicatorEnabled(false); } + + if(savedInstanceState.getInt(Constants.MAIN_SLIDE_PANEL_STATE, -1) == SlidingUpPanelLayout.PanelState.EXPANDED.hashCode()) { + panelSlideListener.onPanelExpanded(null); + } } @Override diff --git a/app/src/main/java/github/daneren2005/dsub/util/Constants.java b/app/src/main/java/github/daneren2005/dsub/util/Constants.java index 6252d0e4..95fabc23 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Constants.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Constants.java @@ -173,6 +173,7 @@ public final class Constants { public static final String MAIN_BACK_STACK = "backStackIds"; public static final String MAIN_BACK_STACK_SIZE = "backStackIdsSize"; public static final String MAIN_NOW_PLAYING = "nowPlayingId"; + public static final String MAIN_SLIDE_PANEL_STATE = "slidePanelState"; public static final String FRAGMENT_LIST = "fragmentList"; public static final String FRAGMENT_LIST2 = "fragmentList2"; public static final String FRAGMENT_EXTRA = "fragmentExtra"; -- cgit v1.2.3 From fef84ba6d5b222cb775bed4f1426fbcaa989863f Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 9 Jul 2015 20:01:59 -0700 Subject: Fix Equalizer/Lyrics fragment not being in place of NowPlayingFragment --- .../dsub/activity/SubsonicFragmentActivity.java | 59 +++++++++++++++++++--- .../dsub/fragments/EqualizerFragment.java | 1 + .../daneren2005/dsub/fragments/LyricsFragment.java | 1 + 3 files changed, 54 insertions(+), 7 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index 276a89d0..f0685a5f 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -92,6 +92,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { private SlidingUpPanelLayout slideUpPanel; private SlidingUpPanelLayout.PanelSlideListener panelSlideListener; private NowPlayingFragment nowPlayingFragment; + private SubsonicFragment secondaryFragment; private Toolbar mainToolbar; private Toolbar nowPlayingToolbar; @@ -484,7 +485,7 @@ public class SubsonicFragmentActivity extends SubsonicActivity { @Override public void onBackPressed() { - if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED && secondaryFragment == null) { slideUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); } else if(onBackPressedSupport()) { if(!Util.disableExitPrompt(this) && lastBackPressTime < (System.currentTimeMillis() - 4000)) { @@ -496,6 +497,16 @@ public class SubsonicFragmentActivity extends SubsonicActivity { } } + @Override + public boolean onBackPressedSupport() { + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + removeCurrent(); + return false; + } else { + return super.onBackPressedSupport(); + } + } + @Override protected SubsonicFragment getCurrentFragment() { if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { @@ -507,16 +518,50 @@ public class SubsonicFragmentActivity extends SubsonicActivity { @Override public void replaceFragment(SubsonicFragment fragment, int tag, boolean replaceCurrent) { - super.replaceFragment(fragment, tag, replaceCurrent); - if(drawerToggle != null) { - drawerToggle.setDrawerIndicatorEnabled(false); + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + 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); + if (drawerToggle != null) { + drawerToggle.setDrawerIndicatorEnabled(false); + } } } @Override public void removeCurrent() { - super.removeCurrent(); - if(drawerToggle != null && backStack.isEmpty()) { - drawerToggle.setDrawerIndicatorEnabled(true); + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED && secondaryFragment != null) { + FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); + trans.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left); + trans.remove(secondaryFragment); + trans.show(nowPlayingFragment); + trans.commit(); + + secondaryFragment = null; + nowPlayingFragment.setPrimaryFragment(true); + supportInvalidateOptionsMenu(); + } else { + super.removeCurrent(); + if (drawerToggle != null && backStack.isEmpty()) { + drawerToggle.setDrawerIndicatorEnabled(true); + } + } + } + + @Override + public void setTitle(CharSequence title) { + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + getSupportActionBar().setTitle(title); + } else { + super.setTitle(title); } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/EqualizerFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/EqualizerFragment.java index ea61f2c7..e2535e04 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/EqualizerFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/EqualizerFragment.java @@ -104,6 +104,7 @@ public class EqualizerFragment extends SubsonicFragment { }); setTitle(R.string.equalizer_label); + setSubtitle(null); return rootView; } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/LyricsFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/LyricsFragment.java index 826029f5..402bd257 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/LyricsFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/LyricsFragment.java @@ -62,6 +62,7 @@ public final class LyricsFragment extends SubsonicFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { setTitle(R.string.download_menu_lyrics); + setSubtitle(null); rootView = inflater.inflate(R.layout.lyrics, container, false); artistView = (TextView) rootView.findViewById(R.id.lyrics_artist); titleView = (TextView) rootView.findViewById(R.id.lyrics_title); -- cgit v1.2.3 From 1b915b3b2d422fe7b64814fdc4940d1f3206cf9c Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 10 Jul 2015 19:44:50 -0700 Subject: Fix ActionMode system bar --- .../github/daneren2005/dsub/adapter/SectionAdapter.java | 16 ++++++++++++++++ app/src/main/res/values/themes.xml | 1 + 2 files changed, 17 insertions(+) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java index e8e2bc4a..629585b0 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java @@ -16,16 +16,21 @@ package github.daneren2005.dsub.adapter; import android.content.Context; +import android.content.res.Resources; +import android.os.Build; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; +import android.util.TypedValue; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; import java.util.ArrayList; import java.util.Arrays; @@ -368,6 +373,17 @@ public abstract class SectionAdapter extends RecyclerView.Adapter= Build.VERSION_CODES.LOLLIPOP) { + TypedValue typedValue = new TypedValue(); + Resources.Theme theme = context.getTheme(); + theme.resolveAttribute(R.attr.colorPrimaryDark, typedValue, true); + int colorPrimaryDark = typedValue.data; + + Window window = ((SubsonicFragmentActivity) context).getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.setStatusBarColor(colorPrimaryDark); + } return true; } diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 76f0250c..3307f32e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -52,6 +52,7 @@ @style/ThemeOverlay.AppCompat.Light @style/DarkSpinnerItem true + ?attr/colorPrimary + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 82763b48..772d0abf 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,8 +1,6 @@ #FFFFFF - #bababa - #dddddd #80000000 #ff33b5e5 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a2a2d208..94db6bca 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -12,16 +12,29 @@ 2dip - + + + + + + + + -- cgit v1.2.3 From 0fdcde2c7cd2886454b8721fb9d50bae03dca9fe Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Wed, 19 Aug 2015 17:32:41 -0700 Subject: Fix crash when removing podcast episodes (probably others) --- .../main/java/github/daneren2005/dsub/view/GridSpacingDecoration.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/view/GridSpacingDecoration.java b/app/src/main/java/github/daneren2005/dsub/view/GridSpacingDecoration.java index 3bb3e8a1..2d7f4c44 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/GridSpacingDecoration.java +++ b/app/src/main/java/github/daneren2005/dsub/view/GridSpacingDecoration.java @@ -32,6 +32,10 @@ public class GridSpacingDecoration extends RecyclerView.ItemDecoration { int childCount = parent.getChildCount(); int childIndex = parent.getChildPosition(view); + // Not an actual child (ie: during delete event) + if(childIndex == -1) { + return; + } int spanCount = getTotalSpan(view, parent); int spanIndex = childIndex % spanCount; int spanSize = getSpanSize(parent, childIndex); -- cgit v1.2.3 From ebb030da99785161852a8cf3fc3d62b602758165 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Wed, 19 Aug 2015 18:56:01 -0700 Subject: Put back fast scrolling for artists, podcasts, and playlists --- .../daneren2005/dsub/adapter/ArtistAdapter.java | 14 +- .../daneren2005/dsub/adapter/PlaylistAdapter.java | 14 +- .../dsub/adapter/PodcastChannelAdapter.java | 14 +- .../dsub/fragments/SelectRecyclerFragment.java | 11 +- .../github/daneren2005/dsub/view/FastScroller.java | 208 +++++++++++++++++++++ app/src/main/res/drawable/fast_scroller_bubble.xml | 16 ++ app/src/main/res/drawable/fast_scroller_handle.xml | 26 +++ .../main/res/layout/abstract_recycler_fragment.xml | 19 +- app/src/main/res/layout/fast_scroller.xml | 25 +++ 9 files changed, 339 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/github/daneren2005/dsub/view/FastScroller.java create mode 100644 app/src/main/res/drawable/fast_scroller_bubble.xml create mode 100644 app/src/main/res/drawable/fast_scroller_handle.xml create mode 100644 app/src/main/res/layout/fast_scroller.xml (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java index 7461af69..9116e587 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java @@ -30,9 +30,10 @@ import github.daneren2005.dsub.domain.Artist; import github.daneren2005.dsub.domain.MusicFolder; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.view.ArtistView; +import github.daneren2005.dsub.view.FastScroller; import github.daneren2005.dsub.view.UpdateView; -public class ArtistAdapter extends SectionAdapter { +public class ArtistAdapter extends SectionAdapter implements FastScroller.BubbleTextGetter { public static int VIEW_TYPE_ARTIST = 4; private List musicFolders; @@ -122,6 +123,17 @@ public class ArtistAdapter extends SectionAdapter { return VIEW_TYPE_ARTIST; } + @Override + public String getTextToShowInBubble(int position) { + Artist artist = getItemForPosition(position); + + if(artist == null) { + return ""; + } else { + return artist.getName().substring(0, 1); + } + } + public interface OnMusicFolderChanged { void onMusicFolderChanged(MusicFolder musicFolder); } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java index 4221677e..d7a9e8d7 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java @@ -21,10 +21,11 @@ import java.util.List; import android.view.ViewGroup; import github.daneren2005.dsub.domain.Playlist; import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.view.FastScroller; import github.daneren2005.dsub.view.PlaylistView; import github.daneren2005.dsub.view.UpdateView; -public class PlaylistAdapter extends SectionAdapter { +public class PlaylistAdapter extends SectionAdapter implements FastScroller.BubbleTextGetter { public static int VIEW_TYPE_PLAYLIST = 1; private ImageLoader imageLoader; @@ -58,4 +59,15 @@ public class PlaylistAdapter extends SectionAdapter { public int getItemViewType(Playlist playlist) { return VIEW_TYPE_PLAYLIST; } + + @Override + public String getTextToShowInBubble(int position) { + Playlist playlist = getItemForPosition(position); + + if(playlist == null) { + return ""; + } else { + return playlist.getName().substring(0, 1); + } + } } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java index dc94178d..c1b132c7 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java @@ -17,12 +17,13 @@ package github.daneren2005.dsub.adapter; import android.content.Context; import android.view.ViewGroup; import github.daneren2005.dsub.domain.PodcastChannel; +import github.daneren2005.dsub.view.FastScroller; import github.daneren2005.dsub.view.PodcastChannelView; import github.daneren2005.dsub.view.UpdateView; import java.util.List; -public class PodcastChannelAdapter extends SectionAdapter{ +public class PodcastChannelAdapter extends SectionAdapter implements FastScroller.BubbleTextGetter { public static int VIEW_TYPE_PODCAST = 1; public PodcastChannelAdapter(Context context, List podcasts, OnItemClickedListener listener) { @@ -44,4 +45,15 @@ public class PodcastChannelAdapter extends SectionAdapter{ public int getItemViewType(PodcastChannel item) { return VIEW_TYPE_PODCAST; } + + @Override + public String getTextToShowInBubble(int position) { + PodcastChannel podcast = getItemForPosition(position); + + if(podcast == null) { + return ""; + } else { + return podcast.getName().substring(0, 1); + } + } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java index 9dc3e363..adf22484 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectRecyclerFragment.java @@ -15,7 +15,6 @@ package github.daneren2005.dsub.fragments; -import android.content.Context; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; @@ -38,10 +37,12 @@ import github.daneren2005.dsub.service.MusicServiceFactory; import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.TabBackgroundTask; +import github.daneren2005.dsub.view.FastScroller; public abstract class SelectRecyclerFragment extends SubsonicFragment implements SectionAdapter.OnItemClickedListener { private static final String TAG = SelectRecyclerFragment.class.getSimpleName(); protected RecyclerView recyclerView; + protected FastScroller fastScroller; protected SectionAdapter adapter; protected UpdateTask currentTask; protected List objects; @@ -77,6 +78,7 @@ public abstract class SelectRecyclerFragment extends SubsonicFragment impleme refreshLayout.setOnRefreshListener(this); recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_recycler); + fastScroller = (FastScroller) rootView.findViewById(R.id.fragment_fast_scroller); setupLayoutManager(); if(pullToRefresh) { @@ -184,6 +186,13 @@ public abstract class SelectRecyclerFragment extends SubsonicFragment impleme public void done(List result) { if (result != null && !result.isEmpty()) { recyclerView.setAdapter(adapter = getAdapter(result)); + if(adapter instanceof FastScroller.BubbleTextGetter) { + if(!fastScroller.isAttached()) { + fastScroller.attachRecyclerView(recyclerView); + } + } else if(fastScroller.isAttached()) { + fastScroller.detachRecyclerView(); + } onFinishRefresh(); recyclerView.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java b/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java new file mode 100644 index 00000000..ee7aef4b --- /dev/null +++ b/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java @@ -0,0 +1,208 @@ +/* + This file is part of Subsonic. + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + Copyright 2015 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.view; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import github.daneren2005.dsub.R; + +import static android.support.v7.widget.RecyclerView.OnScrollListener; + +public class FastScroller extends LinearLayout { + private static final int BUBBLE_ANIMATION_DURATION = 100; + private static final int TRACK_SNAP_RANGE = 5; + + private TextView bubble; + private View handle; + private RecyclerView recyclerView; + private final ScrollListener scrollListener = new ScrollListener(); + private int height; + + private ObjectAnimator currentAnimator = null; + + public FastScroller(final Context context,final AttributeSet attrs,final int defStyleAttr) { + super(context,attrs,defStyleAttr); + initialise(context); + } + + public FastScroller(final Context context) { + super(context); + initialise(context); + } + + public FastScroller(final Context context,final AttributeSet attrs) { + super(context,attrs); + initialise(context); + } + + private void initialise(Context context) { + setOrientation(HORIZONTAL); + setClipChildren(false); + LayoutInflater inflater = LayoutInflater.from(context); + inflater.inflate(R.layout.fast_scroller,this,true); + bubble = (TextView)findViewById(R.id.fastscroller_bubble); + handle = findViewById(R.id.fastscroller_handle); + bubble.setVisibility(INVISIBLE); + setVisibility(GONE); + } + + @Override + protected void onSizeChanged(int w,int h,int oldw,int oldh) { + super.onSizeChanged(w,h,oldw,oldh); + height = h; + } + + @Override + public boolean onTouchEvent(@NonNull MotionEvent event) { + final int action = event.getAction(); + switch(action) + { + case MotionEvent.ACTION_DOWN: + if(event.getX()=height-TRACK_SNAP_RANGE) + proportion = 1f; + else + proportion = y/(float)height; + int targetPos = getValueInRange(0,itemCount-1,(int)(proportion*(float)itemCount)); + ((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(targetPos,0); + String bubbleText = ((BubbleTextGetter)recyclerView.getAdapter()).getTextToShowInBubble(targetPos); + bubble.setText(bubbleText); + } + } + + private int getValueInRange(int min,int max,int value) { + int minimum = Math.max(min,value); + return Math.min(minimum,max); + } + + private void setBubbleAndHandlePosition(float y) { + int bubbleHeight = bubble.getHeight(); + int handleHeight = handle.getHeight(); + handle.setY(getValueInRange(0,height-handleHeight,(int)(y-handleHeight/2))); + bubble.setY(getValueInRange(0,height-bubbleHeight-handleHeight/2,(int)(y-bubbleHeight))); + } + + private void showBubble() { + AnimatorSet animatorSet = new AnimatorSet(); + bubble.setVisibility(VISIBLE); + if(currentAnimator != null) + currentAnimator.cancel(); + currentAnimator = ObjectAnimator.ofFloat(bubble,"alpha",0f,1f).setDuration(BUBBLE_ANIMATION_DURATION); + currentAnimator.start(); + } + + private void hideBubble() { + if(currentAnimator != null) + currentAnimator.cancel(); + currentAnimator = ObjectAnimator.ofFloat(bubble,"alpha",1f,0f).setDuration(BUBBLE_ANIMATION_DURATION); + currentAnimator.addListener(new AnimatorListenerAdapter(){ + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + bubble.setVisibility(INVISIBLE); + currentAnimator = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + super.onAnimationCancel(animation); + bubble.setVisibility(INVISIBLE); + currentAnimator = null; + } + }); + currentAnimator.start(); + } + + private class ScrollListener extends OnScrollListener { + @Override + public void onScrolled(RecyclerView rv,int dx,int dy) { + View firstVisibleView = recyclerView.getChildAt(0); + int firstVisiblePosition = recyclerView.getChildPosition(firstVisibleView); + int visibleRange = recyclerView.getChildCount(); + int lastVisiblePosition = firstVisiblePosition+visibleRange; + int itemCount = recyclerView.getAdapter().getItemCount(); + int position; + if(firstVisiblePosition == 0) + position = 0; + else if(lastVisiblePosition == itemCount) + position = itemCount; + else + position = (int)(((float)firstVisiblePosition/(((float)itemCount-(float)visibleRange)))*(float)itemCount); + float proportion = (float)position/(float)itemCount; + setBubbleAndHandlePosition(height*proportion); + } + } + + public interface BubbleTextGetter { + String getTextToShowInBubble(int position); + } +} diff --git a/app/src/main/res/drawable/fast_scroller_bubble.xml b/app/src/main/res/drawable/fast_scroller_bubble.xml new file mode 100644 index 00000000..02dfee5b --- /dev/null +++ b/app/src/main/res/drawable/fast_scroller_bubble.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fast_scroller_handle.xml b/app/src/main/res/drawable/fast_scroller_handle.xml new file mode 100644 index 00000000..e1744ceb --- /dev/null +++ b/app/src/main/res/drawable/fast_scroller_handle.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/abstract_recycler_fragment.xml b/app/src/main/res/layout/abstract_recycler_fragment.xml index 47141450..0e0c87f4 100644 --- a/app/src/main/res/layout/abstract_recycler_fragment.xml +++ b/app/src/main/res/layout/abstract_recycler_fragment.xml @@ -10,12 +10,23 @@ android:layout_height="fill_parent" android:orientation="vertical" > - + android:layout_weight="1.0"> + + + + + diff --git a/app/src/main/res/layout/fast_scroller.xml b/app/src/main/res/layout/fast_scroller.xml new file mode 100644 index 00000000..b2e244e3 --- /dev/null +++ b/app/src/main/res/layout/fast_scroller.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file -- cgit v1.2.3 From cef1fc8ea0b88151af0b920b31b5c3df5bc99ff9 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 20 Aug 2015 17:19:18 -0700 Subject: Changed some default settings --- .../github/daneren2005/dsub/fragments/SelectDirectoryFragment.java | 2 +- app/src/main/java/github/daneren2005/dsub/util/Util.java | 2 +- app/src/main/res/xml/settings.xml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index 9ceb69a6..a5c4ca2c 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -379,7 +379,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } else { List songs = new ArrayList(); - if(Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_PLAY_NOW_AFTER, false)) { + if(Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_PLAY_NOW_AFTER, true)) { Iterator it = entries.listIterator(entries.indexOf(entry)); while(it.hasNext()) { songs.add((Entry) it.next()); diff --git a/app/src/main/java/github/daneren2005/dsub/util/Util.java b/app/src/main/java/github/daneren2005/dsub/util/Util.java index db0cb7c1..ff962488 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Util.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Util.java @@ -305,7 +305,7 @@ public final class Util { public static boolean getDisplayTrack(Context context) { SharedPreferences prefs = getPreferences(context); - return prefs.getBoolean(Constants.PREFERENCES_KEY_DISPLAY_TRACK, false); + return prefs.getBoolean(Constants.PREFERENCES_KEY_DISPLAY_TRACK, true); } public static int getMaxBitrate(Context context) { diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index b23825bf..078ccbeb 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -42,7 +42,7 @@ android:title="@string/settings.track_title" android:summary="@string/settings.track_summary" android:key="displayTrack" - android:defaultValue="false"/> + android:defaultValue="true"/> + android:defaultValue="true"/> -- cgit v1.2.3 From 305bf886c3776867943ba07da95fc4676adb848e Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 20 Aug 2015 17:19:38 -0700 Subject: Fix double highest rated album lists --- app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java | 1 - 1 file changed, 1 deletion(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index 0c072864..413f0b11 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -113,7 +113,6 @@ public class MainFragment extends SelectRecyclerFragment { albums.add(R.string.main_albums_genres); albums.add(R.string.main_albums_year); albums.add(R.string.main_albums_recent); - albums.add(R.string.main_albums_highest); sections.add(albums); headers.add("albums"); -- cgit v1.2.3 From 36a9f62b10b97374355073e8317f49761bcbd5d8 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 20 Aug 2015 17:53:00 -0700 Subject: Add fast scroller to more stuff as well as fixed some bugs with it --- .../daneren2005/dsub/adapter/AlbumListAdapter.java | 165 --------------------- .../dsub/adapter/AlphabeticalAlbumAdapter.java | 44 ++++++ .../daneren2005/dsub/adapter/ArtistAdapter.java | 8 +- .../daneren2005/dsub/adapter/GenreAdapter.java | 8 +- .../daneren2005/dsub/adapter/PlaylistAdapter.java | 8 +- .../dsub/adapter/PodcastChannelAdapter.java | 8 +- .../daneren2005/dsub/adapter/SectionAdapter.java | 36 +++++ .../dsub/adapter/TopRatedAlbumAdapter.java | 44 ++++++ .../dsub/fragments/SelectDirectoryFragment.java | 42 ++++-- .../github/daneren2005/dsub/view/FastScroller.java | 14 +- app/src/main/res/layout/select_album.xml | 27 ---- 11 files changed, 173 insertions(+), 231 deletions(-) delete mode 100644 app/src/main/java/github/daneren2005/dsub/adapter/AlbumListAdapter.java create mode 100644 app/src/main/java/github/daneren2005/dsub/adapter/AlphabeticalAlbumAdapter.java create mode 100644 app/src/main/java/github/daneren2005/dsub/adapter/TopRatedAlbumAdapter.java delete mode 100644 app/src/main/res/layout/select_album.xml (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/AlbumListAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/AlbumListAdapter.java deleted file mode 100644 index 47f82259..00000000 --- a/app/src/main/java/github/daneren2005/dsub/adapter/AlbumListAdapter.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - This file is part of Subsonic. - - Subsonic is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Subsonic is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Subsonic. If not, see . - - Copyright 2010 (C) Sindre Mehus - */ -package github.daneren2005.dsub.adapter; - -import android.content.Context; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.SectionIndexer; - -import com.commonsware.cwac.endless.EndlessAdapter; -import github.daneren2005.dsub.R; -import github.daneren2005.dsub.domain.MusicDirectory; -import github.daneren2005.dsub.domain.ServerInfo; -import github.daneren2005.dsub.service.MusicService; -import github.daneren2005.dsub.service.MusicServiceFactory; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -public class AlbumListAdapter extends EndlessAdapter implements SectionIndexer { - private static final String TAG = AlbumListAdapter.class.getSimpleName(); - Context context; - ArrayAdapter adapter; - String type; - String extra; - int size; - int offset; - List entries; - - private boolean shouldIndex = false; - private Object[] sections; - private Integer[] positions; - - public AlbumListAdapter(Context context, ArrayAdapter adapter, String type, String extra, int size) { - super(adapter); - this.context = context; - this.adapter = adapter; - this.type = type; - this.extra = extra; - this.size = size; - this.offset = size; - - if("alphabeticalByName".equals(this.type)) { - shouldIndex = true; - recreateIndexes(); - } - } - - @Override - protected boolean cacheInBackground() throws Exception { - MusicService service = MusicServiceFactory.getMusicService(context); - MusicDirectory result; - if(("genres".equals(type) && ServerInfo.checkServerVersion(context, "1.10.0")) || "years".equals(type)) { - result = service.getAlbumList(type, extra, size, offset, false, context, null); - } else if("genres".equals(type) || "genres-songs".equals(type)) { - result = service.getSongsByGenre(extra, size, offset, context, null); - } else { - result = service.getAlbumList(type, size, offset, shouldIndex, context, null); - } - entries = result.getChildren(); - return entries.size() > 0; - } - - @Override - protected void appendCachedData() { - for(MusicDirectory.Entry entry: entries) { - adapter.add(entry); - } - offset += entries.size(); - recreateIndexes(); - } - - @Override - protected View getPendingView(ViewGroup parent) { - View progress = LayoutInflater.from(context).inflate(R.layout.tab_progress, null); - progress.setVisibility(View.VISIBLE); - return progress; - } - - private void recreateIndexes() { - try { - if (!shouldIndex) { - return; - } - - Set sectionSet = new LinkedHashSet(30); - List positionList = new ArrayList(30); - for (int i = 0; i < adapter.getCount(); i++) { - MusicDirectory.Entry entry = adapter.getItem(i); - String index; - if (entry.getAlbum() != null) { - index = entry.getAlbum().substring(0, 1); - if (!Character.isLetter(index.charAt(0))) { - index = "#"; - } - } else { - index = "*"; - } - - if (!sectionSet.contains(index)) { - sectionSet.add(index); - positionList.add(i); - } - } - sections = sectionSet.toArray(new Object[sectionSet.size()]); - positions = positionList.toArray(new Integer[positionList.size()]); - } catch(Exception e) { - Log.e(TAG, "Error while recreating indexes"); - } - } - - @Override - public Object[] getSections() { - if(sections != null) { - return sections; - } else { - return new Object[0]; - } - } - - @Override - public int getPositionForSection(int section) { - if(sections != null) { - section = Math.min(section, positions.length - 1); - return positions[section]; - } else { - return 0; - } - } - - @Override - public int getSectionForPosition(int pos) { - if(sections != null) { - for (int i = 0; i < sections.length - 1; i++) { - if (pos < positions[i + 1]) { - return i; - } - } - return sections.length - 1; - } else { - return 0; - } - } -} diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/AlphabeticalAlbumAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/AlphabeticalAlbumAdapter.java new file mode 100644 index 00000000..ccb3df4e --- /dev/null +++ b/app/src/main/java/github/daneren2005/dsub/adapter/AlphabeticalAlbumAdapter.java @@ -0,0 +1,44 @@ +/* + This file is part of Subsonic. + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + Copyright 2015 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.adapter; + +import android.content.Context; + +import java.util.List; + +import github.daneren2005.dsub.domain.MusicDirectory; +import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.view.FastScroller; + +public class AlphabeticalAlbumAdapter extends EntryInfiniteGridAdapter implements FastScroller.BubbleTextGetter { + public AlphabeticalAlbumAdapter(Context context, List entries, ImageLoader imageLoader, boolean largeCell) { + super(context, entries, imageLoader, largeCell); + } + + @Override + public String getTextToShowInBubble(int position) { + // Make sure that we are not trying to get an item for the loading placeholder + if(position >= sections.get(0).size()) { + if(sections.get(0).size() > 0) { + return getTextToShowInBubble(position - 1); + } else { + return "*"; + } + } else { + return getNameIndex(getItemForPosition(position).getAlbum()); + } + } +} diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java index 9116e587..2eea0e74 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/ArtistAdapter.java @@ -125,13 +125,7 @@ public class ArtistAdapter extends SectionAdapter implements FastScrolle @Override public String getTextToShowInBubble(int position) { - Artist artist = getItemForPosition(position); - - if(artist == null) { - return ""; - } else { - return artist.getName().substring(0, 1); - } + return getNameIndex(getItemForPosition(position).getName(), true); } public interface OnMusicFolderChanged { diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/GenreAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/GenreAdapter.java index 7e6954f9..70aa5fe3 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/GenreAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/GenreAdapter.java @@ -18,12 +18,13 @@ package github.daneren2005.dsub.adapter; import android.content.Context; import android.view.ViewGroup; import github.daneren2005.dsub.domain.Genre; +import github.daneren2005.dsub.view.FastScroller; import github.daneren2005.dsub.view.GenreView; import github.daneren2005.dsub.view.UpdateView; import java.util.List; -public class GenreAdapter extends SectionAdapter{ +public class GenreAdapter extends SectionAdapter implements FastScroller.BubbleTextGetter{ public static int VIEW_TYPE_GENRE = 1; public GenreAdapter(Context context, List genres, OnItemClickedListener listener) { @@ -45,4 +46,9 @@ public class GenreAdapter extends SectionAdapter{ public int getItemViewType(Genre item) { return VIEW_TYPE_GENRE; } + + @Override + public String getTextToShowInBubble(int position) { + return getNameIndex(getItemForPosition(position).getName()); + } } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java index d7a9e8d7..7f7aacff 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/PlaylistAdapter.java @@ -62,12 +62,6 @@ public class PlaylistAdapter extends SectionAdapter implements FastScr @Override public String getTextToShowInBubble(int position) { - Playlist playlist = getItemForPosition(position); - - if(playlist == null) { - return ""; - } else { - return playlist.getName().substring(0, 1); - } + return getNameIndex(getItemForPosition(position).getName()); } } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java index c1b132c7..f3eed393 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java @@ -48,12 +48,6 @@ public class PodcastChannelAdapter extends SectionAdapter implem @Override public String getTextToShowInBubble(int position) { - PodcastChannel podcast = getItemForPosition(position); - - if(podcast == null) { - return ""; - } else { - return podcast.getName().substring(0, 1); - } + return getNameIndex(getItemForPosition(position).getName()); } } diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java index eec1dedb..53cc5e99 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SectionAdapter.java @@ -16,6 +16,7 @@ package github.daneren2005.dsub.adapter; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Build; import android.support.v7.widget.PopupMenu; @@ -39,7 +40,9 @@ import java.util.List; import github.daneren2005.dsub.R; import github.daneren2005.dsub.activity.SubsonicFragmentActivity; +import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.MenuUtil; +import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.view.BasicHeaderView; import github.daneren2005.dsub.view.UpdateView; import github.daneren2005.dsub.view.UpdateView.UpdateViewHolder; @@ -47,6 +50,7 @@ import github.daneren2005.dsub.view.UpdateView.UpdateViewHolder; public abstract class SectionAdapter extends RecyclerView.Adapter> { private static String TAG = SectionAdapter.class.getSimpleName(); public static int VIEW_TYPE_HEADER = 0; + public static String[] ignoredArticles; protected Context context; protected List headers; @@ -461,6 +465,38 @@ public abstract class SectionAdapter extends RecyclerView.Adapter { void onItemClicked(T item); void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView updateView, T item); diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/TopRatedAlbumAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/TopRatedAlbumAdapter.java new file mode 100644 index 00000000..876e5907 --- /dev/null +++ b/app/src/main/java/github/daneren2005/dsub/adapter/TopRatedAlbumAdapter.java @@ -0,0 +1,44 @@ +/* + This file is part of Subsonic. + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + Copyright 2015 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.adapter; + +import android.content.Context; + +import java.util.List; + +import github.daneren2005.dsub.domain.MusicDirectory; +import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.view.FastScroller; + +public class TopRatedAlbumAdapter extends EntryInfiniteGridAdapter implements FastScroller.BubbleTextGetter { + public TopRatedAlbumAdapter(Context context, List entries, ImageLoader imageLoader, boolean largeCell) { + super(context, entries, imageLoader, largeCell); + } + + @Override + public String getTextToShowInBubble(int position) { + // Make sure that we are not trying to get an item for the loading placeholder + if(position >= sections.get(0).size()) { + if(sections.get(0).size() > 0) { + return getTextToShowInBubble(position - 1); + } else { + return "*"; + } + } else { + return Integer.toString(getItemForPosition(position).getRating()); + } + } +} diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index a5c4ca2c..6fbf49bc 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -30,9 +30,11 @@ import android.widget.RatingBar; import android.widget.RelativeLayout; import android.widget.TextView; import github.daneren2005.dsub.R; +import github.daneren2005.dsub.adapter.AlphabeticalAlbumAdapter; import github.daneren2005.dsub.adapter.EntryInfiniteGridAdapter; import github.daneren2005.dsub.adapter.EntryGridAdapter; import github.daneren2005.dsub.adapter.SectionAdapter; +import github.daneren2005.dsub.adapter.TopRatedAlbumAdapter; import github.daneren2005.dsub.domain.ArtistInfo; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.domain.ServerInfo; @@ -57,6 +59,7 @@ import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.TabBackgroundTask; import github.daneren2005.dsub.util.UserUtil; import github.daneren2005.dsub.util.Util; +import github.daneren2005.dsub.view.FastScroller; import github.daneren2005.dsub.view.GridSpacingDecoration; import github.daneren2005.dsub.view.MyLeadingMarginSpan2; import github.daneren2005.dsub.view.UpdateView; @@ -72,6 +75,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section private static final String TAG = SelectDirectoryFragment.class.getSimpleName(); private RecyclerView recyclerView; + private FastScroller fastScroller; private EntryGridAdapter entryGridAdapter; private Boolean licenseValid; private List albums; @@ -113,7 +117,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section restoredInstance = true; } } - + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -161,7 +165,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } } - rootView = inflater.inflate(R.layout.select_album, container, false); + rootView = inflater.inflate(R.layout.abstract_recycler_fragment, container, false); refreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.refresh_layout); refreshLayout.setOnRefreshListener(this); @@ -170,8 +174,9 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section largeAlbums = true; } - recyclerView = (RecyclerView) rootView.findViewById(R.id.select_album_entries); + recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_recycler); recyclerView.setHasFixedSize(true); + fastScroller = (FastScroller) rootView.findViewById(R.id.fragment_fast_scroller); setupScrollList(recyclerView); if(largeAlbums) { @@ -258,7 +263,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } else { menuInflater.inflate(R.menu.select_podcast_episode, menu); - + if(!UserUtil.canPodcast()) { menu.removeItem(R.id.menu_download_all); } @@ -403,7 +408,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section if(refreshListing) { refresh = true; } - + if(currentTask != null) { currentTask.cancel(); } @@ -459,7 +464,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section return dir; } - + @Override protected void done(Pair result) { SelectDirectoryFragment.this.name = result.getFirst().getName(); @@ -468,7 +473,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } }.execute(); } - + private void getRecursiveMusicDirectory(final String id, final String name, final boolean refresh) { setTitle(name); @@ -486,7 +491,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section root.replaceChildren(songs); return root; } - + private void getSongsRecursively(MusicDirectory parent, List songs) throws Exception { songs.addAll(parent.getChildren(false, true)); for (Entry dir : parent.getChildren(true, false)) { @@ -501,7 +506,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section getSongsRecursively(musicDirectory, songs); } } - + @Override protected void done(Pair result) { SelectDirectoryFragment.this.name = result.getFirst().getName(); @@ -521,7 +526,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } }.execute(); } - + private void getPodcast(final String podcastId, final String podcastName, final boolean refresh) { setTitle(podcastName); @@ -602,7 +607,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section public LoadTask(boolean refresh) { super(SelectDirectoryFragment.this); this.refresh = refresh; - + currentTask = this; } @@ -613,7 +618,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section MusicService musicService = MusicServiceFactory.getMusicService(context); MusicDirectory dir = load(musicService); licenseValid = musicService.isLicenseValid(context, this); - + albums = dir.getChildren(true, false); entries = dir.getChildren(); @@ -641,7 +646,7 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section Log.w(TAG, "Failed to get Artist Info even though it should be supported"); } } - + return new Pair(dir, licenseValid); } @@ -671,7 +676,13 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section entryGridAdapter = new EntryGridAdapter(context, entries, getImageLoader(), largeAlbums); entryGridAdapter.setRemoveFromPlaylist(playlistId != null); } else { - entryGridAdapter = new EntryInfiniteGridAdapter(context, entries, getImageLoader(), largeAlbums); + if("alphabeticalByName".equals(albumListType)) { + entryGridAdapter = new AlphabeticalAlbumAdapter(context, entries, getImageLoader(), largeAlbums); + } else if("highest".equals(albumListType)) { + entryGridAdapter = new TopRatedAlbumAdapter(context, entries, getImageLoader(), largeAlbums); + } else { + entryGridAdapter = new EntryInfiniteGridAdapter(context, entries, getImageLoader(), largeAlbums); + } // Setup infinite loading based on scrolling final EntryInfiniteGridAdapter infiniteGridAdapter = (EntryInfiniteGridAdapter) entryGridAdapter; @@ -763,6 +774,9 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Section } recyclerView.setAdapter(entryGridAdapter); + if(entryGridAdapter instanceof FastScroller.BubbleTextGetter) { + fastScroller.attachRecyclerView(recyclerView); + } context.supportInvalidateOptionsMenu(); if(scrollToPosition != -1) { diff --git a/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java b/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java index ee7aef4b..1cc11c08 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java +++ b/app/src/main/java/github/daneren2005/dsub/view/FastScroller.java @@ -24,6 +24,7 @@ import android.support.annotation.NonNull; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -35,6 +36,7 @@ import github.daneren2005.dsub.R; import static android.support.v7.widget.RecyclerView.OnScrollListener; public class FastScroller extends LinearLayout { + private static final String TAG = FastScroller.class.getSimpleName(); private static final int BUBBLE_ANIMATION_DURATION = 100; private static final int TRACK_SNAP_RANGE = 5; @@ -57,7 +59,7 @@ public class FastScroller extends LinearLayout { } public FastScroller(final Context context,final AttributeSet attrs) { - super(context,attrs); + super(context, attrs); initialise(context); } @@ -134,8 +136,14 @@ public class FastScroller extends LinearLayout { proportion = y/(float)height; int targetPos = getValueInRange(0,itemCount-1,(int)(proportion*(float)itemCount)); ((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(targetPos,0); - String bubbleText = ((BubbleTextGetter)recyclerView.getAdapter()).getTextToShowInBubble(targetPos); - bubble.setText(bubbleText); + + try { + String bubbleText = ((BubbleTextGetter) recyclerView.getAdapter()).getTextToShowInBubble(targetPos); + bubble.setText(bubbleText); + } catch(Exception e) { + Log.e(TAG, "Item count: " + itemCount); + Log.e(TAG, "Error getting text for bubble", e); + } } } diff --git a/app/src/main/res/layout/select_album.xml b/app/src/main/res/layout/select_album.xml deleted file mode 100644 index e72ccffd..00000000 --- a/app/src/main/res/layout/select_album.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file -- cgit v1.2.3 From b357cf297500fecf631688b76cc2e6fc3ec5846a Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 21 Aug 2015 17:01:00 -0700 Subject: Podcasts are sorted with ignored articles --- .../java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java index f3eed393..e1ca4814 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/PodcastChannelAdapter.java @@ -48,6 +48,6 @@ public class PodcastChannelAdapter extends SectionAdapter implem @Override public String getTextToShowInBubble(int position) { - return getNameIndex(getItemForPosition(position).getName()); + return getNameIndex(getItemForPosition(position).getName(), true); } } -- cgit v1.2.3 From f2826c280593396be8bfee088e37d68674cd075a Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Fri, 21 Aug 2015 17:01:12 -0700 Subject: Put starred above album lists --- .../main/java/github/daneren2005/dsub/fragments/MainFragment.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'app/src/main/java/github') diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java index 413f0b11..1f3cb11d 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/MainFragment.java @@ -100,6 +100,10 @@ public class MainFragment extends SelectRecyclerFragment { List> sections = new ArrayList<>(); List headers = new ArrayList<>(); + headers.add(null); + List stars = Arrays.asList(R.string.main_albums_starred); + sections.add(stars); + List albums = new ArrayList<>(); albums.add(R.string.main_albums_newest); albums.add(R.string.main_albums_random); @@ -109,7 +113,6 @@ public class MainFragment extends SelectRecyclerFragment { if(!Util.isTagBrowsing(context)) { albums.add(R.string.main_albums_highest); } - albums.add(R.string.main_albums_starred); albums.add(R.string.main_albums_genres); albums.add(R.string.main_albums_year); albums.add(R.string.main_albums_recent); -- cgit v1.2.3