From 879f941151d665a6aa545ac58c05bcece4b5c75a Mon Sep 17 00:00:00 2001 From: Martijn Brekhof Date: Tue, 26 Jan 2016 13:24:01 +0100 Subject: [PATCH] Added settings options for allowed network types This allows the user to select other network connection types, besides WiFi, for downloading media files. --- app/src/main/java/org/xbmc/kore/Settings.java | 39 ++++ .../xbmc/kore/ui/AbstractDetailsFragment.java | 19 ++ .../xbmc/kore/ui/AlbumDetailsFragment.java | 198 ++++++++++-------- .../xbmc/kore/ui/MovieDetailsFragment.java | 114 +++++----- .../kore/ui/MusicVideoDetailsFragment.java | 93 ++++---- .../kore/ui/TVShowEpisodeDetailsFragment.java | 99 ++++----- .../kore/ui/TVShowEpisodeListFragment.java | 5 + .../xbmc/kore/ui/TVShowOverviewFragment.java | 5 + .../xbmc/kore/utils/FileDownloadHelper.java | 3 +- app/src/main/res/values/arrays.xml | 17 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 8 + 12 files changed, 362 insertions(+), 239 deletions(-) diff --git a/app/src/main/java/org/xbmc/kore/Settings.java b/app/src/main/java/org/xbmc/kore/Settings.java index 1e58a87..13fd994 100644 --- a/app/src/main/java/org/xbmc/kore/Settings.java +++ b/app/src/main/java/org/xbmc/kore/Settings.java @@ -15,12 +15,24 @@ */ package org.xbmc.kore; +import android.app.DownloadManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import android.text.format.DateUtils; +import org.xbmc.kore.utils.LogUtils; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + /** * Class that contains various constants and the keys for settings stored in shared preferences */ public class Settings { + private static final String TAG = LogUtils.makeLogTag(Settings.class); + /** * The update interval for the records in the DB. If the last update is older than this value * a refresh will be triggered. Applicable to TV Shows and Movies. @@ -106,4 +118,31 @@ public class Settings { public static String getNavDrawerItemsPrefKey(int hostId) { return Settings.KEY_PREF_NAV_DRAWER_ITEMS + hostId; } + + public static final String KEY_PREF_DOWNLOAD_TYPES = "pref_download_conn_types"; + + /** + * Determines the bit flags used by {@link DownloadManager.Request} to correspond to the enabled network connections + * from the settings screen. + * @return {@link DownloadManager.Request} network types bit flags that are enabled or 0 if none are enabled + */ + public static int allowedDownloadNetworkTypes(Context context) { + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); + Set connPrefs = sharedPref.getStringSet(Settings.KEY_PREF_DOWNLOAD_TYPES, + new HashSet<>(Arrays.asList(new String[]{"0"}))); + int result = 0; // default none + for(String pref : connPrefs) { + switch( Integer.parseInt(pref) ) { + case 0: + result |= DownloadManager.Request.NETWORK_WIFI; + break; + case 1: + result |= DownloadManager.Request.NETWORK_MOBILE; + break; + case 2: // currently -1 means all network types in DownloadManager + result |= ~0; + } + } + return result; + } } diff --git a/app/src/main/java/org/xbmc/kore/ui/AbstractDetailsFragment.java b/app/src/main/java/org/xbmc/kore/ui/AbstractDetailsFragment.java index 04e5333..91959b3 100644 --- a/app/src/main/java/org/xbmc/kore/ui/AbstractDetailsFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/AbstractDetailsFragment.java @@ -31,6 +31,7 @@ import android.view.ViewGroup; import android.widget.Toast; import org.xbmc.kore.R; +import org.xbmc.kore.Settings; import org.xbmc.kore.host.HostInfo; import org.xbmc.kore.host.HostManager; import org.xbmc.kore.jsonrpc.ApiException; @@ -40,6 +41,8 @@ import org.xbmc.kore.service.SyncUtils; import org.xbmc.kore.utils.LogUtils; import org.xbmc.kore.utils.UIUtils; +import butterknife.OnClick; +import butterknife.Optional; import de.greenrobot.event.EventBus; abstract public class AbstractDetailsFragment extends Fragment @@ -89,6 +92,12 @@ abstract public class AbstractDetailsFragment extends Fragment */ abstract protected SwipeRefreshLayout getSwipeRefreshLayout(); + /** + * When the view created in {@link #createView(LayoutInflater, ViewGroup)} contains a button + * with resource identifier R.id.download this will be called to initiate the download + */ + abstract protected void onDownload(); + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -162,6 +171,16 @@ abstract public class AbstractDetailsFragment extends Fragment return super.onOptionsItemSelected(item); } + @Optional + @OnClick(R.id.download) + public void onDownloadClicked(View v) { + if (Settings.allowedDownloadNetworkTypes(getActivity()) != 0) { + onDownload(); + } else { + Toast.makeText(getActivity(), R.string.no_connection_type_selected, Toast.LENGTH_SHORT).show(); + } + } + protected void startSync(boolean silentRefresh) { this.silentRefresh = silentRefresh; LogUtils.LOGD(TAG, "Starting syc. Silent? " + silentRefresh); diff --git a/app/src/main/java/org/xbmc/kore/ui/AlbumDetailsFragment.java b/app/src/main/java/org/xbmc/kore/ui/AlbumDetailsFragment.java index 9333406..18c135b 100644 --- a/app/src/main/java/org/xbmc/kore/ui/AlbumDetailsFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/AlbumDetailsFragment.java @@ -27,10 +27,10 @@ import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.provider.BaseColumns; -import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; +import android.support.v4.widget.SwipeRefreshLayout; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.LayoutInflater; @@ -55,6 +55,7 @@ import org.xbmc.kore.host.HostInfo; import org.xbmc.kore.host.HostManager; import org.xbmc.kore.jsonrpc.ApiCallback; import org.xbmc.kore.jsonrpc.ApiMethod; +import org.xbmc.kore.jsonrpc.event.MediaSyncEvent; import org.xbmc.kore.jsonrpc.method.Player; import org.xbmc.kore.jsonrpc.method.Playlist; import org.xbmc.kore.jsonrpc.type.PlaylistType; @@ -75,7 +76,7 @@ import butterknife.OnClick; /** * Presents movie details */ -public class AlbumDetailsFragment extends Fragment +public class AlbumDetailsFragment extends AbstractDetailsFragment implements LoaderManager.LoaderCallbacks { private static final String TAG = LogUtils.makeLogTag(AlbumDetailsFragment.class); @@ -155,14 +156,9 @@ public class AlbumDetailsFragment extends Fragment return fragment; } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override @TargetApi(21) - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + @Override + protected View createView(LayoutInflater inflater, ViewGroup container) { albumId = getArguments().getInt(BUNDLE_KEY_ALBUMID, -1); if ((container == null) || (albumId == -1)) { @@ -209,6 +205,31 @@ public class AlbumDetailsFragment extends Fragment return root; } + @Override + protected String getSyncType() { + return null; + } + + @Override + protected String getSyncID() { + return null; + } + + @Override + protected int getSyncItemID() { + return 0; + } + + @Override + protected SwipeRefreshLayout getSwipeRefreshLayout() { + return null; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @Override public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -242,11 +263,11 @@ public class AlbumDetailsFragment extends Fragment case LOADER_ALBUM: uri = MediaContract.Albums.buildAlbumUri(hostInfo.getId(), albumId); return new CursorLoader(getActivity(), uri, - AlbumDetailsQuery.PROJECTION, null, null, null); + AlbumDetailsQuery.PROJECTION, null, null, null); case LOADER_SONGS: uri = MediaContract.Songs.buildSongsListUri(hostInfo.getId(), albumId); return new CursorLoader(getActivity(), uri, - AlbumSongsListQuery.PROJECTION, null, null, AlbumSongsListQuery.SORT); + AlbumSongsListQuery.PROJECTION, null, null, AlbumSongsListQuery.SORT); default: return null; } @@ -292,7 +313,7 @@ public class AlbumDetailsFragment extends Fragment boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) .getBoolean(Settings.KEY_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START, - Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); + Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); if (switchToRemote) { int cx = (fabButton.getLeft() + fabButton.getRight()) / 2; int cy = (fabButton.getTop() + fabButton.getBottom()) / 2; @@ -305,7 +326,7 @@ public class AlbumDetailsFragment extends Fragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -315,10 +336,10 @@ public class AlbumDetailsFragment extends Fragment addToPlaylist(TYPE_ALBUM, albumId); } - @OnClick(R.id.download) - public void onDownloadClicked(View v) { + @Override + protected void onDownload() { if ((albumTitle == null) || (albumDisplayArtist == null) || - (songInfoList == null) || (songInfoList.size() == 0)) { + (songInfoList == null) || (songInfoList.size() == 0)) { // Nothing to download Toast.makeText(getActivity(), R.string.no_files_to_download, Toast.LENGTH_SHORT).show(); return; @@ -335,45 +356,50 @@ public class AlbumDetailsFragment extends Fragment if (file.exists()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.download_dir_exists) - .setPositiveButton(R.string.overwrite, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), hostInfo, - songInfoList, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNeutralButton(R.string.download_with_new_name, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), hostInfo, - songInfoList, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, noopClickListener) - .show(); + .setMessage(R.string.download_dir_exists) + .setPositiveButton(R.string.overwrite, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), hostInfo, + songInfoList, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNeutralButton(R.string.download_with_new_name, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), hostInfo, + songInfoList, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, noopClickListener) + .show(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.confirm_album_download) - .setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), hostInfo, - songInfoList, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, noopClickListener) - .show(); + .setMessage(R.string.confirm_album_download) + .setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), hostInfo, + songInfoList, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, noopClickListener) + .show(); } } + @Override + protected void onSyncProcessEnded(MediaSyncEvent event) { + + } + private boolean isDescriptionExpanded = false; /** * Display the album details @@ -412,9 +438,9 @@ public class AlbumDetailsFragment extends Fragment R.attr.iconCollapse }); final int iconCollapseResId = styledAttributes.getResourceId(0, - R.drawable.ic_expand_less_white_24dp); + R.drawable.ic_expand_less_white_24dp); final int iconExpandResId = styledAttributes.getResourceId(1, - R.drawable.ic_expand_more_white_24dp); + R.drawable.ic_expand_more_white_24dp); styledAttributes.recycle(); mediaDescriptionContainer.setOnClickListener(new View.OnClickListener() { @@ -460,10 +486,10 @@ public class AlbumDetailsFragment extends Fragment private void setMediaYear(String genres, int year) { String label = (year > 0) ? - (!TextUtils.isEmpty(genres) ? + (!TextUtils.isEmpty(genres) ? genres + " | " + String.valueOf(year) : String.valueOf(year)) : - genres; + genres; mediaYear.setText(label); } @@ -515,7 +541,7 @@ public class AlbumDetailsFragment extends Fragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } @Override @@ -523,12 +549,12 @@ public class AlbumDetailsFragment extends Fragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } else { Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } } @@ -537,7 +563,7 @@ public class AlbumDetailsFragment extends Fragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -573,35 +599,35 @@ public class AlbumDetailsFragment extends Fragment if (file.exists()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.download_file_exists) - .setPositiveButton(R.string.overwrite, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), hostInfo, - songInfo, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNeutralButton(R.string.download_with_new_name, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), hostInfo, - songInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { } - }) - .show(); + .setMessage(R.string.download_file_exists) + .setPositiveButton(R.string.overwrite, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), hostInfo, + songInfo, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNeutralButton(R.string.download_with_new_name, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), hostInfo, + songInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { } + }) + .show(); } else { FileDownloadHelper.downloadFiles(getActivity(), hostInfo, - songInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); + songInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); } return true; } @@ -622,7 +648,7 @@ public class AlbumDetailsFragment extends Fragment songInfoList = new ArrayList(cursor.getCount()); do { View songView = LayoutInflater.from(getActivity()) - .inflate(R.layout.list_item_song, songListView, false); + .inflate(R.layout.list_item_song, songListView, false); TextView songTitle = (TextView)songView.findViewById(R.id.song_title); TextView trackNumber = (TextView)songView.findViewById(R.id.track_number); TextView duration = (TextView)songView.findViewById(R.id.duration); @@ -660,7 +686,7 @@ public class AlbumDetailsFragment extends Fragment R.attr.colorAccent}); downloadButton.setColorFilter( styledAttributes.getColor(0, - getActivity().getResources().getColor(R.color.accent_default))); + getActivity().getResources().getColor(R.color.accent_default))); styledAttributes.recycle(); } else { downloadButton.clearColorFilter(); diff --git a/app/src/main/java/org/xbmc/kore/ui/MovieDetailsFragment.java b/app/src/main/java/org/xbmc/kore/ui/MovieDetailsFragment.java index 0c40f61..eab4fcf 100644 --- a/app/src/main/java/org/xbmc/kore/ui/MovieDetailsFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/MovieDetailsFragment.java @@ -271,11 +271,11 @@ public class MovieDetailsFragment extends AbstractDetailsFragment case LOADER_MOVIE: uri = MediaContract.Movies.buildMovieUri(getHostInfo().getId(), movieId); return new CursorLoader(getActivity(), uri, - MovieDetailsQuery.PROJECTION, null, null, null); + MovieDetailsQuery.PROJECTION, null, null, null); case LOADER_CAST: uri = MediaContract.MovieCast.buildMovieCastListUri(getHostInfo().getId(), movieId); return new CursorLoader(getActivity(), uri, - MovieCastListQuery.PROJECTION, null, null, MovieCastListQuery.SORT); + MovieCastListQuery.PROJECTION, null, null, MovieCastListQuery.SORT); default: return null; } @@ -319,7 +319,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) .getBoolean(Settings.KEY_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START, - Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); + Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); if (switchToRemote) { int cx = (fabButton.getLeft() + fabButton.getRight()) / 2; int cy = (fabButton.getTop() + fabButton.getBottom()) / 2; @@ -332,7 +332,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -364,7 +364,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } @Override @@ -372,12 +372,12 @@ public class MovieDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } else { Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } } @@ -386,7 +386,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -425,8 +425,8 @@ public class MovieDetailsFragment extends AbstractDetailsFragment setupSeenButton(newPlaycount); } - @OnClick(R.id.download) - public void onDownloadClicked(View v) { + @Override + protected void onDownload() { if (movieDownloadInfo == null) { // Nothing to download Toast.makeText(getActivity(), R.string.no_files_to_download, Toast.LENGTH_SHORT).show(); @@ -444,43 +444,43 @@ public class MovieDetailsFragment extends AbstractDetailsFragment if (file.exists()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.download_file_exists) - .setPositiveButton(R.string.overwrite, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - movieDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNeutralButton(R.string.download_with_new_name, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - movieDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, noopClickListener) - .show(); + .setMessage(R.string.download_file_exists) + .setPositiveButton(R.string.overwrite, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + movieDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNeutralButton(R.string.download_with_new_name, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + movieDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, noopClickListener) + .show(); } else { // Confirm that the user really wants to download the file AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.confirm_movie_download) - .setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - movieDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, noopClickListener) - .show(); + .setMessage(R.string.confirm_movie_download) + .setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + movieDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, noopClickListener) + .show(); } } @@ -508,7 +508,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment setMediaRating(rating); String votes = cursor.getString(MovieDetailsQuery.VOTES); mediaRatingVotes.setText((TextUtils.isEmpty(votes)) ? - "" : String.format(getString(R.string.votes), votes)); + "" : String.format(getString(R.string.votes), votes)); } else { mediaRating.setVisibility(View.INVISIBLE); mediaMaxRating.setVisibility(View.INVISIBLE); @@ -531,12 +531,12 @@ public class MovieDetailsFragment extends AbstractDetailsFragment int posterWidth = resources.getDimensionPixelOffset(R.dimen.now_playing_poster_width); int posterHeight = resources.getDimensionPixelOffset(R.dimen.now_playing_poster_height); UIUtils.loadImageWithCharacterAvatar(getActivity(), getHostManager(), - cursor.getString(MovieDetailsQuery.THUMBNAIL), movieTitle, - mediaPoster, posterWidth, posterHeight); + cursor.getString(MovieDetailsQuery.THUMBNAIL), movieTitle, + mediaPoster, posterWidth, posterHeight); int artHeight = resources.getDimensionPixelOffset(R.dimen.now_playing_art_height); UIUtils.loadImageIntoImageview(getHostManager(), - cursor.getString(MovieDetailsQuery.FANART), - mediaArt, displayMetrics.widthPixels, artHeight); + cursor.getString(MovieDetailsQuery.FANART), + mediaArt, displayMetrics.widthPixels, artHeight); // Setup movie download info movieDownloadInfo = new FileDownloadHelper.MovieInfo( @@ -549,7 +549,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment R.attr.colorAccent}); downloadButton.setColorFilter( styledAttributes.getColor(0, - getActivity().getResources().getColor(R.color.accent_default))); + getActivity().getResources().getColor(R.color.accent_default))); styledAttributes.recycle(); } else { downloadButton.clearColorFilter(); @@ -563,9 +563,9 @@ public class MovieDetailsFragment extends AbstractDetailsFragment private void setMediaYear(int runtime, int year) { String durationYear = runtime > 0 ? - String.format(getString(R.string.minutes_abbrev), String.valueOf(runtime)) + - " | " + year : - String.valueOf(year); + String.format(getString(R.string.minutes_abbrev), String.valueOf(runtime)) + + " | " + year : + String.valueOf(year); mediaYear.setText(durationYear); } @@ -576,7 +576,7 @@ public class MovieDetailsFragment extends AbstractDetailsFragment TypedArray styledAttributes = theme.obtainStyledAttributes(new int[] { R.attr.colorAccent}); seenButton.setColorFilter(styledAttributes.getColor(0, - getActivity().getResources().getColor(R.color.accent_default))); + getActivity().getResources().getColor(R.color.accent_default))); styledAttributes.recycle(); } else { seenButton.clearColorFilter(); @@ -597,13 +597,13 @@ public class MovieDetailsFragment extends AbstractDetailsFragment castArrayList = new ArrayList(cursor.getCount()); do { castArrayList.add(new VideoType.Cast(cursor.getString(MovieCastListQuery.NAME), - cursor.getInt(MovieCastListQuery.ORDER), - cursor.getString(MovieCastListQuery.ROLE), - cursor.getString(MovieCastListQuery.THUMBNAIL))); + cursor.getInt(MovieCastListQuery.ORDER), + cursor.getString(MovieCastListQuery.ROLE), + cursor.getString(MovieCastListQuery.THUMBNAIL))); } while (cursor.moveToNext()); UIUtils.setupCastInfo(getActivity(), castArrayList, videoCastList, - AllCastActivity.buildLaunchIntent(getActivity(), movieTitle, castArrayList)); + AllCastActivity.buildLaunchIntent(getActivity(), movieTitle, castArrayList)); } } diff --git a/app/src/main/java/org/xbmc/kore/ui/MusicVideoDetailsFragment.java b/app/src/main/java/org/xbmc/kore/ui/MusicVideoDetailsFragment.java index fef2c6d..5546428 100644 --- a/app/src/main/java/org/xbmc/kore/ui/MusicVideoDetailsFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/MusicVideoDetailsFragment.java @@ -44,6 +44,7 @@ import android.widget.Toast; import com.melnykov.fab.FloatingActionButton; import com.melnykov.fab.ObservableScrollView; + import org.xbmc.kore.R; import org.xbmc.kore.Settings; import org.xbmc.kore.jsonrpc.ApiCallback; @@ -246,7 +247,7 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment case LOADER_MUSIC_VIDEO: uri = MediaContract.MusicVideos.buildMusicVideoUri(getHostInfo().getId(), musicVideoId); return new CursorLoader(getActivity(), uri, - MusicVideoDetailsQuery.PROJECTION, null, null, null); + MusicVideoDetailsQuery.PROJECTION, null, null, null); default: return null; } @@ -286,7 +287,7 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) .getBoolean(Settings.KEY_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START, - Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); + Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); if (switchToRemote) { int cx = (fabButton.getLeft() + fabButton.getRight()) / 2; int cy = (fabButton.getTop() + fabButton.getBottom()) / 2; @@ -299,7 +300,7 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -331,7 +332,7 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } @Override @@ -339,12 +340,12 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } else { Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } } @@ -353,13 +354,13 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } - @OnClick(R.id.download) - public void onDownloadClicked(View v) { + @Override + protected void onDownload() { if (musicVideoDownloadInfo == null) { // Nothing to download Toast.makeText(getActivity(), R.string.no_files_to_download, Toast.LENGTH_SHORT).show(); @@ -371,37 +372,37 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment if (file.exists()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.download_file_exists) - .setPositiveButton(R.string.overwrite, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - musicVideoDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNeutralButton(R.string.download_with_new_name, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - musicVideoDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // Nothing to do - } - }) - .show(); + .setMessage(R.string.download_file_exists) + .setPositiveButton(R.string.overwrite, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + musicVideoDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNeutralButton(R.string.download_with_new_name, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + musicVideoDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Nothing to do + } + }) + .show(); } else { FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - musicVideoDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); + musicVideoDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); } } @@ -436,11 +437,11 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment int posterWidth = resources.getDimensionPixelOffset(R.dimen.musicvideodetail_poster_width); int posterHeight = resources.getDimensionPixelOffset(R.dimen.musicvideodetail_poster_width); UIUtils.loadImageWithCharacterAvatar(getActivity(), getHostManager(), - poster, musicVideoTitle, - mediaPoster, posterWidth, posterHeight); + poster, musicVideoTitle, + mediaPoster, posterWidth, posterHeight); UIUtils.loadImageIntoImageview(getHostManager(), - TextUtils.isEmpty(fanart)? poster : fanart, - mediaArt, artWidth, artHeight); + TextUtils.isEmpty(fanart)? poster : fanart, + mediaArt, artWidth, artHeight); // Setup download info musicVideoDownloadInfo = new FileDownloadHelper.MusicVideoInfo( @@ -453,7 +454,7 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment R.attr.colorAccent}); downloadButton.setColorFilter( styledAttributes.getColor(0, - getActivity().getResources().getColor(R.color.accent_default))); + getActivity().getResources().getColor(R.color.accent_default))); styledAttributes.recycle(); } else { downloadButton.clearColorFilter(); @@ -466,9 +467,9 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment private void setMediaYear(int runtime, int year) { String durationYear = runtime > 0 ? - UIUtils.formatTime(runtime) + " | " + - String.valueOf(year) : - String.valueOf(year); + UIUtils.formatTime(runtime) + " | " + + String.valueOf(year) : + String.valueOf(year); mediaYear.setText(durationYear); } diff --git a/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeDetailsFragment.java b/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeDetailsFragment.java index 42b2192..946d76d 100644 --- a/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeDetailsFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeDetailsFragment.java @@ -42,6 +42,7 @@ import android.widget.Toast; import com.melnykov.fab.FloatingActionButton; import com.melnykov.fab.ObservableScrollView; + import org.xbmc.kore.R; import org.xbmc.kore.Settings; import org.xbmc.kore.jsonrpc.ApiCallback; @@ -222,7 +223,7 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment case LOADER_EPISODE: uri = MediaContract.Episodes.buildTVShowEpisodeUri(getHostInfo().getId(), tvshowId, episodeId); return new CursorLoader(getActivity(), uri, - EpisodeDetailsQuery.PROJECTION, null, null, null); + EpisodeDetailsQuery.PROJECTION, null, null, null); // case LOADER_CAST: // uri = MediaContract.MovieCast.buildMovieCastListUri(hostInfo.getId(), episodeId); // return new CursorLoader(getActivity(), uri, @@ -269,7 +270,7 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment boolean switchToRemote = PreferenceManager .getDefaultSharedPreferences(getActivity()) .getBoolean(Settings.KEY_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START, - Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); + Settings.DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START); if (switchToRemote) { int cx = (fabButton.getLeft() + fabButton.getRight()) / 2; int cy = (fabButton.getTop() + fabButton.getBottom()) / 2; @@ -282,7 +283,7 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -314,7 +315,7 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.item_added_to_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } @Override @@ -322,12 +323,12 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } else { Toast.makeText(getActivity(), R.string.no_suitable_playlist, Toast.LENGTH_SHORT) - .show(); + .show(); } } @@ -336,7 +337,7 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment if (!isAdded()) return; // Got an error, show toast Toast.makeText(getActivity(), R.string.unable_to_connect_to_xbmc, Toast.LENGTH_SHORT) - .show(); + .show(); } }, callbackHandler); } @@ -366,8 +367,8 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment setupSeenButton(newPlaycount); } - @OnClick(R.id.download) - public void onDownloadClicked(View v) { + @Override + protected void onDownload() { if (tvshowDownloadInfo == null) { // Nothing to download Toast.makeText(getActivity(), R.string.no_files_to_download, Toast.LENGTH_SHORT).show(); @@ -385,43 +386,43 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment if (file.exists()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.download_file_exists) - .setPositiveButton(R.string.overwrite, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - tvshowDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNeutralButton(R.string.download_with_new_name, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - tvshowDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, noopClickListener) - .show(); + .setMessage(R.string.download_file_exists) + .setPositiveButton(R.string.overwrite, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + tvshowDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNeutralButton(R.string.download_with_new_name, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + tvshowDownloadInfo, FileDownloadHelper.DOWNLOAD_WITH_NEW_NAME, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, noopClickListener) + .show(); } else { // Confirm that the user really wants to download the file AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.download) - .setMessage(R.string.confirm_episode_download) - .setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), - tvshowDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, - callbackHandler); - } - }) - .setNegativeButton(android.R.string.cancel, noopClickListener) - .show(); + .setMessage(R.string.confirm_episode_download) + .setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + FileDownloadHelper.downloadFiles(getActivity(), getHostInfo(), + tvshowDownloadInfo, FileDownloadHelper.OVERWRITE_FILES, + callbackHandler); + } + }) + .setNegativeButton(android.R.string.cancel, noopClickListener) + .show(); } } @@ -437,13 +438,13 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment int runtime = cursor.getInt(EpisodeDetailsQuery.RUNTIME) / 60; String durationPremiered = runtime > 0 ? - String.format(getString(R.string.minutes_abbrev), String.valueOf(runtime)) + - " | " + cursor.getString(EpisodeDetailsQuery.FIRSTAIRED) : - cursor.getString(EpisodeDetailsQuery.FIRSTAIRED); + String.format(getString(R.string.minutes_abbrev), String.valueOf(runtime)) + + " | " + cursor.getString(EpisodeDetailsQuery.FIRSTAIRED) : + cursor.getString(EpisodeDetailsQuery.FIRSTAIRED); mediaPremiered.setText(durationPremiered); String season = String.format(getString(R.string.season_episode), - cursor.getInt(EpisodeDetailsQuery.SEASON), - cursor.getInt(EpisodeDetailsQuery.EPISODE)); + cursor.getInt(EpisodeDetailsQuery.SEASON), + cursor.getInt(EpisodeDetailsQuery.EPISODE)); mediaSeason.setText(season); double rating = cursor.getDouble(EpisodeDetailsQuery.RATING); @@ -474,8 +475,8 @@ public class TVShowEpisodeDetailsFragment extends AbstractDetailsFragment // mediaPoster, posterWidth, posterHeight); int artHeight = resources.getDimensionPixelOffset(R.dimen.now_playing_art_height); UIUtils.loadImageIntoImageview(getHostManager(), - cursor.getString(EpisodeDetailsQuery.THUMBNAIL), - mediaArt, displayMetrics.widthPixels, artHeight); + cursor.getString(EpisodeDetailsQuery.THUMBNAIL), + mediaArt, displayMetrics.widthPixels, artHeight); // Setup movie download info tvshowDownloadInfo = new FileDownloadHelper.TVShowInfo( diff --git a/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java b/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java index 13fdc43..bfca8df 100644 --- a/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java @@ -133,6 +133,11 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment return swipeRefreshLayout; } + @Override + protected void onDownload() { + + } + @Override public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); diff --git a/app/src/main/java/org/xbmc/kore/ui/TVShowOverviewFragment.java b/app/src/main/java/org/xbmc/kore/ui/TVShowOverviewFragment.java index 60debd0..99f9b83 100644 --- a/app/src/main/java/org/xbmc/kore/ui/TVShowOverviewFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/TVShowOverviewFragment.java @@ -173,6 +173,11 @@ public class TVShowOverviewFragment extends AbstractDetailsFragment return swipeRefreshLayout; } + @Override + protected void onDownload() { + + } + @Override public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); diff --git a/app/src/main/java/org/xbmc/kore/utils/FileDownloadHelper.java b/app/src/main/java/org/xbmc/kore/utils/FileDownloadHelper.java index da6c42f..ccb023f 100644 --- a/app/src/main/java/org/xbmc/kore/utils/FileDownloadHelper.java +++ b/app/src/main/java/org/xbmc/kore/utils/FileDownloadHelper.java @@ -25,6 +25,7 @@ import android.util.Base64; import android.widget.Toast; import org.xbmc.kore.R; +import org.xbmc.kore.Settings; import org.xbmc.kore.host.HostInfo; import org.xbmc.kore.jsonrpc.ApiCallback; import org.xbmc.kore.jsonrpc.HostConnection; @@ -375,7 +376,7 @@ public class FileDownloadHelper { request.addRequestHeader("Authorization", "Basic " + token); } request.allowScanningByMediaScanner(); - request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); + request.setAllowedNetworkTypes(Settings.allowedDownloadNetworkTypes(context)); request.setTitle(mediaInfo.getDownloadTitle(context)); request.setDescription(mediaInfo.getDownloadDescrition(context)); diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 73e6e71..e43abad 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -51,6 +51,23 @@ @string/addons + + + WiFi + Mobile + Any + + + + 0 + 1 + 2 + + + + 0 + + 2 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2cbf010..05c89db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -364,5 +364,6 @@ Guide Unable to move item Cannot move currently playing/paused item + No connection type selected in settings diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index f7f1901..475b1bc 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -51,6 +51,14 @@ android:entryValues="@array/entry_values_nav_drawer_items" android:defaultValue="@array/entry_values_nav_drawer_items"/> + +