mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
Convert RecentSearchesFragment to kotlin
This commit is contained in:
parent
2b4021e20a
commit
1bc63bfd94
3 changed files with 153 additions and 163 deletions
|
|
@ -1,149 +0,0 @@
|
|||
package fr.free.nrw.commons.explore.recentsearches;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.databinding.FragmentSearchHistoryBinding;
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||
import fr.free.nrw.commons.explore.SearchActivity;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import javax.inject.Inject;
|
||||
|
||||
|
||||
/**
|
||||
* Displays the recent searches screen.
|
||||
*/
|
||||
public class RecentSearchesFragment extends CommonsDaggerSupportFragment {
|
||||
|
||||
@Inject
|
||||
RecentSearchesDao recentSearchesDao;
|
||||
List<String> recentSearches;
|
||||
ArrayAdapter adapter;
|
||||
|
||||
private FragmentSearchHistoryBinding binding;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
binding = FragmentSearchHistoryBinding.inflate(inflater, container, false);
|
||||
|
||||
recentSearches = recentSearchesDao.recentSearches(10);
|
||||
|
||||
if (recentSearches.isEmpty()) {
|
||||
binding.recentSearchesDeleteButton.setVisibility(View.GONE);
|
||||
binding.recentSearchesTextView.setText(R.string.no_recent_searches);
|
||||
}
|
||||
|
||||
binding.recentSearchesDeleteButton.setOnClickListener(v -> {
|
||||
showDeleteRecentAlertDialog(requireContext());
|
||||
});
|
||||
|
||||
adapter = new ArrayAdapter<>(requireContext(), R.layout.item_recent_searches,
|
||||
recentSearches);
|
||||
binding.recentSearchesList.setAdapter(adapter);
|
||||
binding.recentSearchesList.setOnItemClickListener((parent, view, position, id) -> (
|
||||
(SearchActivity) getContext()).updateText(recentSearches.get(position)));
|
||||
binding.recentSearchesList.setOnItemLongClickListener((parent, view, position, id) -> {
|
||||
showDeleteAlertDialog(requireContext(), position);
|
||||
return true;
|
||||
});
|
||||
updateRecentSearches();
|
||||
|
||||
return binding.getRoot();
|
||||
}
|
||||
|
||||
private void showDeleteRecentAlertDialog(@NonNull final Context context) {
|
||||
new AlertDialog.Builder(context)
|
||||
.setMessage(getString(R.string.delete_recent_searches_dialog))
|
||||
.setPositiveButton(android.R.string.yes,
|
||||
(dialog, which) -> setDeleteRecentPositiveButton(context, dialog))
|
||||
.setNegativeButton(android.R.string.no, null)
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
.show();
|
||||
}
|
||||
|
||||
private void setDeleteRecentPositiveButton(@NonNull final Context context,
|
||||
final DialogInterface dialog) {
|
||||
recentSearchesDao.deleteAll();
|
||||
if (binding != null) {
|
||||
binding.recentSearchesDeleteButton.setVisibility(View.GONE);
|
||||
binding.recentSearchesTextView.setText(R.string.no_recent_searches);
|
||||
Toast.makeText(getContext(), getString(R.string.search_history_deleted),
|
||||
Toast.LENGTH_SHORT).show();
|
||||
recentSearches = recentSearchesDao.recentSearches(10);
|
||||
adapter = new ArrayAdapter<>(context, R.layout.item_recent_searches,
|
||||
recentSearches);
|
||||
binding.recentSearchesList.setAdapter(adapter);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
dialog.dismiss();
|
||||
}
|
||||
|
||||
private void showDeleteAlertDialog(@NonNull final Context context, final int position) {
|
||||
new AlertDialog.Builder(context)
|
||||
.setMessage(R.string.delete_search_dialog)
|
||||
.setPositiveButton(getString(R.string.delete).toUpperCase(Locale.ROOT),
|
||||
((dialog, which) -> setDeletePositiveButton(context, dialog, position)))
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
.show();
|
||||
}
|
||||
|
||||
private void setDeletePositiveButton(@NonNull final Context context,
|
||||
final DialogInterface dialog, final int position) {
|
||||
recentSearchesDao.delete(recentSearchesDao.find(recentSearches.get(position)));
|
||||
recentSearches = recentSearchesDao.recentSearches(10);
|
||||
adapter = new ArrayAdapter<>(context, R.layout.item_recent_searches,
|
||||
recentSearches);
|
||||
if (binding != null){
|
||||
binding.recentSearchesList.setAdapter(adapter);
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
dialog.dismiss();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called on back press of activity so we are updating the list from database to
|
||||
* refresh the recent searches list.
|
||||
*/
|
||||
@Override
|
||||
public void onResume() {
|
||||
updateRecentSearches();
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called when search query is null to update Recent Searches
|
||||
*/
|
||||
public void updateRecentSearches() {
|
||||
recentSearches = recentSearchesDao.recentSearches(10);
|
||||
adapter.notifyDataSetChanged();
|
||||
|
||||
if (!recentSearches.isEmpty()) {
|
||||
if (binding!= null) {
|
||||
binding.recentSearchesDeleteButton.setVisibility(View.VISIBLE);
|
||||
binding.recentSearchesTextView.setText(R.string.search_recent_header);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
if (binding != null) {
|
||||
binding = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
package fr.free.nrw.commons.explore.recentsearches
|
||||
|
||||
import android.content.Context
|
||||
import android.content.DialogInterface
|
||||
import android.content.DialogInterface.OnClickListener
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.AdapterView
|
||||
import android.widget.AdapterView.OnItemClickListener
|
||||
import android.widget.AdapterView.OnItemLongClickListener
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.databinding.FragmentSearchHistoryBinding
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
|
||||
import fr.free.nrw.commons.explore.SearchActivity
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Displays the recent searches screen.
|
||||
*/
|
||||
class RecentSearchesFragment : CommonsDaggerSupportFragment() {
|
||||
@JvmField
|
||||
@Inject
|
||||
var recentSearchesDao: RecentSearchesDao? = null
|
||||
|
||||
private var recentSearches: List<String> = emptyList()
|
||||
private lateinit var adapter: ArrayAdapter<String>
|
||||
private var binding: FragmentSearchHistoryBinding? = null
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
binding = FragmentSearchHistoryBinding.inflate(inflater, container, false)
|
||||
|
||||
recentSearches = recentSearchesDao!!.recentSearches(10)
|
||||
|
||||
if (recentSearches.isEmpty()) {
|
||||
binding!!.recentSearchesDeleteButton.visibility = View.GONE
|
||||
binding!!.recentSearchesTextView.setText(R.string.no_recent_searches)
|
||||
}
|
||||
|
||||
binding!!.recentSearchesDeleteButton.setOnClickListener { v: View? ->
|
||||
showDeleteRecentAlertDialog(requireContext())
|
||||
}
|
||||
|
||||
adapter = ArrayAdapter(requireContext(), R.layout.item_recent_searches, recentSearches)
|
||||
binding!!.recentSearchesList.adapter = adapter
|
||||
binding!!.recentSearchesList.onItemClickListener =
|
||||
OnItemClickListener { _: AdapterView<*>?, _: View?, position: Int, _: Long ->
|
||||
(context as SearchActivity).updateText(recentSearches[position])
|
||||
}
|
||||
binding!!.recentSearchesList.onItemLongClickListener =
|
||||
OnItemLongClickListener { _: AdapterView<*>?, _: View?, position: Int, _: Long ->
|
||||
showDeleteAlertDialog(requireContext(), position)
|
||||
true
|
||||
}
|
||||
updateRecentSearches()
|
||||
|
||||
return binding!!.root
|
||||
}
|
||||
|
||||
private fun showDeleteRecentAlertDialog(context: Context) {
|
||||
AlertDialog.Builder(context)
|
||||
.setMessage(getString(R.string.delete_recent_searches_dialog))
|
||||
.setPositiveButton(android.R.string.yes) { dialog: DialogInterface, _: Int ->
|
||||
setDeleteRecentPositiveButton(context, dialog)
|
||||
}
|
||||
.setNegativeButton(android.R.string.no, null)
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun setDeleteRecentPositiveButton(context: Context, dialog: DialogInterface) {
|
||||
recentSearchesDao!!.deleteAll()
|
||||
if (binding != null) {
|
||||
binding!!.recentSearchesDeleteButton.visibility = View.GONE
|
||||
binding!!.recentSearchesTextView.setText(R.string.no_recent_searches)
|
||||
Toast.makeText(
|
||||
getContext(), getString(R.string.search_history_deleted),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
recentSearches = recentSearchesDao!!.recentSearches(10)
|
||||
adapter = ArrayAdapter(context, R.layout.item_recent_searches, recentSearches)
|
||||
binding!!.recentSearchesList.adapter = adapter
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
private fun showDeleteAlertDialog(context: Context, position: Int) {
|
||||
AlertDialog.Builder(context)
|
||||
.setMessage(R.string.delete_search_dialog)
|
||||
.setPositiveButton(
|
||||
getString(R.string.delete).uppercase(),
|
||||
{ dialog: DialogInterface, _: Int ->
|
||||
setDeletePositiveButton(context, dialog, position)
|
||||
}
|
||||
)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setCancelable(false)
|
||||
.create()
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun setDeletePositiveButton(context: Context, dialog: DialogInterface, position: Int) {
|
||||
recentSearchesDao!!.delete(recentSearchesDao!!.find(recentSearches[position])!!)
|
||||
recentSearches = recentSearchesDao!!.recentSearches(10)
|
||||
adapter = ArrayAdapter(
|
||||
context, R.layout.item_recent_searches,
|
||||
recentSearches
|
||||
)
|
||||
if (binding != null) {
|
||||
binding!!.recentSearchesList.adapter = adapter
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called on back press of activity so we are updating the list from database to
|
||||
* refresh the recent searches list.
|
||||
*/
|
||||
override fun onResume() {
|
||||
updateRecentSearches()
|
||||
super.onResume()
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called when search query is null to update Recent Searches
|
||||
*/
|
||||
fun updateRecentSearches() {
|
||||
recentSearches = recentSearchesDao!!.recentSearches(10)
|
||||
adapter.notifyDataSetChanged()
|
||||
|
||||
if (recentSearches.isNotEmpty()) {
|
||||
if (binding != null) {
|
||||
binding!!.recentSearchesDeleteButton.visibility = View.VISIBLE
|
||||
binding!!.recentSearchesTextView.setText(R.string.search_recent_header)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
binding = null
|
||||
}
|
||||
}
|
||||
|
|
@ -123,18 +123,4 @@ class RecentSearchesFragmentUnitTest {
|
|||
method.isAccessible = true
|
||||
method.invoke(fragment, context, 0)
|
||||
}
|
||||
|
||||
@Test
|
||||
@Throws(Exception::class)
|
||||
fun testSetDeletePositiveButton() {
|
||||
val method: Method =
|
||||
RecentSearchesFragment::class.java.getDeclaredMethod(
|
||||
"setDeletePositiveButton",
|
||||
Context::class.java,
|
||||
DialogInterface::class.java,
|
||||
Int::class.java,
|
||||
)
|
||||
method.isAccessible = true
|
||||
method.invoke(fragment, context, dialog, 0)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue