{"id":21743950,"url":"https://github.com/telefonica/tweaks","last_synced_at":"2025-04-13T05:07:20.238Z","repository":{"id":40506975,"uuid":"446507209","full_name":"Telefonica/tweaks","owner":"Telefonica","description":"A customizable debug screen to view and edit flags that can be used for development","archived":false,"fork":false,"pushed_at":"2025-03-27T14:44:40.000Z","size":769,"stargazers_count":15,"open_issues_count":0,"forks_count":1,"subscribers_count":22,"default_branch":"main","last_synced_at":"2025-04-13T05:07:11.561Z","etag":null,"topics":["cdco","managed","org-cdo","srv-novum"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Telefonica.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,"publiccode":null,"codemeta":null}},"created_at":"2022-01-10T16:52:15.000Z","updated_at":"2025-04-09T10:20:17.000Z","dependencies_parsed_at":"2024-01-22T13:31:43.722Z","dependency_job_id":"f0a43973-59b2-4496-ac61-f17143d13037","html_url":"https://github.com/Telefonica/tweaks","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telefonica%2Ftweaks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telefonica%2Ftweaks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telefonica%2Ftweaks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Telefonica%2Ftweaks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Telefonica","download_url":"https://codeload.github.com/Telefonica/tweaks/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248665747,"owners_count":21142123,"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":["cdco","managed","org-cdo","srv-novum"],"created_at":"2024-11-26T07:09:29.946Z","updated_at":"2025-04-13T05:07:20.210Z","avatar_url":"https://github.com/Telefonica.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Platform-Android-brightgreen\" /\u003e\n\u003cimg src=\"https://maven-badges.herokuapp.com/maven-central/com.telefonica/tweaks/badge.png\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/Support-%3E%3D%20Android%205.0-brightgreen\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://user-images.githubusercontent.com/4595241/146578604-32454df7-6c15-456f-9939-7848464600e9.png\" width=\"800\" /\u003e\n\u003c/p\u003e\n\nA customizable debug screen to view and edit flags that can be used for development in **Jetpack Compose** applications\n\n\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://user-images.githubusercontent.com/4595241/194544208-8ce6cbdf-0e09-4f32-8823-b47fce7075a0.gif\" data-canonical-src=\"https://user-images.githubusercontent.com/4595241/194544208-8ce6cbdf-0e09-4f32-8823-b47fce7075a0.gif\" width=\"200\" /\u003e\n\u003c/p\u003e\n\n\nTo include the library add to your app's `build.gradle`:\n\n```gradle\nimplementation 'com.telefonica:tweaks:{version}'\n```\n\nOr, in case you want to don't add the library in release builds:\n```gradle\ndebugImplementation 'com.telefonica:tweaks:{version}'\nreleaseImplementation 'com.telefonica:tweaks-no-op:{version}'\n```\n\nThen initialize the library in your app's `onCreate`:\n```kotlin\noverride fun onCreate() {\n    super.onCreate()\n    Tweaks.init(context, demoTweakGraph())\n}\n```\n\nwhere `demoTweakGraph` is the structure you want to be rendered:\n```kotlin\nprivate fun demoTweakGraph() = tweaksGraph {\n    cover(\"Tweaks\") {\n        label(\"Current user ID:\") { flowOf(\"80057182\") }\n        label(\"Current IP:\") { flowOf(\"192.168.1.127\") }\n        label(\"Current IP (public):\") { flowOf(\"80.68.1.92\") }\n        label(\"Timestamp:\") { timestampState }\n        dropDownMenu(\n            key = \"spinner1\",\n            name = \"Spinner example\",\n            values = listOf(\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"),\n            defaultValue = flowOf(\"Monday\")\n        )\n    }\n    category(\"Statistics\") {\n        group(\"Group 1\") {\n            label(\n                name = \"Current timestamp\",\n            ) {\n                timestampState\n            }\n            editableString(\n                key = \"value1\",\n                name = \"Value 1\",\n            )\n            editableBoolean(\n                key = \"value2\",\n                name = \"Value 2\",\n                defaultValue = true,\n            )\n            editableLong(\n                key = \"value4\",\n                name = \"Value 4\",\n                defaultValue = 42L,\n            )\n\n            button(\n                name = \"Demo button\"\n            ) {\n                Toast.makeText(this@TweakDemoApplication, \"Demo button\", Toast.LENGTH_LONG)\n                    .show()\n            }\n            routeButton(\n                name = \"Custom screen button\",\n                route = \"custom-screen\"\n            )\n            customNavigationButton(\n                name = \"Another custom screen button\",\n                navigation = { navController -\u003e\n                    navController.navigate(\"custom-screen\")\n                }\n            )\n        }\n    }\n}\n```\n\nAnd then, in your NavHost setup, use the extension function `NavGraphBuilder.addTweakGraph` to fill the navigation graph with the tweak components:\n```kotlin\n@Composable\n    private fun DemoNavHost(\n        navController: NavHostController,\n        initialScreen: String,\n        modifier: Modifier = Modifier,\n    ) {\n        NavHost(\n            navController = navController,\n            startDestination = initialScreen,\n            modifier = modifier,\n        ) {\n            addTweakGraph(\n                navController = navController,\n            )\n        }\n    }\n```\n\n## How to build the TweaksGraph\nYou can use the DSL to create your own graph. Please note that a graph is composed by:\n* A main group of tweaks (*Optional*)\n* A list of categories\n\nThe categories are separate screens and are composed of groups of tweaks. You can use each category to separate debug elements of your app by feature or key components, for example: (chat, webviews, login, stats, etc...)\n\nThe group of tweaks are a shown inside each category screen, they are composed of tweaks and can represent configuration settings that can be grouped together, for example: endpoints of your API.\n\nAnd finally, the tweaks are the configurable elements. Currently we support these ones:\n\n```kotlin\nbutton(\n    name: String,\n    action: () -\u003e Unit\n)\n```\nUsed to display a button that performs an action\n\n```kotlin\nfun routeButton(\n    name: String,\n    route: String,\n)\n```\nSimilar, but this button navigates directly to a route of the NavHost, check [custom screens section](#custom-screens) for more info\n\n```kotlin\ncustomNavigationButton(\n    name = \"Another custom screen button\",\n    navigation = { navController -\u003e\n        navController.navigate(\"custom-screen\") {\n            popUpTo(\"another-custom-screen\") {\n                inclusive = true\n            }\n        }\n    }\n)\n```\nJust like `routeButton`, but it allows to pass a lambda which receives a `NavController` so more complex navigations can be performed.\n\n```kotlin\nfun label(\n    name: String,\n    value: () -\u003e Flow\u003cString\u003e,\n)\n```\nA non editable text\n\n```kotlin\nfun editableString(\n    key: String,\n    name: String,\n    defaultValue: Flow\u003cString\u003e? = null,\n)\n```\n\n```kotlin\nfun editableString(\n    key: String,\n    name: String,\n    defaultValue: String,\n)\n```\n\nAn editable text\n\n```kotlin\nfun editableBoolean(\n    key: String,\n    name: String,\n    defaultValue: Flow\u003cBoolean\u003e? = null,\n)\n```\n\n```kotlin\nfun editableBoolean(\n    key: String,\n    name: String,\n    defaultValue: Boolean,\n)\n```\nAn editable boolean \n```kotlin\nfun editableInt(\n    key: String,\n    name: String,\n    defaultValue: Flow\u003cInt\u003e? = null,\n)\n```\n\n```kotlin\nfun editableInt(\n    key: String,\n    name: String,\n    defaultValue: Int,\n) \n```\nAn editable Int\n```kotlin\nfun editableLong(\n    key: String,\n    name: String,\n    defaultValue: Flow\u003cLong\u003e? = null,\n)\n```\n\n```kotlin\nfun editableLong(\n    key: String,\n    name: String,\n    defaultValue: Long,\n)\n```\nAn editable Long\n\n```kotlin\nfun dropDownMenu(\n    key: String,\n    name: String,\n    values: List\u003cString\u003e,\n    defaultValue: Flow\u003cString\u003e,\n)\n```\nA DropDownMenu\nPlease review the app module for configuration examples.\n\n## Reset Button\nWhen a group of tweaks is created, only if there is at least one editable tweak, a reset button will be automatically added.\nIf you do not want the reset button to be added automatically, there is a parameter in group node `withClearButton` that can be set.\n```kotlin\ngroup(\n    title = \"Group Title\",\n    withClearButton = true\n) {\n    // Your tweaks\n}\n```\n\n## Custom screens:\nYou can add your custom screens to the TweaksGraph by using the `customComposableScreens` parameter of `addTweakGraph` function, for example:\n```kotlin\naddTweakGraph(\n    navController = navController,\n) {\n    composable(route = \"custom-screen\") {\n        Column(\n            modifier = Modifier\n                .fillMaxSize()\n                .padding(16.dp),\n            verticalArrangement = Arrangement.Center,\n            horizontalAlignment = Alignment.CenterHorizontally,\n        ) {\n            Text(\"Custom screen\")\n        }\n    }\n}\n```\n\n## Shake gesture support:\n\nThe tweaks can be opened when the user shakes the device. To achieve this, you can either add the following to your navigation controller:\n```kotlin\nnavController.navigateToTweaksOnShake()\n```\nor call:\n```kotlin\nNavigateToTweaksOnShake(onOpenTweaks: () -\u003e Unit)\n```\nand handle the navigation action yourself.\n\nAnd also, optionally\n```xml\n\u003cuses-permission android:name=\"android.permission.VIBRATE\" /\u003e\n```\nto your `AndroidManifest.xml`\n\n## Special thanks to contributors:\n* [Yamal Al Mahamid](https://github.com/yamal-coding)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftelefonica%2Ftweaks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftelefonica%2Ftweaks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftelefonica%2Ftweaks/lists"}