• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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