| // Copyright 2018 The Feed Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.android.libraries.feed.piet; |
| |
| import android.content.Context; |
| import android.support.annotation.VisibleForTesting; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import com.google.android.libraries.feed.common.functional.Supplier; |
| import com.google.android.libraries.feed.common.time.Clock; |
| import com.google.android.libraries.feed.piet.PietStylesHelper.PietStylesHelperFactory; |
| import com.google.android.libraries.feed.piet.ui.RoundedCornerMaskCache; |
| |
| /** |
| * A state shared by instances of Cards and Slices. The state is accessed directly from the instance |
| * instead of going through getX methods. |
| * |
| * <p>This is basically the Dagger state for Piet. If we can use Dagger, replace this with Dagger. |
| */ |
| class AdapterParameters { |
| // TODO: Make these configurable instead of constants. |
| private static final int DEFAULT_TEMPLATE_POOL_SIZE = 100; |
| private static final int DEFAULT_NUM_TEMPLATE_POOLS = 30; |
| |
| final Context context; |
| final Supplier</*@Nullable*/ ViewGroup> parentViewSupplier; |
| final HostProviders hostProviders; |
| final ParameterizedTextEvaluator templatedStringEvaluator; |
| final ElementAdapterFactory elementAdapterFactory; |
| final TemplateBinder templateBinder; |
| final StyleProvider defaultStyleProvider; |
| final Clock clock; |
| final PietStylesHelperFactory pietStylesHelperFactory; |
| final RoundedCornerMaskCache roundedCornerMaskCache; |
| final boolean useLegacyRoundedCornerImpl; |
| final boolean useOutlineRoundedCornerImpl; |
| |
| // Doesn't like passing "this" to the new ElementAdapterFactory; however, nothing in the factory's |
| // construction will reference the elementAdapterFactory member of this, so should be safe. |
| @SuppressWarnings("initialization") |
| public AdapterParameters( |
| Context context, |
| Supplier</*@Nullable*/ ViewGroup> parentViewSupplier, |
| HostProviders hostProviders, |
| Clock clock, |
| boolean useLegacyRoundedCornerImpl, |
| boolean useOutlineRoundedCornerImpl) { |
| this.context = context; |
| this.parentViewSupplier = parentViewSupplier; |
| this.hostProviders = hostProviders; |
| this.clock = clock; |
| |
| templatedStringEvaluator = new ParameterizedTextEvaluator(clock); |
| |
| KeyedRecyclerPool<ElementAdapter<? extends View, ?>> templateRecyclerPool = |
| new KeyedRecyclerPool<>(DEFAULT_NUM_TEMPLATE_POOLS, DEFAULT_TEMPLATE_POOL_SIZE); |
| elementAdapterFactory = new ElementAdapterFactory(context, this, templateRecyclerPool); |
| templateBinder = new TemplateBinder(templateRecyclerPool, elementAdapterFactory); |
| |
| this.defaultStyleProvider = new StyleProvider(hostProviders.getAssetProvider()); |
| |
| this.pietStylesHelperFactory = new PietStylesHelperFactory(); |
| this.roundedCornerMaskCache = new RoundedCornerMaskCache(); |
| |
| this.useLegacyRoundedCornerImpl = useLegacyRoundedCornerImpl; |
| this.useOutlineRoundedCornerImpl = useOutlineRoundedCornerImpl; |
| } |
| |
| /** Testing-only constructor for mocking the internally-constructed objects. */ |
| @VisibleForTesting |
| AdapterParameters( |
| Context context, |
| Supplier</*@Nullable*/ ViewGroup> parentViewSupplier, |
| HostProviders hostProviders, |
| ParameterizedTextEvaluator templatedStringEvaluator, |
| ElementAdapterFactory elementAdapterFactory, |
| TemplateBinder templateBinder, |
| Clock clock) { |
| this( |
| context, |
| parentViewSupplier, |
| hostProviders, |
| templatedStringEvaluator, |
| elementAdapterFactory, |
| templateBinder, |
| clock, |
| new PietStylesHelperFactory(), |
| new RoundedCornerMaskCache(), |
| true, |
| true); |
| } |
| |
| /** Testing-only constructor for mocking the internally-constructed objects. */ |
| @VisibleForTesting |
| AdapterParameters( |
| Context context, |
| Supplier</*@Nullable*/ ViewGroup> parentViewSupplier, |
| HostProviders hostProviders, |
| ParameterizedTextEvaluator templatedStringEvaluator, |
| ElementAdapterFactory elementAdapterFactory, |
| TemplateBinder templateBinder, |
| Clock clock, |
| PietStylesHelperFactory pietStylesHelperFactory, |
| RoundedCornerMaskCache maskCache, |
| boolean useLegacyRoundedCornerImpl, |
| boolean useOutlineRoundedCornerImpl) { |
| this.context = context; |
| this.parentViewSupplier = parentViewSupplier; |
| this.hostProviders = hostProviders; |
| |
| this.templatedStringEvaluator = templatedStringEvaluator; |
| this.elementAdapterFactory = elementAdapterFactory; |
| this.templateBinder = templateBinder; |
| this.defaultStyleProvider = new StyleProvider(hostProviders.getAssetProvider()); |
| this.clock = clock; |
| this.pietStylesHelperFactory = pietStylesHelperFactory; |
| this.roundedCornerMaskCache = maskCache; |
| this.useLegacyRoundedCornerImpl = useLegacyRoundedCornerImpl; |
| this.useOutlineRoundedCornerImpl = useOutlineRoundedCornerImpl; |
| } |
| } |