1 /*
2  * Copyright 2021 Google LLC
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  *   https://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 package com.google.android.enterprise.connectedapps.processor.containers;
17 
18 import com.google.android.enterprise.connectedapps.processor.TypeUtils;
19 import com.google.auto.value.AutoValue;
20 import java.util.Optional;
21 import javax.lang.model.type.TypeMirror;
22 
23 /** A type which may be supported by a given {@code CrossProfileConfiguration}. */
24 @AutoValue
25 public abstract class Type {
builder()26   public static Builder builder() {
27     return new AutoValue_Type.Builder()
28         .setAcceptableParameterType(false)
29         .setAcceptableReturnType(false)
30         .setSupportedWithAnyGenericType(false)
31         .setSupportedInsideWrapper(true)
32         .setSupportedInsideCrossProfileCallback(true);
33   }
34 
toBuilder()35   public abstract Builder toBuilder();
36 
getTypeMirror()37   public abstract TypeMirror getTypeMirror();
38 
getQualifiedName()39   public String getQualifiedName() {
40     return getTypeMirror().toString();
41   }
42 
isAcceptableReturnType()43   public abstract boolean isAcceptableReturnType();
44 
isAcceptableParameterType()45   public abstract boolean isAcceptableParameterType();
46 
getAutomaticallyResolvedReplacement()47   public abstract Optional<String> getAutomaticallyResolvedReplacement();
48 
isArray()49   public boolean isArray() {
50     return TypeUtils.isArray(getTypeMirror());
51   }
52 
canBeBundled()53   public boolean canBeBundled() {
54     return getPutIntoBundleCode().isPresent() && getGetFromBundleCode().isPresent();
55   }
56 
isPrimitive()57   public boolean isPrimitive() {
58     return getTypeMirror().getKind().isPrimitive();
59   }
60 
isGeneric()61   public boolean isGeneric() {
62     return TypeUtils.isGeneric(getTypeMirror());
63   }
64 
65   /**
66    * If this is set, then type arguments will not validated.
67    *
68    * <p>This allows for Parcelables which take responsibility for their own generics and do not use
69    * Bundler.
70    */
isSupportedWithAnyGenericType()71   public abstract boolean isSupportedWithAnyGenericType();
72 
73   /**
74    * Can this type be used inside a wrapper type? For example a List or an array.
75    *
76    * <p>This allows for async listeners to only be acceptable as parameter types but not type
77    * arguments
78    */
isSupportedInsideWrapper()79   public abstract boolean isSupportedInsideWrapper();
80 
isSupportedInsideCrossProfileCallback()81   public abstract boolean isSupportedInsideCrossProfileCallback();
82 
getFutureWrapper()83   public abstract Optional<FutureWrapper> getFutureWrapper();
84 
isFuture()85   public boolean isFuture() {
86     return getFutureWrapper().isPresent();
87   }
88 
getCrossProfileCallbackInterface()89   public abstract Optional<CrossProfileCallbackInterfaceInfo> getCrossProfileCallbackInterface();
90 
isCrossProfileCallbackInterface()91   public boolean isCrossProfileCallbackInterface() {
92     return getCrossProfileCallbackInterface().isPresent();
93   }
94 
95   // If this is a generated Parcelable Wrapper then this will be set to the simple name
96   // (e.g. ParcelableList)
getParcelableWrapper()97   public abstract Optional<ParcelableWrapper> getParcelableWrapper();
98 
getPutIntoBundleCode()99   public abstract Optional<String> getPutIntoBundleCode();
100 
getGetFromBundleCode()101   public abstract Optional<String> getGetFromBundleCode();
102 
getWriteToParcelCode()103   public abstract Optional<String> getWriteToParcelCode();
104 
getReadFromParcelCode()105   public abstract Optional<String> getReadFromParcelCode();
106 
107   /** A builder for {@link Type}. */
108   @AutoValue.Builder
109   public abstract static class Builder {
110 
setTypeMirror(TypeMirror typeMirror)111     public abstract Builder setTypeMirror(TypeMirror typeMirror);
112 
setAcceptableReturnType(boolean acceptableReturnType)113     public abstract Builder setAcceptableReturnType(boolean acceptableReturnType);
114 
setAcceptableParameterType(boolean acceptableParameterType)115     public abstract Builder setAcceptableParameterType(boolean acceptableParameterType);
116 
setAutomaticallyResolvedReplacement( String automaticallyResolvedReplacement)117     public abstract Builder setAutomaticallyResolvedReplacement(
118         String automaticallyResolvedReplacement);
119 
setSupportedWithAnyGenericType(boolean supportedWithAnyGenericType)120     public abstract Builder setSupportedWithAnyGenericType(boolean supportedWithAnyGenericType);
121 
setSupportedInsideWrapper(boolean supportedInsideWrapper)122     public abstract Builder setSupportedInsideWrapper(boolean supportedInsideWrapper);
123 
setSupportedInsideCrossProfileCallback( boolean supportedInsideCrossProfileCallback)124     public abstract Builder setSupportedInsideCrossProfileCallback(
125         boolean supportedInsideCrossProfileCallback);
126 
setFutureWrapper(FutureWrapper futureWrapper)127     public abstract Builder setFutureWrapper(FutureWrapper futureWrapper);
128 
setCrossProfileCallbackInterface( CrossProfileCallbackInterfaceInfo crossProfileCallbackInterface)129     public abstract Builder setCrossProfileCallbackInterface(
130         CrossProfileCallbackInterfaceInfo crossProfileCallbackInterface);
131 
setPutIntoBundleCode(String putIntoBundleCode)132     public abstract Builder setPutIntoBundleCode(String putIntoBundleCode);
133 
setGetFromBundleCode(String getFromBundleCode)134     public abstract Builder setGetFromBundleCode(String getFromBundleCode);
135 
setWriteToParcelCode(String writeToParcelCode)136     public abstract Builder setWriteToParcelCode(String writeToParcelCode);
137 
setReadFromParcelCode(String readFromParcelCode)138     public abstract Builder setReadFromParcelCode(String readFromParcelCode);
139 
setParcelableWrapper(ParcelableWrapper parcelableWrapper)140     public abstract Builder setParcelableWrapper(ParcelableWrapper parcelableWrapper);
141 
build()142     public abstract Type build();
143   }
144 }
145