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