1 /*
2  * Copyright 2016, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.managedprovisioning.task;
18 
19 import static com.android.internal.util.Preconditions.checkNotNull;
20 
21 import android.annotation.UserIdInt;
22 import android.content.Context;
23 import android.content.pm.PackageManager;
24 import android.os.UserHandle;
25 
26 import com.android.internal.annotations.VisibleForTesting;
27 import com.android.managedprovisioning.analytics.MetricsWriterFactory;
28 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker;
29 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences;
30 import com.android.managedprovisioning.common.ProvisionLogger;
31 import com.android.managedprovisioning.common.SettingsFacade;
32 import com.android.managedprovisioning.model.ProvisioningParams;
33 
34 /**
35  * Task to install an existing package on a given user.
36  */
37 public class InstallExistingPackageTask extends AbstractProvisioningTask {
38 
39     private final String mPackageName;
40 
41     private final @UserIdInt int mUserId;
42 
InstallExistingPackageTask( String packageName, Context context, ProvisioningParams params, Callback callback)43     public InstallExistingPackageTask(
44             String packageName,
45             Context context,
46             ProvisioningParams params,
47             Callback callback) {
48         this(packageName, context, params, callback,
49                 new ProvisioningAnalyticsTracker(
50                         MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()),
51                         new ManagedProvisioningSharedPreferences(context)), UserHandle.USER_NULL);
52     }
53 
InstallExistingPackageTask( String packageName, Context context, ProvisioningParams params, Callback callback, @UserIdInt int userId)54     public InstallExistingPackageTask(
55             String packageName,
56             Context context,
57             ProvisioningParams params,
58             Callback callback,
59             @UserIdInt int userId) {
60         this(packageName, context, params, callback,
61                 new ProvisioningAnalyticsTracker(
62                         MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()),
63                         new ManagedProvisioningSharedPreferences(context)), userId);
64     }
65 
66     @VisibleForTesting
InstallExistingPackageTask( String packageName, Context context, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker)67     public InstallExistingPackageTask(
68             String packageName,
69             Context context,
70             ProvisioningParams params,
71             Callback callback,
72             ProvisioningAnalyticsTracker provisioningAnalyticsTracker) {
73         this(packageName, context, params, callback, provisioningAnalyticsTracker,
74                 UserHandle.USER_NULL);
75     }
76 
77     @VisibleForTesting
InstallExistingPackageTask( String packageName, Context context, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker, @UserIdInt int userId)78     public InstallExistingPackageTask(
79             String packageName,
80             Context context,
81             ProvisioningParams params,
82             Callback callback,
83             ProvisioningAnalyticsTracker provisioningAnalyticsTracker,
84             @UserIdInt int userId) {
85         super(context, params, callback, provisioningAnalyticsTracker);
86 
87         mPackageName = checkNotNull(packageName);
88         mUserId = userId;
89     }
90 
91     @VisibleForTesting
getPackageName()92     public String getPackageName() {
93         return mPackageName;
94     }
95 
96     @Override
run(int userId)97     public void run(int userId) {
98         if (mUserId != UserHandle.USER_NULL) {
99             ProvisionLogger.logd("Overriding user id (from " + userId + " to " + mUserId + ")");
100             userId = mUserId;
101         }
102         ProvisionLogger.logi("Installing existing package " + mPackageName + " on user "
103                 + userId);
104         PackageManager pm = mContext.getPackageManager();
105         try {
106             int status = pm.installExistingPackageAsUser(mPackageName, userId);
107             if (status == PackageManager.INSTALL_SUCCEEDED) {
108                 success();
109             } else {
110                 ProvisionLogger.loge("Install failed, result code = " + status);
111                 error(0);
112             }
113         } catch (PackageManager.NameNotFoundException e) {
114             error(0);
115         }
116 
117     }
118 }
119