blob: 21449174630e74932cdcf4cace456d459eccc3f3 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* 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.android.clockwork.displayoffload;
import static com.google.android.clockwork.ambient.offload.IDisplayOffloadCallbacks.ERROR_LAYOUT_CONVERSION_FAILURE;
import android.content.Context;
import com.android.clockwork.displayoffload.HalTypeConverter.HalTypeConverterSupplier;
import com.android.internal.annotations.VisibleForTesting;
import com.google.android.clockwork.ambient.offload.types.StringResource;
import java.util.ArrayList;
/** Encapsulates information about an offloaded layout pinned to an UID. */
public class OffloadLayout extends BaseOffloadLayout {
OffloadLayout(int uid, Context context, HalTypeConverterSupplier halTypeConverterSupplier) {
super(uid, halTypeConverterSupplier, new HalResourceStore(halTypeConverterSupplier),
new TextPreprocessor(context, halTypeConverterSupplier));
}
@VisibleForTesting
OffloadLayout(int uid, HalTypeConverterSupplier halTypeConverterSupplier,
HalResourceStore halResourceStore, TextPreprocessor textPreprocessor) {
super(uid, halTypeConverterSupplier, halResourceStore, textPreprocessor);
}
// LINT.IfChange(buildHalResourceHelper)
protected void buildHalResourceHelper() throws DisplayOffloadException {
HalTypeConverter halTypeConverter = mHalTypeConverter.getConverter();
halTypeConverter.begin();
// Register OffloadRawMetric types first so that we know all the terminal data sources.
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mOffloadRawMetrics)));
mOffloadRawMetrics.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mOffloadMetrics)));
mOffloadMetrics.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mCustomResources)));
mCustomResources.clear();
// Variables & Mappings
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mOffloadStrings)));
mOffloadStrings.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mOffloadConstants)));
mOffloadConstants.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mLinearMetricMappings)));
mLinearMetricMappings.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mRangeMappings)));
mRangeMappings.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mModuloMappings)));
mModuloMappings.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mNumberFormatMappings)));
mNumberFormatMappings.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mUnaryOperations)));
mUnaryOperations.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mBinaryOperations)));
mBinaryOperations.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mTernaryOperations)));
mTernaryOperations.clear();
// UI Components
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mTranslationGroups)));
mTranslationGroups.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mRotationGroups)));
mRotationGroups.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mBitmapResources)));
mBitmapResources.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mArcPathResources)));
mArcPathResources.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mRectShapeResources)));
mRectShapeResources.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mRoundRectShapeResources)));
mRoundRectShapeResources.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mLineShapeResources)));
mLineShapeResources.clear();
mHalResourceStore.addReplaceResource(
halTypeConverter.toHalObject(new ArrayList<>(mSpriteSheetPngResources)));
mSpriteSheetPngResources.clear();
// Text & Font
mTextPreprocessor.addFont(mHalResourceStore, mTtfFontResources);
mTtfFontResources.clear();
for (StringResource t : mStringResources) {
if (mHalResourceStore.get(t.font) instanceof TtfFontAdapter) {
// API no longer emits StringResource for TTF
throw new DisplayOffloadException(
ERROR_LAYOUT_CONVERSION_FAILURE,
"StringResource use of TTF font is deprecated.");
}
mHalResourceStore.addReplaceResource(
ResourceObject.of(t.id, halTypeConverter.toHalObject(t)));
}
mStringResources.clear();
mTextPreprocessor.addStaticText(mHalResourceStore, mStaticTextResources);
mStaticTextResources.clear();
mTextPreprocessor.addDynamicText(mHalResourceStore, mDynamicTextResources);
mDynamicTextResources.clear();
// Subset TTF fonts based on what glyphs were actually used
mTextPreprocessor.processTtfFontSubsetting(mHalResourceStore);
halTypeConverter.end();
}
// LINT.ThenChange()
}