Code Monkey home page Code Monkey logo

tivi's Introduction

Tivi

Tivi ๐Ÿ“บ (work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

This is not an official Google product

Tivi is a work-in-progress TV show tracking Android app, which connects to Trakt.tv.

Download

Android development

Tivi is an app that attempts to use the latest libraries and tools. As a summary:

Development setup

First off, you require the latest Android Studio Flamingo (or newer) to be able to build the app.

Code style

This project uses ktlint, provided via the spotless gradle plugin, and the bundled project IntelliJ codestyle.

If you find that one of your pull reviews does not pass the CI server check due to a code style conflict, you can easily fix it by running: ./gradlew spotlessApply.

API keys

You need to supply API / client keys for the various services the app uses:

You can find information about how to gain access via the relevant links.

When creating a Trakt API project, you need to set the OAuth redirect uri to app.tivi.debug://auth/oauth2callback for debug build types, or app.tivi://auth/oauth2callback for release build types.

Once you obtain the keys, you can set them in your ~/.gradle/gradle.properties:

# Get these from Trakt.tv
TIVI_TRAKT_CLIENT_ID=<insert>
TIVI_TRAKT_CLIENT_SECRET=<insert>

# Get this from TMDb
TIVI_TMDB_API_KEY=<insert>

Jetpack Compose

As mentioned above, this app's UI is completely written in Jetpack Compose. Some screens highlighted are:

Show details

[source]

Show Details demo

Episode details

[source]

Show Details demo

Account

[source]

Show Details demo

Contributions

If you've found an error in this sample, please file an issue.

Patches are encouraged and may be submitted by forking this project and submitting a pull request. Since this project is still in its very early stages, if your change is substantial, please raise an issue first to discuss it.

License

Copyright 2016-2021 Google LLC
Copyright 2023 Christopher Banes

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

    https://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.

tivi's People

Contributors

ataulm avatar cf256 avatar chrisbanes avatar chriskruegerdev avatar christofferqa avatar christxph avatar dependabot-preview[bot] avatar dependabot[bot] avatar erikghonyan avatar github-actions[bot] avatar goooler avatar ivianuu avatar jakewharton avatar jdtremblay avatar leinardi avatar mitrejcevski avatar omico avatar pavlospt avatar penkzhou avatar pietmau avatar prudhvir3ddy avatar razvanred avatar renovate[bot] avatar rharter avatar sathawale27 avatar theapache64 avatar vlazzle avatar wiryadev avatar yschimke avatar zacsweers 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tivi's Issues

"Error:This Gradle plugin requires Studio 3.0 minimum"

Environment

Android Studio: 2.3.3
OS version: MacOS 10.12.6

Problem:

Steps to reproduce:

Install the current stable release of Android Studio.
Open a quickstart-android project.
Try to build the project.
Observed Results:

Gradle 'tivi' project refresh failed
Error:This Gradle plugin requires Studio 3.0 minimum

Suspicious Line of Code: API Call Max Retries Count

The code line is here: line

The whole fragment is this:

repeat(maxAttempts - 1) { attempt ->
    try {
        // Clone a new ready call if needed
        val call = if (isExecuted) clone() else this
        return call.execute()
    } catch (e: Exception) {
        // The response failed, so lets see if we should retry again
        if (attempt == (maxAttempts - 1) || !shouldRetry(e)) {
            throw e
        }
    }
    // Delay to implement exp. backoff
    delay(nextDelay)
    // Increase the next delay
    nextDelay *= 2
}

// We should never hit here
throw IllegalStateException("Unknown exception from executeWithRetry")

For example, when the server is not responding, attempt == (maxAttempts - 1) will never be true and this code always hits the last line.
When it is changed to repeat maxAttempts times, it throws the timeout exception after the 3rd time as it should.

Use `viewLifecycleOwner` for databinding.

There are places where tivi uses Fragment instance as a databinding lifecycle owner.

It's recommended to use viewLifecycleOwner instead of this because right now the observer outlives the view.

Crash on first load due to FOREIGN KEY constraint

There's a race condition somewhere in first load. It's something to do with Trending and Popular having the same show, therefore the data is loaded twice.

io.reactivex.exceptions.OnErrorNotImplementedException: FOREIGN KEY constraint failed (code 787)
    at io.reactivex.internal.observers.EmptyCompletableObserver.onError(EmptyCompletableObserver.java:50)
    at io.reactivex.internal.operators.completable.CompletableFromSingle$CompletableFromSingleObserver.onError(CompletableFromSingle.java:41)
    at io.reactivex.internal.operators.single.SingleDoOnSuccess$DoOnSuccess.onSuccess(SingleDoOnSuccess.java:56)
    at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81)
    at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
    at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
    at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:80)
    at android.arch.persistence.room.EntityInsertionAdapter.insertAndReturnId(EntityInsertionAdapter.java:114)
    at me.banes.chris.tivi.data.TiviShowDao_Impl.insertPopularShows(TiviShowDao_Impl.java:309)
    at me.banes.chris.tivi.calls.PopularCall.saveEntry(PopularCall.kt:67)
    at me.banes.chris.tivi.calls.PaginatedTraktCall$savePage$1.invoke(PaginatedTraktCall.kt:90)
    at me.banes.chris.tivi.calls.PaginatedTraktCall$savePage$1.invoke(PaginatedTraktCall.kt:34)
    at me.banes.chris.tivi.util.DatabaseTxRunnerKt$sam$Runnable$e5ac0046.run(DatabaseTxRunner.kt:0)
    at android.arch.persistence.room.RoomDatabase.runInTransaction(RoomDatabase.java:238)
    at me.banes.chris.tivi.util.DatabaseTxRunner.runInTransaction(DatabaseTxRunner.kt:25)
    at me.banes.chris.tivi.calls.PaginatedTraktCall.savePage(PaginatedTraktCall.kt:87)
    at me.banes.chris.tivi.calls.PaginatedTraktCall$loadPage$4.accept(PaginatedTraktCall.kt:60)
    at me.banes.chris.tivi.calls.PaginatedTraktCall$loadPage$4.accept(PaginatedTraktCall.kt:34)
    at io.reactivex.internal.operators.single.SingleDoOnSuccess$DoOnSuccess.onSuccess(SingleDoOnSuccess.java:53)
	... 8 more

Overlapped Library screen.

Hi,
It looks like the Library screen gets overlapped when the screen comes back from PopularShowsFragment or TrendingShowsFragment.

I think something to do with this:
supportFragmentManager.popBackStack()
tried with changing to this:
supportFragmentManager.popBackStackImmediate()
looked alright.

1
2

Gradle project sync failed.

Gradle sync fails in Android Studio with below error.

This version of Android Studio cannot open this project, please retry with Android Studio 3.5 or newer.

Steps to produce

  1. Open project in Android Studio.

Version

Android Studio 3.4
Build #AI-183.5429.30.34.5452501, built on April 10, 2019
JRE: 1.8.0_152-release-1343-b01 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.14.4

Tests keep running due to using RoomTransactionRunner

Using the RoomTransactionRunner in tests is somehow causing issues. Test 'testEpisodeWatches_sameEntries' for example, it will keep running forever without throwing any error. Removing the RoomTransactionRunners used in that test 'solves' the problem.

Why do you use doOnLayout on Glide?

Hi, I love your app, it has helped me a lot, but I am lazy to get the keys and test it on my phone. Most of DataBinding I learned by copying and modifying things from your app. Today, I implemented some new things and had a very weird issue: Glide displaying wrong images. After a lot of debugging, I found the doOnLayout wasn't being called when recycling. It works on some cases for me, but not on all of them, and my setup is similar to yours (mvrx, epoxy, databinding, etc). I removed it, and everything got fine.

So... It is not an "issue", but I also have nowhere else to ask and you are a bigger expert on databinding than me: why do you use the doOnLayout? Is it safe to remove it? Most tutorials don't include it, but you are a bigger expert than most people.

SSLHandshakeException with Glide

Glide won't load images from TMDB due to the SSLHandshakeException.

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

The app crashes if the device/emulator does not have a network connection on first run

First of, I want to thank you for this awesome repo.

I am trying to grasp error handling around coroutines (still new to coroutines in general), specially when making API calls. When I launched the app with no network connectivity for the first time the app crashes:

FATAL EXCEPTION: ForkJoinPool.commonPool-worker-2
                                                Process: me.banes.chris.tivi, PID: 11029
                                                java.lang.IllegalStateException: Unknown exception from fetchBodyWithRetry
                                                          at me.banes.chris.tivi.trakt.calls.PopularCall.networkCall(PopularCall.kt:99)
                                                          at me.banes.chris.tivi.trakt.calls.PopularCall$networkCall$1.doResume(Unknown Source:14)
                                                          at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:54)
                                                          at kotlinx.coroutines.experimental.ResumeModeKt.resumeMode(ResumeMode.kt:56)
                                                          at kotlinx.coroutines.experimental.DispatchedKt.dispatch(Dispatched.kt:193)
                                                          at kotlinx.coroutines.experimental.AbstractContinuation.onCompletionInternal$kotlinx_coroutines_core(AbstractContinuation.kt:86)
                                                          at kotlinx.coroutines.experimental.JobSupport.completeUpdateState$kotlinx_coroutines_core(Job.kt:704)
                                                          at kotlinx.coroutines.experimental.JobSupport.updateState$kotlinx_coroutines_core(Job.kt:655)
                                                          at kotlinx.coroutines.experimental.AbstractContinuation.resumeImpl(AbstractContinuation.kt:99)
                                                          at kotlinx.coroutines.experimental.CancellableContinuationImpl.resumeUndispatched(CancellableContinuation.kt:272)
                                                          at kotlinx.coroutines.experimental.rx2.SchedulerCoroutineDispatcher$scheduleResumeAfterDelay$disposable$1.run(RxScheduler.kt:44)
                                                          at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:571)
                                                          at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
                                                          at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
                                                          at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                                                          at java.lang.Thread.run(Thread.java:764)

When dealing with coroutines, is the correct approach to just use try{} catch{}? Also, this is more of a general question, coroutines are meant to be a "replacement" for Rx, right? Meaning, if you had something that returned Flowable<T>, Maybe<T>, SIngle<T>, Observable<T>, etc and you want to use coroutines, you can just deal with the underlying T ( as you did when you switched from Rx to coroutines)

on Build: Crashlytics Developer Tools error

I am facing this error :

Error:Execution failed for task ':app:fabricGenerateResourcesDebug'.
> Crashlytics Developer Tools error.

due to missing Fabric API Key. Readme should be updated regarding this.

Handling errors

When I was reading the code I noticed that you are handling errors in RxJava streams using doOnError like here:

.doOnError { messages.value = Resource(Status.ERROR, it.localizedMessage) }

The problem is that doOnError() allows for side effects, but it passes the exception through downstream. So in this case I think that you'll get an OnErrorNotImplementedException when loadNextPage() emits an error.

Posters are randomly loaded.

Hello @chrisbanes

There is a problem with loading posters (especially when scrolling down and go up again, the poster images get changes to different one than the movie).

random Loading

I'd like to give a hand - here is a question

I've spotted some places like the HomeActivity having variables defined as nullable, f.e
private var viewModel: HomeActivityViewModel? = null
Is there a reason behind it? I think they could be made lateinit vars and avoid the nullability.
I'd be glad to give a hand in the project, so I'd be glad if you could give some insight about this approach. Cheers!

Crash scrolling recyclerviews

Decided to try out your app and try to learn some of the things you've been building here. The app crashes when scrolling a long list:

10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err: io.reactivex.exceptions.CompositeException: 2 exceptions occurred. 
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeCallbackObserver.onError(MaybeCallbackObserver.java:86)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onError(FlowableElementAtMaybe.java:94)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.onError(MaybeConcatArray.java:100)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeFromSingle$FromSingleObserver.onError(MaybeFromSingle.java:82)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:69)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onError(SingleFlatMap.java:90)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:79)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.lang.Thread.run(Thread.java:764)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:   ComposedException 1 :
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err: 	java.lang.IllegalStateException: closed
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at okhttp3.internal.http1.Http1Codec$FixedLengthSource.read(Http1Codec.java:393)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at okio.RealBufferedSource.readAll(RealBufferedSource.java:163)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at retrofit2.Utils.buffer(Utils.java:304)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:204)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:91)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.extensions.RetrofitCallObservable.subscribeActual(RetrofitExtensions.kt:47)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:10910)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.extensions.BodyObservable.subscribeActual(RetrofitExtensions.kt:83)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:10910)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.Single.subscribe(Single.java:2779)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at java.lang.Thread.run(Thread.java:764)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:   ComposedException 2 :
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err: 	java.lang.IllegalStateException: Cannot invoke setValue on a background thread
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:404)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at android.arch.lifecycle.LiveData.setValue(LiveData.java:289)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel.onError(EntryViewModel.kt:74)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel.access$onError(EntryViewModel.kt:30)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel$data$2$updateCall$1$1$1$1$2.invoke(EntryViewModel.kt:46)
10-13 11:57:33.856 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel$data$2$updateCall$1$1$1$1$2.invoke(EntryViewModel.kt:30)
10-13 11:57:33.857 4764-5072/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModelKt$sam$Consumer$c58a7660.accept(EntryViewModel.kt:0)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeCallbackObserver.onError(MaybeCallbackObserver.java:83)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onError(FlowableElementAtMaybe.java:94)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.onError(MaybeConcatArray.java:100)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeFromSingle$FromSingleObserver.onError(MaybeFromSingle.java:82)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:69)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onError(SingleFlatMap.java:90)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:79)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
10-13 11:57:33.858 4764-5072/me.banes.chris.tivi W/System.err:     at java.lang.Thread.run(Thread.java:764)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err: io.reactivex.exceptions.CompositeException: 2 exceptions occurred. 
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeCallbackObserver.onError(MaybeCallbackObserver.java:86)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onError(FlowableElementAtMaybe.java:94)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.onError(MaybeConcatArray.java:100)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.maybe.MaybeFromSingle$FromSingleObserver.onError(MaybeFromSingle.java:82)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:69)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onError(SingleFlatMap.java:90)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:79)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:     at java.lang.Thread.run(Thread.java:764)
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err:   ComposedException 1 :
10-13 11:57:33.858 4764-4803/me.banes.chris.tivi W/System.err: 	java.lang.IllegalStateException: closed
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at okhttp3.internal.http1.Http1Codec$FixedLengthSource.read(Http1Codec.java:393)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at okio.RealBufferedSource.readAll(RealBufferedSource.java:163)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at retrofit2.Utils.buffer(Utils.java:304)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:204)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:180)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:91)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.extensions.RetrofitCallObservable.subscribeActual(RetrofitExtensions.kt:47)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:10910)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.extensions.BodyObservable.subscribeActual(RetrofitExtensions.kt:83)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:10910)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.Single.subscribe(Single.java:2779)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at java.lang.Thread.run(Thread.java:764)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:   ComposedException 2 :
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err: 	java.lang.IllegalStateException: Cannot invoke setValue on a background thread
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:404)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at android.arch.lifecycle.LiveData.setValue(LiveData.java:289)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel.onError(EntryViewModel.kt:74)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel.access$onError(EntryViewModel.kt:30)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel$data$2$updateCall$1$1$1$1$2.invoke(EntryViewModel.kt:46)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModel$data$2$updateCall$1$1$1$1$2.invoke(EntryViewModel.kt:30)
10-13 11:57:33.859 4764-4803/me.banes.chris.tivi W/System.err:     at me.banes.chris.tivi.util.EntryViewModelKt$sam$Consumer$c58a7660.accept(EntryViewModel.kt:0)

ViewModel is not retained

After screen rotation a new ViewModel is always provided for fragments. Moving the creation of the model from onAttach to onCreate solves the problem.

New Logo Proposal

Hello

I came across your awesome project and I wanted to help contribute by creating a new logo Proposal for your amazing project based on your already existing logo...

I wanted to create a logo that is CLEAN and feels UNIQUE and also has an IDENTITY to it...

If you find the logo good enough and you like it, please do let me know and i will send you all the files you need both the vector files all for free...

logo design_tivi_presentation

Static code analyzer

Why was the ktlint chosen as the static code analyzer? What's about another more powerful tool like detekt?

Please Provide some design flow or how app works with some diagram or blog

First of all, thanks for this project and I am a great admirer of your work.

I am making my effort to go through the code by putting the debugger at every line of project but hadn't achieved any success so far but certainly, I will.

It would be great if you can provide some description or diagram how the app is working or to whom it is interacting, it will be a great benefit for others like me like this buffer app(https://github.com/bufferapp/android-clean-architecture-boilerplate)

I had gone through the same issue #151 but still I was unable to understand the app interaction.

I hope I will listen very shortly, from you guys.

Main Screen with bottom tab overlapping with same instance!

Steps to reproduce on Samsung devices:

  • Launch Application, tap on more of trending or popular
    -Tap on bottom library tab , now tap on Discover tab
  • Now Press System Back button, I am able to see overlapping of main screen with same instance.

tivi_bug

Inconsistent windows inset top (or details_status_bar_anchor height) in ShowDetailsFragment

Please take a look at this gif first and focus on the top notch where the Toolbar is drawn, before and after the animation:

img_3182

As you can see, right after opening the detail for Bigbang Theory, the inset top is correctly set (details_status_bar_anchor height is equal to the height of top notch in this device),

After I scroll it, somehow this height is reset to default (24dp) and it results in that the toolbar is cut by the top notch.

Device detail: LG G7 (Android 8.0, so no DisplayCutout yet, but windows insets are correctly set).

Below are some (hopefully) useful log screenshot

ShowDetailsFragment#onViewCreated

screen shot 2018-08-20 at 15 33 00

screen shot 2018-08-20 at 15 33 14

Scroll up and observe the onLayout in TintingToolbar (I override this method for debugging only)

screen shot 2018-08-20 at 15 33 36

Animation is wrong ?

Animation on home screen when pressing "MORE" don't like your video which you showed ?

Kotlin NPE in TmdbImageUrlProvider

On a clean install, getting an NPE where preview!! is used in TmdbImageUrlProvider#selectSize(). May be fixed via #94.

01-13 11:56:50.508 5447-5534/me.banes.chris.tivi D/TiviShowDao: Inserting show: TiviShow(id=null, title=The Grand Tour, originalTitle=null, traktId=108999, tmdbId=67557, tmdbPosterPath=null, tmdbBackdropPath=null, lastTraktUpdate=2018-01-13T11:56:50.507Z, lastTmdbUpdate=null, summary=null, homepage=null, rating=null, certification=null, country=null, network=null, runtime=null, _genres=null)
01-13 11:52:39.230 5060-5060/me.banes.chris.tivi E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: me.banes.chris.tivi, PID: 5060
                                                                   kotlin.KotlinNullPointerException
                                                                       at me.banes.chris.tivi.tmdb.TmdbImageUrlProvider.selectSize(TmdbImageUrlProvider.kt:50)
                                                                       at me.banes.chris.tivi.tmdb.TmdbImageUrlProvider.selectSize$default(TmdbImageUrlProvider.kt:31)
                                                                       at me.banes.chris.tivi.tmdb.TmdbImageUrlProvider.getPosterUrl(TmdbImageUrlProvider.kt:26)
                                                                       at me.banes.chris.tivi.ui.databinding.TiviBindingAdaptersKt$loadPoster$1.invoke(TiviBindingAdapters.kt:34)
                                                                       at me.banes.chris.tivi.ui.databinding.TiviBindingAdaptersKt$loadPoster$1.invoke(Unknown Source:2)
                                                                       at me.banes.chris.tivi.extensions.ViewExtensionsKt.doWhenLaidOut(ViewExtensions.kt:45)
                                                                       at me.banes.chris.tivi.ui.databinding.TiviBindingAdaptersKt.loadPoster(TiviBindingAdapters.kt:33)
                                                                       at me.banes.chris.tivi.databinding.ViewHolderPosterGridItemBinding.executeBindings(ViewHolderPosterGridItemBinding.java:284)
                                                                       at android.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:379)
                                                                       at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:351)
                                                                       at com.airbnb.epoxy.DataBindingEpoxyModel.bind(DataBindingEpoxyModel.java:54)
                                                                       at com.airbnb.epoxy.DataBindingEpoxyModel.bind(DataBindingEpoxyModel.java:34)
                                                                       at com.airbnb.epoxy.EpoxyViewHolder.bind(EpoxyViewHolder.java:54)
                                                                       at com.airbnb.epoxy.BaseEpoxyAdapter.onBindViewHolder(BaseEpoxyAdapter.java:96)
                                                                       at com.airbnb.epoxy.EpoxyControllerAdapter.onBindViewHolder(EpoxyControllerAdapter.java:10)
                                                                       at com.airbnb.epoxy.BaseEpoxyAdapter.onBindViewHolder(BaseEpoxyAdapter.java:14)
                                                                       at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6541)
                                                                       at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5484)
                                                                       at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5750)
                                                                       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5589)
                                                                       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5585)
                                                                       at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2231)
                                                                       at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:556)
                                                                       at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1518)
                                                                       at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:610)
                                                                       at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
                                                                       at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3719)
                                                                       at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3436)
                                                                       at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3988)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
                                                                       at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
                                                                       at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
                                                                       at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:874)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1514)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
01-13 11:52:39.231 5060-5060/me.banes.chris.tivi E/AndroidRuntime:     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
                                                                       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
                                                                       at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
                                                                       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
                                                                       at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                       at com.android.internal.policy.DecorView.onLayout(DecorView.java:758)
                                                                       at android.view.View.layout(View.java:19590)
                                                                       at android.view.ViewGroup.layout(ViewGroup.java:6053)
                                                                       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2484)
                                                                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2200)
                                                                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
                                                                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
                                                                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                                                                       at android.view.Choreographer.doCallbacks(Choreographer.java:723)
                                                                       at android.view.Choreographer.doFrame(Choreographer.java:658)
                                                                       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                                                                       at android.os.Handler.handleCallback(Handler.java:789)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:98)
                                                                       at android.os.Looper.loop(Looper.java:164)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

TraktManager runTimeException on startAuth.

Hi!

I got this crash belowe at TraktManager startAuth(). I think the problem, that the context provided by dagger is not an Activity, as this openid isssue suggests.

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? at android.app.ContextImpl.startActivity(ContextImpl.java:672) at android.app.ContextImpl.startActivity(ContextImpl.java:659) at android.content.ContextWrapper.startActivity(ContextWrapper.java:331) at net.openid.appauth.AuthorizationService.performAuthorizationRequest(AuthorizationService.java:222) at net.openid.appauth.AuthorizationService.performAuthorizationRequest(AuthorizationService.java:142) at me.banes.chris.tivi.trakt.TraktManager.startAuth(TraktManager.kt:85) at me.banes.chris.tivi.home.HomeFragmentViewModel.startAuthProcess(HomeFragmentViewModel.kt:65) at me.banes.chris.tivi.home.HomeFragmentViewModel.onLoginItemClicked(HomeFragmentViewModel.kt:61) at me.banes.chris.tivi.home.HomeFragment.onMenuItemClicked(HomeFragment.kt:71) at me.banes.chris.tivi.home.discover.DiscoverFragment$onViewCreated$$inlined$apply$lambda$1.onMenuItemClick(DiscoverFragment.kt:115)

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.