1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.providers.media.photopicker.ui;
18 
19 import android.content.Context;
20 import android.util.AttributeSet;
21 
22 import androidx.annotation.Nullable;
23 import androidx.recyclerview.widget.GridLayoutManager;
24 import androidx.recyclerview.widget.RecyclerView;
25 
26 /**
27  * The AutoFitRecyclerView auto fits the column width to decide the span count
28  */
29 public class AutoFitRecyclerView extends RecyclerView {
30 
31     private int mColumnWidth = -1;
32     private int mMinimumSpanCount = 2;
33     private boolean mIsGridLayout;
34 
AutoFitRecyclerView(Context context)35     public AutoFitRecyclerView(Context context) {
36         super(context);
37     }
38 
AutoFitRecyclerView(Context context, AttributeSet attrs)39     public AutoFitRecyclerView(Context context, AttributeSet attrs) {
40         super(context, attrs);
41     }
42 
AutoFitRecyclerView(Context context, AttributeSet attrs, int defStyle)43     public AutoFitRecyclerView(Context context, AttributeSet attrs, int defStyle) {
44         super(context, attrs, defStyle);
45     }
46 
47     @Override
onMeasure(int widthMeasureSpec, int heightMeasureSpec)48     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
49         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
50 
51         if (mIsGridLayout && mColumnWidth > 0) {
52             final int spanCount = Math.max(mMinimumSpanCount,
53                     Math.round((float) getMeasuredWidth() / mColumnWidth));
54             ((GridLayoutManager) getLayoutManager()).setSpanCount(spanCount);
55         }
56     }
57 
58     @Override
setLayoutManager(@ullable RecyclerView.LayoutManager layoutManager)59     public void setLayoutManager(@Nullable RecyclerView.LayoutManager layoutManager) {
60         super.setLayoutManager(layoutManager);
61         mIsGridLayout = (layoutManager instanceof GridLayoutManager);
62     }
63 
setColumnWidth(int columnWidth)64     public void setColumnWidth(int columnWidth) {
65         mColumnWidth = columnWidth;
66     }
67 
68     /**
69      * Set the minimum span count for the recyclerView.
70      * @param minimumSpanCount The default value is 2.
71      */
setMinimumSpanCount(int minimumSpanCount)72     public void setMinimumSpanCount(int minimumSpanCount) {
73         mMinimumSpanCount = minimumSpanCount;
74     }
75 }
76