The Google I/O Android App

Overview

Google I/O Android App

Build Status

2021 Update

Due to global events, Google I/O 2020 was canceled and Google I/O 2021 is an online-only event, so the companion app hasn't been updated since 2019. However, the iosched team has continued adding several architecture improvements to its codebase. The general look and feel of the app is unchanged, and the app still uses the data from Google I/O 2019.

Major improvements implemented in 2021:

  • Migration from LiveData to Kotlin Flows to observe data.
  • Support for large screens and other form factors.
  • Migration from SharedPreferences to Jetpack DataStore.
  • (Experimental) Partial migration to Jetpack Compose (in the compose branch)

Description

Google I/O is a developer conference with several days of deep technical content featuring technical sessions and hundreds of demonstrations from developers showcasing their technologies.

This project is the Android app for the conference.

Running the app

The project contains a staging variant that replaces some modules at compile time so they don't depend on remote services such as Firebase. This allows you to try out and test the app without the API keys.

Features

The app displays a list of conference events - sessions, office hours, app reviews, codelabs, etc. - and allows the user to filter these events by event types and by topics (Android, Firebase, etc.). Users can see details about events, and they can star events that interest them. Conference attendees can reserve events to guarantee a seat.

Other features include a Map of the venue, informational pages to guide attendees during the conference in Info, and time-relevant information during the conference in Home.

Schedule screenshot

Development Environment

The app is written entirely in Kotlin and uses the Gradle build system.

To build the app, use the gradlew build command or use "Import Project" in Android Studio. Android Studio Arctic Fox or newer is required and may be downloaded here.

Architecture

The architecture is built around Android Architecture Components and follows the recommendations laid out in the Guide to App Architecture. Logic is kept away from Activities and Fragments and moved to ViewModels. Data is observed using Kotlin Flows and the Data Binding Library binds UI components in layouts to the app's data sources.

The Repository layer handles data operations. IOSched's data comes from a few different sources - user data is stored in Cloud Firestore (either remotely or in a local cache for offline use), user preferences and settings are stored in DataStore, conference data is stored remotely and is fetched and stored in memory for the app to use, etc. - and the repository modules are responsible for handling all data operations and abstracting the data sources from the rest of the app.

A lightweight domain layer sits between the data layer and the presentation layer, and handles discrete pieces of business logic off the UI thread. See the .\*UseCase.kt files under shared/domain for examples.

The Navigation component is used to implement navigation in the app, handling Fragment transactions and providing a consistent user experience.

Room is used for Full Text Search using Fts4 to search for a session, speaker, or codelab.

UI tests are written with Espresso and unit tests use Junit4 with Mockito when necessary.

The Jetpack Benchmark library makes it easy to benchmark your code from within Android Studio. The library handles warmup, measures your code performance, and outputs benchmarking results to the Android Studio console. We added a few benchmark tests around critical paths during app startup - in particular, the parsing of the bootstrap data. This enables us to automate measuring and monitoring initial startup time. Here is an example from a benchmark run:

Started running tests

Connected to process 30763 on device 'google-pixel_3'.
benchmark:
benchmark:    76,076,101 ns BootstrapConferenceDataSourceBenchmark.benchmark_json_parsing
Tests ran to completion.

Dependency Injection is implemented with Hilt. For more details on migrating from dagger-android to Hilt, read the (migration article.

ViewPager2 offers enhanced functionality over the original ViewPager library, such as right-to-left and vertical orientation support. For more details on migrating from ViewPager to ViewPager2, please see this migration guide.

Firebase

The app makes considerable use of the following Firebase components:

  • Cloud Firestore is our source for all user data (events starred or reserved by a user). Firestore gave us automatic sync and also seamlessly managed offline functionality for us.
  • Firebase Cloud Functions allowed us to run backend code. The reservations feature heavily depended on Cloud Functions working in conjuction with Firestore.
  • Firebase Cloud Messaging let us inform the app about changes to conference data on our server.
  • Remote Config helped us manage in-app constants.

For 2020, the implementation was migrated to the Firebase Kotlin extension (KTX) libraries to write more idiomatic Kotlin code when calling Firebase APIs. To learn more, read this Firebase blog article on the Firebase KTX libraries.

Kotlin

The app is entirely written in Kotlin and uses Jetpack's Android Ktx extensions.

Asynchronous tasks are handled with coroutines. Coroutines allow for simple and safe management of one-shot operations as well as building and consuming streams of data using Kotlin Flows.

All build scripts are written with the Kotlin DSL.

Copyright

Copyright 2014 Google Inc. All rights reserved.

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.
Comments
  • Execution failed for task ':server:appengineEndpointsGetClientLibs'

    Execution failed for task ':server:appengineEndpointsGetClientLibs'

    The error message was shown on Gradle Console like this when I run the app, what's going on ?

    :server:compileJava UP-TO-DATE :server:processResources UP-TO-DATE :server:classes UP-TO-DATE :server:appengineEndpointsGetClientLibs FAILED

    FAILURE: Build failed with an exception.

    • What went wrong: Execution failed for task ':server:appengineEndpointsGetClientLibs'.

    There was an error running endpoints command get-client-lib: connect timed out

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

    BUILD FAILED

    Total time: 24.109 secs

    opened by guanpj 31
  • Cannot import project using Android-Studio :

    Cannot import project using Android-Studio :

    I get the next error: Error:A problem occurred configuring project ':Wearable'.

    Could not resolve all dependencies for configuration ':Wearable:_debugCompile'. Could not find any version that matches com.google.android.support:wearable:+. Required by: iosched:Wearable:unspecified Could not find any version that matches com.google.android.gms:play-services-wearable:6.1.+. Required by: iosched:Wearable:unspecified

    I've tried installing various stuff on the SDK manager, but I can't handle those errors for some reason. Any help would be appreciated .

    bug 2014 Source 
    opened by AndroidDeveloperLB 27
  • This app won't run unless you update Google Play services

    This app won't run unless you update Google Play services

    device-2014-08-16-031551 device-2014-08-16-031610

    When trying to run the app I m prompted to update the google play service , upon clicking on update I don't see any update option. The same thing happen on my Nexus4 which is not he case when I install the Google I/O app directly from play store.

    How can this be fixed ?

    opened by VihaanVerma89 25
  • Implement App Startup

    Implement App Startup

    This PR adds yet another Jetpack library called App Startup in order to boost startup time of the application. Here is a comparison chart for better understanding.

    Screenshot 2021-06-01 at 22 59 38

    Looks like there is a significant improvement at startup. If you want to test yourself, execute below command in your terminal:

    Please only take care of Total Time row.

    adb shell am start-activity -W -n com.google.samples.apps.iosched/.ui.LauncherActivity

    enhancement cla: yes 
    opened by nuhkoca 20
  • Failed to import and run

    Failed to import and run

    I get this:

    Conflict with dependency 'com.squareup.okio:okio' in project ':mobile'. Resolved versions for runtime classpath (1.14.0) and compile classpath (1.13.0) differ. This can lead to runtime crashes. To resolve this issue follow advice at https://developer.android.com/studio/build/gradle-tips#configure-project-wide-properties. Alternatively, you can try to fix the problem by adding this snippet to C:\Users\user\Desktop\iosched\mobile\build.gradle: dependencies { implementation("com.squareup.okio:okio:1.14.0") }

    image

    opened by AndroidDeveloperLB 16
  • Fixing issue:

    Fixing issue: "Error:(20,0) No such property. model for class". Updated Travis config and Gradle files

    Hi, I deleted signingConfings. It makes an error on first build after cloning repository and moreover, I don't feel it is necessary for this app which would it be rather used for testing, discovering new things, learning to code from the best.

    cla: yes 
    opened by piotrek1543 14
  • apk build.gradle error - All flavors must belong to a named flavor dimension.

    apk build.gradle error - All flavors must belong to a named flavor dimension.

    Getting this error on build:

    Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

    opened by tombirmingham 11
  • DexIndexOverflowException 65536

    DexIndexOverflowException 65536

    hi, i just check out the latest code and run le android app module in le AS1.2, then i get le com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 exception what's wrong with it?

    2014 Source 
    opened by hesling 10
  • Lack of unit tests

    Lack of unit tests

    Hello, how come you don't have an androidTest directory in your project, replete with unit tests? Don't you want budding developers to look at your code and learn how to unit test?

    opened by IgorGanapolsky 10
  • Update BUILDING.md

    Update BUILDING.md

    Yesterday I had some issues following the building doc as-is.

    1. In the server-side setup section is a tiny but confusing error; where it says "the API key from step 5" it should be step 6 instead (that is due to the numbered list currently starts with 0 instead of 1).
    2. A few Windows-specifics were missing
    3. In the regular building instructions it is no referrer to the App Signing docs. However, if this is the very first time you build a project, the given instructions are confusing and not enough.

    This PR tries to solve these (and a few more, related) "issues" by adding missing information and reformatting confusing instructions. You can see my modified version of the building doc here: https://github.com/eyecatchup/iosched/blob/master/doc/BUILDING.md - compared to: https://github.com/google/iosched/blob/master/doc/BUILDING.md

    BTW, unlike the server-side setup guide says (Step 3), I did not required the project Id from cloud console in order to successfully create a release build of the IOSched android module. SignIn, Maps, YT.. everything works just fine?! So that was a bit confusing too.

    cla: yes 
    opened by eyecatchup 10
  • Nav Drawer With Multiple Activities

    Nav Drawer With Multiple Activities

    Hello,

    I am not sure if this is the right place to ask such thing but im intrigue by the way the Nav Drawer is implemented in this app. Does anyone care to explain the though process behind it? Thanks and sorry if not the right place to ask.

    opened by ispam 9
  • iosched app can't login in google and have error

    iosched app can't login in google and have error

    android system: android 11 phone name: 三星 Galaxy A70s type: 8+128G

    error: 2022-07-19 18:04:57.669 23825-23825/com.google.samples.apps.iosched E/AuthUI: A sign-in error occurred. com.firebase.ui.auth.FirebaseUiException: Code: 12500, message: 12500: at com.firebase.ui.auth.data.remote.GoogleSignInHandler.onActivityResult(GoogleSignInHandler.java:106) at com.firebase.ui.auth.ui.idp.SingleSignInActivity.onActivityResult(SingleSignInActivity.java:116) at android.app.Activity.dispatchActivityResult(Activity.java:8541) at android.app.ActivityThread.deliverResults(ActivityThread.java:5499) at android.app.ActivityThread.handleSendResult(ActivityThread.java:5547) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8506) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139) 2022-07-19 18:04:57.670 23825-23825/com.google.samples.apps.iosched E/AuthUI: A sign-in error occurred. com.firebase.ui.auth.FirebaseUiException: Code: 12500, message: 12500: at com.firebase.ui.auth.data.remote.GoogleSignInHandler.onActivityResult(GoogleSignInHandler.java:106) at com.firebase.ui.auth.ui.idp.SingleSignInActivity.onActivityResult(SingleSignInActivity.java:116) at android.app.Activity.dispatchActivityResult(Activity.java:8541) at android.app.ActivityThread.deliverResults(ActivityThread.java:5499) at android.app.ActivityThread.handleSendResult(ActivityThread.java:5547) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8506) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139) 2022-07-19 18:04:57.670 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@5600ab8[SingleSignInActivity]: stopped(false) old=false 2022-07-19 18:04:57.672 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@f774518[SignInHubActivity]: stopped(true) old=false 2022-07-19 18:04:57.673 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674071963856 - Surface(name=com.google.samples.apps.iosched/com.google.android.gms.auth.api.signin.internal.SignInHubActivity$_23825)/@0x2a91438 / android.view.ViewRootImpl.destroySurface:2484 android.view.ViewRootImpl.setWindowStopped:2332 android.view.WindowManagerGlobal.setStoppedState:741 android.app.Activity.performStop:8423 2022-07-19 18:04:57.673 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674071963856] 2022-07-19 18:04:57.673 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674071963856] 2022-07-19 18:04:57.676 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@f774518[SignInHubActivity]: dispatchDetachedFromWindow 2022-07-19 18:04:57.684 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070805776 - Surface(name=Surface(name=f1d3d8b NavigationBar0)/@0xbd94fc0 - animation-leash)/@0x2c09377 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.684 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070805776] 2022-07-19 18:04:57.684 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070805776] 2022-07-19 18:04:57.684 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674071361232 - Surface(name=Surface(name=7aa22cd StatusBar)/@0xdcda5fd - animation-leash)/@0xdf73be4 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.684 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674071361232] 2022-07-19 18:04:57.684 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674071361232] 2022-07-19 18:04:57.693 23825-23825/com.google.samples.apps.iosched E/ViewRootImpl: sendUserActionEvent() mView returned. 2022-07-19 18:04:57.693 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@5600ab8[SingleSignInActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1 2022-07-19 18:04:57.694 23825-23825/com.google.samples.apps.iosched I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus 2022-07-19 18:04:57.718 23825-23825/com.google.samples.apps.iosched E/AuthUI: A sign-in error occurred. com.firebase.ui.auth.FirebaseUiException: Code: 12500, message: 12500: at com.firebase.ui.auth.data.remote.GoogleSignInHandler.onActivityResult(GoogleSignInHandler.java:106) at com.firebase.ui.auth.ui.idp.SingleSignInActivity.onActivityResult(SingleSignInActivity.java:116) at android.app.Activity.dispatchActivityResult(Activity.java:8541) at android.app.ActivityThread.deliverResults(ActivityThread.java:5499) at android.app.ActivityThread.handleSendResult(ActivityThread.java:5547) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8506) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139) 2022-07-19 18:04:57.719 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@d0eecdc[KickoffActivity]: stopped(false) old=false 2022-07-19 18:04:57.721 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@5600ab8[SingleSignInActivity]: stopped(true) old=false 2022-07-19 18:04:57.722 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070800320 - Surface(name=com.google.samples.apps.iosched/com.firebase.ui.auth.ui.idp.SingleSignInActivity$_23825)/@0x3838141 / android.view.ViewRootImpl.destroySurface:2484 android.view.ViewRootImpl.setWindowStopped:2332 android.view.WindowManagerGlobal.setStoppedState:741 android.app.Activity.performStop:8423 2022-07-19 18:04:57.722 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070800320] 2022-07-19 18:04:57.722 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070800320] 2022-07-19 18:04:57.732 23825-14284/com.google.samples.apps.iosched I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 2022-07-19 18:04:57.732 23825-14284/com.google.samples.apps.iosched I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 2022-07-19 18:04:57.734 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@5600ab8[SingleSignInActivity]: dispatchDetachedFromWindow 2022-07-19 18:04:57.744 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070683456 - Surface(name=Surface(name=f1d3d8b NavigationBar0)/@0xbd94fc0 - animation-leash)/@0x1b77517 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.744 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070683456] 2022-07-19 18:04:57.744 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070683456] 2022-07-19 18:04:57.744 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674071302448 - Surface(name=Surface(name=7aa22cd StatusBar)/@0xdcda5fd - animation-leash)/@0x7940d04 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.744 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674071302448] 2022-07-19 18:04:57.744 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674071302448] 2022-07-19 18:04:57.761 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070695248 - Surface(name=com.google.samples.apps.iosched/com.firebase.ui.auth.KickoffActivity$_23825)/@0xf565936 / android.view.SurfaceControl.assignNativeObject:567 android.view.SurfaceControl.readFromParcel:1115 android.view.IWindowSession$Stub$Proxy.relayout:1810 android.view.ViewRootImpl.relayoutWindow:9005 2022-07-19 18:04:57.761 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070695248] 2022-07-19 18:04:57.761 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070695248] 2022-07-19 18:04:57.762 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: assignNativeObject: nativeObject = 0 Surface(name=null)/@0x5c55ae0 / android.view.SurfaceControl.readFromParcel:1115 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9965 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070989520 - Surface(name=Surface(name=f1d3d8b NavigationBar0)/@0xbd94fc0 - animation-leash)/@0x5766373 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070989520] 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070989520] 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674071125920 - Surface(name=Surface(name=7aa22cd StatusBar)/@0xdcda5fd - animation-leash)/@0x3a79230 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674071125920] 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674071125920] 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@d0eecdc[KickoffActivity]: Relayout returned: old=(477,1112,603,1237) new=(477,1112,603,1237) req=(126,125)0 dur=9 res=0x1 s={true -5476376669777401920} ch=false fn=41 2022-07-19 18:04:57.763 23825-23825/com.google.samples.apps.iosched E/ViewRootImpl: sendUserActionEvent() mView returned. 2022-07-19 18:04:57.764 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@d0eecdc[KickoffActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1 2022-07-19 18:04:57.764 23825-23825/com.google.samples.apps.iosched I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus 2022-07-19 18:04:57.788 23825-23825/com.google.samples.apps.iosched E/FirebaseAuthErrorCodeConverter: FirebaseAuth error: provider_error 2022-07-19 18:04:57.789 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@3cbf47d[MainActivity]: stopped(false) old=false 2022-07-19 18:04:57.793 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@d0eecdc[KickoffActivity]: stopped(true) old=false 2022-07-19 18:04:57.794 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070800320 - Surface(name=com.google.samples.apps.iosched/com.firebase.ui.auth.KickoffActivity$_23825)/@0xf565936 / android.view.ViewRootImpl.destroySurface:2484 android.view.ViewRootImpl.setWindowStopped:2332 android.view.WindowManagerGlobal.setStoppedState:741 android.app.Activity.performStop:8423 2022-07-19 18:04:57.794 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070800320] 2022-07-19 18:04:57.794 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070800320] 2022-07-19 18:04:57.802 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@d0eecdc[KickoffActivity]: dispatchDetachedFromWindow 2022-07-19 18:04:57.805 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674072161504 - Surface(name=Surface(name=cdac032 InputMethod)/@0x4485219 - animation-leash)/@0x1f3f596 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.ImeInsetsSourceConsumer.setControl:154 2022-07-19 18:04:57.805 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674072161504] 2022-07-19 18:04:57.805 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674072161504] 2022-07-19 18:04:57.807 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674072218704 - Surface(name=Surface(name=f1d3d8b NavigationBar0)/@0xbd94fc0 - animation-leash)/@0xaba1589 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.807 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674072218704] 2022-07-19 18:04:57.807 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674072218704] 2022-07-19 18:04:57.807 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070695248 - Surface(name=Surface(name=7aa22cd StatusBar)/@0xdcda5fd - animation-leash)/@0x4c1198e / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.807 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070695248] 2022-07-19 18:04:57.807 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070695248] 2022-07-19 18:04:57.812 23825-23825/com.google.samples.apps.iosched E/ViewRootImpl: sendUserActionEvent() mView returned. 2022-07-19 18:04:57.818 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674072051680 - Surface(name=com.google.samples.apps.iosched/com.google.samples.apps.iosched.ui.MainActivity$_23825)/@0x1ea4c91 / android.view.SurfaceControl.assignNativeObject:567 android.view.SurfaceControl.readFromParcel:1115 android.view.IWindowSession$Stub$Proxy.relayout:1810 android.view.ViewRootImpl.relayoutWindow:9005 2022-07-19 18:04:57.818 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674072051680] 2022-07-19 18:04:57.818 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674072051680] 2022-07-19 18:04:57.819 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: assignNativeObject: nativeObject = 0 Surface(name=null)/@0xacc1a7a / android.view.SurfaceControl.readFromParcel:1115 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9965 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674072230144 - Surface(name=Surface(name=f1d3d8b NavigationBar0)/@0xbd94fc0 - animation-leash)/@0x39409a / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674072230144] 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674072230144] 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674072228736 - Surface(name=Surface(name=7aa22cd StatusBar)/@0xdcda5fd - animation-leash)/@0xb2b9dcb / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674072228736] 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674072228736] 2022-07-19 18:04:57.820 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@3cbf47d[MainActivity]: Relayout returned: old=(0,0,1080,2400) new=(0,0,1080,2400) req=(1080,2400)0 dur=5 res=0x1 s={true -5476376669777279840} ch=false fn=104 2022-07-19 18:04:57.826 23825-23825/com.google.samples.apps.iosched I/ViewRootImpl@3cbf47d[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1 2022-07-19 18:04:57.828 23825-23825/com.google.samples.apps.iosched I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus 2022-07-19 18:04:57.841 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070703696 - Surface(name=Surface(name=cdac032 InputMethod)/@0x4485219 - animation-leash)/@0x7a7e890 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.ImeInsetsSourceConsumer.setControl:154 2022-07-19 18:04:57.841 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070703696] 2022-07-19 18:04:57.841 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070703696] 2022-07-19 18:04:57.843 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674070800320 - Surface(name=Surface(name=f1d3d8b NavigationBar0)/@0xbd94fc0 - animation-leash)/@0xd9f93fd / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.843 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674070800320] 2022-07-19 18:04:57.843 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674070800320] 2022-07-19 18:04:57.843 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: release : mNativeObject = -5476376674072051680 - Surface(name=Surface(name=7aa22cd StatusBar)/@0xdcda5fd - animation-leash)/@0xeb748f2 / android.view.-$$Lambda$Rl1VZmNJ0VZDLK0BAbaVGis0rrA.accept:2 android.view.InsetsSourceControl.release:170 android.view.InsetsSourceConsumer.setControl:202 android.view.InsetsController.onControlsChanged:833 2022-07-19 18:04:57.843 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject s[-5476376674072051680] 2022-07-19 18:04:57.843 23825-23825/com.google.samples.apps.iosched I/SurfaceControl: nativeRelease nativeObject e[-5476376674072051680] 2022-07-19 18:04:58.008 23825-14284/com.google.samples.apps.iosched W/Firebase-Installations: Error when communicating with the Firebase Installations server API. HTTP response: [400 Bad Request: { "error": { "code": 400, "message": "API key expired. Please renew the API key.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "API_KEY_INVALID", "domain": "googleapis.com", "metadata": { "service": "firebaseinstallations.googleapis.com" } } ] } } ] 2022-07-19 18:04:58.008 23825-14284/com.google.samples.apps.iosched W/Firebase-Installations: Firebase options used while communicating with Firebase server APIs: AIzaSyC_LbkKaCrAaBJSBp7DbDZgwLLR3BYUJV0, events-dev-62d2e, 1:447780894619:android:66c485c6a5187053 2022-07-19 18:04:58.008 23825-14284/com.google.samples.apps.iosched E/Firebase-Installations: Firebase Installations can not communicate with Firebase server APIs due to invalid configuration. Please update your Firebase initialization process and set valid Firebase options (API key, Project ID, Application ID) when initializing Firebase. 2022-07-19 18:04:58.012 23825-14285/com.google.samples.apps.iosched E/FirebaseInstanceId: Failed to get FIS auth token java.util.concurrent.ExecutionException: com.google.firebase.installations.FirebaseInstallationsException at com.google.android.gms.tasks.Tasks.zzb(Unknown Source:61) at com.google.android.gms.tasks.Tasks.await(Unknown Source:23) at com.google.firebase.iid.zzt.zzb(com.google.firebase:firebase-iid@@20.1.6:54) at com.google.firebase.iid.zzt.zza(com.google.firebase:firebase-iid@@20.1.6:72) at com.google.firebase.iid.zzs.run(Unknown Source:12) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at com.google.android.gms.common.util.concurrent.zza.run(Unknown Source:6) at java.lang.Thread.run(Thread.java:923) Caused by: com.google.firebase.installations.FirebaseInstallationsException at com.google.firebase.installations.FirebaseInstallations.doNetworkCallIfNecessary(FirebaseInstallations.java:382) at com.google.firebase.installations.FirebaseInstallations.lambda$doRegistrationOrRefresh$2(FirebaseInstallations.java:350) at com.google.firebase.installations.FirebaseInstallations$$Lambda$4.run(Unknown Source:4) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923) 

    opened by Croie 0
  • After the first installation, exit app, and then start app, it will flash, will never be normal, unless I uninstall and reinstall, please tell me what to do?

    After the first installation, exit app, and then start app, it will flash, will never be normal, unless I uninstall and reinstall, please tell me what to do?

    After the first installation, exit app, and then start app, it will flash, will never be normal, unless I uninstall and reinstall, please tell me what to do?

    opened by BraveHL 0
  • Anti Pattern in Connectivity View

    Anti Pattern in Connectivity View

    In the following video, the feature that redirects the user to an explorer without first checking if the user has a connection fails, so the user gets the default chrome connectivity error view. The correct way to deal with this anti pattern could be to notify the user that he doesn't have a connection and try again when it is back.

    Video of the Anti pattern: https://drive.google.com/file/d/1OfRvDKO8-EyGn39aJtpfk6YfVdCwcVGy/view?usp=sharing

    This is found in the next path: mobile>java>com.google.samples.apps.iosched>ui>codelabs>CodelabsFragments

    We propose the following changes. First, check if there is connectivity. If it is true, it calls the URL. Otherwise, return a message informing the user about the issue.

         override fun startCodelab(codelab: Codelab) {
                val connectionManager: ConnectivityManager = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
                 val activeNetwork: NetworkInfo? = connectionManager.activeNetworkInfo
                 val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true
                 if (isConnected) {
                     if (codelab.hasUrl()) {
                         openWebsiteUri(
                             requireContext(),
                             addCodelabsAnalyticsQueryParams(codelab.codelabUrl)
                         )
                         analyticsHelper.logUiEvent(
                             "Start codelab "${codelab.title}"",
                             AnalyticsActions.CLICK
                         )
                     }
                 }
                 else{
                     val builder = AlertDialog.Builder(this)
                     builder.setTitle("Error")
                     builder.setMessage("There is no network connection. Please check and try again")
                     builder.setPositiveButton("Accept",null)
                     val dialog: AlertDialog = builder.create()
                     dialog.show()
                 }
             }
    
    opened by Cefigueredo 0
Releases(2015)
Owner
Google
Google ❤️ Open Source
Google
Easy social network authorization for Android. Supports Facebook, Twitter, Instagram, Google+, Vkontakte. Made by Stfalcon

SocialAuthHelper A library that helps to implement social network authorization (Facebook, Twitter, Instagram, GooglePlus, Vkontakte). Who we are Need

Stfalcon LLC 97 Nov 24, 2022
Login effortlessly with different social networks like Facebook, Twitter or Google Plus

EasyLogin Easy Login in your app with different social networks. Currently supported: Facebook Google Plus Twitter Global Configuration To be able to

Maksim 91 Nov 25, 2022
GitHub client for Android based on the abandoned official app

ForkHub ForkHub started off as a fork of the official Android app from GitHub, and has since seen lots of improvements. You can see a comprehensive li

Jon Ander Peñalba 2.8k Dec 28, 2022
PocketHub Android App

PocketHub This repository contains the source code for the PocketHub Android app. This is the same repository as the now-defunct official GitHub Andro

null 9.4k Dec 27, 2022
The ribot studio app for the Android Platform

Thank you for your interest in ribot’s development work. Unfortunately there are no current plans to make any changes to this project in the near futu

ribot 1.2k Dec 29, 2022
Skooter App - Android client source code

Skooter App STAY CONNECTED. LOCALLY Skooter is a FREE mobile application that acts like a Hyper Local Bulletin Board for your area by showing the most

Prathmesh Ranaut 61 Feb 23, 2022
Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+.

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

Twidere Project 2.7k Jan 1, 2023
An Android App for Github

A Github Android APP How does it look like ? Feature Last Events Repository Detail User Detail Read formatted code Star repository, follow people Sear

Quinn 492 Jan 3, 2023
YouJoin Android Client, a cool app of connection, use Material Design.

YouJoin-Android 简介 这个repo是YouJoin社交平台的Android客户端,代码由本人独立编写,功能和特点包括: 采用Material Design设计 登录注册 即时聊天 个人中心(支持资料编辑、头像上传) 心情动态(支持最多九张图片;支持点赞、评论) 好友关注 附近的人(采

ZZQ 298 Nov 29, 2022
A app client for Github

Git.NB A android app client for Github. 效果图 关于项目 Git.NB现以升级到2.0,功能大有升级,UI大改版本。各种有趣的操作,欢迎下载代码试完。 如果发现有任何问题和建议,随时欢迎Email或者开Issues, 如果有版权问题,立即删除。 使用的开源技术

null 319 Sep 9, 2022
A clone of the TikTok App using Flutter.

Tik Tok App clone TikTok is an iOS and Android media app for creating and sharing short videos. The app was launched in 2017 by ByteDance, for markets

Maxwell Cofie 211 Dec 19, 2022
Share twitter url to this app, and you will be redirected.

twitter2nitter - redirect twitter to nitter Share twitter url to this app, and you will be redirected. Redirect works for: Open twitter url with twitt

null 14 Dec 20, 2022
Android Stories library - Instagram-like android stories library that supports images from disk or from internet (url)

Android Stories Library Instagram like stories library for Android. Add it in your root build.gradle at the end of repositories: allprojects { reposi

Panagiotis Makris 3 Dec 20, 2022
Youtube-dl for android

youtube-dl-android Android library wrapper for youtube-dl executable. Based on yausername's youtubedl-android but with ability to download binary file

Vikas 97 Dec 30, 2022
Twidere for Android

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

Twidere Project 2.7k Dec 27, 2022
A Reddit client for Android

This is a Reddit client on Android written in Java. It does not have any ads and it features clean UI and smooth browsing experience.

null 2.6k Jan 9, 2023
An unofficial open source Reddit client for Android.

RedReader An unofficial, open source Android client for Reddit. Features Free and open-source Software - no ads/tracking Lightweight and fast Swipe po

null 1.4k Jan 7, 2023
Slide is an open sourced, ad free Reddit browser for Android

Slide Slide is an open source, ad free Reddit browser for Android. It is based around the Java Reddit API Wrapper. Slide is available on the Google Pl

Carlos Crane 1.7k Dec 27, 2022
Open-source alternative Instagram client on Android.

Instagram client; previously known as InstaGrabber.

Austin Huang 1.1k Jul 23, 2021