@@ -233,7 +233,7 @@ class AppDrawerAdapter(
233233                    filtered.toMutableList()
234234                }
235235
236-                 AppLogger .d(" searchQuery" 
236+                 if  (query.isNotEmpty())  AppLogger .d(" searchQuery" 
237237
238238                val  filterResults =  FilterResults ()
239239                filterResults.values =  filteredApps
@@ -333,258 +333,186 @@ class AppDrawerAdapter(
333333            iconLoadingScope :  CoroutineScope ,
334334            prefs :  Prefs 
335335        ) =  with (itemView) {
336+ 
336337            val  contextMenuFlags =  prefs.getMenuFlags(" CONTEXT_MENU_FLAGS" " 0011111" 
338+ 
339+             //  ----------------------------
340+             //  1️⃣ Hide optional layouts
337341            appHideLayout.isVisible =  false 
338342            appRenameLayout.isVisible =  false 
339343            appTagLayout.isVisible =  false 
340344
341-             appHide.apply  {
342-                 isVisible =  contextMenuFlags[2 ]
343-                 //  set show/hide icon
344-                 if  (flag ==  AppDrawerFlag .HiddenApps ) {
345-                     setCompoundDrawablesWithIntrinsicBounds(0 , R .drawable.visibility, 0 , 0 )
346-                     text =  getLocalizedString(R .string.show)
347-                 } else  {
348-                     setCompoundDrawablesWithIntrinsicBounds(0 , R .drawable.visibility_off, 0 , 0 )
349-                     text =  getLocalizedString(R .string.hide)
350-                 }
351-             }
345+             val  packageName =  appListItem.activityPackage
352346
353-             val  appName =  appListItem.activityPackage
354-             //  Access the current locked apps set
355-             val  currentLockedApps =  prefs.lockedApps
347+             //  ----------------------------
348+             //  2️⃣ Precompute lock/pin/hide state
349+             val  isLocked =  prefs.lockedApps.contains(packageName)
350+             val  isPinned =  prefs.pinnedApps.contains(packageName)
351+             val  isHidden =  (flag ==  AppDrawerFlag .HiddenApps )
356352
353+             //  ----------------------------
354+             //  3️⃣ Setup lock/pin/hide buttons
357355            appLock.apply  {
358356                isVisible =  contextMenuFlags[1 ]
359-                 if  (currentLockedApps.contains(appName)) { 
360-                     setCompoundDrawablesWithIntrinsicBounds( 0 ,  R .drawable.padlock,  0 ,  0 ) 
361-                     text  =  getLocalizedString( R .string.unlock) 
362-                 }  else  { 
363-                     setCompoundDrawablesWithIntrinsicBounds( 0 ,  R .drawable.padlock_off,  0 ,  0 ) 
364-                     text  =  getLocalizedString( R .string.lock )
365-                 } 
357+                 setCompoundDrawablesWithIntrinsicBounds( 
358+                     0 , 
359+                     if  (isLocked)  R .drawable.padlock  else   R .drawable.padlock_off, 
360+                      0 , 
361+                     0 
362+                 )
363+                 text  =   if  (isLocked) getLocalizedString( R .string.unlock)  else  getLocalizedString( R .string.lock) 
366364            }
367365
368-             val  currentPinnedApps =  prefs.pinnedApps
369- 
370366            appPin.apply  {
371367                isVisible =  contextMenuFlags[0 ]
372-                 if  (currentPinnedApps.contains(appName)) { 
373-                     setCompoundDrawablesWithIntrinsicBounds( 0 ,  R .drawable.pin,  0 ,  0 ) 
374-                     text  =  getLocalizedString( R .string.unpin) 
375-                 }  else  { 
376-                     setCompoundDrawablesWithIntrinsicBounds( 0 ,  R .drawable.pin_off,  0 ,  0 ) 
377-                     text  =  getLocalizedString( R .string.pin )
378-                 } 
368+                 setCompoundDrawablesWithIntrinsicBounds( 
369+                     0 , 
370+                     if  (isPinned)  R .drawable.pin  else   R .drawable.pin_off, 
371+                      0 , 
372+                     0 
373+                 )
374+                 text  =   if  (isPinned) getLocalizedString( R .string.unpin)  else  getLocalizedString( R .string.pin) 
379375            }
380376
377+             appHide.apply  {
378+                 isVisible =  contextMenuFlags[2 ]
379+                 setCompoundDrawablesWithIntrinsicBounds(
380+                     0 ,
381+                     if  (isHidden) R .drawable.visibility else  R .drawable.visibility_off,
382+                     0 ,
383+                     0 
384+                 )
385+                 text =  if  (isHidden) getLocalizedString(R .string.show) else  getLocalizedString(R .string.hide)
386+             }
387+ 
388+             //  ----------------------------
389+             //  4️⃣ Setup rename/tag layouts
381390            appRename.apply  {
382391                isVisible =  contextMenuFlags[3 ]
383392                setOnClickListener {
384-                     if  (appListItem.activityPackage.isNotEmpty()) {
385-                         appRenameEdit.hint =  appListItem.activityLabel
386-                         appRenameLayout.isVisible =  true 
387-                         appHideLayout.isVisible =  false 
388-                         appRenameEdit.showKeyboard()
389-                         appRenameEdit.imeOptions =  EditorInfo .IME_ACTION_DONE 
390-                     }
393+                     appRenameEdit.hint =  appListItem.activityLabel
394+                     appRenameLayout.isVisible =  true 
395+                     appHideLayout.isVisible =  false 
396+                     appRenameEdit.showKeyboard()
397+                     appRenameEdit.imeOptions =  EditorInfo .IME_ACTION_DONE 
391398                }
392399            }
393400
394401            appTag.apply  {
395402                isVisible =  contextMenuFlags[4 ]
396403                setOnClickListener {
397-                     if  (appListItem.activityPackage.isNotEmpty()) {
398-                         appTagEdit.hint =  appListItem.activityLabel
399-                         appTagLayout.isVisible =  true 
400-                         appHideLayout.isVisible =  false 
401-                         appTagEdit.showKeyboard()
402-                         appTagEdit.imeOptions =  EditorInfo .IME_ACTION_DONE 
403-                     }
404+                     appTagEdit.hint =  appListItem.activityLabel
405+                     appTagLayout.isVisible =  true 
406+                     appHideLayout.isVisible =  false 
407+                     appTagEdit.showKeyboard()
408+                     appTagEdit.imeOptions =  EditorInfo .IME_ACTION_DONE 
404409                }
405410            }
406411
407412            appRenameEdit.apply  {
413+                 text =  Editable .Factory .getInstance().newEditable(appListItem.label)
408414                addTextChangedListener(object  :  TextWatcher  {
409- 
410415                    override  fun  afterTextChanged (s :  Editable ) {}
411- 
412-                     override  fun  beforeTextChanged (
413-                         s :  CharSequence , start :  Int ,
414-                         count :  Int , after :  Int 
415-                     ) {
416-                     }
417- 
418-                     override  fun  onTextChanged (
419-                         s :  CharSequence , start :  Int ,
420-                         before :  Int , count :  Int 
421-                     ) {
422-                         if  (appRenameEdit.text.isEmpty()) {
423-                             appSaveRename.text =  getLocalizedString(R .string.reset)
424-                         } else  if  (appRenameEdit.text.toString() ==  appListItem.customLabel) {
425-                             appSaveRename.text =  getLocalizedString(R .string.cancel)
426-                         } else  {
427-                             appSaveRename.text =  getLocalizedString(R .string.rename)
416+                     override  fun  beforeTextChanged (s :  CharSequence , start :  Int , count :  Int , after :  Int ) {}
417+                     override  fun  onTextChanged (s :  CharSequence , start :  Int , before :  Int , count :  Int ) {
418+                         appSaveRename.text =  when  {
419+                             text.isEmpty() ->  getLocalizedString(R .string.reset)
420+                             text.toString() ==  appListItem.customLabel ->  getLocalizedString(R .string.cancel)
421+                             else  ->  getLocalizedString(R .string.rename)
428422                        }
429423                    }
430424                })
431-                 //  set current name as default text in EditText
432-                 text =  Editable .Factory .getInstance().newEditable(appListItem.label)
433425            }
434426
435427            appTagEdit.apply  {
428+                 text =  Editable .Factory .getInstance().newEditable(appListItem.customTag)
436429                addTextChangedListener(object  :  TextWatcher  {
437- 
438430                    override  fun  afterTextChanged (s :  Editable ) {}
439- 
440-                     override  fun  beforeTextChanged (
441-                         s :  CharSequence , start :  Int ,
442-                         count :  Int , after :  Int 
443-                     ) {
444-                     }
445- 
446-                     override  fun  onTextChanged (
447-                         s :  CharSequence , start :  Int ,
448-                         before :  Int , count :  Int 
449-                     ) {
450-                         if  (appTagEdit.text.toString() ==  appListItem.customTag) {
451-                             appSaveTag.text =  getLocalizedString(R .string.cancel)
452-                         } else  {
453-                             appSaveTag.text =  getLocalizedString(R .string.tag)
454-                         }
431+                     override  fun  beforeTextChanged (s :  CharSequence , start :  Int , count :  Int , after :  Int ) {}
432+                     override  fun  onTextChanged (s :  CharSequence , start :  Int , before :  Int , count :  Int ) {
433+                         appSaveTag.text =  if  (text.toString() ==  appListItem.customTag) getLocalizedString(R .string.cancel)
434+                         else  getLocalizedString(R .string.tag)
455435                    }
456436                })
457-                 //  set current name as default text in EditText
458-                 text =  Editable .Factory .getInstance().newEditable(appListItem.customTag)
459437            }
460438
461-             appTitle.text =  appListItem.label
439+             appClose.setOnClickListener {
440+                 appHideLayout.isVisible =  false 
441+                 visibleHideLayouts.remove(absoluteAdapterPosition)
442+                 val  sidebarContainer =  (context as ?  Activity )?.findViewById<View >(R .id.sidebar_container)
443+                 if  (visibleHideLayouts.isEmpty()) sidebarContainer?.isVisible =  prefs.showAZSidebar
444+             }
462445
463-             //  set text gravity
446+             //  ----------------------------
447+             //  5️⃣ App title
448+             appTitle.text =  appListItem.label
464449            val  params =  appTitle.layoutParams as  FrameLayout .LayoutParams 
465450            params.gravity =  appLabelGravity
466451            appTitle.layoutParams =  params
452+             val  padding =  dp2px(resources, 24 )
453+             appTitle.updatePadding(left =  padding, right =  padding)
467454
468-             //  add icon next to app name to indicate that this app is installed on another profile
469-             val  packageName =  appListItem.activityPackage
470- 
471-             //  Use a placeholder icon
455+             //  ----------------------------
456+             //  6️⃣ Icon loading off main thread
472457            val  placeholderIcon =  AppCompatResources .getDrawable(context, R .drawable.ic_default_app)
473- 
474-             //  Add work profile or private space icon if needed
475-             if  (packageName.isNotBlank() &&  prefs.iconPackAppList !=  Constants .IconPacks .Disabled ) {
476-                 //  Try to get from cache first
477-                 val  cachedIcon =  iconCache[packageName]
478-                 if  (cachedIcon !=  null ) {
479-                     //  Use cached icon
480-                     setAppTitleIcon(appTitle, cachedIcon, prefs)
481-                 } else  {
482-                     //  Set placeholder immediately
483-                     setAppTitleIcon(appTitle, placeholderIcon, prefs)
484-                     //  Load icon asynchronously
485-                     iconLoadingScope.launch {
486-                         val  icon =  withContext(Dispatchers .IO ) {
487-                             //  Get icon as before
488-                             val  iconPackPackage =  prefs.customIconPackAppList
489-                             val  iconPackage =  IconCacheTarget .APP_LIST 
490-                             val  nonNullDrawable:  Drawable  =  getSafeAppIcon(
491-                                 context =  context,
492-                                 packageName =  packageName,
493-                                 useIconPack =  (iconPackPackage.isNotEmpty() &&  prefs.iconPackAppList ==  Constants .IconPacks .Custom ),
494-                                 iconPackTarget =  iconPackage
495-                             )
496-                             getSystemIcons(
497-                                 context,
498-                                 prefs,
499-                                 iconPackage,
500-                                 nonNullDrawable
501-                             ) ? :  nonNullDrawable
502-                         }
503-                         iconCache[packageName] =  icon
504-                         //  Only update if still bound to this app
505-                         if  (appTitle.text ==  appListItem.label) {
506-                             setAppTitleIcon(appTitle, icon, prefs)
507-                         }
458+             val  cachedIcon =  iconCache[packageName]
459+             setAppTitleIcon(appTitle, cachedIcon ? :  placeholderIcon, prefs)
460+ 
461+             if  (cachedIcon ==  null  &&  packageName.isNotBlank() &&  prefs.iconPackAppList !=  Constants .IconPacks .Disabled ) {
462+                 iconLoadingScope.launch {
463+                     val  icon =  withContext(Dispatchers .IO ) {
464+                         val  nonNullDrawable:  Drawable  =  getSafeAppIcon(
465+                             context =  context,
466+                             packageName =  packageName,
467+                             useIconPack =  prefs.customIconPackAppList.isNotEmpty() && 
468+                                     prefs.iconPackAppList ==  Constants .IconPacks .Custom ,
469+                             iconPackTarget =  IconCacheTarget .APP_LIST 
470+                         )
471+                         getSystemIcons(context, prefs, IconCacheTarget .APP_LIST , nonNullDrawable) ? :  nonNullDrawable
508472                    }
473+                     iconCache[packageName] =  icon
474+                     if  (appTitle.text ==  appListItem.label) setAppTitleIcon(appTitle, icon, prefs)
509475                }
510476            }
511477
512- 
513-             val  padding =  dp2px(resources, 24 )
514-             appTitle.updatePadding(left =  padding, right =  padding)
515- 
516-             val  sidebarContainer =  (context as  Activity ).findViewById<View >(R .id.sidebar_container)
517- 
478+             //  ----------------------------
479+             //  7️⃣ Click listeners
480+             val  sidebarContainer =  (context as ?  Activity )?.findViewById<View >(R .id.sidebar_container)
518481            appTitleFrame.apply  {
519-                 setOnClickListener {
520-                     appClickListener(appListItem)
521-                 }
482+                 setOnClickListener { appClickListener(appListItem) }
522483                setOnLongClickListener {
523-                     val  openApp = 
524-                         flag ==  AppDrawerFlag .LaunchApp  ||  flag ==  AppDrawerFlag .HiddenApps 
484+                     val  openApp =  flag ==  AppDrawerFlag .LaunchApp  ||  flag ==  AppDrawerFlag .HiddenApps 
525485                    if  (openApp) {
526486                        try  {
527-                             appDelete.alpha = 
528-                                 if  (context.isSystemApp(appListItem.activityPackage)) 0.3f  else  1.0f 
487+                             appDelete.alpha =  if  (context.isSystemApp(packageName)) 0.3f  else  1f 
529488                            appHideLayout.isVisible =  true 
530-                             sidebarContainer.isVisible =  false 
489+                             sidebarContainer? .isVisible =  false 
531490                            visibleHideLayouts.add(absoluteAdapterPosition)
532-                         } catch  (e:  Exception ) {
533-                             e.printStackTrace()
491+                         } catch  (_:  Exception ) {
534492                        }
535493                    }
536494                    true 
537495                }
538496            }
539497
540-             appInfo.apply  {
541-                 isVisible =  contextMenuFlags[5 ]
542-                 setOnClickListener {
543-                     appInfoListener(appListItem)
544-                 }
545-             }
546- 
547-             appDelete.apply  {
548-                 isVisible =  contextMenuFlags[6 ]
549-                 setOnClickListener {
550-                     appDeleteListener(appListItem)
551-                 }
552-             }
498+             appInfo.setOnClickListener { appInfoListener(appListItem) }
499+             appDelete.setOnClickListener { appDeleteListener(appListItem) }
553500
554-             appClose.apply  {
555-                 setOnClickListener {
556-                     appHideLayout.isVisible =  false 
557-                     visibleHideLayouts.remove(absoluteAdapterPosition)
558-                     if  (visibleHideLayouts.isEmpty()) {
559-                         sidebarContainer.isVisible =  prefs.showAZSidebar
560-                     }
561-                 }
501+             //  ----------------------------
502+             //  8️⃣ Lock/Pin toggle actions
503+             appLock.setOnClickListener {
504+                 val  updated =  prefs.lockedApps.toMutableSet()
505+                 if  (isLocked) updated.remove(packageName) else  updated.add(packageName)
506+                 prefs.lockedApps =  updated
562507            }
563- 
564-             appPin.apply  {
565-                 setOnClickListener {
566-                     val  appName =  appListItem.activityPackage
567-                     val  updatedPinnedApps =  prefs.pinnedApps.toMutableSet()
568- 
569-                     val  isPinned =  updatedPinnedApps.contains(appName)
570-                     AppLogger .d(" AppListDebug" if  (isPinned) " 📌 Unpinning $appName " else  " 📌 Pinning $appName " 
571- 
572-                     if  (isPinned) {
573-                         updatedPinnedApps.remove(appName)
574-                         appPin.setCompoundDrawablesWithIntrinsicBounds(0 , R .drawable.pin_off, 0 , 0 )
575-                         appPin.text =  getLocalizedString(R .string.pin)
576-                     } else  {
577-                         updatedPinnedApps.add(appName)
578-                         appPin.setCompoundDrawablesWithIntrinsicBounds(0 , R .drawable.pin, 0 , 0 )
579-                         appPin.text =  getLocalizedString(R .string.unpin)
580-                     }
581- 
582-                     prefs.pinnedApps =  updatedPinnedApps.toSet()
583-                     AppLogger .d(" AppListDebug" " ✅ Updated pinnedApps: ${prefs.pinnedApps} " 
584-                 }
508+             appPin.setOnClickListener {
509+                 val  updated =  prefs.pinnedApps.toMutableSet()
510+                 if  (isPinned) updated.remove(packageName) else  updated.add(packageName)
511+                 prefs.pinnedApps =  updated
585512            }
586513        }
587514
515+ 
588516        //  Helper to set icon on appTitle with correct size and alignment
589517        private  fun  setAppTitleIcon (appTitle :  TextView , icon :  Drawable ? , prefs :  Prefs ) {
590518            if  (icon ==  null ) {
0 commit comments