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