Full Code of auth0/Lock.Android for AI

main ef8b0606851f cached
233 files
1.0 MB
234.6k tokens
1408 symbols
1 requests
Download .txt
Showing preview only (1,112K chars total). Download the full file or copy to clipboard to get everything.
Repository: auth0/Lock.Android
Branch: main
Commit: ef8b0606851f
Files: 233
Total size: 1.0 MB

Directory structure:
gitextract_04ecnqqv/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── Bug Report.yml
│   │   ├── Feature Request.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   ├── get-prerelease/
│   │   │   └── action.yml
│   │   ├── get-release-notes/
│   │   │   └── action.yml
│   │   ├── get-version/
│   │   │   └── action.yml
│   │   ├── maven-publish/
│   │   │   └── action.yml
│   │   ├── release-create/
│   │   │   └── action.yml
│   │   ├── setup/
│   │   │   └── action.yml
│   │   └── tag-exists/
│   │       └── action.yml
│   ├── dependabot.yml
│   ├── stale.yml
│   └── workflows/
│       ├── codeql.yml
│       ├── java-release.yml
│       ├── release.yml
│       ├── sca_scan.yml
│       └── test.yml
├── .gitignore
├── .shiprc
├── .version
├── CHANGELOG.md
├── EXAMPLES.md
├── LICENSE.md
├── MIGRATION_GUIDE.md
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   ├── release-test.jks
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── auth0/
│           │           └── android/
│           │               └── lock/
│           │                   └── app/
│           │                       └── DemoActivity.kt
│           └── res/
│               ├── layout/
│               │   └── demo_activity.xml
│               └── values/
│                   ├── auth0.xml
│                   ├── colors.xml
│                   ├── strings.xml
│                   └── styles.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib/
│   ├── .gitignore
│   ├── build.gradle
│   ├── lint.xml
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   └── com_auth0_lock_passwordless_countries.json
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── auth0/
│       │   │           └── android/
│       │   │               └── lock/
│       │   │                   ├── Auth0Parcelable.java
│       │   │                   ├── AuthButtonSize.java
│       │   │                   ├── AuthenticationCallback.java
│       │   │                   ├── Constants.java
│       │   │                   ├── CountryCodeActivity.java
│       │   │                   ├── InitialScreen.java
│       │   │                   ├── Lock.java
│       │   │                   ├── LockActivity.java
│       │   │                   ├── LockCallback.java
│       │   │                   ├── PasswordlessIdentityHelper.java
│       │   │                   ├── PasswordlessLock.java
│       │   │                   ├── PasswordlessLockActivity.java
│       │   │                   ├── UsernameStyle.java
│       │   │                   ├── WebCallbackWrapper.java
│       │   │                   ├── WebProvider.java
│       │   │                   ├── adapters/
│       │   │                   │   ├── Country.java
│       │   │                   │   └── CountryAdapter.java
│       │   │                   ├── errors/
│       │   │                   │   ├── AuthenticationError.java
│       │   │                   │   ├── ErrorMessageBuilder.java
│       │   │                   │   ├── LoginErrorMessageBuilder.java
│       │   │                   │   └── SignUpErrorMessageBuilder.java
│       │   │                   ├── events/
│       │   │                   │   ├── CountryCodeChangeEvent.java
│       │   │                   │   ├── DatabaseChangePasswordEvent.java
│       │   │                   │   ├── DatabaseEvent.java
│       │   │                   │   ├── DatabaseLoginEvent.java
│       │   │                   │   ├── DatabaseSignUpEvent.java
│       │   │                   │   ├── FetchApplicationEvent.java
│       │   │                   │   ├── LockMessageEvent.java
│       │   │                   │   ├── OAuthLoginEvent.java
│       │   │                   │   └── PasswordlessLoginEvent.java
│       │   │                   ├── internal/
│       │   │                   │   └── configuration/
│       │   │                   │       ├── ApplicationDeserializer.java
│       │   │                   │       ├── ApplicationFetcher.java
│       │   │                   │       ├── AuthMode.java
│       │   │                   │       ├── AuthType.java
│       │   │                   │       ├── BaseConnection.java
│       │   │                   │       ├── Configuration.java
│       │   │                   │       ├── Connection.java
│       │   │                   │       ├── DatabaseConnection.java
│       │   │                   │       ├── GsonDeserializer.java
│       │   │                   │       ├── OAuthConnection.java
│       │   │                   │       ├── Options.java
│       │   │                   │       ├── PasswordComplexity.java
│       │   │                   │       ├── PasswordStrength.java
│       │   │                   │       ├── PasswordlessConnection.java
│       │   │                   │       ├── PasswordlessMode.java
│       │   │                   │       └── Theme.java
│       │   │                   ├── provider/
│       │   │                   │   └── AuthResolver.java
│       │   │                   ├── utils/
│       │   │                   │   ├── CustomField.java
│       │   │                   │   ├── EnterpriseConnectionMatcher.java
│       │   │                   │   ├── HiddenField.java
│       │   │                   │   ├── LoadCountriesTask.java
│       │   │                   │   └── SignUpField.java
│       │   │                   └── views/
│       │   │                       ├── ActionButton.java
│       │   │                       ├── AuthConfig.java
│       │   │                       ├── ChangePasswordFormView.java
│       │   │                       ├── CheckableOptionView.java
│       │   │                       ├── ClassicLockView.java
│       │   │                       ├── CountryCodeSelectorView.java
│       │   │                       ├── CustomFieldsFormView.java
│       │   │                       ├── FormLayout.java
│       │   │                       ├── FormView.java
│       │   │                       ├── HeaderView.java
│       │   │                       ├── ImageCheckbox.java
│       │   │                       ├── LinkTextView.java
│       │   │                       ├── LogInFormView.java
│       │   │                       ├── MFACodeFormView.java
│       │   │                       ├── ModeSelectionView.java
│       │   │                       ├── PasswordStrengthView.java
│       │   │                       ├── PasswordlessFormLayout.java
│       │   │                       ├── PasswordlessInputCodeFormView.java
│       │   │                       ├── PasswordlessLockView.java
│       │   │                       ├── PasswordlessRequestCodeFormView.java
│       │   │                       ├── SignUpFormView.java
│       │   │                       ├── SocialButton.java
│       │   │                       ├── SocialView.java
│       │   │                       ├── SocialViewAdapter.java
│       │   │                       ├── SpacesItemDecoration.java
│       │   │                       ├── ValidatedInputView.java
│       │   │                       ├── ValidatedPasswordInputView.java
│       │   │                       ├── ValidatedUsernameInputView.java
│       │   │                       ├── ViewUtils.java
│       │   │                       └── interfaces/
│       │   │                           ├── IdentityListener.java
│       │   │                           ├── LockWidget.java
│       │   │                           ├── LockWidgetForm.java
│       │   │                           ├── LockWidgetOAuth.java
│       │   │                           └── LockWidgetPasswordless.java
│       │   └── res/
│       │       ├── color/
│       │       │   └── com_auth0_lock_text.xml
│       │       ├── drawable/
│       │       │   ├── com_auth0_lock_link_background.xml
│       │       │   ├── com_auth0_lock_tab.xml
│       │       │   └── com_auth0_lock_terms.xml
│       │       ├── layout/
│       │       │   ├── com_auth0_lock_action_button.xml
│       │       │   ├── com_auth0_lock_activity_lock.xml
│       │       │   ├── com_auth0_lock_activity_lock_passwordless.xml
│       │       │   ├── com_auth0_lock_btn_social_large.xml
│       │       │   ├── com_auth0_lock_changepwd_form_view.xml
│       │       │   ├── com_auth0_lock_checkable_option.xml
│       │       │   ├── com_auth0_lock_custom_fields_form_view.xml
│       │       │   ├── com_auth0_lock_error_layout.xml
│       │       │   ├── com_auth0_lock_header.xml
│       │       │   ├── com_auth0_lock_login_form_view.xml
│       │       │   ├── com_auth0_lock_mfa_input_code_form_view.xml
│       │       │   ├── com_auth0_lock_password_strength.xml
│       │       │   ├── com_auth0_lock_passwordless_activity_country_code.xml
│       │       │   ├── com_auth0_lock_passwordless_country_code_selector.xml
│       │       │   ├── com_auth0_lock_passwordless_input_code_form_view.xml
│       │       │   ├── com_auth0_lock_passwordless_item_country_code.xml
│       │       │   ├── com_auth0_lock_passwordless_request_code_form_view.xml
│       │       │   ├── com_auth0_lock_signup_form_view.xml
│       │       │   ├── com_auth0_lock_sso_layout.xml
│       │       │   ├── com_auth0_lock_tab.xml
│       │       │   ├── com_auth0_lock_tab_layout.xml
│       │       │   ├── com_auth0_lock_terms_layout.xml
│       │       │   └── com_auth0_lock_validated_input_view.xml
│       │       ├── values/
│       │       │   ├── attrs.xml
│       │       │   ├── auth_styles.xml
│       │       │   ├── colors.xml
│       │       │   ├── dimens.xml
│       │       │   ├── ids.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       └── values-sw400dp/
│       │           └── dimens.xml
│       └── test/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── auth0/
│           │           └── android/
│           │               └── lock/
│           │                   ├── Auth0ParcelableTest.java
│           │                   ├── AuthenticationCallbackTest.java
│           │                   ├── ClassicBuilderTest.java
│           │                   ├── LockActivityTest.java
│           │                   ├── PasswordlessBuilderTest.java
│           │                   ├── PasswordlessIdentityHelperTest.java
│           │                   ├── PasswordlessLockActivityTest.java
│           │                   ├── WebProviderTest.java
│           │                   ├── errors/
│           │                   │   ├── LoginErrorMessageBuilderTest.java
│           │                   │   └── SignUpErrorMessageBuilderTest.java
│           │                   ├── events/
│           │                   │   ├── DatabaseEventTest.java
│           │                   │   ├── DatabaseLoginEventTest.java
│           │                   │   ├── DatabaseSignUpEventTest.java
│           │                   │   ├── ErrorMessageEventTest.java
│           │                   │   ├── OAuthLoginEventTest.java
│           │                   │   └── PasswordlessLoginEventTest.java
│           │                   ├── internal/
│           │                   │   └── configuration/
│           │                   │       ├── ApplicationFetcherTest.java
│           │                   │       ├── ApplicationGsonTest.java
│           │                   │       ├── ConfigurationTest.java
│           │                   │       ├── ConnectionGsonTest.java
│           │                   │       ├── ConnectionMatcher.java
│           │                   │       ├── ConnectionTest.java
│           │                   │       ├── DatabaseConnectionTest.java
│           │                   │       ├── EnterpriseConnectionMatcherTest.java
│           │                   │       ├── GsonBaseTest.java
│           │                   │       ├── OAuthConnectionTest.java
│           │                   │       ├── OptionsTest.java
│           │                   │       ├── PasswordlessConnectionTest.java
│           │                   │       └── ThemeTest.java
│           │                   ├── provider/
│           │                   │   └── AuthResolverTest.java
│           │                   ├── utils/
│           │                   │   ├── ApplicationAPI.java
│           │                   │   ├── Auth0AuthenticationCallbackMatcher.java
│           │                   │   ├── AuthenticationCallbackMatcher.java
│           │                   │   ├── CallbackMatcher.java
│           │                   │   ├── CustomFieldTest.java
│           │                   │   ├── HiddenFieldTest.java
│           │                   │   ├── MockAuthenticationCallback.java
│           │                   │   ├── MockCallback.java
│           │                   │   ├── MockLockCallback.java
│           │                   │   ├── SSLTestUtils.java
│           │                   │   └── TypeTokenMatcher.java
│           │                   └── views/
│           │                       ├── AuthConfigTest.java
│           │                       ├── CustomFieldsFormViewTest.java
│           │                       └── PasswordStrengthViewTest.java
│           └── resources/
│               ├── appinfo.json
│               ├── application.json
│               ├── db_connection.json
│               ├── db_connection_with_complexity.json
│               ├── empty_object.json
│               ├── enterprise_connection.json
│               ├── invalid.json
│               ├── mockito-extensions/
│               │   └── org.mockito.plugins.MockMaker
│               ├── social_connection.json
│               └── strategy.json
├── opslevel.yml
├── proguard/
│   ├── proguard-gson.pro
│   ├── proguard-lock-2.pro
│   └── proguard-otto.pro
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
end_of_line = lf

================================================
FILE: .gitattributes
================================================
# We'll let Git's auto-detection algorithm infer if a file is text. If it is,
# enforce LF line endings regardless of OS or git configurations.
* text=auto eol=lf

# Isolate binary files in case the auto-detection algorithm fails and
# marks them as text files (which could brick them).
*.{png,jpg,jpeg,gif,webp,woff,woff2} binary

================================================
FILE: .github/CODEOWNERS
================================================
*	@auth0/project-dx-sdks-engineer-codeowner


================================================
FILE: .github/ISSUE_TEMPLATE/Bug Report.yml
================================================
name: 🐞 Report a bug
description: Have you found a bug or issue? Create a bug report for this library
labels: ["bug"]

body:
  - type: markdown
    attributes:
      value: |
        **Please do not report security vulnerabilities here**. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues.

  - type: checkboxes
    id: checklist
    attributes:
      label: Checklist
      options:
        - label: I have looked into the [Readme](https://github.com/auth0/Lock.Android#readme) and [Examples](https://github.com/auth0/Lock.Android/blob/main/EXAMPLES.md), and have not found a suitable solution or answer.
          required: true
        - label: I have looked into the [API documentation](https://javadoc.io/doc/com.auth0.android/lock/latest/index.html) and have not found a suitable solution or answer.
          required: true
        - label: I have searched the [issues](https://github.com/auth0/Lock.Android/issues) and have not found a suitable solution or answer.
          required: true
        - label: I have searched the [Auth0 Community](https://community.auth0.com) forums and have not found a suitable solution or answer.
          required: true
        - label: I agree to the terms within the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
          required: true

  - type: textarea
    id: description
    attributes:
      label: Description
      description: Provide a clear and concise description of the issue, including what you expected to happen.
    validations:
      required: true

  - type: textarea
    id: reproduction
    attributes:
      label: Reproduction
      description: Detail the steps taken to reproduce this error, and whether this issue can be reproduced consistently or if it is intermittent.
      placeholder: |
        1. Step 1...
        2. Step 2...
        3. ...
    validations:
      required: true

  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Other libraries that might be involved, or any other relevant information you think would be useful.
    validations:
      required: false

  - type: input
    id: environment-version
    attributes:
      label: Lock.Android version
    validations:
      required: true

  - type: input
    id: environment-platform-version
    attributes:
      label: Android version(s)
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/Feature Request.yml
================================================
name: 🧩 Feature request
description: Suggest an idea or a feature for this library
labels: ["feature request"]

body:
  - type: checkboxes
    id: checklist
    attributes:
      label: Checklist
      options:
        - label: I have looked into the [Readme](https://github.com/auth0/Lock.Android#readme) and [Examples](https://github.com/auth0/Lock.Android/blob/main/EXAMPLES.md), and have not found a suitable solution or answer.
          required: true
        - label: I have looked into the [API documentation](https://javadoc.io/doc/com.auth0.android/lock/latest/index.html) and have not found a suitable solution or answer.
          required: true
        - label: I have searched the [issues](https://github.com/auth0/Lock.Android/issues) and have not found a suitable solution or answer.
          required: true
        - label: I have searched the [Auth0 Community](https://community.auth0.com) forums and have not found a suitable solution or answer.
          required: true
        - label: I agree to the terms within the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
          required: true

  - type: textarea
    id: description
    attributes:
      label: Describe the problem you'd like to have solved
      description: A clear and concise description of what the problem is.
      placeholder: I'm always frustrated when...
    validations:
      required: true

  - type: textarea
    id: ideal-solution
    attributes:
      label: Describe the ideal solution
      description: A clear and concise description of what you want to happen.
    validations:
      required: true

  - type: textarea
    id: alternatives-and-workarounds
    attributes:
      label: Alternatives and current workarounds
      description: A clear and concise description of any alternatives you've considered or any workarounds that are currently in place.
    validations:
      required: false

  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Add any other context or screenshots about the feature request here.
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Auth0 Community
    url: https://community.auth0.com
    about: Discuss this SDK in the Auth0 Community forums


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### Changes

Please describe both what is changing and why this is important. Include:

- Classes and methods added, deleted, deprecated, or changed
- Screenshots of new or changed UI, if applicable
- A summary of usage if this is a new feature or change to a public API (this should also be added to relevant documentation once released)

### References

Please include relevant links supporting this change such as a:

- support ticket
- community post
- StackOverflow post
- support forum thread

Please note any links that are not publicly accessible.

### Testing

Please describe how this can be tested by reviewers. Be specific about anything not tested and reasons why. This library has unit testing, tests should be added for new logic and functionality and existing tests should complete without errors.

- [ ] This change adds unit test coverage

- [ ] This change adds integration/UI test coverage

- [ ] This change has been tested on the latest version of the platform/language or why not

### Checklist

- [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md)

- [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md)

- [ ] All existing and new tests complete without errors

- [ ] The correct base branch is being used


================================================
FILE: .github/actions/get-prerelease/action.yml
================================================
name: Return a boolean indicating if the version contains prerelease identifiers

#
# Returns a simple true/false boolean indicating whether the version indicates it's a prerelease or not.
#
# TODO: Remove once the common repo is public.
#

inputs:
  version:
    required: true

outputs:
  prerelease:
    value: ${{ steps.get_prerelease.outputs.PRERELEASE }}

runs:
  using: composite

  steps:
    - id: get_prerelease
      shell: bash
      run: |
        if [[ "${VERSION}" == *"beta"* || "${VERSION}" == *"alpha"* ]]; then
          echo "PRERELEASE=true" >> $GITHUB_OUTPUT
        else
          echo "PRERELEASE=false" >> $GITHUB_OUTPUT
        fi
      env:
        VERSION: ${{ inputs.version }}


================================================
FILE: .github/actions/get-release-notes/action.yml
================================================
name: Return the release notes extracted from the body of the PR associated with the release.

#
# Returns the release notes from the content of a pull request linked to a release branch. It expects the branch name to be in the format release/vX.Y.Z, release/X.Y.Z, release/vX.Y.Z-beta.N. etc.
#
# TODO: Remove once the common repo is public.
#
inputs:
  version:
    required: true
  repo_name:
    required: false
  repo_owner:
    required: true
  token:
    required: true

outputs:
  release-notes:
    value: ${{ steps.get_release_notes.outputs.RELEASE_NOTES }}

runs:
  using: composite

  steps:
    - uses: actions/github-script@v7
      id: get_release_notes
      with:
        result-encoding: string
        script: |
          const { data: pulls } = await github.rest.pulls.list({
            owner: process.env.REPO_OWNER,
            repo: process.env.REPO_NAME,
            state: 'all',
            head: `${process.env.REPO_OWNER}:release/${process.env.VERSION}`,
          });
          core.setOutput('RELEASE_NOTES', pulls[0].body);
      env:
        GITHUB_TOKEN: ${{ inputs.token }}
        REPO_OWNER: ${{ inputs.repo_owner }}
        REPO_NAME: ${{ inputs.repo_name }}
        VERSION: ${{ inputs.version }}


================================================
FILE: .github/actions/get-version/action.yml
================================================
name: Return the version extracted from the branch name

#
# Returns the version from the .version file.
#
# TODO: Remove once the common repo is public.
#

outputs:
  version:
    value: ${{ steps.get_version.outputs.VERSION }}

runs:
  using: composite

  steps:
    - id: get_version
      shell: bash
      run: |
        VERSION=$(head -1 .version)
        echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT


================================================
FILE: .github/actions/maven-publish/action.yml
================================================
name: Publish release to Java

inputs:
  ossr-username:
    required: true
  ossr-password:
    required: true
  signing-key:
    required: true
  signing-password:
    required: true
  java-version:
    required: true
  is-android:
    required: true
  version:
    required: true

runs:
  using: composite

  steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Java
      shell: bash
      run: |
        curl -s "https://get.sdkman.io" | bash
        source "/home/runner/.sdkman/bin/sdkman-init.sh"
        sdk list java
        sdk install java "$JAVA_VERSION" && sdk default java "$JAVA_VERSION"
      env:
        JAVA_VERSION: ${{ inputs.java-version }}

    - uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4 # pin@1.1.0

    - name: Publish Java
      shell: bash
      if: inputs.is-android == 'false'
      run: ./gradlew clean assemble sign publishMavenJavaPublicationToMavenRepository -PisSnapshot=false -Pversion="$VERSION" -PossrhUsername="$OSSR_USERNAME" -PossrhPassword="$OSSR_PASSWORD" -PsigningKey="$SIGNING_KEY" -PsigningPassword="$SIGNING_PASSWORD"
      env:
        VERSION: ${{ inputs.version }}
        OSSR_USERNAME: ${{ inputs.ossr-username }}
        OSSR_PASSWORD: ${{ inputs.ossr-password }}
        SIGNING_KEY: ${{ inputs.signing-key }}
        SIGNING_PASSWORD: ${{ inputs.signing-password }}

    - name: Publish Android
      shell: bash
      if: inputs.is-android == 'true'
      run: ./gradlew clean assemble sign publishAndroidLibraryPublicationToMavenRepository -PisSnapshot=false -Pversion="$VERSION" -PossrhUsername="$OSSR_USERNAME" -PossrhPassword="$OSSR_PASSWORD" -PsigningKey="$SIGNING_KEY" -PsigningPassword="$SIGNING_PASSWORD"
      env:
        VERSION: ${{ inputs.version }}
        OSSR_USERNAME: ${{ inputs.ossr-username }}
        OSSR_PASSWORD: ${{ inputs.ossr-password }}
        SIGNING_KEY: ${{ inputs.signing-key }}
        SIGNING_PASSWORD: ${{ inputs.signing-password }}


================================================
FILE: .github/actions/release-create/action.yml
================================================
name: Create a GitHub release

#
# Creates a GitHub release with the given version.
#
# TODO: Remove once the common repo is public.
#

inputs:
  token:
    required: true
  files:
    required: false
  name:
    required: true
  body:
    required: true
  tag:
    required: true
  commit:
    required: true
  draft:
    default: false
    required: false
  prerelease:
    default: false
    required: false
  fail_on_unmatched_files:
    default: true
    required: false

runs:
  using: composite

  steps:
    - uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844
      with:
        body: ${{ inputs.body }}
        name: ${{ inputs.name }}
        tag_name: ${{ inputs.tag }}
        target_commitish: ${{ inputs.commit }}
        draft: ${{ inputs.draft }}
        prerelease: ${{ inputs.prerelease }}
        fail_on_unmatched_files: ${{ inputs.fail_on_unmatched_files }}
        files: ${{ inputs.files }}
      env:
        GITHUB_TOKEN: ${{ inputs.token }}


================================================
FILE: .github/actions/setup/action.yml
================================================
name: Configure CI
description: Performs the initial configuration of the CI environment

inputs:
  java:
    description: The Java version to use
    required: false
    default: '11'

runs:
  using: composite

  steps:
    - name: Set up JDK
      uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # pin@4.8.0
      env:
        JAVA_VERSION : ${{ inputs.java }}
      with:
        java-version: ${{ env.JAVA_VERSION }}
        distribution: 'temurin'

    - uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4 # pin@1.1.0

    - name: Setup Gradle
      uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # pin@4.4.4

    - run: ./gradlew androidDependencies
      shell: bash


================================================
FILE: .github/actions/tag-exists/action.yml
================================================
name: Return a boolean indicating if a tag already exists for the repository

#
# Returns a simple true/false boolean indicating whether the tag exists or not.
#
# TODO: Remove once the common repo is public.
#

inputs:
  token:
    required: true
  tag:
    required: true

outputs:
  exists:
    description: 'Whether the tag exists or not'
    value: ${{ steps.tag-exists.outputs.EXISTS }}

runs:
  using: composite

  steps:
    - id: tag-exists
      shell: bash
      run: |
        GET_API_URL="https://api.github.com/repos/${GITHUB_REPOSITORY}/git/ref/tags/${TAG_NAME}"
        http_status_code=$(curl -LI $GET_API_URL -o /dev/null -w '%{http_code}\n' -s -H "Authorization: token ${GITHUB_TOKEN}")
        if [ "$http_status_code" -ne "404" ] ; then
          echo "EXISTS=true" >> $GITHUB_OUTPUT
        else
          echo "EXISTS=false" >> $GITHUB_OUTPUT
        fi
      env:
        TAG_NAME: ${{ inputs.tag }}
        GITHUB_TOKEN: ${{ inputs.token }}


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'weekly'


================================================
FILE: .github/stale.yml
================================================
# Configuration for probot-stale - https://github.com/probot/stale

# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 90

# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
daysUntilClose: 7

# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels: []

# Set to true to ignore issues with an assignee (defaults to false)
exemptAssignees: true

# Label to use when marking as stale
staleLabel: closed:stale

# Comment to post when marking as stale. Set to `false` to disable
markComment: >
  This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If you have not received a response for our team (apologies for the delay) and this is still a blocker, please reply with additional information or just a ping. Thank you for your contribution! 🙇‍♂️

================================================
FILE: .github/workflows/codeql.yml
================================================
name: CodeQL

on:
  merge_group:
  pull_request:
    types:
      - opened
      - synchronize
  push:
    branches:
      - main
  schedule:
    - cron: "37 10 * * 2"

permissions:
  actions: read
  contents: read
  security-events: write

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
  analyze:
    name: Check for Vulnerabilities
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        language: [java]

    steps:
      - if: github.actor == 'dependabot[bot]' || github.event_name == 'merge_group'
        run: exit 0 # Skip unnecessary test runs for dependabot and merge queues. Artifically flag as successful, as this is a required check for branch protection.

      - name: Checkout
        uses: actions/checkout@v6

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: ${{ matrix.language }}
          queries: +security-and-quality

      - name: Autobuild
        uses: github/codeql-action/autobuild@v4

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:${{ matrix.language }}"


================================================
FILE: .github/workflows/java-release.yml
================================================
name: Create Java and GitHub Release

on:
  workflow_call:
    inputs:
      java-version:
        required: true
        type: string
      is-android:
        required: true
        type: string
    secrets:
      ossr-username:
        required: true
      ossr-password:
        required: true
      signing-key:
        required: true
      signing-password:
        required: true
      github-token:
        required: true

### TODO: Replace instances of './.github/actions/' w/ `auth0/dx-sdk-actions/` and append `@latest` after the common `dx-sdk-actions` repo is made public.
### TODO: Also remove `get-prerelease`, `get-version`, `release-create`, `tag-create` and `tag-exists` actions from this repo's .github/actions folder once the repo is public.

jobs:
  release:
    if: github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.merged && startsWith(github.event.pull_request.head.ref, 'release/'))
    runs-on: ubuntu-latest
    environment: release

    steps:
      # Checkout the code
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      # Get the version from the branch name
      - id: get_version
        uses: ./.github/actions/get-version

      # Get the prerelease flag from the branch name
      - id: get_prerelease
        uses: ./.github/actions/get-prerelease
        with:
          version: ${{ steps.get_version.outputs.version }}

      # Get the release notes
      - id: get_release_notes
        uses: ./.github/actions/get-release-notes
        with:
          token: ${{ secrets.github-token }}
          version: ${{ steps.get_version.outputs.version }}
          repo_owner: ${{ github.repository_owner }}
          repo_name: ${{ github.event.repository.name }}

      # Check if the tag already exists
      - id: tag_exists
        uses: ./.github/actions/tag-exists
        with:
          tag: ${{ steps.get_version.outputs.version }}
          token: ${{ secrets.github-token }}

      # If the tag already exists, exit with an error
      - if: steps.tag_exists.outputs.exists == 'true'
        run: exit 1

      # Publish the release to Maven
      - uses: ./.github/actions/maven-publish
        with:
          java-version: ${{ inputs.java-version }}
          is-android: ${{ inputs.is-android }}
          version: ${{ steps.get_version.outputs.version }}
          ossr-username: ${{ secrets.ossr-username }}
          ossr-password: ${{ secrets.ossr-password }}
          signing-key: ${{ secrets.signing-key }}
          signing-password: ${{ secrets.signing-password }}

      # Create a release for the tag
      - uses: ./.github/actions/release-create
        with:
          token: ${{ secrets.github-token }}
          name: ${{ steps.get_version.outputs.version }}
          body: ${{ steps.get_release_notes.outputs.release-notes }}
          tag: ${{ steps.get_version.outputs.version }}
          commit: ${{ github.sha }}
          prerelease: ${{ steps.get_prerelease.outputs.prerelease }}


================================================
FILE: .github/workflows/release.yml
================================================
name: Create GitHub Release

on:
  pull_request:
    types:
      - closed
  workflow_dispatch:

permissions:
  contents: write

### TODO: Replace instances of './.github/workflows/' w/ `auth0/dx-sdk-actions/workflows/` and append `@latest` after the common `dx-sdk-actions` repo is made public.
### TODO: Also remove `get-prerelease`, `get-release-notes`, `get-version`, `maven-publish`, `release-create`, and `tag-exists` actions from this repo's .github/actions folder once the repo is public.
### TODO: Also remove `java-release` workflow from this repo's .github/workflows folder once the repo is public.

jobs:
  release:
    uses: ./.github/workflows/java-release.yml
    with:
      java-version: 8.0.382-tem
      is-android: true
    secrets:
      ossr-username: ${{ secrets.OSSR_USERNAME }}
      ossr-password: ${{ secrets.OSSR_PASSWORD }}
      signing-key: ${{ secrets.SIGNING_KEY }}
      signing-password: ${{ secrets.SIGNING_PASSWORD }}
      github-token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/sca_scan.yml
================================================
name: SCA

on:
  push:
    branches: ["master", "main"]

jobs:
  snyk-cli:
    uses: auth0/devsecops-tooling/.github/workflows/sca-scan.yml@main
    secrets: inherit

================================================
FILE: .github/workflows/test.yml
================================================
name: Build and Test

on:
  merge_group:
  workflow_dispatch:
  pull_request:
    branches:
      - main
  push:
    branches:
      - main

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
  unit:
    name: Run Unit Tests
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - uses: ./.github/actions/setup

      - run: ./gradlew clean test lint --continue --console=plain --max-workers=3

      - uses: codecov/codecov-action@1af58845a975a7985b0beb0cbe6fbbb71a41dbad # pin@5.5.3


================================================
FILE: .gitignore
================================================
# Created by https://www.gitignore.io/api/intellij,android,osx,windows

### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm

*.iml

## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:

# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# .idea/shelf

# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml

# Gradle:
# .idea/gradle.xml
# .idea/libraries

# Mongo Explorer plugin:
# .idea/mongoSettings.xml

## File-based project format:
*.ipr
*.iws

## Plugin-specific files:

# IntelliJ
/out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties


### Android ###
# Built application files
*.apk
*.ap_

# Files for the Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

### Android Patch ###
gen-external-apklibs


### OSX ###
.DS_Store

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes


================================================
FILE: .shiprc
================================================
{
  "files": {
    "auth0/build.gradle": [],
    ".version": [],
    "README.md": []
  },
  "prefixVersion": false
}


================================================
FILE: .version
================================================
3.2.2

================================================
FILE: CHANGELOG.md
================================================
# Change Log

## [3.2.1](https://github.com/auth0/Lock.Android/tree/3.2.2) (2023-01-11)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/3.2.1...3.2.2)

This patch release does not contain any functional changes, but is being released using an updated signing key for verification as part of our commitment to best security practices.
Please review [the README note for additional details.](https://github.com/auth0/Lock.Android/blob/main/README.md)

**Security**
- Bump Auth0.Android dependency to 2.8.1 [\#652](https://github.com/auth0/Lock.Android/pull/652) ([poovamraj](https://github.com/poovamraj))

## [3.2.1](https://github.com/auth0/Lock.Android/tree/3.2.1) (2022-06-24)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/3.2.0...3.2.1)

**Fixed**
- Fixing bug where custom audience was not being set in [\#645](https://github.com/auth0/Lock.Android/pull/645) ([Blake-Carrier](https://github.com/Blake-Carrier))

**Security**
- Bump GSON dependency to 2.8.9 [\#639](https://github.com/auth0/Lock.Android/pull/639) ([evansims](https://github.com/evansims))

## [3.2.0](https://github.com/auth0/Lock.Android/tree/3.2.0) (2021-10-11)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/3.1.0...3.2.0)

**Changed**
- update dependencies and sdk [\#636](https://github.com/auth0/Lock.Android/pull/636) ([lbalmaceda](https://github.com/lbalmaceda))

## [3.1.0](https://github.com/auth0/Lock.Android/tree/3.1.0) (2021-07-20)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/3.0.0...3.1.0)

**Added**
- Add support for OOB multi-factor authentication [\#632](https://github.com/auth0/Lock.Android/pull/632) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**
- Update AndroidManifest.xml for Android 12 support [\#631](https://github.com/auth0/Lock.Android/pull/631) ([VincentJoshuaET](https://github.com/VincentJoshuaET))

## [3.0.1](https://github.com/auth0/Lock.Android/tree/3.0.1) (2021-05-27)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/3.0.0...3.0.1)

**Fixed**
- Trim username and email input to avoid NPE [\#628](https://github.com/auth0/Lock.Android/pull/628) ([lbalmaceda](https://github.com/lbalmaceda))

## [3.0.0](https://github.com/auth0/Lock.Android/tree/3.0.0) (2021-05-04)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.23.0...3.0.0)
**Closed issues**
- AuthenticationCallback methods are only called the first time I login [\#607](https://github.com/auth0/Lock.Android/issues/607)
- UnauthorizedErrors are not received in lock widget callbacks [\#606](https://github.com/auth0/Lock.Android/issues/606)

**Added**
- Add migration guide [SDK-2430] [\#615](https://github.com/auth0/Lock.Android/pull/615) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**
- Drop Jetifier plugin usage [\#624](https://github.com/auth0/Lock.Android/pull/624) ([lbalmaceda](https://github.com/lbalmaceda))
- Enable AppLinks in the declared intent filters [\#622](https://github.com/auth0/Lock.Android/pull/622) ([lbalmaceda](https://github.com/lbalmaceda))
- Simplify library set up by declaring activities internally [\#620](https://github.com/auth0/Lock.Android/pull/620) ([lbalmaceda](https://github.com/lbalmaceda))
- Refactor broadcast receiver usage [\#619](https://github.com/auth0/Lock.Android/pull/619) ([lbalmaceda](https://github.com/lbalmaceda))
- Raise Unauthorized and Access Denied errors through callback [SDK-2480] [\#618](https://github.com/auth0/Lock.Android/pull/618) ([lbalmaceda](https://github.com/lbalmaceda))
- Update readme [\#617](https://github.com/auth0/Lock.Android/pull/617) ([lbalmaceda](https://github.com/lbalmaceda))
- Migrate sample app to use Kotlin [SDK-2431] [\#616](https://github.com/auth0/Lock.Android/pull/616) ([lbalmaceda](https://github.com/lbalmaceda))

**Removed**
- Remove support for changing the Social Button style  [SDK-2430] [\#614](https://github.com/auth0/Lock.Android/pull/614) ([lbalmaceda](https://github.com/lbalmaceda))
- Remove support for Implicit Authentication flow [SDK-2430] [\#613](https://github.com/auth0/Lock.Android/pull/613) ([lbalmaceda](https://github.com/lbalmaceda))
- Remove WebView component support [SDK-2430] [\#612](https://github.com/auth0/Lock.Android/pull/612) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**
- Fix filtering by Country name [SDK-2546] [\#623](https://github.com/auth0/Lock.Android/pull/623) ([lbalmaceda](https://github.com/lbalmaceda))
- Run lint and fix inspection results [\#611](https://github.com/auth0/Lock.Android/pull/611) ([lbalmaceda](https://github.com/lbalmaceda))

**Breaking changes**
- Update LockCallback and AuthenticationCallback [SDK-2480] [\#621](https://github.com/auth0/Lock.Android/pull/621) ([lbalmaceda](https://github.com/lbalmaceda))
- Use Auth0.Android v2 [SDK-2429] [\#610](https://github.com/auth0/Lock.Android/pull/610) ([lbalmaceda](https://github.com/lbalmaceda))
- Migrate to AndroidX [\#609](https://github.com/auth0/Lock.Android/pull/609) ([lbalmaceda](https://github.com/lbalmaceda))
- Bump the minimum required android version [SDK-2427] [\#608](https://github.com/auth0/Lock.Android/pull/608) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.23.0](https://github.com/auth0/Lock.Android/tree/2.23.0) (2020-09-14)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.22.0...2.23.0)

**Having project sync issues after upgrading?**
This release updates the core SDK to make it compatible with Android 11 new privacy changes. If you run into a build compile issue when importing this version, make sure that you are using the latest patch version of the Android Gradle Plugin. Check the table in the [announcement blogpost](https://android-developers.googleblog.com/2020/07/preparing-your-build-for-package-visibility-in-android-11.html) to learn to what version you should update.

**Changed**
- Improve compatibility with Kotlin and run Lint on CI [\#596](https://github.com/auth0/Lock.Android/pull/596) ([lbalmaceda](https://github.com/lbalmaceda))
- Add compatibility with Android 11: Bump SDK version [\#595](https://github.com/auth0/Lock.Android/pull/595) ([lbalmaceda](https://github.com/lbalmaceda))
- Update "37 Signals" auth style to "Basecamp" [SDK-1944] [\#593](https://github.com/auth0/Lock.Android/pull/593) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.22.0](https://github.com/auth0/Lock.Android/tree/2.22.0) (2020-08-25)
[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.21.1...2.22.0)

**Added**
- Support bot protection [\#589](https://github.com/auth0/Lock.Android/pull/589) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.21.1](https://github.com/auth0/Lock.Android/tree/2.21.1) (2020-08-05)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.21.0...2.21.1)

**Fixed**

- Use latest SDK patch [\#587](https://github.com/auth0/Lock.Android/pull/587) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.21.0](https://github.com/auth0/Lock.Android/tree/2.21.0) (2020-07-20)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.20.0...2.21.0)

### Read if using the SecureCredentialsManager
Starting from this version, the alias used to store the key pair in the Android Keystore is prefixed to avoid collisions between other Auth0 enabled apps. Your users will be facing a "credentials not found" scenario, requiring them to log in again **once**. Double check that you are not ignoring the errors being returned in the callback and documented [here](https://github.com/auth0/Auth0.Android#handling-exceptions).

**Changed**

- Bump SDK to version 1.24.0 [\#583](https://github.com/auth0/Lock.Android/pull/583) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Bugfix #581 | Fix social login buttons with white backgrounds [\#582](https://github.com/auth0/Lock.Android/pull/582) ([morganlutz](https://github.com/morganlutz))

## [2.20.0](https://github.com/auth0/Lock.Android/tree/2.20.0) (2020-05-26)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.19.0...2.20.0)

**Added**

- Allow to change the visible sign-up fields threshold [\#578](https://github.com/auth0/Lock.Android/pull/578) ([lbalmaceda](https://github.com/lbalmaceda))
- Add social button style for Sign In with Apple [\#575](https://github.com/auth0/Lock.Android/pull/575) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fix ModeSelectionView sync issue [\#577](https://github.com/auth0/Lock.Android/pull/577) ([lbalmaceda](https://github.com/lbalmaceda))
- Center Custom Fields additional form vertically [\#576](https://github.com/auth0/Lock.Android/pull/576) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.19.0](https://github.com/auth0/Lock.Android/tree/2.19.0) (2020-04-29)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.18.0...2.19.0)

**Changed**

- Bump the SDK version to 1.23.0 [\#570](https://github.com/auth0/Lock.Android/pull/570) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fixed material library 1.1.0 tab layout height issue [\#568](https://github.com/auth0/Lock.Android/pull/568) ([ivabra](https://github.com/ivabra))

## [2.18.0](https://github.com/auth0/Lock.Android/tree/2.18.0) (2020-03-04)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.17.1...2.18.0)

**Changed**

- Update Social Button style [\#563](https://github.com/auth0/Lock.Android/pull/563) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.17.1](https://github.com/auth0/Lock.Android/tree/2.17.1) (2020-01-10)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.17.0...2.17.1)

**Fixed**

- Bump SDK version and OSS plugin version [\#560](https://github.com/auth0/Lock.Android/pull/560) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.17.0](https://github.com/auth0/Lock.Android/tree/2.17.0) (2019-12-26)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.16.0...2.17.0)

**Added**

- Improve OIDC Compliance and support new Passwordless [\#558](https://github.com/auth0/Lock.Android/pull/558) ([lbalmaceda](https://github.com/lbalmaceda))

**Security**

- Improve OIDC Compliance and support new Passwordless [\#558](https://github.com/auth0/Lock.Android/pull/558) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.16.0](https://github.com/auth0/Lock.Android/tree/2.16.0) (2019-10-24)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.15.0...2.16.0)

**Added**

- Add hidden extra sign up fields [\#552](https://github.com/auth0/Lock.Android/pull/552) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.15.0](https://github.com/auth0/Lock.Android/tree/2.15.0) (2019-07-26)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.14.1...2.15.0)

**Added**

- Add Root Attributes on sign up or user creation [\#543](https://github.com/auth0/Lock.Android/pull/543) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Update username regex to allow special chars [\#544](https://github.com/auth0/Lock.Android/pull/544) ([lbalmaceda](https://github.com/lbalmaceda))
- Use latest Android Gradle plugin version [\#542](https://github.com/auth0/Lock.Android/pull/542) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fix typo in password reset string [\#541](https://github.com/auth0/Lock.Android/pull/541) ([horsejockey](https://github.com/horsejockey))
- Avoid registering multiple broadcast receiver instances [\#539](https://github.com/auth0/Lock.Android/pull/539) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.14.1](https://github.com/auth0/Lock.Android/tree/2.14.1) (2019-06-06)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.14.0...2.14.1)

**Fixed**

- Remove entirely the small social button style [\#537](https://github.com/auth0/Lock.Android/pull/537) ([lbalmaceda](https://github.com/lbalmaceda))
- Define custom email regex to validate emails [\#534](https://github.com/auth0/Lock.Android/pull/534) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.14.0](https://github.com/auth0/Lock.Android/tree/2.14.0) (2019-04-30)

From this release on, the option to display social connections in small styled buttons is no longer available due to branding compliance reasons. All the social connections will now be displayed as large styled buttons.
[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.13.0...2.14.0)

**Changed**

- Remove "Small" social button style [\#529](https://github.com/auth0/Lock.Android/pull/529) ([lbalmaceda](https://github.com/lbalmaceda))
- Update google-oauth2 strategy logo [\#528](https://github.com/auth0/Lock.Android/pull/528) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.13.0](https://github.com/auth0/Lock.Android/tree/2.13.0) (2019-04-17)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.12.1...2.13.0)

**Changed**

- Use auth0.android 1.15.2 [\#526](https://github.com/auth0/Lock.Android/pull/526) ([lbalmaceda](https://github.com/lbalmaceda))
- Update facebook icon to comply with new branding [\#525](https://github.com/auth0/Lock.Android/pull/525) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.12.1](https://github.com/auth0/Lock.Android/tree/2.12.1) (2019-02-22)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.12.0...2.12.1)

**Fixed**

- Parse 'password_leaked' error message [\#522](https://github.com/auth0/Lock.Android/pull/522) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.12.0](https://github.com/auth0/Lock.Android/tree/2.12.0) (2019-01-30)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.11.0...2.12.0)

**Changed**

- Use latest Auth0.Android SDK [\#520](https://github.com/auth0/Lock.Android/pull/520) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.11.1](https://github.com/auth0/Lock.Android/tree/2.11.1) (2018-10-16)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.11.0...2.11.1)

**Fixed**

- Handle Tab change manually on ModeSelectionView [\#499](https://github.com/auth0/Lock.Android/pull/499) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.11.0](https://github.com/auth0/Lock.Android/tree/2.11.0) (2018-10-05)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.10.0...2.11.0)

**Added**

- Added showTerms feature flag [\#487](https://github.com/auth0/Lock.Android/pull/487) ([cocojoe](https://github.com/cocojoe))

**Fixed**

- Use target SDK 28 and latest Auth0 SDK version [\#484](https://github.com/auth0/Lock.Android/pull/484) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.10.0](https://github.com/auth0/Lock.Android/tree/2.10.0) (2018-09-14)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.9.0...2.10.0)

**Added**

- Allow to override the password minimum length [\#474](https://github.com/auth0/Lock.Android/pull/474) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.9.0](https://github.com/auth0/Lock.Android/tree/2.9.0) (2018-07-25)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.6...2.9.0)

**Added**

- Allow to disable 'ActiveAuth' on enterprise Connections [\#471](https://github.com/auth0/Lock.Android/pull/471) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.6](https://github.com/auth0/Lock.Android/tree/2.8.6) (2018-07-20)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.5...2.8.6)

**Fixed**

- Fix CustomTabsController issues [\#469](https://github.com/auth0/Lock.Android/pull/469) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.5](https://github.com/auth0/Lock.Android/tree/2.8.5) (2018-07-19)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.4...2.8.5)

**Fixed**

- Enable MFA support for OIDC conformant clients [\#451](https://github.com/auth0/Lock.Android/pull/451) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.4](https://github.com/auth0/Lock.Android/tree/2.8.4) (2018-07-13)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.3...2.8.4)

**Fixed**

- Fix WebAuth issues by updating SDK to 1.13.1 [\#465](https://github.com/auth0/Lock.Android/pull/465) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.3](https://github.com/auth0/Lock.Android/tree/2.8.3) (2018-03-19)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.2...2.8.3)

**Fixed**

- Disable HTTP 2 protocol [\#458](https://github.com/auth0/Lock.Android/pull/458) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.2](https://github.com/auth0/Lock.Android/tree/2.8.2) (2018-02-26)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.1...2.8.2)

**Fixed**

- Draw background and borders on programmatically created fields [\#455](https://github.com/auth0/Lock.Android/pull/455) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.1](https://github.com/auth0/Lock.Android/tree/2.8.1) (2018-02-21)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.8.0...2.8.1)

**Changed**

- Bump SDK version to 1.12.1 [\#452](https://github.com/auth0/Lock.Android/pull/452) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.8.0](https://github.com/auth0/Lock.Android/tree/2.8.0) (2017-10-19)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.7.0...2.8.0)
**Closed issues**

- Cannot navigate social login buttons using gamepad on Android TV [\#443](https://github.com/auth0/Lock.Android/issues/443)

**Added**

- Add RTL support [\#445](https://github.com/auth0/Lock.Android/pull/445) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fix ValidatedInputView border color on focus change [\#446](https://github.com/auth0/Lock.Android/pull/446) ([lbalmaceda](https://github.com/lbalmaceda))
- Fix non touchscreen navigation [\#444](https://github.com/auth0/Lock.Android/pull/444) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.7.0](https://github.com/auth0/Lock.Android/tree/2.7.0) (2017-07-19)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.6.0...2.7.0)

**Changed**

- Update lib version to use auth0Scheme placeholder [\#431](https://github.com/auth0/Lock.Android/pull/431) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.6.0](https://github.com/auth0/Lock.Android/tree/2.6.0) (2017-07-12)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.5.0...2.6.0)
**Closed issues**

- NullPointerException in onResume for certain devices [\#415](https://github.com/auth0/Lock.Android/issues/415)

**Added**

- Add Password Toggle enabler/disabler [\#423](https://github.com/auth0/Lock.Android/pull/423) ([lbalmaceda](https://github.com/lbalmaceda))
- Add Hosted Login Page button to the demo. [\#422](https://github.com/auth0/Lock.Android/pull/422) ([lbalmaceda](https://github.com/lbalmaceda))
- Add "show password" button for Password fields. [\#421](https://github.com/auth0/Lock.Android/pull/421) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Change activity to context in Lock initialization [\#416](https://github.com/auth0/Lock.Android/pull/416) ([skrabacz-michal](https://github.com/skrabacz-michal))

**Fixed**

- Fix NPE when enabling or disabling Lock interaction [\#420](https://github.com/auth0/Lock.Android/pull/420) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.5.0](https://github.com/auth0/Lock.Android/tree/2.5.0) (2017-04-27)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.4.0...2.5.0)

**Added**

- Add paypal-sandbox support [\#412](https://github.com/auth0/Lock.Android/pull/412) ([ziluvatar](https://github.com/ziluvatar))
- Send login_hint on enterprise web auth when username/email is available [\#410](https://github.com/auth0/Lock.Android/pull/410) ([lbalmaceda](https://github.com/lbalmaceda))
- Add screens for Lock loading errors [\#407](https://github.com/auth0/Lock.Android/pull/407) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Allow to customize the capitalization of messages [\#408](https://github.com/auth0/Lock.Android/pull/408) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.4.0](https://github.com/auth0/Lock.Android/tree/2.4.0) (2017-03-06)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.3.0...2.4.0)
**Closed issues**

- LockBuilder withScope method not working. [\#397](https://github.com/auth0/Lock.Android/issues/397)

**Added**

- Add Passwordless auto login [\#392](https://github.com/auth0/Lock.Android/pull/392) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Update auth0.android library to version 1.6.0 [\#400](https://github.com/auth0/Lock.Android/pull/400) ([lbalmaceda](https://github.com/lbalmaceda))
- Remove "invalid client type" user message [\#391](https://github.com/auth0/Lock.Android/pull/391) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fix setScope to properly send the scope attribute on Auth [\#399](https://github.com/auth0/Lock.Android/pull/399) ([lbalmaceda](https://github.com/lbalmaceda))
- Add loggingEnabled flag to the Auth0 parcel [\#398](https://github.com/auth0/Lock.Android/pull/398) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.3.0](https://github.com/auth0/Lock.Android/tree/2.3.0) (2017-01-02)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.2.1...2.3.0)

**Added**

- Send custom audience on login/signIn if is OIDC conformant [\#387](https://github.com/auth0/Lock.Android/pull/387) ([lbalmaceda](https://github.com/lbalmaceda))
- Include updated Proguard rules in the packaged aar [\#385](https://github.com/auth0/Lock.Android/pull/385) ([lbalmaceda](https://github.com/lbalmaceda))
- Support custom audience for Web Authentication [\#383](https://github.com/auth0/Lock.Android/pull/383) ([lbalmaceda](https://github.com/lbalmaceda))
- Support custom schemes for Web Authentication [\#382](https://github.com/auth0/Lock.Android/pull/382) ([lbalmaceda](https://github.com/lbalmaceda))
- Add option to hide Header Title on the Main screen [\#381](https://github.com/auth0/Lock.Android/pull/381) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Update gradle plugins and google dependencies [\#389](https://github.com/auth0/Lock.Android/pull/389) ([hzalaz](https://github.com/hzalaz))
- Use Header style and fix Submit button height when label is displayed [\#388](https://github.com/auth0/Lock.Android/pull/388) ([lbalmaceda](https://github.com/lbalmaceda))

**Deprecated**

- Deprecate useImplicitGrant method [\#372](https://github.com/auth0/Lock.Android/pull/372) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fix Auth0 parcel that was losing telemetry and OIDC flag [\#384](https://github.com/auth0/Lock.Android/pull/384) ([lbalmaceda](https://github.com/lbalmaceda))
- Fix wrong label setting if login was disabled and pwd reset was first screen [\#380](https://github.com/auth0/Lock.Android/pull/380) ([lbalmaceda](https://github.com/lbalmaceda))
- Don't return to login/signup screen after pwd reset if those screens are disabled [\#379](https://github.com/auth0/Lock.Android/pull/379) ([lbalmaceda](https://github.com/lbalmaceda))
- Add authentication parameters to custom AuthProvider [\#375](https://github.com/auth0/Lock.Android/pull/375) ([lbalmaceda](https://github.com/lbalmaceda))
- Avoid sending authentication parameters on password-reset [\#373](https://github.com/auth0/Lock.Android/pull/373) ([lbalmaceda](https://github.com/lbalmaceda))

**Breaking changes**

- Use labeled submit button by default and separate signUp/logIn strings [\#386](https://github.com/auth0/Lock.Android/pull/386) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.2.1](https://github.com/auth0/Lock.Android/tree/2.2.1) (2016-11-22)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.2.0...2.2.1)

**Changed**

- Update auth0.android to fix scope issue [\#370](https://github.com/auth0/Lock.Android/pull/370) ([hzalaz](https://github.com/hzalaz))

## [2.2.0](https://github.com/auth0/Lock.Android/tree/2.2.0) (2016-11-21)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.1.1...2.2.0)

**Added**

- Allow to set a custom scope. [\#368](https://github.com/auth0/Lock.Android/pull/368) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Update to auth0.android 1.1.1 [\#369](https://github.com/auth0/Lock.Android/pull/369) ([hzalaz](https://github.com/hzalaz))

## [2.1.1](https://github.com/auth0/Lock.Android/tree/2.1.1) (2016-11-02)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.1.0...2.1.1)

**Fixed**

- Fix NPE when connection scope is missing [\#365](https://github.com/auth0/Lock.Android/pull/365) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.1.0](https://github.com/auth0/Lock.Android/tree/2.1.0) (2016-10-24)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.0.0...2.1.0)

**Added**

- Support connection_scope for OAuth Connections [\#361](https://github.com/auth0/Lock.Android/pull/361) ([lbalmaceda](https://github.com/lbalmaceda))
- Send LockException if the Theme is invalid [\#358](https://github.com/auth0/Lock.Android/pull/358) ([lbalmaceda](https://github.com/lbalmaceda))
- Add labeled submit button option [\#352](https://github.com/auth0/Lock.Android/pull/352) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Non-empty username validation for custom/imported connections [\#360](https://github.com/auth0/Lock.Android/pull/360) ([lbalmaceda](https://github.com/lbalmaceda))
- Fix Theme load from styles.xml [\#357](https://github.com/auth0/Lock.Android/pull/357) ([lbalmaceda](https://github.com/lbalmaceda))

**Breaking changes**

- Use browser by default when using WebAuthProvider. [\#355](https://github.com/auth0/Lock.Android/pull/355) ([lbalmaceda](https://github.com/lbalmaceda))

Since Google will be [blocking webview OAuth request](https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html) we switched the default authentication flow for all social connections from WebView to Browser.
Browser authentication requires a little more configuration in your `AndroidManifest.xml` file.
First make sure `LockActivity` has `singleTask` in `android:launchMode` and then add to it an `intent-filter`:

```xml
<intent-filter>
  <action android:name="android.intent.action.VIEW" />

  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />

  <data
    android:host="{YOUR_AUTH0_DOMAIN}"
    android:pathPrefix="/android/{YOUR_APP_PACKAGE_NAME}/callback"
    android:scheme="https" />
</intent-filter>
```

## [2.0.0](https://github.com/auth0/Lock.Android/tree/2.0.0) (2016-09-21)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.0.0-beta.4...2.0.0)

**Changed**

- Merge Enterprise and Social login events [\#347](https://github.com/auth0/Lock.Android/pull/347) ([lbalmaceda](https://github.com/lbalmaceda))
- Show button when only one enterprise connection is available [\#341](https://github.com/auth0/Lock.Android/pull/341) ([lbalmaceda](https://github.com/lbalmaceda))
- Filter social strategies by connection name [\#340](https://github.com/auth0/Lock.Android/pull/340) ([lbalmaceda](https://github.com/lbalmaceda))
- Flatten Strategies into Connections [\#335](https://github.com/auth0/Lock.Android/pull/335) ([lbalmaceda](https://github.com/lbalmaceda))

**Fixed**

- Fix OAuth connection callback for PasswordlessActivity [\#346](https://github.com/auth0/Lock.Android/pull/346) ([lbalmaceda](https://github.com/lbalmaceda))
- Fix non ro-enabled enterprise connections flow. [\#344](https://github.com/auth0/Lock.Android/pull/344) ([lbalmaceda](https://github.com/lbalmaceda))
- Fix wrong telemetry version [\#342](https://github.com/auth0/Lock.Android/pull/342) ([lbalmaceda](https://github.com/lbalmaceda))

**Breaking changes**

- [Breaking Change] Rename builder methods [\#350](https://github.com/auth0/Lock.Android/pull/350) ([lbalmaceda](https://github.com/lbalmaceda))
- Refactor AuthProviderResolver [Breaking Change][\#333](https://github.com/auth0/Lock.Android/pull/333) ([lbalmaceda](https://github.com/lbalmaceda))

## [2.0.0-beta.4](https://github.com/auth0/Lock.Android/tree/2.0.0-beta.4) (2016-08-24)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.0.0-beta.3...2.0.0-beta.4)

**Closed issues**

- Lock SSO Username Fails Validation [\#332](https://github.com/auth0/Lock.Android/issues/332)

**Fixed**

- Change username validation for SSO connections [\#334](https://github.com/auth0/Lock.Android/pull/334) ([lbalmaceda](https://github.com/lbalmaceda))
- Check that requested tokens are present on the result. [\#330](https://github.com/auth0/Lock.Android/pull/330) ([lbalmaceda](https://github.com/lbalmaceda))
- Use first available connection name when authenticating with OAuth [\#320](https://github.com/auth0/Lock.Android/pull/320) ([lbalmaceda](https://github.com/lbalmaceda))

**Added**

- Custom Style for Social Buttons [\#325](https://github.com/auth0/Lock.Android/pull/325) ([lbalmaceda](https://github.com/lbalmaceda))
- Request the user to accept Terms&Policy before Sign Up [\#319](https://github.com/auth0/Lock.Android/pull/319) ([lbalmaceda](https://github.com/lbalmaceda))
- Handle too_many_attempts API error [\#308](https://github.com/auth0/Lock.Android/pull/308) ([lbalmaceda](https://github.com/lbalmaceda))
- Add Service Terms and Privacy Policy dialog [\#307](https://github.com/auth0/Lock.Android/pull/307) ([lbalmaceda](https://github.com/lbalmaceda))

**Changed**

- Force init lock [Breaking Change][\#329](https://github.com/auth0/Lock.Android/pull/329) ([lbalmaceda](https://github.com/lbalmaceda))
- Update Auth0 lib version to latest [\#327](https://github.com/auth0/Lock.Android/pull/327) ([lbalmaceda](https://github.com/lbalmaceda))
- Hide Theme configuration on the Builder [Breaking Change][\#326](https://github.com/auth0/Lock.Android/pull/326) ([lbalmaceda](https://github.com/lbalmaceda))
- Use AuthMode constants when notifying tab change [\#323](https://github.com/auth0/Lock.Android/pull/323) ([lbalmaceda](https://github.com/lbalmaceda))
- Handle wrong Client Type error [\#321](https://github.com/auth0/Lock.Android/pull/321) ([lbalmaceda](https://github.com/lbalmaceda))
- Change SocialButton title when changing the Form mode [\#317](https://github.com/auth0/Lock.Android/pull/317) ([lbalmaceda](https://github.com/lbalmaceda))
- UI Improvements: Bigger buttons/fields [\#314](https://github.com/auth0/Lock.Android/pull/314) ([lbalmaceda](https://github.com/lbalmaceda))
- New Tab design. [\#313](https://github.com/auth0/Lock.Android/pull/313) ([lbalmaceda](https://github.com/lbalmaceda))
- Use pngs instead of vectorial xml files [\#311](https://github.com/auth0/Lock.Android/pull/311) ([lbalmaceda](https://github.com/lbalmaceda))
- Make PKCE enabled by default [\#310](https://github.com/auth0/Lock.Android/pull/310) ([lbalmaceda](https://github.com/lbalmaceda))
- Always pick defaultDbConnection if available [\#309](https://github.com/auth0/Lock.Android/pull/309) ([lbalmaceda](https://github.com/lbalmaceda))

**Breaking changes**

`Lock` & `PassworlessLock` no longer has the method `onCreate(Activity)` and it's logic is now part of the method `Lock.Builder.build(Activity)`. So to create a Lock instance you will have

```java
Lock lock = Lock.newBuilder(auth0, callback)
      //Customize Lock
      .build(this);
```

Also now you can create `Lock` by reading your Auth0 account credentials from a strings file

```java
Lock lock = Lock.newBuilder(callback)
      //Customize Lock
      .build(this);
```

and he string file should have

```xml
 <resources>
    <string name="com_auth0_client_id">{CLIENT_ID}</string>
    <string name="com_auth0_domain">{DOMAIN}</string>
</resources>
```

`Lock.Builder` no longers allow to customize Lock's theme using the method `withTheme(Theme)` since using Android themes is preferable.

Also for all non-database authentication will use **Proof Key for Code Exchange** by default so your client type in Auth0 dashboard **must** be `Native`.

## [2.0.0-beta.3](https://github.com/auth0/Lock.Android/tree/2.0.0-beta.3) (2016-07-22)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.0.0-beta.2...2.0.0-beta.3)

**Added**

- Locally Configurable Lock sample app [\#298](https://github.com/auth0/Lock.Android/pull/298) ([lbalmaceda](https://github.com/lbalmaceda)
- Password Strength Widget [\#297](https://github.com/auth0/Lock.Android/pull/297) ([lbalmaceda](https://github.com/lbalmaceda)

**Changed**

- Update Proguard rules [\#305](https://github.com/auth0/Lock.Android/pull/305) ([lbalmaceda](https://github.com/lbalmaceda)
- Remove Fullscreen feature [\#302](https://github.com/auth0/Lock.Android/pull/302) ([lbalmaceda](https://github.com/lbalmaceda)
- Add callback setup on dashboard [\#300](https://github.com/auth0/Lock.Android/pull/300) ([lbalmaceda](https://github.com/lbalmaceda)
- Allow to customize Lock's theme programmatically [\#294](https://github.com/auth0/Lock.Android/pull/294) ([lbalmaceda](https://github.com/lbalmaceda)
- Remove unused User Profile calls. [\#293](https://github.com/auth0/Lock.Android/pull/293) ([lbalmaceda](https://github.com/lbalmaceda)
- Take email input across the forms [\#292](https://github.com/auth0/Lock.Android/pull/292) ([lbalmaceda](https://github.com/lbalmaceda)
- Allow up to 3 Social Big Buttons on Passwordless mode [\#291](https://github.com/auth0/Lock.Android/pull/291) ([lbalmaceda](https://github.com/lbalmaceda)
- Improve Custom Fields flow and layout [\#290](https://github.com/auth0/Lock.Android/pull/290) ([lbalmaceda](https://github.com/lbalmaceda)
- Handle Application without Connections [\#289](https://github.com/auth0/Lock.Android/pull/289) ([lbalmaceda](https://github.com/lbalmaceda)
- Draw the header behind the statusBar in Lollipop or greater [\#288](https://github.com/auth0/Lock.Android/pull/288) ([lbalmaceda](https://github.com/lbalmaceda)

**Fixed**

- Fix sign up request not sending the user metadata [\#303](https://github.com/auth0/Lock.Android/pull/303) ([lbalmaceda](https://github.com/lbalmaceda)
- Fix TextView extra padding. [\#296](https://github.com/auth0/Lock.Android/pull/296) ([lbalmaceda](https://github.com/lbalmaceda)
- Country code selection widget fixes [\#295](https://github.com/auth0/Lock.Android/pull/295) ([lbalmaceda](https://github.com/lbalmaceda)

**Breaking changes**

**Lock** `Builder` method

```java
public Builder allowSignIn(boolean allow) {...}
```

was renamed to

```java
public Builder allowLogIn(boolean allow) {...}
```

Also this method (and feature) is no longer supported in **Lock**

```java
public Builder fullscreen(boolean fullscreen) {...}
```

## [2.0.0-beta.2](https://github.com/auth0/Lock.Android/tree/2.0.0-beta.2) (2016-06-06)

[Full Changelog](https://github.com/auth0/Lock.Android/compare/2.0.0-beta.1...2.0.0-beta.2)

**Changed**

- Use new version of auth0-java to fix issue with json parsing [\#286](https://github.com/auth0/Lock.Android/pull/286) ([lbalmaceda](https://github.com/lbalmaceda))
- Fix issues with default values of `allow****` and `initialScreen` options [\#286](https://github.com/auth0/Lock.Android/pull/286) ([lbalmaceda](https://github.com/lbalmaceda))

**Breaking changes**

`AuthenticationCallback` no longer returns `UserProfile`, it only returns `Credentials` object with the tokens of the authenticated user:

```java
private LockCallback callback = new AuthenticationCallback() {
     @Override
     public void onAuthentication(Credentials credentials) {
        //Authenticated
     }

     @Override
     public void onCanceled() {
        //User pressed back
     }

     @Override
     public void onError(LockException error)
        //Exception occurred
     }
 };
```

To request the `UserProfile`, just use `AuthenticationAPIClient` from [auth0-java](https://github.com/auth0/auth0-java)

```java
@Override
public void onAuthentication(Credentials credentials) {
    AuthenticationAPIClient client = new AuthenticationAPIClient(new Auth0("YOUR_CLIENT_ID", "YOUR_DOMAIN"));

    client.tokenInfo(credentials.idToken)
        .start(new BaseCallback<UserProfile>() {
            @Override
            public void onSuccess(UserProfile payload) { }

            @Override
            public void onFailure(Auth0Exception error) { }
        });
}
```

## [2.0.0-beta.1](https://github.com/auth0/Lock.Android/tree/2.0.0-beta.1) (2016-06-03)

First beta release of Lock for Android v2

### Declaration in AndroidManifest.xml

Now Lock for Android requires these permisssions

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

and this is how `LockActivity` should be declared in your Android Manifest

```xml
<activity
  android:name="com.auth0.android.lock.LockActivity"
  android:label="@string/app_name"
  android:launchMode="singleTask"
  android:screenOrientation="portrait"
  android:theme="@style/Lock.Theme">
    <intent-filter>
      <action android:name="android.intent.action.VIEW" />

      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />

      <data
        android:host="YOUR_AUTH0_DOMAIN"
        android:pathPrefix="/android/YOUR_APP_PACKAGE_NAME/callback"
        android:scheme="https" />
    </intent-filter>
</activity>
```

### Lock instance

In the previous version of **Lock**, you were asked to create a custom `Application` class and initialize the `Lock.Context` there. Now this is no longer needed. To create a new `Lock` instance and configure it, use the `Lock.Builder` class.

#### Auth0

Create an `Auth0` instance to hold your account details, which are the `AUTH0_CLIENT_ID` and the `AUTH0_DOMAIN`.

```java
Auth0 auth0 = new Auth0("YOUR_AUTH0_CLIENT_ID", "YOUR_AUTH0_DOMAIN");
```

### Authentication Callback

You'll also need a `LockCallback` implementation, we provide `AuthenticationCallback` that reports the following events:

- onAuthentication: User successfuly authenticated
- onError: An unrecoverable error ocurred during authentication
- onCanceled: User pressed back (if closable is true)

> If you need a more fine grained control you can implement `LockCallback` full interface.

```java
private LockCallback callback = new AuthenticationCallback() {
     @Override
     public void onAuthentication(Authentication authentication) {
        //Authenticated
     }

     @Override
     public void onCanceled() {
        //User pressed back
     }

     @Override
     public void onError(LockException error)
        //Exception occurred
     }
 };
```

### Lock.Builder

Call the static method `Lock.newBuilder(Auth0, AuthenticationCallback)` passing the account details and the callback implementation, and start configuring the [Options](#options). After you're done, build the `Lock` instance and use it to start the `LockActivity`.

This is how your activity should look like.

```java
public class MainActivity extends Activity {
  private Lock lock;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    Auth0 auth0 = new Auth0(AUTH0_CLIENT_ID, AUTH0_DOMAIN);
    lock = Lock.newBuilder(auth0, callback)
      // ... Options
      .build();
    lock.onCreate(this);
  }

  @Override
  public void onDestroy() {
    lock.onDestroy(this);
    super.onDestroy();
  }

  private void performLogin(boolean useBrowser) {
    startActivity(lock.newIntent(this));
  }

  private LockCallback callback = new AuthenticationCallback() {
       @Override
       public void onAuthentication(Authentication authentication) {
          //Authenticated
       }

       @Override
       public void onCanceled() {
          //User pressed back
       }

       @Override
       public void onError(LockException error) {
          //Exception occurred
       }
   };
}
```

> Remember to notify the `LockActivity` on every `OnCreate` and `OnDestroy` call on your Activity, as it helps to keep the Lock state.

### Options

As in the previous version, `Lock` can be configured with extra options. Check below if the behavior changed or if they only got renamed.

#### Renamed options from v1

- shouldUseEmail: Renamed to `withUsernameStyle`. Defines if it should ask for email only, username only, or both of them. By default, it'll respect the Dashboard configuration of the parameter `requires_username`.
- isClosable: Renamed to `closable`. Defines if the LockActivity can be closed. By default, it's not closable.
- setFullscreen: Renamed to `fullscreen`. Defines if the LockActivity it's displayed in fullscreen. By default, it's not fullscreen.
- shouldLoginAfterSignUp: Renamed to `loginAfterSignUp`. Whether after a SignUp the user should be logged in automatically.
- disableSignupAction: Renamed to `allowSignUp`. Shows the Sign Up form if a Database connection is configured.
- disableResetAction: Renamed to `allowForgotPassword`. Shows a link to the Forgot Password form if a Database connection is configured and it's allowed from the Dashboard.
- defaultUserPasswordConnection: Renamed to `setDefaultDatabaseConnection`. Defines which will be the default Database connection. This is useful if your application has many Database connections configured.
- setConnections: Renamed to `onlyUseConnections`. Filters the allowed connections from the list configured in the Dashboard..
- setAuthenticationParameters: Renamed to `withAuthenticationParameters`. Defines extra authentication parameters, sent on sign up and log in/sign in.

#### New options in v2

- `initialScreen(int)` allows to customize which form will show first when launching **Lock**. The possibles values are LOG_IN, SIGN_UP, and FORGOT_PASSWORD. By default LOG_IN is the initial screen.
- `allowLogIn(boolean)` shows the Log In form if a Database connection is configured. By default, this screen it's enabled.
- `allowSignUp(boolean)` shows the Sign Up form if a Database connection is configured. By default, this screen it's enabled.
- `allowForgotPassword(boolean)` shows the Forgot Password form if a Database connection is configured. By default, this screen it's enabled.
- `withSignUpFields(List<CustomFields>)` shows a second screen with extra fields after completing the sign up fields.
- `withProviderResolver(AuthProviderResolver)` pass your own AuthProviderResolver instance to query for AuthProviders.
- `withSocialButtonStyle(int)` allows to customize the Style of the Social buttons. Possible values are SMALL and BIG. If this is not specified, it will default to SMALL when many Social and Db/Enterprise connections are configured; and BIG on the rest of the cases.
- `usePKCE(boolean)` whether to use the new PKCE flow or the old Token exchange one when authenticating. By default, it won't use PKCE.


================================================
FILE: EXAMPLES.md
================================================
# Examples using Lock.Android

- [Examples using Lock.Android](#examples-using-lockandroid)
  - [Passwordless & Social authentication](#passwordless--social-authentication)
  - [Android App Links - Custom Scheme](#android-app-links---custom-scheme)
  - [Using Proguard](#using-proguard)


## Passwordless & Social authentication

The Passwordless feature requires your Application to have the *Passwordless OTP* Grant Type enabled first. Check [this article](https://auth0.com/docs/clients/client-grant-types) to learn how to enable it. 

`PasswordlessLockActivity` authenticates users by sending them an Email or SMS (similar to how WhatsApp authenticates you). In order to be able to authenticate the user, your application must have the SMS/Email connection enabled and configured in your [dashboard](https://manage.auth0.com/#/connections/passwordless).

Initialize **PasswordlessLock** and handle the release of its resources appropriately after you're doing using it. 

```kotlin
// This activity will show PasswordlessLock
class MyActivity : AppCompatActivity() {
    
    private lateinit var lock: PasswordlessLock
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val account = Auth0(this)
        // Instantiate Lock once
        lock = PasswordlessLock.newBuilder(account, callback)
            // Customize Lock
            .build(this)
    }
    
    override fun onDestroy() {
        super.onDestroy()
        // Important! Release Lock and its resources
        lock.onDestroy(this)
    }
    
    private val callback = object : AuthenticationCallback() {
        override fun onAuthentication(credentials: Credentials) {
            // Authenticated
        }
        
        override fun onError(error: AuthenticationException) {
            // An exception occurred
        }
    }
}
```

Start `PasswordlessLockActivity` from inside your `Activity`. For this, create a new intent and launch it.

```kotlin
startActivity(lock.newIntent(this))
```

## Android App Links - Custom Scheme

The default scheme used by the library to generate the Callback URL for Web Authentication is `https`. This works best for Android Marshmallow (API 23) or newer if you're using [Android App Links](https://developer.android.com/training/app-links/index.html). However, in previous Android versions, this may show the disambiguation dialog prompting the user to choose either your application or the browser to resolve the intent. You can change this behavior by using a unique custom scheme so that the OS opens the link directly with your app.

1. Update the `auth0Scheme` Manifest Placeholder value in the `app/build.gradle` file or directly in the Intent Filter definition in the `AndroidManifest.xml` file by changing the existing scheme to the new one.
2. Update the "Allowed Callback URLs" in your [Auth0 Dashboard](https://manage.auth0.com/#/clients) Application's settings to match URLs that begin with the new scheme.
3. Call `withScheme()` in the Lock.Builder/PasswordlessLock.Builder passing the scheme you want to use.

> The scheme value **must** be all lowercase. A warning message will be logged if this is not the case and authentication will never complete.

## Using Proguard

The rules should be applied automatically if your application is using `minifyEnabled = true`. If you want to include them manually check the [proguard directory](proguard).
By default you should at least use the following files:
* `proguard-gson.pro`
* `proguard-otto.pro`
* `proguard-lock-2.pro`

As this library depends on `Auth0.Android`, you should keep the files up to date with the proguard rules defined in the SDK [repository](https://github.com/auth0/Auth0.Android).

================================================
FILE: LICENSE.md
================================================
The MIT License (MIT)

Copyright (c) 2016 Auth0, Inc. <support@auth0.com> (http://auth0.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: MIGRATION_GUIDE.md
================================================
# Migration Guide
This guide will help you migrate Lock.Android from version v2.x.x to version v3.x.x. 

## About this release
The new version makes use of the latest Auth0.Android SDK, bringing improvements such as:
 - Open ID Connect compliant practices.
 - ID token verification for Web Authentication flows.
 - A new customizable networking stack.
 - Simpler Android app set up.
 
 Some of these features were previously available, but only enforced when the "OIDC" flag was explicitly enabled.  

## New requirements
Using the latest core SDK comes with new constraints. Your Android application will need to:
- Require a minimum Android version of 21 and above.
- Target Java version 8 and above.

Here’s what you need in build.gradle to target Java 8 byte code for the Android and Kotlin plugins respectively.

```groovy
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }
}
```

## Changes to the AndroidManifest file
In the previous version you had to declare the Lock activities you planned to use. These activities are now declared internally by the library with intent filters configured using the Manifest Placeholders that you provide for the Domain and Scheme. The Manifest Merger tool will process these and include them as part of your Android application. 

If your `AndroidManifest.xml` file includes declarations for `LockActivity`, `PasswordlessLockActivity` or `CountryCodeActivity`, you should remove them to avoid duplicated intent filter declarations.

If you are using a custom style for the theme or need to override the intent-filter declarations in any of these activities, you will have to declare an activity with the same component name and annotate it with `tools:node="replace"`.

Find details about the merging rules that will be used in the [Android Manifest Merger article](https://developer.android.com/studio/build/manifest-merge).

## Changes to the Public API
As part of removing legacy APIs or authentication flows no longer recommended for mobile clients, the following features are no longer available:

- Web Authentication flow using a WebView component instead of an external Browser. Please refer to [this blog post](https://auth0.com/blog/google-blocks-oauth-requests-from-embedded-browsers/) for additional information.
- Web Authentication flow using a response type other than "code".
- Authentication API methods categorized as Legacy in the [API docs](https://auth0.com/docs/api/authentication).

Continue reading for the detail of classes and methods that were impacted.

### Updated Callbacks
The widget requires a callback to receive the results in. The interface for this is `LockCallback`, which takes either an event or an error. The `onError` method got updated to receive an `AuthenticationException` instead of `LockException`. This change will help developers extract the *code* and *description* of the error and understand better what went wrong and how to recover from it.

The change impacts the abstract subclass `AuthenticationCallback`. Additionally, this class no longer has an `onCanceled` method. If you need to handle this scenario you have two options:
- Implement `LockCallback` and handle the different event types, checking for `LockEvent.CANCELED`.
- Implement `AuthenticationCallback` and check the received exception using the `AuthenticationException#isCanceled()` method.

```kotlin
// Before
val callback: LockCallback = object : AuthenticationCallback() {
    override fun onAuthentication(credentials: Credentials) {
        // Authenticated
    }

    override fun onCanceled() {
        // Canceled
    }

    override fun onError(error: LockException) {
        // Another error. Check code & description.
    }
}

// After
val callback: LockCallback = object : AuthenticationCallback() {
    override fun onAuthentication(credentials: Credentials) {
        // Authenticated
    }

    override fun onError(error: AuthenticationException) {
        if (error.isCanceled) {
            // Canceled
        } else {
            // Another error. Check code & description.
        }
    }
}
```

### Removed classes
- `VoidCallback` is no longer available. Please, use `Callback<Void, AuthenticationException>` instead.
- `LockException` is no longer available. This impacts the `LockCallback` and `AuthenticationCallback` classes. Please, use `AuthenticationException` instead.

### Removed methods

#### From class `AuthenticationCallback`
- Removed `public void onCanceled()`. Instead, an exception will be raised through the `public void onError(AuthenticationException)` method. Check for this scenario using the `AuthenticationException#isCanceled()` method.

#### From class `Lock.Builder`
- Removed `public Builder useBrowser(boolean)`. The library will always use a third party browser app instead of a Web View to authenticate. No replacement is available.
- Removed `public Builder useImplicitGrant(boolean)`. The library will always use the "Proof Key for Code Exchange" (PKCE) flow. Your application must be configured with the type "Native" and the "OIDC Conformant" switch ON. No replacement is available.
- Removed `public Builder withAuthButtonSize(int)`. Social buttons will always have a "large button" style. No replacement is available. 

#### From class `PasswordlessLock.Builder`
- Removed `public Builder useBrowser(boolean)`. The library will always use a third party browser app instead of a Web View to authenticate. No replacement is available.
- Removed `public Builder useImplicitGrant(boolean)`. The library will always use the "Proof Key for Code Exchange" (PKCE) flow. Your application must be configured with the type "Native" and the "OIDC Conformant" switch ON. No replacement is available.
- Removed `public Builder withAuthButtonSize(int)`. Social buttons will always have a "large button" style. No replacement is available. 

#### From `Auth0` class
- Removed `setOIDCConformant(boolean)`. The library will only use Open ID Connect compliant flows from now on, this cannot be turned off.
- Removed `setLoggingEnabled(boolean)`. The ability to turn on the networking logs has been removed. If you need to inspect the traffic, take a look at the [Network Profiler](https://developer.android.com/studio/profile/network-profiler) tool. 

### Changed methods

#### From cass `Lock.Builder`
- Changed `public Builder withAuthenticationParameters(@NonNull Map<String, Object> authenticationParameters)` to `public Builder withAuthenticationParameters(@NonNull Map<String, String> authenticationParameters)`. Request parameters must be specified as String key/values.

#### From cass `PasswordlessLock.Builder`
- Changed `public Builder withAuthenticationParameters(@NonNull Map<String, Object> authenticationParameters)` to `public Builder withAuthenticationParameters(@NonNull Map<String, String> authenticationParameters)`. Request parameters must be specified as String key/values.

### Changes to the underlying SDK

The core SDK has been updated to the version 2+. Since this is exposed as an API scoped dependency, if you were using any of the classes or methods that changed in the new major release (e.g. the `WebAuthProvider` class), you might need to update your code. Follow the [Auth0.Android Migration Guide](https://github.com/auth0/Auth0.Android/blob/main/V2_MIGRATION_GUIDE.md) to assess the impact. 

## Changes in behavior

### Lock lifecycle

The widget registers a Broadcast Listener to expect and handle the different lifecycle events. The listener is registered as soon as a new instance of `Lock` or `PasswordlessLock` is created with the corresponding Builder class, and the listener is unregistered when the `onDestroy` method is invoked. Forgetting to call this method would retain unnecessary resources after the authentication is complete and the widget is no longer required, or cause the callback to receive duplicated calls. 

In case you are not currently calling it, make sure to update your code adding the `lock?.onDestroy(this)` call.

```kotlin
class MyActivity : AppCompatActivity() {

  private lateinit var lock: Lock

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    val account = Auth0(this)
    // Create a reusable Lock instance
    lock = Lock.newBuilder(account, callback)
      // Customize Lock
      // .withScheme("myapp")
      .build(this)
  }

  private fun launchLock() {
    // Invoke as many times as needed
    val intent = lock.newIntent(this)
    startActivity(intent)
  }
 
  override fun onDestroy() {
      super.onDestroy()
      // Release Lock resources
      lock.onDestroy(this)
  }
}
```

### Non-recoverable errors

The `LockCallback` will get its `onError` method invoked when an [Auth0 Rule](https://auth0.com/docs/rules) returns an `Error` or `UnauthorizedError`. This was previously handled internally by Lock, causing it to display an orange toast with a generic failure message. From this release on, if you are using Auth0 Rules and throwing custom errors, you should obtain the _cause_ of the exception and read the code or description values to understand what went wrong.  

================================================
FILE: README.md
================================================
> **Note**
> As part of our ongoing commitment to best security practices, we have rotated the signing keys used to sign previous releases of this SDK. As a result, new patch builds have been released using the new signing key. Please upgrade at your earliest convenience.
>
> While this change won't affect most developers, if you have implemented a dependency signature validation step in your build process, you may notice a warning that past releases can't be verified. This is expected, and a result of the key rotation process. Updating to the latest version will resolve this for you.

![Lock for Android](https://cdn.auth0.com/website/sdks/banners/lock-android-banner.png)

[![CircleCI](https://circleci.com/gh/auth0/Lock.Android.svg?style=shield)](https://circleci.com/gh/auth0/Lock.Android)
[![License](https://img.shields.io/dub/l/vibe-d.svg?style=flat)](https://opensource.org/licenses/MIT)
[![Maven Central](https://img.shields.io/maven-central/v/com.auth0.android/lock.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.auth0.android%22%20AND%20a%3A%22lock%22)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/auth0/Lock.Android)

📚 [Documentation](#documentation) • 🚀 [Getting Started](#getting-started) • ⏭️ [Next Steps](#next-steps) • 💬 [Feedback](#feedback)

## Documentation

- [Examples](https://github.com/auth0/Lock.android/blob/main/EXAMPLES.md)
- [Docs Site](https://auth0.com/docs/libraries/lock-android)
- [API Reference](https://javadoc.io/doc/com.auth0.android/lock/latest/index.html)

## Getting Started

### Requirements

Android API Level 21+ & Java version 8 or above is required in order to use Lock's UI.

Here’s what you need in build.gradle to target Java 8 byte code for the Android and Kotlin plugins respectively.

```groovy
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }
}
```

### Installation

Lock is available in [Maven Central](http://search.maven.org). To start using *Lock* add this line to the dependencies of your `build.gradle` file:

```groovy
implementation 'com.auth0.android:lock:3.2.2'
```

## Next Steps

If you haven't done yet, go to [Auth0](https://auth0.com) and create an Account, it's free! Then create a new [Application](https://manage.auth0.com/#/applications) of type *Native* and add a URL in *Allowed Callback URLs* with the following format:

```
https://{YOUR_AUTH0_DOMAIN}/android/{YOUR_APP_PACKAGE_NAME}/callback
```

The *package name* value required in the Callback URL can be found in your app's `build.gradle` file in the `applicationId` property. Both the *domain* and *client id* values can be found at the top of your Auth0 Application's settings. You're going to use them to setup the SDK. It's good practice to add them to the `strings.xml` file as string resources that you can reference later from the code. This guide will follow that practice.

```xml
<resources>
    <string name="com_auth0_client_id">YOUR_AUTH0_CLIENT_ID</string>
    <string name="com_auth0_domain">YOUR_AUTH0_DOMAIN</string>
</resources>
```

In your `app/build.gradle` file add the **Manifest Placeholders** for the Auth0 Domain and Auth0 Scheme properties, which are going to be used internally by the library to declare the Lock activities and register **intent-filters** that will capture the authentication result.

```groovy
apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    defaultConfig {
        applicationId "com.auth0.samples"
        minSdkVersion 21
        targetSdkVersion 30
        //...

        //---> Add the next line
        manifestPlaceholders = [auth0Domain: "@string/com_auth0_domain", auth0Scheme: "https"]
        //<---
    }
    //...
}
```

The next step is to create an instance of `Auth0` with your application's information. The easiest way to create it is by using the values defined previously in the `strings.xml` file and passing an Android Context. For this to work, you must have defined the string resources using the same keys as listed above.

```kotlin
val account = Auth0(context)
```

Alternatively, you can directly pass the values.

```kotlin
val account = Auth0("{YOUR_AUTH0_CLIENT_ID}", "{YOUR_AUTH0_DOMAIN}")
```

Or, if you are using _custom domains_ and are required to specify a different URL to fetch the Lock widget configuration from, you can use the constructor that takes 3 parameters:

```kotlin
val account = Auth0("{YOUR_AUTH0_CLIENT_ID}", "{YOUR_AUTH0_DOMAIN}", "{THE_CONFIGURATION_DOMAIN}")
```


### Email/Password, Enterprise & Social authentication

Initialize **Lock** and handle the release of its resources appropriately after you're done using it. 

```kotlin
// This activity will show Lock
class MyActivity : AppCompatActivity() {

    private lateinit var lock: Lock

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val account = Auth0(this)
        // Instantiate Lock once
        lock = Lock.newBuilder(account, callback)
            // Customize Lock
            .build(this)
    }
    
    override fun onDestroy() {
        super.onDestroy()
        // Important! Release Lock and its resources
        lock.onDestroy(this)
    }
    
    private val callback = object : AuthenticationCallback() {
        override fun onAuthentication(credentials: Credentials) {
            // Authenticated
        }
        
        override fun onError(error: AuthenticationException) {
            // An exception occurred
        }
    }
}
```

Start `LockActivity` from inside your `Activity`. For this, create a new intent from the Lock instance and launch it.

```kotlin
startActivity(lock.newIntent(this))
```

### Customizing the widget

When using the `Builder` to instantiate the widget, you can pass different options to customize how it will behave. Some options are only available for **Lock** or **PasswordlessLock**. Below you will find a few of them. You can always explore all the available options with your IDE's auto-complete shortcut. Check the Javadocs to understand the default values.


```kotlin
// Create a new builder from Lock or LockPasswordless classes
newBuilder(account, callback)
    // Shared options
    .closable(true) // Allows the widget to be closed with the back button
    .withScope('new-scope') // Changes the scope to be requested on authentication
    .withAudience('my-api') // Changes the audience to be requested on authentication
    .withScheme('myapp') // Changes the scheme part used to generate the Callback URL (more below)
    
    // Lock specific options
    .initialScreen(InitialScreen.SIGN_UP) // Allows to choose the screen to be displayed first 
    .allowLogIn(false) // Disables the Log In screen
    .allowSignUp(false) // Disables the Sign Up screen
    .allowForgotPassword(false) // Disables the Change Password screen
    .setDefaultDatabaseConnection('my-connection') // When multiple are available, select one
    
    // PasswordlessLock specific options
    .useCode(true)  // Requests to receive a OTP that will need to be filled in your android app to authenticate the user
    .useLink(false) // Requests to receive a link that will open your android app to authenticate the user
    .rememberLastLogin(true) // Saves the email or phone number to avoid re-typing it in the future
    
    // Build the instance
    .build(this)
```

## Feedback

### Contributing

We appreciate feedback and contribution to this repo! Before you get started, please see the following:

- [Auth0's general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md)
- [Auth0's code of conduct guidelines](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md)

### Raise an issue
To provide feedback or report a bug, [please raise an issue on our issue tracker](https://github.com/auth0/Lock.Android/issues).

### Vulnerability Reporting
Please do not report security vulnerabilities on the public Github issue tracker. The [Responsible Disclosure Program](https://auth0.com/whitehat) details the procedure for disclosing security issues.

---

<p align="center">
  <picture
    <source media="(prefers-color-scheme: light)" srcset="https://cdn.auth0.com/website/sdks/logos/auth0_light_mode.png" width="150">
    <source media="(prefers-color-scheme: dark)" srcset="https://cdn.auth0.com/website/sdks/logos/auth0_dark_mode.png" width="150">
    <img alt="Auth0 Logo" src="https://cdn.auth0.com/website/sdks/logos/auth0_light_mode.png" width="150">
  </picture>
</p>
<p align="center">Auth0 is an easy to implement, adaptable authentication and authorization platform. To learn more checkout <a href="https://auth0.com/why-auth0">Why Auth0?</a></p>
<p align="center">
This project is licensed under the MIT license. See the <a href="https://github.com/auth0/lock.android/blob/main/LICENSE.md"> LICENSE</a> file for more info.</p>

================================================
FILE: app/.gitignore
================================================
# Created by https://www.gitignore.io/api/intellij,android,osx,windows

### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm

*.iml

## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:

# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# .idea/shelf

# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml

# Gradle:
# .idea/gradle.xml
# .idea/libraries

# Mongo Explorer plugin:
# .idea/mongoSettings.xml

## File-based project format:
*.ipr
*.iws

## Plugin-specific files:

# IntelliJ
/out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties


### Android ###
# Built application files
*.apk
*.ap_

# Files for the Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

### Android Patch ###
gen-external-apklibs


### OSX ###
.DS_Store

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes


================================================
FILE: app/build.gradle
================================================
plugins {
    id "com.android.application"
}
apply plugin: 'kotlin-android'

android {
    compileSdkVersion 33

    defaultConfig {
        applicationId "com.auth0.android.lock.app"
        minSdkVersion 21
        targetSdkVersion 33
        versionCode 1
        versionName "1.0"
        manifestPlaceholders = [auth0Domain: "@string/com_auth0_domain", auth0Scheme: "demo"]
    }

    signingConfigs {
        release {
            storeFile file("release-test.jks")
            storePassword "android"
            keyAlias "android"
            keyPassword "android"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

dependencies {
    testImplementation 'junit:junit:4.13.2'
    implementation project(':lock')
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation "androidx.core:core-ktx:1.9.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

## Debugging
-renamesourcefileattribute SourceFile
-keepattributes SourceFile, LineNumberTable
-verbose

================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.auth0.android.lock.app">

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">

        <activity
            android:name=".DemoActivity"
            android:exported="true"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

================================================
FILE: app/src/main/java/com/auth0/android/lock/app/DemoActivity.kt
================================================
/*
 * DemoActivity.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package com.auth0.android.lock.app

import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.CheckBox
import android.widget.LinearLayout
import android.widget.RadioGroup
import androidx.appcompat.app.AppCompatActivity
import com.auth0.android.Auth0
import com.auth0.android.authentication.AuthenticationException
import com.auth0.android.callback.Callback
import com.auth0.android.lock.*
import com.auth0.android.provider.WebAuthProvider.login
import com.auth0.android.provider.WebAuthProvider.logout
import com.auth0.android.result.Credentials
import com.google.android.material.snackbar.Snackbar

class DemoActivity : AppCompatActivity() {

    // Configured instances
    private var lock: Lock? = null
    private var passwordlessLock: PasswordlessLock? = null

    // Views
    private lateinit var rootLayout: View
    private lateinit var groupSubmitMode: RadioGroup
    private lateinit var checkboxClosable: CheckBox
    private lateinit var groupPasswordlessChannel: RadioGroup
    private lateinit var groupPasswordlessMode: RadioGroup
    private lateinit var checkboxConnectionsDB: CheckBox
    private lateinit var checkboxConnectionsEnterprise: CheckBox
    private lateinit var checkboxConnectionsSocial: CheckBox
    private lateinit var checkboxConnectionsPasswordless: CheckBox
    private lateinit var checkboxHideMainScreenTitle: CheckBox
    private lateinit var groupDefaultDB: RadioGroup
    private lateinit var groupUsernameStyle: RadioGroup
    private lateinit var checkboxLoginAfterSignUp: CheckBox
    private lateinit var checkboxScreenLogIn: CheckBox
    private lateinit var checkboxScreenSignUp: CheckBox
    private lateinit var checkboxScreenReset: CheckBox
    private lateinit var groupInitialScreen: RadioGroup

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.demo_activity)
        rootLayout = findViewById(R.id.scrollView)

        //Basic
        groupSubmitMode = findViewById(R.id.group_submitmode)
        checkboxClosable = findViewById(R.id.checkbox_closable)
        checkboxHideMainScreenTitle = findViewById(R.id.checkbox_hide_title)
        checkboxConnectionsDB = findViewById(R.id.checkbox_connections_db)
        checkboxConnectionsEnterprise = findViewById(R.id.checkbox_connections_enterprise)
        checkboxConnectionsSocial = findViewById(R.id.checkbox_connections_social)
        checkboxConnectionsPasswordless = findViewById(R.id.checkbox_connections_Passwordless)
        groupPasswordlessChannel = findViewById(R.id.group_passwordless_channel)
        groupPasswordlessMode = findViewById(R.id.group_passwordless_mode)

        //Advanced
        groupDefaultDB = findViewById(R.id.group_default_db)
        groupUsernameStyle = findViewById(R.id.group_username_style)
        checkboxLoginAfterSignUp = findViewById(R.id.checkbox_login_after_signup)
        checkboxScreenLogIn = findViewById(R.id.checkbox_enable_login)
        checkboxScreenSignUp = findViewById(R.id.checkbox_enable_signup)
        checkboxScreenReset = findViewById(R.id.checkbox_enable_reset)
        groupInitialScreen = findViewById(R.id.group_initial_screen)

        //Buttons
        val advancedContainer = findViewById<LinearLayout>(R.id.advanced_container)
        val checkboxShowAdvanced = findViewById<CheckBox>(R.id.checkbox_show_advanced)
        checkboxShowAdvanced.setOnCheckedChangeListener { _, b -> advancedContainer.visibility = if (b) View.VISIBLE else View.GONE }
        val btnShowLockClassic = findViewById<Button>(R.id.btn_show_lock_classic)
        btnShowLockClassic.setOnClickListener { showClassicLock() }
        val btnShowLockPasswordless = findViewById<Button>(R.id.btn_show_lock_passwordless)
        btnShowLockPasswordless.setOnClickListener { showPasswordlessLock() }
        val btnShowUniversalLogin = findViewById<Button>(R.id.btn_show_universal_login)
        btnShowUniversalLogin.setOnClickListener { showWebAuth() }
        val btnClearSession = findViewById<Button>(R.id.btn_clear_session)
        btnClearSession.setOnClickListener { clearSession() }
    }

    private fun showWebAuth() {
        login(account)
                .withScheme("demo")
                .withAudience(String.format("https://%s/userinfo", getString(R.string.com_auth0_domain)))
                .start(this, loginCallback)
    }

    private fun clearSession() {
        logout(account)
                .withScheme("demo")
                .start(this, logoutCallback)
    }

    private fun showClassicLock() {
        val builder = Lock.newBuilder(account, callback)
                .withScheme("demo")
                .closable(checkboxClosable.isChecked)
                .useLabeledSubmitButton(groupSubmitMode.checkedRadioButtonId == R.id.radio_use_label)
                .loginAfterSignUp(checkboxLoginAfterSignUp.isChecked)
                .allowLogIn(checkboxScreenLogIn.isChecked)
                .allowSignUp(checkboxScreenSignUp.isChecked)
                .allowForgotPassword(checkboxScreenReset.isChecked)
                .allowedConnections(generateConnections())
                .hideMainScreenTitle(checkboxHideMainScreenTitle.isChecked)

        when (groupUsernameStyle.checkedRadioButtonId) {
            R.id.radio_username_style_email -> {
                builder.withUsernameStyle(UsernameStyle.EMAIL)
            }
            R.id.radio_username_style_username -> {
                builder.withUsernameStyle(UsernameStyle.USERNAME)
            }
        }
        when (groupInitialScreen.checkedRadioButtonId) {
            R.id.radio_initial_reset -> {
                builder.initialScreen(InitialScreen.FORGOT_PASSWORD)
            }
            R.id.radio_initial_signup -> {
                builder.initialScreen(InitialScreen.SIGN_UP)
            }
            else -> {
                builder.initialScreen(InitialScreen.LOG_IN)
            }
        }
        if (checkboxConnectionsDB.isChecked) {
            when (groupDefaultDB.checkedRadioButtonId) {
                R.id.radio_default_db_policy -> {
                    builder.setDefaultDatabaseConnection("with-strength")
                }
                R.id.radio_default_db_mfa -> {
                    builder.setDefaultDatabaseConnection("mfa-connection")
                }
                else -> {
                    builder.setDefaultDatabaseConnection("Username-Password-Authentication")
                }
            }
        }

        // For demo purposes because options change dynamically, we release the resources of Lock here.
        // In a real app, you will have a single instance and release its resources in Activity#OnDestroy.
        lock?.onDestroy(this)
        // Create a new instance with the updated configuration
        lock = builder.build(this)
        startActivity(lock!!.newIntent(this))
    }

    private fun showPasswordlessLock() {
        val builder = PasswordlessLock.newBuilder(account, callback)
                .withScheme("demo")
                .closable(checkboxClosable.isChecked)
                .allowedConnections(generateConnections())
                .hideMainScreenTitle(checkboxHideMainScreenTitle.isChecked)

        if (groupPasswordlessMode.checkedRadioButtonId == R.id.radio_use_link) {
            builder.useLink()
        } else {
            builder.useCode()
        }

        // For demo purposes because options change dynamically, we release the resources of Lock here.
        // In a real app, you will have a single instance and release its resources in Activity#OnDestroy.
        passwordlessLock?.onDestroy(this)
        // Create a new instance with the updated configuration
        passwordlessLock = builder.build(this)
        startActivity(passwordlessLock!!.newIntent(this))
    }

    private val account: Auth0 by lazy {
        Auth0(getString(R.string.com_auth0_client_id), getString(R.string.com_auth0_domain))
    }

    private fun generateConnections(): List<String> {
        val connections: MutableList<String> = ArrayList()
        if (checkboxConnectionsDB.isChecked) {
            connections.add("Username-Password-Authentication")
            connections.add("mfa-connection")
            connections.add("with-strength")
        }
        if (checkboxConnectionsEnterprise.isChecked) {
            connections.add("ad")
            connections.add("another")
            connections.add("fake-saml")
            connections.add("contoso-ad")
        }
        if (checkboxConnectionsSocial.isChecked) {
            connections.add("google-oauth2")
            connections.add("twitter")
            connections.add("facebook")
            connections.add("paypal-sandbox")
        }
        if (checkboxConnectionsPasswordless.isChecked) {
            connections.add(if (groupPasswordlessChannel.checkedRadioButtonId == R.id.radio_use_sms) "sms" else "email")
        }
        if (connections.isEmpty()) {
            connections.add("no-connection")
        }
        return connections
    }

    public override fun onDestroy() {
        super.onDestroy()
        lock?.onDestroy(this)
        passwordlessLock?.onDestroy(this)
    }

    internal fun showResult(message: String) {
        Snackbar.make(rootLayout, message, Snackbar.LENGTH_LONG).show()
    }

    private val callback: LockCallback = object : AuthenticationCallback() {
        override fun onAuthentication(credentials: Credentials) {
            showResult("OK > " + credentials.accessToken)
        }

        override fun onError(error: AuthenticationException) {
            if (error.isCanceled) {
                showResult("User pressed back.")
            } else {
                showResult(error.getDescription())
            }
        }
    }
    private val loginCallback: Callback<Credentials, AuthenticationException> = object : Callback<Credentials, AuthenticationException> {
        override fun onFailure(error: AuthenticationException) {
            showResult("Failed > " + error.getDescription())
        }

        override fun onSuccess(result: Credentials) {
            showResult("OK > " + result.accessToken)
        }
    }
    private val logoutCallback: Callback<Void?, AuthenticationException> = object : Callback<Void?, AuthenticationException> {
        override fun onFailure(error: AuthenticationException) {
            showResult("Log out cancelled")
        }

        override fun onSuccess(result: Void?) {
            showResult("Logged out!")
        }
    }
}

================================================
FILE: app/src/main/res/layout/demo_activity.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="HardcodedText">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:layout_weight="1"
                android:text="Embedded Login"
                android:textSize="20sp" />

            <CheckBox
                android:id="@+id/checkbox_show_advanced"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="false"
                android:text="+Advanced" />
        </LinearLayout>

        <RadioGroup
            android:id="@+id/group_submitmode"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/radio_use_label"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:text="Submit with Label" />

            <RadioButton
                android:id="@+id/radio_use_icon"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Submit with Icon" />

        </RadioGroup>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <CheckBox
                android:id="@+id/checkbox_closable"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="Can be Closed" />

            <CheckBox
                android:id="@+id/checkbox_hide_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="false"
                android:text="Hide Main Title" />
        </LinearLayout>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="5dp"
            android:text="Passwordless" />

        <RadioGroup
            android:id="@+id/group_passwordless_channel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/radio_use_email"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:text="Use Email" />

            <RadioButton
                android:id="@+id/radio_use_sms"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Use SMS" />
        </RadioGroup>

        <RadioGroup
            android:id="@+id/group_passwordless_mode"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <RadioButton
                android:id="@+id/radio_use_link"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:text="Use Link" />

            <RadioButton
                android:id="@+id/radio_use_code"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Use Code" />
        </RadioGroup>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="5dp"
            android:text="Allowed Connections" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <CheckBox
                    android:id="@+id/checkbox_connections_db"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="DB" />

                <CheckBox
                    android:id="@+id/checkbox_connections_enterprise"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Enterprise" />

            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <CheckBox
                    android:id="@+id/checkbox_connections_social"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Social" />

                <CheckBox
                    android:id="@+id/checkbox_connections_Passwordless"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Passwordless" />
            </LinearLayout>

        </LinearLayout>

        <!-- Begin Advanced -->

        <LinearLayout
            android:id="@+id/advanced_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:visibility="gone"
            tools:visibility="visible">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_marginBottom="5dp"
                android:text="Advanced"
                android:textSize="18sp" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:text="Default DB Connection" />

            <RadioGroup
                android:id="@+id/group_default_db"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <RadioButton
                    android:id="@+id/radio_default_db_userpassword"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Usr-Pwd" />

                <RadioButton
                    android:id="@+id/radio_default_db_mfa"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="MFA" />

                <RadioButton
                    android:id="@+id/radio_default_db_policy"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Pwd Policy" />
            </RadioGroup>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:text="Username Style" />

            <RadioGroup
                android:id="@+id/group_username_style"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <RadioButton
                    android:id="@+id/radio_username_style_default"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Default" />

                <RadioButton
                    android:id="@+id/radio_username_style_username"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="User" />

                <RadioButton
                    android:id="@+id/radio_username_style_email"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Email" />
            </RadioGroup>

            <CheckBox
                android:id="@+id/checkbox_login_after_signup"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="Log In after Sign Up" />


            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="Enabled Screens" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <CheckBox
                    android:id="@+id/checkbox_enable_login"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Log In" />

                <CheckBox
                    android:id="@+id/checkbox_enable_signup"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Sign Up" />

                <CheckBox
                    android:id="@+id/checkbox_enable_reset"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Reset Pwd" />

            </LinearLayout>


            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="Initial Screen" />

            <RadioGroup
                android:id="@+id/group_initial_screen"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <RadioButton
                    android:id="@+id/radio_initial_login"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:text="Log In" />

                <RadioButton
                    android:id="@+id/radio_initial_signup"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Sign Up" />

                <RadioButton
                    android:id="@+id/radio_initial_reset"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Reset Pwd" />
            </RadioGroup>


        </LinearLayout>

        <!-- End Advanced -->

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn_show_lock_classic"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="Show Classic" />

            <Button
                android:id="@+id/btn_show_lock_passwordless"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="Show Passwordless" />

        </LinearLayout>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="5dp"
            android:text="Universal Login"
            android:textSize="20sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:text="Above settings don't apply" />

        <Button
            android:id="@+id/btn_show_universal_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Show Login Page" />

        <Button
            android:id="@+id/btn_clear_session"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:text="Show Logout Page" />


    </LinearLayout>
</ScrollView>


================================================
FILE: app/src/main/res/values/auth0.xml
================================================
<!--
  ~ auth0.xml
  ~
  ~ Copyright (c) 2016 Auth0 (http://auth0.com)
  ~
  ~ Permission is hereby granted, free of charge, to any person obtaining a copy
  ~ of this software and associated documentation files (the "Software"), to deal
  ~ in the Software without restriction, including without limitation the rights
  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  ~ copies of the Software, and to permit persons to whom the Software is
  ~ furnished to do so, subject to the following conditions:
  ~
  ~ The above copyright notice and this permission notice shall be included in
  ~ all copies or substantial portions of the Software.
  ~
  ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  ~ THE SOFTWARE.
  -->

<resources>
    <string name="com_auth0_client_id">Owu62gnGsRYhk1v9SfB3c6IUbIJcRIze</string>
    <string name="com_auth0_domain">lbalmaceda.auth0.com</string>
</resources>


================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>


================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">Lock Demo</string>
    <string name="native_provider_message_invalid_authorize_url">The authorize URL is invalid.</string>
    <string name="native_provider_message_canceled">Canceled</string>
    <string name="native_provider_title">Native Identity Provider</string>
    <string name="native_provider_message_start">About to start the authentication with a Native Identity Provider. Click next to continue or cancel to go back.</string>
    <string name="native_provider_action_cancel">Cancel</string>
    <string name="native_provider_action_continue">Continue</string>
    <string name="native_provider_message_failed">Native authentication failed!</string>
    <string name="native_provider_message_succeeded">Native authentication succeeded!</string>
    <string name="hint_name">First Name</string>
    <string name="hint_surname">Last Name</string>
    <string name="hint_work">Work Place</string>
    <string name="hint_country">Country name</string>
    <string name="hint_phone">Phone Number</string>
    <string name="hint_date">Your birthday</string>
</resources>


================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.9.0'
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    group = 'com.auth0.android'
    
    repositories {
        mavenCentral()
        google()
    }
}


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.enableJetifier=false
android.useAndroidX=true

================================================
FILE: gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: lib/.gitignore
================================================
/build


================================================
FILE: lib/build.gradle
================================================
plugins {
    id "com.auth0.gradle.oss-library.android" version "0.18.0"
}

logger.lifecycle("Using version ${version} for ${name}")

def signingKey = findProperty('signingKey')
def signingKeyPwd = findProperty('signingPassword')

oss {
    name 'Lock.Android'
    repository 'Lock.Android'
    organization 'auth0'
    description 'The easiest way of securing your Android mobile apps with Auth0 & Lock'
    skipAssertSigningConfiguration true

    developers {
        auth0 {
            displayName = 'Auth0'
            email = 'oss@auth0.com'
        }
        lbalmaceda {
            displayName = 'Luciano Balmaceda'
            email = 'luciano.balmaceda@auth0.com'
        }
    }
}

signing {
    useInMemoryPgpKeys(signingKey, signingKeyPwd)
}

android {
    compileSdkVersion 31

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 31
        versionCode 1
        versionName project.version
        consumerProguardFiles '../proguard/proguard-gson.pro', '../proguard/proguard-otto.pro', '../proguard/proguard-lock-2.pro'
        // Required since Android Gradle Plugin 4.1 - https://issuetracker.google.com/issues/154275579
        buildConfigField "String", "VERSION_NAME", "\"$versionName\""
    }

    lintOptions {
        disable 'ContentDescription', 'SyntheticAccessor'
        abortOnError true
    }

    testOptions {
        unitTests {
            includeAndroidResources = true
            // https://github.com/robolectric/robolectric/issues/5115
            all {
                systemProperty("javax.net.ssl.trustStoreType", "JKS")
                maxHeapSize = "1024m"
            }
        }
    }

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'com.google.code.gson:gson:2.8.9'
    implementation 'com.squareup:otto:1.3.8'
    api 'com.auth0.android:auth0:2.10.2'
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.hamcrest:hamcrest-library:2.2'
    testImplementation 'org.robolectric:robolectric:4.4'
    testImplementation 'org.mockito:mockito-core:3.7.7'
    testImplementation 'com.squareup.okhttp3:okhttp:4.12.0'
    testImplementation 'com.squareup.okhttp3:mockwebserver:4.12.0'
    testImplementation 'com.squareup.okhttp3:okhttp-tls:4.12.0'
    testImplementation 'com.jayway.awaitility:awaitility:1.7.0'
    testImplementation 'androidx.test.espresso:espresso-intents:3.4.0'
}


================================================
FILE: lib/lint.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="IconDuplicates">
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_evernote.png" />
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_evernote_sandbox.png" />
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_salesforce.png" />
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_salesforce_community.png" />
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_salesforce_sandbox.png" />
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_thecity.png" />
        <ignore path="src/main/res/drawable-hdpi/com_auth0_lock_ic_social_thecity_sandbox.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_evernote.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_evernote_sandbox.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_salesforce.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_salesforce_community.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_salesforce_sandbox.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_thecity.png" />
        <ignore path="src/main/res/drawable-mdpi/com_auth0_lock_ic_social_thecity_sandbox.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_evernote.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_evernote_sandbox.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_salesforce.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_salesforce_community.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_salesforce_sandbox.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_thecity.png" />
        <ignore path="src/main/res/drawable-xhdpi/com_auth0_lock_ic_social_thecity_sandbox.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_evernote.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_evernote_sandbox.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_salesforce.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_salesforce_community.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_salesforce_sandbox.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_thecity.png" />
        <ignore path="src/main/res/drawable-xxhdpi/com_auth0_lock_ic_social_thecity_sandbox.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_evernote.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_evernote_sandbox.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_salesforce.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_salesforce_community.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_salesforce_sandbox.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_thecity.png" />
        <ignore path="src/main/res/drawable-xxxhdpi/com_auth0_lock_ic_social_thecity_sandbox.png" />
    </issue>
</lint>


================================================
FILE: lib/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/nikolaseu/android-sdk-macosx/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: lib/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.auth0.android.lock">

    <uses-permission android:name="android.permission.INTERNET" />

    <application>
        <!--Auth0 WebAuthProvider-->
        <activity
            android:name="com.auth0.android.provider.RedirectActivity"
            android:exported="true"
            tools:node="replace">
            <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="${auth0Domain}"
                    android:pathPrefix="/android/${applicationId}/callback"
                    android:scheme="${auth0Scheme}" />
            </intent-filter>
        </activity>
        <!--Auth0 WebAuthProvider End-->

        <!--Auth0 Lock-->
        <activity
            android:name="com.auth0.android.lock.LockActivity"
            android:exported="false"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/Lock.Theme"/>
        <!--Auth0 Lock End-->

        <!--Auth0 PasswordlessLock-->
        <activity
            android:name="com.auth0.android.lock.PasswordlessLockActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/Lock.Theme">
            <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="${auth0Domain}"
                    android:pathPrefix="/android/${applicationId}/email"
                    android:scheme="https" />

                <data
                    android:host="${auth0Domain}"
                    android:pathPrefix="/android/${applicationId}/sms"
                    android:scheme="https" />
            </intent-filter>
        </activity>
        <!--Auth0 PasswordlessLock End-->

        <!--Auth0 Lock Passwordless SMS Country Code Selection-->
        <activity
            android:name="com.auth0.android.lock.CountryCodeActivity"
            android:exported="false"
            android:theme="@style/Lock.Theme.ActionBar" />
        <!--Auth0 Lock Passwordless SMS Country Code Selection-->
    </application>

</manifest>


================================================
FILE: lib/src/main/assets/com_auth0_lock_passwordless_countries.json
================================================
{"BY":"+375","SG":"+65","TJ":"+992","BB":"+1 246","ER":"+291","IM":"+44","ID":"+62","LS":"+266","PW":"+680","MF":"+590","MM":"+95","MZ":"+258","BA":"+387","BR":"+55","CM":"+237","TL":"+670","AT":"+43","MG":"+261","MH":"+692","AR":"+54","NP":"+977","KI":"+686","NO":"+47","MO":"+853","SB":"+677","SC":"+248","KY":"+ 345","UZ":"+998","SR":"+597","KP":"+850","AI":"+1 264","AG":"+1268","MU":"+230","MN":"+976","LY":"+218","IT":"+39","SL":"+232","TM":"+993","GF":"+594","GG":"+44","SN":"+221","LA":"+856","HN":"+504","AD":"+376","UG":"+256","SK":"+421","UA":"+380","BM":"+1 441","SI":"+386","CH":"+41","AX":"+358","DO":"+1 849","GW":"+245","RS":"+381","TC":"+1 649","VU":"+678","LV":"+371","IE":"+353","CG":"+242","DJ":"+253","GY":"+595","PH":"+63","GM":"+220","NU":"+683","ES":"+34","MP":"+1 670","BJ":"+229","CA":"+1","CO":"+57","GR":"+30","SD":"+249","PM":"+508","CF":"+236","HR":"+385","MA":"+212","DM":"+1 767","NF":"+672","MK":"+389","PT":"+351","TR":"+90","SV":"+503","LI":"+423","GT":"+502","TT":"+1 868","BN":"+673","ST":"+239","KZ":"+7 7","PE":"+51","KE":"+254","BS":"+1 242","AF":"+93","TD":"+235","AW":"+297","LU":"+352","TZ":"+255","PS":"+970","ZA":"+27","GD":"+1 473","NI":"+505","BZ":"+501","GL":"+299","HT":"+509","CC":"+61","VI":"+1 340","TG":"+228","GA":"+241","ZM":"+260","TK":"+690","KR":"+82","ML":"+223","RE":"+262","NR":"+674","GH":"+233","IS":"+354","CU":"+53","AS":"+1 684","TN":"+216","IN":"+91","PA":"+507","IQ":"+964","KW":"+965","MY":"+60","NL":"+31","EG":"+20","PG":"+675","HK":"+852","SJ":"+47","VE":"+58","OM":"+968","YT":"+262","BL":"+590","DZ":"+213","BE":"+32","TW":"+886","PF":"+689","GI":"+350","ME":"+382","CZ":"+420","BT":"+975","MQ":"+596","SZ":"+268","VA":"+379","RO":"+40","MW":"+265","JE":"+44","AZ":"+994","DE":"+49","MD":"+373","AO":"+244","JM":"+1 876","CX":"+61","JO":"+962","MS":"+1664","KG":"+996","SM":"+378","LK":"+94","IR":"+98","SO":"+252","FI":"+358","TO":"+676","SA":"+966","MR":"+222","LB":"+961","MV":"+960","NG":"+234","AM":"+374","AU":"+61","DK":"+45","VG":"+1 284","NC":"+687","GU":"+1 671","BI":"+257","MX":"+52","JP":"+81","UY":"+598","CY":"+357","LR":"+231","US":"+1","KM":"+269","VC":"+1 784","CN":"+86","KH":"+855","PN":"+872","LT":"+370","TH":"+66","TV":"+688","YE":"+967","BO":"+591","BD":"+880","NZ":"+64","ET":"+251","BG":"+359","CV":"+238","IO":"+246","NE":"+227","EE":"+372","GE":"+995","LC":"+1 758","AN":"+599","GB":"+44","BH":"+973","GN":"+224","GP":"+590","MT":"+356","AL":"+355","WS":"+685","CI":"+225","VN":"+84","SY":"+963","CR":"+506","IL":"+972","RW":"+250","FJ":"+679","RU":"+7","MC":"+377","HU":"+36","NA":"+264","ZW":"+263","PY":"+595","CL":"+56","BW":"+267","PL":"+48","FR":"+33","PK":"+92","PR":"+1 939","SE":"+46","FK":"+500","KN":"+1 869","AE":"+971","QA":"+974","BF":"+226","WF":"+681","CK":"+682","CD":"+243","SH":"+290","EC":"+593","GQ":"+240","GS":"+500","FM":"+691","FO":"+298"}


================================================
FILE: lib/src/main/java/com/auth0/android/lock/Auth0Parcelable.java
================================================
/*
 * Auth0Parcelable.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;

import android.os.Parcel;
import android.os.Parcelable;

import androidx.annotation.NonNull;

import com.auth0.android.Auth0;
import com.auth0.android.util.Auth0UserAgent;


/**
 * This class wraps a {@link Auth0} to make it Parcelable
 */
public class Auth0Parcelable implements Parcelable {

    private static final double WITHOUT_DATA = 0x00;
    private static final double WITH_DATA = 0x01;
    private final Auth0 auth0;

    public Auth0Parcelable(@NonNull Auth0 auth0) {
        this.auth0 = auth0;
    }

    @NonNull
    public Auth0 getAuth0() {
        return auth0;
    }

    // PARCELABLE
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeString(auth0.getClientId());
        dest.writeString(auth0.getDomainUrl());
        dest.writeString(auth0.getConfigurationUrl());
        //FIXME: Find a way to pass the NetworkingClient implementation
        dest.writeString(auth0.getAuth0UserAgent().getName());
        dest.writeString(auth0.getAuth0UserAgent().getVersion());
        dest.writeString(auth0.getAuth0UserAgent().getLibraryVersion());
    }

    public static final Parcelable.Creator<Auth0Parcelable> CREATOR
            = new Parcelable.Creator<Auth0Parcelable>() {
        public Auth0Parcelable createFromParcel(Parcel in) {
            return new Auth0Parcelable(in);
        }

        public Auth0Parcelable[] newArray(int size) {
            return new Auth0Parcelable[size];
        }
    };

    private Auth0Parcelable(@NonNull Parcel in) {
        String clientId = in.readString();
        String domain = in.readString();
        String configurationDomain = in.readString();
        String telemetryName = in.readString();
        String telemetryVersion = in.readString();
        String telemetryLibraryVersion = in.readString();

        auth0 = new Auth0(clientId, domain, configurationDomain);
        Auth0UserAgent userAgent = new Auth0UserAgent(telemetryName, telemetryVersion, telemetryLibraryVersion);
        auth0.setAuth0UserAgent(userAgent);
    }
}


================================================
FILE: lib/src/main/java/com/auth0/android/lock/AuthButtonSize.java
================================================
/*
 * SocialButtonStyle.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;

import androidx.annotation.IntDef;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import static com.auth0.android.lock.AuthButtonSize.BIG;
import static com.auth0.android.lock.AuthButtonSize.SMALL;
import static com.auth0.android.lock.AuthButtonSize.UNSPECIFIED;

@IntDef({UNSPECIFIED, BIG, SMALL})
@Retention(RetentionPolicy.SOURCE)
public @interface AuthButtonSize {
    int UNSPECIFIED = 0;
    int BIG = 1;
    int SMALL = 2;
}

================================================
FILE: lib/src/main/java/com/auth0/android/lock/AuthenticationCallback.java
================================================
/*
 * LockAuthenticationCallback.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;

import android.content.Intent;

import androidx.annotation.NonNull;

import com.auth0.android.authentication.AuthenticationException;
import com.auth0.android.result.Credentials;

import java.util.Date;


/**
 * Simple implementation of the Callback used by Lock to notify the user of execution results.
 * It can handle and notify of Authentication and Canceled events.
 */
public abstract class AuthenticationCallback implements LockCallback {

    /**
     * Called when the authentication flow finished successfully.
     *
     * @param credentials with the tokens.
     */
    public abstract void onAuthentication(@NonNull Credentials credentials);

    @Override
    public void onEvent(@LockEvent int event, @NonNull Intent data) {
        if (data.hasExtra(Constants.EXCEPTION_EXTRA)) {
            onError((AuthenticationException) data.getSerializableExtra(Constants.EXCEPTION_EXTRA));
            return;
        }
        if (event == LockEvent.AUTHENTICATION) {
            Credentials credentials = extractCredentials(data);
            onAuthentication(credentials);
        } else if (event == LockEvent.CANCELED) {
            onError(new AuthenticationException("a0.authentication_canceled", "The user pressed back"));
        }
    }

    /**
     * Extracts the Authentication data from the intent data.
     *
     * @param data the intent received at the end of the login process.
     */
    private Credentials extractCredentials(Intent data) {
        String idToken = data.getStringExtra(Constants.ID_TOKEN_EXTRA);
        String accessToken = data.getStringExtra(Constants.ACCESS_TOKEN_EXTRA);
        String tokenType = data.getStringExtra(Constants.TOKEN_TYPE_EXTRA);
        String refreshToken = data.getStringExtra(Constants.REFRESH_TOKEN_EXTRA);
        Date expiresAt = (Date) data.getSerializableExtra(Constants.EXPIRES_AT_EXTRA);
        String scope = data.getStringExtra(Constants.SCOPE_EXTRA);
        return new Credentials(idToken, accessToken, tokenType, refreshToken, expiresAt, scope);
    }
}


================================================
FILE: lib/src/main/java/com/auth0/android/lock/Constants.java
================================================
/*
 * Constants.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;

abstract class Constants {
    static final String LIBRARY_NAME = "Lock.Android";

    static final String OPTIONS_EXTRA = "com.auth0.android.lock.key.Options";

    static final String CONNECTION_SCOPE_KEY = "connection_scope";

    static final String AUTHENTICATION_ACTION = "com.auth0.android.lock.action.Authentication";
    static final String SIGN_UP_ACTION = "com.auth0.android.lock.action.SignUp";
    static final String CANCELED_ACTION = "com.auth0.android.lock.action.Canceled";
    static final String INVALID_CONFIGURATION_ACTION = "com.auth0.android.lock.action.InvalidConfiguration";

    static final String EXCEPTION_EXTRA = "com.auth0.android.lock.extra.Exception";
    static final String ERROR_EXTRA = "com.auth0.android.lock.extra.Error";
    static final String ID_TOKEN_EXTRA = "com.auth0.android.lock.extra.IdToken";
    static final String ACCESS_TOKEN_EXTRA = "com.auth0.android.lock.extra.AccessToken";
    static final String TOKEN_TYPE_EXTRA = "com.auth0.android.lock.extra.TokenType";
    static final String REFRESH_TOKEN_EXTRA = "com.auth0.android.lock.extra.RefreshToken";
    static final String EXPIRES_AT_EXTRA = "com.auth0.android.lock.extra.ExpiresAt";
    static final String SCOPE_EXTRA = "com.auth0.android.lock.extra.Scope";
    static final String EMAIL_EXTRA = "com.auth0.android.lock.extra.Email";
    static final String USERNAME_EXTRA = "com.auth0.android.lock.extra.Username";
}


================================================
FILE: lib/src/main/java/com/auth0/android/lock/CountryCodeActivity.java
================================================
/*
 * CountryCodeActivity.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;
/*
 * CountryCodeActivity.java
 *
 * Copyright (c) 2015 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */


import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import com.auth0.android.lock.adapters.Country;
import com.auth0.android.lock.adapters.CountryAdapter;
import com.auth0.android.lock.utils.LoadCountriesTask;

import java.util.ArrayList;
import java.util.List;

public class CountryCodeActivity extends AppCompatActivity {

    public static final String COUNTRY_CODE_EXTRA = "COUNTRY_CODE";
    public static final String COUNTRY_DIAL_CODE_EXTRA = "COUNTRY_DIAL_CODE";

    private static final String TAG = CountryCodeActivity.class.getName();

    private static LoadCountriesTask task;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.com_auth0_lock_passwordless_activity_country_code);

        final ActionBar bar = getSupportActionBar();
        if (bar != null) {
            //If actionBar is present, remove it as the custom search view is already in the layout
            bar.hide();
        }

        final EditText searchText = findViewById(R.id.com_auth0_lock_passwordless_sms_search_country);
        final ListView listView = findViewById(R.id.com_auth0_lock_passwordless_sms_country_code_list);
        List<Country> countryList = new ArrayList<>();
        CountryAdapter countryAdapter = new CountryAdapter(this, countryList);
        listView.setAdapter(countryAdapter);

        searchText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.v(TAG, String.format("Filtering with string (%s)", s));
                countryAdapter.getFilter().filter(s);
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
        listView.setOnItemClickListener((parent, view, position, id) -> {
            Country country = countryAdapter.getItem(position);
            Intent data = new Intent();
            data.putExtra(COUNTRY_CODE_EXTRA, country.getIsoCode());
            data.putExtra(COUNTRY_DIAL_CODE_EXTRA, country.getDialCode());
            setResult(RESULT_OK, data);
            finish();
        });

        task = new LoadCountriesTask() {
            @Override
            protected void onPostExecute(List<Country> result) {
                task = null;
                countryList.addAll(result);
                countryAdapter.notifyDataSetChanged();
            }
        };
        task.execute(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (task != null) {
            Log.v(TAG, "Task was cancelled");
            task.cancel(true);
        }
    }

}


================================================
FILE: lib/src/main/java/com/auth0/android/lock/InitialScreen.java
================================================
/*
 * InitialScreen.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;

import androidx.annotation.IntDef;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import static com.auth0.android.lock.InitialScreen.FORGOT_PASSWORD;
import static com.auth0.android.lock.InitialScreen.LOG_IN;
import static com.auth0.android.lock.InitialScreen.SIGN_UP;

@IntDef({LOG_IN, SIGN_UP, FORGOT_PASSWORD})
@Retention(RetentionPolicy.SOURCE)
public @interface InitialScreen {
    int LOG_IN = 0;
    int SIGN_UP = 1;
    int FORGOT_PASSWORD = 2;
}

================================================
FILE: lib/src/main/java/com/auth0/android/lock/Lock.java
================================================
/*
 * Lock.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import com.auth0.android.Auth0;
import com.auth0.android.authentication.AuthenticationException;
import com.auth0.android.lock.LockCallback.LockEvent;
import com.auth0.android.lock.internal.configuration.Options;
import com.auth0.android.lock.internal.configuration.Theme;
import com.auth0.android.lock.provider.AuthResolver;
import com.auth0.android.lock.utils.SignUpField;
import com.auth0.android.provider.AuthHandler;
import com.auth0.android.provider.CustomTabsOptions;
import com.auth0.android.util.Auth0UserAgent;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Lock {

    private static final String TAG = Lock.class.getSimpleName();
    private final LockCallback callback;
    private final Options options;

    /**
     * Listens to LockActivity broadcasts and fires the correct action on the LockCallback.
     */
    private final BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent data) {
            processEvent(data);
        }
    };

    private Lock(@NonNull Options options, @NonNull LockCallback callback) {
        this.options = options;
        this.callback = callback;
    }

    /**
     * Lock.Options holds the configuration used in the Auth0 Authentication API.
     *
     * @return the Lock.Options for this Lock instance.
     */
    @NonNull
    public Options getOptions() {
        return options;
    }

    /**
     * Creates a new Lock.Builder instance with the given account and callback.
     *
     * @param account  details to use against the Auth0 Authentication API.
     * @param callback that will receive the authentication results.
     * @return a new Lock.Builder instance.
     */
    @NonNull
    public static Builder newBuilder(@Nullable Auth0 account, @NonNull LockCallback callback) {
        return new Lock.Builder(account, callback);
    }

    /**
     * Creates a new Lock.Builder instance with the given callback. The account information
     * will be retrieved from the String resources file (strings.xml) using
     * the keys 'com_auth0_client_id' and 'com_auth0_domain'.
     *
     * @param callback that will receive the authentication results.
     * @return a new Lock.Builder instance.
     */
    @NonNull
    public static Builder newBuilder(@NonNull LockCallback callback) {
        return newBuilder(null, callback);
    }

    /**
     * Builds a new intent to launch LockActivity with the previously configured options
     *
     * @param context a valid Context
     * @return the intent to which the user has to call startActivity or startActivityForResult
     */
    @NonNull
    public Intent newIntent(@NonNull Context context) {
        Intent lockIntent = new Intent(context, LockActivity.class);
        lockIntent.putExtra(Constants.OPTIONS_EXTRA, options);
        lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        return lockIntent;
    }

    /**
     * This method ensures proper Lock's lifecycle handling. Must be called from the class
     * holding the Lock instance whenever you're done using it. i.e. in the Activity's onDestroy method.
     *
     * @param context a valid Context
     */
    public void onDestroy(@NonNull Context context) {
        LocalBroadcastManager.getInstance(context).unregisterReceiver(this.receiver);
    }

    private void initialize(@NonNull Context context) {
        LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
        lbm.unregisterReceiver(this.receiver);
        IntentFilter filter = new IntentFilter();
        filter.addAction(Constants.AUTHENTICATION_ACTION);
        filter.addAction(Constants.SIGN_UP_ACTION);
        filter.addAction(Constants.CANCELED_ACTION);
        filter.addAction(Constants.INVALID_CONFIGURATION_ACTION);
        lbm.registerReceiver(this.receiver, filter);
    }

    private void processEvent(@NonNull Intent data) {
        if (data.hasExtra(Constants.EXCEPTION_EXTRA)) {
            callback.onError((AuthenticationException) data.getSerializableExtra(Constants.EXCEPTION_EXTRA));
            return;
        }
        String action = data.getAction();
        switch (action) {
            case Constants.AUTHENTICATION_ACTION:
                Log.v(TAG, "AUTHENTICATION action received in our BroadcastReceiver");
                callback.onEvent(LockEvent.AUTHENTICATION, data);
                break;
            case Constants.SIGN_UP_ACTION:
                Log.v(TAG, "SIGN_UP action received in our BroadcastReceiver");
                callback.onEvent(LockEvent.SIGN_UP, data);
                break;
            case Constants.CANCELED_ACTION:
                Log.v(TAG, "CANCELED action received in our BroadcastReceiver");
                callback.onEvent(LockEvent.CANCELED, new Intent());
                break;
            case Constants.INVALID_CONFIGURATION_ACTION:
                Log.v(TAG, "INVALID_CONFIGURATION_ACTION action received in our BroadcastReceiver");
                callback.onError(new AuthenticationException("a0.invalid_configuration", data.getStringExtra(Constants.ERROR_EXTRA)));
                break;
        }
    }

    /**
     * Helper Builder to generate the Lock.Options to use on the Auth0 Authentication.
     */
    @SuppressWarnings({"UnusedReturnValue"})
    public static class Builder {
        private static final String TAG = Builder.class.getSimpleName();
        private final Options options;
        private final LockCallback callback;

        /**
         * Creates a new Lock.Builder instance with the given account and callback.
         *
         * @param account  details to use against the Auth0 Authentication API.
         * @param callback that will receive the authentication results.
         */
        public Builder(@Nullable Auth0 account, @NonNull LockCallback callback) {
            this.callback = callback;
            options = new Options();
            options.setAccount(account);
        }

        /**
         * Finishes the construction of the Lock.Options and generates a new Lock instance
         * with those Lock.Options.
         *
         * @param context a valid Context
         * @return a new Lock instance configured as in the Builder.
         */
        @NonNull
        public Lock build(@NonNull Context context) {
            if (options.getAccount() == null) {
                Log.w(TAG, "com.auth0.android.Auth0 account details not defined. Trying to create it from the String resources.");
                try {
                    options.setAccount(new Auth0(context));
                } catch (IllegalArgumentException e) {
                    throw new IllegalStateException("Missing Auth0 account information.", e);
                }
            }
            if (callback == null) {
                Log.e(TAG, "You need to specify the callback object to receive the Authentication result.");
                throw new IllegalStateException("Missing callback.");
            }
            if (!options.allowForgotPassword() && !options.allowLogIn() && !options.allowSignUp()) {
                throw new IllegalStateException("You disabled all the Lock screens (LogIn/SignUp/ForgotPassword). Please enable at least one.");
            }
            if (options.initialScreen() == InitialScreen.LOG_IN && !options.allowLogIn()) {
                throw new IllegalStateException("You chose LOG_IN as the initial screen but you have also disabled that screen.");
            }
            if (options.initialScreen() == InitialScreen.SIGN_UP && !options.allowSignUp()) {
                throw new IllegalStateException("You chose SIGN_UP as the initial screen but you have also disabled that screen.");
            }
            if (options.initialScreen() == InitialScreen.FORGOT_PASSWORD && !options.allowForgotPassword()) {
                throw new IllegalStateException("You chose FORGOT_PASSWORD as the initial screen but you have also disabled that screen.");
            }

            Log.v(TAG, "Lock instance created");

            Auth0UserAgent lockUserAgent = new Auth0UserAgent(Constants.LIBRARY_NAME, BuildConfig.VERSION_NAME, com.auth0.android.auth0.BuildConfig.VERSION_NAME);
            options.getAccount().setAuth0UserAgent(lockUserAgent);

            final Lock lock = new Lock(options, callback);
            lock.initialize(context);
            return lock;
        }

        /**
         * Whether the LockActivity can be closed when pressing the Back key or not.
         *
         * @param closable or not. By default, the LockActivity is not closable.
         * @return the current builder instance
         */
        @NonNull
        public Builder closable(boolean closable) {
            options.setClosable(closable);
            return this;
        }

        /**
         * Customize Lock's appearance.
         *
         * @param theme to use.
         * @return the current Builder instance
         */
        private Builder withTheme(@NonNull Theme theme) {
            options.withTheme(theme);
            return this;
        }

        /**
         * Additional Authentication parameters can be set to use with different Identity Providers.
         *
         * @param authenticationParameters a non-null Map containing the parameters as Key-Values
         * @return the current builder instance
         */
        @NonNull
        public Builder withAuthenticationParameters(@NonNull Map<String, String> authenticationParameters) {
            options.setAuthenticationParameters(new HashMap<>(authenticationParameters));
            return this;
        }

        /**
         * Locally filters the Auth0 Connections that are shown in the login widgets.
         *
         * @param connections a non-null List containing the allowed Auth0 Connections.
         * @return the current builder instance
         */
        @NonNull
        public Builder allowedConnections(@NonNull List<String> connections) {
            options.setConnections(connections);
            return this;
        }

        /**
         * Username style to use in the Login and Sign Up text fields. Defaults to the Dashboard
         * configuration of "requires_username".
         *
         * @param style a valid UsernameStyle.
         * @return the current builder instance
         */
        @NonNull
        public Builder withUsernameStyle(@UsernameStyle int style) {
            options.setUsernameStyle(style);
            return this;
        }

        /**
         * Authentication Style to use with the given strategy or connection name. It will override any lock defaults.
         *
         * @param connectionName to use this style with
         * @param style          a valid Style with the Auth0.BackgroundColor, Auth0.Logo and Auth0.Name values defined.
         * @return the current builder instance
         */
        @NonNull
        public Builder withAuthStyle(@NonNull String connectionName, @StyleRes int style) {
            options.withAuthStyle(connectionName, style);
            return this;
        }

        /**
         * Decide which screen is going to show first when launching the Lock Activity.
         *
         * @param screen a valid InitialScreen.
         * @return the current builder instance
         */
        @NonNull
        public Builder initialScreen(@InitialScreen int screen) {
            options.setInitialScreen(screen);
            return this;
        }

        /**
         * Whether to show the Log In screen or not. It can be enabled/disabled locally, regardless the Dashboard configuration.
         *
         * @param allow whether to allow or not the login screen.
         * @return the current builder instance
         */
        @NonNull
        public Builder allowLogIn(boolean allow) {
            options.setAllowLogIn(allow);
            return this;
        }

        /**
         * Whether to show the Sign Up screen or not. It can be enabled/disabled locally, regardless the Dashboard configuration.
         *
         * @param allow whether to allow or not the sign up screen.
         * @return the current builder instance
         */
        @NonNull
        public Builder allowSignUp(boolean allow) {
            options.setAllowSignUp(allow);
            return this;
        }

        /**
         * Whether to show the Forgot Password screen or not. It can be enabled/disabled locally, regardless the Dashboard configuration.
         *
         * @param allow whether to allow or not the forgot password screen.
         * @return the current builder instance
         */
        @NonNull
        public Builder allowForgotPassword(boolean allow) {
            options.setAllowForgotPassword(allow);
            return this;
        }

        /**
         * Whether to show the password visibility toggle or not. Defaults to true
         *
         * @param allow whether to allow the user to toggle between showing or hiding the password or not.
         * @return the current builder instance
         */
        @NonNull
        public Builder allowShowPassword(boolean allow) {
            options.setAllowShowPassword(allow);
            return this;
        }

        /**
         * Whether if the submit button will display a label or just an icon. By default it will use the label.
         * If {@link #hideMainScreenTitle(boolean)} is set to true this setting is ignored and the submit button will use label.
         *
         * @param useLabeledSubmitButton or icon.
         * @return the current builder instance
         */
        @NonNull
        public Builder useLabeledSubmitButton(boolean useLabeledSubmitButton) {
            options.setUseLabeledSubmitButton(useLabeledSubmitButton);
            return this;
        }

        /**
         * Control the visibility of the header's Title on the main screen, this is for Log In and Sign Up. By default it will show the header's Title on the main screen.
         *
         * @param hideMainScreenTitle if it should show or hide the header's Title on the main screen.
         * @return the current builder instance
         */
        @NonNull
        public Builder hideMainScreenTitle(boolean hideMainScreenTitle) {
            options.setHideMainScreenTitle(hideMainScreenTitle);
            return this;
        }

        /**
         * Change the connection name to use on the Database authentication flow.
         * Defaults to the first Database connection found.
         *
         * @param connectionName Must exist in the Application configuration on the Dashboard.
         * @return the current builder instance
         */
        @NonNull
        public Builder setDefaultDatabaseConnection(@NonNull String connectionName) {
            options.useDatabaseConnection(connectionName);
            return this;
        }

        /**
         * Enterprise connections based on 'ad', 'adfs' and 'waad' strategies can log their
         * users in from within the Lock widget using their email and password. This is known as
         * Active Authentication.
         * By whitelisting the connections here, the Universal Login Page is used instead and the
         * login is delegated to the browser application.
         * Enterprise connections allowed for this client will use Active Authentication by default.
         *
         * @param connections the list of 'ad', 'adfs', or 'waad' enterprise connections that will use Web Authentication instead.
         * @return the current builder instance
         */
        @NonNull
        public Builder enableEnterpriseWebAuthenticationFor(@NonNull List<String> connections) {
            options.setEnterpriseConnectionsUsingWebForm(connections);
            return this;
        }

        /**
         * Whether to login after a successful sign up callback. Defaults to true.
         *
         * @param login after sign up or not
         * @return the current builder instance
         */
        @NonNull
        public Builder loginAfterSignUp(boolean login) {
            options.setLoginAfterSignUp(login);
            return this;
        }

        /**
         * Uses the given AuthHandlers to query for AuthProviders on a new authentication request.
         *
         * @param handlers that Lock will query for AuthProviders.
         * @return the current builder instance
         */
        @NonNull
        public Builder withAuthHandlers(@NonNull AuthHandler... handlers) {
            AuthResolver.setAuthHandlers(Arrays.asList(handlers));
            return this;
        }

        /**
         * Displays the specified custom fields during sign up. If the amount of visible fields
         * is greater than the value set in {@link #withVisibleSignUpFieldsThreshold(int)}, all
         * of them will be shown on a separate screen after the user clicks the sign up button.
         * Each field must have a unique key. Fields with repeated keys will be removed.
         *
         * @param customFields the custom fields to display in the sign up flow.
         * @return the current builder instance
         */
        @NonNull
        public Builder withSignUpFields(@NonNull List<? extends SignUpField> customFields) {
            final List<SignUpField> withoutDuplicates = removeDuplicatedKeys(customFields);
            options.setSignUpFields(withoutDuplicates);
            return this;
        }

        /**
         * Defines the threshold at which all of the visible sign-up fields would be shown on
         * a secondary screen instead of the initial one after clicking the sign-up button.
         * Has a default value of 2 visible sign-up fields.
         *
         * @param threshold the threshold at which all the visible sign-up fields would be
         *                  shown on a separate screen.
         * @return the current builder instance
         */
        @NonNull
        public Builder withVisibleSignUpFieldsThreshold(int threshold) {
            options.setVisibleSignUpFieldsThreshold(threshold);
            return this;
        }

        /**
         * Sets the Scope to request when performing the Authentication.
         *
         * @param scope to use in the Authentication.
         * @return the current builder instance
         */
        @NonNull
        public Builder withScope(@NonNull String scope) {
            options.withScope(scope);
            return this;
        }

        /**
         * Sets the Audience or API Identifier to request access to when performing the Authentication.
         *
         * @param audience to use in the Authentication.
         * @return the current builder instance
         */
        @NonNull
        public Builder withAudience(@NonNull String audience) {
            options.withAudience(audience);
            return this;
        }

        /**
         * Specify style and other additional configuration for when the Web Auth flow is used with Custom Tabs.
         *
         * @param customTabsOptions to use in the Web Auth flow.
         * @return the current builder instance
         */
        @NonNull
        public Builder withCustomTabsOptions(@NonNull CustomTabsOptions customTabsOptions) {
            options.withCustomTabsOptions(customTabsOptions);
            return this;
        }

        /**
         * Specify a custom Scheme for the redirect URL used when executing a Web Authentication flow
         * via the Universal Login page.
         * Default redirect url scheme is 'https'.
         *
         * @param scheme to use in the Web Auth redirect uri.
         * @return the current builder instance
         */
        @NonNull
        public Builder withScheme(@NonNull String scheme) {
            options.withScheme(scheme);
            return this;
        }

        /**
         * Choose a custom Privacy Policy URL to access when the user clicks the link on the Sign Up form.
         * The default value is 'https://auth0.com/privacy'
         *
         * @param url a valid url to use.
         * @return the current builder instance
         */
        @NonNull
        public Builder setPrivacyURL(@NonNull String url) {
            options.setPrivacyURL(url);
            return this;
        }

        /**
         * Choose a custom Terms of Service URL to access when the user clicks the link on the Sign Up form.
         * The default value is 'https://auth0.com/terms'
         *
         * @param url a valid url to use.
         * @return the current builder instance
         */
        @NonNull
        public Builder setTermsURL(@NonNull String url) {
            options.setTermsURL(url);
            return this;
        }

        /**
         * Sets the url of your support page for your application that will be used when an error occurs and Lock is unable to handle it. In this case it will show an error screen and if there is a support url will also show a button to open that page in the browser.
         *
         * @param url to your support page or where your customers can request assistance. By default no page is set.
         * @return the current builder instance
         */
        @NonNull
        public Builder setSupportURL(@NonNull String url) {
            options.setSupportURL(url);
            return this;
        }

        /**
         * Prompts the user to accept the Privacy Policy and Terms of Service before signing up.
         * The default value is false.
         *
         * @param mustAcceptTerms whether the user needs to accept the terms before sign up or not.
         * @return the current builder instance
         */
        @NonNull
        public Builder setMustAcceptTerms(boolean mustAcceptTerms) {
            options.setMustAcceptTerms(mustAcceptTerms);
            return this;
        }

        /**
         * Displays the Privacy Policy and Terms of Service footer on the Sign Up screen.
         * Note: The footer will always be shown if the mustAcceptTerms flag has been enabled.
         * The default value is true.
         *
         * @param showTerms whether the Terms of Service are displayed.
         * @return the current builder instance
         */
        @NonNull
        public Builder setShowTerms(boolean showTerms) {
            options.setShowTerms(showTerms);
            return this;
        }

        /**
         * Sets the Connection Scope to request when performing an Authentication with the given Connection.
         *
         * @param connectionName to which specify the scopes.
         * @param scope          recognized by this specific authentication provider.
         * @return the current builder instance
         */
        @NonNull
        public Builder withConnectionScope(@NonNull String connectionName, @NonNull String... scope) {
            StringBuilder sb = new StringBuilder();
            for (String s : scope) {
                sb.append(s.trim()).append(",");
            }
            if (sb.length() > 0) {
                sb.deleteCharAt(sb.length() - 1);
                options.withConnectionScope(connectionName, sb.toString());
            }
            return this;
        }

        private List<SignUpField> removeDuplicatedKeys(List<? extends SignUpField> customFields) {
            int originalSize = customFields.size();
            final List<SignUpField> withoutDuplicates = new ArrayList<>();

            Set<String> keySet = new HashSet<>();
            for (SignUpField field : customFields) {
                if (!keySet.contains(field.getKey())) {
                    withoutDuplicates.add(field);
                }
                keySet.add(field.getKey());
            }

            if (originalSize != withoutDuplicates.size()) {
                Log.w(TAG, "Some of the Custom Fields had a duplicate key and have been removed.");
            }
            return withoutDuplicates;
        }
    }
}


================================================
FILE: lib/src/main/java/com/auth0/android/lock/LockActivity.java
================================================
/*
 * LockActivity.java
 *
 * Copyright (c) 2016 Auth0 (http://auth0.com)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.auth0.android.lock;


import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Intent;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import com.auth0.android.Auth0;
import com.auth0.android.Auth0Exception;
import com.auth0.android.authentication.AuthenticationAPIClient;
import com.auth0.android.authentication.AuthenticationException;
import com.auth0.android.authentication.ParameterBuilder;
import com.auth0.android.callback.AuthenticationCallback;
import com.auth0.android.callback.Callback;
import com.auth0.android.lock.errors.AuthenticationError;
import com.auth0.android.lock.errors.LoginErrorMessageBuilder;
import com.auth0.android.lock.errors.SignUpErrorMessageBuilder;
import com.auth0.android.lock.events.DatabaseChangePasswordEvent;
import com.auth0.android.lock.events.DatabaseLoginEvent;
import com.auth0.android.lock.events.DatabaseSignUpEvent;
import com.auth0.android.lock.events.FetchApplicationEvent;
import com.auth0.android.lock.events.LockMessageEvent;
import com.auth0.android.lock.events.OAuthLoginEvent;
import com.auth0.android.lock.internal.configuration.ApplicationFetcher;
import com.auth0.android.lock.internal.configuration.Configuration;
import com.auth0.android.lock.internal.configuration.Connection;
import com.auth0.android.lock.internal.configuration.Options;
import com.auth0.android.lock.provider.AuthResolver;
import com.auth0.android.lock.views.ClassicLockView;
import com.auth0.android.provider.AuthCallback;
import com.auth0.android.provider.AuthProvider;
import com.auth0.android.provider.WebAuthProvider;
import com.auth0.android.request.AuthenticationRequest;
import com.auth0.android.request.SignUpRequest;
import com.auth0.android.result.Challenge;
import com.auth0.android.result.Credentials;
import com.auth0.android.result.DatabaseUser;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressLint("GoogleAppIndexingApiWar
Download .txt
gitextract_04ecnqqv/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── Bug Report.yml
│   │   ├── Feature Request.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   ├── get-prerelease/
│   │   │   └── action.yml
│   │   ├── get-release-notes/
│   │   │   └── action.yml
│   │   ├── get-version/
│   │   │   └── action.yml
│   │   ├── maven-publish/
│   │   │   └── action.yml
│   │   ├── release-create/
│   │   │   └── action.yml
│   │   ├── setup/
│   │   │   └── action.yml
│   │   └── tag-exists/
│   │       └── action.yml
│   ├── dependabot.yml
│   ├── stale.yml
│   └── workflows/
│       ├── codeql.yml
│       ├── java-release.yml
│       ├── release.yml
│       ├── sca_scan.yml
│       └── test.yml
├── .gitignore
├── .shiprc
├── .version
├── CHANGELOG.md
├── EXAMPLES.md
├── LICENSE.md
├── MIGRATION_GUIDE.md
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   ├── release-test.jks
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── auth0/
│           │           └── android/
│           │               └── lock/
│           │                   └── app/
│           │                       └── DemoActivity.kt
│           └── res/
│               ├── layout/
│               │   └── demo_activity.xml
│               └── values/
│                   ├── auth0.xml
│                   ├── colors.xml
│                   ├── strings.xml
│                   └── styles.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib/
│   ├── .gitignore
│   ├── build.gradle
│   ├── lint.xml
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   └── com_auth0_lock_passwordless_countries.json
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── auth0/
│       │   │           └── android/
│       │   │               └── lock/
│       │   │                   ├── Auth0Parcelable.java
│       │   │                   ├── AuthButtonSize.java
│       │   │                   ├── AuthenticationCallback.java
│       │   │                   ├── Constants.java
│       │   │                   ├── CountryCodeActivity.java
│       │   │                   ├── InitialScreen.java
│       │   │                   ├── Lock.java
│       │   │                   ├── LockActivity.java
│       │   │                   ├── LockCallback.java
│       │   │                   ├── PasswordlessIdentityHelper.java
│       │   │                   ├── PasswordlessLock.java
│       │   │                   ├── PasswordlessLockActivity.java
│       │   │                   ├── UsernameStyle.java
│       │   │                   ├── WebCallbackWrapper.java
│       │   │                   ├── WebProvider.java
│       │   │                   ├── adapters/
│       │   │                   │   ├── Country.java
│       │   │                   │   └── CountryAdapter.java
│       │   │                   ├── errors/
│       │   │                   │   ├── AuthenticationError.java
│       │   │                   │   ├── ErrorMessageBuilder.java
│       │   │                   │   ├── LoginErrorMessageBuilder.java
│       │   │                   │   └── SignUpErrorMessageBuilder.java
│       │   │                   ├── events/
│       │   │                   │   ├── CountryCodeChangeEvent.java
│       │   │                   │   ├── DatabaseChangePasswordEvent.java
│       │   │                   │   ├── DatabaseEvent.java
│       │   │                   │   ├── DatabaseLoginEvent.java
│       │   │                   │   ├── DatabaseSignUpEvent.java
│       │   │                   │   ├── FetchApplicationEvent.java
│       │   │                   │   ├── LockMessageEvent.java
│       │   │                   │   ├── OAuthLoginEvent.java
│       │   │                   │   └── PasswordlessLoginEvent.java
│       │   │                   ├── internal/
│       │   │                   │   └── configuration/
│       │   │                   │       ├── ApplicationDeserializer.java
│       │   │                   │       ├── ApplicationFetcher.java
│       │   │                   │       ├── AuthMode.java
│       │   │                   │       ├── AuthType.java
│       │   │                   │       ├── BaseConnection.java
│       │   │                   │       ├── Configuration.java
│       │   │                   │       ├── Connection.java
│       │   │                   │       ├── DatabaseConnection.java
│       │   │                   │       ├── GsonDeserializer.java
│       │   │                   │       ├── OAuthConnection.java
│       │   │                   │       ├── Options.java
│       │   │                   │       ├── PasswordComplexity.java
│       │   │                   │       ├── PasswordStrength.java
│       │   │                   │       ├── PasswordlessConnection.java
│       │   │                   │       ├── PasswordlessMode.java
│       │   │                   │       └── Theme.java
│       │   │                   ├── provider/
│       │   │                   │   └── AuthResolver.java
│       │   │                   ├── utils/
│       │   │                   │   ├── CustomField.java
│       │   │                   │   ├── EnterpriseConnectionMatcher.java
│       │   │                   │   ├── HiddenField.java
│       │   │                   │   ├── LoadCountriesTask.java
│       │   │                   │   └── SignUpField.java
│       │   │                   └── views/
│       │   │                       ├── ActionButton.java
│       │   │                       ├── AuthConfig.java
│       │   │                       ├── ChangePasswordFormView.java
│       │   │                       ├── CheckableOptionView.java
│       │   │                       ├── ClassicLockView.java
│       │   │                       ├── CountryCodeSelectorView.java
│       │   │                       ├── CustomFieldsFormView.java
│       │   │                       ├── FormLayout.java
│       │   │                       ├── FormView.java
│       │   │                       ├── HeaderView.java
│       │   │                       ├── ImageCheckbox.java
│       │   │                       ├── LinkTextView.java
│       │   │                       ├── LogInFormView.java
│       │   │                       ├── MFACodeFormView.java
│       │   │                       ├── ModeSelectionView.java
│       │   │                       ├── PasswordStrengthView.java
│       │   │                       ├── PasswordlessFormLayout.java
│       │   │                       ├── PasswordlessInputCodeFormView.java
│       │   │                       ├── PasswordlessLockView.java
│       │   │                       ├── PasswordlessRequestCodeFormView.java
│       │   │                       ├── SignUpFormView.java
│       │   │                       ├── SocialButton.java
│       │   │                       ├── SocialView.java
│       │   │                       ├── SocialViewAdapter.java
│       │   │                       ├── SpacesItemDecoration.java
│       │   │                       ├── ValidatedInputView.java
│       │   │                       ├── ValidatedPasswordInputView.java
│       │   │                       ├── ValidatedUsernameInputView.java
│       │   │                       ├── ViewUtils.java
│       │   │                       └── interfaces/
│       │   │                           ├── IdentityListener.java
│       │   │                           ├── LockWidget.java
│       │   │                           ├── LockWidgetForm.java
│       │   │                           ├── LockWidgetOAuth.java
│       │   │                           └── LockWidgetPasswordless.java
│       │   └── res/
│       │       ├── color/
│       │       │   └── com_auth0_lock_text.xml
│       │       ├── drawable/
│       │       │   ├── com_auth0_lock_link_background.xml
│       │       │   ├── com_auth0_lock_tab.xml
│       │       │   └── com_auth0_lock_terms.xml
│       │       ├── layout/
│       │       │   ├── com_auth0_lock_action_button.xml
│       │       │   ├── com_auth0_lock_activity_lock.xml
│       │       │   ├── com_auth0_lock_activity_lock_passwordless.xml
│       │       │   ├── com_auth0_lock_btn_social_large.xml
│       │       │   ├── com_auth0_lock_changepwd_form_view.xml
│       │       │   ├── com_auth0_lock_checkable_option.xml
│       │       │   ├── com_auth0_lock_custom_fields_form_view.xml
│       │       │   ├── com_auth0_lock_error_layout.xml
│       │       │   ├── com_auth0_lock_header.xml
│       │       │   ├── com_auth0_lock_login_form_view.xml
│       │       │   ├── com_auth0_lock_mfa_input_code_form_view.xml
│       │       │   ├── com_auth0_lock_password_strength.xml
│       │       │   ├── com_auth0_lock_passwordless_activity_country_code.xml
│       │       │   ├── com_auth0_lock_passwordless_country_code_selector.xml
│       │       │   ├── com_auth0_lock_passwordless_input_code_form_view.xml
│       │       │   ├── com_auth0_lock_passwordless_item_country_code.xml
│       │       │   ├── com_auth0_lock_passwordless_request_code_form_view.xml
│       │       │   ├── com_auth0_lock_signup_form_view.xml
│       │       │   ├── com_auth0_lock_sso_layout.xml
│       │       │   ├── com_auth0_lock_tab.xml
│       │       │   ├── com_auth0_lock_tab_layout.xml
│       │       │   ├── com_auth0_lock_terms_layout.xml
│       │       │   └── com_auth0_lock_validated_input_view.xml
│       │       ├── values/
│       │       │   ├── attrs.xml
│       │       │   ├── auth_styles.xml
│       │       │   ├── colors.xml
│       │       │   ├── dimens.xml
│       │       │   ├── ids.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       └── values-sw400dp/
│       │           └── dimens.xml
│       └── test/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── auth0/
│           │           └── android/
│           │               └── lock/
│           │                   ├── Auth0ParcelableTest.java
│           │                   ├── AuthenticationCallbackTest.java
│           │                   ├── ClassicBuilderTest.java
│           │                   ├── LockActivityTest.java
│           │                   ├── PasswordlessBuilderTest.java
│           │                   ├── PasswordlessIdentityHelperTest.java
│           │                   ├── PasswordlessLockActivityTest.java
│           │                   ├── WebProviderTest.java
│           │                   ├── errors/
│           │                   │   ├── LoginErrorMessageBuilderTest.java
│           │                   │   └── SignUpErrorMessageBuilderTest.java
│           │                   ├── events/
│           │                   │   ├── DatabaseEventTest.java
│           │                   │   ├── DatabaseLoginEventTest.java
│           │                   │   ├── DatabaseSignUpEventTest.java
│           │                   │   ├── ErrorMessageEventTest.java
│           │                   │   ├── OAuthLoginEventTest.java
│           │                   │   └── PasswordlessLoginEventTest.java
│           │                   ├── internal/
│           │                   │   └── configuration/
│           │                   │       ├── ApplicationFetcherTest.java
│           │                   │       ├── ApplicationGsonTest.java
│           │                   │       ├── ConfigurationTest.java
│           │                   │       ├── ConnectionGsonTest.java
│           │                   │       ├── ConnectionMatcher.java
│           │                   │       ├── ConnectionTest.java
│           │                   │       ├── DatabaseConnectionTest.java
│           │                   │       ├── EnterpriseConnectionMatcherTest.java
│           │                   │       ├── GsonBaseTest.java
│           │                   │       ├── OAuthConnectionTest.java
│           │                   │       ├── OptionsTest.java
│           │                   │       ├── PasswordlessConnectionTest.java
│           │                   │       └── ThemeTest.java
│           │                   ├── provider/
│           │                   │   └── AuthResolverTest.java
│           │                   ├── utils/
│           │                   │   ├── ApplicationAPI.java
│           │                   │   ├── Auth0AuthenticationCallbackMatcher.java
│           │                   │   ├── AuthenticationCallbackMatcher.java
│           │                   │   ├── CallbackMatcher.java
│           │                   │   ├── CustomFieldTest.java
│           │                   │   ├── HiddenFieldTest.java
│           │                   │   ├── MockAuthenticationCallback.java
│           │                   │   ├── MockCallback.java
│           │                   │   ├── MockLockCallback.java
│           │                   │   ├── SSLTestUtils.java
│           │                   │   └── TypeTokenMatcher.java
│           │                   └── views/
│           │                       ├── AuthConfigTest.java
│           │                       ├── CustomFieldsFormViewTest.java
│           │                       └── PasswordStrengthViewTest.java
│           └── resources/
│               ├── appinfo.json
│               ├── application.json
│               ├── db_connection.json
│               ├── db_connection_with_complexity.json
│               ├── empty_object.json
│               ├── enterprise_connection.json
│               ├── invalid.json
│               ├── mockito-extensions/
│               │   └── org.mockito.plugins.MockMaker
│               ├── social_connection.json
│               └── strategy.json
├── opslevel.yml
├── proguard/
│   ├── proguard-gson.pro
│   ├── proguard-lock-2.pro
│   └── proguard-otto.pro
└── settings.gradle
Download .txt
SYMBOL INDEX (1408 symbols across 123 files)

FILE: lib/src/main/java/com/auth0/android/lock/Auth0Parcelable.java
  class Auth0Parcelable (line 39) | public class Auth0Parcelable implements Parcelable {
    method Auth0Parcelable (line 45) | public Auth0Parcelable(@NonNull Auth0 auth0) {
    method getAuth0 (line 49) | @NonNull
    method describeContents (line 55) | @Override
    method writeToParcel (line 60) | @Override
    method createFromParcel (line 73) | public Auth0Parcelable createFromParcel(Parcel in) {
    method newArray (line 77) | public Auth0Parcelable[] newArray(int size) {
    method Auth0Parcelable (line 82) | private Auth0Parcelable(@NonNull Parcel in) {

FILE: lib/src/main/java/com/auth0/android/lock/AuthenticationCallback.java
  class AuthenticationCallback (line 41) | public abstract class AuthenticationCallback implements LockCallback {
    method onAuthentication (line 48) | public abstract void onAuthentication(@NonNull Credentials credentials);
    method onEvent (line 50) | @Override
    method extractCredentials (line 69) | private Credentials extractCredentials(Intent data) {

FILE: lib/src/main/java/com/auth0/android/lock/Constants.java
  class Constants (line 27) | abstract class Constants {

FILE: lib/src/main/java/com/auth0/android/lock/CountryCodeActivity.java
  class CountryCodeActivity (line 70) | public class CountryCodeActivity extends AppCompatActivity {
    method onCreate (line 79) | @Override
    method onStop (line 131) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/Lock.java
  class Lock (line 57) | public class Lock {
    method onReceive (line 68) | @Override
    method Lock (line 74) | private Lock(@NonNull Options options, @NonNull LockCallback callback) {
    method getOptions (line 84) | @NonNull
    method newBuilder (line 96) | @NonNull
    method newBuilder (line 109) | @NonNull
    method newIntent (line 120) | @NonNull
    method onDestroy (line 134) | public void onDestroy(@NonNull Context context) {
    method initialize (line 138) | private void initialize(@NonNull Context context) {
    method processEvent (line 149) | private void processEvent(@NonNull Intent data) {
    class Builder (line 178) | @SuppressWarnings({"UnusedReturnValue"})
      method Builder (line 190) | public Builder(@Nullable Auth0 account, @NonNull LockCallback callba...
      method build (line 203) | @NonNull
      method closable (line 246) | @NonNull
      method withTheme (line 258) | private Builder withTheme(@NonNull Theme theme) {
      method withAuthenticationParameters (line 269) | @NonNull
      method allowedConnections (line 281) | @NonNull
      method withUsernameStyle (line 294) | @NonNull
      method withAuthStyle (line 307) | @NonNull
      method initialScreen (line 319) | @NonNull
      method allowLogIn (line 331) | @NonNull
      method allowSignUp (line 343) | @NonNull
      method allowForgotPassword (line 355) | @NonNull
      method allowShowPassword (line 367) | @NonNull
      method useLabeledSubmitButton (line 380) | @NonNull
      method hideMainScreenTitle (line 392) | @NonNull
      method setDefaultDatabaseConnection (line 405) | @NonNull
      method enableEnterpriseWebAuthenticationFor (line 422) | @NonNull
      method loginAfterSignUp (line 434) | @NonNull
      method withAuthHandlers (line 446) | @NonNull
      method withSignUpFields (line 461) | @NonNull
      method withVisibleSignUpFieldsThreshold (line 477) | @NonNull
      method withScope (line 489) | @NonNull
      method withAudience (line 501) | @NonNull
      method withCustomTabsOptions (line 513) | @NonNull
      method withScheme (line 527) | @NonNull
      method setPrivacyURL (line 540) | @NonNull
      method setTermsURL (line 553) | @NonNull
      method setSupportURL (line 565) | @NonNull
      method setMustAcceptTerms (line 578) | @NonNull
      method setShowTerms (line 592) | @NonNull
      method withConnectionScope (line 605) | @NonNull
      method removeDuplicatedKeys (line 618) | private List<SignUpField> removeDuplicatedKeys(List<? extends SignUp...

FILE: lib/src/main/java/com/auth0/android/lock/LockActivity.java
  class LockActivity (line 89) | @SuppressLint("GoogleAppIndexingApiWarning")
    method LockActivity (line 118) | public LockActivity() {
    method LockActivity (line 121) | @VisibleForTesting
    method onCreate (line 132) | @Override
    method hasValidLaunchConfig (line 159) | private boolean hasValidLaunchConfig() {
    method hasValidTheme (line 177) | private boolean hasValidTheme() {
    method hasValidOptions (line 184) | private boolean hasValidOptions() {
    method onBackPressed (line 200) | @Override
    method deliverAuthenticationResult (line 212) | private void deliverAuthenticationResult(Credentials credentials) {
    method deliverAuthenticationError (line 224) | private void deliverAuthenticationError(AuthenticationException except...
    method deliverSignUpResult (line 232) | private void deliverSignUpResult(DatabaseUser result) {
    method requestMFAChallenge (line 241) | private void requestMFAChallenge(String mfaToken) {
    method showSuccessMessage (line 268) | private void showSuccessMessage(String message) {
    method showErrorMessage (line 277) | private void showErrorMessage(String message) {
    method run (line 287) | @Override
    method onRequestPermissionsResult (line 293) | @Override
    method onActivityResult (line 301) | @Override
    method onNewIntent (line 320) | @Override
    method onFetchApplicationRequest (line 333) | @Subscribe
    method onLockMessage (line 342) | @Subscribe
    method onOAuthAuthenticationRequest (line 347) | @Subscribe
    method completeDatabaseAuthenticationOnBrowser (line 402) | private void completeDatabaseAuthenticationOnBrowser() {
    method onDatabaseAuthenticationRequest (line 422) | @Subscribe
    method onDatabaseAuthenticationRequest (line 456) | @Subscribe
    method onDatabaseAuthenticationRequest (line 484) | @Subscribe
    method onSuccess (line 500) | @Override
    method onFailure (line 507) | @Override
    method onFailure (line 516) | @Override
    method onFailure (line 523) | @Override
    method onSuccess (line 535) | @Override
    method onSuccess (line 542) | @Override
    method onFailure (line 549) | @Override
    method onSuccess (line 579) | @Override
    method onFailure (line 585) | @Override
    method onSuccess (line 600) | @Override
    method onFailure (line 611) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/LockCallback.java
  type LockCallback (line 45) | public interface LockCallback {
    method onEvent (line 65) | void onEvent(@LockEvent int event, @NonNull Intent data);
    method onError (line 72) | void onError(@NonNull AuthenticationException error);

FILE: lib/src/main/java/com/auth0/android/lock/PasswordlessIdentityHelper.java
  class PasswordlessIdentityHelper (line 17) | class PasswordlessIdentityHelper {
    method PasswordlessIdentityHelper (line 28) | PasswordlessIdentityHelper(@NonNull Context context, @PasswordlessMode...
    method saveIdentity (line 33) | public void saveIdentity(@NonNull String identity, @Nullable Country c...
    method getLastCountry (line 42) | @Nullable
    method getLastIdentity (line 54) | @NonNull
    method hasLoggedInBefore (line 64) | public boolean hasLoggedInBefore() {
    method hasSameConnection (line 70) | private boolean hasSameConnection(@PasswordlessMode int lastMode) {

FILE: lib/src/main/java/com/auth0/android/lock/PasswordlessLock.java
  class PasswordlessLock (line 53) | public class PasswordlessLock {
    method onReceive (line 64) | @Override
    method PasswordlessLock (line 70) | private PasswordlessLock(@NonNull Options options, @NonNull LockCallba...
    method getOptions (line 80) | @NonNull
    method newBuilder (line 94) | @NonNull
    method newBuilder (line 109) | @NonNull
    method newIntent (line 120) | @NonNull
    method onDestroy (line 134) | public void onDestroy(@NonNull Context context) {
    method initialize (line 138) | private void initialize(Context context) {
    method processEvent (line 148) | private void processEvent(@NonNull Intent data) {
    class Builder (line 173) | @SuppressWarnings({"UnusedReturnValue"})
      method Builder (line 185) | public Builder(@Nullable Auth0 account, @NonNull LockCallback callba...
      method build (line 198) | @NonNull
      method hideMainScreenTitle (line 228) | @NonNull
      method useCode (line 239) | @NonNull
      method useLink (line 250) | @NonNull
      method rememberLastLogin (line 261) | @NonNull
      method closable (line 273) | @NonNull
      method withTheme (line 285) | private Builder withTheme(@NonNull Theme theme) {
      method withAuthStyle (line 297) | @NonNull
      method withAuthenticationParameters (line 309) | @NonNull
      method allowedConnections (line 321) | @NonNull
      method withAuthHandlers (line 333) | @NonNull
      method withScope (line 345) | @NonNull
      method withAudience (line 357) | @NonNull
      method withScheme (line 371) | @NonNull
      method withCustomTabsOptions (line 383) | @NonNull
      method setSupportURL (line 395) | @NonNull
      method withConnectionScope (line 408) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/PasswordlessLockActivity.java
  class PasswordlessLockActivity (line 83) | @SuppressLint("GoogleAppIndexingApiWarning")
    method PasswordlessLockActivity (line 115) | public PasswordlessLockActivity() {
    method PasswordlessLockActivity (line 118) | @VisibleForTesting
    method onCreate (line 127) | @Override
    method hasValidLaunchConfig (line 157) | private boolean hasValidLaunchConfig() {
    method hasValidTheme (line 175) | private boolean hasValidTheme() {
    method hasValidOptions (line 182) | private boolean hasValidOptions() {
    method onBackPressed (line 198) | @Override
    method deliverAuthenticationResult (line 215) | private void deliverAuthenticationResult(Credentials credentials) {
    method deliverAuthenticationError (line 227) | private void deliverAuthenticationError(AuthenticationException except...
    method showErrorMessage (line 235) | private void showErrorMessage(String message) {
    method run (line 245) | @Override
    method showLinkSentLayout (line 251) | private void showLinkSentLayout() {
    method run (line 283) | @Override
    method reloadRecentPasswordlessData (line 291) | private void reloadRecentPasswordlessData(boolean submitForm) {
    method onActivityResult (line 303) | @Override
    method onNewIntent (line 329) | @Override
    method onRequestPermissionsResult (line 366) | @Override
    method onFetchApplicationRequest (line 374) | @Subscribe
    method onCountryCodeChangeRequest (line 383) | @Subscribe
    method onPasswordlessAuthenticationRequest (line 389) | @Subscribe
    method onOAuthAuthenticationRequest (line 420) | @Subscribe
    method onSuccess (line 454) | @Override
    method onFailure (line 465) | @Override
    method onSuccess (line 474) | @Override
    method onFailure (line 485) | @Override
    method onSuccess (line 496) | @Override
    method onFailure (line 505) | @Override
    method onFailure (line 517) | @Override
    method onFailure (line 523) | @Override
    method onSuccess (line 535) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/WebCallbackWrapper.java
  class WebCallbackWrapper (line 14) | class WebCallbackWrapper implements Callback<Credentials, Authentication...
    method WebCallbackWrapper (line 18) | public WebCallbackWrapper(@NonNull AuthCallback callback) {
    method onFailure (line 22) | @Override
    method onSuccess (line 27) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/WebProvider.java
  class WebProvider (line 23) | class WebProvider {
    method WebProvider (line 32) | WebProvider(@NonNull Options options) {
    method start (line 44) | public void start(@NonNull Activity activity, @NonNull String connecti...
    method resume (line 86) | public boolean resume(Intent intent) {

FILE: lib/src/main/java/com/auth0/android/lock/adapters/Country.java
  class Country (line 31) | public class Country implements Comparable<Country> {
    method Country (line 35) | public Country(@NonNull String isoCode, @NonNull String dialCode) {
    method getDialCode (line 40) | @NonNull
    method getIsoCode (line 45) | @NonNull
    method getDisplayName (line 50) | @NonNull
    method compareTo (line 56) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/adapters/CountryAdapter.java
  class CountryAdapter (line 43) | public class CountryAdapter extends BaseAdapter {
    method CountryAdapter (line 52) | public CountryAdapter(@NonNull Context context, @NonNull List<Country>...
    method getCount (line 59) | @Override
    method getItem (line 64) | @Nullable
    method getItemId (line 70) | @Override
    method getView (line 75) | @NonNull
    method getFilter (line 90) | @NonNull
    class CountryFilter (line 95) | private class CountryFilter extends Filter {
      method performFiltering (line 97) | @Override
      method publishResults (line 112) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/errors/AuthenticationError.java
  class AuthenticationError (line 32) | public class AuthenticationError {
    method AuthenticationError (line 38) | public AuthenticationError(@StringRes int message) {
    method AuthenticationError (line 42) | AuthenticationError(@StringRes int message, @Nullable String descripti...
    method getMessage (line 53) | @NonNull
    method getMessageRes (line 61) | int getMessageRes() {
    method getCustomMessage (line 65) | String getCustomMessage() {

FILE: lib/src/main/java/com/auth0/android/lock/errors/ErrorMessageBuilder.java
  type ErrorMessageBuilder (line 7) | public interface ErrorMessageBuilder<U extends Auth0Exception> {
    method buildFrom (line 9) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/errors/LoginErrorMessageBuilder.java
  class LoginErrorMessageBuilder (line 35) | public class LoginErrorMessageBuilder implements ErrorMessageBuilder<Aut...
    method LoginErrorMessageBuilder (line 53) | public LoginErrorMessageBuilder(@StringRes int defaultMessage, @String...
    method LoginErrorMessageBuilder (line 58) | public LoginErrorMessageBuilder() {
    method buildFrom (line 62) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/errors/SignUpErrorMessageBuilder.java
  class SignUpErrorMessageBuilder (line 33) | public class SignUpErrorMessageBuilder implements ErrorMessageBuilder<Au...
    method SignUpErrorMessageBuilder (line 47) | public SignUpErrorMessageBuilder(@StringRes int defaultMessage) {
    method SignUpErrorMessageBuilder (line 51) | public SignUpErrorMessageBuilder() {
    method buildFrom (line 55) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/events/CountryCodeChangeEvent.java
  class CountryCodeChangeEvent (line 27) | public class CountryCodeChangeEvent {

FILE: lib/src/main/java/com/auth0/android/lock/events/DatabaseChangePasswordEvent.java
  class DatabaseChangePasswordEvent (line 30) | public class DatabaseChangePasswordEvent extends DatabaseEvent {
    method DatabaseChangePasswordEvent (line 37) | public DatabaseChangePasswordEvent(@NonNull String email) {

FILE: lib/src/main/java/com/auth0/android/lock/events/DatabaseEvent.java
  class DatabaseEvent (line 32) | public class DatabaseEvent {
    method DatabaseEvent (line 36) | public DatabaseEvent(@NonNull String identity) {
    method DatabaseEvent (line 44) | public DatabaseEvent(@NonNull String email, @Nullable String username) {
    method getEmail (line 49) | @Nullable
    method getUsername (line 54) | @Nullable
    method setUsername (line 59) | public void setUsername(@Nullable String username) {
    method isUsername (line 63) | private boolean isUsername(String input) {
    method isEmail (line 67) | private boolean isEmail(String input) {

FILE: lib/src/main/java/com/auth0/android/lock/events/DatabaseLoginEvent.java
  class DatabaseLoginEvent (line 31) | public class DatabaseLoginEvent extends DatabaseEvent {
    method DatabaseLoginEvent (line 39) | public DatabaseLoginEvent(@NonNull String usernameOrEmail, @NonNull St...
    method getUsernameOrEmail (line 44) | @NonNull
    method getPassword (line 49) | @NonNull
    method setMultifactorOTP (line 54) | public void setMultifactorOTP(@NonNull String code) {
    method getMultifactorOTP (line 58) | @Nullable
    method setMultifactorOOBCode (line 63) | public void setMultifactorOOBCode(@Nullable String code) {
    method getMultifactorOOBCode (line 67) | @Nullable
    method setMultifactorToken (line 72) | public void setMultifactorToken(@NonNull String mfaToken) {
    method getMultifactorToken (line 76) | @Nullable
    method setMultifactorChallengeType (line 81) | public void setMultifactorChallengeType(@NonNull String challengeType) {
    method getMultifactorChallengeType (line 85) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/events/DatabaseSignUpEvent.java
  class DatabaseSignUpEvent (line 40) | public class DatabaseSignUpEvent extends DatabaseEvent {
    method DatabaseSignUpEvent (line 49) | public DatabaseSignUpEvent(@NonNull String email, @NonNull String pass...
    method getPassword (line 56) | @NonNull
    method setRootAttributes (line 61) | public void setRootAttributes(@NonNull Map<String, String> attributes) {
    method setExtraFields (line 70) | public void setExtraFields(@NonNull Map<String, String> customFields) {
    method getSignUpRequest (line 75) | @NonNull
    method getCreateUserRequest (line 84) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/events/FetchApplicationEvent.java
  class FetchApplicationEvent (line 27) | public class FetchApplicationEvent {

FILE: lib/src/main/java/com/auth0/android/lock/events/LockMessageEvent.java
  class LockMessageEvent (line 5) | public class LockMessageEvent {
    method LockMessageEvent (line 10) | public LockMessageEvent(@StringRes int messageRes) {
    method getMessageRes (line 14) | @StringRes

FILE: lib/src/main/java/com/auth0/android/lock/events/OAuthLoginEvent.java
  class OAuthLoginEvent (line 8) | public class OAuthLoginEvent {
    method OAuthLoginEvent (line 21) | public OAuthLoginEvent(@NonNull OAuthConnection connection, @NonNull S...
    method OAuthLoginEvent (line 32) | public OAuthLoginEvent(@NonNull OAuthConnection connection) {
    method useActiveFlow (line 41) | public boolean useActiveFlow() {
    method getConnection (line 50) | @NonNull
    method getStrategy (line 60) | @Nullable
    method getUsername (line 70) | @Nullable
    method getPassword (line 80) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/events/PasswordlessLoginEvent.java
  class PasswordlessLoginEvent (line 40) | public class PasswordlessLoginEvent {
    method PasswordlessLoginEvent (line 50) | private PasswordlessLoginEvent(@PasswordlessMode int mode, String emai...
    method requestCode (line 57) | @NonNull
    method requestCode (line 62) | @NonNull
    method submitCode (line 68) | @NonNull
    method getMode (line 73) | @PasswordlessMode
    method getEmailOrNumber (line 78) | @Nullable
    method getCountry (line 83) | @Nullable
    method getCode (line 88) | @Nullable
    method getCodeRequest (line 100) | @NonNull
    method getLoginRequest (line 123) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/ApplicationDeserializer.java
  class ApplicationDeserializer (line 40) | class ApplicationDeserializer extends GsonDeserializer<List<Connection>> {
    method deserialize (line 42) | @Override
    method mergeConnections (line 58) | private List<Connection> mergeConnections(JsonArray list, JsonDeserial...
    method parseStrategy (line 67) | private List<Connection> parseStrategy(JsonElement json, JsonDeseriali...

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/ApplicationFetcher.java
  class ApplicationFetcher (line 56) | public class ApplicationFetcher {
    method ApplicationFetcher (line 67) | public ApplicationFetcher(@NonNull Auth0 account) {
    method fetch (line 76) | public void fetch(@NonNull Callback<List<Connection>, Auth0Exception> ...
    method createGson (line 81) | @VisibleForTesting
    class FetchTask (line 91) | private static class FetchTask extends AsyncTask<Callback<List<Connect...
      method FetchTask (line 95) | public FetchTask(Auth0 account) {
      method doInBackground (line 99) | @SafeVarargs
      method makeApplicationRequest (line 106) | private void makeApplicationRequest(Auth0 account, Callback<List<Con...
      method parseJSONP (line 122) | private List<Connection> parseJSONP(InputStream is) throws Auth0Exce...

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/BaseConnection.java
  type BaseConnection (line 6) | interface BaseConnection {
    method getName (line 13) | @NonNull
    method getStrategy (line 21) | @NonNull
    method valueForKey (line 32) | @Nullable
    method booleanForKey (line 41) | boolean booleanForKey(String key);

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/Configuration.java
  class Configuration (line 49) | public class Configuration {
    method Configuration (line 83) | public Configuration(@NonNull List<Connection> connections, @NonNull O...
    method getVisibleSignUpFields (line 99) | @NonNull
    method getHiddenSignUpFields (line 104) | @NonNull
    method getDatabaseConnection (line 109) | @Nullable
    method getPasswordlessConnection (line 114) | @Nullable
    method getSocialConnections (line 135) | @NonNull
    method getEnterpriseConnections (line 140) | @NonNull
    method getPasswordlessConnections (line 145) | @NonNull
    method filterDatabaseConnections (line 150) | @Nullable
    method filterConnections (line 166) | @SuppressWarnings("unchecked")
    method enableWebAuthentication (line 182) | @NonNull
    method parseLocalOptions (line 192) | private void parseLocalOptions(Options options) {
    method authStyleForConnection (line 234) | @StyleRes
    method parsePasswordlessMode (line 242) | @PasswordlessMode
    method allowLogIn (line 256) | public boolean allowLogIn() {
    method allowSignUp (line 260) | public boolean allowSignUp() {
    method allowForgotPassword (line 264) | public boolean allowForgotPassword() {
    method allowShowPassword (line 268) | public boolean allowShowPassword() {
    method isUsernameRequired (line 272) | public boolean isUsernameRequired() {
    method getInitialScreen (line 276) | @InitialScreen
    method getUsernameStyle (line 281) | @UsernameStyle
    method getPasswordlessMode (line 286) | @PasswordlessMode
    method getPasswordComplexity (line 291) | @NonNull
    method loginAfterSignUp (line 296) | public boolean loginAfterSignUp() {
    method hasClassicConnections (line 300) | public boolean hasClassicConnections() {
    method hasPasswordlessConnections (line 304) | public boolean hasPasswordlessConnections() {
    method getTermsURL (line 308) | @NonNull
    method getPrivacyURL (line 313) | @NonNull
    method getSupportURL (line 318) | @Nullable
    method mustAcceptTerms (line 323) | public boolean mustAcceptTerms() {
    method showTerms (line 327) | public boolean showTerms() {
    method useLabeledSubmitButton (line 331) | public boolean useLabeledSubmitButton() {
    method hideMainScreenTitle (line 335) | public boolean hideMainScreenTitle() {
    method usePasswordlessAutoSubmit (line 339) | public boolean usePasswordlessAutoSubmit() {
    method getVisibleSignUpFieldsThreshold (line 343) | public int getVisibleSignUpFieldsThreshold() {

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/Connection.java
  class Connection (line 12) | public class Connection implements BaseConnection, DatabaseConnection, O...
    method Connection (line 23) | private Connection(@NonNull String strategy, Map<String, Object> value...
    method parsePasswordComplexity (line 38) | private void parsePasswordComplexity() {
    method getName (line 63) | @NonNull
    method getStrategy (line 69) | @NonNull
    method getType (line 80) | @AuthType
    method valueForKey (line 107) | @Nullable
    method booleanForKey (line 113) | @Override
    method getPasswordComplexity (line 119) | @Override
    method requiresUsername (line 125) | @Override
    method showSignUp (line 130) | @Override
    method showForgot (line 135) | @Override
    method getMinUsernameLength (line 140) | @Override
    method getMaxUsernameLength (line 145) | @Override
    method isCustomDatabase (line 150) | @Override
    method isActiveFlowEnabled (line 155) | @Override
    method disableActiveFlow (line 160) | void disableActiveFlow() {
    method getDomainSet (line 164) | @Override
    method newConnectionFor (line 189) | static Connection newConnectionFor(@NonNull String strategy, Map<Strin...
    method parseUsernameLength (line 193) | @SuppressWarnings("unchecked")
    method intValue (line 218) | private int intValue(@Nullable Object object) {

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/DatabaseConnection.java
  type DatabaseConnection (line 5) | public interface DatabaseConnection extends BaseConnection {
    method getPasswordComplexity (line 15) | @NonNull
    method requiresUsername (line 23) | boolean requiresUsername();
    method showSignUp (line 30) | boolean showSignUp();
    method showForgot (line 37) | boolean showForgot();
    method getMinUsernameLength (line 44) | int getMinUsernameLength();
    method getMaxUsernameLength (line 51) | int getMaxUsernameLength();
    method isCustomDatabase (line 58) | boolean isCustomDatabase();

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/GsonDeserializer.java
  class GsonDeserializer (line 35) | abstract class GsonDeserializer<T> implements JsonDeserializer<T> {
    method requiredValue (line 37) | <U> U requiredValue(String name, Type type, JsonObject object, JsonDes...
    method assertJsonObject (line 45) | void assertJsonObject(JsonElement jsonObject) throws JsonParseException {

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/OAuthConnection.java
  type OAuthConnection (line 7) | public interface OAuthConnection extends BaseConnection {
    method isActiveFlowEnabled (line 14) | boolean isActiveFlowEnabled();
    method getDomainSet (line 21) | @NonNull

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/Options.java
  class Options (line 56) | @SuppressLint("KotlinPropertyAccess")
    method Options (line 99) | public Options() {
    method Options (line 118) | protected Options(@NonNull Parcel in) {
    method describeContents (line 191) | @Override
    method writeToParcel (line 196) | @Override
    method createFromParcel (line 269) | @Override
    method newArray (line 274) | @Override
    method getAccount (line 280) | @NonNull
    method setAccount (line 285) | public void setAccount(@NonNull Auth0 account) {
    method withTheme (line 289) | public void withTheme(@NonNull Theme theme) {
    method getTheme (line 293) | @NonNull
    method isClosable (line 298) | public boolean isClosable() {
    method setClosable (line 302) | public void setClosable(boolean closable) {
    method usernameStyle (line 306) | @UsernameStyle
    method setUsernameStyle (line 311) | public void setUsernameStyle(@UsernameStyle int usernameStyle) {
    method setAllowLogIn (line 315) | public void setAllowLogIn(boolean allowLogIn) {
    method allowLogIn (line 319) | public boolean allowLogIn() {
    method allowSignUp (line 323) | public boolean allowSignUp() {
    method setAllowSignUp (line 327) | public void setAllowSignUp(boolean allowSignUp) {
    method setAllowForgotPassword (line 331) | public void setAllowForgotPassword(boolean allowForgotPassword) {
    method allowForgotPassword (line 335) | public boolean allowForgotPassword() {
    method allowShowPassword (line 339) | public boolean allowShowPassword() {
    method setAllowShowPassword (line 343) | public void setAllowShowPassword(boolean allow) {
    method getDefaultDatabaseConnection (line 347) | @Nullable
    method useDatabaseConnection (line 352) | public void useDatabaseConnection(@NonNull String defaultDatabaseConne...
    method getConnections (line 356) | @Nullable
    method setConnections (line 361) | public void setConnections(@NonNull List<String> connections) {
    method getEnterpriseConnectionsUsingWebForm (line 365) | @Nullable
    method setEnterpriseConnectionsUsingWebForm (line 370) | public void setEnterpriseConnectionsUsingWebForm(@NonNull List<String>...
    method getAuthenticationParameters (line 374) | @Nullable
    method setAuthenticationParameters (line 379) | public void setAuthenticationParameters(@NonNull HashMap<String, Strin...
    method loginAfterSignUp (line 389) | public boolean loginAfterSignUp() {
    method setLoginAfterSignUp (line 393) | public void setLoginAfterSignUp(boolean loginAfterSignUp) {
    method getAuthenticationAPIClient (line 397) | @NonNull
    method setUseCodePasswordless (line 402) | public void setUseCodePasswordless(boolean useCode) {
    method useCodePasswordless (line 406) | public boolean useCodePasswordless() {
    method setSignUpFields (line 410) | public void setSignUpFields(@NonNull List<SignUpField> signUpFields) {
    method getSignUpFields (line 414) | @Nullable
    method setInitialScreen (line 419) | public void setInitialScreen(@InitialScreen int screen) {
    method initialScreen (line 423) | @InitialScreen
    method setPrivacyURL (line 428) | public void setPrivacyURL(@NonNull String url) throws IllegalArgumentE...
    method getPrivacyURL (line 435) | @Nullable
    method setTermsURL (line 440) | public void setTermsURL(@NonNull String url) throws IllegalArgumentExc...
    method getTermsURL (line 447) | @Nullable
    method setSupportURL (line 452) | public void setSupportURL(@NonNull String url) {
    method getSupportURL (line 459) | @Nullable
    method setMustAcceptTerms (line 464) | public void setMustAcceptTerms(boolean mustAcceptTerms) {
    method mustAcceptTerms (line 468) | public boolean mustAcceptTerms() {
    method setShowTerms (line 472) | public void setShowTerms(boolean showTerms) {
    method showTerms (line 476) | public boolean showTerms() {
    method withAuthStyle (line 480) | public void withAuthStyle(@NonNull String connectionName, @StyleRes in...
    method getAuthStyles (line 484) | @Nullable
    method setUseLabeledSubmitButton (line 489) | public void setUseLabeledSubmitButton(boolean useLabeledSubmitButton) {
    method useLabeledSubmitButton (line 493) | public boolean useLabeledSubmitButton() {
    method setHideMainScreenTitle (line 497) | public void setHideMainScreenTitle(boolean hideMainScreenTitle) {
    method hideMainScreenTitle (line 501) | public boolean hideMainScreenTitle() {
    method setRememberLastPasswordlessLogin (line 505) | public void setRememberLastPasswordlessLogin(boolean remember) {
    method rememberLastPasswordlessAccount (line 509) | public boolean rememberLastPasswordlessAccount() {
    method withConnectionScope (line 513) | public void withConnectionScope(@NonNull String connectionName, @NonNu...
    method getConnectionsScope (line 517) | @Nullable
    method withScope (line 522) | public void withScope(@NonNull String scope) {
    method getScope (line 526) | @Nullable
    method withAudience (line 531) | public void withAudience(@NonNull String audience) {
    method getAudience (line 535) | @Nullable
    method withScheme (line 540) | public void withScheme(@NonNull String scheme) {
    method getScheme (line 544) | @Nullable
    method setVisibleSignUpFieldsThreshold (line 549) | public void setVisibleSignUpFieldsThreshold(int threshold) {
    method visibleSignUpFieldsThreshold (line 553) | public int visibleSignUpFieldsThreshold() {
    method withCustomTabsOptions (line 557) | public void withCustomTabsOptions(@NonNull CustomTabsOptions customTab...
    method getCustomTabsOptions (line 561) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/PasswordComplexity.java
  class PasswordComplexity (line 5) | public class PasswordComplexity {
    method PasswordComplexity (line 10) | public PasswordComplexity(@PasswordStrength int policy, @Nullable Inte...
    method getPasswordPolicy (line 20) | @PasswordStrength
    method getMinLengthOverride (line 30) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/PasswordlessConnection.java
  type PasswordlessConnection (line 3) | public interface PasswordlessConnection extends BaseConnection {

FILE: lib/src/main/java/com/auth0/android/lock/internal/configuration/Theme.java
  class Theme (line 48) | public class Theme implements Parcelable {
    method Theme (line 57) | private Theme(int headerTitle, int headerLogo, int headerColor, int he...
    method resolveStringResource (line 66) | @SuppressLint("ResourceType")
    method resolveColorResource (line 77) | @SuppressLint("ResourceType")
    method resolveDrawableResource (line 89) | @SuppressLint("ResourceType")
    method getHeaderTitle (line 100) | @NonNull
    method getHeaderLogo (line 105) | @NonNull
    method getHeaderColor (line 110) | @ColorInt
    method getHeaderTitleColor (line 115) | @ColorInt
    method getPrimaryColor (line 120) | @ColorInt
    method getDarkPrimaryColor (line 125) | @ColorInt
    method getCustomHeaderTitleRes (line 130) | int getCustomHeaderTitleRes() {
    method getCustomHeaderLogoRes (line 134) | int getCustomHeaderLogoRes() {
    method getCustomHeaderColorRes (line 138) | int getCustomHeaderColorRes() {
    method getCustomHeaderTitleColorRes (line 142) | int getCustomHeaderTitleColorRes() {
    method getCustomPrimaryColorRes (line 146) | int getCustomPrimaryColorRes() {
    method getCustomDarkPrimaryColorRes (line 150) | int getCustomDarkPrimaryColorRes() {
    method Theme (line 154) | protected Theme(@NonNull Parcel in) {
    method describeContents (line 163) | @Override
    method writeToParcel (line 168) | @Override
    method createFromParcel (line 179) | @Override
    method newArray (line 184) | @Override
    method newBuilder (line 191) | static Builder newBuilder() {
    class Builder (line 195) | static class Builder {
      method withHeaderTitle (line 204) | public Builder withHeaderTitle(@StringRes int title) {
      method withHeaderLogo (line 209) | public Builder withHeaderLogo(@DrawableRes int logo) {
      method withHeaderColor (line 214) | public Builder withHeaderColor(@ColorRes int color) {
      method withHeaderTitleColor (line 219) | public Builder withHeaderTitleColor(@ColorRes int color) {
      method withPrimaryColor (line 224) | public Builder withPrimaryColor(@ColorRes int primary) {
      method withDarkPrimaryColor (line 229) | public Builder withDarkPrimaryColor(@ColorRes int darkPrimary) {
      method build (line 234) | public Theme build() {

FILE: lib/src/main/java/com/auth0/android/lock/provider/AuthResolver.java
  class AuthResolver (line 18) | public final class AuthResolver {
    method AuthResolver (line 21) | private AuthResolver() {
    method setAuthHandlers (line 29) | public static void setAuthHandlers(@NonNull List<AuthHandler> handlers) {
    method providerFor (line 41) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/utils/CustomField.java
  class CustomField (line 50) | public class CustomField extends SignUpField {
    method CustomField (line 96) | public CustomField(@DrawableRes int icon, @FieldType int type, @NonNul...
    method CustomField (line 109) | public CustomField(@DrawableRes int icon, @FieldType int type, @NonNul...
    method configureField (line 116) | public void configureField(@NonNull ValidatedInputView field) {
    method findValue (line 136) | @Nullable
    method getHint (line 146) | @StringRes
    method getIcon (line 151) | @DrawableRes
    method getType (line 156) | @FieldType
    method CustomField (line 161) | protected CustomField(@NonNull Parcel in) {
    method writeToParcel (line 168) | @Override
    method createFromParcel (line 177) | @Override
    method newArray (line 182) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/utils/EnterpriseConnectionMatcher.java
  class EnterpriseConnectionMatcher (line 39) | public class EnterpriseConnectionMatcher {
    method EnterpriseConnectionMatcher (line 48) | public EnterpriseConnectionMatcher(@NonNull List<OAuthConnection> conn...
    method parse (line 59) | @Nullable
    method extractUsername (line 92) | @Nullable
    method extractDomain (line 107) | @Nullable
    method domainForConnection (line 126) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/utils/HiddenField.java
  class HiddenField (line 7) | public class HiddenField extends SignUpField {
    method HiddenField (line 18) | public HiddenField(@NonNull String key, @NonNull String value, @Custom...
    method getValue (line 23) | @NonNull
    method HiddenField (line 28) | protected HiddenField(@NonNull Parcel in) {
    method writeToParcel (line 33) | @Override
    method createFromParcel (line 40) | @Override
    method newArray (line 45) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/utils/LoadCountriesTask.java
  class LoadCountriesTask (line 46) | public abstract class LoadCountriesTask extends AsyncTask<Context, Void,...
    method doInBackground (line 51) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/utils/SignUpField.java
  class SignUpField (line 10) | public abstract class SignUpField implements Parcelable {
    method SignUpField (line 15) | SignUpField(@NonNull String key, @CustomField.Storage int storage) {
    method getStorage (line 26) | @CustomField.Storage
    method getKey (line 31) | @NonNull
    method SignUpField (line 36) | SignUpField(Parcel in) {
    method describeContents (line 41) | @Override
    method writeToParcel (line 46) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/ActionButton.java
  class ActionButton (line 50) | @SuppressLint("ViewConstructor")
    method ActionButton (line 60) | public ActionButton(@NonNull Context context, @NonNull Theme lockTheme) {
    method init (line 65) | private void init(Theme lockTheme) {
    method generateStateBackground (line 82) | private Drawable generateStateBackground(Theme lockTheme) {
    method setOnClickListener (line 101) | @Override
    method showProgress (line 112) | public void showProgress(boolean show) {
    method setLabel (line 130) | public void setLabel(@StringRes int stringRes) {
    method showLabel (line 140) | public void showLabel(boolean showLabel) {

FILE: lib/src/main/java/com/auth0/android/lock/views/AuthConfig.java
  class AuthConfig (line 16) | public class AuthConfig {
    method AuthConfig (line 22) | public AuthConfig(@NonNull OAuthConnection connection, @StyleRes int s...
    method getConnection (line 27) | @NonNull
    method getName (line 32) | @NonNull
    method getLogo (line 39) | @NonNull
    method getBackgroundColor (line 49) | @ColorInt
    method getIdForResource (line 66) | int getIdForResource(@NonNull Context context, @StyleableRes int index) {
    method styleForStrategy (line 80) | @StyleRes

FILE: lib/src/main/java/com/auth0/android/lock/views/ChangePasswordFormView.java
  class ChangePasswordFormView (line 40) | public class ChangePasswordFormView extends FormView implements TextView...
    method ChangePasswordFormView (line 46) | public ChangePasswordFormView(@NonNull Context context) {
    method ChangePasswordFormView (line 51) | public ChangePasswordFormView(@NonNull LockWidgetForm lockWidget, @Nul...
    method init (line 57) | private void init(String email) {
    method getActionEvent (line 66) | @NonNull
    method getUsernameOrEmail (line 72) | @NonNull
    method validateForm (line 77) | @Override
    method submitForm (line 82) | @Nullable
    method onEditorAction (line 93) | @Override
    method onEmailChanged (line 101) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/CheckableOptionView.java
  class CheckableOptionView (line 39) | public class CheckableOptionView extends LinearLayout {
    method CheckableOptionView (line 47) | public CheckableOptionView(@NonNull Context context) {
    method CheckableOptionView (line 52) | public CheckableOptionView(@NonNull Context context, @NonNull Attribut...
    method CheckableOptionView (line 57) | public CheckableOptionView(@NonNull Context context, @NonNull Attribut...
    method init (line 62) | private void init(AttributeSet attrs) {
    method updateStatus (line 79) | private void updateStatus() {
    method setText (line 94) | public void setText(@NonNull String text) {
    method setChecked (line 103) | public void setChecked(boolean checked) {
    method setMandatory (line 114) | public void setMandatory(boolean mandatory) {

FILE: lib/src/main/java/com/auth0/android/lock/views/ClassicLockView.java
  class ClassicLockView (line 60) | @SuppressWarnings("NullableProblems")
    method ClassicLockView (line 81) | public ClassicLockView(@NonNull Context context, @NonNull Bus lockBus,...
    method init (line 89) | private void init() {
    method showWaitForConfigurationLayout (line 99) | private void showWaitForConfigurationLayout() {
    method showContentLayout (line 108) | private void showContentLayout() {
    method configure (line 167) | public void configure(@Nullable Configuration configuration) {
    method showConfigurationMissingLayout (line 178) | private void showConfigurationMissingLayout(final boolean showRetry) {
    method showChangePasswordForm (line 206) | @Override
    method updateHeaderTitle (line 218) | private void updateHeaderTitle(@StringRes int titleRes) {
    method resetHeaderTitle (line 223) | private void resetHeaderTitle() {
    method addSubForm (line 228) | private void addSubForm(@NonNull FormView form) {
    method removeSubForm (line 238) | private void removeSubForm() {
    method onBackPressed (line 256) | public boolean onBackPressed() {
    method showProgress (line 277) | public void showProgress(boolean show) {
    method showSignUpTerms (line 286) | private void showSignUpTerms(boolean show) {
    method showSignUpTermsDialog (line 298) | @SuppressLint("StringFormatInvalid")
    method getConfiguration (line 318) | @NonNull
    method onFormSubmit (line 324) | @Override
    method showCustomFieldsForm (line 329) | @Override
    method showMFACodeForm (line 337) | public void showMFACodeForm(@NonNull DatabaseLoginEvent event) {
    method onOAuthLoginRequest (line 343) | @Override
    method showTopBanner (line 348) | @Override
    method showBottomBanner (line 356) | @Override
    method updateButtonLabel (line 363) | @Override
    method onEmailChanged (line 370) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/CountryCodeSelectorView.java
  class CountryCodeSelectorView (line 48) | public class CountryCodeSelectorView extends LinearLayout {
    method CountryCodeSelectorView (line 61) | public CountryCodeSelectorView(@NonNull Context context) {
    method CountryCodeSelectorView (line 66) | public CountryCodeSelectorView(@NonNull Context context, @NonNull Attr...
    method CountryCodeSelectorView (line 71) | public CountryCodeSelectorView(@NonNull Context context, @NonNull Attr...
    method init (line 76) | private void init() {
    method setupBackground (line 88) | private void setupBackground() {
    method prepareTask (line 99) | private void prepareTask() {
    method setSelectedCountry (line 126) | public void setSelectedCountry(@NonNull Country country) {
    method getSelectedCountry (line 138) | @Nullable
    method onDetachedFromWindow (line 143) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/CustomFieldsFormView.java
  class CustomFieldsFormView (line 50) | @SuppressLint("ViewConstructor")
    method CustomFieldsFormView (line 67) | public CustomFieldsFormView(@NonNull LockWidgetForm lockWidget, @NonNu...
    method init (line 78) | private void init() {
    method defineFieldParams (line 85) | private LinearLayout.LayoutParams defineFieldParams() {
    method addCustomFields (line 96) | private void addCustomFields() {
    method setEventRootProfileAttributes (line 108) | static void setEventRootProfileAttributes(DatabaseSignUpEvent event, L...
    method getActionEvent (line 135) | @NonNull
    method validateForm (line 143) | @Override
    method submitForm (line 156) | @Nullable
    method onEditorAction (line 162) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/FormLayout.java
  class FormLayout (line 50) | public class FormLayout extends RelativeLayout implements ModeSelectionV...
    method FormLayout (line 74) | public FormLayout(@NonNull Context context) {
    method FormLayout (line 79) | public FormLayout(@NonNull LockWidgetForm lockWidget) {
    method init (line 85) | private void init() {
    method displayInitialScreen (line 121) | private void displayInitialScreen() {
    method addSocialLayout (line 140) | private void addSocialLayout() {
    method addSeparator (line 145) | private void addSeparator() {
    method changeFormMode (line 162) | @SuppressLint("WrongConstant")
    method showOnlyEnterprise (line 188) | public void showOnlyEnterprise(boolean show) {
    method showSignUpForm (line 200) | private void showSignUpForm() {
    method showLogInForm (line 211) | private void showLogInForm() {
    method showCustomFieldsForm (line 222) | private void showCustomFieldsForm(@NonNull DatabaseSignUpEvent event) {
    method removePreviousForm (line 231) | private void removePreviousForm() {
    method getExistingForm (line 238) | @Nullable
    method onBackPressed (line 248) | public boolean onBackPressed() {
    method onActionPressed (line 258) | @Nullable
    method onModeSelected (line 279) | @Override
    method getSelectedMode (line 285) | @SuppressLint("WrongConstant")
    method onEmailChanged (line 292) | @Override
    method refreshIdentityInput (line 297) | public void refreshIdentityInput() {

FILE: lib/src/main/java/com/auth0/android/lock/views/FormView.java
  class FormView (line 32) | public abstract class FormView extends RelativeLayout {
    method FormView (line 34) | public FormView(@NonNull Context context) {
    method getActionEvent (line 38) | @Nullable
    method validateForm (line 41) | public abstract boolean validateForm();
    method submitForm (line 50) | @Nullable

FILE: lib/src/main/java/com/auth0/android/lock/views/HeaderView.java
  class HeaderView (line 41) | @SuppressLint("ViewConstructor")
    method HeaderView (line 47) | public HeaderView(@NonNull Context context, @NonNull Theme lockTheme) {
    method init (line 52) | private void init(Theme lockTheme) {
    method setColor (line 68) | public void setColor(@ColorRes int color) {
    method setTitle (line 77) | public void setTitle(@NonNull String title) {
    method showTitle (line 81) | public void showTitle(boolean show) {
    method setLogo (line 90) | public void setLogo(@DrawableRes int logo) {

FILE: lib/src/main/java/com/auth0/android/lock/views/ImageCheckbox.java
  class ImageCheckbox (line 25) | public class ImageCheckbox extends AppCompatImageButton implements Check...
    method ImageCheckbox (line 33) | public ImageCheckbox(@NonNull Context context) {
    method ImageCheckbox (line 37) | public ImageCheckbox(@NonNull Context context, @NonNull AttributeSet a...
    method ImageCheckbox (line 41) | public ImageCheckbox(@NonNull Context context, @NonNull AttributeSet a...
    method setChecked (line 64) | @Override
    method isChecked (line 77) | @Override
    method toggle (line 82) | @Override
    method onCreateDrawableState (line 87) | @NonNull
    method onFocusChanged (line 97) | @Override
    method setOnCheckedChangeListener (line 103) | void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
    type OnCheckedChangeListener (line 107) | interface OnCheckedChangeListener {
      method onCheckedChanged (line 108) | void onCheckedChanged(ImageButton view, boolean isChecked);

FILE: lib/src/main/java/com/auth0/android/lock/views/LinkTextView.java
  class LinkTextView (line 16) | public class LinkTextView extends androidx.appcompat.widget.AppCompatTex...
    method LinkTextView (line 19) | public LinkTextView(@NonNull Context context) {
    method LinkTextView (line 24) | public LinkTextView(@NonNull Context context, @NonNull AttributeSet at...
    method LinkTextView (line 29) | public LinkTextView(@NonNull Context context, @NonNull AttributeSet at...
    method init (line 34) | private void init() {
    method onFocusChanged (line 40) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/LogInFormView.java
  class LogInFormView (line 52) | public class LogInFormView extends FormView implements TextView.OnEditor...
    method LogInFormView (line 69) | public LogInFormView(@NonNull Context context) {
    method LogInFormView (line 74) | public LogInFormView(@NonNull LockWidgetForm lockWidget) {
    method init (line 80) | private void init() {
    method setupMultipleConnectionUI (line 114) | private void setupMultipleConnectionUI() {
    method setupSingleConnectionUI (line 150) | private void setupSingleConnectionUI(final OAuthConnection connection) {
    method resetDomain (line 161) | private void resetDomain() {
    method getUsername (line 173) | private String getUsername() {
    method getPassword (line 184) | private String getPassword() {
    method submitForm (line 188) | @Nullable
    method getActionEvent (line 218) | @NonNull
    method validateForm (line 236) | @Override
    method onBackPressed (line 256) | public boolean onBackPressed() {
    method showSSOMessage (line 266) | private void showSSOMessage(boolean show) {
    method onEditorAction (line 273) | @Override
    method setLastEmail (line 281) | public void setLastEmail(@Nullable String email) {
    method onEmailChanged (line 286) | @Override
    method clearEmptyFieldsError (line 291) | public void clearEmptyFieldsError() {

FILE: lib/src/main/java/com/auth0/android/lock/views/MFACodeFormView.java
  class MFACodeFormView (line 38) | @SuppressLint("ViewConstructor")
    method MFACodeFormView (line 51) | public MFACodeFormView(@NonNull LockWidget lockWidget, @Nullable Strin...
    method init (line 62) | private void init() {
    method getActionEvent (line 69) | @NonNull
    method getInputText (line 80) | private String getInputText() {
    method validateForm (line 84) | @Override
    method submitForm (line 89) | @Nullable
    method onEditorAction (line 95) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/ModeSelectionView.java
  class ModeSelectionView (line 39) | @SuppressLint("ViewConstructor")
    method ModeSelectionView (line 47) | public ModeSelectionView(@NonNull Context context, @NonNull ModeSelect...
    method init (line 53) | private void init() {
    method setSelectedMode (line 76) | public void setSelectedMode(@AuthMode int mode) {
    method toggleBoldText (line 84) | private void toggleBoldText(View tabView, boolean bold) {
    method onTabSelected (line 89) | @Override
    method onTabUnselected (line 95) | @Override
    method onTabReselected (line 101) | @Override
    type ModeSelectedListener (line 107) | public interface ModeSelectedListener {
      method onModeSelected (line 108) | void onModeSelected(@AuthMode int mode);
      method getSelectedMode (line 110) | @AuthMode

FILE: lib/src/main/java/com/auth0/android/lock/views/PasswordStrengthView.java
  class PasswordStrengthView (line 41) | public class PasswordStrengthView extends LinearLayout {
    method PasswordStrengthView (line 67) | public PasswordStrengthView(@NonNull Context context) {
    method init (line 72) | private void init() {
    method showPolicy (line 92) | @SuppressLint("StringFormatInvalid")
    method hasIdenticalCharacters (line 118) | private boolean hasIdenticalCharacters(@NonNull String input) {
    method hasUppercaseCharacters (line 124) | private boolean hasUppercaseCharacters(@NonNull String input) {
    method hasLowercaseCharacters (line 130) | private boolean hasLowercaseCharacters(@NonNull String input) {
    method hasNumericCharacters (line 136) | private boolean hasNumericCharacters(@NonNull String input) {
    method hasSpecialCharacters (line 142) | private boolean hasSpecialCharacters(@NonNull String input) {
    method hasMinimumLength (line 148) | private boolean hasMinimumLength(@NonNull String input, int length) {
    method atLeastThree (line 154) | private boolean atLeastThree(boolean a, boolean b, boolean c, boolean ...
    method allThree (line 163) | private boolean allThree(boolean a, boolean b, boolean c) {
    method getMinimumLength (line 167) | private int getMinimumLength() {
    method setStrength (line 193) | @SuppressWarnings("DeprecatedIsStillUsed")
    method setPasswordComplexity (line 204) | public void setPasswordComplexity(@NonNull PasswordComplexity complexi...
    method isValid (line 215) | public boolean isValid(@Nullable String password) {

FILE: lib/src/main/java/com/auth0/android/lock/views/PasswordlessFormLayout.java
  class PasswordlessFormLayout (line 46) | public class PasswordlessFormLayout extends LinearLayout implements Pass...
    method PasswordlessFormLayout (line 56) | public PasswordlessFormLayout(@NonNull Context context) {
    method PasswordlessFormLayout (line 61) | public PasswordlessFormLayout(@NonNull LockWidgetPasswordless lockWidg...
    method init (line 67) | private void init() {
    method addSocialLayout (line 87) | private void addSocialLayout() {
    method addSeparator (line 92) | private void addSeparator() {
    method addPasswordlessRequestCodeLayout (line 112) | private void addPasswordlessRequestCodeLayout() {
    method addPasswordlessInputCodeLayout (line 119) | private void addPasswordlessInputCodeLayout(@NonNull String emailOrNum...
    method onBackPressed (line 129) | public boolean onBackPressed() {
    method codeSent (line 153) | public void codeSent(@NonNull String emailOrNumber) {
    method onActionPressed (line 174) | @Nullable
    method onCodeNeedToResend (line 184) | @Override
    method onCountryCodeSelected (line 206) | public void onCountryCodeSelected(@NonNull String country, @NonNull St...
    method loadPasswordlessData (line 212) | public void loadPasswordlessData(@NonNull String emailOrNumber, @Nulla...

FILE: lib/src/main/java/com/auth0/android/lock/views/PasswordlessInputCodeFormView.java
  class PasswordlessInputCodeFormView (line 47) | @SuppressLint("ViewConstructor")
    method PasswordlessInputCodeFormView (line 68) | @SuppressLint("LambdaLast")
    method init (line 78) | private void init(@NonNull String identity) {
    method selectPasswordlessMode (line 92) | private void selectPasswordlessMode(@NonNull String identity) {
    method getActionEvent (line 118) | @NonNull
    method getInputText (line 124) | private String getInputText() {
    method validateForm (line 128) | @Override
    method submitForm (line 133) | @Nullable
    method run (line 140) | @Override
    method onClick (line 146) | @Override
    method onEditorAction (line 154) | @Override
    type OnCodeResendListener (line 162) | public interface OnCodeResendListener {
      method onCodeNeedToResend (line 167) | void onCodeNeedToResend();

FILE: lib/src/main/java/com/auth0/android/lock/views/PasswordlessLockView.java
  class PasswordlessLockView (line 54) | @SuppressWarnings("NullableProblems")
    method PasswordlessLockView (line 67) | public PasswordlessLockView(@NonNull Context context, @NonNull Bus loc...
    method init (line 74) | private void init() {
    method showWaitForConfigurationLayout (line 84) | private void showWaitForConfigurationLayout() {
    method showContentLayout (line 92) | private void showContentLayout() {
    method configure (line 115) | public void configure(@Nullable Configuration configuration) {
    method showConfigurationMissingLayout (line 126) | private void showConfigurationMissingLayout(final boolean showRetry) {
    method updateHeaderTitle (line 154) | @Override
    method resetHeaderTitle (line 160) | @Override
    method onBackPressed (line 171) | public boolean onBackPressed() {
    method showProgress (line 181) | public void showProgress(boolean show) {
    method onPasswordlessCodeSent (line 194) | @Override
    method getConfiguration (line 199) | @NonNull
    method onFormSubmit (line 205) | @Override
    method onOAuthLoginRequest (line 210) | @Override
    method onClick (line 216) | @Override
    method onCountryCodeChangeRequest (line 225) | @Override
    method onCountryCodeSelected (line 236) | public void onCountryCodeSelected(@NonNull String country, @NonNull St...
    method loadPasswordlessData (line 240) | public void loadPasswordlessData(@NonNull String input, @Nullable Coun...

FILE: lib/src/main/java/com/auth0/android/lock/views/PasswordlessRequestCodeFormView.java
  class PasswordlessRequestCodeFormView (line 48) | @SuppressLint("ViewConstructor")
    method PasswordlessRequestCodeFormView (line 60) | public PasswordlessRequestCodeFormView(@NonNull LockWidgetPasswordless...
    method init (line 69) | private void init(boolean showTitle) {
    method selectPasswordlessMode (line 80) | private void selectPasswordlessMode(boolean showTitle) {
    method getActionEvent (line 112) | @NonNull
    method getInputText (line 125) | @SuppressLint("KotlinPropertyAccess")
    method validateForm (line 130) | @Override
    method submitForm (line 135) | @Nullable
    method onCountryCodeSelected (line 147) | public void onCountryCodeSelected(@NonNull String isoCode, @NonNull St...
    method onClick (line 152) | @Override
    method onEditorAction (line 160) | @Override
    method setInputText (line 168) | public void setInputText(@NonNull String text) {

FILE: lib/src/main/java/com/auth0/android/lock/views/SignUpFormView.java
  class SignUpFormView (line 53) | public class SignUpFormView extends FormView implements TextView.OnEdito...
    method SignUpFormView (line 64) | public SignUpFormView(@NonNull Context context) {
    method SignUpFormView (line 69) | public SignUpFormView(@NonNull LockWidgetForm lockWidget) {
    method init (line 75) | private void init() {
    method addCustomFields (line 101) | private void addCustomFields(List<CustomField> customFields) {
    method defineFieldParams (line 115) | private LinearLayout.LayoutParams defineFieldParams() {
    method getActionEvent (line 125) | @Override
    method getUsername (line 132) | @Nullable
    method getEmail (line 137) | @NonNull
    method getPassword (line 142) | @NonNull
    method validateForm (line 147) | @Override
    method submitForm (line 166) | @Nullable
    method onEditorAction (line 184) | @Override
    method setLastEmail (line 192) | public void setLastEmail(@Nullable String email) {
    method onEmailChanged (line 197) | @Override
    method clearEmptyFieldsError (line 202) | public void clearEmptyFieldsError() {

FILE: lib/src/main/java/com/auth0/android/lock/views/SocialButton.java
  class SocialButton (line 18) | @SuppressLint("Instantiatable")
    method SocialButton (line 27) | public SocialButton(Context context, AttributeSet attrs) {
    method SocialButton (line 32) | public SocialButton(Context context) {
    method init (line 37) | private void init() {
    method getTouchFeedbackBackground (line 46) | private StateListDrawable getTouchFeedbackBackground(@ColorInt int pre...
    method setStyle (line 74) | public void setStyle(AuthConfig config, @AuthMode int mode) {

FILE: lib/src/main/java/com/auth0/android/lock/views/SocialView.java
  class SocialView (line 49) | @SuppressLint("ViewConstructor")
    method SocialView (line 62) | @SuppressLint("LambdaLast")
    method init (line 70) | private void init() {
    method generateAuthConfigs (line 89) | private List<AuthConfig> generateAuthConfigs(List<OAuthConnection> con...
    method onAuthenticationRequest (line 98) | @Override
    method setCurrentMode (line 108) | public void setCurrentMode(@AuthMode int mode) {

FILE: lib/src/main/java/com/auth0/android/lock/views/SocialViewAdapter.java
  class SocialViewAdapter (line 39) | class SocialViewAdapter extends RecyclerView.Adapter<SocialViewAdapter.V...
    method SocialViewAdapter (line 48) | public SocialViewAdapter(Context context, @NonNull List<AuthConfig> au...
    method onCreateViewHolder (line 53) | @Override
    method onBindViewHolder (line 60) | @Override
    method getItemCount (line 65) | @Override
    method setButtonMode (line 75) | public void setButtonMode(@AuthMode int mode) {
    method setCallback (line 84) | public void setCallback(OAuthListener callback) {
    class ViewHolder (line 88) | public class ViewHolder extends RecyclerView.ViewHolder implements Vie...
      method ViewHolder (line 91) | public ViewHolder(@NonNull View v) {
      method onClick (line 97) | @Override
    type OAuthListener (line 109) | public interface OAuthListener {
      method onAuthenticationRequest (line 115) | void onAuthenticationRequest(@NonNull OAuthConnection connection);

FILE: lib/src/main/java/com/auth0/android/lock/views/SpacesItemDecoration.java
  class SpacesItemDecoration (line 9) | class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    method SpacesItemDecoration (line 13) | public SpacesItemDecoration(int space, @LinearLayoutCompat.Orientation...
    method getItemOffsets (line 18) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/ValidatedInputView.java
  class ValidatedInputView (line 73) | public class ValidatedInputView extends LinearLayout {
    method ValidatedInputView (line 113) | public ValidatedInputView(@NonNull Context context) {
    method ValidatedInputView (line 118) | public ValidatedInputView(@NonNull Context context, @NonNull Attribute...
    method ValidatedInputView (line 123) | public ValidatedInputView(@NonNull Context context, @NonNull Attribute...
    method init (line 128) | private void init(AttributeSet attrs) {
    method onAttachedToWindow (line 177) | @Override
    method onDetachedFromWindow (line 183) | @Override
    method beforeTextChanged (line 190) | @Override
    method onTextChanged (line 194) | @Override
    method afterTextChanged (line 198) | @Override
    method runValidation (line 206) | private void runValidation() {
    method notifyEmailChanged (line 213) | private void notifyEmailChanged(String emailInput) {
    method setupInputValidation (line 223) | @SuppressLint("StringFormatInvalid")
    method updateBorder (line 303) | @CallSuper
    method createBackground (line 311) | private void createBackground() {
    method setDataType (line 324) | public void setDataType(@DataType int type) {
    method getDataType (line 336) | @SuppressLint("KotlinPropertyAccess")
    method validate (line 348) | public boolean validate() {
    method validate (line 360) | protected boolean validate(boolean validateEmptyFields) {
    method getText (line 403) | @NonNull
    method setText (line 413) | public void setText(@Nullable String text) {
    method setEnabled (line 420) | @Override
    method isEnabled (line 428) | @Override
    method setAllowShowPassword (line 439) | public void setAllowShowPassword(boolean allow) {
    method setHint (line 449) | public void setHint(@StringRes int hint) {
    method setErrorDescription (line 458) | public void setErrorDescription(@Nullable String error) {
    method setIcon (line 467) | public void setIcon(@DrawableRes int icon) {
    method clearInput (line 474) | public void clearInput() {
    method addTextChangedListener (line 487) | public void addTextChangedListener(@NonNull TextWatcher watcher) {
    method setOnEditorActionListener (line 496) | public void setOnEditorActionListener(@NonNull TextView.OnEditorAction...
    method setIdentityListener (line 505) | public void setIdentityListener(@NonNull IdentityListener listener) {

FILE: lib/src/main/java/com/auth0/android/lock/views/ValidatedPasswordInputView.java
  class ValidatedPasswordInputView (line 12) | public class ValidatedPasswordInputView extends ValidatedInputView {
    method ValidatedPasswordInputView (line 17) | public ValidatedPasswordInputView(@NonNull Context context) {
    method ValidatedPasswordInputView (line 22) | public ValidatedPasswordInputView(@NonNull Context context, @NonNull A...
    method ValidatedPasswordInputView (line 27) | public ValidatedPasswordInputView(@NonNull Context context, @NonNull A...
    method init (line 32) | public void init() {
    method validate (line 37) | @Override
    method updateBorder (line 46) | @Override
    method setPasswordPolicy (line 60) | @Deprecated
    method setPasswordComplexity (line 71) | public void setPasswordComplexity(@NonNull PasswordComplexity complexi...

FILE: lib/src/main/java/com/auth0/android/lock/views/ValidatedUsernameInputView.java
  class ValidatedUsernameInputView (line 43) | public class ValidatedUsernameInputView extends ValidatedInputView {
    method ValidatedUsernameInputView (line 51) | public ValidatedUsernameInputView(@NonNull Context context) {
    method ValidatedUsernameInputView (line 56) | public ValidatedUsernameInputView(@NonNull Context context, @NonNull A...
    method ValidatedUsernameInputView (line 61) | public ValidatedUsernameInputView(@NonNull Context context, @NonNull A...
    method init (line 66) | private void init() {
    method configureFrom (line 75) | public void configureFrom(@Nullable DatabaseConnection connection) {
    method setUsernameStyle (line 90) | @SuppressLint("StringFormatInvalid")
    method validate (line 104) | @Override

FILE: lib/src/main/java/com/auth0/android/lock/views/ViewUtils.java
  class ViewUtils (line 55) | abstract class ViewUtils {
    method dipToPixels (line 76) | static float dipToPixels(Resources resources, int dip) {
    method getRoundedBackground (line 88) | static ShapeDrawable getRoundedBackground(@NonNull View view, @ColorIn...
    method getRoundedOutlineBackground (line 121) | static ShapeDrawable getRoundedOutlineBackground(Resources resources, ...
    method getOpaqueRoundedOutlineBackground (line 138) | static Drawable getOpaqueRoundedOutlineBackground(
    method setBackground (line 158) | static void setBackground(@NonNull View view, @Nullable Drawable backg...
    method measureViewHeight (line 167) | static int measureViewHeight(@Nullable View view) {
    method tintWidget (line 182) | static void tintWidget(@NonNull ProgressBar progressBar, @ColorInt int...

FILE: lib/src/main/java/com/auth0/android/lock/views/interfaces/IdentityListener.java
  type IdentityListener (line 29) | public interface IdentityListener {
    method onEmailChanged (line 31) | void onEmailChanged(@NonNull String currentValue);

FILE: lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidget.java
  type LockWidget (line 32) | public interface LockWidget {
    method getContext (line 34) | @NonNull
    method getConfiguration (line 37) | @NonNull
    method onFormSubmit (line 40) | void onFormSubmit();

FILE: lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidgetForm.java
  type LockWidgetForm (line 32) | public interface LockWidgetForm extends LockWidgetOAuth, IdentityListener {
    method showChangePasswordForm (line 34) | void showChangePasswordForm(boolean show);
    method showCustomFieldsForm (line 36) | void showCustomFieldsForm(@NonNull DatabaseSignUpEvent event);
    method showBottomBanner (line 38) | void showBottomBanner(boolean show);
    method showTopBanner (line 40) | void showTopBanner(boolean show);
    method updateButtonLabel (line 42) | void updateButtonLabel(@StringRes int stringRes);

FILE: lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidgetOAuth.java
  type LockWidgetOAuth (line 31) | public interface LockWidgetOAuth extends LockWidget {
    method onOAuthLoginRequest (line 33) | void onOAuthLoginRequest(@NonNull OAuthLoginEvent event);

FILE: lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidgetPasswordless.java
  type LockWidgetPasswordless (line 30) | public interface LockWidgetPasswordless extends LockWidgetOAuth {
    method onCountryCodeChangeRequest (line 32) | void onCountryCodeChangeRequest();
    method onPasswordlessCodeSent (line 34) | void onPasswordlessCodeSent(@NonNull String emailOrNumber);
    method updateHeaderTitle (line 41) | void updateHeaderTitle(@StringRes int titleRes);
    method resetHeaderTitle (line 46) | void resetHeaderTitle();

FILE: lib/src/test/java/com/auth0/android/lock/Auth0ParcelableTest.java
  class Auth0ParcelableTest (line 21) | @RunWith(RobolectricTestRunner.class)
    method shouldSaveClientId (line 29) | @Test
    method shouldSaveDomainUrl (line 42) | @Test
    method shouldSaveConfigurationUrl (line 55) | @Test
    method shouldSaveUserAgent (line 68) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/AuthenticationCallbackTest.java
  class AuthenticationCallbackTest (line 50) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 56) | @Before
    method shouldCallOnAuthentication (line 61) | @Test
    method shouldReturnAuthentication (line 70) | @Test
    method shouldReturnAuthenticationError (line 85) | @Test
    method shouldCallOnCanceled (line 95) | @Test
    method shouldNotAuthenticateOrCancelWhenSignUp (line 104) | @Test
    method shouldNotAuthenticateOrCancelWhenResetPassword (line 114) | @Test
    method getAuthenticationData (line 124) | public Intent getAuthenticationData() {
    method credentialsFromData (line 135) | public Credentials credentialsFromData(Intent data) {

FILE: lib/src/test/java/com/auth0/android/lock/ClassicBuilderTest.java
  class ClassicBuilderTest (line 27) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 38) | @Before
    method shouldThrowIfCallbackIsMissing (line 43) | @Test
    method shouldThrowIfAccountIsMissing (line 53) | @Test
    method shouldThrowIfAccountIsMissingAlsoFromResources (line 63) | @Test
    method shouldCreateAccountFromResources (line 77) | @Test
    method shouldThrowIfAllScreensAreDisabled (line 94) | @Test
    method shouldThrowIfInitialScreenIsLogInButIsDisabled (line 106) | @Test
    method shouldThrowIfInitialScreenIsSignUpButIsDisabled (line 117) | @Test
    method shouldThrowIfInitialScreenIsForgotPasswordButIsDisabled (line 128) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/LockActivityTest.java
  class LockActivityTest (line 68) | @SuppressWarnings("ResultOfMethodCallIgnored")
    method setUp (line 109) | @Before
    method shouldFailDatabaseLoginOnNullConnection (line 144) | @Test
    method shouldCallOIDCDatabaseLoginWithOTPCodeAndMFAToken (line 158) | @Test
    method shouldCallOIDCDatabaseLoginWithOOBCodeAndMFAToken (line 189) | @Test
    method shouldSuccessfullyRequestMFAChallengeWhenMFAIsRequired (line 222) | @Test
    method shouldFailToRequestMFAChallengeWhenMFAIsRequired (line 265) | @Test
    method shouldCallDatabaseLoginThatWillRequireVerification (line 307) | @Test
    method shouldCallDatabaseSignUpThatWillRequireVerification (line 345) | @Test
    method shouldCallDatabaseCreateUserThatWillRequireVerification (line 386) | @Test
    method shouldCallOIDCDatabaseLoginWithCustomAudience (line 422) | @Test
    method shouldFailDatabaseSignUpOnNullConnection (line 451) | @Test
    method shouldCallDatabaseSignUpWithUsername (line 465) | @Test
    method shouldCallDatabaseSignUp (line 479) | @Test
    method shouldCallOIDCDatabaseSignInWithCustomAudience (line 493) | @Test
    method shouldFailDatabasePasswordResetOnNullConnection (line 524) | @Test
    method shouldCallDatabasePasswordReset (line 538) | @Test
    method shouldCallEnterpriseOAuthAuthenticationWithActiveFlow (line 551) | @Test
    method shouldCallOAuthAuthenticationWithCustomProvider (line 573) | @Test
    method shouldCallOAuthAuthenticationWithCustomProviderAndAudience (line 599) | @Test
    method shouldCallEnterpriseOAuthAuthenticationWithCustomProvider (line 636) | @Test
    method shouldCallEnterpriseOAuthAuthenticationWithWebProvider (line 673) | @Test
    method shouldResumeEnterpriseOAuthAuthenticationWithWebProviderOnActivityResult (line 690) | @Test
    method shouldCallOAuthAuthenticationWithWebProvider (line 705) | @Test
    method shouldResumeOAuthAuthenticationWithWebProviderOnActivityResult (line 719) | @Test
    method shouldResumeOAuthAuthenticationWithCustomProviderOnActivityResult (line 733) | @Test
    method shouldResumeOAuthAuthenticationWithWebProviderOnNewIntent (line 753) | @Test
    method shouldResumeOAuthAuthenticationWithCustomProviderOnNewIntent (line 767) | @Test
    method shouldResumeEnterpriseOAuthAuthenticationWithWebProviderOnNewIntent (line 787) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/PasswordlessBuilderTest.java
  class PasswordlessBuilderTest (line 29) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 40) | @Before
    method shouldThrowIfCallbackIsMissing (line 45) | @Test
    method shouldThrowIfAccountIsMissing (line 55) | @Test
    method shouldThrowIfAccountIsMissingAlsoFromResources (line 65) | @Test
    method shouldCreateAccountFromResources (line 79) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/PasswordlessIdentityHelperTest.java
  class PasswordlessIdentityHelperTest (line 24) | public class PasswordlessIdentityHelperTest {
    method setUp (line 30) | @SuppressLint("CommitPrefEdits")
    method shouldSaveIdentity (line 43) | @Test
    method shouldSaveIdentityWithCountry (line 53) | @Test
    method shouldGetSavedIdentity (line 63) | @Test
    method shouldGetSavedCountry (line 72) | @Test
    method shouldNotHaveLoggedInBeforeIfCurrentPasswordlessModeIsDisabled (line 83) | @Test
    method shouldNotHaveLoggedInBeforeIfLastPasswordlessModeIsDisabled (line 89) | @Test
    method shouldNotHaveLoggedInBeforeOnDifferentConnections (line 96) | @Test
    method shouldHaveLoggedInBeforeOnSameConnections (line 123) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/PasswordlessLockActivityTest.java
  class PasswordlessLockActivityTest (line 58) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 83) | @Before
    method shouldFailPasswordlessCodeRequestWithEmailOnNullConnection (line 110) | @Test
    method shouldCallPasswordlessCodeRequestWithEmail (line 125) | @Test
    method shouldDoPasswordlessLoginWithEmail (line 140) | @Test
    method shouldFailPasswordlessCodeRequestWithPhoneOnNullConnection (line 163) | @Test
    method shouldCallPasswordlessCodeRequestWithPhone (line 177) | @Test
    method shouldDoPasswordlessLoginWithPhone (line 192) | @Test
    method shouldCallOAuthAuthenticationWithCustomProvider (line 215) | @Test
    method shouldCallOAuthAuthenticationWithCustomProviderAndAudience (line 242) | @Test
    method shouldCallOAuthAuthenticationWithWebProvider (line 281) | @Test
    method shouldResumeOAuthAuthenticationWithWebProviderOnActivityResult (line 297) | @Test
    method shouldResumeOAuthAuthenticationWithCustomProviderOnActivityResult (line 311) | @Test
    method shouldResumeOAuthAuthenticationWithWebProviderOnNewIntent (line 331) | @Test
    method shouldResumeOAuthAuthenticationWithCustomProviderOnNewIntent (line 345) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/WebProviderTest.java
  class WebProviderTest (line 54) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 63) | @Before
    method shouldStart (line 73) | @Test
    method shouldFailWhenBrowserAppIsMissing (line 84) | @Test
    method shouldStartWithCustomAuthenticationParameters (line 100) | @Test
    method shouldStartWithCustomAudience (line 134) | @Test
    method shouldStartBrowserWithOptions (line 162) | @Test
    method shouldResumeWithIntent (line 206) | @Test
    method setupBrowserContext (line 218) | static void setupBrowserContext(@NonNull Context context, @NonNull Lis...
    method resolveInfoForPackageName (line 230) | private static ResolveInfo resolveInfoForPackageName(@Nullable String ...

FILE: lib/src/test/java/com/auth0/android/lock/errors/LoginErrorMessageBuilderTest.java
  class LoginErrorMessageBuilderTest (line 19) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 28) | @Before
    method shouldHaveDefaultMessageIfAccessDenied (line 34) | @Test
    method shouldHaveCustomMessageIfInvalidCredentials (line 41) | @Test
    method shouldHaveDescriptionIfRuleError (line 48) | @Test
    method shouldHaveCustomMessageIfPasswordLeaked (line 57) | @Test
    method shouldHaveCustomMessageIfMultifactorCodeInvalid (line 64) | @Test
    method shouldHaveDefaultMessageIfMultifactorRequired (line 71) | @Test
    method shouldHaveDefaultMessageIfMultifactorEnrollRequired (line 78) | @Test
    method shouldHaveCustomMessageIfUsernameExists (line 85) | @Test
    method shouldHaveCustomMessageIfUserIsBlocked (line 96) | @Test
    method shouldHaveCustomMessageIfIsTooManyAttempts (line 104) | @Test
    method shouldHaveDefaultMessageIfIsWrongClientType (line 111) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/errors/SignUpErrorMessageBuilderTest.java
  class SignUpErrorMessageBuilderTest (line 19) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 28) | @Before
    method shouldHaveDefaultMessageIfAccessDenied (line 34) | @Test
    method shouldHaveDescriptionIfRuleError (line 41) | @Test
    method shouldHaveCustomMessageIfUsernameExists (line 50) | @Test
    method shouldHaveCustomMessageIfIsTooManyAttempts (line 61) | @Test
    method shouldHaveCustomMessageIfPasswordNotStrongEnough (line 68) | @Test
    method shouldHaveCustomMessageIfPasswordAlreadyUsed (line 75) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/events/DatabaseEventTest.java
  class DatabaseEventTest (line 12) | @RunWith(RobolectricTestRunner.class)
    method shouldSetEmailIdentity (line 16) | @Test
    method shouldSetUsernameIdentity (line 23) | @Test
    method shouldSetUsername (line 30) | @Test
    method shouldSetBothEmailAndUsername (line 37) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/events/DatabaseLoginEventTest.java
  class DatabaseLoginEventTest (line 13) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 19) | @Before
    method shouldGetUsername (line 24) | @Test
    method shouldGetPassword (line 29) | @Test
    method shouldNotHaveOTP (line 34) | @Test
    method shouldSetOTP (line 39) | @Test
    method shouldNotHaveOOBCode (line 45) | @Test
    method shouldSetOOBCode (line 50) | @Test
    method shouldNotHaveMFAToken (line 56) | @Test
    method shouldSetMFAToken (line 61) | @Test
    method shouldNotHaveMFAChallengeType (line 67) | @Test
    method shouldSetMFAChallengeType (line 72) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/events/DatabaseSignUpEventTest.java
  class DatabaseSignUpEventTest (line 55) | @RunWith(RobolectricTestRunner.class)
    method shouldSetAllValues (line 64) | @Test
    method shouldSetNullUsername (line 73) | @Test
    method shouldGetSignUpRequestWithUsername (line 82) | @Test
    method shouldGetSignUpRequestWithoutUsername (line 91) | @Test
    method shouldGetSignUpRequestWithUserMetadata (line 100) | @Test
    method shouldGetSignUpRequestWithRootProfileAttributes (line 123) | @Test
    method shouldGetCreateUserRequestWithoutRootProfileAttributes (line 146) | @Test
    method shouldGetCreateUserRequestWithUsername (line 162) | @Test
    method shouldGetCreateUserRequestWithoutUsername (line 171) | @Test
    method shouldGetCreateUserRequestWithUserMetadata (line 180) | @Test
    method shouldGetCreateUserRequestWithRootProfileAttributes (line 205) | @Test
    method createRootProfileAttributes (line 228) | private Map<String, String> createRootProfileAttributes() {
    method createMetadata (line 236) | private Map<String, String> createMetadata() {
    method assertValidRootProfileAttributes (line 243) | private void assertValidRootProfileAttributes(Map<String, Object> map) {
    method assertValidMetadata (line 250) | private void assertValidMetadata(Map<String, String> map) {

FILE: lib/src/test/java/com/auth0/android/lock/events/ErrorMessageEventTest.java
  class ErrorMessageEventTest (line 11) | @RunWith(RobolectricTestRunner.class)
    method shouldSetMessageResource (line 15) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/events/OAuthLoginEventTest.java
  class OAuthLoginEventTest (line 19) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 25) | @Before
    method shouldGetStrategyName (line 32) | @Test
    method shouldGetConnectionName (line 41) | @Test
    method shouldUseActiveFlow (line 50) | @Test
    method shouldHaveUsernameOnActiveFlow (line 56) | @Test
    method shouldHavePasswordOnActiveFlow (line 62) | @Test
    method shouldUseWebAuth (line 68) | @Test
    method shouldNotHaveUsernameOnWebAuth (line 74) | @Test
    method shouldNotHavePasswordOnWebAuth (line 80) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/events/PasswordlessLoginEventTest.java
  class PasswordlessLoginEventTest (line 52) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 65) | @Before
    method shouldHaveNullCodeByDefault (line 71) | @Test
    method shouldSetTheCode (line 80) | @Test
    method shouldGetValidCodeRequestWhenUsingEmailAndCode (line 88) | @Test
    method shouldGetValidCodeRequestWhenUsingEmailAndLink (line 102) | @Test
    method shouldGetValidCodeRequestWhenUsingSMSAndCode (line 116) | @Test
    method shouldGetValidCodeRequestWhenUsingSMSAndLink (line 130) | @Test
    method shouldCallApiClientPasswordlessStartWhenUsingSMSAndLink (line 144) | @Test
    method shouldCallApiClientPasswordlessStartWhenUsingSMSAndCode (line 156) | @Test
    method shouldCallApiClientPasswordlessStartWhenUsingEmailAndLink (line 168) | @Test
    method shouldCallApiClientPasswordlessStartWhenUsingEmailAndCode (line 180) | @Test
    method shouldSetConnectionWhenUsingSMSAndLink (line 192) | @Test
    method shouldSetConnectionWhenWhenUsingSMSAndCode (line 204) | @Test
    method shouldSetConnectionWhenWhenUsingEmailAndLink (line 216) | @Test
    method shouldSetConnectionWhenWhenUsingEmailAndCode (line 228) | @Test
    method shouldGetValidLoginRequestWhenUsingEmailAndCode (line 240) | @Test
    method shouldGetValidLoginRequestWhenUsingEmailAndLink (line 253) | @Test
    method shouldGetValidLoginRequestWhenUsingSMSAndCode (line 266) | @Test
    method shouldGetValidLoginRequestWhenUsingSMSAndLink (line 279) | @Test
    method shouldCallApiClientPasswordlessLoginWhenUsingEmailAndCode (line 292) | @Test
    method shouldCallApiClientPasswordlessLoginWhenUsingEmailAndLink (line 305) | @Test
    method shouldCallApiClientPasswordlessLoginWhenUsingSMSAndCode (line 318) | @Test
    method shouldCallApiClientPasswordlessLoginWhenUsingSMSAndLink (line 331) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ApplicationFetcherTest.java
  class ApplicationFetcherTest (line 48) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 55) | @Before
    method tearDown (line 67) | @After
    method shouldReturnApplicationOnValidJSONPResponse (line 72) | @Test
    method shouldReturnExceptionOnInvalidJSONPResponse (line 84) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ApplicationGsonTest.java
  class ApplicationGsonTest (line 46) | public class ApplicationGsonTest extends GsonBaseTest {
    method setUp (line 52) | @Before
    method shouldFailWithEmptyJson (line 57) | @Test
    method shouldFailWithInvalidJson (line 63) | @Test
    method shouldRequireId (line 69) | @Test
    method shouldRequireTenant (line 76) | @Test
    method shouldRequireAuthorize (line 83) | @Test
    method shouldAllowEmptyAuthorize (line 90) | @Test
    method shouldRequireCallback (line 95) | @Test
    method shouldAllowEmptyCallback (line 102) | @Test
    method shouldRequireStrategies (line 107) | @Test
    method shouldReturnApplication (line 114) | @Test
    method buildApplicationFrom (line 123) | private List<Connection> buildApplicationFrom(Reader json) throws IOEx...

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ConfigurationTest.java
  class ConfigurationTest (line 67) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 84) | @Before
    method shouldKeepApplicationDefaultsIfOptionsAreNotModified (line 94) | @Test
    method shouldGetValidStyleForNotOverriddenStrategy (line 115) | @Test
    method shouldGetVisibleSignUpFieldsThreshold (line 121) | @Test
    method shouldGetStyleForOverriddenStrategy (line 128) | @Test
    method shouldMergeApplicationWithOptionsIfDefaultDatabaseExists (line 136) | @Test
    method shouldNotMergeApplicationWithOptionsIfApplicationIsRestrictive (line 155) | @Test
    method shouldNotUseClassicLockIfNoConnectionsAreAvailable (line 165) | @Test
    method shouldUseClassicLockWithEnterpriseConnections (line 171) | @Test
    method shouldUseClassicLockWithSocialConnections (line 177) | @Test
    method shouldUseClassicLockWithDatabaseConnections (line 183) | @Test
    method shouldNotUsePasswordlessIfNoConnectionsAreAvailable (line 189) | @Test
    method shouldIgnoreAllowedScreenSettingsIfDatabaseConnectionsAreAvailable (line 195) | @Test
    method shouldUsePasswordlessLockWithSocialConnections (line 204) | @Test
    method shouldUsePasswordlessLockWithPasswordlessConnections (line 210) | @Test
    method shouldPasswordlessLockNotBeAffectedByClassicLockScreenFlags (line 216) | @Test
    method shouldSetExtraSignUpFields (line 225) | @Test
    method shouldSetInitialScreenWhenDatabaseConnectionAvailable (line 240) | @Test
    method shouldNotChangeInitialScreenWhenNoDatabaseConnectionAvailable (line 257) | @Test
    method shouldPreferPasswordlessEmailOverSMSWhenBothAvailable (line 271) | @Test
    method shouldSetCorrectPasswordlessTypeWhenUsingEmail (line 286) | @Test
    method shouldSetCorrectPasswordlessTypeWhenUsingSMS (line 301) | @Test
    method shouldNotHavePasswordlessModeWithoutConnections (line 316) | @Test
    method shouldDefaultToCodePasswordlessWhenTypeMissingFromOptions (line 325) | @Test
    method shouldNotFilterDefaultDBConnection (line 333) | @Test
    method shouldHandleNoDBConnections (line 339) | @Test
    method shouldFilterDBConnection (line 347) | @Test
    method shouldReturnNullDBConnectionWhenNoneMatch (line 353) | @Test
    method shouldReturnSpecifiedDBConnectionWhenMoreThanOneDBConnectionIsAvailable (line 359) | @Test
    method shouldReturnSpecifiedDBConnectionIfAvailable (line 367) | @Test
    method shouldIgnoreSpecifiedDBConnectionIfNotAvailable (line 376) | @Test
    method shouldIgnoreSpecifiedDBConnectionIfFiltered (line 385) | @Test
    method shouldReturnUnfilteredPasswordlessConnections (line 394) | @Test
    method shouldReturnFilteredPasswordlessConnections (line 403) | @Test
    method shouldPreferEmailPasswordlessConnection (line 411) | @Test
    method shouldReturnEmptyPasswordlessConnectionIfNoneMatch (line 419) | @Test
    method shouldIgnoreStrategyNameAndReturnFilteredConnections (line 426) | @Test
    method shouldNotReturnFilteredSocialStrategiesWithoutConnections (line 434) | @Test
    method shouldReturnUnfilteredSocialConnections (line 442) | @Test
    method shouldReturnFilteredSocialConnections (line 451) | @Test
    method shouldReturnEmptySocialConnectionsIfNoneMatch (line 458) | @Test
    method shouldReturnUnfilteredEnterpriseConnections (line 464) | @Test
    method shouldAllowEnterpriseActiveFlowByDefault (line 474) | @Test
    method shouldDisableEnterpriseActiveFlowOnGivenConnections (line 487) | @Test
    method shouldNotFilterEnterpriseConnectionsByWebAuthEnabled (line 504) | @Test
    method shouldReturnFilteredEnterpriseConnections (line 516) | @Test
    method shouldReturnEmptyEnterpriseConnectionsIfNoneMatch (line 522) | @Test
    method shouldHaveDefaultPrivacyPolicyURL (line 528) | @Test
    method shouldHaveCustomPrivacyPolicyURL (line 535) | @Test
    method shouldHaveDefaultTermsOfServiceURL (line 543) | @Test
    method shouldHaveCustomTermsOfServiceURL (line 550) | @Test
    method shouldNotHaveDefaultSupportURL (line 558) | @Test
    method shouldHaveCustomSupportURL (line 564) | @Test
    method shouldHaveMustAcceptTermsEnabled (line 572) | @Test
    method shouldHaveShowTermsDisabled (line 579) | @Test
    method shouldNotUseLabeledSubmitButton (line 586) | @Test
    method shouldGetPasswordPolicy (line 593) | @Test
    method shouldHideMainScreenTitle (line 602) | @Test
    method shouldUsePasswordlessAutoSubmit (line 609) | @Test
    method unfilteredConfig (line 616) | private Configuration unfilteredConfig() {
    method filteredConfigBy (line 620) | private Configuration filteredConfigBy(String... names) {
    method createVisibleSignUpFields (line 625) | private List<SignUpField> createVisibleSignUpFields() {
    method createHiddenSignUpFields (line 635) | private List<SignUpField> createHiddenSignUpFields() {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ConnectionGsonTest.java
  class ConnectionGsonTest (line 49) | public class ConnectionGsonTest extends GsonBaseTest {
    method setUp (line 59) | @Before
    method shouldFailWithEmptyJson (line 64) | @Test
    method shouldFailWithInvalidJson (line 70) | @Test
    method shouldRequireName (line 76) | @Test
    method shouldRequireConnections (line 82) | @Test
    method shouldReturnStrategy (line 88) | @Test
    method shouldReturnConnectionName (line 97) | @Test
    method shouldReturnEnterpriseConnections (line 105) | @Test
    method shouldReturnSocial (line 117) | @Test
    method shouldReturnDatabase (line 128) | @Test
    method shouldReturnDatabaseWithComplexity (line 145) | @Test
    method buildConnectionsFrom (line 162) | private List<Connection> buildConnectionsFrom(Reader json) throws IOEx...

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ConnectionMatcher.java
  class ConnectionMatcher (line 31) | public class ConnectionMatcher<T extends BaseConnection> extends BaseMat...
    method ConnectionMatcher (line 38) | public ConnectionMatcher(String strategy, String name, @AuthType Integ...
    method matches (line 44) | @Override
    method describeTo (line 65) | @Override
    method describeMismatch (line 75) | @Override
    method hasConnection (line 87) | public static ConnectionMatcher hasConnection(String strategy, String ...
    method hasName (line 91) | public static ConnectionMatcher hasName(String name) {
    method hasStrategy (line 95) | public static ConnectionMatcher hasStrategy(String name) {
    method hasType (line 99) | public static ConnectionMatcher hasType(@AuthType int type) {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ConnectionTest.java
  class ConnectionTest (line 45) | @RunWith(RobolectricTestRunner.class)
    method shouldBuildConnectionWithName (line 56) | @Test
    method shouldBuildConnectionWithValues (line 66) | @Test
    method shouldNotStoreNameInValues (line 75) | @Test
    method shouldRaiseExceptionWhenNameIsNull (line 83) | @Test
    method shouldReturnValueFromKey (line 90) | @Test
    method shouldReturnNullValueFromMissingKey (line 100) | @Test
    method shouldReturnNullValueOnWrongClassType (line 109) | @Test
    method shouldReturnBooleanFromKey (line 119) | @Test
    method shouldReturnBooleanFromMissingKey (line 129) | @Test
    method shouldReturnBooleanFromNullValue (line 138) | @Test
    method shouldReturnUnknownSocial (line 148) | @Test
    method shouldReturnSocial (line 154) | @Test
    method shouldReturnValidDatabaseStrategy (line 233) | @Test
    method shouldReturnValidPasswordlessStrategy (line 239) | @Test
    method shouldReturnEnterprise (line 248) | @Test
    method shouldDisableActiveFlowOnDemand (line 292) | @Test
    method connectionForStrategy (line 300) | private Connection connectionForStrategy(String connectionName) {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/DatabaseConnectionTest.java
  class DatabaseConnectionTest (line 15) | public class DatabaseConnectionTest {
    method shouldRequireUsername (line 17) | @Test
    method shouldNotRequireUsername (line 27) | @Test
    method shouldShowSignup (line 37) | @Test
    method shouldNotShowSignup (line 47) | @Test
    method shouldShowForgot (line 57) | @Test
    method shouldNotShowForgot (line 67) | @Test
    method shouldGetExcellentPasswordPolicy (line 77) | @Test
    method shouldGetFairPasswordPolicy (line 88) | @Test
    method shouldGetGoodPasswordPolicy (line 100) | @Test
    method shouldGetLowPasswordPolicy (line 112) | @Test
    method shouldGetNonePasswordPolicy (line 124) | @Test
    method shouldGetMinPasswordLength (line 135) | @Test
    method shouldGetMinMaxUsernameLength (line 149) | @Test
    method shouldGetNonEmptyMinMaxUsernameLengthIfMissingMinMaxValues (line 165) | @Test
    method shouldGetNonEmptyMinMaxUsernameLengthIfMissingUsernameValidation (line 179) | @Test
    method shouldGetNonEmptyMinMaxUsernameLengthIfMissingValidation (line 191) | @Test
    method shouldGetNonEmptyMinMaxUsernameLengthIfMaxIsLowerThanMin (line 201) | @Test
    method shouldGetNonEmptyMinMaxUsernameLengthIfMaxIsMissing (line 217) | @Test
    method shouldGetNonEmptyMinMaxUsernameLengthIfMinIsMissing (line 232) | @Test
    method shouldBeCustomDatabaseIfMissingValidation (line 247) | @Test
    method shouldBeCustomDatabaseIfMissingUsernameValidation (line 256) | @Test
    method shouldNotBeCustomDatabaseIfContainsUsernameValidation (line 267) | @Test
    method shouldHaveName (line 280) | @Test
    method shouldHaveStrategy (line 288) | @Test
    method shouldBeDatabaseType (line 296) | @Test
    method connectionFor (line 304) | private DatabaseConnection connectionFor(Map<String, Object> values) {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/EnterpriseConnectionMatcherTest.java
  class EnterpriseConnectionMatcherTest (line 48) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 65) | @Before
    method shouldExtractTheUsername (line 73) | @Test
    method shouldParseTheConnection (line 79) | @Test
    method shouldNotFindAnUnknownDomain (line 89) | @Test
    method shouldReturnTheMainDomain (line 95) | @Test
    method shouldFailToGetConnectionIfNotValidDomain (line 101) | @Test
    method shouldFailToGetConnectionIfInstantiatedWithEmptyStrategies (line 107) | @Test
    method createConnection (line 114) | private Connection createConnection() {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/GsonBaseTest.java
  class GsonBaseTest (line 35) | public abstract class GsonBaseTest {
    method pojoFrom (line 42) | <T> T pojoFrom(Reader json, Class<T> clazz) throws IOException {
    method pojoFrom (line 46) | <T> T pojoFrom(Reader json, TypeToken<T> type) throws IOException {
    method json (line 50) | FileReader json(String name) throws FileNotFoundException {
    method createGson (line 54) | public Gson createGson() {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/OAuthConnectionTest.java
  class OAuthConnectionTest (line 15) | public class OAuthConnectionTest {
    method shouldHaveName (line 17) | @Test
    method shouldHaveStrategy (line 25) | @Test
    method shouldBeSocialType (line 33) | @Test
    method shouldBeEnterpriseType (line 39) | @Test
    method shouldReturnDomainNameInSet (line 45) | @Test
    method shouldReturnAllDomainNamesAsSet (line 54) | @Test
    method shouldReturnEmptySetWithNoDomainName (line 64) | @Test
    method shouldHaveResourceOwnerEnabledIfADFS (line 72) | @Test
    method shouldHaveResourceOwnerEnabledIfWaad (line 78) | @Test
    method shouldHaveResourceOwnerEnabledIfActiveDirectory (line 84) | @Test
    method shouldNotHaveResourceOwnerEnabledByDefault (line 90) | @Test
    method shouldNotHaveResourceOwnerEnabledIfNotADFSWaadOrActiveDirectory (line 96) | @Test
    method connectionForStrategy (line 119) | private OAuthConnection connectionForStrategy(String name) {

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/OptionsTest.java
  class OptionsTest (line 40) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 56) | @Before
    method shouldSetAccount (line 62) | @Test
    method shouldSetMustAcceptTerms (line 78) | @Test
    method shouldSetShowTerms (line 91) | @Test
    method shouldSetPrivacyPolicyURL (line 104) | @Test
    method shouldThrowWhenSettingPrivacyPolicyURLWithInvalidURL (line 117) | @Test
    method shouldSetTermsOfServiceURL (line 124) | @Test
    method shouldThrowWhenSettingTermsOfServiceURLWithInvalidURL (line 137) | @Test
    method shouldSetSupportURL (line 144) | @Test
    method shouldThrowWhenSettingSupportURLWithInvalidURL (line 157) | @Test
    method shouldUseLabeledSubmitButton (line 164) | @Test
    method shouldHideMainScreenTitle (line 177) | @Test
    method shouldSetPasswordlessAutoSubmit (line 191) | @Test
    method shouldBeClosable (line 204) | @Test
    method shouldNotLoginAfterSignUp (line 217) | @Test
    method shouldSetVisibleSignUpFieldsThreshold (line 230) | @Test
    method shouldChangeInitialScreenToLogIn (line 243) | @Test
    method shouldUseDefaultVisibleSignUpFieldThreshold (line 256) | @Test
    method shouldChangeInitialScreenToSignUp (line 267) | @Test
    method shouldChangeInitialScreenToForgotPassword (line 280) | @Test
    method shouldUseEmailUsernameStyle (line 293) | @Test
    method shouldUseUsernameUsernameStyle (line 306) | @Test
    method shouldUseDefaultUsernameStyle (line 319) | @Test
    method shouldAllowLogIn (line 332) | @Test
    method shouldAllowSignUp (line 345) | @Test
    method shouldAllowForgotPassword (line 358) | @Test
    method shouldAllowShowPassword (line 371) | @Test
    method shouldUsePasswordlessCode (line 384) | @Test
    method shouldHavePasswordlessCodeByDefault (line 397) | @Test
    method shouldSetDefaultDatabaseConnection (line 409) | @Test
    method shouldSetDefaultTheme (line 422) | @Test
    method shouldSetCustomTheme (line 434) | @Test
    method shouldSetConnections (line 459) | @Test
    method shouldSetEnterpriseConnectionsUsingWebForm (line 473) | @Test
    method shouldSetAuthenticationParameters (line 486) | @Test
    method shouldSetConnectionScope (line 498) | @Test
    method shouldSetScope (line 517) | @Test
    method shouldSetAudience (line 530) | @Test
    method shouldSetScheme (line 543) | @Test
    method shouldSetCustomTabsOptions (line 556) | @Test
    method shouldAddAuthStyles (line 570) | @SuppressWarnings("ResourceType")
    method shouldSetCustomFields (line 592) | @Test
    method shouldGetEmptyCustomFieldsIfNotSet (line 609) | @Test
    method shouldSetDeviceParameterIfUsingOfflineAccessScope (line 622) | @Test
    method shouldNotOverrideDeviceParameterIfAlreadySet (line 639) | @Test
    method shouldSetDefaultValues (line 657) | @Test
    method shouldSetAllTrueFields (line 688) | @Test
    method shouldSetAllFalseFields (line 725) | @Test
    method createAuthenticationParameters (line 763) | private HashMap<String, String> createAuthenticationParameters(int inn...
    method shouldCreateAuthenticationAPIClientInstance (line 770) | @Test
    method createCustomFields (line 777) | private List<SignUpField> createCustomFields() {
    method createConnections (line 787) | private List<String> createConnections(String... connections) {
    method createEnterpriseConnectionsUsingWebForm (line 791) | private List<String> createEnterpriseConnectionsUsingWebForm(String......

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/PasswordlessConnectionTest.java
  class PasswordlessConnectionTest (line 12) | public class PasswordlessConnectionTest {
    method shouldHaveName (line 14) | @Test
    method shouldHaveStrategy (line 22) | @Test
    method shouldBePasswordlessType (line 30) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/internal/configuration/ThemeTest.java
  class ThemeTest (line 51) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 65) | @Before
    method shouldResolveDefaultHeaderTitle (line 70) | @Test
    method shouldResolveDefaultHeaderLogo (line 80) | @Test
    method shouldResolveDefaultHeaderColor (line 92) | @Test
    method shouldResolveDefaultHeaderTitleColor (line 102) | @Test
    method shouldResolveDefaultPrimaryColor (line 112) | @Test
    method shouldResolveDefaultDarkPrimaryColor (line 122) | @Test
    method shouldResolveCustomHeaderTitle (line 133) | @Test
    method shouldResolveCustomHeaderLogo (line 143) | @Test
    method shouldResolveCustomHeaderColor (line 154) | @Test
    method shouldResolveCustomHeaderTitleColor (line 164) | @Test
    method shouldResolveCustomPrimaryColor (line 174) | @Test
    method shouldResolveCustomDarkPrimaryColor (line 184) | @Test
    method shouldSetHeaderTitle (line 194) | @Test
    method shouldSetHeaderLogo (line 201) | @Test
    method shouldSetHeaderColor (line 208) | @Test
    method shouldSetHeaderTitleColor (line 215) | @Test
    method shouldSetPrimaryColor (line 222) | @Test
    method shouldSetDarkPrimaryColor (line 229) | @Test
    method shouldNotHaveCustomValues (line 236) | @Test
    method getLockThemeResourceId (line 247) | private int getLockThemeResourceId(Context context, @AttrRes int attrR...

FILE: lib/src/test/java/com/auth0/android/lock/provider/AuthResolverTest.java
  class AuthResolverTest (line 45) | @RunWith(RobolectricTestRunner.class)
    method shouldHaveReturnNullWhenNoAuthHandlers (line 49) | @Test
    method shouldKeepACopyOfTheList (line 54) | @Test
    method shouldSetAuthHandlers (line 73) | @Test
    method shouldRespectAuthHandlersOrder (line 90) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/utils/ApplicationAPI.java
  class ApplicationAPI (line 34) | public class ApplicationAPI {
    method ApplicationAPI (line 38) | public ApplicationAPI(SSLTestUtils sslUtils) throws IOException {
    method getDomain (line 43) | public String getDomain() {
    method shutdown (line 47) | public void shutdown() throws IOException {
    method takeRequest (line 51) | public RecordedRequest takeRequest() throws InterruptedException {
    method willReturnValidJSONPResponse (line 55) | public void willReturnValidJSONPResponse() {
    method willReturnInvalidJSONPLengthResponse (line 59) | public void willReturnInvalidJSONPLengthResponse() {
    method willReturnApplicationResponseWithBody (line 63) | private void willReturnApplicationResponseWithBody(String body, int st...
    method responseWithJSON (line 71) | private MockResponse responseWithJSON(String json, int statusCode) {

FILE: lib/src/test/java/com/auth0/android/lock/utils/Auth0AuthenticationCallbackMatcher.java
  class Auth0AuthenticationCallbackMatcher (line 45) | public class Auth0AuthenticationCallbackMatcher<T> extends BaseMatcher<A...
    method Auth0AuthenticationCallbackMatcher (line 49) | public Auth0AuthenticationCallbackMatcher(Matcher<T> payloadMatcher, M...
    method matches (line 54) | @Override
    method describeTo (line 67) | @Override
    method hasPayloadOfType (line 73) | public static <T> Matcher<AuthenticationCallback<T>> hasPayloadOfType(...
    method hasPayloadOfType (line 77) | public static <T> Matcher<AuthenticationCallback<T>> hasPayloadOfType(...
    method hasPayload (line 81) | public static <T> Matcher<AuthenticationCallback<T>> hasPayload(T payl...
    method hasNoPayloadOfType (line 85) | public static <T> Matcher<AuthenticationCallback<T>> hasNoPayloadOfTyp...
    method hasNoPayloadOfType (line 89) | public static <T> Matcher<AuthenticationCallback<T>> hasNoPayloadOfTyp...
    method hasNoError (line 93) | public static Matcher<AuthenticationCallback<Void>> hasNoError() {
    method hasError (line 97) | public static Matcher<AuthenticationCallback<Void>> hasError() {

FILE: lib/src/test/java/com/auth0/android/lock/utils/AuthenticationCallbackMatcher.java
  class AuthenticationCallbackMatcher (line 46) | public class AuthenticationCallbackMatcher extends BaseMatcher<MockLockC...
    method AuthenticationCallbackMatcher (line 51) | public AuthenticationCallbackMatcher(Matcher<Credentials> authenticati...
    method matches (line 57) | @Override
    method describeTo (line 70) | @Override
    method isCanceled (line 76) | public static AuthenticationCallbackMatcher isCanceled() {
    method hasAuthentication (line 80) | public static AuthenticationCallbackMatcher hasAuthentication() {
    method hasError (line 84) | public static AuthenticationCallbackMatcher hasError() {
    method hasNoError (line 88) | public static AuthenticationCallbackMatcher hasNoError() {
    method hasPayloadOfType (line 92) | public static <T> CallbackMatcher<T, AuthenticationException> hasPaylo...
    method hasPayload (line 96) | public static <T> CallbackMatcher<T, AuthenticationException> hasPaylo...
    method hasNoPayloadOfType (line 100) | public static <T> CallbackMatcher<T, AuthenticationException> hasNoPay...

FILE: lib/src/test/java/com/auth0/android/lock/utils/CallbackMatcher.java
  class CallbackMatcher (line 41) | public class CallbackMatcher<T, U extends Auth0Exception> extends BaseMa...
    method CallbackMatcher (line 45) | public CallbackMatcher(Matcher<T> payloadMatcher, Matcher<U> errorMatc...
    method matches (line 50) | @Override
    method describeTo (line 63) | @Override
    method hasPayloadOfType (line 69) | public static <T, U extends Auth0Exception> Matcher<MockCallback<T, U>...
    method hasPayloadOfType (line 73) | public static <T, U extends Auth0Exception> Matcher<MockCallback<T, U>...
    method hasErrorOfType (line 77) | public static <T, U extends Auth0Exception> Matcher<MockCallback<T, U>...
    method hasPayload (line 81) | public static <T, U extends Auth0Exception> Matcher<MockCallback<T, U>...
    method hasNoPayloadOfType (line 85) | public static <T, U extends Auth0Exception> Matcher<MockCallback<T, U>...
    method hasNoPayloadOfType (line 89) | public static <T, U extends Auth0Exception> Matcher<MockCallback<T, U>...
    method hasNoError (line 93) | public static <U extends Auth0Exception> Matcher<MockCallback<Void, U>...
    method hasError (line 97) | public static <U extends Auth0Exception> Matcher<MockCallback<Void, U>...

FILE: lib/src/test/java/com/auth0/android/lock/utils/CustomFieldTest.java
  class CustomFieldTest (line 51) | @RunWith(RobolectricTestRunner.class)
    method shouldThrowIfKeyIsEmpty (line 65) | @Test
    method shouldThrowIfKeyIsUserMetadataAndStorageIsRoot (line 72) | @Test
    method shouldCreateWithDefaultValues (line 79) | @Test
    method shouldCreate (line 90) | @Test
    method shouldBeParcelable (line 100) | @Test
    method shouldConfigureTheEmailField (line 115) | @Test
    method shouldConfigureTheNameField (line 128) | @Test
    method shouldConfigureThePhoneNumberField (line 141) | @Test
    method shouldConfigureTheNumberField (line 154) | @Test
    method shouldObtainTheValue (line 167) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/utils/HiddenFieldTest.java
  class HiddenFieldTest (line 9) | public class HiddenFieldTest {
    method setUp (line 15) | @Before
    method shouldGetKey (line 20) | @Test
    method shouldGetStorage (line 25) | @Test
    method shouldGetValue (line 30) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/utils/MockAuthenticationCallback.java
  class MockAuthenticationCallback (line 32) | public class MockAuthenticationCallback<T> implements AuthenticationCall...
    method onFailure (line 37) | @Override
    method onSuccess (line 42) | @Override
    method error (line 47) | public Callable<AuthenticationException> error() {
    method payload (line 56) | public Callable<T> payload() {
    method getError (line 65) | public AuthenticationException getError() {
    method getPayload (line 69) | public T getPayload() {

FILE: lib/src/test/java/com/auth0/android/lock/utils/MockCallback.java
  class MockCallback (line 35) | public class MockCallback<T, U extends Auth0Exception> implements Callba...
    method onSuccess (line 40) | @Override
    method onFailure (line 45) | @Override
    method payload (line 50) | public Callable<T> payload() {
    method error (line 59) | public Callable<U> error() {
    method getPayload (line 68) | public T getPayload() {
    method getError (line 72) | public U getError() {

FILE: lib/src/test/java/com/auth0/android/lock/utils/MockLockCallback.java
  class MockLockCallback (line 35) | public class MockLockCallback extends AuthenticationCallback {
    method authentication (line 40) | public Callable<Credentials> authentication() {
    method canceled (line 44) | public Callable<Boolean> canceled() {
    method error (line 48) | public Callable<AuthenticationException> error() {
    method onAuthentication (line 52) | @Override
    method onError (line 57) | @Override
    method getCredentials (line 62) | public Credentials getCredentials() {
    method getError (line 66) | public AuthenticationException getError() {

FILE: lib/src/test/java/com/auth0/android/lock/utils/SSLTestUtils.java
  class SSLTestUtils (line 16) | public class SSLTestUtils {
    method SSLTestUtils (line 22) | public SSLTestUtils() throws UnknownHostException {
    method createMockWebServer (line 47) | MockWebServer createMockWebServer() {

FILE: lib/src/test/java/com/auth0/android/lock/utils/TypeTokenMatcher.java
  class TypeTokenMatcher (line 8) | public class TypeTokenMatcher<T> extends BaseMatcher<T> {
    method TypeTokenMatcher (line 12) | private TypeTokenMatcher(TypeToken<T> typeToken, boolean shouldBeNull) {
    method isA (line 17) | public static <T> TypeTokenMatcher<T> isA(TypeToken<T> typeToken) {
    method isNull (line 21) | public static <T> TypeTokenMatcher<T> isNull(TypeToken<T> typeToken) {
    method describeTo (line 25) | @Override
    method matches (line 30) | @Override

FILE: lib/src/test/java/com/auth0/android/lock/views/AuthConfigTest.java
  class AuthConfigTest (line 24) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 31) | @Before
    method shouldGetConnection (line 39) | @Test
    method shouldGetName (line 44) | @Test
    method shouldGetLogo (line 51) | @Test
    method shouldGetBackgroundColor (line 61) | @Test
    method shouldHaveValidDefaultName (line 68) | @Test
    method shouldHaveValidDefaultLogo (line 75) | @Test
    method shouldHaveValidDefaultColor (line 86) | @Test
    method shouldGetStyleForStrategy (line 94) | @Test
    method shouldGetDefaultStyleForUnknownStrategy (line 135) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/views/CustomFieldsFormViewTest.java
  class CustomFieldsFormViewTest (line 23) | public class CustomFieldsFormViewTest {
    method shouldConvertCustomFieldsToMap (line 25) | @Test

FILE: lib/src/test/java/com/auth0/android/lock/views/PasswordStrengthViewTest.java
  class PasswordStrengthViewTest (line 18) | @RunWith(RobolectricTestRunner.class)
    method setUp (line 47) | @Before
    method shouldHandlePasswordStrengthNONE (line 53) | @Test
    method shouldHandlePasswordStrengthLOW (line 81) | @Test
    method shouldHandlePasswordStrengthFAIR (line 109) | @Test
    method shouldHandlePasswordStrengthGOOD (line 137) | @Test
    method shouldHandlePasswordStrengthEXCELLENT (line 165) | @Test
    method shouldOverrideMinLength (line 193) | @Test
Condensed preview — 233 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,111K chars).
[
  {
    "path": ".editorconfig",
    "chars": 33,
    "preview": "root = true\n\n[*]\nend_of_line = lf"
  },
  {
    "path": ".gitattributes",
    "chars": 330,
    "preview": "# We'll let Git's auto-detection algorithm infer if a file is text. If it is,\n# enforce LF line endings regardless of OS"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 44,
    "preview": "*\t@auth0/project-dx-sdks-engineer-codeowner\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Bug Report.yml",
    "chars": 2534,
    "preview": "name: 🐞 Report a bug\ndescription: Have you found a bug or issue? Create a bug report for this library\nlabels: [\"bug\"]\n\nb"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Feature Request.yml",
    "chars": 2184,
    "preview": "name: 🧩 Feature request\ndescription: Suggest an idea or a feature for this library\nlabels: [\"feature request\"]\n\nbody:\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 164,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Auth0 Community\n    url: https://community.auth0.com\n    about: Dis"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1392,
    "preview": "### Changes\n\nPlease describe both what is changing and why this is important. Include:\n\n- Classes and methods added, del"
  },
  {
    "path": ".github/actions/get-prerelease/action.yml",
    "chars": 707,
    "preview": "name: Return a boolean indicating if the version contains prerelease identifiers\n\n#\n# Returns a simple true/false boolea"
  },
  {
    "path": ".github/actions/get-release-notes/action.yml",
    "chars": 1236,
    "preview": "name: Return the release notes extracted from the body of the PR associated with the release.\n\n#\n# Returns the release n"
  },
  {
    "path": ".github/actions/get-version/action.yml",
    "chars": 406,
    "preview": "name: Return the version extracted from the branch name\n\n#\n# Returns the version from the .version file.\n#\n# TODO: Remov"
  },
  {
    "path": ".github/actions/maven-publish/action.yml",
    "chars": 1994,
    "preview": "name: Publish release to Java\n\ninputs:\n  ossr-username:\n    required: true\n  ossr-password:\n    required: true\n  signing"
  },
  {
    "path": ".github/actions/release-create/action.yml",
    "chars": 993,
    "preview": "name: Create a GitHub release\n\n#\n# Creates a GitHub release with the given version.\n#\n# TODO: Remove once the common rep"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "chars": 749,
    "preview": "name: Configure CI\ndescription: Performs the initial configuration of the CI environment\n\ninputs:\n  java:\n    descriptio"
  },
  {
    "path": ".github/actions/tag-exists/action.yml",
    "chars": 966,
    "preview": "name: Return a boolean indicating if a tag already exists for the repository\n\n#\n# Returns a simple true/false boolean in"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 118,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n"
  },
  {
    "path": ".github/stale.yml",
    "chars": 971,
    "preview": "# Configuration for probot-stale - https://github.com/probot/stale\n\n# Number of days of inactivity before an Issue or Pu"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1280,
    "preview": "name: CodeQL\n\non:\n  merge_group:\n  pull_request:\n    types:\n      - opened\n      - synchronize\n  push:\n    branches:\n   "
  },
  {
    "path": ".github/workflows/java-release.yml",
    "chars": 3043,
    "preview": "name: Create Java and GitHub Release\n\non:\n  workflow_call:\n    inputs:\n      java-version:\n        required: true\n      "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1003,
    "preview": "name: Create GitHub Release\n\non:\n  pull_request:\n    types:\n      - closed\n  workflow_dispatch:\n\npermissions:\n  contents"
  },
  {
    "path": ".github/workflows/sca_scan.yml",
    "chars": 165,
    "preview": "name: SCA\n\non:\n  push:\n    branches: [\"master\", \"main\"]\n\njobs:\n  snyk-cli:\n    uses: auth0/devsecops-tooling/.github/wor"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 622,
    "preview": "name: Build and Test\n\non:\n  merge_group:\n  workflow_dispatch:\n  pull_request:\n    branches:\n      - main\n  push:\n    bra"
  },
  {
    "path": ".gitignore",
    "chars": 1551,
    "preview": "# Created by https://www.gitignore.io/api/intellij,android,osx,windows\n\n### Intellij ###\n# Covers JetBrains IDEs: Intell"
  },
  {
    "path": ".shiprc",
    "chars": 117,
    "preview": "{\n  \"files\": {\n    \"auth0/build.gradle\": [],\n    \".version\": [],\n    \"README.md\": []\n  },\n  \"prefixVersion\": false\n}\n"
  },
  {
    "path": ".version",
    "chars": 5,
    "preview": "3.2.2"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 42685,
    "preview": "# Change Log\n\n## [3.2.1](https://github.com/auth0/Lock.Android/tree/3.2.2) (2023-01-11)\n[Full Changelog](https://github."
  },
  {
    "path": "EXAMPLES.md",
    "chars": 3746,
    "preview": "# Examples using Lock.Android\n\n- [Examples using Lock.Android](#examples-using-lockandroid)\n  - [Passwordless & Social a"
  },
  {
    "path": "LICENSE.md",
    "chars": 1116,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Auth0, Inc. <support@auth0.com> (http://auth0.com)\n\nPermission is hereby grant"
  },
  {
    "path": "MIGRATION_GUIDE.md",
    "chars": 9269,
    "preview": "# Migration Guide\nThis guide will help you migrate Lock.Android from version v2.x.x to version v3.x.x. \n\n## About this r"
  },
  {
    "path": "README.md",
    "chars": 9055,
    "preview": "> **Note**\n> As part of our ongoing commitment to best security practices, we have rotated the signing keys used to sign"
  },
  {
    "path": "app/.gitignore",
    "chars": 1601,
    "preview": "# Created by https://www.gitignore.io/api/intellij,android,osx,windows\n\n### Intellij ###\n# Covers JetBrains IDEs: Intell"
  },
  {
    "path": "app/build.gradle",
    "chars": 1354,
    "preview": "plugins {\n    id \"com.android.application\"\n}\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion 33\n\n    def"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 755,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /L"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 821,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "app/src/main/java/com/auth0/android/lock/app/DemoActivity.kt",
    "chars": 11714,
    "preview": "/*\n * DemoActivity.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "app/src/main/res/layout/demo_activity.xml",
    "chars": 15215,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:"
  },
  {
    "path": "app/src/main/res/values/auth0.xml",
    "chars": 1343,
    "preview": "<!--\n  ~ auth0.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0.com)\n  ~\n  ~ Permission is hereby granted, free of cha"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 1116,
    "preview": "<resources>\n    <string name=\"app_name\">Lock Demo</string>\n    <string name=\"native_provider_message_invalid_authorize_u"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 383,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar"
  },
  {
    "path": "build.gradle",
    "chars": 569,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    e"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 202,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 909,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "lib/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "lib/build.gradle",
    "chars": 2687,
    "preview": "plugins {\n    id \"com.auth0.gradle.oss-library.android\" version \"0.18.0\"\n}\n\nlogger.lifecycle(\"Using version ${version} f"
  },
  {
    "path": "lib/lint.xml",
    "chars": 3516,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n    <issue id=\"IconDuplicates\">\n        <ignore path=\"src/main/res/drawabl"
  },
  {
    "path": "lib/proguard-rules.pro",
    "chars": 666,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "lib/src/main/AndroidManifest.xml",
    "chars": 2729,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "lib/src/main/assets/com_auth0_lock_passwordless_countries.json",
    "chars": 2867,
    "preview": "{\"BY\":\"+375\",\"SG\":\"+65\",\"TJ\":\"+992\",\"BB\":\"+1 246\",\"ER\":\"+291\",\"IM\":\"+44\",\"ID\":\"+62\",\"LS\":\"+266\",\"PW\":\"+680\",\"MF\":\"+590\","
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/Auth0Parcelable.java",
    "chars": 3317,
    "preview": "/*\n * Auth0Parcelable.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/AuthButtonSize.java",
    "chars": 1662,
    "preview": "/*\n * SocialButtonStyle.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/AuthenticationCallback.java",
    "chars": 3241,
    "preview": "/*\n * LockAuthenticationCallback.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby grant"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/Constants.java",
    "chars": 2612,
    "preview": "/*\n * Constants.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charg"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/CountryCodeActivity.java",
    "chars": 5496,
    "preview": "/*\n * CountryCodeActivity.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fre"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/InitialScreen.java",
    "chars": 1681,
    "preview": "/*\n * InitialScreen.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of c"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/Lock.java",
    "chars": 25582,
    "preview": "/*\n * Lock.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charge, to"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/LockActivity.java",
    "chars": 26447,
    "preview": "/*\n * LockActivity.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/LockCallback.java",
    "chars": 2617,
    "preview": "/*\n * AuthenticationCallback.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/PasswordlessIdentityHelper.java",
    "chars": 3345,
    "preview": "package com.auth0.android.lock;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport androi"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/PasswordlessLock.java",
    "chars": 16865,
    "preview": "/*\n * PasswordlessLock.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/PasswordlessLockActivity.java",
    "chars": 23739,
    "preview": "/*\n * LockPasswordlessActivity.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/UsernameStyle.java",
    "chars": 1657,
    "preview": "/*\n * UsernameStyle.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of c"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/WebCallbackWrapper.java",
    "chars": 881,
    "preview": "package com.auth0.android.lock;\n\nimport androidx.annotation.NonNull;\n\nimport com.auth0.android.authentication.Authentica"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/WebProvider.java",
    "chars": 3247,
    "preview": "package com.auth0.android.lock;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport androidx.annotation"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/adapters/Country.java",
    "chars": 1979,
    "preview": "/*\n * Country.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charge,"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/adapters/CountryAdapter.java",
    "chars": 4141,
    "preview": "/*\n * CountryAdapter.java\n *\n * Copyright (c) 2015 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/errors/AuthenticationError.java",
    "chars": 2204,
    "preview": "/*\n * AuthenticationError.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fre"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/errors/ErrorMessageBuilder.java",
    "chars": 257,
    "preview": "package com.auth0.android.lock.errors;\n\nimport androidx.annotation.NonNull;\n\nimport com.auth0.android.Auth0Exception;\n\np"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/errors/LoginErrorMessageBuilder.java",
    "chars": 4736,
    "preview": "/*\n * LoginAuthenticationError.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/errors/SignUpErrorMessageBuilder.java",
    "chars": 3450,
    "preview": "/*\n * SignUpAuthenticationErrorBuilder.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/CountryCodeChangeEvent.java",
    "chars": 1245,
    "preview": "/*\n * CountryCodeEventRequest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted,"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/DatabaseChangePasswordEvent.java",
    "chars": 1562,
    "preview": "/*\n * DbChangePasswordEvent.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, f"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/DatabaseEvent.java",
    "chars": 2292,
    "preview": "/*\n * EmailEvent.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of char"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/DatabaseLoginEvent.java",
    "chars": 2659,
    "preview": "/*\n * DbConnectionEvent.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/DatabaseSignUpEvent.java",
    "chars": 3451,
    "preview": "/*\n * DbSignUpEvent.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of c"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/FetchApplicationEvent.java",
    "chars": 1242,
    "preview": "/*\n * FetchApplicationEvent.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, f"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/LockMessageEvent.java",
    "chars": 347,
    "preview": "package com.auth0.android.lock.events;\n\nimport androidx.annotation.StringRes;\n\npublic class LockMessageEvent {\n\n    @Str"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/OAuthLoginEvent.java",
    "chars": 2294,
    "preview": "package com.auth0.android.lock.events;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/events/PasswordlessLoginEvent.java",
    "chars": 5515,
    "preview": "/*\n * PasswordlessLoginEvent.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/ApplicationDeserializer.java",
    "chars": 3712,
    "preview": "/*\n * ApplicationDeserializer.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted,"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/ApplicationFetcher.java",
    "chars": 6223,
    "preview": "/*\n * ApplicationFetcher.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/AuthMode.java",
    "chars": 467,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.IntDef;\n\nimport java.lang.annotation."
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/AuthType.java",
    "chars": 710,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.IntDef;\n\nimport java.lang.annotation."
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/BaseConnection.java",
    "chars": 874,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.N"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/Configuration.java",
    "chars": 12577,
    "preview": "/*\n * Configuration.java\n *\n * Copyright (c) 2015 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of c"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/Connection.java",
    "chars": 7015,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.N"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/DatabaseConnection.java",
    "chars": 1538,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.NonNull;\n\npublic interface DatabaseCo"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/GsonDeserializer.java",
    "chars": 2124,
    "preview": "/*\n * JsonUtils.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charg"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/OAuthConnection.java",
    "chars": 577,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.Set;\n\npubl"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/Options.java",
    "chars": 19258,
    "preview": "/*\n * LockOptions.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of cha"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/PasswordComplexity.java",
    "chars": 874,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.Nullable;\n\npublic class PasswordCompl"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/PasswordStrength.java",
    "chars": 808,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport androidx.annotation.IntDef;\n\nimport java.lang.annotation."
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/PasswordlessConnection.java",
    "chars": 123,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\npublic interface PasswordlessConnection extends BaseConnection {"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/PasswordlessMode.java",
    "chars": 2026,
    "preview": "/*\n * PasswordlessMode.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/internal/configuration/Theme.java",
    "chars": 7637,
    "preview": "/*\n * Theme.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charge, t"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/provider/AuthResolver.java",
    "chars": 1618,
    "preview": "package com.auth0.android.lock.provider;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpo"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/utils/CustomField.java",
    "chars": 6428,
    "preview": "/*\n * CustomField.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of cha"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/utils/EnterpriseConnectionMatcher.java",
    "chars": 4354,
    "preview": "/*\n * DomainParser.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/utils/HiddenField.java",
    "chars": 1324,
    "preview": "package com.auth0.android.lock.utils;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotatio"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/utils/LoadCountriesTask.java",
    "chars": 2871,
    "preview": "/*\n * LoadCountriesTask.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/utils/SignUpField.java",
    "chars": 1356,
    "preview": "package com.auth0.android.lock.utils;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport androidx.annotatio"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ActionButton.java",
    "chars": 5912,
    "preview": "/*\n * LockProgress.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/AuthConfig.java",
    "chars": 7140,
    "preview": "package com.auth0.android.lock.views;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport an"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ChangePasswordFormView.java",
    "chars": 3624,
    "preview": "/*\n * ChangePasswordFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/CheckableOptionView.java",
    "chars": 4176,
    "preview": "/*\n * CheckableOptionView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fre"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ClassicLockView.java",
    "chars": 15151,
    "preview": "/*\n * ClassicLockView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/CountryCodeSelectorView.java",
    "chars": 6086,
    "preview": "/*\n * ValidatedPhoneNumber.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fr"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/CustomFieldsFormView.java",
    "chars": 6649,
    "preview": "/*\n * CustomFieldsFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fr"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/FormLayout.java",
    "chars": 11659,
    "preview": "/*\n * DbLayout.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charge"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/FormView.java",
    "chars": 1909,
    "preview": "/*\n * FormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charge"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/HeaderView.java",
    "chars": 3262,
    "preview": "/*\n * HeaderView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of char"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ImageCheckbox.java",
    "chars": 3912,
    "preview": "package com.auth0.android.lock.views;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.grap"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/LinkTextView.java",
    "chars": 1451,
    "preview": "package com.auth0.android.lock.views;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.grap"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/LogInFormView.java",
    "chars": 12540,
    "preview": "/*\n * LogInFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of c"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/MFACodeFormView.java",
    "chars": 3730,
    "preview": "/*\n * MFACodeFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ModeSelectionView.java",
    "chars": 4131,
    "preview": "/*\n * ModeSelectionView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/PasswordStrengthView.java",
    "chars": 9972,
    "preview": "/*\n * CheckableOptionView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fre"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/PasswordlessFormLayout.java",
    "chars": 9118,
    "preview": "/*\n * PasswordlessFormLayout.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/PasswordlessInputCodeFormView.java",
    "chars": 6576,
    "preview": "/*\n * PasswordlessFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fr"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/PasswordlessLockView.java",
    "chars": 9615,
    "preview": "/*\n * PasswordlessLockView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fr"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/PasswordlessRequestCodeFormView.java",
    "chars": 7165,
    "preview": "/*\n * PasswordlessSendCodeFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby gra"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/SignUpFormView.java",
    "chars": 8115,
    "preview": "/*\n * SignUpFormView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/SocialButton.java",
    "chars": 3788,
    "preview": "package com.auth0.android.lock.views;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport an"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/SocialView.java",
    "chars": 4819,
    "preview": "/*\n * SocialView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of char"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/SocialViewAdapter.java",
    "chars": 3949,
    "preview": "/*\n * SocialViewAdapter.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/SpacesItemDecoration.java",
    "chars": 1124,
    "preview": "package com.auth0.android.lock.views;\n\nimport android.graphics.Rect;\nimport androidx.annotation.NonNull;\nimport androidx"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ValidatedInputView.java",
    "chars": 20533,
    "preview": "/*\n * EmailAndPasswordView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fr"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ValidatedPasswordInputView.java",
    "chars": 2441,
    "preview": "package com.auth0.android.lock.views;\n\nimport android.content.Context;\nimport androidx.annotation.NonNull;\nimport androi"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ValidatedUsernameInputView.java",
    "chars": 4942,
    "preview": "/*\n * ValidatedUserInputView.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/ViewUtils.java",
    "chars": 7575,
    "preview": "/*\n * ViewUtils.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of charg"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/interfaces/IdentityListener.java",
    "chars": 1340,
    "preview": "/*\n * IdentityListener.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidget.java",
    "chars": 1491,
    "preview": "/*\n * LockWidgets.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of cha"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidgetForm.java",
    "chars": 1674,
    "preview": "/*\n * LockWidgetDatabase.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidgetOAuth.java",
    "chars": 1419,
    "preview": "/*\n * LockWidgetSocial.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "lib/src/main/java/com/auth0/android/lock/views/interfaces/LockWidgetPasswordless.java",
    "chars": 1881,
    "preview": "/*\n * LockWidgetPasswordless.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/main/res/color/com_auth0_lock_text.xml",
    "chars": 1469,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_normal_text.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://a"
  },
  {
    "path": "lib/src/main/res/drawable/com_auth0_lock_link_background.xml",
    "chars": 1449,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_link_background.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http"
  },
  {
    "path": "lib/src/main/res/drawable/com_auth0_lock_tab.xml",
    "chars": 1464,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_normal_text.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://a"
  },
  {
    "path": "lib/src/main/res/drawable/com_auth0_lock_terms.xml",
    "chars": 1489,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_normal_text.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://a"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_action_button.xml",
    "chars": 3134,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_action_button.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http:/"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_activity_lock.xml",
    "chars": 899,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_activity_lock_passwordless.xml",
    "chars": 3825,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_activity_lock_passwordless.xml\n  ~\n  ~ Copyright (c) 2016 "
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_btn_social_large.xml",
    "chars": 2251,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_btn_social_large.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://a"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_changepwd_form_view.xml",
    "chars": 2685,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_changepwd_form_view.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 ("
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_checkable_option.xml",
    "chars": 2371,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_checkable_optionon.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (h"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_custom_fields_form_view.xml",
    "chars": 1824,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_custom_fields_form_view.xml\n  ~\n  ~ Copyright (c) 2016 Aut"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_error_layout.xml",
    "chars": 1883,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_header.xml",
    "chars": 2308,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_header.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0."
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_login_form_view.xml",
    "chars": 3528,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_login_form_view.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_mfa_input_code_form_view.xml",
    "chars": 2646,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_mfa_input_code_form_view.xml\n  ~\n  ~ Copyright (c) 2016 Au"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_password_strength.xml",
    "chars": 3782,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_password_strength.xmlength.xml\n  ~\n  ~ Copyright (c) 2016 "
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_passwordless_activity_country_code.xml",
    "chars": 2003,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_passwordless_activity_country_code.xml\n  ~\n  ~ Copyright (c) 20"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_passwordless_country_code_selector.xml",
    "chars": 2927,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_passwordless_country_code_selector.xml\n  ~\n  ~ Copyright ("
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_passwordless_input_code_form_view.xml",
    "chars": 2410,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_passwordless_input_code_form_view.xml\n  ~\n  ~ Copyright (c"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_passwordless_item_country_code.xml",
    "chars": 2123,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_passwordless_item_country_code.xml\n  ~\n  ~ Copyright (c) 2015 A"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_passwordless_request_code_form_view.xml",
    "chars": 2729,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_login_form_view.xmlew.xml\n  ~ Copyright (c) 2016 Auth0 (ht"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_signup_form_view.xml",
    "chars": 2635,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_signup_form_view.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (htt"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_sso_layout.xml",
    "chars": 2177,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_sso_layout.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://au"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_tab.xml",
    "chars": 623,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xm"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_tab_layout.xml",
    "chars": 1006,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_terms_layout.xml",
    "chars": 1907,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_terms_layout.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://"
  },
  {
    "path": "lib/src/main/res/layout/com_auth0_lock_validated_input_view.xml",
    "chars": 3001,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ com_auth0_lock_validated_field.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http"
  },
  {
    "path": "lib/src/main/res/values/attrs.xml",
    "chars": 2480,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ attrs.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0.com)\n  ~\n  ~ Per"
  },
  {
    "path": "lib/src/main/res/values/auth_styles.xml",
    "chars": 13154,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Lock.Theme.AuthStyle.Apple\" parent=\"Lock.Theme.Auth"
  },
  {
    "path": "lib/src/main/res/values/colors.xml",
    "chars": 6188,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ colors.xml\n  ~\n  ~ Copyright (c) 2015 Auth0 (http://auth0.com)\n  ~\n  ~ Pe"
  },
  {
    "path": "lib/src/main/res/values/dimens.xml",
    "chars": 5097,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ dimens.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0.com)\n  ~\n  ~ Pe"
  },
  {
    "path": "lib/src/main/res/values/ids.xml",
    "chars": 1290,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ ids.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0.com)\n  ~\n  ~ Permi"
  },
  {
    "path": "lib/src/main/res/values/strings.xml",
    "chars": 13242,
    "preview": "<!--\n  ~ strings.xml\n  ~\n  ~ Copyright (c) 2015 Auth0 (http://auth0.com)\n  ~\n  ~ Permission is hereby granted, free of c"
  },
  {
    "path": "lib/src/main/res/values/styles.xml",
    "chars": 19918,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ styles.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0.com)\n  ~\n  ~ Pe"
  },
  {
    "path": "lib/src/main/res/values-sw400dp/dimens.xml",
    "chars": 5103,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ dimens.xml\n  ~\n  ~ Copyright (c) 2016 Auth0 (http://auth0.com)\n  ~\n  ~ Pe"
  },
  {
    "path": "lib/src/test/AndroidManifest.xml",
    "chars": 1151,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/Auth0ParcelableTest.java",
    "chars": 3428,
    "preview": "package com.auth0.android.lock;\n\nimport android.os.Parcel;\n\nimport com.auth0.android.Auth0;\nimport com.auth0.android.uti"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/AuthenticationCallbackTest.java",
    "chars": 5848,
    "preview": "/*\n * AuthenticationCallbackTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby grant"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/ClassicBuilderTest.java",
    "chars": 5409,
    "preview": "package com.auth0.android.lock;\n\nimport android.app.Activity;\nimport android.content.BroadcastReceiver;\nimport android.c"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/LockActivityTest.java",
    "chars": 39313,
    "preview": "package com.auth0.android.lock;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport com.auth0.android.A"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/PasswordlessBuilderTest.java",
    "chars": 3648,
    "preview": "package com.auth0.android.lock;\n\nimport android.app.Activity;\nimport android.content.BroadcastReceiver;\nimport android.c"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/PasswordlessIdentityHelperTest.java",
    "chars": 7457,
    "preview": "package com.auth0.android.lock;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android."
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/PasswordlessLockActivityTest.java",
    "chars": 17394,
    "preview": "package com.auth0.android.lock;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport com.auth0.android.A"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/WebProviderTest.java",
    "chars": 10697,
    "preview": "package com.auth0.android.lock;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Int"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/errors/LoginErrorMessageBuilderTest.java",
    "chars": 5082,
    "preview": "package com.auth0.android.lock.errors;\n\nimport com.auth0.android.authentication.AuthenticationException;\nimport com.auth"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/errors/SignUpErrorMessageBuilderTest.java",
    "chars": 3321,
    "preview": "package com.auth0.android.lock.errors;\n\nimport com.auth0.android.authentication.AuthenticationException;\nimport com.auth"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/events/DatabaseEventTest.java",
    "chars": 1403,
    "preview": "package com.auth0.android.lock.events;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.R"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/events/DatabaseLoginEventTest.java",
    "chars": 2024,
    "preview": "package com.auth0.android.lock.events;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/events/DatabaseSignUpEventTest.java",
    "chars": 12422,
    "preview": "/*\n * DatabaseSignUpEventTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted,"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/events/ErrorMessageEventTest.java",
    "chars": 581,
    "preview": "package com.auth0.android.lock.events;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.R"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/events/OAuthLoginEventTest.java",
    "chars": 2833,
    "preview": "package com.auth0.android.lock.events;\n\nimport com.auth0.android.lock.internal.configuration.OAuthConnection;\n\nimport or"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/events/PasswordlessLoginEventTest.java",
    "chars": 17061,
    "preview": "/*\n * PasswordlessLoginEventTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby grant"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/ApplicationFetcherTest.java",
    "chars": 3972,
    "preview": "/*\n * ApplicationFetcherTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, "
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/ApplicationGsonTest.java",
    "chars": 5969,
    "preview": "/*\n * ApplicationGsonTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, fre"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/ConfigurationTest.java",
    "chars": 27761,
    "preview": "/*\n * ConfigurationTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/ConnectionGsonTest.java",
    "chars": 8248,
    "preview": "/*\n * StrategyGsonTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/ConnectionMatcher.java",
    "chars": 3648,
    "preview": "/*\n * ConnectionMatcher.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free "
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/ConnectionTest.java",
    "chars": 14243,
    "preview": "/*\n * StrategyTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/DatabaseConnectionTest.java",
    "chars": 12388,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport org.junit.Test;\n\nimport java.util.HashMap;\nimport java.ut"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/EnterpriseConnectionMatcherTest.java",
    "chars": 4956,
    "preview": "/*\n * EnterpriseConnectionMatcherTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby "
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/GsonBaseTest.java",
    "chars": 2058,
    "preview": "/*\n * GsonBaseTest.java\n *\n * Copyright (c) 2016 Auth0 (http://auth0.com)\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/OAuthConnectionTest.java",
    "chars": 5074,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport org.junit.Test;\n\nimport java.util.Arrays;\nimport java.uti"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/OptionsTest.java",
    "chars": 33535,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport android.os.Build;\nimport android.os.Parcel;\n\nimport com.a"
  },
  {
    "path": "lib/src/test/java/com/auth0/android/lock/internal/configuration/PasswordlessConnectionTest.java",
    "chars": 1221,
    "preview": "package com.auth0.android.lock.internal.configuration;\n\nimport org.junit.Test;\n\nimport java.util.HashMap;\nimport java.ut"
  }
]

// ... and 33 more files (download for full content)

About this extraction

This page contains the full source code of the auth0/Lock.Android GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 233 files (1.0 MB), approximately 234.6k tokens, and a symbol index with 1408 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!