AutofillManagerServiceImpl.java revision f73795f92689d1ab0e341bd5b8af8c5a44f8a2c4
15381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme/*
25381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * Copyright (C) 2016 The Android Open Source Project
35381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme *
45381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License");
55381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * you may not use this file except in compliance with the License.
65381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * You may obtain a copy of the License at
75381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme *
85381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme *      http://www.apache.org/licenses/LICENSE-2.0
95381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme *
105381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * Unless required by applicable law or agreed to in writing, software
115381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS,
125381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * See the License for the specific language governing permissions and
145381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * limitations under the License.
155381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme */
165381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
175381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemepackage com.android.server.autofill;
185381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
197f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Lemeimport static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
200aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Lemeimport static android.view.autofill.AutofillManager.ACTION_START_SESSION;
21eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmannimport static android.view.autofill.AutofillManager.NO_SESSION;
22bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme
23f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmannimport static com.android.server.autofill.Helper.sDebug;
249f9ee25515591ef33281708c0ab911962f4364a6Felipe Lemeimport static com.android.server.autofill.Helper.sVerbose;
25dfa7fbc8702fae62e6b3f78c4d9245995baee04eFelipe Leme
267b7711680244108923f0dbb4ca6e35db7e659e6aPhilip P. Moltmannimport android.annotation.NonNull;
276d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport android.annotation.Nullable;
28f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmannimport android.app.ActivityManager;
29782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.app.AppGlobals;
30f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmannimport android.app.IActivityManager;
315381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.content.ComponentName;
325381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.content.Context;
338eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Lemeimport android.content.pm.ApplicationInfo;
345381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.content.pm.PackageManager;
35782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.content.pm.ServiceInfo;
36bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Lemeimport android.graphics.Rect;
37e11139c73d234efdd672a91830b09c92f6120d5eFelipe Lemeimport android.graphics.drawable.Drawable;
38f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmannimport android.os.AsyncTask;
39782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.os.Binder;
406d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport android.os.Bundle;
415381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.os.IBinder;
42bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Lemeimport android.os.Looper;
43782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.os.RemoteCallbackList;
445381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.os.RemoteException;
4524d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Lemeimport android.os.UserManager;
46782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.provider.Settings;
47640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.service.autofill.AutofillService;
48640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.service.autofill.AutofillServiceInfo;
49cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmannimport android.service.autofill.FillEventHistory;
5049e96960d46022c85d1f6d00440242439f2028ecFelipe Lemeimport android.service.autofill.FillEventHistory.Event;
51cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmannimport android.service.autofill.FillResponse;
525381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.service.autofill.IAutoFillService;
53782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.text.TextUtils;
549b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Lemeimport android.util.ArraySet;
55c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Lemeimport android.util.DebugUtils;
56bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Lemeimport android.util.LocalLog;
575381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport android.util.Slog;
58eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmannimport android.util.SparseArray;
59640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.view.autofill.AutofillId;
60c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Lemeimport android.view.autofill.AutofillManager;
61640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.view.autofill.AutofillValue;
62782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganovimport android.view.autofill.IAutoFillManagerClient;
636fa8a07143d1984ff42750079cf596a868644663Felipe Leme
64ff35509ee9ef89f42607d1424fa6b4df8de98a90Felipe Lemeimport com.android.internal.R;
655381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport com.android.internal.annotations.GuardedBy;
66bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Lemeimport com.android.internal.os.HandlerCaller;
6728a2c7e0579dbcbde09b6e23a17b0a501a3562b9Svet Ganovimport com.android.server.autofill.ui.AutoFillUI;
685381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
695381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Lemeimport java.io.PrintWriter;
7069a1cae41110f080f2e91dafa2f99947f2886b7aFelipe Lemeimport java.util.ArrayList;
71eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmannimport java.util.Random;
725381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
735381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme/**
742f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov * Bridge between the {@code system_server}'s {@link AutofillManagerService} and the
755381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme * app's {@link IAutoFillService} implementation.
765381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme *
775381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme */
782f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganovfinal class AutofillManagerServiceImpl {
795381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
802f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov    private static final String TAG = "AutofillManagerServiceImpl";
81eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    private static final int MAX_SESSION_ID_CREATE_TRIES = 2048;
825381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
83f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    /** Minimum interval to prune abandoned sessions */
84f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    private static final int MAX_ABANDONED_SESSION_MILLIS = 30000;
85f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
866fa8a07143d1984ff42750079cf596a868644663Felipe Leme    static final int MSG_SERVICE_SAVE = 1;
876d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme
88dfa7fbc8702fae62e6b3f78c4d9245995baee04eFelipe Leme    private final int mUserId;
895381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    private final Context mContext;
905381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    private final Object mLock;
910f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    private final AutoFillUI mUi;
925381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
93782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    private RemoteCallbackList<IAutoFillManagerClient> mClients;
94640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme    private AutofillServiceInfo mInfo;
95bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme
96eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    private static final Random sRandom = new Random();
97eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
98782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    private final LocalLog mRequestsHistory;
9924d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme    /**
10024d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme     * Whether service was disabled for user due to {@link UserManager} restrictions.
10124d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme     */
10224d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme    private boolean mDisabled;
1035381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
104350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme    /**
105350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme     * Caches whether the setup completed for the current user.
106350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme     */
107350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme    @GuardedBy("mLock")
108350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme    private boolean mSetupComplete;
109350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme
110bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme    private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
111bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        switch (msg.what) {
112bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            case MSG_SERVICE_SAVE:
113eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann                handleSessionSave(msg.arg1);
114bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme                break;
115bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            default:
1160ab53dcb31e7ae52cc265c8020df538df90ed2d7Felipe Leme                Slog.w(TAG, "invalid msg on handler: " + msg);
117bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        }
118bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme    };
119bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
120bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme    private final HandlerCaller mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(),
121bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            mHandlerCallback, true);
122782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
1236d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    /**
124f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann     * Cache of pending {@link Session}s, keyed by sessionId.
1256d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme     *
126640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme     * <p>They're kept until the {@link AutofillService} finished handling a request, an error
127f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann     * occurs, or the session is abandoned.
1286d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme     */
1296d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme    @GuardedBy("mLock")
130eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    private final SparseArray<Session> mSessions = new SparseArray<>();
1315381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
132cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /** The last selection */
133cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    @GuardedBy("mLock")
134cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    private FillEventHistory mEventHistory;
135cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
136f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    /** When was {@link PruneTask} last executed? */
137f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    private long mLastPrune = 0;
138f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
1392f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov    AutofillManagerServiceImpl(Context context, Object lock, LocalLog requestsHistory,
14024d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme            int userId, AutoFillUI ui, boolean disabled) {
1415381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme        mContext = context;
1425381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme        mLock = lock;
143bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme        mRequestsHistory = requestsHistory;
144dfa7fbc8702fae62e6b3f78c4d9245995baee04eFelipe Leme        mUserId = userId;
1450f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov        mUi = ui;
14624d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        updateLocked(disabled);
1475381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    }
1485381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
1498eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme    CharSequence getServiceName() {
150db041188bc9ca03bed3c14a7ca1b3eb9524a9287Felipe Leme        final String packageName = getPackageName();
151db041188bc9ca03bed3c14a7ca1b3eb9524a9287Felipe Leme        if (packageName == null) {
1528eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme            return null;
1538eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme        }
1548eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme
1558eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme        try {
1568eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme            final PackageManager pm = mContext.getPackageManager();
1578eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme            final ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
1588eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme            return pm.getApplicationLabel(info);
1598eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme        } catch (Exception e) {
1600ab53dcb31e7ae52cc265c8020df538df90ed2d7Felipe Leme            Slog.e(TAG, "Could not get label for " + packageName + ": " + e);
1618eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme            return packageName;
1628eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme        }
1638eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme    }
1648eab775d2cbc0d66f9b57451ec8a973f2464d014Felipe Leme
165db041188bc9ca03bed3c14a7ca1b3eb9524a9287Felipe Leme    String getPackageName() {
16648f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        final ComponentName serviceComponent = getServiceComponentName();
16748f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        if (serviceComponent != null) {
16848f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            return serviceComponent.getPackageName();
16948f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        }
17048f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        return null;
17148f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov    }
17248f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov
17348f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov    ComponentName getServiceComponentName() {
17448f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        synchronized (mLock) {
17548f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            if (mInfo == null) {
17648f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                return null;
17748f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            }
17848f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            return mInfo.getServiceInfo().getComponentName();
179db041188bc9ca03bed3c14a7ca1b3eb9524a9287Felipe Leme        }
180db041188bc9ca03bed3c14a7ca1b3eb9524a9287Felipe Leme    }
181db041188bc9ca03bed3c14a7ca1b3eb9524a9287Felipe Leme
182350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme    private boolean isSetupCompletedLocked() {
183350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        final String setupComplete = Settings.Secure.getStringForUser(
184350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme                mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, mUserId);
185350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        return "1".equals(setupComplete);
186350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme    }
187350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme
18898d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme    private String getComponentNameFromSettings() {
18998d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme        return Settings.Secure.getStringForUser(
19098d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme                mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, mUserId);
19198d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme    }
19298d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme
19324d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme    void updateLocked(boolean disabled) {
19424d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        final boolean wasEnabled = isEnabled();
195350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        if (sVerbose) {
196350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme            Slog.v(TAG, "updateLocked(u=" + mUserId + "): wasEnabled=" + wasEnabled
197350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme                    + ", mSetupComplete= " + mSetupComplete
198350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme                    + ", disabled=" + disabled + ", mDisabled=" + mDisabled);
199350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        }
200350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        mSetupComplete = isSetupCompletedLocked();
20124d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        mDisabled = disabled;
202782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        ComponentName serviceComponent = null;
203782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        ServiceInfo serviceInfo = null;
20498d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme        final String componentName = getComponentNameFromSettings();
205782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        if (!TextUtils.isEmpty(componentName)) {
206782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            try {
207782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                serviceComponent = ComponentName.unflattenFromString(componentName);
208782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                serviceInfo = AppGlobals.getPackageManager().getServiceInfo(serviceComponent,
209782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                        0, mUserId);
210782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            } catch (RuntimeException | RemoteException e) {
211640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme                Slog.e(TAG, "Bad autofill service name " + componentName + ": " + e);
212782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                return;
213782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            }
214782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
215782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        try {
216782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            if (serviceInfo != null) {
217640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme                mInfo = new AutofillServiceInfo(mContext.getPackageManager(),
218782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                        serviceComponent, mUserId);
219782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            } else {
220782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                mInfo = null;
221782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            }
222350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme            final boolean isEnabled = isEnabled();
223350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme            if (wasEnabled != isEnabled) {
224350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme                if (!isEnabled) {
225782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                    final int sessionCount = mSessions.size();
226782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                    for (int i = sessionCount - 1; i >= 0; i--) {
2276d0cb1e8eb8ff2e0b4cc8d14823debbc37cb7c6eFelipe Leme                        final Session session = mSessions.valueAt(i);
2286d0cb1e8eb8ff2e0b4cc8d14823debbc37cb7c6eFelipe Leme                        session.removeSelfLocked();
229782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                    }
230782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                }
23148f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                sendStateToClients(false);
232782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            }
233decd887f012f0c39bba855c8878eb5d8255595c4Felipe Leme        } catch (Exception e) {
234decd887f012f0c39bba855c8878eb5d8255595c4Felipe Leme            Slog.e(TAG, "Bad AutofillService '" + componentName + "': " + e);
235782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
236782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    }
2375381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
238782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    boolean addClientLocked(IAutoFillManagerClient client) {
239782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        if (mClients == null) {
240782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            mClients = new RemoteCallbackList<>();
241782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
242782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        mClients.register(client);
24324d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        return isEnabled();
244782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    }
245782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
246a9379d0b44ca1f68a0036d2b65218e17fa348514Svetoslav Ganov    void setAuthenticationResultLocked(Bundle data, int sessionId, int authenticationId, int uid) {
24724d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        if (!isEnabled()) {
248782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            return;
249782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
250eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final Session session = mSessions.get(sessionId);
251eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (session != null && uid == session.uid) {
252a9379d0b44ca1f68a0036d2b65218e17fa348514Svetoslav Ganov            session.setAuthenticationResultLocked(data, authenticationId);
253782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
254782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    }
255782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
256eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    void setHasCallback(int sessionId, int uid, boolean hasIt) {
25724d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        if (!isEnabled()) {
258e6010f2fb4d512c00a21cda55197f5f57e63fdc1Felipe Leme            return;
259e6010f2fb4d512c00a21cda55197f5f57e63fdc1Felipe Leme        }
260eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final Session session = mSessions.get(sessionId);
261eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (session != null && uid == session.uid) {
26248f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            synchronized (mLock) {
26348f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                session.setHasCallbackLocked(hasIt);
26448f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            }
265e6010f2fb4d512c00a21cda55197f5f57e63fdc1Felipe Leme        }
266e6010f2fb4d512c00a21cda55197f5f57e63fdc1Felipe Leme    }
267e6010f2fb4d512c00a21cda55197f5f57e63fdc1Felipe Leme
268134cee27b8a54ff4c8bebda51c5fe4a4e6f1fd8aPhilip P. Moltmann    int startSessionLocked(@NonNull IBinder activityToken, int uid,
2694753bb0c34e068f57fff208529836a7688b3ef41Felipe Leme            @NonNull IBinder appCallbackToken, @NonNull AutofillId autofillId,
2704753bb0c34e068f57fff208529836a7688b3ef41Felipe Leme            @NonNull Rect virtualBounds, @Nullable AutofillValue value, boolean hasCallback,
2714753bb0c34e068f57fff208529836a7688b3ef41Felipe Leme            int flags, @NonNull String packageName) {
27224d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        if (!isEnabled()) {
273eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            return 0;
274782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
275c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        if (sVerbose) Slog.v(TAG, "startSession(): token=" + activityToken + ", flags=" + flags);
276782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
277f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        // Occasionally clean up abandoned sessions
278f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        pruneAbandonedSessionsLocked();
279f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
280134cee27b8a54ff4c8bebda51c5fe4a4e6f1fd8aPhilip P. Moltmann        final Session newSession = createSessionByTokenLocked(activityToken, uid, appCallbackToken,
2817f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                hasCallback, packageName);
282eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (newSession == null) {
283eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            return NO_SESSION;
284bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        }
285bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
286eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final String historyItem =
2870aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Leme                "id=" + newSession.id + " uid=" + uid + " s=" + mInfo.getServiceInfo().packageName
288eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann                        + " u=" + mUserId + " i=" + autofillId + " b=" + virtualBounds + " hc=" +
289eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann                        hasCallback + " f=" + flags;
290eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        mRequestsHistory.log(historyItem);
291eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
2920aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Leme        newSession.updateLocked(autofillId, virtualBounds, value, ACTION_START_SESSION, flags);
293eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
2940aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Leme        return newSession.id;
295226309c555b2c8df4a24c745b06fa7e89f3ed53fJason Long    }
296bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme
297f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    /**
298f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann     * Remove abandoned sessions if needed.
299f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann     */
300f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    private void pruneAbandonedSessionsLocked() {
301f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        long now = System.currentTimeMillis();
302f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        if (mLastPrune < now - MAX_ABANDONED_SESSION_MILLIS) {
303f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            mLastPrune = now;
304f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
305f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            if (mSessions.size() > 0) {
306f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                (new PruneTask()).execute();
307f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            }
308f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        }
309f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    }
310f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
311eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    void finishSessionLocked(int sessionId, int uid) {
31224d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        if (!isEnabled()) {
313782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            return;
314782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
315bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
316eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final Session session = mSessions.get(sessionId);
317eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (session == null || uid != session.uid) {
3189f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme            if (sVerbose) {
3199f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme                Slog.v(TAG, "finishSessionLocked(): no session for " + sessionId + "(" + uid + ")");
3209f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme            }
321bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            return;
32229a5b0d0f1cc7fd6cbfe97c816b8a687d9e438ccFelipe Leme        }
323bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
3246d0cb1e8eb8ff2e0b4cc8d14823debbc37cb7c6eFelipe Leme        final boolean finished = session.showSaveLocked();
3259f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme        if (sVerbose) Slog.v(TAG, "finishSessionLocked(): session finished on save? " + finished);
3269f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme
3276d0cb1e8eb8ff2e0b4cc8d14823debbc37cb7c6eFelipe Leme        if (finished) {
32848f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            session.removeSelfLocked();
3296d0cb1e8eb8ff2e0b4cc8d14823debbc37cb7c6eFelipe Leme        }
330226309c555b2c8df4a24c745b06fa7e89f3ed53fJason Long    }
3315381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
332eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    void cancelSessionLocked(int sessionId, int uid) {
33324d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme        if (!isEnabled()) {
3342f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov            return;
3352f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov        }
3362f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov
337eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final Session session = mSessions.get(sessionId);
338eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (session == null || uid != session.uid) {
339eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            Slog.w(TAG, "cancelSessionLocked(): no session for " + sessionId + "(" + uid + ")");
3402f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov            return;
3412f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov        }
3426d0cb1e8eb8ff2e0b4cc8d14823debbc37cb7c6eFelipe Leme        session.removeSelfLocked();
3432f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov    }
3442f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov
345f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov    void disableOwnedAutofillServicesLocked(int uid) {
3462f0d1324715ca1fdd6c4ab6c0f7f1c3c9c489503Felipe Leme        if (mInfo == null || mInfo.getServiceInfo().applicationInfo.uid != uid) {
347f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov            return;
348f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov        }
349f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov        final long identity = Binder.clearCallingIdentity();
350f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov        try {
351f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov            final String autoFillService = getComponentNameFromSettings();
352f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov            if (mInfo.getServiceInfo().getComponentName().equals(
353f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov                    ComponentName.unflattenFromString(autoFillService))) {
354f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov                Settings.Secure.putStringForUser(mContext.getContentResolver(),
355f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov                        Settings.Secure.AUTOFILL_SERVICE, null, mUserId);
356f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov                destroySessionsLocked();
357f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov            }
358f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov        } finally {
359f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov            Binder.restoreCallingIdentity(identity);
360f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov        }
361f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov    }
362f20a037ba2a6990bb51ad40ee18c7af18464f620Svet Ganov
363eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    private Session createSessionByTokenLocked(@NonNull IBinder activityToken, int uid,
3647f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme            @NonNull IBinder appCallbackToken, boolean hasCallback, @NonNull String packageName) {
365eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        // use random ids so that one app cannot know that another app creates sessions
366eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        int sessionId;
367eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        int tries = 0;
368eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        do {
369eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            tries++;
370eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            if (tries > MAX_SESSION_ID_CREATE_TRIES) {
3719f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme                Slog.w(TAG, "Cannot create session in " + MAX_SESSION_ID_CREATE_TRIES + " tries");
372eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann                return null;
373eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            }
374eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
375eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            sessionId = sRandom.nextInt();
376eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        } while (sessionId == NO_SESSION || mSessions.indexOfKey(sessionId) >= 0);
377eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
3786fa8a07143d1984ff42750079cf596a868644663Felipe Leme        final Session newSession = new Session(this, mUi, mContext, mHandlerCaller, mUserId, mLock,
379134cee27b8a54ff4c8bebda51c5fe4a4e6f1fd8aPhilip P. Moltmann                sessionId, uid, activityToken, appCallbackToken, hasCallback,
3806fa8a07143d1984ff42750079cf596a868644663Felipe Leme                mInfo.getServiceInfo().getComponentName(), packageName);
3810aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Leme        mSessions.put(newSession.id, newSession);
382bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme
383226309c555b2c8df4a24c745b06fa7e89f3ed53fJason Long        return newSession;
384bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme    }
385bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme
386eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    /**
387eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     * Restores a session after an activity was temporarily destroyed.
388eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     *
389eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     * @param sessionId The id of the session to restore
390eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     * @param uid UID of the process that tries to restore the session
391eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     * @param activityToken The new instance of the activity
392eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     * @param appCallback The callbacks to the activity
393eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann     */
394eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    boolean restoreSession(int sessionId, int uid, @NonNull IBinder activityToken,
395eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            @NonNull IBinder appCallback) {
396eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final Session session = mSessions.get(sessionId);
397eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
398eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (session == null || uid != session.uid) {
399eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            return false;
400eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        } else {
401eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            session.switchActivity(activityToken, appCallback);
402eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            return true;
403eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        }
404eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    }
405eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann
4067f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme    /**
4077f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme     * Updates a session and returns whether it should be restarted.
4087f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme     */
4097f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme    boolean updateSessionLocked(int sessionId, int uid, AutofillId autofillId, Rect virtualBounds,
4100aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Leme            AutofillValue value, int action, int flags) {
411eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final Session session = mSessions.get(sessionId);
412eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        if (session == null || session.uid != uid) {
4137f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme            if ((flags & FLAG_MANUAL_REQUEST) != 0) {
4147f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                if (sDebug) {
4157f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                    Slog.d(TAG, "restarting session " + sessionId + " due to manual request on "
4167f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                            + autofillId);
4177f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                }
4187f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                return true;
4197f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme            }
4209f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme            if (sVerbose) {
4217f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                Slog.v(TAG, "updateSessionLocked(): session gone for " + sessionId
4227f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme                        + "(" + uid + ")");
4230ab53dcb31e7ae52cc265c8020df538df90ed2d7Felipe Leme            }
4247f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme            return false;
425bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        }
426bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
4270aa4c5065d1495ec0b2c6fe15324569f31dcbdb1Felipe Leme        session.updateLocked(autofillId, virtualBounds, value, action, flags);
4287f33cd350be4278ce5d4ef460c11e4dbaf9c473bFelipe Leme        return false;
4290200d9ea1509089c0c03b7071aa271e3a9b35c11Felipe Leme    }
4300200d9ea1509089c0c03b7071aa271e3a9b35c11Felipe Leme
431eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    void removeSessionLocked(int sessionId) {
432eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        mSessions.remove(sessionId);
4336fa8a07143d1984ff42750079cf596a868644663Felipe Leme    }
4346fa8a07143d1984ff42750079cf596a868644663Felipe Leme
435eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann    private void handleSessionSave(int sessionId) {
436bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        synchronized (mLock) {
437eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann            final Session session = mSessions.get(sessionId);
438bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            if (session == null) {
439eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann                Slog.w(TAG, "handleSessionSave(): already gone: " + sessionId);
440bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
441bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme                return;
442bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            }
443bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme            session.callSaveLocked();
444bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        }
445436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme    }
446436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme
447c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme    void onPendingSaveUi(int operation, @NonNull IBinder token) {
448c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        if (sVerbose) Slog.v(TAG, "onPendingSaveUi(" + operation + "): " + token);
449c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        synchronized (mLock) {
450c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme            final int sessionCount = mSessions.size();
451c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme            for (int i = sessionCount - 1; i >= 0; i--) {
452c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                final Session session = mSessions.valueAt(i);
453c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                if (session.isSaveUiPendingForToken(token)) {
454c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                    session.onPendingSaveUi(operation, token);
455c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                    return;
456c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                }
457c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme            }
458c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        }
459c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        if (sDebug) {
460c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme            Slog.d(TAG, "No pending Save UI for token " + token + " and operation "
461c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                    + DebugUtils.flagsToString(AutofillManager.class, "PENDING_UI_OPERATION_",
462c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme                            operation));
463c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        }
464c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme    }
465c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme
4660f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    void destroyLocked() {
4679f9ee25515591ef33281708c0ab911962f4364a6Felipe Leme        if (sVerbose) Slog.v(TAG, "destroyLocked()");
468bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
469eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final int numSessions = mSessions.size();
4709b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme        final ArraySet<RemoteFillService> remoteFillServices = new ArraySet<>(numSessions);
471eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        for (int i = 0; i < numSessions; i++) {
4729b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme            final RemoteFillService remoteFillService = mSessions.valueAt(i).destroyLocked();
4739b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme            if (remoteFillService != null) {
4749b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme                remoteFillServices.add(remoteFillService);
4759b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme            }
4765381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme        }
477bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme        mSessions.clear();
4789b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme        for (int i = 0; i < remoteFillServices.size(); i++) {
4799b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme            remoteFillServices.valueAt(i).destroy();
4809b36dfb2b1377aeb774e1b8090b5b4f29a394df1Felipe Leme        }
48148f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov
48248f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        sendStateToClients(true);
4830f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    }
4845381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
485e11139c73d234efdd672a91830b09c92f6120d5eFelipe Leme    @NonNull
4866fa8a07143d1984ff42750079cf596a868644663Felipe Leme    CharSequence getServiceLabel() {
4876fa8a07143d1984ff42750079cf596a868644663Felipe Leme        return mInfo.getServiceInfo().loadLabel(mContext.getPackageManager());
4886fa8a07143d1984ff42750079cf596a868644663Felipe Leme    }
4896fa8a07143d1984ff42750079cf596a868644663Felipe Leme
490e11139c73d234efdd672a91830b09c92f6120d5eFelipe Leme    @NonNull
491e11139c73d234efdd672a91830b09c92f6120d5eFelipe Leme    Drawable getServiceIcon() {
492e11139c73d234efdd672a91830b09c92f6120d5eFelipe Leme        return mInfo.getServiceInfo().loadIcon(mContext.getPackageManager());
493e11139c73d234efdd672a91830b09c92f6120d5eFelipe Leme    }
494e11139c73d234efdd672a91830b09c92f6120d5eFelipe Leme
495cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /**
496cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * Initializes the last fill selection after an autofill service returned a new
497cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * {@link FillResponse}.
498cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     */
499d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme    void setLastResponse(int serviceUid, int sessionId, @NonNull FillResponse response) {
500cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        synchronized (mLock) {
501d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            mEventHistory = new FillEventHistory(serviceUid, sessionId, response.getClientState());
502cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
503cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    }
504cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
505cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /**
5062e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme     * Resets the last fill selection.
5072e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme     */
5082e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme    void resetLastResponse() {
5092e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme        synchronized (mLock) {
5102e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme            mEventHistory = null;
5112e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme        }
5122e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme    }
5132e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme
514d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme    private boolean isValidEventLocked(String method, int sessionId) {
515d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme        if (mEventHistory == null) {
516d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            Slog.w(TAG, method + ": not logging event because history is null");
517d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            return false;
518d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme        }
519d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme        if (sessionId != mEventHistory.getSessionId()) {
520d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            if (sDebug) {
521d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                Slog.d(TAG, method + ": not logging event for session " + sessionId
522d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                        + " because tracked session is " + mEventHistory.getSessionId());
523d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            }
524d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            return false;
525d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme        }
526d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme        return true;
527d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme    }
528d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme
5292e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme    /**
530cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * Updates the last fill selection when an authentication was selected.
531cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     */
532d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme    void setAuthenticationSelected(int sessionId) {
533cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        synchronized (mLock) {
534d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            if (isValidEventLocked("setAuthenticationSelected()", sessionId)) {
535d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                mEventHistory.addEvent(new Event(Event.TYPE_AUTHENTICATION_SELECTED, null));
5362e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme            }
537cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
538cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    }
539cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
540cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /**
541cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * Updates the last fill selection when an dataset authentication was selected.
542cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     */
54363f7906c1de0f4c88e2a3c6034666dc9cf35a3a7Felipe Leme    void logDatasetAuthenticationSelected(@Nullable String selectedDataset, int sessionId) {
544cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        synchronized (mLock) {
54563f7906c1de0f4c88e2a3c6034666dc9cf35a3a7Felipe Leme            if (isValidEventLocked("logDatasetAuthenticationSelected()", sessionId)) {
546d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                mEventHistory.addEvent(
547d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                        new Event(Event.TYPE_DATASET_AUTHENTICATION_SELECTED, selectedDataset));
5482e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme            }
549cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
550cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    }
551cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
552cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /**
553cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * Updates the last fill selection when an save Ui is shown.
554cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     */
55563f7906c1de0f4c88e2a3c6034666dc9cf35a3a7Felipe Leme    void logSaveShown(int sessionId) {
556cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        synchronized (mLock) {
55763f7906c1de0f4c88e2a3c6034666dc9cf35a3a7Felipe Leme            if (isValidEventLocked("logSaveShown()", sessionId)) {
558d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                mEventHistory.addEvent(new Event(Event.TYPE_SAVE_SHOWN, null));
5592e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme            }
560cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
561cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    }
562cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
563cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /**
564cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * Updates the last fill response when a dataset was selected.
565cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     */
56663f7906c1de0f4c88e2a3c6034666dc9cf35a3a7Felipe Leme    void logDatasetSelected(@Nullable String selectedDataset, int sessionId) {
567cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        synchronized (mLock) {
568d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme            if (isValidEventLocked("setDatasetSelected()", sessionId)) {
569d013bcea9713d178627cc1d3e8a0f291ccbcd293Felipe Leme                mEventHistory.addEvent(new Event(Event.TYPE_DATASET_SELECTED, selectedDataset));
5702e30c6f371be6211f1fa2b2257084df24a535795Felipe Leme            }
571cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
572cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    }
573cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
574cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    /**
575cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * Gets the fill event history.
576cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     *
577cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * @param callingUid The calling uid
578cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     *
579cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     * @return The history or {@code null} if there is none.
580cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann     */
581cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    FillEventHistory getFillEventHistory(int callingUid) {
582cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        synchronized (mLock) {
583cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            if (mEventHistory != null && mEventHistory.getServiceUid() == callingUid) {
584cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann                return mEventHistory;
585cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            }
586cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
587cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
588cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        return null;
589cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann    }
590cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
5910f4928f1f73407485d6d94beda1dba1a2360ebbfSvet Ganov    void dumpLocked(String prefix, PrintWriter pw) {
5926d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        final String prefix2 = prefix + "  ";
593bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
59498d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme        pw.print(prefix); pw.print("User: "); pw.println(mUserId);
59598d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme        pw.print(prefix); pw.print("Component: "); pw.println(mInfo != null
596782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                ? mInfo.getServiceInfo().getComponentName() : null);
59798d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme        pw.print(prefix); pw.print("Component from settings: ");
59898d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme            pw.println(getComponentNameFromSettings());
599ff35509ee9ef89f42607d1424fa6b4df8de98a90Felipe Leme        pw.print(prefix); pw.print("Default component: ");
600ff35509ee9ef89f42607d1424fa6b4df8de98a90Felipe Leme            pw.println(mContext.getString(R.string.config_defaultAutofillService));
60198d5c7f6b02a9e4fabce52549f4aab995a67eaa4Felipe Leme        pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
602350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        pw.print(prefix); pw.print("Setup complete: "); pw.println(mSetupComplete);
603f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        pw.print(prefix); pw.print("Last prune: "); pw.println(mLastPrune);
604bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme
605436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme        final int size = mSessions.size();
6066d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        if (size == 0) {
607436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme            pw.print(prefix); pw.println("No sessions");
6086d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        } else {
609436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme            pw.print(prefix); pw.print(size); pw.println(" sessions:");
6106d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme            for (int i = 0; i < size; i++) {
611bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme                pw.print(prefix); pw.print("#"); pw.println(i + 1);
612bd00fef41ce38d2c711bd4151997c1cd8964b712Felipe Leme                mSessions.valueAt(i).dumpLocked(prefix2, pw);
6136d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme            }
6146d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme        }
615cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
61649e96960d46022c85d1f6d00440242439f2028ecFelipe Leme        if (mEventHistory == null || mEventHistory.getEvents() == null
61749e96960d46022c85d1f6d00440242439f2028ecFelipe Leme                || mEventHistory.getEvents().size() == 0) {
618cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            pw.print(prefix); pw.println("No event on last fill response");
619cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        } else {
620cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            pw.print(prefix); pw.println("Events of last fill response:");
621cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            pw.print(prefix);
622cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann
623cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            int numEvents = mEventHistory.getEvents().size();
624cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            for (int i = 0; i < numEvents; i++) {
62549e96960d46022c85d1f6d00440242439f2028ecFelipe Leme                final Event event = mEventHistory.getEvents().get(i);
626cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann                pw.println("  " + i + ": eventType=" + event.getType() + " datasetId="
627cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann                        + event.getDatasetId());
628cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann            }
629cc684ed41f17ccdce45a056fd4034efc35b213d5Philip P. Moltmann        }
6305381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    }
6315381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme
6327ad11281378a1248c08c703b14cfc681e37cac1bSvet Ganov    void destroySessionsLocked() {
633c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        if (mSessions.size() == 0) {
634f73795f92689d1ab0e341bd5b8af8c5a44f8a2c4Felipe Leme            mUi.destroyAll(null, null, false);
635c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme            return;
636c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme        }
637eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        while (mSessions.size() > 0) {
638c24a56ae065bfc4b21f646d0c754b5f4db7c7be5Felipe Leme            mSessions.valueAt(0).forceRemoveSelfLocked();
6397ad11281378a1248c08c703b14cfc681e37cac1bSvet Ganov        }
6407ad11281378a1248c08c703b14cfc681e37cac1bSvet Ganov    }
6417ad11281378a1248c08c703b14cfc681e37cac1bSvet Ganov
64269a1cae41110f080f2e91dafa2f99947f2886b7aFelipe Leme    void listSessionsLocked(ArrayList<String> output) {
643eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        final int numSessions = mSessions.size();
644eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann        for (int i = 0; i < numSessions; i++) {
645782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            output.add((mInfo != null ? mInfo.getServiceInfo().getComponentName()
646eab62baabf290ea6671577a66cfc9fdd1b145d0ePhilip P. Moltmann                    : null) + ":" + mSessions.keyAt(i));
647782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
648782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    }
649782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
65048f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov    private void sendStateToClients(boolean resetClient) {
651782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        final RemoteCallbackList<IAutoFillManagerClient> clients;
652782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        final int userClientCount;
653782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        synchronized (mLock) {
654782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            if (mClients == null) {
655782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                return;
656782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            }
657782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            clients = mClients;
658782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            userClientCount = clients.beginBroadcast();
659782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        }
660782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        try {
661782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            for (int i = 0; i < userClientCount; i++) {
66224d5893b25ce62b7bc9ed9f35fa72b9d47f23cddFelipe Leme                final IAutoFillManagerClient client = clients.getBroadcastItem(i);
663782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                try {
66448f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                    final boolean resetSession;
66548f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                    synchronized (mLock) {
66648f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                        resetSession = resetClient || isClientSessionDestroyedLocked(client);
66748f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                    }
66848f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                    client.setState(isEnabled(), resetSession, resetClient);
669782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                } catch (RemoteException re) {
670782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                    /* ignore */
671782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                }
672782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            }
673782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov        } finally {
674782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov            clients.finishBroadcast();
67569a1cae41110f080f2e91dafa2f99947f2886b7aFelipe Leme        }
67669a1cae41110f080f2e91dafa2f99947f2886b7aFelipe Leme    }
67769a1cae41110f080f2e91dafa2f99947f2886b7aFelipe Leme
67848f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov    private boolean isClientSessionDestroyedLocked(IAutoFillManagerClient client) {
67948f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        final int sessionCount = mSessions.size();
68048f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        for (int i = 0; i < sessionCount; i++) {
68148f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            final Session session = mSessions.valueAt(i);
68248f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            if (session.getClient().equals(client)) {
68348f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov                return session.isDestroyed();
68448f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov            }
68548f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        }
68648f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov        return true;
68748f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov    }
68848f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov
68948f10a2ab53e415f34d86ac717b4f6412dfc824fSvet Ganov    boolean isEnabled() {
690350b2dca6c252dad099bc8e2d96cbffd6e98dfefFelipe Leme        return mSetupComplete && mInfo != null && !mDisabled;
691782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov    }
692782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov
6935381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    @Override
6945381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    public String toString() {
6952f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov        return "AutofillManagerServiceImpl: [userId=" + mUserId
696782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                + ", component=" + (mInfo != null
697782043caf81055aa1c331e9cc15b24a10e1bf17aSvet Ganov                ? mInfo.getServiceInfo().getComponentName() : null) + "]";
6985381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme    }
699f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
700f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    /** Task used to prune abandoned session */
701f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    private class PruneTask extends AsyncTask<Void, Void, Void> {
702f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        @Override
703f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        protected Void doInBackground(Void... ignored) {
704f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            int numSessionsToRemove;
705a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann
706a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann            SparseArray<IBinder> sessionsToRemove;
707f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
708f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            synchronized (mLock) {
709f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                numSessionsToRemove = mSessions.size();
710a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann                sessionsToRemove = new SparseArray<>(numSessionsToRemove);
711f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
712f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                for (int i = 0; i < numSessionsToRemove; i++) {
713f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                    Session session = mSessions.valueAt(i);
714f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
715a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann                    sessionsToRemove.put(session.id, session.getActivityTokenLocked());
716f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                }
717f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            }
718f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
719f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            IActivityManager am = ActivityManager.getService();
720f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
721f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            // Only remove sessions which's activities are not known to the activity manager anymore
722f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            for (int i = 0; i < numSessionsToRemove; i++) {
723f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                try {
724f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                    // The activity manager cannot resolve activities that have been removed
725a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann                    if (am.getActivityClassForToken(sessionsToRemove.valueAt(i)) != null) {
726f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                        sessionsToRemove.removeAt(i);
727f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                        i--;
728f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                        numSessionsToRemove--;
729f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                    }
730f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                } catch (RemoteException e) {
731f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                    Slog.w(TAG, "Cannot figure out if activity is finished", e);
732f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                }
733f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            }
734f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
735f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            synchronized (mLock) {
736f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                for (int i = 0; i < numSessionsToRemove; i++) {
737a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann                    Session sessionToRemove = mSessions.get(sessionsToRemove.keyAt(i));
738f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
739a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann                    if (sessionToRemove != null && sessionsToRemove.valueAt(i)
740a38666bcec2269afb414297ed403fca3a7b6e2b6Philip P. Moltmann                            == sessionToRemove.getActivityTokenLocked()) {
741f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                        if (sessionToRemove.isSavingLocked()) {
742f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                            if (sVerbose) {
743f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                                Slog.v(TAG, "Session " + sessionToRemove.id + " is saving");
744f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                            }
745f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                        } else {
746f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                            if (sDebug) {
747f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                                Slog.i(TAG, "Prune session " + sessionToRemove.id + " ("
748f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                                    + sessionToRemove.getActivityTokenLocked() + ")");
749f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                            }
750f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                            sessionToRemove.removeSelfLocked();
751f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                        }
752f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                    }
753f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann                }
754f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            }
755f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann
756f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann            return null;
757f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann        }
758f539389ee9ef6e67162965d0a3a8f5220e7cb86aPhilip P. Moltmann    }
7595381aa4b585f3fa2a315d88e910111173e2ef77dFelipe Leme}
760