Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ name: CI

on:
push:
branches: [ master, develop ]
pull_request:
branches: [ master, develop ]
workflow_dispatch: # Allow manual triggering

jobs:
test:
Expand Down
87 changes: 55 additions & 32 deletions debugdrawer/src/main/java/com/abualzait/debugdrawer/DebugDrawer.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.abualzait.debugdrawer

import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.GridView
import android.widget.LinearLayout
import com.abualzait.debugdrawer.R
import com.abualzait.debugdrawer.adapter.DebugModuleAdapter
import com.abualzait.debugdrawer.modules.DebugModule
import com.abualzait.debugdrawer.utils.Logger
import javax.inject.Inject
Expand All @@ -20,6 +25,7 @@ class DebugDrawer @Inject constructor(
private var isInitialized = false
private var debugOverlay: DebugOverlay? = null
private val modules = mutableListOf<DebugModule>()
private var currentModule: DebugModule? = null

/**
* Initialize the debug drawer with the given activity.
Expand Down Expand Up @@ -103,15 +109,20 @@ internal class DebugOverlay(
private val modules: MutableList<DebugModule>,
) {
private var overlayView: View? = null
private var drawerContainer: View? = null
private var mainMenuView: View? = null
private var moduleView: View? = null
private var isVisible = false
private var currentModule: DebugModule? = null
private var moduleAdapter: DebugModuleAdapter? = null

fun addModule(module: DebugModule) {
// Module will be added to the drawer when it's shown
// Module will be added to the adapter when it's shown
moduleAdapter?.notifyDataSetChanged()
}

fun removeModule(module: DebugModule) {
// Module will be removed from the drawer when it's shown
// Module will be removed from the adapter when it's shown
moduleAdapter?.notifyDataSetChanged()
}

fun show() {
Expand All @@ -122,6 +133,7 @@ internal class DebugOverlay(
val rootView = activity.findViewById<ViewGroup>(android.R.id.content)
rootView.addView(view)
isVisible = true
showMainMenu()
android.util.Log.d("DebugDrawer", "Debug drawer shown with ${modules.size} modules")
}
}
Expand All @@ -143,7 +155,10 @@ internal class DebugOverlay(
fun destroy() {
hide()
overlayView = null
drawerContainer = null
mainMenuView = null
moduleView = null
moduleAdapter = null
currentModule = null
}

private fun createOverlayView() {
Expand All @@ -155,50 +170,58 @@ internal class DebugOverlay(
)
}

// Set up the drawer container
drawerContainer = overlayView?.findViewById(R.id.debug_drawer_container)

// Add modules to the drawer
setupModules()

// Set up close button
overlayView?.findViewById<View>(R.id.btn_close_drawer)?.setOnClickListener {
hide()
}

// Set up overlay click to close
overlayView?.findViewById<View>(R.id.debug_overlay_background)?.setOnClickListener {
hide()
}
}

private fun setupModules() {
val modulesContainer = drawerContainer?.findViewById<android.widget.LinearLayout>(R.id.ll_modules_container)
modulesContainer?.removeAllViews()
private fun showMainMenu() {
val inflater = activity.layoutInflater
mainMenuView = inflater.inflate(R.layout.debug_drawer_main_menu, null)

val drawerContainer = overlayView?.findViewById<ViewGroup>(R.id.debug_drawer_container)
drawerContainer?.removeAllViews()
drawerContainer?.addView(mainMenuView)

// Set up modules grid
val modulesGrid = mainMenuView?.findViewById<GridView>(R.id.gv_modules)
moduleAdapter = DebugModuleAdapter(activity, modules) { module ->
showModule(module)
}
modulesGrid?.adapter = moduleAdapter

android.util.Log.d("DebugDrawer", "Setting up ${modules.size} modules")
modules.forEach { module ->
android.util.Log.d("DebugDrawer", "Adding module: ${module.name}")
val moduleView = createModuleView(module)
modulesContainer?.addView(moduleView)
// Set up close button
mainMenuView?.findViewById<View>(R.id.btn_close_drawer)?.setOnClickListener {
hide()
}
}

private fun createModuleView(module: DebugModule): View {
private fun showModule(module: DebugModule) {
currentModule = module
val inflater = activity.layoutInflater
val moduleContainer = inflater.inflate(R.layout.debug_module_container, null)
moduleView = inflater.inflate(R.layout.debug_module_view, null)

val drawerContainer = overlayView?.findViewById<ViewGroup>(R.id.debug_drawer_container)
drawerContainer?.removeAllViews()
drawerContainer?.addView(moduleView)

// Set module title
moduleContainer.findViewById<android.widget.TextView>(R.id.tv_module_title).text = module.title

// Set module description
moduleContainer.findViewById<android.widget.TextView>(R.id.tv_module_description).text = module.description
moduleView?.findViewById<android.widget.TextView>(R.id.tv_module_title)?.text = module.title

// Add module content
val contentContainer = moduleContainer.findViewById<android.widget.LinearLayout>(R.id.ll_module_content)
val contentContainer = moduleView?.findViewById<FrameLayout>(R.id.fl_module_content)
val moduleContentView = module.createView()
contentContainer.addView(moduleContentView)
contentContainer?.addView(moduleContentView)

// Set up back button
moduleView?.findViewById<View>(R.id.btn_back_to_menu)?.setOnClickListener {
showMainMenu()
}

return moduleContainer
// Set up close button
moduleView?.findViewById<View>(R.id.btn_close_drawer)?.setOnClickListener {
hide()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.abualzait.debugdrawer.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.abualzait.debugdrawer.R
import com.abualzait.debugdrawer.modules.DebugModule

/**
* Adapter for displaying debug modules in a grid view.
*/
class DebugModuleAdapter(
private val context: Context,
private val modules: List<DebugModule>,
private val onModuleClick: (DebugModule) -> Unit
) : BaseAdapter() {

override fun getCount(): Int = modules.size

override fun getItem(position: Int): DebugModule = modules[position]

override fun getItemId(position: Int): Long = position.toLong()

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: LayoutInflater.from(context)
.inflate(R.layout.debug_module_item, parent, false)

val module = getItem(position)
val iconView = view.findViewById<ImageView>(R.id.iv_module_icon)
val titleView = view.findViewById<TextView>(R.id.tv_module_title)
val descriptionView = view.findViewById<TextView>(R.id.tv_module_description)

// Set module icon based on module type
iconView.setImageResource(getModuleIcon(module.name))

titleView.text = module.title
descriptionView.text = module.description

// Set click listener
view.setOnClickListener {
onModuleClick(module)
}

return view
}

private fun getModuleIcon(moduleName: String): Int {
return when (moduleName) {
"app_info" -> android.R.drawable.ic_menu_info_details
"network" -> android.R.drawable.ic_menu_share
"feature_flags" -> android.R.drawable.ic_menu_preferences
"logcat" -> android.R.drawable.ic_menu_edit
"settings" -> android.R.drawable.ic_menu_manage
"clipboard" -> android.R.drawable.ic_menu_edit
else -> android.R.drawable.ic_menu_info_details
}
}
}
Loading