1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2016 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.reusable; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import dagger.Component; 20*f585d8a3SJacky Wang import dagger.Module; 21*f585d8a3SJacky Wang import dagger.Provides; 22*f585d8a3SJacky Wang import dagger.Reusable; 23*f585d8a3SJacky Wang import dagger.Subcomponent; 24*f585d8a3SJacky Wang import java.lang.annotation.Retention; 25*f585d8a3SJacky Wang import java.lang.annotation.RetentionPolicy; 26*f585d8a3SJacky Wang import javax.inject.Provider; 27*f585d8a3SJacky Wang import javax.inject.Qualifier; 28*f585d8a3SJacky Wang 29*f585d8a3SJacky Wang @Component(modules = ComponentWithReusableBindings.ReusableBindingsModule.class) 30*f585d8a3SJacky Wang interface ComponentWithReusableBindings { 31*f585d8a3SJacky Wang 32*f585d8a3SJacky Wang @Qualifier 33*f585d8a3SJacky Wang @Retention(RetentionPolicy.RUNTIME) 34*f585d8a3SJacky Wang @interface InParent {} 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang @Qualifier 37*f585d8a3SJacky Wang @Retention(RetentionPolicy.RUNTIME) 38*f585d8a3SJacky Wang @interface InChildren {} 39*f585d8a3SJacky Wang 40*f585d8a3SJacky Wang @InParent reusableInParent()41*f585d8a3SJacky Wang Object reusableInParent(); 42*f585d8a3SJacky Wang childOne()43*f585d8a3SJacky Wang ChildOne childOne(); 44*f585d8a3SJacky Wang childTwo()45*f585d8a3SJacky Wang ChildTwo childTwo(); 46*f585d8a3SJacky Wang 47*f585d8a3SJacky Wang // b/77150738 primitive()48*f585d8a3SJacky Wang int primitive(); 49*f585d8a3SJacky Wang 50*f585d8a3SJacky Wang // b/77150738: This is used as a regression test for fastInit mode's switching providers. In 51*f585d8a3SJacky Wang // particular, it occurs when a @Provides method returns the boxed type but the component method 52*f585d8a3SJacky Wang // returns the unboxed type, and the instance is requested from a SwitchingProvider. unboxedPrimitive()53*f585d8a3SJacky Wang boolean unboxedPrimitive(); 54*f585d8a3SJacky Wang 55*f585d8a3SJacky Wang // b/77150738 booleanProvider()56*f585d8a3SJacky Wang Provider<Boolean> booleanProvider(); 57*f585d8a3SJacky Wang 58*f585d8a3SJacky Wang @Subcomponent 59*f585d8a3SJacky Wang interface ChildOne { 60*f585d8a3SJacky Wang @InParent reusableInParent()61*f585d8a3SJacky Wang Object reusableInParent(); 62*f585d8a3SJacky Wang 63*f585d8a3SJacky Wang @InChildren reusableInChild()64*f585d8a3SJacky Wang Object reusableInChild(); 65*f585d8a3SJacky Wang } 66*f585d8a3SJacky Wang 67*f585d8a3SJacky Wang @Subcomponent 68*f585d8a3SJacky Wang interface ChildTwo { 69*f585d8a3SJacky Wang @InParent reusableInParent()70*f585d8a3SJacky Wang Object reusableInParent(); 71*f585d8a3SJacky Wang 72*f585d8a3SJacky Wang @InChildren reusableInChild()73*f585d8a3SJacky Wang Object reusableInChild(); 74*f585d8a3SJacky Wang } 75*f585d8a3SJacky Wang 76*f585d8a3SJacky Wang @Module 77*f585d8a3SJacky Wang static class ReusableBindingsModule { 78*f585d8a3SJacky Wang @Provides 79*f585d8a3SJacky Wang @Reusable 80*f585d8a3SJacky Wang @InParent inParent()81*f585d8a3SJacky Wang static Object inParent() { 82*f585d8a3SJacky Wang return new Object(); 83*f585d8a3SJacky Wang } 84*f585d8a3SJacky Wang 85*f585d8a3SJacky Wang @Provides 86*f585d8a3SJacky Wang @Reusable 87*f585d8a3SJacky Wang @InChildren inChildren()88*f585d8a3SJacky Wang static Object inChildren() { 89*f585d8a3SJacky Wang return new Object(); 90*f585d8a3SJacky Wang } 91*f585d8a3SJacky Wang 92*f585d8a3SJacky Wang // b/77150738 93*f585d8a3SJacky Wang @Provides 94*f585d8a3SJacky Wang @Reusable primitive()95*f585d8a3SJacky Wang static int primitive() { 96*f585d8a3SJacky Wang return 0; 97*f585d8a3SJacky Wang } 98*f585d8a3SJacky Wang 99*f585d8a3SJacky Wang // b/77150738 100*f585d8a3SJacky Wang @Provides 101*f585d8a3SJacky Wang @Reusable boxedPrimitive()102*f585d8a3SJacky Wang static Boolean boxedPrimitive() { 103*f585d8a3SJacky Wang return false; 104*f585d8a3SJacky Wang } 105*f585d8a3SJacky Wang } 106*f585d8a3SJacky Wang } 107