xref: /aosp_15_r20/external/dagger2/javatests/dagger/functional/multibindings/LazyMaps.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2017 The Dagger Authors.
3*f585d8a3SJacky Wang  *
4*f585d8a3SJacky Wang  * Licensed under the Apache License, Version 2.0 (the "License");
5*f585d8a3SJacky Wang  * you may not use this file except in compliance with the License.
6*f585d8a3SJacky Wang  * You may obtain a copy of the License at
7*f585d8a3SJacky Wang  *
8*f585d8a3SJacky Wang  * http://www.apache.org/licenses/LICENSE-2.0
9*f585d8a3SJacky Wang  *
10*f585d8a3SJacky Wang  * Unless required by applicable law or agreed to in writing, software
11*f585d8a3SJacky Wang  * distributed under the License is distributed on an "AS IS" BASIS,
12*f585d8a3SJacky Wang  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f585d8a3SJacky Wang  * See the License for the specific language governing permissions and
14*f585d8a3SJacky Wang  * limitations under the License.
15*f585d8a3SJacky Wang  */
16*f585d8a3SJacky Wang 
17*f585d8a3SJacky Wang package dagger.functional.multibindings;
18*f585d8a3SJacky Wang 
19*f585d8a3SJacky Wang import dagger.Component;
20*f585d8a3SJacky Wang import dagger.Lazy;
21*f585d8a3SJacky Wang import dagger.Module;
22*f585d8a3SJacky Wang import dagger.Provides;
23*f585d8a3SJacky Wang import dagger.multibindings.IntoMap;
24*f585d8a3SJacky Wang import dagger.multibindings.StringKey;
25*f585d8a3SJacky Wang import java.util.Map;
26*f585d8a3SJacky Wang import java.util.concurrent.atomic.AtomicInteger;
27*f585d8a3SJacky Wang import javax.inject.Provider;
28*f585d8a3SJacky Wang import javax.inject.Singleton;
29*f585d8a3SJacky Wang 
30*f585d8a3SJacky Wang /**
31*f585d8a3SJacky Wang  * Bindings that use {@code Lazy<T>} as the value in a multibound map. A regression was uncovered
32*f585d8a3SJacky Wang  * when using {@code MapType.valuesAreFrameworkType()}, which treats {@link Lazy} as a framework
33*f585d8a3SJacky Wang  * type and incorrectly suggested {@link dagger.internal.MapProviderFactory} for a {@code Map<K,
34*f585d8a3SJacky Wang  * Lazy<V>>} instead of a plain {@link dagger.internal.MapFactory}. See b/65084589.
35*f585d8a3SJacky Wang  */
36*f585d8a3SJacky Wang class LazyMaps {
37*f585d8a3SJacky Wang   @Module
38*f585d8a3SJacky Wang   abstract static class TestModule {
39*f585d8a3SJacky Wang     @Provides
40*f585d8a3SJacky Wang     @Singleton
provideAtomicInteger()41*f585d8a3SJacky Wang     static AtomicInteger provideAtomicInteger() {
42*f585d8a3SJacky Wang       return new AtomicInteger();
43*f585d8a3SJacky Wang     }
44*f585d8a3SJacky Wang 
45*f585d8a3SJacky Wang     @Provides
provideString(AtomicInteger atomicInteger)46*f585d8a3SJacky Wang     static String provideString(AtomicInteger atomicInteger) {
47*f585d8a3SJacky Wang       return "value-" + atomicInteger.incrementAndGet();
48*f585d8a3SJacky Wang     }
49*f585d8a3SJacky Wang 
50*f585d8a3SJacky Wang     @Provides
51*f585d8a3SJacky Wang     @IntoMap
52*f585d8a3SJacky Wang     @StringKey("key")
mapContribution(Lazy<String> lazy)53*f585d8a3SJacky Wang     static Lazy<String> mapContribution(Lazy<String> lazy) {
54*f585d8a3SJacky Wang       return lazy;
55*f585d8a3SJacky Wang     }
56*f585d8a3SJacky Wang 
57*f585d8a3SJacky Wang     /* TODO(b/65118638) Replace once @Binds @IntoMap Lazy<T> methods work properly.
58*f585d8a3SJacky Wang     @Binds
59*f585d8a3SJacky Wang     @IntoMap
60*f585d8a3SJacky Wang     @StringKey("binds-key")
61*f585d8a3SJacky Wang     abstract Lazy<String> mapContributionAsBinds(Lazy<String> lazy);
62*f585d8a3SJacky Wang     */
63*f585d8a3SJacky Wang   }
64*f585d8a3SJacky Wang 
65*f585d8a3SJacky Wang   @Singleton
66*f585d8a3SJacky Wang   @Component(modules = TestModule.class)
67*f585d8a3SJacky Wang   interface TestComponent {
mapOfLazy()68*f585d8a3SJacky Wang     Map<String, Lazy<String>> mapOfLazy();
69*f585d8a3SJacky Wang 
mapOfProviderOfLazy()70*f585d8a3SJacky Wang     Map<String, Provider<Lazy<String>>> mapOfProviderOfLazy();
71*f585d8a3SJacky Wang 
providerForMapOfLazy()72*f585d8a3SJacky Wang     Provider<Map<String, Lazy<String>>> providerForMapOfLazy();
73*f585d8a3SJacky Wang 
providerForMapOfProviderOfLazy()74*f585d8a3SJacky Wang     Provider<Map<String, Provider<Lazy<String>>>> providerForMapOfProviderOfLazy();
75*f585d8a3SJacky Wang   }
76*f585d8a3SJacky Wang }
77