B4A Library Firebase UI Auth - a new Dimension in Authentication

This is a Wrap for the Firebase UI-bindings found at Github.

It offers Authentification using
- Google-Account (Tested)
- email and password authentification (Tested)
- Telephone-Authentification (Tested)
- Twitter (Not tested as i do not have a Twitter-Dev Account)
- Facebook (Not tested as i do not have a Facebookr-Dev Account)
- Authentification using a Custom Token generated by the FirebaseAdmin SDK (B4J Library currently in Beta)

For the last two (Twitter and Facebook) there must be made additional changes to the Manifest.

Requirements:
- B4A 7.8+
- Manifestchanges needed!
- You app needs to be AppCompat enabled (must use AppCompat)

Mandatory:
- Prepare your app to use Firebase. https://www.b4x.com/android/forum/threads/integrating-firebase-services.67692/#content
- Google Play Services Base - Snippet
- Firebase Base - Snippet
- Firebase Auth - Snippet
- Additional Manifestentries for the firebase-UI bindings

Add this line to your Manifest to define the needed Firebase UI Activities.

B4X:
CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)
CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)
CreateResourceFromFile(Macro, FirebaseUI.uibindings)

- Mandatory additional Jars needed to the B4A Code

B4X:
#AdditionalJar: androidx.legacy:legacy-support-core-utils
#AdditionalJar: androidx.annotation:annotation
#AdditionalJar: androidx.core:core
#AdditionalJar: androidx.appcompat:appcompat
#AdditionalJar: androidx.legacy:legacy-support-v4
#AdditionalJar: android.arch.lifecycle:extensions
#AdditionalJar: androidx.browser:browser
#AdditionalJar: androidx.cardview:cardview
#AdditionalJar: androidx.constraintlayout:constraintlayout
#AdditionalJar: com.google.android.material:material
#AdditionalJar: com.google.android.gms:play-services-auth
#AdditionalJar: com.google.firebase:firebase-core
#AdditionalJar: com.google.firebase:firebase-auth
#AdditionalJar: firebase-ui-auth-6.2.0.aar
#AdditionalJar: materialprogressbar-1.6.1.aar

#AdditionalRes: ..\res.FirebaseUI, com.firebase.ui.auth

Basically you setup the allowed Auth methods with this Code:
B4X:
    Dim ib As SignInIntentBuilder
    ib.Initialize("",fbauth.createSignInIntentBuilder)

    ib.addProvider(ib.IdpEMAIL_PROVIDER)
    ib.addProvider(ib.IdpPHONE_VERIFICATION_PROVIDER)
    ib.addProvider(ib.IdpANONYMOUS_PROVIDER)
    ib.addProvider(ib.getIdpGOOGLE_PROVIDER("xxxx-yyyy.apps.googleusercontent.com"))
    'ib.addProvider(ib.IdpTWITTER_PROVIDER)
    'ib.addProvider(ib.IdpFACEBOOK_PROVIDER)
    Dim intent As Intent
    intent = ib.setIsSmartLockEnabled2(False,True).setAvailableProviders(ib.Providerlist).setTosUrl("http://URLtoTOS").setPrivacyPolicyUrl("http://URLtoTOS").build
    StartActivity(intent)

NOTES:
- To use Google Authentification with this lib you need to provide the default_web_client id.

You can find the Value in the google-services.json

1. Open the google-services.json with Notepad++
2. Search for your apps packagename, you´ll find a snippet like this
"client_info": {
"mobilesdk_app_id": "1:888939569991:android:83f82a2b632ab8bf",
"android_client_info": {
"package_name": "de.donmanfred.fbui"
}
},
"oauth_client": [
{
"client_id": "dddd-ffff.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "de.donmanfred.fbui",
"certificate_hash": "hhhh"
}
},
{
"client_id": "xxxx-yyyy.apps.googleusercontent.com",
"client_type": 3
}
3. We are interested in the value of client_id from which client_type is 3.
4. Copy the value and use it in the getIdpGOOGLE_PROVIDER call above.

It will result in a Auth-Selection

WhatsApp Image 2017-12-23 at 08.39.48.jpeg

Using email
WhatsApp Image 2017-12-23 at 08.43.59.jpeg

Using new email:
WhatsApp Image 2017-12-23 at 08.45.26.jpeg


FirebaseUI

Author: DonManfred (wrapper)
Version: 0.6
  • FirebaseOptions
    • Functions:
      • Initialize (apiKey As String, appID As String, dbUrl As String, GcmsenderID As String, bucketID As String) As com.google.firebase.FirebaseOptions
  • FirebaseUI
    • Events:
      • AccessTokenAvailable (success As Boolean, token As String)
      • IdTokenChanged (user As FirebaseUser)
      • ResetPassword (success As Boolean)
      • SignedIn (user As FirebaseUser)
      • SignedOut()
      • TokenAvailable (user As FirebaseUser, success As Boolean, token As String)
      • UpdateEmail (success As Boolean, email As String)
      • UpdatePassword (success As Boolean, password As String)
      • UpdateProfile (success As Boolean, request As Object)
    • Functions:
      • AddIdTokenListener (listener As com.google.firebase.auth.FirebaseAuth.IdTokenListener)
      • AddListener (listener As com.google.firebase.auth.FirebaseAuth.AuthStateListener)
      • CreateIdTokenListener As com.google.firebase.auth.FirebaseAuth.IdTokenListener
      • CreateListener As com.google.firebase.auth.FirebaseAuth.AuthStateListener
      • createSignInIntentBuilder As com.firebase.ui.auth.AuthUI.SignInIntentBuilder
      • Initialize (EventName As String, defaultClient As String)
      • RemoveIdTokenListener (listener As com.google.firebase.auth.FirebaseAuth.IdTokenListener)
      • RemoveListener (listener As com.google.firebase.auth.FirebaseAuth.AuthStateListener)
      • sendPasswordResetEmail (email As String)
      • SendSigninIntent (signin As Intent)
      • signInWithCustomToken (token As String)
      • signOut
      • updateEmail (newEmail As String)
      • updatePassword (newPassword As String)
    • Properties:
      • CurrentUser As FirebaseUser [read only]
      • LanguageCode As String [write only]
  • FirebaseUser
    • Functions:
      • isAnonymous As Boolean
      • IsInitialized As Boolean
      • sendEmailVerification
    • Properties:
      • DisplayName As String [read only]
      • Email As String [read only]
      • PhoneNumber As String [read only]
      • PhotoUrl As String [read only]
      • Uid As String [read only]
  • GoogleBuilder
    • Functions:
      • BARef As GoogleBuilder
      • build As com.firebase.ui.auth.AuthUI.IdpConfig
      • DefaultWebClient (client As String) As GoogleBuilder
      • setScopes (scopes As java.util.List) As GoogleBuilder
        Set the scopes that your app will request when using Google sign-in. See all <a
        href="https://developers.google.com/identity/protocols/googlescopes">available
        scopes</a>.
        scopes: additional scopes to be requested
      • setSignInOptions (options As com.google.android.gms.auth.api.signin.GoogleSignInOptions) As GoogleBuilder
        Set the {@link GoogleSignInOptions} to be used for Google sign-in. Standard
        options like requesting the user's email will automatically be added.
        options: sign-in options
    • Properties:
      • Params As android.os.Bundle [read only]
      • ProviderId As String [write only]
  • SignInIntentBuilder
    • Functions:
      • addProvider (provider As com.firebase.ui.auth.AuthUI.IdpConfig)
      • build As Intent
      • clearProvider
      • getIdpGOOGLE_PROVIDER (client As String) As com.firebase.ui.auth.AuthUI.IdpConfig

        client:
        Return type: @return:config
      • GetIdpGOOGLE_PROVIDER2 (client As String, scopes As String()) As com.firebase.ui.auth.AuthUI.IdpConfig
      • GetIdpGOOGLE_PROVIDER3 (client As String) As com.firebase.ui.auth.AuthUI.IdpConfig
      • getResourceId (type As String, resourceName As String) As Int
      • Initialize (EventName As String, builder As com.firebase.ui.auth.AuthUI.SignInIntentBuilder)
      • IsInitialized As Boolean
      • setAlwaysShowSignInMethodScreen (alwaysShow As Boolean) As SignInIntentBuilder
      • setAvailableProviders (providers As java.util.List) As SignInIntentBuilder
      • setEmailLink (emailLink As String) As SignInIntentBuilder
      • setIsSmartLockEnabled (enabled As Boolean) As SignInIntentBuilder
      • setIsSmartLockEnabled2 (enableCredentials As Boolean, enableHints As Boolean) As SignInIntentBuilder
      • setLogo (logo As Int) As SignInIntentBuilder
      • setPrivacyPolicyUrl (privacyPolicyUrl As String) As SignInIntentBuilder
      • setTheme (theme As Int) As SignInIntentBuilder
      • setTosUrl (tosUrl As String) As SignInIntentBuilder
    • Properties:
      • IdpANONYMOUS_PROVIDER As com.firebase.ui.auth.AuthUI.IdpConfig [read only]
      • IdpEMAIL_PROVIDER As com.firebase.ui.auth.AuthUI.IdpConfig [read only]
      • IdpFACEBOOK_PROVIDER As com.firebase.ui.auth.AuthUI.IdpConfig [read only]
      • IdpGITHUB_PROVIDER As com.firebase.ui.auth.AuthUI.IdpConfig [read only]
      • IdpPHONE_VERIFICATION_PROVIDER As com.firebase.ui.auth.AuthUI.IdpConfig [read only]
      • IdpTWITTER_PROVIDER As com.firebase.ui.auth.AuthUI.IdpConfig [read only]
      • Providerlist As java.util.List [read only]

The Library is free to use. You can however donate for it if you want :)


Note to download the additional JARs and AARs from here:

 

Attachments

  • FirebaseUIV0.22.zip
    17.1 KB · Views: 648
  • FirebaseUIV0.51.zip
    18.6 KB · Views: 570
  • res.FirebaseUI.zip
    292.6 KB · Views: 657
  • FirebaseUIV0.6.zip
    20.3 KB · Views: 658
Last edited:

yiankos1

Well-Known Member
Licensed User
Longtime User
I dont understand the question.
I tried to download all threee files from post #1 and it works fine here.

What exactly is the issue?
Thank you for quick reply. I downloaded all three zips. At the second zip(with aar) there is no lib (.jar & xml file) in order to copy at libs folder. I just copied only .aar files but at running throws that i am missing a library.
 

yiankos1

Well-Known Member
Licensed User
Longtime User

yiankos1

Well-Known Member
Licensed User
Longtime User
at the end i should thank as you pointed out that the Library itself was missing :)
So, even 17 likes at first post, i am the first one testing it! :p
 

yiankos1

Well-Known Member
Licensed User
Longtime User
Library working like a charm!!!
For the last two (Twitter and Facebook) there must be made additional changes to the Manifest.

I have already done the necessary work for facebook login configuration with direction of your previous firebase facebook login

EDIT:
If i attach this aar file from Facebook SDK:
B4X:
#AdditionalJar: facebook-core.aar

i get this error:
B4X:
** Activity (main) Resume **
onAuthStateChanged()
** Service (newinst2) Start **
---- AppUpdating.newinst2: service_started
** Service (newinst2) Start **
---- AppUpdating.newinst2: service_started
** Activity (main) Pause, UserClosed = false **
java.lang.NoClassDefFoundError: com.firebase.ui.auth.provider.FacebookProvider
    at com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity.populateIdpList(AuthMethodPickerActivity.java:107)
    at com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity.onCreate(AuthMethodPickerActivity.java:81)
    at android.app.Activity.performCreate(Activity.java:6289)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
    at android.app.ActivityThread.access$900(ActivityThread.java:177)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:5942)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
 
Last edited:

yiankos1

Well-Known Member
Licensed User
Longtime User
Hello,
If i want to edit layout of this intent, which file should i edit?
Moreover, setLogo (logo As Int) As SignInIntentBuilder and setTheme (theme As Int) As SignInIntentBuilder what will be integers?
Thank you for your time.

Edit:
I figured out how to set logo with this code:
B4X:
    Dim r As Reflector
    Dim package As String
    Dim id As Int
    package = r.GetStaticField("anywheresoftware.b4a.BA", "packageName")
    id = r.GetStaticField(package & ".R$drawable", "icon")
icon is the default .png inside this folder ..\FirebaseUI\Objects\res\drawable
 
Last edited:
Top