aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarey Metcalfe <carey@cmetcalfe.ca>2017-10-13 22:34:23 -0400
committerCarey Metcalfe <carey@cmetcalfe.ca>2017-10-13 23:02:15 -0400
commit28336265e822ab4b2ff1697fd5066fc0cfd88861 (patch)
treefff3daff98137c530a4d0eb2291acd5fc6709ef0
parentd0223c6eab8f58799c8c3ff0e67f5974c237e01c (diff)
downloaddsub-28336265e822ab4b2ff1697fd5066fc0cfd88861.tar.gz
dsub-28336265e822ab4b2ff1697fd5066fc0cfd88861.tar.bz2
dsub-28336265e822ab4b2ff1697fd5066fc0cfd88861.zip
Use product flavours to enable builds without proprietary libraries
This commit uses build flavours to provide two different builds: A 'floss' build and a 'google' build. - The 'floss' build builds a basic version of the app with no dependencies on proprietary libraries. - The 'google' build adds Chromecast support and a few other extras provided by Google Play Services
-rw-r--r--app/build.gradle12
-rw-r--r--app/src/floss/java/github/daneren2005/dsub/util/compat/GoogleCompat.java31
-rw-r--r--app/src/google/AndroidManifest.xml18
-rw-r--r--app/src/google/java/github/daneren2005/dsub/service/ChromeCastController.java (renamed from app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java)1
-rw-r--r--app/src/google/java/github/daneren2005/dsub/util/compat/GoogleCompat.java61
-rw-r--r--app/src/main/AndroidManifest.xml11
-rw-r--r--app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java6
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/MediaRouteManager.java29
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java56
9 files changed, 129 insertions, 96 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 26afb5ea..47604723 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -28,6 +28,16 @@ android {
}
}
+ productFlavors {
+ floss {
+ // FLOSS build (no proprietary libraries)
+ }
+ google {
+ // FLOSS build + Google libraries
+ // Adds ChromeCast support
+ }
+ }
+
packagingOptions {
exclude 'META-INF/beans.xml'
}
@@ -51,7 +61,7 @@ dependencies {
compile 'com.android.support:mediarouter-v7:24.2.+'
compile 'com.android.support:recyclerview-v7:24.2.+'
compile 'com.android.support:design:24.2.+'
- compile 'com.google.android.gms:play-services-cast:8.1.0'
+ googleCompile 'com.google.android.gms:play-services-cast:8.1.0'
compile 'com.sothree.slidinguppanel:library:3.0.0'
compile 'de.hdodenhof:circleimageview:1.2.1'
compile 'com.shehabic.droppy:Droppy:0.5.1@aar'
diff --git a/app/src/floss/java/github/daneren2005/dsub/util/compat/GoogleCompat.java b/app/src/floss/java/github/daneren2005/dsub/util/compat/GoogleCompat.java
new file mode 100644
index 00000000..08db4f1c
--- /dev/null
+++ b/app/src/floss/java/github/daneren2005/dsub/util/compat/GoogleCompat.java
@@ -0,0 +1,31 @@
+package github.daneren2005.dsub.util.compat;
+
+import android.content.Context;
+import android.support.v7.media.MediaRouter;
+
+import github.daneren2005.dsub.service.DownloadService;
+import github.daneren2005.dsub.service.RemoteController;
+
+
+// Provides stubs for Google-related functionality
+public final class GoogleCompat {
+
+ public static boolean playServicesAvailable(Context context) {
+ return false;
+ }
+
+ public static void installProvider(Context context) throws Exception {
+ }
+
+ public static boolean castAvailable() {
+ return false;
+ }
+
+ public static RemoteController getController(DownloadService downloadService, MediaRouter.RouteInfo info) {
+ return null;
+ }
+
+ public static String getCastControlCategory() {
+ return null;
+ }
+}
diff --git a/app/src/google/AndroidManifest.xml b/app/src/google/AndroidManifest.xml
new file mode 100644
index 00000000..14827d43
--- /dev/null
+++ b/app/src/google/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="github.daneren2005.dsub">
+
+ <meta-data
+ android:name="com.google.android.backup.api_key"
+ android:value="AEdPqrEAAAAIUhOMtwa_eG-f0oYUHnetl_Cz7cO9zae8ZXOK5w" />
+ <meta-data
+ android:name="com.google.android.gms.version"
+ android:value="@integer/google_play_services_version" />
+ <meta-data
+ android:name="com.google.android.gms.car.application"
+ android:resource="@xml/auto_app_description" />
+ <meta-data
+ android:name="com.google.android.gms.car.notification.SmallIcon"
+ android:resource="@drawable/stat_notify_playing" />
+
+</manifest>
diff --git a/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java b/app/src/google/java/github/daneren2005/dsub/service/ChromeCastController.java
index f9e2bfb1..b2405705 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java
+++ b/app/src/google/java/github/daneren2005/dsub/service/ChromeCastController.java
@@ -45,7 +45,6 @@ import github.daneren2005.dsub.util.Constants;
import github.daneren2005.dsub.util.EnvironmentVariables;
import github.daneren2005.dsub.util.FileUtil;
import github.daneren2005.dsub.util.Util;
-import github.daneren2005.dsub.util.compat.CastCompat;
import github.daneren2005.serverproxy.FileProxy;
import github.daneren2005.serverproxy.ServerProxy;
import github.daneren2005.serverproxy.WebProxy;
diff --git a/app/src/google/java/github/daneren2005/dsub/util/compat/GoogleCompat.java b/app/src/google/java/github/daneren2005/dsub/util/compat/GoogleCompat.java
new file mode 100644
index 00000000..63992b0f
--- /dev/null
+++ b/app/src/google/java/github/daneren2005/dsub/util/compat/GoogleCompat.java
@@ -0,0 +1,61 @@
+package github.daneren2005.dsub.util.compat;
+
+import android.content.Context;
+import android.support.v7.media.MediaRouter;
+import android.util.Log;
+
+import com.google.android.gms.cast.CastDevice;
+import com.google.android.gms.cast.CastMediaControlIntent;
+import com.google.android.gms.common.ConnectionResult;
+import com.google.android.gms.common.GoogleApiAvailability;
+import com.google.android.gms.security.ProviderInstaller;
+
+import github.daneren2005.dsub.service.ChromeCastController;
+import github.daneren2005.dsub.service.DownloadService;
+import github.daneren2005.dsub.service.RemoteController;
+import github.daneren2005.dsub.util.EnvironmentVariables;
+
+public final class GoogleCompat {
+
+ private static final String TAG = GoogleCompat.class.getSimpleName();
+
+ public static boolean playServicesAvailable(Context context){
+ int result = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
+ if(result != ConnectionResult.SUCCESS){
+ Log.w(TAG, "No play services, failed with result: " + result);
+ return false;
+ }
+ return true;
+ }
+
+ public static void installProvider(Context context) throws Exception{
+ ProviderInstaller.installIfNeeded(context);
+ }
+
+ public static boolean castAvailable() {
+ if (EnvironmentVariables.CAST_APPLICATION_ID == null) {
+ Log.w(TAG, "CAST_APPLICATION_ID not provided");
+ return false;
+ }
+ try {
+ Class.forName("com.google.android.gms.cast.CastDevice");
+ } catch (Exception ex) {
+ Log.w(TAG, "Chromecast library not available");
+ return false;
+ }
+ return true;
+ }
+
+ public static RemoteController getController(DownloadService downloadService, MediaRouter.RouteInfo info) {
+ CastDevice device = CastDevice.getFromBundle(info.getExtras());
+ if(device != null) {
+ return new ChromeCastController(downloadService, device);
+ } else {
+ return null;
+ }
+ }
+
+ public static String getCastControlCategory() {
+ return CastMediaControlIntent.categoryForCast(EnvironmentVariables.CAST_APPLICATION_ID);
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 37643a21..06f79977 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -243,18 +243,7 @@
<meta-data android:name="android.app.default_searchable"
android:value="github.daneren2005.dsub.activity.QueryReceiverActivity"/>
-
- <meta-data android:name="com.google.android.backup.api_key"
- android:value="AEdPqrEAAAAIUhOMtwa_eG-f0oYUHnetl_Cz7cO9zae8ZXOK5w"/>
- <meta-data
- android:name="com.google.android.gms.version"
- android:value="@integer/google_play_services_version" />
-
- <meta-data android:name="com.google.android.gms.car.application"
- android:resource="@xml/auto_app_description"/>
- <meta-data android:name="com.google.android.gms.car.notification.SmallIcon"
- android:resource="@drawable/stat_notify_playing" />
</application>
</manifest>
diff --git a/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java
index 657ac4a9..a4987b09 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java
+++ b/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java
@@ -42,8 +42,6 @@ import android.net.NetworkInfo;
import android.util.Base64;
import android.util.Log;
-import com.google.android.gms.security.ProviderInstaller;
-
import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.*;
import github.daneren2005.dsub.fragments.MainFragment;
@@ -81,6 +79,8 @@ import github.daneren2005.dsub.util.FileUtil;
import github.daneren2005.dsub.util.ProgressListener;
import github.daneren2005.dsub.util.SongDBHandler;
import github.daneren2005.dsub.util.Util;
+import github.daneren2005.dsub.util.compat.GoogleCompat;
+
import java.io.*;
import java.util.Map;
import java.util.zip.GZIPInputStream;
@@ -1875,7 +1875,7 @@ public class RESTMusicService implements MusicService {
private HttpURLConnection getConnectionDirect(Context context, String url, Map<String, String> headers, int minNetworkTimeout) throws Exception {
if(!hasInstalledGoogleSSL) {
try {
- ProviderInstaller.installIfNeeded(context);
+ GoogleCompat.installProvider(context);
} catch(Exception e) {
// Just continue on anyways, doesn't really harm anything if this fails
Log.w(TAG, "Failed to update to use Google Play SSL", e);
diff --git a/app/src/main/java/github/daneren2005/dsub/util/MediaRouteManager.java b/app/src/main/java/github/daneren2005/dsub/util/MediaRouteManager.java
index 73ec6aec..e19cc156 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/MediaRouteManager.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/MediaRouteManager.java
@@ -19,10 +19,6 @@ import android.os.Build;
import android.support.v7.media.MediaRouteProvider;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
-import android.util.Log;
-
-import com.google.android.gms.common.ConnectionResult;
-import com.google.android.gms.common.GooglePlayServicesUtil;
import java.util.ArrayList;
import java.util.List;
@@ -32,7 +28,7 @@ import github.daneren2005.dsub.provider.DLNARouteProvider;
import github.daneren2005.dsub.provider.JukeboxRouteProvider;
import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.service.RemoteController;
-import github.daneren2005.dsub.util.compat.CastCompat;
+import github.daneren2005.dsub.util.compat.GoogleCompat;
import static android.support.v7.media.MediaRouter.RouteInfo;
@@ -50,25 +46,10 @@ public class MediaRouteManager extends MediaRouter.Callback {
private List<MediaRouteProvider> onlineProviders = new ArrayList<MediaRouteProvider>();
private DLNARouteProvider dlnaProvider;
- static {
- try {
- CastCompat.checkAvailable();
- castAvailable = true;
- } catch(Throwable t) {
- castAvailable = false;
- }
- }
-
public MediaRouteManager(DownloadService downloadService) {
this.downloadService = downloadService;
router = MediaRouter.getInstance(downloadService);
-
- // Check if play services is available
- int result = GooglePlayServicesUtil.isGooglePlayServicesAvailable(downloadService);
- if(result != ConnectionResult.SUCCESS){
- Log.w(TAG, "No play services, failed with result: " + result);
- castAvailable = false;
- }
+ castAvailable = GoogleCompat.playServicesAvailable(downloadService) && GoogleCompat.castAvailable();
addProviders();
buildSelector();
@@ -83,7 +64,7 @@ public class MediaRouteManager extends MediaRouter.Callback {
@Override
public void onRouteSelected(MediaRouter router, RouteInfo info) {
if(castAvailable) {
- RemoteController controller = CastCompat.getController(downloadService, info);
+ RemoteController controller = GoogleCompat.getController(downloadService, info);
if(controller != null) {
downloadService.setRemoteEnabled(RemoteControlState.CHROMECAST, controller);
}
@@ -137,7 +118,7 @@ public class MediaRouteManager extends MediaRouter.Callback {
}
public RemoteController getRemoteController(RouteInfo info) {
if(castAvailable) {
- return CastCompat.getController(downloadService, info);
+ return GoogleCompat.getController(downloadService, info);
} else {
return null;
}
@@ -170,7 +151,7 @@ public class MediaRouteManager extends MediaRouter.Callback {
builder.addControlCategory(JukeboxRouteProvider.CATEGORY_JUKEBOX_ROUTE);
}
if(castAvailable) {
- builder.addControlCategory(CastCompat.getCastControlCategory());
+ builder.addControlCategory(GoogleCompat.getCastControlCategory());
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
builder.addControlCategory(DLNARouteProvider.CATEGORY_DLNA);
diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java b/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java
deleted file mode 100644
index 08bac263..00000000
--- a/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java
+++ /dev/null
@@ -1,56 +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 <http://www.gnu.org/licenses/>.
- Copyright 2014 (C) Scott Jackson
-*/
-
-package github.daneren2005.dsub.util.compat;
-
-import android.support.v7.media.MediaRouter;
-
-import com.google.android.gms.cast.CastDevice;
-import com.google.android.gms.cast.CastMediaControlIntent;
-
-import github.daneren2005.dsub.service.ChromeCastController;
-import github.daneren2005.dsub.service.DownloadService;
-import github.daneren2005.dsub.service.RemoteController;
-import github.daneren2005.dsub.util.EnvironmentVariables;
-
-public final class CastCompat {
- static {
- if (EnvironmentVariables.CAST_APPLICATION_ID == null) {
- throw new RuntimeException("CAST_APPLICATION_ID not provided");
- }
- try {
- Class.forName("com.google.android.gms.cast.CastDevice");
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
- }
-
- public static void checkAvailable() throws Throwable {
- // Calling here forces class initialization.
- }
-
- public static RemoteController getController(DownloadService downloadService, MediaRouter.RouteInfo info) {
- CastDevice device = CastDevice.getFromBundle(info.getExtras());
- if(device != null) {
- return new ChromeCastController(downloadService, device);
- } else {
- return null;
- }
- }
-
- public static String getCastControlCategory() {
- return CastMediaControlIntent.categoryForCast(EnvironmentVariables.CAST_APPLICATION_ID);
- }
-}