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