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