FreeRDP
Loading...
Searching...
No Matches
BookmarkListAdapter.java
1/*
2 RecyclerView adapter for bookmark list items
3
4 Copyright 2026 Ibrahim Sevinc <ibrahim.sevinc.mail@gmail.com>
5
6 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
7 If a copy of the MPL was not distributed with this file, You can obtain one at
8 http://mozilla.org/MPL/2.0/.
9*/
10
11package com.freerdp.freerdpcore.utils;
12
13import android.content.Intent;
14import android.os.Bundle;
15import android.view.LayoutInflater;
16import android.view.View;
17import android.view.ViewGroup;
18
19import androidx.annotation.NonNull;
20import androidx.appcompat.widget.PopupMenu;
21import androidx.recyclerview.widget.RecyclerView;
22
23import com.freerdp.freerdpcore.R;
24import com.freerdp.freerdpcore.databinding.BookmarkListItemBinding;
25import com.freerdp.freerdpcore.domain.BookmarkBase;
26import com.freerdp.freerdpcore.domain.ConnectionReference;
27import com.freerdp.freerdpcore.presentation.BookmarkActivity;
28
29import java.util.ArrayList;
30import java.util.List;
31
32public class BookmarkListAdapter extends RecyclerView.Adapter<BookmarkListAdapter.ViewHolder>
33{
34 public interface Callbacks
35 {
36 void onItemClick(String refStr);
37 void onDelete(long id);
38 void onExport(BookmarkBase bookmark);
39 }
40
41 private List<BookmarkBase> items = new ArrayList<>();
42 private Callbacks callbacks;
43 private boolean actionsEnabled = true;
44
45 public void setCallbacks(Callbacks callbacks)
46 {
47 this.callbacks = callbacks;
48 }
49
50 public void setActionsEnabled(boolean enabled)
51 {
52 actionsEnabled = enabled;
53 }
54
55 public List<BookmarkBase> getItems()
56 {
57 return items;
58 }
59
60 public void setItems(List<BookmarkBase> newItems)
61 {
62 items = newItems != null ? newItems : new ArrayList<>();
63 notifyDataSetChanged();
64 }
65
66 @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
67 {
68 BookmarkListItemBinding binding = BookmarkListItemBinding.inflate(
69 LayoutInflater.from(parent.getContext()), parent, false);
70 return new ViewHolder(binding);
71 }
72
73 @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position)
74 {
75 BookmarkBase bookmark = items.get(position);
76 String refStr;
77
78 holder.binding.bookmarkText1.setText(bookmark.getLabel());
79
80 if (bookmark.getType() == BookmarkBase.TYPE_MANUAL)
81 {
82 holder.binding.bookmarkIcon1.setImageResource(R.drawable.ic_computer);
83 holder.binding.bookmarkIcon1.setVisibility(View.VISIBLE);
84 holder.binding.bookmarkText2.setVisibility(View.VISIBLE);
85 holder.binding.bookmarkText2.setText(bookmark.getHostname());
86 refStr = ConnectionReference.getBookmarkReference(bookmark.getId());
87
88 if (actionsEnabled)
89 {
90 holder.binding.bookmarkIcon2.setVisibility(View.VISIBLE);
91 holder.binding.bookmarkIcon2.setImageResource(R.drawable.ic_more_vert);
92 final String finalRefStr = refStr;
93 final long bookmarkId = bookmark.getId();
94 holder.binding.bookmarkIcon2.setOnClickListener(
95 v -> showBookmarkMenu(v, finalRefStr, bookmarkId, bookmark));
96 holder.itemView.setOnLongClickListener(v -> {
97 showBookmarkMenu(holder.binding.bookmarkIcon2, finalRefStr, bookmarkId,
98 bookmark);
99 return true;
100 });
101 }
102 else
103 {
104 holder.binding.bookmarkIcon2.setVisibility(View.GONE);
105 holder.binding.bookmarkIcon2.setOnClickListener(null);
106 holder.itemView.setOnLongClickListener(null);
107 }
108 }
109 else if (bookmark.getType() == BookmarkBase.TYPE_QUICKCONNECT)
110 {
111 holder.binding.bookmarkText2.setVisibility(View.GONE);
112 refStr = ConnectionReference.getHostnameReference(bookmark.getHostname());
113 holder.itemView.setOnLongClickListener(null);
114
115 if (bookmark.isDirectConnect())
116 {
117 holder.binding.bookmarkText1.setText(holder.itemView.getContext().getString(
118 R.string.quick_connect_to, bookmark.getHostname()));
119 holder.binding.bookmarkIcon1.setImageResource(R.drawable.ic_login);
120 holder.binding.bookmarkIcon1.setVisibility(View.VISIBLE);
121 holder.binding.bookmarkIcon2.setVisibility(View.GONE);
122 holder.binding.bookmarkIcon2.setOnClickListener(null);
123 }
124 else
125 {
126 holder.binding.bookmarkText1.setText(bookmark.getLabel());
127 holder.binding.bookmarkIcon1.setImageResource(R.drawable.ic_history);
128 holder.binding.bookmarkIcon1.setVisibility(View.VISIBLE);
129 holder.binding.bookmarkIcon2.setVisibility(View.VISIBLE);
130 holder.binding.bookmarkIcon2.setImageResource(R.drawable.ic_bookmark_add);
131 final String hostname = bookmark.getHostname();
132 holder.binding.bookmarkIcon2.setOnClickListener(v -> {
133 Bundle bundle = new Bundle();
134 bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE,
135 ConnectionReference.getHostnameReference(hostname));
136 Intent intent = new Intent(v.getContext(), BookmarkActivity.class);
137 intent.putExtras(bundle);
138 v.getContext().startActivity(intent);
139 });
140 }
141 }
142 else
143 {
144 holder.binding.bookmarkIcon1.setVisibility(View.GONE);
145 holder.binding.bookmarkText2.setVisibility(View.GONE);
146 refStr = "";
147 holder.binding.bookmarkIcon2.setVisibility(View.GONE);
148 holder.binding.bookmarkIcon2.setOnClickListener(null);
149 }
150
151 holder.itemView.setTag(refStr);
152
153 holder.itemView.setOnClickListener(v -> {
154 if (callbacks != null)
155 callbacks.onItemClick(v.getTag().toString());
156 });
157 }
158
159 @Override public int getItemCount()
160 {
161 return items.size();
162 }
163
164 private void showBookmarkMenu(View anchor, String refStr, long bookmarkId,
165 BookmarkBase bookmark)
166 {
167 PopupMenu popup = new PopupMenu(anchor.getContext(), anchor);
168 popup.inflate(R.menu.bookmark_context_menu);
169 popup.setOnMenuItemClickListener(item -> {
170 int itemId = item.getItemId();
171 if (itemId == R.id.bookmark_connect)
172 {
173 if (callbacks != null)
174 callbacks.onItemClick(refStr);
175 return true;
176 }
177 else if (itemId == R.id.bookmark_edit)
178 {
179 Bundle bundle = new Bundle();
180 bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE, refStr);
181 Intent intent = new Intent(anchor.getContext(), BookmarkActivity.class);
182 intent.putExtras(bundle);
183 anchor.getContext().startActivity(intent);
184 return true;
185 }
186 else if (itemId == R.id.bookmark_delete)
187 {
188 if (callbacks != null)
189 callbacks.onDelete(bookmarkId);
190 return true;
191 }
192 else if (itemId == R.id.bookmark_export)
193 {
194 if (callbacks != null)
195 callbacks.onExport(bookmark);
196 return true;
197 }
198 return false;
199 });
200 popup.show();
201 }
202
203 static class ViewHolder extends RecyclerView.ViewHolder
204 {
205 final BookmarkListItemBinding binding;
206
207 ViewHolder(BookmarkListItemBinding binding)
208 {
209 super(binding.getRoot());
210 this.binding = binding;
211 }
212 }
213}