153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton/* 253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * Copyright (C) 2016 The Android Open Source Project 353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * 453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * Licensed under the Apache License, Version 2.0 (the "License"); 553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * you may not use this file except in compliance with the License. 653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * You may obtain a copy of the License at 753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * 853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * http://www.apache.org/licenses/LICENSE-2.0 953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * 1053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * Unless required by applicable law or agreed to in writing, software 1153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * distributed under the License is distributed on an "AS IS" BASIS, 1253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * See the License for the specific language governing permissions and 1453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton * limitations under the License. 1553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton */ 1653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 1753b78241ffc32e61d12afc6245633266e592db88Gustav Senntonpackage com.android.server.webkit; 1853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 1953b78241ffc32e61d12afc6245633266e592db88Gustav Senntonimport android.content.Context; 2053b78241ffc32e61d12afc6245633266e592db88Gustav Senntonimport android.content.pm.PackageInfo; 2153b78241ffc32e61d12afc6245633266e592db88Gustav Senntonimport android.content.pm.PackageManager.NameNotFoundException; 22364e16029017a4e16ed727a5e501f70363d04e5aGustav Senntonimport android.content.pm.UserInfo; 23364e16029017a4e16ed727a5e501f70363d04e5aGustav Senntonimport android.webkit.UserPackage; 2453b78241ffc32e61d12afc6245633266e592db88Gustav Senntonimport android.webkit.WebViewProviderInfo; 2553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 26364e16029017a4e16ed727a5e501f70363d04e5aGustav Senntonimport java.util.ArrayList; 2753b78241ffc32e61d12afc6245633266e592db88Gustav Senntonimport java.util.HashMap; 28364e16029017a4e16ed727a5e501f70363d04e5aGustav Senntonimport java.util.List; 29364e16029017a4e16ed727a5e501f70363d04e5aGustav Senntonimport java.util.Map; 3053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 3153b78241ffc32e61d12afc6245633266e592db88Gustav Senntonpublic class TestSystemImpl implements SystemInterface { 3295f7e8e06dd0003a813f7a4b3c718c68d0fa4a01Gustav Sennton private String mUserProvider = null; 3353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton private final WebViewProviderInfo[] mPackageConfigs; 34364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton List<Integer> mUsers = new ArrayList<>(); 35364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton // Package -> [user, package] 36364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton Map<String, Map<Integer, PackageInfo>> mPackages = new HashMap(); 3753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton private boolean mFallbackLogicEnabled; 3853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton private final int mNumRelros; 3953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton private final boolean mIsDebuggable; 401a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) private int mMultiProcessSetting; 41dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) private final boolean mMultiProcessDefault; 4253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 43364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton public static final int PRIMARY_USER_ID = 0; 44364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton 4553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public TestSystemImpl(WebViewProviderInfo[] packageConfigs, boolean fallbackLogicEnabled, 46dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) int numRelros, boolean isDebuggable, boolean multiProcessDefault) { 4753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton mPackageConfigs = packageConfigs; 4853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton mFallbackLogicEnabled = fallbackLogicEnabled; 4953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton mNumRelros = numRelros; 5053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton mIsDebuggable = isDebuggable; 51364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton mUsers.add(PRIMARY_USER_ID); 52dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) mMultiProcessDefault = multiProcessDefault; 53364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 54364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton 55364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton public void addUser(int userId) { 56364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton mUsers.add(userId); 5753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 5853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 5953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 6053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public WebViewProviderInfo[] getWebViewPackages() { 6153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton return mPackageConfigs; 6253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 6353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 6453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 6553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public int onWebViewProviderChanged(PackageInfo packageInfo) { 6653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton return mNumRelros; 6753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 6853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 6953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 7053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public String getUserChosenWebViewProvider(Context context) { return mUserProvider; } 7153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 7253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 7353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void updateUserSetting(Context context, String newProviderName) { 7453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton mUserProvider = newProviderName; 7553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 7653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 7753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 7853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void killPackageDependents(String packageName) {} 7953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 8053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 8153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public boolean isFallbackLogicEnabled() { 8253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton return mFallbackLogicEnabled; 8353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 8453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 8553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 8653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void enableFallbackLogic(boolean enable) { 8753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton mFallbackLogicEnabled = enable; 8853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 8953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 9053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 9153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void uninstallAndDisablePackageForAllUsers(Context context, String packageName) { 9253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton enablePackageForAllUsers(context, packageName, false); 9353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 9453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 9553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 9653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void enablePackageForAllUsers(Context context, String packageName, boolean enable) { 97364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton for(int userId : mUsers) { 98364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton enablePackageForUser(packageName, enable, userId); 99364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 10053b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 10153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 10253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 10353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void enablePackageForUser(String packageName, boolean enable, int userId) { 104364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton Map<Integer, PackageInfo> userPackages = mPackages.get(packageName); 105364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton if (userPackages == null) { 10653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton throw new IllegalArgumentException("There is no package called " + packageName); 10753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 108364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton PackageInfo packageInfo = userPackages.get(userId); 10953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton packageInfo.applicationInfo.enabled = enable; 110364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton setPackageInfoForUser(userId, packageInfo); 11153b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 11253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 11353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 11453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public boolean systemIsDebuggable() { return mIsDebuggable; } 11553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 11653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 11753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public PackageInfo getPackageInfoForProvider(WebViewProviderInfo info) throws 11853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton NameNotFoundException { 119364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton Map<Integer, PackageInfo> userPackages = mPackages.get(info.packageName); 120364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton if (userPackages == null) throw new NameNotFoundException(info.packageName); 121364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton PackageInfo ret = userPackages.get(PRIMARY_USER_ID); 12253b78241ffc32e61d12afc6245633266e592db88Gustav Sennton if (ret == null) throw new NameNotFoundException(info.packageName); 12353b78241ffc32e61d12afc6245633266e592db88Gustav Sennton return ret; 12453b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 12553b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 126364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton @Override 127364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton public List<UserPackage> getPackageInfoForProviderAllUsers( 128364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton Context context, WebViewProviderInfo info) { 129364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton Map<Integer, PackageInfo> userPackages = mPackages.get(info.packageName); 130364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton List<UserPackage> ret = new ArrayList(); 131364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton // Loop over defined users, and find the corresponding package for each user. 132364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton for (int userId : mUsers) { 133364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton ret.add(new UserPackage(createUserInfo(userId), 134364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton userPackages == null ? null : userPackages.get(userId))); 135364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 136364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton return ret; 137364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 138364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton 139364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton private static UserInfo createUserInfo(int userId) { 140364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton return new UserInfo(userId, "User nr. " + userId, 0 /* flags */); 141364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 142364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton 143364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton /** 144364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton * Set package for primary user. 145364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton */ 14653b78241ffc32e61d12afc6245633266e592db88Gustav Sennton public void setPackageInfo(PackageInfo pi) { 147364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton setPackageInfoForUser(PRIMARY_USER_ID, pi); 148364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 149364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton 150364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton public void setPackageInfoForUser(int userId, PackageInfo pi) { 151364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton if (!mUsers.contains(userId)) { 152364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton throw new IllegalArgumentException("User nr. " + userId + " doesn't exist"); 153364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 154364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton if (!mPackages.containsKey(pi.packageName)) { 155364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton mPackages.put(pi.packageName, new HashMap<Integer, PackageInfo>()); 156364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton } 157364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton mPackages.get(pi.packageName).put(userId, pi); 15853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 15953b78241ffc32e61d12afc6245633266e592db88Gustav Sennton 160364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton /** 161364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton * Removes the package {@param packageName} for the primary user. 162364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton */ 16395f7e8e06dd0003a813f7a4b3c718c68d0fa4a01Gustav Sennton public void removePackageInfo(String packageName) { 164364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton mPackages.get(packageName).remove(PRIMARY_USER_ID); 16595f7e8e06dd0003a813f7a4b3c718c68d0fa4a01Gustav Sennton } 16695f7e8e06dd0003a813f7a4b3c718c68d0fa4a01Gustav Sennton 16753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton @Override 16818c9e151fdf8676a8ad8f66a0bde592c0c1644d3Gustav Sennton public int getFactoryPackageVersion(String packageName) throws NameNotFoundException { 16918c9e151fdf8676a8ad8f66a0bde592c0c1644d3Gustav Sennton PackageInfo pi = null; 170364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton Map<Integer, PackageInfo> userPackages = mPackages.get(packageName); 171364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton if (userPackages == null) throw new NameNotFoundException(); 172364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton 173364e16029017a4e16ed727a5e501f70363d04e5aGustav Sennton pi = userPackages.get(PRIMARY_USER_ID); 17418c9e151fdf8676a8ad8f66a0bde592c0c1644d3Gustav Sennton if (pi != null && pi.applicationInfo.isSystemApp()) { 17518c9e151fdf8676a8ad8f66a0bde592c0c1644d3Gustav Sennton return pi.applicationInfo.versionCode; 17618c9e151fdf8676a8ad8f66a0bde592c0c1644d3Gustav Sennton } 17718c9e151fdf8676a8ad8f66a0bde592c0c1644d3Gustav Sennton throw new NameNotFoundException(); 17853b78241ffc32e61d12afc6245633266e592db88Gustav Sennton } 179ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek 180ded209843616a98e6f97db0d1784f6d630cbd5e9Robert Sesek @Override 1811a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) public int getMultiProcessSetting(Context context) { 1821a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) return mMultiProcessSetting; 1831a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) } 1841a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) 1851a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) @Override 1861a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) public void setMultiProcessSetting(Context context, int value) { 1871a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) mMultiProcessSetting = value; 1881a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) } 18986f7bbe134a274a4936b73e2fc2287482ac0157eGustav Sennton 19086f7bbe134a274a4936b73e2fc2287482ac0157eGustav Sennton @Override 1911a4c4e35397adb964fb53695f66e1ac1ace39ff1Torne (Richard Coles) public void notifyZygote(boolean enableMultiProcess) {} 192dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) 193dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) @Override 194dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) public boolean isMultiProcessDefaultEnabled() { 195dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) return mMultiProcessDefault; 196dc375072c4fc95d612ccd3c60ff0519eb75b804cTorne (Richard Coles) } 19753b78241ffc32e61d12afc6245633266e592db88Gustav Sennton} 198