1 /* 2 * Copyright 2022 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.example.androidx.mediarouting.ui; 18 19 import android.view.LayoutInflater; 20 import android.view.View; 21 import android.view.ViewGroup; 22 import android.widget.ImageButton; 23 import android.widget.TextView; 24 25 import androidx.recyclerview.widget.RecyclerView; 26 27 import com.example.androidx.mediarouting.R; 28 import com.example.androidx.mediarouting.data.RouteItem; 29 30 import org.jspecify.annotations.NonNull; 31 32 import java.util.List; 33 34 /** {@link RecyclerView.Adapter} for showing routes in the settings screen */ 35 public final class RoutesAdapter extends RecyclerView.Adapter<RoutesAdapter.RouteViewHolder> { 36 37 private List<RouteItem> mRouteItems; 38 private final RouteItemListener mRouteItemListener; 39 RoutesAdapter( @onNull List<RouteItem> routeItems, @NonNull RouteItemListener routeItemListener)40 public RoutesAdapter( 41 @NonNull List<RouteItem> routeItems, @NonNull RouteItemListener routeItemListener) { 42 this.mRouteItems = routeItems; 43 this.mRouteItemListener = routeItemListener; 44 } 45 46 @Override onCreateViewHolder(@onNull ViewGroup parent, int viewType)47 public @NonNull RouteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 48 View view = 49 LayoutInflater.from(parent.getContext()) 50 .inflate(R.layout.route_item, parent, false); 51 return new RouteViewHolder(view); 52 } 53 54 @Override onBindViewHolder(@onNull RouteViewHolder holder, int position)55 public void onBindViewHolder(@NonNull RouteViewHolder holder, int position) { 56 holder.bind(mRouteItems.get(position), mRouteItemListener); 57 } 58 59 @Override getItemCount()60 public int getItemCount() { 61 return mRouteItems.size(); 62 } 63 64 /** 65 * Updates the list of routes with new list. 66 * 67 * @param routeItems to replace the existing list in the adapter. 68 */ updateRoutes(@onNull List<RouteItem> routeItems)69 public void updateRoutes(@NonNull List<RouteItem> routeItems) { 70 this.mRouteItems = routeItems; 71 notifyDataSetChanged(); 72 } 73 74 /** ViewHolder for the route item */ 75 static class RouteViewHolder extends RecyclerView.ViewHolder { 76 77 private final TextView mNameTextView; 78 private final TextView mDescriptionTextView; 79 private final ImageButton mEditButton; 80 private final ImageButton mDeleteButton; 81 RouteViewHolder(@onNull View itemView)82 RouteViewHolder(@NonNull View itemView) { 83 super(itemView); 84 mNameTextView = itemView.findViewById(R.id.name_textview); 85 mDescriptionTextView = itemView.findViewById(R.id.description_textview); 86 mEditButton = itemView.findViewById(R.id.edit_button); 87 mDeleteButton = itemView.findViewById(R.id.delete_button); 88 } 89 bind(RouteItem routeItem, RouteItemListener routeItemListener)90 void bind(RouteItem routeItem, RouteItemListener routeItemListener) { 91 mNameTextView.setText(routeItem.getName()); 92 mDescriptionTextView.setText(routeItem.getDescription()); 93 94 mEditButton.setOnClickListener( 95 view -> { 96 routeItemListener.onRouteEditClick(routeItem.getId()); 97 }); 98 99 mDeleteButton.setOnClickListener( 100 view -> routeItemListener.onRouteDeleteClick(routeItem.getId())); 101 } 102 } 103 104 /** Listener to pass action callbacks to the route item viewholder */ 105 public interface RouteItemListener { 106 /** 107 * Called when route's edit button is clicked 108 * 109 * @param routeId whose edit button is clicked 110 */ onRouteEditClick(@onNull String routeId)111 void onRouteEditClick(@NonNull String routeId); 112 113 /** 114 * Called when route's delete button is clicked 115 * 116 * @param routeId whose delete button is clicked 117 */ onRouteDeleteClick(@onNull String routeId)118 void onRouteDeleteClick(@NonNull String routeId); 119 } 120 } 121