mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-31 14:53:59 +01:00 
			
		
		
		
	Issue #5811: "Delete folder" menu in custom image selector
This commit is contained in:
		
							parent
							
								
									d0e64d7886
								
							
						
					
					
						commit
						1725304cce
					
				
					 8 changed files with 147 additions and 26 deletions
				
			
		
							
								
								
									
										7
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
										
									
										generated
									
									
									
								
							|  | @ -1,16 +1,12 @@ | |||
| <component name="InspectionProjectProfileManager"> | ||||
|   <profile version="1.0"> | ||||
|     <option name="myName" value="Project Default" /> | ||||
|     <inspection_tool class="AndroidLintNewerVersionAvailable" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="ClassWithOnlyPrivateConstructors" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="ConfusingElse" enabled="true" level="WARNING" enabled_by_default="true"> | ||||
|       <option name="reportWhenNoStatementFollow" value="true" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="ControlFlowStatementWithoutBraces" enabled="true" level="ERROR" enabled_by_default="true" /> | ||||
|     <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="ExplicitThis" enabled="true" level="WEAK WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="FieldMayBeFinal" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="LocalCanBeFinal" enabled="true" level="WARNING" enabled_by_default="true"> | ||||
|       <option name="REPORT_VARIABLES" value="true" /> | ||||
|       <option name="REPORT_PARAMETERS" value="true" /> | ||||
|  | @ -25,13 +21,11 @@ | |||
|       <option name="ignoreInMatchingInstanceof" value="false" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="ProblematicWhitespace" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="ProtectedMemberInFinalClass" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="RedundantFieldInitialization" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="RedundantImplements" enabled="true" level="WARNING" enabled_by_default="true"> | ||||
|       <option name="ignoreSerializable" value="false" /> | ||||
|       <option name="ignoreCloneable" value="false" /> | ||||
|     </inspection_tool> | ||||
|     <inspection_tool class="RedundantMethodOverride" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="SimplifiableEqualsExpression" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="TypeParameterExtendsFinalClass" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="UnnecessarilyQualifiedStaticUsage" enabled="true" level="WARNING" enabled_by_default="true"> | ||||
|  | @ -47,6 +41,5 @@ | |||
|     <inspection_tool class="UnnecessaryQualifierForThis" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="UnnecessarySuperConstructor" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="UnnecessaryThis" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="UnnecessaryToStringCall" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|   </profile> | ||||
| </component> | ||||
|  | @ -366,11 +366,11 @@ android { | |||
| 
 | ||||
| 
 | ||||
|     compileOptions { | ||||
|         sourceCompatibility JavaVersion.VERSION_11 | ||||
|         targetCompatibility JavaVersion.VERSION_11 | ||||
|         sourceCompatibility JavaVersion.VERSION_17 | ||||
|         targetCompatibility JavaVersion.VERSION_17 | ||||
|     } | ||||
|     kotlinOptions { | ||||
|         jvmTarget = "11" | ||||
|         jvmTarget = "17" | ||||
|     } | ||||
| 
 | ||||
|     buildToolsVersion buildToolsVersion | ||||
|  |  | |||
|  | @ -13,6 +13,11 @@ import android.view.Window | |||
| import android.widget.Button | ||||
| import android.widget.ImageButton | ||||
| import android.widget.TextView | ||||
| import android.view.Menu | ||||
| import android.view.MenuItem | ||||
| import android.widget.PopupMenu | ||||
| import androidx.appcompat.app.AlertDialog | ||||
| 
 | ||||
| import androidx.compose.foundation.BorderStroke | ||||
| import androidx.compose.foundation.layout.Row | ||||
| import androidx.compose.foundation.layout.fillMaxWidth | ||||
|  | @ -59,6 +64,7 @@ import kotlinx.coroutines.Dispatchers | |||
| import kotlinx.coroutines.MainScope | ||||
| import kotlinx.coroutines.launch | ||||
| import kotlinx.coroutines.withContext | ||||
| import timber.log.Timber | ||||
| import java.io.File | ||||
| import java.lang.Integer.max | ||||
| import javax.inject.Inject | ||||
|  | @ -147,6 +153,13 @@ class CustomSelectorActivity : | |||
| 
 | ||||
|     private var showPartialAccessIndicator by mutableStateOf(false) | ||||
| 
 | ||||
|     /** | ||||
|      * Show delete button on folder | ||||
|      */ | ||||
|     private var showOverflowMenu = false | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * onCreate Activity, sets theme, initialises the view model, setup view. | ||||
|      */ | ||||
|  | @ -204,6 +217,7 @@ class CustomSelectorActivity : | |||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     override fun onRequestPermissionsResult( | ||||
|         requestCode: Int, | ||||
|         permissions: Array<out String>, | ||||
|  | @ -414,7 +428,7 @@ class CustomSelectorActivity : | |||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Set up the toolbar, back listener, done listener. | ||||
|      * Set up the toolbar, back listener, done listener, overflow menu listener. | ||||
|      */ | ||||
|     private fun setUpToolbar() { | ||||
|         val back: ImageButton = findViewById(R.id.back) | ||||
|  | @ -423,16 +437,72 @@ class CustomSelectorActivity : | |||
|         val limitError: ImageButton = findViewById(R.id.image_limit_error) | ||||
|         limitError.visibility = View.INVISIBLE | ||||
|         limitError.setOnClickListener { displayUploadLimitWarning() } | ||||
| 
 | ||||
|         val overflowMenu: ImageButton = findViewById(R.id.menu_overflow) | ||||
|         overflowMenu.visibility = if (showOverflowMenu) View.VISIBLE else View.INVISIBLE | ||||
| 
 | ||||
|         // Set up popup menu when overflow menu is clicked | ||||
|         overflowMenu.setOnClickListener { showPopupMenu(overflowMenu) } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private fun showPopupMenu(anchorView: View) { | ||||
|         val popupMenu = PopupMenu(this, anchorView) | ||||
|         popupMenu.menuInflater.inflate(R.menu.menu_custom_selector, popupMenu.menu) | ||||
| 
 | ||||
|         // Handle menu item clicks | ||||
|         popupMenu.setOnMenuItemClickListener { item -> | ||||
|             when (item.itemId) { | ||||
|                 R.id.action_delete_folder -> { | ||||
|                     deleteFolder()  // Call the delete folder logic here | ||||
|                     true | ||||
|                 } | ||||
|                 else -> false | ||||
|             } | ||||
|         } | ||||
|         popupMenu.show() | ||||
|     } | ||||
| 
 | ||||
|     private fun deleteFolder() { | ||||
|         Timber.tag("FolderAction").d("Delete folder action triggered") | ||||
| 
 | ||||
| 
 | ||||
|         // Run on UI thread to ensure dialog shows correctly | ||||
|         runOnUiThread { | ||||
|             val builder = AlertDialog.Builder(this) | ||||
|             builder.setTitle("Delete Folder") | ||||
|             builder.setMessage("Are you sure you want to delete this folder?") | ||||
| 
 | ||||
|             // Set the positive button to confirm deletion | ||||
|             builder.setPositiveButton("Delete") { dialog, _ -> | ||||
|                 // Perform folder deletion here | ||||
|                 Timber.tag("FolderAction").d("Folder deleted") | ||||
|                 dialog.dismiss() | ||||
|             } | ||||
| 
 | ||||
|             // Set the negative button to cancel | ||||
|             builder.setNegativeButton("Cancel") { dialog, _ -> | ||||
|                 Timber.tag("FolderAction").d("Delete action cancelled") | ||||
|                 dialog.dismiss()  // Dismiss the dialog | ||||
|             } | ||||
| 
 | ||||
|             // Show the AlertDialog | ||||
|             builder.create().show() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * override on folder click, change the toolbar title on folder click. | ||||
|      * override on folder click, | ||||
|      * change the toolbar title on folder click, make overflow menu visible | ||||
|      */ | ||||
|     override fun onFolderClick( | ||||
|         folderId: Long, | ||||
|         folderName: String, | ||||
|         lastItemId: Long, | ||||
|         lastItemId: Long | ||||
|     ) { | ||||
| 
 | ||||
|         supportFragmentManager | ||||
|             .beginTransaction() | ||||
|             .add(R.id.fragment_container, ImageFragment.newInstance(folderId, lastItemId)) | ||||
|  | @ -444,8 +514,14 @@ class CustomSelectorActivity : | |||
|         bucketId = folderId | ||||
|         bucketName = folderName | ||||
|         isImageFragmentOpen = true | ||||
| 
 | ||||
|         // Show the overflow menu only when a folder is clicked | ||||
|         showOverflowMenu = true | ||||
|         setUpToolbar() | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * override Selected Images Change, update view model selected images and change UI. | ||||
|      */ | ||||
|  | @ -559,6 +635,10 @@ class CustomSelectorActivity : | |||
|             isImageFragmentOpen = false | ||||
|             changeTitle(getString(R.string.custom_selector_title), 0) | ||||
|         } | ||||
| 
 | ||||
|         //hide overflow menu when not in folder | ||||
|         showOverflowMenu = false | ||||
|         setUpToolbar() | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ import android.net.Uri; | |||
| import android.os.Bundle; | ||||
| import android.text.Editable; | ||||
| import android.text.TextWatcher; | ||||
| import android.util.Log; | ||||
| import android.view.View; | ||||
| import android.widget.AdapterView; | ||||
| import android.widget.AdapterView.OnItemClickListener; | ||||
|  | @ -58,6 +59,7 @@ import java.util.Locale; | |||
| import java.util.Map; | ||||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
| import timber.log.Timber; | ||||
| 
 | ||||
| public class SettingsFragment extends PreferenceFragmentCompat { | ||||
| 
 | ||||
|  | @ -80,6 +82,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { | |||
|     private ListPreference themeListPreference; | ||||
|     private Preference descriptionLanguageListPreference; | ||||
|     private Preference appUiLanguageListPreference; | ||||
|     private Preference showDeletionButtonPreference; | ||||
|     private String keyLanguageListPreference; | ||||
|     private TextView recentLanguagesTextView; | ||||
|     private View separator; | ||||
|  | @ -178,6 +181,18 @@ public class SettingsFragment extends PreferenceFragmentCompat { | |||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         // | ||||
|         showDeletionButtonPreference = findPreference("displayDeletionButton"); | ||||
|         if (showDeletionButtonPreference != null) { | ||||
|             showDeletionButtonPreference.setOnPreferenceChangeListener((preference, newValue) -> { | ||||
|                 boolean isEnabled = (boolean) newValue; | ||||
|                 // Save preference when user toggles the button | ||||
|                 defaultKvStore.putBoolean("displayDeletionButton", isEnabled); | ||||
|                 return true; | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         Preference betaTesterPreference = findPreference("becomeBetaTester"); | ||||
|         betaTesterPreference.setOnPreferenceClickListener(preference -> { | ||||
|             Utils.handleWebUrl(getActivity(), Uri.parse(getResources().getString(R.string.beta_opt_in_link))); | ||||
|  |  | |||
|  | @ -52,5 +52,20 @@ | |||
|       app:layout_constraintVertical_bias="1.0" | ||||
|       app:srcCompat="@drawable/ic_error_red_24dp" /> | ||||
| 
 | ||||
|     <ImageButton | ||||
|       android:id="@+id/menu_overflow" | ||||
|       android:layout_width="48dp" | ||||
|       android:layout_height="0dp" | ||||
|       android:background="#00FFFFFF" | ||||
|       android:contentDescription="@string/menu_overflow_desc" | ||||
|       app:layout_constraintBottom_toBottomOf="parent" | ||||
|       app:layout_constraintEnd_toEndOf="parent" | ||||
|       app:layout_constraintHorizontal_bias="0.0" | ||||
|       app:layout_constraintStart_toEndOf="@id/title" | ||||
|       app:layout_constraintTop_toTopOf="parent" | ||||
|       app:layout_constraintVertical_bias="1.0" | ||||
|       app:srcCompat="@drawable/ic_overflow" /> | ||||
| 
 | ||||
| 
 | ||||
|   </androidx.constraintlayout.widget.ConstraintLayout> | ||||
| </merge> | ||||
							
								
								
									
										9
									
								
								app/src/main/res/menu/menu_custom_selector.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/res/menu/menu_custom_selector.xml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|       xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|   <item | ||||
|     android:id="@+id/action_delete_folder" | ||||
|     android:title="@string/delete_folder" | ||||
|     android:icon="@drawable/ic_delete_grey_700_24dp" | ||||
|     app:showAsAction="never" /> | ||||
| </menu> | ||||
|  | @ -117,6 +117,7 @@ | |||
|   <string name="categories_search_text_hint">Search categories</string> | ||||
|   <string name="depicts_search_text_hint">Search for items that your media depicts (mountain, Taj Mahal, etc.)</string> | ||||
|   <string name="menu_save_categories">Save</string> | ||||
|   <string name="menu_overflow_desc">Overflow menu</string> | ||||
|   <string name="refresh_button">Refresh</string> | ||||
|   <string name="display_list_button">List</string> | ||||
|   <string name="contributions_subtitle_zero">(No uploads yet)</string> | ||||
|  | @ -831,4 +832,5 @@ Upload your first media by tapping on the add button.</string> | |||
|   <string name="pending">Pending</string> | ||||
|   <string name="failed">Failed</string> | ||||
|   <string name="could_not_load_place_data">Could not load place data</string> | ||||
|   <string name="delete_folder">Delete Folder</string> | ||||
| </resources> | ||||
|  |  | |||
|  | @ -51,6 +51,13 @@ | |||
|           android:summary="@string/display_campaigns_explanation" | ||||
|           android:title="@string/display_campaigns" /> | ||||
| 
 | ||||
|         <SwitchPreference | ||||
|           android:defaultValue="false" | ||||
|           android:key="displayDeletionButton" | ||||
|           app:singleLineTitle="false" | ||||
|           android:summary="Enable the "Delete folder" button in the custom picker" | ||||
|           android:title="Show Deletion Button" /> | ||||
| 
 | ||||
|     </PreferenceCategory> | ||||
| 
 | ||||
|     <PreferenceCategory | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 why-lab
						why-lab