1 /* 2 * Copyright (C) 2022 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.devicelockcontroller; 18 19 import android.app.Application; 20 import android.content.Context; 21 import android.content.res.Resources; 22 import android.util.Pair; 23 24 import androidx.annotation.GuardedBy; 25 import androidx.annotation.NonNull; 26 import androidx.annotation.Nullable; 27 import androidx.work.Configuration; 28 import androidx.work.DelegatingWorkerFactory; 29 import androidx.work.ListenableWorker; 30 31 import com.android.devicelockcontroller.policy.DevicePolicyController; 32 import com.android.devicelockcontroller.policy.DeviceStateController; 33 import com.android.devicelockcontroller.policy.FinalizationController; 34 import com.android.devicelockcontroller.policy.FinalizationControllerImpl; 35 import com.android.devicelockcontroller.policy.PolicyObjectsProvider; 36 import com.android.devicelockcontroller.policy.ProvisionStateController; 37 import com.android.devicelockcontroller.policy.ProvisionStateControllerImpl; 38 import com.android.devicelockcontroller.provision.grpc.impl.ApiKeyClientInterceptor; 39 import com.android.devicelockcontroller.schedule.DeviceLockControllerScheduler; 40 import com.android.devicelockcontroller.schedule.DeviceLockControllerSchedulerImpl; 41 import com.android.devicelockcontroller.schedule.DeviceLockControllerSchedulerProvider; 42 import com.android.devicelockcontroller.stats.StatsLogger; 43 import com.android.devicelockcontroller.stats.StatsLoggerImpl; 44 import com.android.devicelockcontroller.stats.StatsLoggerProvider; 45 import com.android.devicelockcontroller.util.LogUtil; 46 47 import com.google.common.util.concurrent.Futures; 48 import com.google.common.util.concurrent.ListenableFuture; 49 50 import io.grpc.ClientInterceptor; 51 52 /** 53 * Application class for Device Lock Controller. 54 */ 55 public class DeviceLockControllerApplication extends Application implements 56 PolicyObjectsProvider, 57 Configuration.Provider, 58 DeviceLockControllerSchedulerProvider, 59 FcmRegistrationTokenProvider, 60 PlayInstallPackageTaskClassProvider, 61 StatsLoggerProvider, 62 ClientInterceptorProvider { 63 private static final String TAG = "DeviceLockControllerApplication"; 64 65 private static Context sApplicationContext; 66 @GuardedBy("this") 67 private ProvisionStateController mProvisionStateController; 68 @GuardedBy("this") 69 private FinalizationController mFinalizationController; 70 @GuardedBy("this") 71 private DeviceLockControllerScheduler mDeviceLockControllerScheduler; 72 @GuardedBy("this") 73 private StatsLogger mStatsLogger; 74 @GuardedBy("this") 75 protected ClientInterceptor mClientInterceptor; 76 77 private WorkManagerExceptionHandler mWorkManagerExceptionHandler; 78 DeviceLockControllerApplication()79 public DeviceLockControllerApplication() { 80 super(); 81 82 mWorkManagerExceptionHandler = WorkManagerExceptionHandler.getInstance(this); 83 } 84 85 @Override onCreate()86 public void onCreate() { 87 super.onCreate(); 88 sApplicationContext = getApplicationContext(); 89 LogUtil.i(TAG, "onCreate"); 90 } 91 92 @Override getDeviceStateController()93 public DeviceStateController getDeviceStateController() { 94 return getProvisionStateController().getDeviceStateController(); 95 } 96 97 @Override getProvisionStateController()98 public synchronized ProvisionStateController getProvisionStateController() { 99 if (mProvisionStateController == null) { 100 mProvisionStateController = new ProvisionStateControllerImpl(this); 101 } 102 return mProvisionStateController; 103 } 104 105 @Override getPolicyController()106 public DevicePolicyController getPolicyController() { 107 return getProvisionStateController().getDevicePolicyController(); 108 } 109 110 @Override getFinalizationController()111 public synchronized FinalizationController getFinalizationController() { 112 if (mFinalizationController == null) { 113 mFinalizationController = new FinalizationControllerImpl(this); 114 } 115 return mFinalizationController; 116 } 117 118 @Override getStatsLogger()119 public synchronized StatsLogger getStatsLogger() { 120 if (null == mStatsLogger) { 121 mStatsLogger = new StatsLoggerImpl(); 122 } 123 return mStatsLogger; 124 } 125 126 @Override destroyObjects()127 public synchronized void destroyObjects() { 128 mProvisionStateController = null; 129 mFinalizationController = null; 130 } 131 getAppContext()132 public static Context getAppContext() { 133 return sApplicationContext; 134 } 135 136 //b/267355744: Required to initialize WorkManager on-demand. 137 @Override getWorkManagerConfiguration()138 public Configuration getWorkManagerConfiguration() { 139 final DelegatingWorkerFactory factory = new DelegatingWorkerFactory(); 140 factory.addFactory(new DeviceLockControllerWorkerFactory()); 141 return new Configuration.Builder() 142 .setWorkerFactory(factory) 143 .setMinimumLoggingLevel(android.util.Log.INFO) 144 .setInitializationExceptionHandler( 145 (t) -> mWorkManagerExceptionHandler 146 .initializationExceptionHandler(this, t)) 147 .setTaskExecutor(mWorkManagerExceptionHandler.getWorkManagerTaskExecutor()) 148 .build(); 149 } 150 151 @Override 152 @Nullable getPlayInstallPackageTaskClass()153 public Class<? extends ListenableWorker> getPlayInstallPackageTaskClass() { 154 return null; 155 } 156 157 @Override 158 @NonNull getFcmRegistrationToken()159 public ListenableFuture<String> getFcmRegistrationToken() { 160 return Futures.immediateFuture(null); 161 } 162 163 @Override getDeviceLockControllerScheduler()164 public synchronized DeviceLockControllerScheduler getDeviceLockControllerScheduler() { 165 if (mDeviceLockControllerScheduler == null) { 166 mDeviceLockControllerScheduler = new DeviceLockControllerSchedulerImpl(this, 167 getProvisionStateController()); 168 } 169 return mDeviceLockControllerScheduler; 170 } 171 172 @Override getClientInterceptor()173 public synchronized ClientInterceptor getClientInterceptor() { 174 if (mClientInterceptor == null) { 175 Resources resources = getResources(); 176 Pair<String, String> apikey = 177 new Pair<>(resources.getString(R.string.check_in_service_api_key_name), 178 resources.getString(R.string.check_in_service_api_key_value)); 179 mClientInterceptor = new ApiKeyClientInterceptor(apikey); 180 } 181 182 return mClientInterceptor; 183 } 184 } 185