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