Added settings options for allowed network types

This allows the user to select other network connection types,
besides WiFi, for downloading media files.
This commit is contained in:
Martijn Brekhof 2016-01-26 13:24:01 +01:00
parent e9cfd1339f
commit 879f941151
12 changed files with 362 additions and 239 deletions

View File

@ -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<String> 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;
}
}

View File

@ -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);

View File

@ -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<Cursor> {
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);
@ -315,8 +336,8 @@ 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)) {
// Nothing to download
@ -374,6 +395,11 @@ public class AlbumDetailsFragment extends Fragment
}
}
@Override
protected void onSyncProcessEnded(MediaSyncEvent event) {
}
private boolean isDescriptionExpanded = false;
/**
* Display the album details

View File

@ -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();

View File

@ -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;
@ -358,8 +359,8 @@ public class MusicVideoDetailsFragment extends AbstractDetailsFragment
}, 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();

View File

@ -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;
@ -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();

View File

@ -133,6 +133,11 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment
return swipeRefreshLayout;
}
@Override
protected void onDownload() {
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

View File

@ -173,6 +173,11 @@ public class TVShowOverviewFragment extends AbstractDetailsFragment
return swipeRefreshLayout;
}
@Override
protected void onDownload() {
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

View File

@ -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));

View File

@ -51,6 +51,23 @@
<item>@string/addons</item>
</string-array>
<!-- Download connection types -->
<string-array name="entries_download_media_items">
<item>WiFi</item>
<item>Mobile</item>
<item>Any</item>
</string-array>
<string-array name="entry_values_download_media_items">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
<string-array name="default_values_download_media_items">
<item>0</item>
</string-array>
<!-- CAUTION: Keep this synced with the entries ids in NavigationDrawerFragment.java -->
<string-array translatable="false" name="entry_values_nav_drawer_items">
<item>2</item>

View File

@ -364,5 +364,6 @@
<string name="pvr_epg">Guide</string>
<string name="unable_to_move_item">Unable to move item</string>
<string name="cannot_move_playing_item">Cannot move currently playing/paused item</string>
<string name="no_connection_type_selected">No connection type selected in settings</string>
</resources>

View File

@ -51,6 +51,14 @@
android:entryValues="@array/entry_values_nav_drawer_items"
android:defaultValue="@array/entry_values_nav_drawer_items"/>
<MultiSelectListPreference
android:key="pref_download_conn_types"
android:title="Download network types"
android:summary="Allowed network types for media downloads"
android:entries="@array/entries_download_media_items"
android:entryValues="@array/entry_values_download_media_items"
android:defaultValue="@array/default_values_download_media_items"/>
<Preference
android:key="pref_about"
android:title="@string/about"/>