diff --git a/.gitignore b/.gitignore index 5ecda83bd..041b3d4be 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ crashlytics-build.properties com_crashlytics_export_strings.xml fabric.properties +#Firebase +/google-services.json + # Key signing.properties amahi-release-key.keystore diff --git a/.travis.yml b/.travis.yml index bb4eb1c6d..3eb3093b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,9 @@ android: licenses: - .+ +script: + - ./gradlew clean build -Pbuild=dev + before_script: - echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a - emulator -avd test -no-audio -no-window & diff --git a/build.gradle b/build.gradle index 205b0f5dc..418af2c02 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,15 @@ buildscript { repositories { - maven { url 'https://maven.fabric.io/public' } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' - classpath 'io.fabric.tools:gradle:1.26.1' } } apply plugin: "com.android.application" -apply plugin: 'io.fabric' android { compileSdkVersion 28 @@ -80,6 +77,10 @@ android { release { signingConfig signingConfigs.release } + + dev { + signingConfig signingConfigs.debug + } } android { @@ -93,6 +94,26 @@ android { } } +//Note: Here we are checking if it's the dev build environment which is invoked in Travis + +def build_param = "${build}"; + +if (build_param != "dev") { + //exclude production build + android.variantFilter { variant -> + if (variant.buildType.name.equals('dev')) { + variant.setIgnore(true); + } + } +} else { + //exclude all except production build + android.variantFilter { variant -> + if (!variant.buildType.name.equals('dev')) { + variant.setIgnore(true); + } + } +} + ext { archRoomVersion = "1.1.0" } @@ -114,7 +135,6 @@ dependencies { google() mavenCentral() mavenLocal() - maven { url 'https://maven.fabric.io/public' } maven { url 'http://dl.bintray.com/megabitdragon/maven' } maven { url 'https://jitpack.io' } jcenter() @@ -131,10 +151,7 @@ dependencies { implementation "androidx.mediarouter:mediarouter:${SUPPORT_LIBRARY_VERSION}" implementation "androidx.media:media:${SUPPORT_LIBRARY_VERSION}" implementation "androidx.cardview:cardview:${SUPPORT_LIBRARY_VERSION}" - implementation 'com.google.android.gms:play-services-cast-framework:11.6.0' - implementation('com.crashlytics.sdk.android:crashlytics:2.6.6@aar') { - transitive = true - } + implementation 'com.google.android.gms:play-services-cast-framework:18.1.0' implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' implementation 'com.github.dmytrodanylyk.android-process-button:library:1.0.4' implementation 'com.jakewharton.timber:timber:4.5.1' @@ -160,9 +177,8 @@ dependencies { // Dagger implementation 'com.squareup.dagger:dagger:1.2.5' - compileOnly 'com.squareup.dagger:dagger-compiler:1.2.5' annotationProcessor 'com.squareup.dagger:dagger-compiler:1.2.5' - + implementation 'com.github.blinkist.dagger2-shaded:dagger2-shaded-library:2.27' implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14' implementation 'com.google.android.exoplayer:exoplayer-core:2.7.3' @@ -178,6 +194,9 @@ dependencies { betaReleaseImplementation 'com.readystatesoftware.chuck:library-no-op:1.1.0' */ + // Firebase + implementation 'com.google.firebase:firebase-crashlytics:17.1.0' + } task generateWrapper(type: Wrapper) { diff --git a/src/dev/google-services.json b/src/dev/google-services.json new file mode 100644 index 000000000..54dd946d7 --- /dev/null +++ b/src/dev/google-services.json @@ -0,0 +1,51 @@ +{ + "project_info": { + "project_number": "", + "project_id": "" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:123456789012:android:1234567890123456", + "android_client_info": { + "package_name": "org.amahi.anywhere" + } + }, + "oauth_client": [ + { + "client_id": "", + "client_type": 3 + }, + { + "client_id": "", + "client_type": 1, + "android_info": { + "package_name": "org.amahi.anywhere", + "certificate_hash": "" + } + } + ], + "api_key": [ + { + "current_key": "" + } + ], + "services": { + "analytics_service": { + "status": 2, + "analytics_property": { + "tracking_id": "" + } + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 1 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index fd718f4bf..16c9c8265 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -192,10 +192,6 @@ android:name=".job.NetConnectivityJob" android:permission="android.permission.BIND_JOB_SERVICE" /> - - diff --git a/src/main/java/org/amahi/anywhere/AmahiApplication.java b/src/main/java/org/amahi/anywhere/AmahiApplication.java index f3446dd94..78464a4b3 100644 --- a/src/main/java/org/amahi/anywhere/AmahiApplication.java +++ b/src/main/java/org/amahi/anywhere/AmahiApplication.java @@ -30,13 +30,12 @@ import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatDelegate; -import com.crashlytics.android.Crashlytics; import org.amahi.anywhere.job.NetConnectivityJob; import org.amahi.anywhere.job.PhotosContentJob; import dagger.ObjectGraph; -import io.fabric.sdk.android.Fabric; + import timber.log.Timber; /** @@ -67,7 +66,7 @@ public void onCreate() { instance = this; setUpLogging(); - setUpReporting(); +// setUpReporting(); setUpDetecting(); setUpInjections(); @@ -111,11 +110,11 @@ private boolean isDebugging() { return BuildConfig.DEBUG; } - private void setUpReporting() { - if (!isDebugging()) { - Fabric.with(this, new Crashlytics()); - } - } +// private void setUpReporting() { +// if (!isDebugging()) { +// // Can disable Crashlytics for Debug Mode +// } +// } private void setUpDetecting() { if (isDebugging()) { diff --git a/src/main/java/org/amahi/anywhere/AmahiModule.java b/src/main/java/org/amahi/anywhere/AmahiModule.java index 7dbf6598a..2e23cbcde 100644 --- a/src/main/java/org/amahi/anywhere/AmahiModule.java +++ b/src/main/java/org/amahi/anywhere/AmahiModule.java @@ -60,14 +60,20 @@ import org.amahi.anywhere.util.UploadManager; import javax.inject.Singleton; +import javax.inject.Singleton2; import dagger.Module; +import dagger.Module2; import dagger.Provides; /** * Application dependency injection module. Includes {@link org.amahi.anywhere.server.ApiModule} and * provides application's {@link android.content.Context} for possible consumers. */ +@Module2(includes = { + ApiModule.class, + CacheModule.class +}) @Module( includes = { ApiModule.class, @@ -119,6 +125,7 @@ public AmahiModule(Application application) { @Provides @Singleton + @Singleton2 Context provideContext() { return application; } diff --git a/src/main/java/org/amahi/anywhere/activity/NativeVideoActivity.java b/src/main/java/org/amahi/anywhere/activity/NativeVideoActivity.java index ca2a25d49..b57298216 100644 --- a/src/main/java/org/amahi/anywhere/activity/NativeVideoActivity.java +++ b/src/main/java/org/amahi/anywhere/activity/NativeVideoActivity.java @@ -31,6 +31,7 @@ import android.widget.VideoView; import com.google.android.gms.cast.MediaInfo; +import com.google.android.gms.cast.MediaLoadOptions; import com.google.android.gms.cast.MediaMetadata; import com.google.android.gms.cast.framework.CastButtonFactory; import com.google.android.gms.cast.framework.CastContext; @@ -347,7 +348,15 @@ public void onAdBreakStatusUpdated() { } }); - remoteMediaClient.load(buildMediaInfo(), autoPlay, position); + + remoteMediaClient.load(buildMediaInfo(), buildMediaLoadOptions(autoPlay, position)); + } + + private MediaLoadOptions buildMediaLoadOptions(boolean autoPlay, int position) { + return new MediaLoadOptions.Builder() + .setAutoplay(autoPlay) + .setPlayPosition(position) + .build(); } private MediaInfo buildMediaInfo() { diff --git a/src/main/java/org/amahi/anywhere/cache/CacheModule.java b/src/main/java/org/amahi/anywhere/cache/CacheModule.java index 2630b5454..5f11ceef9 100644 --- a/src/main/java/org/amahi/anywhere/cache/CacheModule.java +++ b/src/main/java/org/amahi/anywhere/cache/CacheModule.java @@ -22,14 +22,17 @@ import android.content.Context; import javax.inject.Singleton; +import javax.inject.Singleton2; import dagger.Module; +import dagger.Module2; import dagger.Provides; /** * Cache dependency injection module. * Provides Singleton {@link CacheManager} for possible consumers. */ +@Module2 @Module( complete = false, library = true @@ -37,6 +40,7 @@ public class CacheModule { @Provides @Singleton + @Singleton2 CacheManager provideCacheManager(Context context) { return new CacheManager(context); } diff --git a/src/main/java/org/amahi/anywhere/server/ApiAdapter.java b/src/main/java/org/amahi/anywhere/server/ApiAdapter.java index 2ef308504..9dbb21675 100644 --- a/src/main/java/org/amahi/anywhere/server/ApiAdapter.java +++ b/src/main/java/org/amahi/anywhere/server/ApiAdapter.java @@ -21,6 +21,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import javax.inject.Singleton2; import okhttp3.OkHttpClient; import retrofit2.Converter.Factory; @@ -32,6 +33,7 @@ * dependency injection provided components. */ @Singleton +@Singleton2 public class ApiAdapter { private final Retrofit.Builder apiBuilder; diff --git a/src/main/java/org/amahi/anywhere/server/ApiModule.java b/src/main/java/org/amahi/anywhere/server/ApiModule.java index d4ada982d..345a9eba3 100644 --- a/src/main/java/org/amahi/anywhere/server/ApiModule.java +++ b/src/main/java/org/amahi/anywhere/server/ApiModule.java @@ -28,8 +28,10 @@ import org.amahi.anywhere.util.Time; import javax.inject.Singleton; +import javax.inject.Singleton2; import dagger.Module; +import dagger.Module2; import dagger.Provides; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; @@ -40,11 +42,11 @@ * API dependency injection module. Provides resources such as HTTP client and JSON converter * for possible consumers. */ - @Module( complete = false, library = true ) +@Module2 public class ApiModule { /** @@ -57,6 +59,7 @@ public class ApiModule { @Provides @Singleton + @Singleton2 OkHttpClient provideHttpClient(ApiHeaders headers, HttpLoggingInterceptor logging) { OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); @@ -68,6 +71,7 @@ OkHttpClient provideHttpClient(ApiHeaders headers, HttpLoggingInterceptor loggin @Provides @Singleton + @Singleton2 ApiHeaders provideHeaders(Context context) { return new ApiHeaders(context); } @@ -85,18 +89,21 @@ ChuckInterceptor provideChuckInterceptor(Context context) { */ @Provides @Singleton + @Singleton2 Converter.Factory provideJsonConverterFactory(Gson json) { return GsonConverterFactory.create(json); } @Provides @Singleton + @Singleton2 Gson provideJson() { return new GsonBuilder().setDateFormat(Time.Format.RFC_1123).create(); } @Provides @Singleton + @Singleton2 HttpLoggingInterceptor provideLogging() { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); diff --git a/src/main/java/org/amahi/anywhere/server/client/AmahiClient.java b/src/main/java/org/amahi/anywhere/server/client/AmahiClient.java index 419312354..82b416de3 100644 --- a/src/main/java/org/amahi/anywhere/server/client/AmahiClient.java +++ b/src/main/java/org/amahi/anywhere/server/client/AmahiClient.java @@ -29,11 +29,13 @@ import javax.inject.Inject; import javax.inject.Singleton; +import javax.inject.Singleton2; /** * Amahi API implementation. Wraps {@link org.amahi.anywhere.server.api.AmahiApi}. */ @Singleton +@Singleton2 public class AmahiClient { private final AmahiApi api; diff --git a/src/main/java/org/amahi/anywhere/server/client/ServerClient.java b/src/main/java/org/amahi/anywhere/server/client/ServerClient.java index 32d705c58..8907de6b3 100644 --- a/src/main/java/org/amahi/anywhere/server/client/ServerClient.java +++ b/src/main/java/org/amahi/anywhere/server/client/ServerClient.java @@ -61,6 +61,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import javax.inject.Singleton2; import okhttp3.MultipartBody; import okhttp3.ResponseBody; @@ -75,6 +76,7 @@ * {@link org.amahi.anywhere.server.api.ServerApi}. Reacts to network connection changes as well. */ @Singleton +@Singleton2 public class ServerClient { private final ApiAdapter apiAdapter; private final ProxyApi proxyApi; diff --git a/src/main/java/org/amahi/anywhere/util/Downloader.java b/src/main/java/org/amahi/anywhere/util/Downloader.java index 508e9875a..b21a78c2c 100644 --- a/src/main/java/org/amahi/anywhere/util/Downloader.java +++ b/src/main/java/org/amahi/anywhere/util/Downloader.java @@ -41,12 +41,14 @@ import javax.inject.Inject; import javax.inject.Singleton; +import javax.inject.Singleton2; /** * File downloader. Uses system {@link android.app.DownloadManager} * for downloads placing and cancelling. */ @Singleton +@Singleton2 public class Downloader extends BroadcastReceiver { public static final String OFFLINE_PATH = "offline_files"; private final Context context; diff --git a/src/main/java/org/amahi/anywhere/util/FileManager.java b/src/main/java/org/amahi/anywhere/util/FileManager.java index 3fc374cd2..b45f55e0f 100644 --- a/src/main/java/org/amahi/anywhere/util/FileManager.java +++ b/src/main/java/org/amahi/anywhere/util/FileManager.java @@ -2,6 +2,8 @@ import android.content.Context; import android.net.Uri; +import android.os.AsyncTask; + import androidx.core.content.FileProvider; import org.amahi.anywhere.bus.BusProvider; @@ -16,8 +18,6 @@ import java.io.InputStream; import java.io.OutputStream; -import io.fabric.sdk.android.services.concurrency.AsyncTask; - public class FileManager { public static final int RECENT_FILE = 0;