blob: 0adb5cbf33ed36a9d04a1211153ac2d5c760d5d3 [file] [log] [blame]
/*
* Copyright 2020 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 androidx.autofill.inline;
import android.app.PendingIntent;
import android.app.slice.Slice;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.autofill.inline.common.SlicedContent;
import androidx.autofill.inline.v1.InlineSuggestionUi;
/**
* Renderer class responsible for rendering the inline suggestion UI.
*/
@RequiresApi(api = Build.VERSION_CODES.R)
public final class Renderer {
private static final String TAG = "Renderer";
/**
* Returns all the supported versions wrapped in a {@link Bundle}.
*/
@NonNull
public static Bundle getSupportedInlineUiVersionsAsBundle() {
Bundle bundle = new Bundle();
VersionUtils.writeSupportedVersions(bundle);
return bundle;
}
/**
* @param context the context used to render the view
* @param content represents the UI content
* @param styles contains a mapping from UI version to corresponding UI style specification
* @return a view rendered based on the provided UI content and the style with corresponding
* version or {@code null} when the UI version indicated by the slice is either unsupported
* by the Renderer, or not provided in the {@code styles}.
*/
@Nullable
public static View render(@NonNull Context context, @NonNull Slice content,
@NonNull Bundle styles) {
String contentVersion = SlicedContent.getVersion(content);
if (!VersionUtils.isVersionSupported(contentVersion)) {
Log.w(TAG, "Content version unsupported.");
return null;
}
Bundle styleForSliceVersion = VersionUtils.readStyleByVersion(styles, contentVersion);
if (styleForSliceVersion == null) {
Log.w(TAG, "Cannot find a style with the same version as the slice.");
return null;
}
switch (contentVersion) {
case UiVersions.INLINE_UI_VERSION_1:
InlineSuggestionUi.Style style = InlineSuggestionUi.fromBundle(
styleForSliceVersion);
InlineSuggestionUi.Content contentV1 = InlineSuggestionUi.fromSlice(content);
if (style == null || content == null) {
return null;
}
return InlineSuggestionUi.render(context, contentV1, style);
}
Log.w(TAG, "Renderer does not support the style/content version: " + contentVersion);
return null;
}
/**
* Returns a {@link PendingIntent} that will be launched on long clicking the UI
* to show attribution information via a {@link android.app.Dialog}.
*
* <p>The attribution UI indicates to the user the source of the UI content.
*
* @param content the UI content which contains a {@link PendingIntent} representing the
* attribution information
*/
@Nullable
public static PendingIntent getAttributionIntent(@NonNull Slice content) {
String contentVersion = SlicedContent.getVersion(content);
if (!VersionUtils.isVersionSupported(contentVersion)) {
Log.w(TAG, "Content version unsupported.");
return null;
}
switch (contentVersion) {
case UiVersions.INLINE_UI_VERSION_1:
InlineSuggestionUi.Content contentV1 = InlineSuggestionUi.fromSlice(content);
if (contentV1 == null) {
return null;
}
return InlineSuggestionUi.getAttributionIntent(contentV1);
}
Log.w(TAG, "Renderer does not support the content version: " + contentVersion);
return null;
}
private Renderer() {
}
}