1 /*
2  * Copyright (C) 2024 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.systemui.screenshot.policy
18 
19 import android.content.ComponentName
20 import android.content.Context
21 import android.os.Process
22 import com.android.systemui.Flags.screenshotPrivateProfileBehaviorFix
23 import com.android.systemui.SystemUIService
24 import com.android.systemui.dagger.SysUISingleton
25 import com.android.systemui.dagger.qualifiers.Application
26 import com.android.systemui.dagger.qualifiers.Background
27 import com.android.systemui.screenshot.ImageCapture
28 import com.android.systemui.screenshot.RequestProcessor
29 import com.android.systemui.screenshot.ScreenshotPolicy
30 import com.android.systemui.screenshot.ScreenshotRequestProcessor
31 import com.android.systemui.screenshot.data.repository.DisplayContentRepository
32 import com.android.systemui.screenshot.data.repository.DisplayContentRepositoryImpl
33 import com.android.systemui.screenshot.data.repository.ProfileTypeRepository
34 import com.android.systemui.screenshot.data.repository.ProfileTypeRepositoryImpl
35 import dagger.Binds
36 import dagger.Module
37 import dagger.Provides
38 import javax.inject.Provider
39 import kotlinx.coroutines.CoroutineDispatcher
40 
41 @Module
42 interface ScreenshotPolicyModule {
43 
44     @Binds
45     @SysUISingleton
bindProfileTypeRepositorynull46     fun bindProfileTypeRepository(impl: ProfileTypeRepositoryImpl): ProfileTypeRepository
47 
48     @Binds
49     @SysUISingleton
50     fun bindDisplayContentRepository(impl: DisplayContentRepositoryImpl): DisplayContentRepository
51 
52     companion object {
53         @JvmStatic
54         @Provides
55         @SysUISingleton
56         fun bindCapturePolicyList(
57             privateProfilePolicy: PrivateProfilePolicy,
58             workProfilePolicy: WorkProfilePolicy,
59         ): List<CapturePolicy> {
60             // In order of priority. The first matching policy applies.
61             return listOf(workProfilePolicy, privateProfilePolicy)
62         }
63 
64         @JvmStatic
65         @Provides
66         @SysUISingleton
67         fun bindScreenshotRequestProcessor(
68             @Application context: Context,
69             @Background background: CoroutineDispatcher,
70             imageCapture: ImageCapture,
71             policyProvider: Provider<ScreenshotPolicy>,
72             displayContentRepoProvider: Provider<DisplayContentRepository>,
73             policyListProvider: Provider<List<CapturePolicy>>,
74         ): ScreenshotRequestProcessor {
75             return if (screenshotPrivateProfileBehaviorFix()) {
76                 PolicyRequestProcessor(
77                     background = background,
78                     capture = imageCapture,
79                     displayTasks = displayContentRepoProvider.get(),
80                     policies = policyListProvider.get(),
81                     defaultOwner = Process.myUserHandle(),
82                     defaultComponent =
83                         ComponentName(context.packageName, SystemUIService::class.java.toString())
84                 )
85             } else {
86                 RequestProcessor(imageCapture, policyProvider.get())
87             }
88         }
89     }
90 }
91