| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.chrome.browser.childaccounts; |
| |
| import android.accounts.Account; |
| import android.app.Activity; |
| |
| import org.chromium.base.Callback; |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.annotations.CalledByNative; |
| import org.chromium.base.task.PostTask; |
| import org.chromium.components.signin.AccountManagerFacade; |
| import org.chromium.components.signin.ChildAccountStatus; |
| import org.chromium.content_public.browser.UiThreadTaskTraits; |
| import org.chromium.ui.base.WindowAndroid; |
| |
| /** |
| * This class serves as a simple interface for querying the child account information. It has a |
| * method for querying the child account information asynchronously from the system. |
| * |
| * This method is used by ForcedSigninProcessor and FirstRunFlowSequencer to detect child accounts |
| * since the native side is only activated on signing in. Once signed in by the |
| * ForcedSigninProcessor, the ChildAccountInfoFetcher will notify the native side and also takes |
| * responsibility for monitoring changes and taking a suitable action. |
| * |
| * The class also provides an interface through which a client can listen for child account status |
| * changes. When the SupervisedUserContentProvider forces sign-in it waits for a status change |
| * before querying the URL filters. |
| */ |
| public class ChildAccountService { |
| private ChildAccountService() { |
| // Only for static usage. |
| } |
| |
| /** |
| * Checks for the presence of child accounts on the device. |
| * |
| * @param callback A callback which will be called with a @ChildAccountStatus.Status value. |
| */ |
| public static void checkChildAccountStatus(final Callback<Integer> callback) { |
| ThreadUtils.assertOnUiThread(); |
| final AccountManagerFacade accountManager = AccountManagerFacade.get(); |
| accountManager.tryGetGoogleAccounts(accounts -> { |
| if (accounts.size() != 1) { |
| // Child accounts can't share a device. |
| callback.onResult(ChildAccountStatus.NOT_CHILD); |
| } else { |
| accountManager.checkChildAccountStatus(accounts.get(0), callback); |
| } |
| }); |
| } |
| |
| /** |
| * Set a callback to be called the next time a child account status change is received |
| * @param callback the callback to be called when the status changes. |
| */ |
| public static void listenForStatusChange(Callback<Boolean> callback) { |
| nativeListenForChildStatusReceived(callback); |
| } |
| |
| @CalledByNative |
| private static void reauthenticateChildAccount( |
| WindowAndroid windowAndroid, String accountName, final long nativeCallback) { |
| ThreadUtils.assertOnUiThread(); |
| |
| Activity activity = windowAndroid.getActivity().get(); |
| if (activity == null) { |
| PostTask.postTask(UiThreadTaskTraits.DEFAULT, |
| () -> nativeOnReauthenticationResult(nativeCallback, false)); |
| return; |
| } |
| |
| Account account = AccountManagerFacade.createAccountFromName(accountName); |
| AccountManagerFacade.get().updateCredentials(account, activity, |
| result -> nativeOnReauthenticationResult(nativeCallback, result)); |
| } |
| |
| private static native void nativeListenForChildStatusReceived(Callback<Boolean> callback); |
| |
| private static native void nativeOnReauthenticationResult( |
| long callbackPtr, boolean reauthSuccessful); |
| } |