1d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse/*
2d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * Copyright 2014, The Android Open Source Project
3d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse *
4d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * Licensed under the Apache License, Version 2.0 (the "License");
5d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * you may not use this file except in compliance with the License.
6d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * You may obtain a copy of the License at
7d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse *
8d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse *     http://www.apache.org/licenses/LICENSE-2.0
9d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse *
10d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * Unless required by applicable law or agreed to in writing, software
11d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * distributed under the License is distributed on an "AS IS" BASIS,
12d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * See the License for the specific language governing permissions and
14d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * limitations under the License.
15d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse */
16d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
17d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnsepackage com.android.managedprovisioning.task;
18d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
19d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport android.content.ComponentName;
20d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport android.content.Context;
21d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport android.content.Intent;
22d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport android.content.pm.ComponentInfo;
23d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport android.content.pm.PackageManager;
24d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport android.content.pm.ResolveInfo;
25d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
26d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport com.android.managedprovisioning.ProvisionLogger;
27d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport com.android.managedprovisioning.Utils;
28d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
29d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport java.util.List;
30d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnseimport java.util.Set;
31d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
32d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
33d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse/**
34d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse * Disables all system app components that listen to ACTION_INSTALL_SHORTCUT.
35d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse */
36d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnsepublic class DisableInstallShortcutListenersTask {
37d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    private final PackageManager mPm;
38d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    private final int mUserId;
39d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
40d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    public DisableInstallShortcutListenersTask(Context context, int userId) {
41d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        mUserId = userId;
42d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        mPm = context.getPackageManager();
43d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    }
44d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
45d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    public void run() {
46d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        ProvisionLogger.logd("Disabling install shortcut listeners.");
47d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        Intent actionShortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
48d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        Set<String> systemApps = Utils.getCurrentSystemApps(mUserId);
49d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        for (String systemApp : systemApps) {
50d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            actionShortcut.setPackage(systemApp);
51d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            disableReceivers(actionShortcut);
52d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        }
53d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    }
54d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse
55d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    /**
56d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse     * Disable all components that can handle the specified broadcast intent.
57d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse     */
58d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    private void disableReceivers(Intent intent) {
59d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        List<ResolveInfo> receivers = mPm.queryBroadcastReceivers(intent, 0, mUserId);
60d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        for (ResolveInfo ri : receivers) {
61d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            // One of ri.activityInfo, ri.serviceInfo, ri.providerInfo is not null. Let's find which
62d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            // one.
63d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            ComponentInfo ci;
64d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            if (ri.activityInfo != null) {
65d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse                ci = ri.activityInfo;
66d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            } else if (ri.serviceInfo != null) {
67d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse                ci = ri.serviceInfo;
68d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            } else {
69d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse                ci = ri.providerInfo;
70d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            }
71d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse            Utils.disableComponent(new ComponentName(ci.packageName, ci.name), mUserId);
72d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse        }
73d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse    }
74d5e4c42542dd96d8940912cc20dff20fa48da0d9Sander Alewijnse}
75