Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4187cf3 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 10040800 from f2720567 to udc-qpr1-release

Change-Id: I15d4faad9a4a3a124e5d169cff9173aa1ed93c95
parents 0818ce59 f2720567
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -231,9 +231,17 @@ public final class SoundTriggerInstrumentation {
         */
        public void setModelCallback(@NonNull @CallbackExecutor Executor executor, @NonNull
                ModelCallback callback) {
            Objects.requireNonNull(callback);
            Objects.requireNonNull(executor);
            synchronized (SoundTriggerInstrumentation.this.mLock) {
                mModelCallback = Objects.requireNonNull(callback);
                mModelExecutor = Objects.requireNonNull(executor);
                if (mModelCallback == null) {
                    for (var droppedConsumer : mDroppedConsumerList) {
                        executor.execute(() -> droppedConsumer.accept(callback));
                    }
                    mDroppedConsumerList.clear();
                }
                mModelCallback = callback;
                mModelExecutor = executor;
            }
        }

@@ -267,9 +275,11 @@ public final class SoundTriggerInstrumentation {

        private void wrap(Consumer<ModelCallback> consumer) {
            synchronized (SoundTriggerInstrumentation.this.mLock) {
                if (mModelCallback != null && mModelExecutor != null) {
                if (mModelCallback != null) {
                    final ModelCallback callback = mModelCallback;
                    mModelExecutor.execute(() -> consumer.accept(callback));
                } else {
                    mDroppedConsumerList.add(consumer);
                }
            }
        }
@@ -282,6 +292,8 @@ public final class SoundTriggerInstrumentation {
        private ModelCallback mModelCallback = null;
        @GuardedBy("SoundTriggerInstrumentation.this.mLock")
        private Executor mModelExecutor = null;
        @GuardedBy("SoundTriggerInstrumentation.this.mLock")
        private final List<Consumer<ModelCallback>> mDroppedConsumerList = new ArrayList<>();
    }

    /**
@@ -374,9 +386,18 @@ public final class SoundTriggerInstrumentation {
         */
        public void setRecognitionCallback(@NonNull @CallbackExecutor Executor executor,
                @NonNull RecognitionCallback callback) {
            Objects.requireNonNull(callback);
            Objects.requireNonNull(executor);
            synchronized (SoundTriggerInstrumentation.this.mLock) {
                if (mRecognitionCallback == null) {
                    for (var droppedConsumer : mDroppedConsumerList) {
                        executor.execute(() -> droppedConsumer.accept(callback));
                    }
                    mDroppedConsumerList.clear();
                }
                mRecognitionCallback = callback;
                mRecognitionExecutor = executor;

            }
        }

@@ -401,9 +422,11 @@ public final class SoundTriggerInstrumentation {

        private void wrap(Consumer<RecognitionCallback> consumer) {
            synchronized (SoundTriggerInstrumentation.this.mLock) {
                if (mRecognitionCallback != null && mRecognitionExecutor != null) {
                if (mRecognitionCallback != null) {
                    final RecognitionCallback callback = mRecognitionCallback;
                    mRecognitionExecutor.execute(() -> consumer.accept(callback));
                } else {
                    mDroppedConsumerList.add(consumer);
                }
            }
        }
@@ -416,6 +439,8 @@ public final class SoundTriggerInstrumentation {
        private Executor mRecognitionExecutor = null;
        @GuardedBy("SoundTriggerInstrumentation.this.mLock")
        private RecognitionCallback mRecognitionCallback = null;
        @GuardedBy("SoundTriggerInstrumentation.this.mLock")
        private final List<Consumer<RecognitionCallback>> mDroppedConsumerList = new ArrayList<>();
    }

    // Implementation of injection interface passed to the HAL.
+323 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.keyguard

import android.annotation.IntDef
import com.android.keyguard.KeyguardSecurityModel.SecurityMode
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_AFTER_LOCKOUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_DEFAULT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_FACE_LOCKED_OUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_FINGERPRINT_LOCKED_OUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_INCORRECT_FACE_INPUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_INCORRECT_FINGERPRINT_INPUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NONE
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TRUSTAGENT_EXPIRED
import com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_USER_REQUEST
import com.android.systemui.R.string.bouncer_face_not_recognized
import com.android.systemui.R.string.keyguard_enter_password
import com.android.systemui.R.string.keyguard_enter_pattern
import com.android.systemui.R.string.keyguard_enter_pin
import com.android.systemui.R.string.kg_bio_too_many_attempts_password
import com.android.systemui.R.string.kg_bio_too_many_attempts_pattern
import com.android.systemui.R.string.kg_bio_too_many_attempts_pin
import com.android.systemui.R.string.kg_bio_try_again_or_password
import com.android.systemui.R.string.kg_bio_try_again_or_pattern
import com.android.systemui.R.string.kg_bio_try_again_or_pin
import com.android.systemui.R.string.kg_face_locked_out
import com.android.systemui.R.string.kg_fp_locked_out
import com.android.systemui.R.string.kg_fp_not_recognized
import com.android.systemui.R.string.kg_primary_auth_locked_out_password
import com.android.systemui.R.string.kg_primary_auth_locked_out_pattern
import com.android.systemui.R.string.kg_primary_auth_locked_out_pin
import com.android.systemui.R.string.kg_prompt_after_dpm_lock
import com.android.systemui.R.string.kg_prompt_after_user_lockdown_password
import com.android.systemui.R.string.kg_prompt_after_user_lockdown_pattern
import com.android.systemui.R.string.kg_prompt_after_user_lockdown_pin
import com.android.systemui.R.string.kg_prompt_auth_timeout
import com.android.systemui.R.string.kg_prompt_password_auth_timeout
import com.android.systemui.R.string.kg_prompt_pattern_auth_timeout
import com.android.systemui.R.string.kg_prompt_pin_auth_timeout
import com.android.systemui.R.string.kg_prompt_reason_restart_password
import com.android.systemui.R.string.kg_prompt_reason_restart_pattern
import com.android.systemui.R.string.kg_prompt_reason_restart_pin
import com.android.systemui.R.string.kg_prompt_unattended_update
import com.android.systemui.R.string.kg_too_many_failed_attempts_countdown
import com.android.systemui.R.string.kg_trust_agent_disabled
import com.android.systemui.R.string.kg_unlock_with_password_or_fp
import com.android.systemui.R.string.kg_unlock_with_pattern_or_fp
import com.android.systemui.R.string.kg_unlock_with_pin_or_fp
import com.android.systemui.R.string.kg_wrong_input_try_fp_suggestion
import com.android.systemui.R.string.kg_wrong_password_try_again
import com.android.systemui.R.string.kg_wrong_pattern_try_again
import com.android.systemui.R.string.kg_wrong_pin_try_again

typealias BouncerMessage = Pair<Int, Int>

fun emptyBouncerMessage(): BouncerMessage = Pair(0, 0)

@Retention(AnnotationRetention.SOURCE)
@IntDef(
    PROMPT_REASON_TIMEOUT,
    PROMPT_REASON_DEVICE_ADMIN,
    PROMPT_REASON_USER_REQUEST,
    PROMPT_REASON_AFTER_LOCKOUT,
    PROMPT_REASON_PREPARE_FOR_UPDATE,
    PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT,
    PROMPT_REASON_TRUSTAGENT_EXPIRED,
    PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT,
    PROMPT_REASON_INCORRECT_FACE_INPUT,
    PROMPT_REASON_INCORRECT_FINGERPRINT_INPUT,
    PROMPT_REASON_FACE_LOCKED_OUT,
    PROMPT_REASON_FINGERPRINT_LOCKED_OUT,
    PROMPT_REASON_DEFAULT,
    PROMPT_REASON_NONE,
    PROMPT_REASON_RESTART,
    PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT,
)
annotation class BouncerPromptReason

/**
 * Helper method that provides the relevant bouncer message that should be shown for different
 * scenarios indicated by [reason]. [securityMode] & [fpAllowedInBouncer] parameters are used to
 * provide a more specific message.
 */
@JvmOverloads
fun getBouncerMessage(
    @BouncerPromptReason reason: Int,
    securityMode: SecurityMode,
    fpAllowedInBouncer: Boolean = false
): BouncerMessage {
    return when (reason) {
        PROMPT_REASON_RESTART -> authRequiredAfterReboot(securityMode)
        PROMPT_REASON_TIMEOUT -> authRequiredAfterPrimaryAuthTimeout(securityMode)
        PROMPT_REASON_DEVICE_ADMIN -> authRequiredAfterAdminLockdown(securityMode)
        PROMPT_REASON_USER_REQUEST -> authRequiredAfterUserLockdown(securityMode)
        PROMPT_REASON_AFTER_LOCKOUT -> biometricLockout(securityMode)
        PROMPT_REASON_PREPARE_FOR_UPDATE -> authRequiredForUnattendedUpdate(securityMode)
        PROMPT_REASON_FINGERPRINT_LOCKED_OUT -> fingerprintUnlockUnavailable(securityMode)
        PROMPT_REASON_FACE_LOCKED_OUT -> faceUnlockUnavailable(securityMode)
        PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT ->
            if (fpAllowedInBouncer) incorrectSecurityInputWithFingerprint(securityMode)
            else incorrectSecurityInput(securityMode)
        PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT ->
            if (fpAllowedInBouncer) nonStrongAuthTimeoutWithFingerprintAllowed(securityMode)
            else nonStrongAuthTimeout(securityMode)
        PROMPT_REASON_TRUSTAGENT_EXPIRED ->
            if (fpAllowedInBouncer) trustAgentDisabledWithFingerprintAllowed(securityMode)
            else trustAgentDisabled(securityMode)
        PROMPT_REASON_INCORRECT_FACE_INPUT ->
            if (fpAllowedInBouncer) incorrectFaceInputWithFingerprintAllowed(securityMode)
            else incorrectFaceInput(securityMode)
        PROMPT_REASON_INCORRECT_FINGERPRINT_INPUT -> incorrectFingerprintInput(securityMode)
        PROMPT_REASON_DEFAULT ->
            if (fpAllowedInBouncer) defaultMessageWithFingerprint(securityMode)
            else defaultMessage(securityMode)
        PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT -> primaryAuthLockedOut(securityMode)
        else -> emptyBouncerMessage()
    }
}

fun defaultMessage(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, 0)
        SecurityMode.Password -> Pair(keyguard_enter_password, 0)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, 0)
        else -> Pair(0, 0)
    }
}

fun defaultMessageWithFingerprint(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_unlock_with_pattern_or_fp, 0)
        SecurityMode.Password -> Pair(kg_unlock_with_password_or_fp, 0)
        SecurityMode.PIN -> Pair(kg_unlock_with_pin_or_fp, 0)
        else -> Pair(0, 0)
    }
}

fun incorrectSecurityInput(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_wrong_pattern_try_again, 0)
        SecurityMode.Password -> Pair(kg_wrong_password_try_again, 0)
        SecurityMode.PIN -> Pair(kg_wrong_pin_try_again, 0)
        else -> Pair(0, 0)
    }
}

fun incorrectSecurityInputWithFingerprint(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_wrong_pattern_try_again, kg_wrong_input_try_fp_suggestion)
        SecurityMode.Password -> Pair(kg_wrong_password_try_again, kg_wrong_input_try_fp_suggestion)
        SecurityMode.PIN -> Pair(kg_wrong_pin_try_again, kg_wrong_input_try_fp_suggestion)
        else -> Pair(0, 0)
    }
}

fun incorrectFingerprintInput(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_fp_not_recognized, kg_bio_try_again_or_pattern)
        SecurityMode.Password -> Pair(kg_fp_not_recognized, kg_bio_try_again_or_password)
        SecurityMode.PIN -> Pair(kg_fp_not_recognized, kg_bio_try_again_or_pin)
        else -> Pair(0, 0)
    }
}

fun incorrectFaceInput(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(bouncer_face_not_recognized, kg_bio_try_again_or_pattern)
        SecurityMode.Password -> Pair(bouncer_face_not_recognized, kg_bio_try_again_or_password)
        SecurityMode.PIN -> Pair(bouncer_face_not_recognized, kg_bio_try_again_or_pin)
        else -> Pair(0, 0)
    }
}

fun incorrectFaceInputWithFingerprintAllowed(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_unlock_with_pattern_or_fp, bouncer_face_not_recognized)
        SecurityMode.Password -> Pair(kg_unlock_with_password_or_fp, bouncer_face_not_recognized)
        SecurityMode.PIN -> Pair(kg_unlock_with_pin_or_fp, bouncer_face_not_recognized)
        else -> Pair(0, 0)
    }
}

fun biometricLockout(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_bio_too_many_attempts_pattern)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_bio_too_many_attempts_password)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_bio_too_many_attempts_pin)
        else -> Pair(0, 0)
    }
}

fun authRequiredAfterReboot(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_reason_restart_pattern)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_prompt_reason_restart_password)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_reason_restart_pin)
        else -> Pair(0, 0)
    }
}

fun authRequiredAfterAdminLockdown(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_after_dpm_lock)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_prompt_after_dpm_lock)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_after_dpm_lock)
        else -> Pair(0, 0)
    }
}

fun authRequiredAfterUserLockdown(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_after_user_lockdown_pattern)
        SecurityMode.Password ->
            Pair(keyguard_enter_password, kg_prompt_after_user_lockdown_password)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_after_user_lockdown_pin)
        else -> Pair(0, 0)
    }
}

fun authRequiredForUnattendedUpdate(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_unattended_update)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_prompt_unattended_update)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_unattended_update)
        else -> Pair(0, 0)
    }
}

fun authRequiredAfterPrimaryAuthTimeout(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_pattern_auth_timeout)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_prompt_password_auth_timeout)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_pin_auth_timeout)
        else -> Pair(0, 0)
    }
}

fun nonStrongAuthTimeout(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_prompt_auth_timeout)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_prompt_auth_timeout)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_prompt_auth_timeout)
        else -> Pair(0, 0)
    }
}

fun nonStrongAuthTimeoutWithFingerprintAllowed(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_unlock_with_pattern_or_fp, kg_prompt_auth_timeout)
        SecurityMode.Password -> Pair(kg_unlock_with_password_or_fp, kg_prompt_auth_timeout)
        SecurityMode.PIN -> Pair(kg_unlock_with_pin_or_fp, kg_prompt_auth_timeout)
        else -> Pair(0, 0)
    }
}

fun faceUnlockUnavailable(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_face_locked_out)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_face_locked_out)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_face_locked_out)
        else -> Pair(0, 0)
    }
}

fun fingerprintUnlockUnavailable(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_fp_locked_out)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_fp_locked_out)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_fp_locked_out)
        else -> Pair(0, 0)
    }
}

fun trustAgentDisabled(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(keyguard_enter_pattern, kg_trust_agent_disabled)
        SecurityMode.Password -> Pair(keyguard_enter_password, kg_trust_agent_disabled)
        SecurityMode.PIN -> Pair(keyguard_enter_pin, kg_trust_agent_disabled)
        else -> Pair(0, 0)
    }
}

fun trustAgentDisabledWithFingerprintAllowed(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern -> Pair(kg_unlock_with_pattern_or_fp, kg_trust_agent_disabled)
        SecurityMode.Password -> Pair(kg_unlock_with_password_or_fp, kg_trust_agent_disabled)
        SecurityMode.PIN -> Pair(kg_unlock_with_pin_or_fp, kg_trust_agent_disabled)
        else -> Pair(0, 0)
    }
}

fun primaryAuthLockedOut(securityMode: SecurityMode): BouncerMessage {
    return when (securityMode) {
        SecurityMode.Pattern ->
            Pair(kg_too_many_failed_attempts_countdown, kg_primary_auth_locked_out_pattern)
        SecurityMode.Password ->
            Pair(kg_too_many_failed_attempts_countdown, kg_primary_auth_locked_out_password)
        SecurityMode.PIN ->
            Pair(kg_too_many_failed_attempts_countdown, kg_primary_auth_locked_out_pin)
        else -> Pair(0, 0)
    }
}
+36 −0
Original line number Diff line number Diff line
@@ -66,6 +66,42 @@ public interface KeyguardSecurityView {
     */
    int PROMPT_REASON_TRUSTAGENT_EXPIRED = 8;

    /**
     * Prompt that is shown when there is an incorrect primary authentication input.
     */
    int PROMPT_REASON_INCORRECT_PRIMARY_AUTH_INPUT = 9;

    /**
     * Prompt that is shown when there is an incorrect face biometric input.
     */
    int PROMPT_REASON_INCORRECT_FACE_INPUT = 10;

    /**
     * Prompt that is shown when there is an incorrect fingerprint biometric input.
     */
    int PROMPT_REASON_INCORRECT_FINGERPRINT_INPUT = 11;

    /**
     * Prompt that is shown when face authentication is in locked out state.
     */
    int PROMPT_REASON_FACE_LOCKED_OUT = 12;

    /**
     * Prompt that is shown when fingerprint authentication is in locked out state.
     */
    int PROMPT_REASON_FINGERPRINT_LOCKED_OUT = 13;

    /**
     * Default prompt that is shown on the bouncer.
     */
    int PROMPT_REASON_DEFAULT = 14;

    /**
     * Prompt that is shown when primary authentication is in locked out state after too many
     * attempts
     */
    int PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT = 15;

    /**
     * Reset the view and prepare to take input. This should do things like clearing the
     * password or pattern and clear error messages.
+115 −98

File changed.

Preview size limit exceeded, changes collapsed.

+4 −4
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta
                .createNewSession(mContext, mUserId, providerInfo,
                        this, remoteCredentialService);
        if (providerClearSession != null) {
            Slog.d(TAG, "In startProviderSession - provider session created "
            Slog.i(TAG, "Provider session created "
                    + "and being added for: " + providerInfo.getComponentName());
            mProviders.put(providerClearSession.getComponentName().flattenToString(),
                    providerClearSession);
@@ -78,12 +78,12 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta
    @Override // from provider session
    public void onProviderStatusChanged(ProviderSession.Status status,
            ComponentName componentName, ProviderSession.CredentialsSource source) {
        Slog.d(TAG, "in onStatusChanged with status: " + status + ", and source: " + source);
        Slog.i(TAG, "Provider changed with status: " + status + ", and source: " + source);
        if (ProviderSession.isTerminatingStatus(status)) {
            Slog.d(TAG, "in onProviderStatusChanged terminating status");
            Slog.i(TAG, "Provider terminating status");
            onProviderTerminated(componentName);
        } else if (ProviderSession.isCompletionStatus(status)) {
            Slog.d(TAG, "in onProviderStatusChanged isCompletionStatus status");
            Slog.i(TAG, "Provider has completion status");
            onProviderResponseComplete(componentName);
        }
    }
Loading