1cb13a318e577e14461eb008071dddf762847de42Dake Gu/* 2cb13a318e577e14461eb008071dddf762847de42Dake Gu * Copyright (C) 2014 The Android Open Source Project 3cb13a318e577e14461eb008071dddf762847de42Dake Gu * 4cb13a318e577e14461eb008071dddf762847de42Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5cb13a318e577e14461eb008071dddf762847de42Dake Gu * in compliance with the License. You may obtain a copy of the License at 6cb13a318e577e14461eb008071dddf762847de42Dake Gu * 7cb13a318e577e14461eb008071dddf762847de42Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 8cb13a318e577e14461eb008071dddf762847de42Dake Gu * 9cb13a318e577e14461eb008071dddf762847de42Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License 10cb13a318e577e14461eb008071dddf762847de42Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11cb13a318e577e14461eb008071dddf762847de42Dake Gu * or implied. See the License for the specific language governing permissions and limitations under 12cb13a318e577e14461eb008071dddf762847de42Dake Gu * the License. 13cb13a318e577e14461eb008071dddf762847de42Dake Gu */ 14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.widget; 15cb13a318e577e14461eb008071dddf762847de42Dake Gu 16cb13a318e577e14461eb008071dddf762847de42Dake Guimport android.content.Context; 17b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Guimport android.graphics.Canvas; 18b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Guimport android.graphics.drawable.ColorDrawable; 19b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Guimport android.graphics.drawable.Drawable; 20cb13a318e577e14461eb008071dddf762847de42Dake Guimport android.util.AttributeSet; 213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.view.LayoutInflater; 22cb13a318e577e14461eb008071dddf762847de42Dake Guimport android.view.View; 233c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.view.ViewGroup; 24cb13a318e577e14461eb008071dddf762847de42Dake Guimport android.widget.LinearLayout; 25cb13a318e577e14461eb008071dddf762847de42Dake Gu 268619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport androidx.annotation.ColorInt; 278619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport androidx.leanback.R; 288619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas 29cb13a318e577e14461eb008071dddf762847de42Dake Gu/** 30cb13a318e577e14461eb008071dddf762847de42Dake Gu * RowContainerView wraps header and user defined row view 31cb13a318e577e14461eb008071dddf762847de42Dake Gu */ 32cb13a318e577e14461eb008071dddf762847de42Dake Gufinal class RowContainerView extends LinearLayout { 33cb13a318e577e14461eb008071dddf762847de42Dake Gu 343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu private ViewGroup mHeaderDock; 35b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu private Drawable mForeground; 36b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu private boolean mForegroundBoundsChanged = true; 373c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 38cb13a318e577e14461eb008071dddf762847de42Dake Gu public RowContainerView(Context context) { 39cb13a318e577e14461eb008071dddf762847de42Dake Gu this(context, null, 0); 40cb13a318e577e14461eb008071dddf762847de42Dake Gu } 41cb13a318e577e14461eb008071dddf762847de42Dake Gu 42cb13a318e577e14461eb008071dddf762847de42Dake Gu public RowContainerView(Context context, AttributeSet attrs) { 43cb13a318e577e14461eb008071dddf762847de42Dake Gu this(context, attrs, 0); 44cb13a318e577e14461eb008071dddf762847de42Dake Gu } 45cb13a318e577e14461eb008071dddf762847de42Dake Gu 46cb13a318e577e14461eb008071dddf762847de42Dake Gu public RowContainerView(Context context, AttributeSet attrs, int defStyle) { 47cb13a318e577e14461eb008071dddf762847de42Dake Gu super(context, attrs, defStyle); 48cb13a318e577e14461eb008071dddf762847de42Dake Gu setOrientation(VERTICAL); 493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu LayoutInflater inflater = LayoutInflater.from(context); 503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu inflater.inflate(R.layout.lb_row_container, this); 513c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 52fa2e2acf79d791a90410025daad438968550d18cAlan Viverette mHeaderDock = findViewById(R.id.lb_row_container_header_dock); 53cb13a318e577e14461eb008071dddf762847de42Dake Gu setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 54cb13a318e577e14461eb008071dddf762847de42Dake Gu } 55cb13a318e577e14461eb008071dddf762847de42Dake Gu 56cb13a318e577e14461eb008071dddf762847de42Dake Gu public void addHeaderView(View headerView) { 573c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (mHeaderDock.indexOfChild(headerView) < 0) { 583c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mHeaderDock.addView(headerView, 0); 59cb13a318e577e14461eb008071dddf762847de42Dake Gu } 60cb13a318e577e14461eb008071dddf762847de42Dake Gu } 61cb13a318e577e14461eb008071dddf762847de42Dake Gu 62cb13a318e577e14461eb008071dddf762847de42Dake Gu public void removeHeaderView(View headerView) { 633c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (mHeaderDock.indexOfChild(headerView) >= 0) { 643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mHeaderDock.removeView(headerView); 65cb13a318e577e14461eb008071dddf762847de42Dake Gu } 66cb13a318e577e14461eb008071dddf762847de42Dake Gu } 67cb13a318e577e14461eb008071dddf762847de42Dake Gu 68cb13a318e577e14461eb008071dddf762847de42Dake Gu public void addRowView(View view) { 69cb13a318e577e14461eb008071dddf762847de42Dake Gu addView(view); 70cb13a318e577e14461eb008071dddf762847de42Dake Gu } 71cb13a318e577e14461eb008071dddf762847de42Dake Gu 722f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public void showHeader(boolean show) { 732f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu mHeaderDock.setVisibility(show ? View.VISIBLE : View.GONE); 742f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 75b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu 76e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 77b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu public void setForeground(Drawable d) { 78b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu mForeground = d; 79b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu setWillNotDraw(mForeground == null); 80b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu invalidate(); 81b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 82b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu 8370acb0c19be3831a2080e4f902324de16bfbf62eTor Norbye public void setForegroundColor(@ColorInt int color) { 84b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu if (mForeground instanceof ColorDrawable) { 85b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu ((ColorDrawable) mForeground.mutate()).setColor(color); 86b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu invalidate(); 87b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } else { 88b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu setForeground(new ColorDrawable(color)); 89b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 90b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 91b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu 92e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas @Override 93b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu public Drawable getForeground() { 94b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu return mForeground; 95b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 96b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu 97b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu @Override 98b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu protected void onSizeChanged(int w, int h, int oldw, int oldh) { 99b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu super.onSizeChanged(w, h, oldw, oldh); 100b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu mForegroundBoundsChanged = true; 101b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 102b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu 103b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu @Override 104b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu public void draw(Canvas canvas) { 105b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu super.draw(canvas); 106b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu if (mForeground != null) { 107b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu if (mForegroundBoundsChanged) { 108b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu mForegroundBoundsChanged = false; 109b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu mForeground.setBounds(0, 0, getWidth(), getHeight()); 110b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 111b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu mForeground.draw(canvas); 112b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 113b23ee09bf4aee03bc403abf39016c8ca5ecf301cDake Gu } 1143bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 1153bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 1163bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public boolean hasOverlappingRendering() { 1173bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu return false; 1183bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 119cb13a318e577e14461eb008071dddf762847de42Dake Gu} 120