1d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing/* 2d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * Copyright 2017 The Android Open Source Project 3d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * 4d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * Licensed under the Apache License, Version 2.0 (the "License"); 5d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * you may not use this file except in compliance with the License. 6d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * You may obtain a copy of the License at 7d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * 8d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * http://www.apache.org/licenses/LICENSE-2.0 9d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * 10d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * Unless required by applicable law or agreed to in writing, software 11d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * distributed under the License is distributed on an "AS IS" BASIS, 12d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * See the License for the specific language governing permissions and 14d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * limitations under the License. 15d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing */ 16d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 17d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxingpackage androidx.car.utils; 18d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 19d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxingimport android.view.View; 20d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 21d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxingimport androidx.car.R; 22d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 23d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing/** 24d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * A utility class that will set the current background for a View that represents an card entry 25d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * in a list. The class will set the background depending on the position of the card within the 26d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * list. 27d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing */ 28d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxingpublic class ListItemBackgroundResolver { 29d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing private ListItemBackgroundResolver() {} 30d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 31d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing /** 32d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * Sets the background on the given view so that the combination of all items looks like a 33d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * rectangle with rounded corner. The view is assumed to have a non-rounded corner outline. 34d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * 35d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * <p>The view will be set with rounded backgrounds if it is the only card within the list. 36d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * Or if it is the first or last view, it will have the top or bottom corners rounded 37d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * respectively. 38d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * 39d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * @param view The view whose background to set. 40d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * @param currentPosition The current position of the View within the list. This value should 41d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * be 0-based. 42d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing * @param totalItems The total items within the list. 43d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing */ 44d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing public static void setBackground(View view, int currentPosition, int totalItems) { 45d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing if (currentPosition < 0) { 46d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing throw new IllegalArgumentException("currentPosition cannot be less than zero."); 47d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } 48d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 49d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing if (currentPosition >= totalItems) { 50d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing throw new IndexOutOfBoundsException("currentPosition: " + currentPosition + "; " 51d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing + "totalItems: " + totalItems); 52d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } 53d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 54d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing // Set the background for each card. Only the top and last card should have rounded corners. 55d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing if (totalItems == 1) { 56d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing // One card - all corners are rounded. 57d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing view.setBackgroundResource(R.drawable.car_card_rounded_background); 58d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } else if (currentPosition == 0) { 59d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing // First card gets rounded top. 60d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing view.setBackgroundResource(R.drawable.car_card_rounded_top_background); 61d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } else if (currentPosition == totalItems - 1) { 62d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing // Last one has a rounded bottom. 63d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing view.setBackgroundResource(R.drawable.car_card_rounded_bottom_background); 64d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } else { 65d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing // Middle has no rounded corners. 66d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing view.setBackgroundResource(R.drawable.car_card_background); 67d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } 68d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing } 69d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing} 70d0e9e80e8d49a82d43cda017f10df9a609cd6102Yao, Yuxing 71