{"id":20492570,"url":"https://github.com/redmadrobot/debug-panel-android","last_synced_at":"2025-04-13T17:04:18.751Z","repository":{"id":64320686,"uuid":"516407635","full_name":"RedMadRobot/debug-panel-android","owner":"RedMadRobot","description":"Library for easy application debugging","archived":false,"fork":false,"pushed_at":"2024-04-10T16:47:03.000Z","size":1014,"stargazers_count":5,"open_issues_count":3,"forks_count":3,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-04-11T10:15:09.316Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RedMadRobot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-07-21T14:36:50.000Z","updated_at":"2024-04-15T11:37:47.041Z","dependencies_parsed_at":"2023-01-15T12:00:39.102Z","dependency_job_id":"b17f877e-421b-4d78-a3f2-bee1a597de7f","html_url":"https://github.com/RedMadRobot/debug-panel-android","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RedMadRobot%2Fdebug-panel-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RedMadRobot%2Fdebug-panel-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RedMadRobot%2Fdebug-panel-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RedMadRobot%2Fdebug-panel-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RedMadRobot","download_url":"https://codeload.github.com/RedMadRobot/debug-panel-android/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224819484,"owners_count":17375274,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T17:29:39.429Z","updated_at":"2024-11-15T17:29:40.674Z","avatar_url":"https://github.com/RedMadRobot.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Debug-panel\n\n[![Maven Central Version](https://img.shields.io/maven-central/v/com.redmadrobot.debug/panel-core?style=flat-square)](https://central.sonatype.com/search?namespace=com.redmadrobot.debug)\n\nБибилиотека для отладки приложений.\n\n\u003e [!WARNING]\n\u003e\n\u003e Библиотека находится в стадии разработки.\n\n---\n\n**[Changelog][changelog]** | **[Документация по разработке плагинов][plugin-development-doc]** | **[Миграция на новые версии][migration-guide]**\n\nТебе надоело каждый раз вручную вбивать логин и пароль тестового пользователя или пересобирать приложение для того чтобы поменять сервер в настройках? Эта библиотека разрабатывается с идеей решить эти и другие проблемы, и сделать процесс отладки приложения более удобным. \n\nВ данный момент библиотека предоставляет следующий функционал:\n\n1. **Добавление, редактирование и выбор юзера.**\n2. **Добавление, редактирование и выбор сервера.**\n3. **Просмотр и редактирование SharedPreferences.**\n4. **Управление Feature toggle на основе Flipper.**\n5. **Управление remote config на основе Konfeature.**\n\nБиблиотека разрабатывается используя подход работы с плагинами, когда каждый функционал подключается отдельным модулем в зависимостях.\n\n## Подключение библиотеки\n\nДля работы с библиотекой необходимо:\n\n1. Подключить `Core` модуль для работы самой панели:\n\n```groovy\n\ndependencies {\n    //core модуль панели\n   debugImplementation 'com.redmadrobot.debug:panel-core:${debug_panel_version}'\n}\n```\n\n\n\n2. Подключить необходимые плагины\n\n```groovy\ndependencies {\n    //Плагин для работы с аккаунтами\n    debugImplementation 'com.redmadrobot.debug:plugin-accounts:${debug_panel_version}'\n\n    //Плагин для работы с серверами\n    debugImplementation 'com.redmadrobot.debug:plugin-servers:${debug_panel_version}'\n\n    //Плагин для работы с SharedPreferences\n    debugImplementation 'com.redmadrobot.debug:plugin-app-settings:${debug_panel_version}'\n\n    //Плагин для работы с Feature Toggle на основе Flipper\n    debugImplementation 'com.redmadrobot.debug:plugin-flipper:${debug_panel_version}'\n    //Так же необходимо подключить саму библеотеку flipper\n    debugImplementation \"com.redmadrobot:flipper:${flipper_version}\"\n\n    //Плагин для работы с remote config на основе Konfeature\n    debugImplementation 'com.redmadrobot.debug:plugin-konfeature:${debug_panel_version}'\n    //Так же необходимо подключить саму библиотеку konfeature\n    debugImplementation \"com.redmadrobot.konfeature:konfeature:${konfeature_version}\"\n}\n\n```\n\n3. Для того чтобы библиотека не попала в релизную сборку необходимо подключить `no-op` версию библиотеки\n\n```groovy\n   releaseImplementation 'com.redmadrobot.debug:panel-no-op:${debug_panel_version}'\n```\n\n## Использование библиотеки в коде\n\nОбщий принцип подключения библиотеки в коде выглядит так:\n\n```kotlin\nclass App : Application() {\n\n    override fun onCreate() {\n        super.onCreate()\n        \n      DebugPanel.initialize(\n            application = this,\n            config = DebugPanelConfig(shakerMode = false),\n            plugins = listOf(\n                AccountsPlugin(/*arguments*/),\n                ServersPlugin(/*arguments*/),\n                AppSettingsPlugin(/*arguments*/),\n                FlipperPlugin(/*arguments*/),\n                KonfeaturePlugin(/*arguments*/),\n            )\n        )\n    }\n}\n```\n\nДля того чтобы открыть DebugPanel, нужно вызвать в коде:\n\n```kotlin\nfun openDebugPanel() {\n    DebugPanel.showPanel(supportFragmentManager)\n}\n```\n\nТак же в панель можно войти через уведомление которое появляется при запуске приложения использующее библиотеку. Через это же уведомление можно перейти в ручную настройку панели. Для этого нужно нажать кнопку `SETTINGS` в раскрытом уведомлении.\n\n![Режим редактирования](assets/debug_notification.png)\n\n## Конфигурация\n\nДля дополнительной конфигурации **DebugPanel**, нужно добавить свою версию `DebugPanelConfig` класса при инициализации панели.\n\n```kotlin\n   DebugPanel.initialize(\n            application = this,\n            config = DebugPanelConfig(),\n            plugins = listOf(/*plugins*/)\n)\n```\n\n### Доступные возможности для конфигурации \n\n`shakerMode: Boolean` - Открытие **DebugPanel** при встряхивании устройства.\n\n## Работа с плагинами\n\n### AccountsPlugin \nИспользуется для работы тестовыми аккаунтами.\n\nМожно задать список предустановленных аккаунтов\n\n```kotlin\nAccountsPlugin(\n    preInstalledAccounts = listOf(\n        DebugAccount(\n            login = \"user_login\",\n            password = \"user_password\",\n            pin = \"pin\" //необязательное поле\n        )\n    )\n)\n```\n\nЧтобы реагировать на смену пользователя вы можете подписаться на события `DebugPanel` внутри любого `LifecycleOwner` \n\n```kotlin\nDebugPanel.subscribeToEvents(lifecycleOwner = this) { event -\u003e\n    when (event) {\n        is AccountSelectedEvent -\u003e {\n            val account = event.debugAccount\n          //Реализация перелогина\n        }\n    }\n}\n```\n\nТак же вы можете использовать интерфейс `DebugAuthenticator` чтобы реализовать логику перелогина в отдельном классе который можно передать в плагин.\n\n```kotlin\nclass UserAuthenticator : DebugAuthenticator {\n    override fun onAccountSelected(account: DebugAccount) {\n         //Реализация перелогина\n    }\n}\n```\n\n```kotlin\nAccountsPlugin(\n    preInstalledAccounts = listOf(),\n    debugAuthenticator = UserAuthenticator()\n)\n```\n\nМетод `onAccountSelected` будет вызываться при каждом выборе аккаунта\n\n### ServersPlugin\nИспользуется для работы с тестовыми серверами\n\nМожно задать список предустановленных серверов\n\n```kotlin\nServersPlugin(\n    preInstalledServers = listOf(\n        DebugServer(\n            name = \"server_name\",\n            url = \"https://debug_server.com\",\n            isDefault = true /*!!!Обязательно должен быть указан хотя бы один сервер по умолчанию*/\n        )\n    )\n)\n```\n\nИ подписаться на событие смены сервера\t\n\n```kotlin\nDebugPanel.subscribeToEvents(lifecycleOwner = this) { event -\u003e\n    when (event) {\n        is ServerSelectedEvent -\u003e {\n            val debugServer = event.debugServer\n            // логика переключения сервера\n        }\n    }\n}\n```\n\nДля получения выбранного сервера или **default** сервера из кода:\n\n```kotlin\n   val selectedServer = ServersPlugin.getSelectedServer()\n   val defaultServer = ServersPlugin.getDefaultServer()\n```\n\nТак же если вы используете `OkHttp` в своем сетевом стеке то можете использовать `DebugServerInterceptor` который будет автоматически подменять хост в запросах на выбранный вами.\n\n```kotlin\nOkHttpClient.Builder()\n    .addInterceptor(DebugServerInterceptor())\n    .build()\n```\n\nЕсли запросы должны еще как то модифицироваться, например добавляться Header'ы то это можно сделать используя метод `modifyRequest`\n\n```kotlin\nOkHttpClient.Builder()\n   .addInterceptor(\n       DebugServerInterceptor().modifyRequest { request, server -\u003e\n           if (server.name == \"Test\") {\n               request.newBuilder()\n                   .addHeader(\"Authorization\", \"testToken\")\n                   .build()\n           } else {\n               request\n           }\n       }\n   )\n   .build()\n```\nТекущий выбранный сервер можно получить следующим образом\n\n```kotlin\nval selectedServer = getPlugin\u003cServersPlugin\u003e().getSelectedServer()\n```\n\n\n\n### AppSettingsPlugin \n\nИспользуется для просмотра и редактирования `SharedPreferences` в проекте\n\nДля подключения плагина, необходимо передать в него список `SharedPreferences` с которыми хотите работать:\n\n```kotlin\n AppSettingsPlugin(\n     sharedPreferences = listOf(\n         primarySharedPreferences,\n         secondarySharedPreferences\n     )\n )\n```\n\n### FlipperPlugin\n\nИспользуется для просмотра и редактирования Flipper feature toggle'ов в проекте\n\nДля подключения плагина, необходимо передать в него map id поддерживаемых фичей и их значений\n\n```kotlin\nFlipperPlugin(\n   featureStateMap = mapOf(\n      \"Toggle Id\" to FlipperValue()\n   )\n)\n```\n\nДля изменения значений в рамках проекта необходимо использовать метод FlipperPlugin.observeChangedToggles():\n\n```kotlin\nFlipperPlugin\n   .observeChangedToggles()         // Пришлёт map размером = [0, yourFeatures.size]\n   .onEach { changedToggles -\u003e      // Первый раз пришлёт сохранённые значения\n      this.yourDebugPanelChangedToggles = changedToggles\n   }\n   .flowOn(Dispatchers.Main)\n   .launchIn(debugScope)\n```\n\nВ FlipperConfig должно быть что-то наподобие\n\n```kotlin\noverride fun getValue(feature: Feature): FlipperValue {\n   return yourDebugPanelChangedToggles[feature.id]\n      ?: localConfig[feature.id]\n      ?: FlipperValue.BooleanValue(false)\n}\n```\n\n### Konfeature Plugin\n\nВ основе плагина лежит библиотека [Konfeature][konfeature], которая позволяет:\n\n- отображать конфигурации feature, которые используются в konfeature\n- видеть источник каждого элемента конфигурации (Default, Firebase, AppGallery и т.д.)\n- переопределять значение элементов конфигурации с типом Boolean, String, Long, Double\n\nДля подключения плагина, необходимо передать в него объект класса `KonfeatureDebugPanelInterceptor` и `Konfeature`\n\n```kotlin\nval debugPanelInterceptor = KonfeatureDebugPanelInterceptor(context)\n\nval konfeatureInstance = konfeature {\n    if (isDebug) {\n        addIntercepot(debugPanelInterceptor)\n    }\n}\n\nKonfeaturePlugin(\n    debugPanelInterceptor = debugPanelInterceptor,\n    konfeature = konfeatureInstance,\n)\n```\n\nВ builder konfeture можно настроить следующее:\n\n- добавить config конкретной фичи - `register(FeatureConfigN())`\n- настроить работу с remote config через реализацию интерфейса `FeatureSource` - `addSource(featureSource)`\n- настроить логирование - `setLogger(logger)`\n\n# Безопасность!\nДля того чтобы тестовые данные не попали в релизные сборки рекомендуется не задавать их явно в Application классе, а использовать реализации DebugDataProvider, которые можно разнести по разным buildType. Для release версии следует сделать пустую реализацию.\n\n**buildType**  `debug`\n\n```kotlin\nclass DebugServersProvider : DebugDataProvider\u003cList\u003cDebugServer\u003e\u003e {\n   \n    override fun provideData(): List\u003cDebugServer\u003e {\n        return listOf(\n            DebugServer(name = \"debug 1\", url = \"https://testserver1.com\")\n        )\n    }\n}\n```\n**buildType**  `release`\n\n```kotlin\nclass DebugServersProvider : DebugDataProvider\u003cList\u003cDebugServer\u003e\u003e {\n\n    override fun provideData(): List\u003cDebugServer\u003e {\n        return emptyList()\n    }\n}\n```\nДобавление в плагин\n\n```kotlin\nServersPlugin(\n    preInstalledServers = DebugServersProvider()\n)\n```\n\n## License\n\n[MIT][license]\n\n[plugin-development-doc]:docs/plugin_development.md\n[changelog]: ./CHANGELOG.md\n[migration-guide]: docs/migration_guide.md\n[konfeature]: https://github.com/RedMadRobot/Konfeature\n[license]: LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredmadrobot%2Fdebug-panel-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fredmadrobot%2Fdebug-panel-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredmadrobot%2Fdebug-panel-android/lists"}