Home | History | Annotate | Download | only in widget
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
      5  * in compliance with the License. You may obtain a copy of the License at
      6  *
      7  * http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the License
     10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
     11  * or implied. See the License for the specific language governing permissions and limitations under
     12  * the License.
     13  */
     14 package androidx.leanback.widget;
     15 
     16 import android.content.Context;
     17 import android.graphics.Canvas;
     18 import android.graphics.drawable.ColorDrawable;
     19 import android.graphics.drawable.Drawable;
     20 import android.util.AttributeSet;
     21 import android.view.LayoutInflater;
     22 import android.view.View;
     23 import android.view.ViewGroup;
     24 import android.widget.LinearLayout;
     25 
     26 import androidx.annotation.ColorInt;
     27 import androidx.leanback.R;
     28 
     29 /**
     30  * RowContainerView wraps header and user defined row view
     31  */
     32 final class RowContainerView extends LinearLayout {
     33 
     34     private ViewGroup mHeaderDock;
     35     private Drawable mForeground;
     36     private boolean mForegroundBoundsChanged = true;
     37 
     38     public RowContainerView(Context context) {
     39         this(context, null, 0);
     40     }
     41 
     42     public RowContainerView(Context context, AttributeSet attrs) {
     43         this(context, attrs, 0);
     44     }
     45 
     46     public RowContainerView(Context context, AttributeSet attrs, int defStyle) {
     47         super(context, attrs, defStyle);
     48         setOrientation(VERTICAL);
     49         LayoutInflater inflater = LayoutInflater.from(context);
     50         inflater.inflate(R.layout.lb_row_container, this);
     51 
     52         mHeaderDock = findViewById(R.id.lb_row_container_header_dock);
     53         setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
     54     }
     55 
     56     public void addHeaderView(View headerView) {
     57         if (mHeaderDock.indexOfChild(headerView) < 0) {
     58             mHeaderDock.addView(headerView, 0);
     59         }
     60     }
     61 
     62     public void removeHeaderView(View headerView) {
     63         if (mHeaderDock.indexOfChild(headerView) >= 0) {
     64             mHeaderDock.removeView(headerView);
     65         }
     66     }
     67 
     68     public void addRowView(View view) {
     69         addView(view);
     70     }
     71 
     72     public void showHeader(boolean show) {
     73         mHeaderDock.setVisibility(show ? View.VISIBLE : View.GONE);
     74     }
     75 
     76     @Override
     77     public void setForeground(Drawable d) {
     78         mForeground = d;
     79         setWillNotDraw(mForeground == null);
     80         invalidate();
     81     }
     82 
     83     public void setForegroundColor(@ColorInt int color) {
     84         if (mForeground instanceof ColorDrawable) {
     85             ((ColorDrawable) mForeground.mutate()).setColor(color);
     86             invalidate();
     87         } else {
     88             setForeground(new ColorDrawable(color));
     89         }
     90     }
     91 
     92     @Override
     93     public Drawable getForeground() {
     94         return mForeground;
     95     }
     96 
     97     @Override
     98     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
     99         super.onSizeChanged(w, h, oldw, oldh);
    100         mForegroundBoundsChanged = true;
    101     }
    102 
    103     @Override
    104     public void draw(Canvas canvas) {
    105         super.draw(canvas);
    106         if (mForeground != null) {
    107             if (mForegroundBoundsChanged) {
    108                 mForegroundBoundsChanged = false;
    109                 mForeground.setBounds(0, 0, getWidth(), getHeight());
    110             }
    111             mForeground.draw(canvas);
    112         }
    113     }
    114 
    115     @Override
    116     public boolean hasOverlappingRendering() {
    117         return false;
    118     }
    119 }
    120