blob: 8c3bfbefb5dee885e3bfa4235bf65971e44a0a7b [file] [log] [blame]
/*
* Copyright (C) 2021 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.car.ui.appstyledview;
import static com.android.car.ui.core.CarUi.MIN_TARGET_API;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Configuration;
import android.util.DisplayMetrics;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.car.ui.CarUiLayoutInflaterFactory;
import com.android.car.ui.R;
/**
* Controller to interact with the app styled view.
*/
@TargetApi(MIN_TARGET_API)
public class AppStyledViewControllerImpl implements AppStyledViewController {
private static final double VISIBLE_SCREEN_PERCENTAGE = 0.9;
private final Context mContext;
@AppStyledViewNavIcon
private int mAppStyleViewNavIcon;
private Runnable mAppStyledVCloseClickListener = null;
public AppStyledViewControllerImpl(Context context) {
mContext = context;
}
@Override
public void setNavIcon(@AppStyledViewNavIcon int navIcon) {
mAppStyleViewNavIcon = navIcon;
}
/**
* Sets the AppStyledVCloseClickListener on the close icon.
*/
@Override
public void setOnNavIconClickListener(Runnable listener) {
mAppStyledVCloseClickListener = listener;
}
@Override
public LayoutParams getDialogWindowLayoutParam(LayoutParams params) {
DisplayMetrics displayMetrics = new DisplayMetrics();
WindowManager wm = mContext.getSystemService(WindowManager.class);
wm.getDefaultDisplay().getMetrics(displayMetrics);
int maxWidth = mContext.getResources().getDimensionPixelSize(
R.dimen.car_ui_app_styled_dialog_width_max);
int maxHeight = mContext.getResources().getDimensionPixelSize(
R.dimen.car_ui_app_styled_dialog_height_max);
int displayWidth = (int) (displayMetrics.widthPixels * VISIBLE_SCREEN_PERCENTAGE);
int displayHeight = (int) (displayMetrics.heightPixels * VISIBLE_SCREEN_PERCENTAGE);
if (mContext.getResources().getConfiguration()
.orientation == Configuration.ORIENTATION_LANDSCAPE && maxWidth < displayWidth) {
params.gravity = Gravity.START;
}
int width = mContext.getResources().getDimensionPixelSize(
R.dimen.car_ui_app_styled_dialog_width);
int height = mContext.getResources().getDimensionPixelSize(
R.dimen.car_ui_app_styled_dialog_height);
params.width = width != 0 ? width : Math.min(displayWidth, maxWidth);
params.height = height != 0 ? height : Math.min(displayHeight, maxHeight);
int posX = mContext.getResources().getDimensionPixelSize(
R.dimen.car_ui_app_styled_dialog_position_x);
int posY = mContext.getResources().getDimensionPixelSize(
R.dimen.car_ui_app_styled_dialog_position_y);
if (posX != 0 || posY != 0) {
params.gravity = Gravity.TOP | Gravity.START;
params.x = posX;
params.y = posY;
}
return params;
}
@Override
public View getAppStyledView(@Nullable View contentView) {
// create ContextThemeWrapper from the original Activity Context with the custom theme
final Context contextThemeWrapper = new ContextThemeWrapper(mContext, R.style.Theme_CarUi);
LayoutInflater inflater = LayoutInflater.from(mContext);
if (inflater.getFactory2() == null) {
inflater.setFactory2(new CarUiLayoutInflaterFactory());
}
// clone the inflater using the ContextThemeWrapper
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
View appStyleView = localInflater.inflate(R.layout.car_ui_app_styled_view, null, false);
appStyleView.setClipToOutline(true);
RecyclerView rv = appStyleView.findViewById(R.id.car_ui_app_styled_content);
AppStyledRecyclerViewAdapter adapter = new AppStyledRecyclerViewAdapter(contentView);
rv.setLayoutManager(new LinearLayoutManager(mContext));
rv.setAdapter(adapter);
ImageView close = appStyleView.findViewById(R.id.car_ui_app_styled_view_icon_close);
if (mAppStyleViewNavIcon == AppStyledViewNavIcon.BACK) {
close.setImageResource(R.drawable.car_ui_icon_arrow_back);
} else if (mAppStyleViewNavIcon == AppStyledViewNavIcon.CLOSE) {
close.setImageResource(R.drawable.car_ui_icon_close);
} else {
close.setImageResource(R.drawable.car_ui_icon_close);
}
FrameLayout navContainer =
appStyleView.findViewById(R.id.car_ui_app_styled_view_nav_icon_container);
if (mAppStyledVCloseClickListener != null && navContainer != null) {
navContainer.setOnClickListener((v) -> {
mAppStyledVCloseClickListener.run();
});
}
return appStyleView;
}
}