Code Monkey home page Code Monkey logo

freesound-android's Introduction

Futurice Freesound

Build Status Sponsored

Android client for the Freesound Project.

Searching for Berlin sounds

API is defined as per the Freesound Project API documentation.

Disclaimer

If you've stumbled across this repository - welcome!

This project is intended as a way for Futurice developers to hone their Android skills, learn from colleagues and experiment. We're only just getting started, so expect plenty of rough edges; we're not yet making any bold claims about using best practices that you should follow. Feel free to have a look at the code and be inspired or be appalled.

Thanks for your interest!

Building

To build the app, you will need a Freesound API client id and secret stored in the file: <repo>/app/freesound-api.properties, as per:

freesound.api.clientId=yourapiclientidvaluegoeshere
freesound.api.clientSecret=yourapiclientsecretvaluegoeshere

If you don't have a key and you're not in the Futurice organization, then you will have to generate your own from the Freesound website.

Alternatively, you can join us at Futurice!

Contributing

If you're a Futuricean and feel like getting involved, then look at the list of issues to find a task to work on. If you have an idea of your own, please add create a new issue and get the conversation started.

Pull Requests

Branching

Create a branch from the master branch with this format:

git checkout -b <type>/<title>

Where type is one of the following:

  • feature - a new feature, or part thereof.
  • fix - a fix for a bug.
  • chore - a technical or documentation task.

Example branch:

chore/add-branching-model-to-readme

Status

Use labels to show the status of your pull request:

  • in progress - assigned by contributor: your PR is in progress. Do this as soon as you can.
  • awaiting review - assigned by contributor: your PR is now ready for review. Ping some reviewers!
  • in review - assigned by reviewer: your PR is being reviewed.
  • requires rework - assigned by reviewer: you need to address the reviewer's feedback.
  • conditionally approved - assigned by reviewer: you may merge your pull request, subject to addressing the reviewer's feedback.
  • approved - assigned by reviewer: you may immediately merge your pull request. Hooray!

IDE Configuration

Android Studio

To ensure you that your source files match the project style, import the settings in the ide directory. These include:

  1. Code style formatting settings
  2. Copyright header

Naming conventions

Observables/Flowables

In order to more clearly understand the nature of the Observables and Flowables created, we employ the following naming convention:

  • Observable<...> getValueStream() - when subscribed, may or may not emit any value, but it will never complete. Still, it might emit an error
  • Observable<...> getValueOnceAndStream() - when subscribed, this will emit a value as soon as possible, then may or may not emit any value. Also can emit an error

This naming convention only applies to Observables and Flowables, for Single/Completable/Maybe, apply normal naming convention without the suffixes.

Acknowledgements

Brought to you by the power of the Chilicorn and the Futurice Open Source Program.

Chilicorn Logo

Other Sound Repositories

License

Copyright 2016 Futurice GmbH

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

freesound-android's People

Contributors

blackschmidt avatar duskox avatar joan-domingo avatar kypeli avatar luciapayo avatar peter-tackage avatar tomaszpolanski avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

freesound-android's Issues

NPE exception when press on search icon

Caused by: java.lang.NullPointerException: Cannot return null from a non-@Nullable @Provides method at dagger.internal.Preconditions.checkNotNull(Preconditions.java:47) at com.futurice.freesound.app.module.ConfigModule_ProvideApiModuleApiTokenConfigFactory.get(ConfigModule_ProvideApiModuleApiTokenConfigFactory.java:16) at com.futurice.freesound.app.module.ConfigModule_ProvideApiModuleApiTokenConfigFactory.get(ConfigModule_ProvideApiModuleApiTokenConfigFactory.java:7) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.app.module.ApiModule_ProvideApiInterceptorFactory.get(ApiModule_ProvideApiInterceptorFactory.java:25) at com.futurice.freesound.app.module.ApiModule_ProvideApiInterceptorFactory.get(ApiModule_ProvideApiInterceptorFactory.java:9) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.app.module.ApiModule_ProvideApiOkHttpClientFactory.get(ApiModule_ProvideApiOkHttpClientFactory.java:41) at com.futurice.freesound.app.module.ApiModule_ProvideApiOkHttpClientFactory.get(ApiModule_ProvideApiOkHttpClientFactory.java:12) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.app.module.ApiModule_ProvideFreeSoundApiFactory.get(ApiModule_ProvideFreeSoundApiFactory.java:37) at com.futurice.freesound.app.module.ApiModule_ProvideFreeSoundApiFactory.get(ApiModule_ProvideFreeSoundApiFactory.java:11) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.app.DaggerFreesoundApplicationComponent.getApi(DaggerFreesoundApplicationComponent.java:177) at com.futurice.freesound.feature.search.DaggerSearchActivityComponent$1.get(DaggerSearchActivityComponent.java:75) at com.futurice.freesound.feature.search.DaggerSearchActivityComponent$1.get(DaggerSearchActivityComponent.java:68) at com.futurice.freesound.feature.search.SearchActivityModule_ProvideFreeSoundsSearchServiceFactory.get(SearchActivityModule_ProvideFreeSoundsSearchServiceFactory.java:27) at com.futurice.freesound.feature.search.SearchActivityModule_ProvideFreeSoundsSearchServiceFactory.get(SearchActivityModule_ProvideFreeSoundsSearchServiceFactory.java:10) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.feature.search.SearchActivityModule_ProvideSearchDataModelFactory.get(SearchActivityModule_ProvideSearchDataModelFactory.java:26) at com.futurice.freesound.feature.search.SearchActivityModule_ProvideSearchDataModelFactory.get(SearchActivityModule_ProvideSearchDataModelFactory.java:9) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.feature.search.SearchActivityModule_ProvideSearchViewModelFactory.get(SearchActivityModule_ProvideSearchViewModelFactory.java:38) at com.futurice.freesound.feature.search.SearchActivityModule_ProvideSearchViewModelFactory.get(SearchActivityModule_ProvideSearchViewModelFactory.java:10) at dagger.internal.DoubleCheck.get(DoubleCheck.java:46) at com.futurice.freesound.feature.search.SearchActivity_MembersInjector.injectMembers(SearchActivity_MembersInjector.java:29

P.S. I updated gradle plugin only!

Compiler Warnings

As a first task I thought I could fix the compiler warnings. Is it fine?

:app:compileDebugJavaWithJavac
Note: C:\Users\Joan\AndroidStudioProjects\freesound-android\app\src\main\java\com\futurice\freesound\feature\search\SearchSnackbar.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:incrementalDebugAndroidTestJavaCompilationSafeguard
:app:javaPreCompileDebugAndroidTest
:app:compileDebugAndroidTestJavaWithJavac
:app:compileDebugAndroidTestNdk UP-TO-DATE
:app:compileDebugAndroidTestSources
:app:incrementalDebugUnitTestJavaCompilationSafeguard UP-TO-DATE
:app:javaPreCompileDebugUnitTest
:app:compileDebugUnitTestJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: C:\Users\Joan\AndroidStudioProjects\freesound-android\app\src\test\java\com\futurice\freesound\common\utils\CollectionUtilsTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Clearing of search results is debounced

When the search query is cleared, either directly through the clear button or via the clearing of the search field, then the clearing of the search results list is not processed until after the debounce period (2 seconds). This makes the UI appear sluggish/buggy. The clear of the results should happen immediately.

Search Error Reporting

The search screen needs to have a mechanism to report an error in the event of a failed API call - this does not include when the search gives no results. A Snackbar would be suitable.

Add tests for WaveformExtractor

The WaveformExtractor class (and its concrete implementations) have logic in them that would be very useful to test. The classes contain Android dependencies, such as Bitmap, so either use Android instrumentation tests or possibly add a testable Bitmap interface.

Persistence model

Hi.
I use your project as main reference to my production app and now i need to implement persistence (local database).
You not add it yet (but i hope you will add soon) and i want to ask how would you will implement it in the future.
How i see it:
If we have API and it is consumed directly in DataModel then for local database we also need to have an Datasource/Repository class (for managing local database) that will be also consumed in DataModel directly.
And if we need to interact API and database (for example to save remote data in local database) we will need to do it in DataModel.

Or?

We need to have an additional repository class/es that will manage both API and local database.
And DataModel will consume only that repository class/es. (More like traditional repository pattern that we find in most examples).

P.S. Yesterday was released RxRelay with RxJava2 support, how you look at replacing Subjects with RxRelay?

Thanks and Sorry for these stupid questions!

Use ButterKnife to bind views

Our view code (Activity, Fragment, View) is looking quite messy in regards to the bind of view components. We should use ButterKnife to bind Views.

Reverse class naming

Traditionally the convention for naming classes was feature + component, for instance SearchFragment, which made sense because the packaging was made by component. In this project the packaging is done by feature which makes me wonder if the naming should be reversed. It doesn't seem very useful to have the word Search in the beginning of most of the classes inside the search package, it is redundant and reduces the potential of autocompletion tool since we have to type Search always first when all the classes available inside the search package are search feature related.
Wouldn't be better to type Fragment and get all the fragments available inside the search feature?

Different user for freesound API

Since I am not in Futurice anymore I created my own clientId and clientSecret. There is a problem though for the "users/{user}/" call, the user is hardcoded in the app to SpiceProgram and I have my own user, so this won't work. If I change it to my user name it works but then I don't see the awesome spice program chillicorn avatar anymore :´´´´´´´(

What should we do?

Make time based features testable

We should have an easy way to use TimeSkipScheduler to use in tests but still be able to have computation scheduler in the application.

Add View Lifecycle

The Views created by the RecyclerViewAdapter will stay bound to their ViewModels even when the host Activity/Fragment is paused/stopped. This means that changes may still be propagated to Views when it is unnecessary to do so. In terms of data binding; Views should be subject to the same lifecycle as their host Activity/Fragment.

Dynamically requested API response fields

We need to dynamically request the fields to be populated in the response object. This is currently done by reusing the same Sound class definition, perhaps it would be better to define specific POJOs for the usecase. For example, SummarySound or DetailedSounds.

Another are open for improvement is how we should define the required fields used in the request - they could be defined based on the response object.

Paging of Search Results

Currently the search results only return the first page. We should instead support the paging from the underlying API results.

About Screen

A screen with some information and images about the app, Futurice, Spice Program.

Move common dependency versions into properties

Common dependency versions, such as those used by the Android support library dependencies, should be moved into the project.ext for reuse.

Includes:

  • Android support
  • Dagger 2
  • AutoValue
  • AutoValue Parcelable
  • Firebase
  • Stetho

Memory leak in the list

There is a memory leak caused by the subscription of the view holders to its respective view models. The problem is that the 'unbind' happens only in onViewRecycled() method which is not called when the user navigates away from the recycler view.

I've tried to use onViewDetachedFromWindow(ViewHolder) but it is also not called when navigating away.

Usage of @Nullable annotation

Hi,
I use your application as reference.

You/We have View Widgets and Injected dependencies that are annotated with @nullable.

@nullable annotation act like in Kotlin "?". It means that we need to write use case to deal with both cases when something can be null or not. In other words its part of business logic.

Lets analyze View Widget:
@Nullable @BindView(id.search_view) SearchView searchView;

If is annotated with @nullable then probably there are some business logic regarding this widget where in some cases it can be null and in other not.
The same are with injected dependencies.
Analyzing the code we see that only case when widgets and dependencies can be null is case when something goes wrong with Butterknife and Dagger but its have nothing related to business logic.

I think that both widgets and dependencies needed to be annotated with @nonnull because there is no use case when they can be null and run specific logic.

All these @nullable annotations make class full of "non null" checks to fix "lint" warnings.

Probably you put @nullable instead of @nonnull to fix "lint" warning that suggest to initialize the property.

Maybe in case with generated initializations (Butterknife, Dagger ...) we no need to use @NonNull/@nullable annotations at all.

Thanks for helping me understand!

Show playback progress

There should be a playback progress indicator associated with the waveform view. This would show the progress across the width of the waveform. The current playback time should also be reported.

Add CI support

Once the app is open sourced, then we should add either Travis-CI or some other CI service to verify commits.

Add more complex scenarious

First of all Thanks for such a clean project. I was looking very long fora good implementation of MVVM with RxJava and this project is the best that i found!
You have plans to complete him with some more complex things like permissions, services, db, orientation changes... I mean their position in MVVM architecture.

Thanks!

Add Leak Canary

Evidently, having Leak Canary in the app would be useful to find memory leaks. This should only be in the debug build type.

Add tests for API model JSON parsing

We currently have no tests for our API model JSON parsing, meaning that changes to mapping libraries etc cannot be verified without running the app.

We should have tests for the basic parsing of the model objects.

Can't deploy the 'release' flavor

Build fails when trying trying to deploy the 'release' flavor. Apparently the ProGuard files are not up to date.

Note: android.support.v4.media.IMediaBrowserServiceCallbacksAdapterApi21: can't find dynamically referenced class android.service.media.IMediaBrowserServiceCallbacks
Note: android.support.v4.media.IMediaBrowserServiceCallbacksAdapterApi21: can't find dynamically referenced class android.content.pm.ParceledListSlice
Note: android.support.v4.media.IMediaBrowserServiceCallbacksAdapterApi21$Stub: can't find dynamically referenced class android.service.media.IMediaBrowserServiceCallbacks$Stub
Note: android.support.v4.media.ParceledListSliceAdapterApi21: can't find dynamically referenced class android.content.pm.ParceledListSlice
Note: android.support.v4.text.ICUCompatApi23: can't find dynamically referenced class libcore.icu.ICU
Note: android.support.v4.text.ICUCompatIcs: can't find dynamically referenced class libcore.icu.ICU
Note: android.support.v7.widget.DrawableUtils: can't find dynamically referenced class android.graphics.Insets
Note: com.facebook.stetho.inspector.runtime.RhinoDetectingRuntimeReplFactory: can't find dynamically referenced class com.facebook.stetho.rhino.JsRuntimeReplFactoryBuilder
Note: com.google.android.gms.internal.zzanx: can't find dynamically referenced class sun.misc.Unsafe
Note: com.google.gson.internal.UnsafeAllocator: can't find dynamically referenced class sun.misc.Unsafe
Note: com.squareup.picasso.Utils: can't find dynamically referenced class com.squareup.okhttp.OkHttpClient
Note: okhttp3.internal.platform.AndroidPlatform: can't find dynamically referenced class com.android.org.conscrypt.SSLParametersImpl
Note: okhttp3.internal.platform.AndroidPlatform: can't find dynamically referenced class org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
Note: okhttp3.internal.platform.Platform: can't find dynamically referenced class sun.security.ssl.SSLContextImpl
Note: retrofit2.Platform: can't find dynamically referenced class java.util.Optional
Note: retrofit2.Platform: can't find dynamically referenced class org.robovm.apple.foundation.NSObject
Note: retrofit2.Platform$IOS$MainThreadExecutor: can't find dynamically referenced class org.robovm.apple.foundation.NSOperationQueue
Note: android.support.v4.app.NotificationCompatJellybean accesses a declared field 'icon' dynamically
Maybe this is program field 'android.support.design.R$attr { int icon; }'
Maybe this is program field 'android.support.design.R$id { int icon; }'
Maybe this is program field 'android.support.v4.app.NotificationCompat$Action { int icon; }'
Maybe this is program field 'android.support.v7.appcompat.R$attr { int icon; }'
Maybe this is program field 'android.support.v7.appcompat.R$id { int icon; }'
Maybe this is program field 'com.facebook.stetho.R$attr { int icon; }'
Maybe this is program field 'com.facebook.stetho.R$id { int icon; }'
Maybe this is program field 'com.facebook.stetho.okhttp3.R$attr { int icon; }'
Maybe this is program field 'com.facebook.stetho.okhttp3.R$id { int icon; }'
Maybe this is program field 'com.futurice.freesound.R$attr { int icon; }'
Maybe this is program field 'com.futurice.freesound.R$id { int icon; }'
Maybe this is library field 'android.R$attr { int icon; }'
Maybe this is library field 'android.R$id { int icon; }'
Maybe this is library field 'android.app.LauncherActivity$ListItem { android.graphics.drawable.Drawable icon; }'
Maybe this is library field 'android.app.Notification { int icon; }'
Maybe this is library field 'android.app.Notification$Action { int icon; }'
Maybe this is library field 'android.appwidget.AppWidgetProviderInfo { int icon; }'
Maybe this is library field 'android.content.pm.PackageItemInfo { int icon; }'
Maybe this is library field 'android.content.pm.ResolveInfo { int icon; }'
Maybe this is library field 'android.inputmethodservice.Keyboard$Key { android.graphics.drawable.Drawable icon; }'
Maybe this is library field 'android.speech.tts.TextToSpeech$EngineInfo { int icon; }'
Note: android.support.v4.app.NotificationCompatJellybean accesses a declared field 'title' dynamically
Maybe this is program field 'android.support.design.R$attr { int title; }'
Maybe this is program field 'android.support.design.R$id { int title; }'
Maybe this is program field 'android.support.v4.app.NotificationCompat$Action { java.lang.CharSequence title; }'
Maybe this is program field 'android.support.v7.appcompat.R$attr { int title; }'
Maybe this is program field 'android.support.v7.appcompat.R$id { int title; }'
Maybe this is program field 'com.facebook.stetho.R$attr { int title; }'
Maybe this is program field 'com.facebook.stetho.R$id { int title; }'
Maybe this is program field 'com.facebook.stetho.inspector.protocol.module.HeapProfiler$ProfileHeader { java.lang.String title; }'
Maybe this is program field 'com.facebook.stetho.inspector.protocol.module.Profiler$ProfileHeader { java.lang.String title; }'
Maybe this is program field 'com.facebook.stetho.okhttp3.R$attr { int title; }'
Maybe this is program field 'com.facebook.stetho.okhttp3.R$id { int title; }'
Maybe this is program field 'com.futurice.freesound.R$attr { int title; }'
Maybe this is program field 'com.futurice.freesound.R$id { int title; }'
Maybe this is library field 'android.R$attr { int title; }'
Maybe this is library field 'android.R$id { int title; }'
Maybe this is library field 'android.app.Notification$Action { java.lang.CharSequence title; }'
Maybe this is library field 'android.preference.PreferenceActivity$Header { java.lang.CharSequence title; }'
Note: android.support.v4.app.NotificationCompatJellybean accesses a declared field 'actionIntent' dynamically
Maybe this is program field 'android.support.v4.app.NotificationCompat$Action { android.app.PendingIntent actionIntent; }'
Maybe this is library field 'android.app.Notification$Action { android.app.PendingIntent actionIntent; }'
Note: com.google.android.gms.internal.zzanx accesses a declared field 'theUnsafe' dynamically
Note: com.google.android.gms.internal.zzsb accesses a declared field 'MODULE_ID' dynamically
Maybe this is program field 'com.google.android.gms.dynamite.descriptors.com.google.android.gms.flags.ModuleDescriptor { java.lang.String MODULE_ID; }'
Note: com.google.android.gms.internal.zzsb accesses a declared field 'MODULE_VERSION' dynamically
Maybe this is program field 'com.google.android.gms.dynamite.descriptors.com.google.android.gms.flags.ModuleDescriptor { int MODULE_VERSION; }'
Note: com.google.gson.internal.UnsafeAllocator accesses a declared field 'theUnsafe' dynamically
Note: the configuration keeps the entry point 'com.google.android.gms.flags.impl.FlagProviderImpl { void init(com.google.android.gms.dynamic.zzd); }', but not the descriptor class 'com.google.android.gms.dynamic.zzd'
Note: the configuration keeps the entry point 'com.google.firebase.crash.FirebaseCrash { com.google.firebase.crash.FirebaseCrash getInstance(com.google.firebase.FirebaseApp); }', but not the descriptor class 'com.google.firebase.FirebaseApp'
Note: the configuration keeps the entry point 'com.google.firebase.iid.FirebaseInstanceId { com.google.firebase.iid.FirebaseInstanceId getInstance(com.google.firebase.FirebaseApp); }', but not the descriptor class 'com.google.firebase.FirebaseApp'
Note: there were 7 references to unknown classes.
You should check your configuration for typos.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)
Note: there were 3 classes trying to access enclosing classes using reflection.
You should consider keeping the inner classes attributes
(using '-keepattributes InnerClasses').
(http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)
Note: there were 3 unkept descriptor classes in kept class members.
You should consider explicitly keeping the mentioned classes
(using '-keep').
(http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)
Note: there were 17 unresolved dynamic references to classes or interfaces.
You should check if you need to specify additional program jars.
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
Note: there were 7 accesses to class members by means of introspection.
You should consider explicitly keeping the mentioned class members
(using '-keep' or '-keepclassmembers').
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclassmember)

Warning: there were 6 unresolved references to classes or interfaces.
You may need to add missing library jars or update their versions.
If your code works fine without the missing classes, you can suppress
the warnings with '-dontwarn' options.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Warning: there were 1 unresolved references to library class members.
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)

Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
:app:transformClassesAndResourcesWithProguardForRelease FAILED

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.

    java.io.IOException: Please correct the above warnings first.

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Search failure causes subsequent searches to not be performed

The following error causes the search activity's search capability to no longer function:

10-18 22:57:57.815 2738-2925/com.futurice.freesound.debug E/SearchViewModel: Error when setting search term

It would seem that the onError event is propagated too far, causing the searchQuery stream Observable to error and no longer accept requests.

This can occur when the search API call has a network failure. The app should instead be able to accept future queries.

Using `OnceAndStream` and `Stream` suffix?

Types of Observables in Rx 2 does not help with reasoning about if an observable emits any event on subscription and if it ever completes.

How about using those to suffixes: OnceAndStream and Stream.

Once we do not need to as Single and Maybe will give us this information.

API POJO field nullability

Currently some fields are defined as nullable, simply because the API, being outside of the control of the application, could not define values for certain fields by error, even though they are required. We should not be propagating nullability so far into the application, ideally the network layer should enforce the desired nullability.

Gradle project sync failed on release proguard settings

Error:
Error:(56, 0) Cannot convert the provided notation to a File or URI: [./proguard-rules/android-support-rules.pro, ./proguard-rules/autovalue-rules.pro, ./proguard-rules/okhttp3-rules.pro, ./proguard-rules/picasso-rules.pro, ./proguard-rules/retrofit2-rules.pro, ./proguard-rules/retrolambda-rules.pro, ./proguard-rules/rxjava2-rules.pro, ./proguard-rules/okio-rules.pro, ./proguard-rules/picasso-rules.pro].
The following types/formats are supported:

  • A String or CharSequence path, for example 'src/main/java' or '/usr/include'.
  • A String or CharSequence URI, for example 'file:/usr/include'.
  • A File instance.
  • A URI or URL instance.
    Open File

Line:
proguardFiles getDefaultProguardFile('proguard-android.txt'), releaseProguardFiles

P.S. If comment this line build work :)

Thanks

Ubuntu 16.04

Audio Playback

Create an initial playback solution for the sounds.

  • Either stream or download then play
  • Allow stopping of playback / download
  • Don't play two sounds simultaneously.
  • Cancel playback when exiting host screen

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.