[{"data":1,"prerenderedAt":2403},["ShallowReactive",2],{"navigation_docs":3,"-sdks-openfeature-android":184,"-sdks-openfeature-android-surround":1879,"sdks\u002Fopenfeature-android\u002Finstall":1886,"sdks\u002Fopenfeature-android\u002Fconfigure":2055,"sdks\u002Fopenfeature-android\u002Fsimple-usage":2178,"sdks\u002Fopenfeature-android\u002Fuser-context":2250},[4,36,168],{"title":5,"icon":6,"modifiedAt":7,"path":8,"stem":9,"children":10,"page":6},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[11,16,21,26,31],{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":17,"path":18,"stem":19,"icon":20},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":22,"path":23,"stem":24,"icon":25},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":27,"path":28,"stem":29,"icon":30},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":32,"path":33,"stem":34,"icon":35},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":37,"modifiedAt":38,"defaultOpen":39,"path":40,"stem":41,"children":42,"page":6},"SDKs","2026-05-02T18:15:50.000Z",true,"\u002Fsdks","2.sdks",[43,48,70,95,111,137],{"title":44,"path":45,"stem":46,"icon":47},"Available SDKs","\u002Fsdks\u002Favailable-sdks","2.sdks\u002F1.available-sdks","i-lucide-list",{"title":49,"modifiedAt":50,"icon":51,"defaultOpen":6,"path":52,"stem":53,"children":54,"page":6},"Browser SDKs","2026-09-22T05:52:53.000Z","i-lucide-monitor","\u002Fsdks\u002Fbrowser","2.sdks\u002F2.browser",[55,60,65],{"title":56,"path":57,"stem":58,"icon":59},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","2.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":61,"path":62,"stem":63,"icon":64},"React","\u002Fsdks\u002Fbrowser\u002Freact","2.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":66,"path":67,"stem":68,"icon":69},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","2.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":71,"modifiedAt":50,"icon":72,"defaultOpen":6,"path":73,"stem":74,"children":75,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","2.sdks\u002F3.mobile",[76,80,85,90],{"title":77,"path":78,"stem":79,"icon":64},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","2.sdks\u002F3.mobile\u002F1.react-native",{"title":81,"path":82,"stem":83,"icon":84},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","2.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":86,"path":87,"stem":88,"icon":89},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","2.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":91,"path":92,"stem":93,"icon":94},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","2.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":96,"modifiedAt":50,"icon":97,"defaultOpen":6,"path":98,"stem":99,"children":100,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","2.sdks\u002F4.meta",[101,106],{"title":102,"path":103,"stem":104,"icon":105},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","2.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":107,"path":108,"stem":109,"icon":110},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","2.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":112,"modifiedAt":50,"icon":113,"defaultOpen":6,"path":114,"stem":115,"children":116,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","2.sdks\u002F5.server",[117,122,127,132],{"title":118,"path":119,"stem":120,"icon":121},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","2.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":123,"path":124,"stem":125,"icon":126},"Python","\u002Fsdks\u002Fserver\u002Fpython","2.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":128,"path":129,"stem":130,"icon":131},"Java","\u002Fsdks\u002Fserver\u002Fjava","2.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":133,"path":134,"stem":135,"icon":136},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","2.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":138,"modifiedAt":50,"icon":139,"defaultOpen":6,"path":140,"stem":141,"children":142,"page":6},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","2.sdks\u002F6.openfeature",[143,148,152,156,160,164],{"title":144,"path":145,"stem":146,"icon":139,"icons":147},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","2.sdks\u002F6.openfeature\u002F1.web",[139,59],{"title":86,"path":149,"stem":150,"icon":139,"icons":151},"\u002Fsdks\u002Fopenfeature\u002Fswift","2.sdks\u002F6.openfeature\u002F2.swift",[139,89],{"title":91,"path":153,"stem":154,"icon":139,"icons":155},"\u002Fsdks\u002Fopenfeature\u002Fandroid","2.sdks\u002F6.openfeature\u002F3.android",[139,94],{"title":118,"path":157,"stem":158,"icon":139,"icons":159},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","2.sdks\u002F6.openfeature\u002F4.node-js",[139,121],{"title":128,"path":161,"stem":162,"icon":139,"icons":163},"\u002Fsdks\u002Fopenfeature\u002Fjava","2.sdks\u002F6.openfeature\u002F5.java",[139,131],{"title":123,"path":165,"stem":166,"icon":139,"icons":167},"\u002Fsdks\u002Fopenfeature\u002Fpython","2.sdks\u002F6.openfeature\u002F6.python",[139,126],{"title":169,"modifiedAt":170,"defaultOpen":39,"path":171,"stem":172,"children":173,"page":6},"Integrations","2026-07-31T18:08:51.000Z","\u002Fintegrations","3.integrations",[174,179],{"title":175,"path":176,"stem":177,"icon":178},"Terraform","\u002Fintegrations\u002Fterraform","3.integrations\u002F1.terraform","cd-logos-terraform",{"title":180,"path":181,"stem":182,"icon":183},"MCP","\u002Fintegrations\u002Fmcp","3.integrations\u002F2.mcp","cd-logos-mcp",{"id":185,"title":186,"body":187,"description":1870,"extension":1871,"links":1872,"meta":1873,"navigation":1875,"path":153,"seo":1877,"stem":154,"__hash__":1878},"docs\u002F2.sdks\u002F6.openfeature\u002F3.android.md","OpenFeature Android Provider",{"type":188,"value":189,"toc":1856},"minimark",[190,194,200,205,222,259,273,292,295,299,305,308,312,315,423,427,444,447,454,479,490,647,670,681,686,693,700,786,802,806,809,824,827,830,834,837,840,843,900,912,950,1034,1041,1045,1052,1134,1141,1229,1233,1236,1248,1554,1560,1564,1567,1570,1633,1642,1663,1672,1677,1681,1693,1841,1852],[191,192],"div",{"hidden":39,"dataTitleIcon":193},"openfeature-android",[195,196],"external-badges",{"package-url":197,"registry":198,"repo":199},"https:\u002F\u002Fcentral.sonatype.com\u002Fartifact\u002Fcom.configdirector\u002Fconfigdirector-openfeature-android-provider","maven","android-sdk\u002Ftree\u002Fmain\u002Fconfigdirector-openfeature-android-provider",[201,202,204],"h2",{"id":203},"introduction","Introduction",[206,207,208,209,217,218,221],"p",{},"The OpenFeature Android Provider is intended to be used in combination with the ",[210,211,216],"a",{"href":212,"rel":213,"target":215},"https:\u002F\u002Fopenfeature.dev\u002Fdocs\u002Freference\u002Fsdks\u002Fclient\u002Fkotlin\u002F",[214],"noopener","_blank","OpenFeature Kotlin SDK"," in Android applications. The provider wraps the ConfigDirector ",[210,219,220],{"href":92},"Android SDK",".",[223,224,225,241],"table",{},[226,227,228],"thead",{},[229,230,231,235,238],"tr",{},[232,233,234],"th",{},"Artifact",[232,236,237],{},"Minimum SDK",[232,239,240],{},"Java bytecode",[242,243,244],"tbody",{},[229,245,246,253,256],{},[247,248,249],"td",{},[250,251,252],"code",{},"com.configdirector:configdirector-openfeature-android-provider",[247,254,255],{},"21",[247,257,258],{},"11",[206,260,261,262,265,266,269,270,272],{},"It requires version 0.8.0 or newer of the OpenFeature Kotlin SDK, ",[250,263,264],{},"dev.openfeature:kotlin-sdk",". That SDK's provider contract is built on ",[250,267,268],{},"suspend"," functions and flows, so the provider is written for Kotlin; a Java application uses the ",[210,271,220],{"href":92}," directly instead.",[274,275,276,277,280,281,284,285,287,288,291],"note",{},"Before version 0.6.0 the OpenFeature Kotlin SDK was published as ",[250,278,279],{},"dev.openfeature:android-sdk",", in the package ",[250,282,283],{},"dev.openfeature.sdk",". The provider depends on the current artifact, ",[250,286,264],{},", whose package is ",[250,289,290],{},"dev.openfeature.kotlin.sdk",". Update your imports if you are upgrading from the old one.",[206,293,294],{},"Config evaluation is synchronous and reads config state the provider already holds in memory, which is what makes it safe to call from a composable or from the main thread. Telemetry about those evaluations is aggregated and reported on its own coroutine, so evaluating a config never waits on the network.",[201,296,298],{"id":297},"installation","Installation",[206,300,301,302],{},"The provider can be installed from Maven Central: ",[210,303,197],{"href":197,"rel":304,"target":215},[214],[206,306,307],{},"The OpenFeature Kotlin SDK and the ConfigDirector Android SDK are included as transitive dependencies.",[309,310],"content-partial",{"name":311},"sdks\u002Fopenfeature-android\u002Finstall",[206,313,314],{},"The provider ships Java 11 bytecode, which the OpenFeature Kotlin SDK requires, so your application module has to compile for Java 11 or newer:",[316,317,323],"pre",{"className":318,"code":319,"filename":320,"language":321,"meta":322,"style":322},"language-kotlin shiki shiki-themes material-theme-lighter github-light github-dark","android {\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_11\n        targetCompatibility = JavaVersion.VERSION_11\n    }\n}\n\nkotlin {\n    compilerOptions {\n        jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11\n    }\n}\n","build.gradle.kts","kotlin","",[250,324,325,338,346,359,369,375,381,387,394,402,413,418],{"__ignoreMap":322},[326,327,330,334],"span",{"class":328,"line":329},"line",1,[326,331,333],{"class":332},"sGLFI","android",[326,335,337],{"class":336},"su5hD"," {\n",[326,339,341,344],{"class":328,"line":340},2,[326,342,343],{"class":332},"    compileOptions",[326,345,337],{"class":336},[326,347,349,352,356],{"class":328,"line":348},3,[326,350,351],{"class":336},"        sourceCompatibility ",[326,353,355],{"class":354},"smGrS","=",[326,357,358],{"class":336}," JavaVersion.VERSION_11\n",[326,360,362,365,367],{"class":328,"line":361},4,[326,363,364],{"class":336},"        targetCompatibility ",[326,366,355],{"class":354},[326,368,358],{"class":336},[326,370,372],{"class":328,"line":371},5,[326,373,374],{"class":336},"    }\n",[326,376,378],{"class":328,"line":377},6,[326,379,380],{"class":336},"}\n",[326,382,384],{"class":328,"line":383},7,[326,385,386],{"emptyLinePlaceholder":39},"\n",[326,388,390,392],{"class":328,"line":389},8,[326,391,321],{"class":332},[326,393,337],{"class":336},[326,395,397,400],{"class":328,"line":396},9,[326,398,399],{"class":332},"    compilerOptions",[326,401,337],{"class":336},[326,403,405,408,410],{"class":328,"line":404},10,[326,406,407],{"class":336},"        jvmTarget ",[326,409,355],{"class":354},[326,411,412],{"class":336}," org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11\n",[326,414,416],{"class":328,"line":415},11,[326,417,374],{"class":336},[326,419,421],{"class":328,"line":420},12,[326,422,380],{"class":336},[201,424,426],{"id":425},"configure-and-initialize-the-client","Configure and initialize the client",[428,429,430,438,441],"ol",{},[431,432,433,434,437],"li",{},"Create an instance of the provider providing an Android context and your client SDK key. You can retrieve a client SDK key for each environment under ",[250,435,436],{},"SDK Keys"," in the dashboard's navigation panel.",[431,439,440],{},"Set the OpenFeature provider, along with the initial evaluation context.",[431,442,443],{},"Get a client instance from OpenFeature.",[309,445],{"name":446},"sdks\u002Fopenfeature-android\u002Fconfigure",[206,448,449,450,453],{},"The constructor throws a ",[250,451,452],{},"ConfigDirectorValidationException"," in only two cases, both of which are programming errors rather than runtime conditions: a blank client SDK key, and an option that cannot be used, such as a negative timeout or a base URL that is not absolute. Connection failures are not thrown from it.",[206,455,456,459,460,462,463,466,467,470,471,474,475,478],{},[250,457,458],{},"setProviderAndWait"," is a ",[250,461,268],{}," function that returns once the initial config state arrives or the configured timeout elapses. When it times out, the provider's initialization fails with a ",[250,464,465],{},"ProviderNotReadyError",", the OpenFeature SDK reports the ",[250,468,469],{},"Error"," status, and the provider keeps connecting in the background; it then emits ",[250,472,473],{},"ProviderReady"," as soon as config state arrives. Until then, flags resolve to their default values with the ",[250,476,477],{},"PROVIDER_NOT_READY"," error code.",[206,480,481,482,485,486,489],{},"Most applications register the provider once during startup and let it live for the lifetime of the app. That usually means doing so from the ",[250,483,484],{},"Application",", with ",[250,487,488],{},"setProvider",", which returns at once and initializes in the background:",[316,491,494],{"className":318,"code":492,"filename":493,"language":321,"meta":322,"style":322},"import android.app.Application\nimport com.configdirector.openfeature.ConfigDirectorProvider\nimport dev.openfeature.kotlin.sdk.ImmutableContext\nimport dev.openfeature.kotlin.sdk.OpenFeatureAPI\n\nclass MyApplication : Application() {\n\n    override fun onCreate() {\n        super.onCreate()\n\n        val provider = ConfigDirectorProvider(this, \"YOUR-CLIENT-SDK-KEY\")\n        OpenFeatureAPI.setProvider(provider, initialContext = ImmutableContext(targetingKey = \"user-123\"))\n    }\n}\n","MyApplication.kt",[250,495,496,505,512,519,526,530,546,550,564,578,582,611,637,642],{"__ignoreMap":322},[326,497,498,501],{"class":328,"line":329},[326,499,500],{"class":354},"import",[326,502,504],{"class":503},"sbgvK"," android.app.Application\n",[326,506,507,509],{"class":328,"line":340},[326,508,500],{"class":354},[326,510,511],{"class":503}," com.configdirector.openfeature.ConfigDirectorProvider\n",[326,513,514,516],{"class":328,"line":348},[326,515,500],{"class":354},[326,517,518],{"class":503}," dev.openfeature.kotlin.sdk.ImmutableContext\n",[326,520,521,523],{"class":328,"line":361},[326,522,500],{"class":354},[326,524,525],{"class":503}," dev.openfeature.kotlin.sdk.OpenFeatureAPI\n",[326,527,528],{"class":328,"line":371},[326,529,386],{"emptyLinePlaceholder":39},[326,531,532,535,538,541,543],{"class":328,"line":377},[326,533,534],{"class":354},"class",[326,536,537],{"class":503}," MyApplication",[326,539,540],{"class":336}," : ",[326,542,484],{"class":503},[326,544,545],{"class":336},"() {\n",[326,547,548],{"class":328,"line":383},[326,549,386],{"emptyLinePlaceholder":39},[326,551,552,556,559,562],{"class":328,"line":389},[326,553,555],{"class":554},"sbsja","    override",[326,557,558],{"class":354}," fun",[326,560,561],{"class":332}," onCreate",[326,563,545],{"class":336},[326,565,566,570,572,575],{"class":328,"line":396},[326,567,569],{"class":568},"s39Yj","        super",[326,571,221],{"class":336},[326,573,574],{"class":332},"onCreate",[326,576,577],{"class":336},"()\n",[326,579,580],{"class":328,"line":404},[326,581,386],{"emptyLinePlaceholder":39},[326,583,584,587,590,592,595,598,601,604,608],{"class":328,"line":415},[326,585,586],{"class":354},"        val",[326,588,589],{"class":336}," provider ",[326,591,355],{"class":354},[326,593,594],{"class":332}," ConfigDirectorProvider",[326,596,597],{"class":336},"(",[326,599,600],{"class":568},"this",[326,602,603],{"class":336},", ",[326,605,607],{"class":606},"s_sjI","\"YOUR-CLIENT-SDK-KEY\"",[326,609,610],{"class":336},")\n",[326,612,613,616,618,621,623,626,629,631,634],{"class":328,"line":420},[326,614,615],{"class":336},"        OpenFeatureAPI.",[326,617,488],{"class":332},[326,619,620],{"class":336},"(provider, initialContext ",[326,622,355],{"class":354},[326,624,625],{"class":332}," ImmutableContext",[326,627,628],{"class":336},"(targetingKey ",[326,630,355],{"class":354},[326,632,633],{"class":606}," \"user-123\"",[326,635,636],{"class":336},"))\n",[326,638,640],{"class":328,"line":639},13,[326,641,374],{"class":336},[326,643,645],{"class":328,"line":644},14,[326,646,380],{"class":336},[206,648,649,650,653,654,657,658,661,662,665,666,221],{},"Flag evaluations are possible once ",[250,651,652],{},"OpenFeatureAPI.getStatus()"," is ",[250,655,656],{},"Ready","; ",[250,659,660],{},"OpenFeatureAPI.statusFlow"," is the same thing as a ",[250,663,664],{},"Flow",", which is how a screen follows it. See ",[210,667,669],{"href":668},"#reading-configs-in-jetpack-compose","reading configs in Jetpack Compose",[274,671,672,673,680],{},"The underlying SDK watches the application behind the context it was given so it can release its network connection while the app is backgrounded. Pass the provider any context — the application behind it is what matters. See the ",[210,674,676,679],{"href":675},"\u002Fsdks\u002Fmobile\u002Fandroid#connection",[250,677,678],{},"connection"," options of the Android SDK"," to manage that yourself instead.",[682,683,685],"h3",{"id":684},"additional-configuration-options","Additional configuration options",[206,687,688,689,692],{},"Additional configuration options can be passed into the provider as ",[250,690,691],{},"ClientOptions"," in the optional third argument of the constructor. They are the Android SDK's own options, so configuring the provider needs the SDK's types alongside it.",[206,694,695,696,699],{},"For example, the ",[250,697,698],{},"metadata"," can be provided like this:",[316,701,704],{"className":318,"code":702,"filename":703,"language":321,"meta":322,"style":322},"import com.configdirector.ClientOptions\nimport com.configdirector.openfeature.ConfigDirectorProvider\n\nval provider = ConfigDirectorProvider(\n    applicationContext,\n    \"YOUR-CLIENT-SDK-KEY\",\n    ClientOptions.build {\n        metadata(\"YOUR-APP-NAME\", \"1.0.2\")\n    },\n)\n","ConfigDirectorSetup.kt",[250,705,706,713,719,723,737,742,750,760,777,782],{"__ignoreMap":322},[326,707,708,710],{"class":328,"line":329},[326,709,500],{"class":354},[326,711,712],{"class":503}," com.configdirector.ClientOptions\n",[326,714,715,717],{"class":328,"line":340},[326,716,500],{"class":354},[326,718,511],{"class":503},[326,720,721],{"class":328,"line":348},[326,722,386],{"emptyLinePlaceholder":39},[326,724,725,728,730,732,734],{"class":328,"line":361},[326,726,727],{"class":354},"val",[326,729,589],{"class":336},[326,731,355],{"class":354},[326,733,594],{"class":332},[326,735,736],{"class":336},"(\n",[326,738,739],{"class":328,"line":371},[326,740,741],{"class":336},"    applicationContext,\n",[326,743,744,747],{"class":328,"line":377},[326,745,746],{"class":606},"    \"YOUR-CLIENT-SDK-KEY\"",[326,748,749],{"class":336},",\n",[326,751,752,755,758],{"class":328,"line":383},[326,753,754],{"class":336},"    ClientOptions.",[326,756,757],{"class":332},"build",[326,759,337],{"class":336},[326,761,762,765,767,770,772,775],{"class":328,"line":389},[326,763,764],{"class":332},"        metadata",[326,766,597],{"class":336},[326,768,769],{"class":606},"\"YOUR-APP-NAME\"",[326,771,603],{"class":336},[326,773,774],{"class":606},"\"1.0.2\"",[326,776,610],{"class":336},[326,778,779],{"class":328,"line":396},[326,780,781],{"class":336},"    },\n",[326,783,784],{"class":328,"line":404},[326,785,610],{"class":336},[206,787,788,789,603,791,793,794,797,798,221],{},"The provider accepts the same ",[250,790,698],{},[250,792,678],{}," and ",[250,795,796],{},"logger"," options as the Android SDK client, ",[210,799,801],{"href":800},"\u002Fsdks\u002Fmobile\u002Fandroid#additional-configuration-options","refer to the additional configuration options section of the Android SDK for a full list",[682,803,805],{"id":804},"shut-down","Shut down",[206,807,808],{},"Shutting OpenFeature down, or replacing the provider, closes the provider, which closes its connection and reports any pending telemetry:",[316,810,812],{"className":318,"code":811,"filename":493,"language":321,"meta":322,"style":322},"OpenFeatureAPI.shutdown()\n",[250,813,814],{"__ignoreMap":322},[326,815,816,819,822],{"class":328,"line":329},[326,817,818],{"class":336},"OpenFeatureAPI.",[326,820,821],{"class":332},"shutdown",[326,823,577],{"class":336},[206,825,826],{},"An instance serves a single registration. After it has been shut down, create a new one rather than registering it again.",[206,828,829],{},"Most applications never need to do this — the provider lives as long as the process, and Android reclaims everything when the process ends. Shut it down when an application wants the connection gone before that, on sign-out for instance.",[201,831,833],{"id":832},"retrieve-config-values","Retrieve config values",[206,835,836],{},"To retrieve config values, use the OpenFeature client:",[309,838],{"name":839},"sdks\u002Fopenfeature-android\u002Fsimple-usage",[206,841,842],{},"Each OpenFeature getter maps to a ConfigDirector config type:",[223,844,845,855],{},[226,846,847],{},[229,848,849,852],{},[232,850,851],{},"OpenFeature getter",[232,853,854],{},"ConfigDirector config value",[242,856,857,867,877,890],{},[229,858,859,864],{},[247,860,861],{},[250,862,863],{},"getBooleanValue",[247,865,866],{},"Boolean",[229,868,869,874],{},[247,870,871],{},[250,872,873],{},"getStringValue",[247,875,876],{},"String or enum",[229,878,879,887],{},[247,880,881,603,884],{},[250,882,883],{},"getIntegerValue",[250,885,886],{},"getDoubleValue",[247,888,889],{},"Number",[229,891,892,897],{},[247,893,894],{},[250,895,896],{},"getObjectValue",[247,898,899],{},"JSON object or JSON array",[206,901,902,904,905,908,909,911],{},[250,903,883],{}," takes and returns an ",[250,906,907],{},"Int",", as the OpenFeature Kotlin SDK defines it; a value written as a decimal is truncated. Every config can be read with ",[250,910,873],{},", including a JSON config's raw document.",[206,913,914,915,917,918,921,922,925,926,603,929,603,932,935,936,939,940,935,943,946,947,478],{},"For ",[250,916,896],{},", the default value decides the type the config is read as: a ",[250,919,920],{},"Value.Structure"," reads a JSON config as a structure, a ",[250,923,924],{},"Value.List"," reads one as a list, and a ",[250,927,928],{},"Value.String",[250,930,931],{},"Value.Integer",[250,933,934],{},"Value.Double"," or ",[250,937,938],{},"Value.Boolean"," reads the config as that type. A ",[250,941,942],{},"Value.Null",[250,944,945],{},"Value.Instant"," default names no type to read, so it resolves to itself with the ",[250,948,949],{},"TYPE_MISMATCH",[316,951,954],{"className":318,"code":952,"filename":953,"language":321,"meta":322,"style":322},"import dev.openfeature.kotlin.sdk.Value\n\nval settings = client.getObjectValue(\"my-json-config-key\", Value.Structure(emptyMap()))\nval theme = settings.asStructure()?.get(\"theme\")?.asString()\n","MainActivity.kt",[250,955,956,963,967,1000],{"__ignoreMap":322},[326,957,958,960],{"class":328,"line":329},[326,959,500],{"class":354},[326,961,962],{"class":503}," dev.openfeature.kotlin.sdk.Value\n",[326,964,965],{"class":328,"line":340},[326,966,386],{"emptyLinePlaceholder":39},[326,968,969,971,974,976,979,981,983,986,989,992,994,997],{"class":328,"line":348},[326,970,727],{"class":354},[326,972,973],{"class":336}," settings ",[326,975,355],{"class":354},[326,977,978],{"class":336}," client.",[326,980,896],{"class":332},[326,982,597],{"class":336},[326,984,985],{"class":606},"\"my-json-config-key\"",[326,987,988],{"class":336},", Value.",[326,990,991],{"class":332},"Structure",[326,993,597],{"class":336},[326,995,996],{"class":332},"emptyMap",[326,998,999],{"class":336},"()))\n",[326,1001,1002,1004,1007,1009,1012,1015,1018,1021,1023,1026,1029,1032],{"class":328,"line":361},[326,1003,727],{"class":354},[326,1005,1006],{"class":336}," theme ",[326,1008,355],{"class":354},[326,1010,1011],{"class":336}," settings.",[326,1013,1014],{"class":332},"asStructure",[326,1016,1017],{"class":336},"()?.",[326,1019,1020],{"class":332},"get",[326,1022,597],{"class":336},[326,1024,1025],{"class":606},"\"theme\"",[326,1027,1028],{"class":336},")?.",[326,1030,1031],{"class":332},"asString",[326,1033,577],{"class":336},[206,1035,1036,1037,221],{},"For additional information regarding the OpenFeature client ",[210,1038,1040],{"href":212,"rel":1039,"target":215},[214],"refer to the OpenFeature Kotlin SDK documentation",[682,1042,1044],{"id":1043},"evaluation-details","Evaluation details",[206,1046,1047,1048,1051],{},"The detailed getters of the OpenFeature client, such as ",[250,1049,1050],{},"getBooleanDetails",", report why an evaluation produced the value that it did:",[223,1053,1054,1067],{},[226,1055,1056],{},[229,1057,1058,1061,1064],{},[232,1059,1060],{},"Outcome",[232,1062,1063],{},"Reason",[232,1065,1066],{},"Error code",[242,1068,1069,1081,1093,1108,1121],{},[229,1070,1071,1074,1079],{},[247,1072,1073],{},"A value was found",[247,1075,1076],{},[250,1077,1078],{},"TARGETING_MATCH",[247,1080],{},[229,1082,1083,1086,1091],{},[247,1084,1085],{},"The config carries no value",[247,1087,1088],{},[250,1089,1090],{},"DEFAULT",[247,1092],{},[229,1094,1095,1098,1103],{},[247,1096,1097],{},"The config key is unknown",[247,1099,1100],{},[250,1101,1102],{},"ERROR",[247,1104,1105],{},[250,1106,1107],{},"FLAG_NOT_FOUND",[229,1109,1110,1113,1117],{},[247,1111,1112],{},"No config state has arrived yet",[247,1114,1115],{},[250,1116,1102],{},[247,1118,1119],{},[250,1120,477],{},[229,1122,1123,1126,1130],{},[247,1124,1125],{},"The value does not match the requested type",[247,1127,1128],{},[250,1129,1102],{},[247,1131,1132],{},[250,1133,949],{},[206,1135,1136,1137,1140],{},"When a value was found, the ",[250,1138,1139],{},"variant"," is ConfigDirector's identifier for that value. In every other case the default value is returned.",[316,1142,1144],{"className":318,"code":1143,"filename":953,"language":321,"meta":322,"style":322},"val details = client.getBooleanDetails(\"my-config-key\", false)\nLog.i(\"MyApp\", \"my-config-key is ${details.value} because ${details.reason} (variant ${details.variant})\")\n",[250,1145,1146,1172],{"__ignoreMap":322},[326,1147,1148,1150,1153,1155,1157,1159,1161,1164,1166,1170],{"class":328,"line":329},[326,1149,727],{"class":354},[326,1151,1152],{"class":336}," details ",[326,1154,355],{"class":354},[326,1156,978],{"class":336},[326,1158,1050],{"class":332},[326,1160,597],{"class":336},[326,1162,1163],{"class":606},"\"my-config-key\"",[326,1165,603],{"class":336},[326,1167,1169],{"class":1168},"syTEX","false",[326,1171,610],{"class":336},[326,1173,1174,1177,1180,1182,1185,1187,1190,1194,1198,1201,1204,1207,1209,1212,1214,1217,1219,1222,1224,1227],{"class":328,"line":340},[326,1175,1176],{"class":336},"Log.",[326,1178,1179],{"class":332},"i",[326,1181,597],{"class":336},[326,1183,1184],{"class":606},"\"MyApp\"",[326,1186,603],{"class":336},[326,1188,1189],{"class":606},"\"my-config-key is ",[326,1191,1193],{"class":1192},"sjJ54","${",[326,1195,1197],{"class":1196},"sfo-9","details.",[326,1199,1200],{"class":554},"value",[326,1202,1203],{"class":1192},"}",[326,1205,1206],{"class":606}," because ",[326,1208,1193],{"class":1192},[326,1210,1211],{"class":1196},"details.reason",[326,1213,1203],{"class":1192},[326,1215,1216],{"class":606}," (variant ",[326,1218,1193],{"class":1192},[326,1220,1221],{"class":1196},"details.variant",[326,1223,1203],{"class":1192},[326,1225,1226],{"class":606},")\"",[326,1228,610],{"class":336},[682,1230,1232],{"id":1231},"reading-configs-in-jetpack-compose","Reading configs in Jetpack Compose",[206,1234,1235],{},"The getters are synchronous and make no network calls, so they are safe to call directly from a composable. That gives you the current value, but the composable will not recompose on its own when the value changes.",[206,1237,1238,1239,1241,1242,459,1245,1247],{},"To have a composable follow a config, re-read it whenever the SDK status moves or the provider reports a configuration change. ",[250,1240,660],{}," carries the status, and ",[250,1243,1244],{},"OpenFeatureAPI.observe()",[250,1246,664],{}," of the provider's events:",[316,1249,1252],{"className":318,"code":1250,"filename":1251,"language":321,"meta":322,"style":322},"import androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableIntStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport dev.openfeature.kotlin.sdk.OpenFeatureAPI\nimport dev.openfeature.kotlin.sdk.OpenFeatureStatus\nimport dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents\n\n@Composable\nfun DarkModeToggle() {\n    val status by OpenFeatureAPI.statusFlow.collectAsState(initial = OpenFeatureStatus.NotReady)\n    var generation by remember { mutableIntStateOf(0) }\n\n    \u002F\u002F Counts every configuration change, so the read below runs again after each one.\n    LaunchedEffect(Unit) {\n        OpenFeatureAPI.observe\u003COpenFeatureProviderEvents.ProviderConfigurationChanged>()\n            .collect { generation++ }\n    }\n\n    \u002F\u002F Re-read when the status moves -- to Ready once config state arrives, for instance --\n    \u002F\u002F and after every configuration change.\n    val darkMode = remember(status, generation) {\n        OpenFeatureAPI.getClient().getBooleanValue(\"dark-mode\", false)\n    }\n\n    Switch(checked = darkMode, onCheckedChange = null)\n}\n","DarkModeToggle.kt",[250,1253,1254,1261,1268,1275,1282,1289,1296,1303,1309,1316,1323,1327,1332,1342,1367,1396,1401,1408,1417,1439,1457,1462,1467,1473,1479,1494,1518,1523,1528,1549],{"__ignoreMap":322},[326,1255,1256,1258],{"class":328,"line":329},[326,1257,500],{"class":354},[326,1259,1260],{"class":503}," androidx.compose.runtime.Composable\n",[326,1262,1263,1265],{"class":328,"line":340},[326,1264,500],{"class":354},[326,1266,1267],{"class":503}," androidx.compose.runtime.LaunchedEffect\n",[326,1269,1270,1272],{"class":328,"line":348},[326,1271,500],{"class":354},[326,1273,1274],{"class":503}," androidx.compose.runtime.collectAsState\n",[326,1276,1277,1279],{"class":328,"line":361},[326,1278,500],{"class":354},[326,1280,1281],{"class":503}," androidx.compose.runtime.getValue\n",[326,1283,1284,1286],{"class":328,"line":371},[326,1285,500],{"class":354},[326,1287,1288],{"class":503}," androidx.compose.runtime.mutableIntStateOf\n",[326,1290,1291,1293],{"class":328,"line":377},[326,1292,500],{"class":354},[326,1294,1295],{"class":503}," androidx.compose.runtime.remember\n",[326,1297,1298,1300],{"class":328,"line":383},[326,1299,500],{"class":354},[326,1301,1302],{"class":503}," androidx.compose.runtime.setValue\n",[326,1304,1305,1307],{"class":328,"line":389},[326,1306,500],{"class":354},[326,1308,525],{"class":503},[326,1310,1311,1313],{"class":328,"line":396},[326,1312,500],{"class":354},[326,1314,1315],{"class":503}," dev.openfeature.kotlin.sdk.OpenFeatureStatus\n",[326,1317,1318,1320],{"class":328,"line":404},[326,1319,500],{"class":354},[326,1321,1322],{"class":503}," dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents\n",[326,1324,1325],{"class":328,"line":415},[326,1326,386],{"emptyLinePlaceholder":39},[326,1328,1329],{"class":328,"line":420},[326,1330,1331],{"class":503},"@Composable\n",[326,1333,1334,1337,1340],{"class":328,"line":639},[326,1335,1336],{"class":354},"fun",[326,1338,1339],{"class":332}," DarkModeToggle",[326,1341,545],{"class":336},[326,1343,1344,1347,1350,1353,1356,1359,1362,1364],{"class":328,"line":644},[326,1345,1346],{"class":354},"    val",[326,1348,1349],{"class":336}," status ",[326,1351,1352],{"class":554},"by",[326,1354,1355],{"class":336}," OpenFeatureAPI.statusFlow.",[326,1357,1358],{"class":332},"collectAsState",[326,1360,1361],{"class":336},"(initial ",[326,1363,355],{"class":354},[326,1365,1366],{"class":336}," OpenFeatureStatus.NotReady)\n",[326,1368,1370,1373,1376,1378,1381,1384,1387,1389,1393],{"class":328,"line":1369},15,[326,1371,1372],{"class":354},"    var",[326,1374,1375],{"class":336}," generation ",[326,1377,1352],{"class":554},[326,1379,1380],{"class":332}," remember",[326,1382,1383],{"class":336}," { ",[326,1385,1386],{"class":332},"mutableIntStateOf",[326,1388,597],{"class":336},[326,1390,1392],{"class":1391},"srdBf","0",[326,1394,1395],{"class":336},") }\n",[326,1397,1399],{"class":328,"line":1398},16,[326,1400,386],{"emptyLinePlaceholder":39},[326,1402,1404],{"class":328,"line":1403},17,[326,1405,1407],{"class":1406},"sutJx","    \u002F\u002F Counts every configuration change, so the read below runs again after each one.\n",[326,1409,1411,1414],{"class":328,"line":1410},18,[326,1412,1413],{"class":332},"    LaunchedEffect",[326,1415,1416],{"class":336},"(Unit) {\n",[326,1418,1420,1422,1425,1428,1431,1433,1436],{"class":328,"line":1419},19,[326,1421,615],{"class":336},[326,1423,1424],{"class":332},"observe",[326,1426,1427],{"class":336},"\u003C",[326,1429,1430],{"class":503},"OpenFeatureProviderEvents",[326,1432,221],{"class":336},[326,1434,1435],{"class":503},"ProviderConfigurationChanged",[326,1437,1438],{"class":336},">()\n",[326,1440,1442,1445,1448,1451,1454],{"class":328,"line":1441},20,[326,1443,1444],{"class":336},"            .",[326,1446,1447],{"class":332},"collect",[326,1449,1450],{"class":336}," { generation",[326,1452,1453],{"class":354},"++",[326,1455,1456],{"class":336}," }\n",[326,1458,1460],{"class":328,"line":1459},21,[326,1461,374],{"class":336},[326,1463,1465],{"class":328,"line":1464},22,[326,1466,386],{"emptyLinePlaceholder":39},[326,1468,1470],{"class":328,"line":1469},23,[326,1471,1472],{"class":1406},"    \u002F\u002F Re-read when the status moves -- to Ready once config state arrives, for instance --\n",[326,1474,1476],{"class":328,"line":1475},24,[326,1477,1478],{"class":1406},"    \u002F\u002F and after every configuration change.\n",[326,1480,1482,1484,1487,1489,1491],{"class":328,"line":1481},25,[326,1483,1346],{"class":354},[326,1485,1486],{"class":336}," darkMode ",[326,1488,355],{"class":354},[326,1490,1380],{"class":332},[326,1492,1493],{"class":336},"(status, generation) {\n",[326,1495,1497,1499,1502,1505,1507,1509,1512,1514,1516],{"class":328,"line":1496},26,[326,1498,615],{"class":336},[326,1500,1501],{"class":332},"getClient",[326,1503,1504],{"class":336},"().",[326,1506,863],{"class":332},[326,1508,597],{"class":336},[326,1510,1511],{"class":606},"\"dark-mode\"",[326,1513,603],{"class":336},[326,1515,1169],{"class":1168},[326,1517,610],{"class":336},[326,1519,1521],{"class":328,"line":1520},27,[326,1522,374],{"class":336},[326,1524,1526],{"class":328,"line":1525},28,[326,1527,386],{"emptyLinePlaceholder":39},[326,1529,1531,1534,1537,1539,1542,1544,1547],{"class":328,"line":1530},29,[326,1532,1533],{"class":332},"    Switch",[326,1535,1536],{"class":336},"(checked ",[326,1538,355],{"class":354},[326,1540,1541],{"class":336}," darkMode, onCheckedChange ",[326,1543,355],{"class":354},[326,1545,1546],{"class":568}," null",[326,1548,610],{"class":336},[326,1550,1552],{"class":328,"line":1551},30,[326,1553,380],{"class":336},[206,1555,1556,1557,1559],{},"Until the status is ",[250,1558,656],{},", the read returns the default value, which is a good moment to show a loading state rather than flashing the in-code default on a slow connection.",[201,1561,1563],{"id":1562},"update-the-user-context","Update the user context",[309,1565],{"name":1566},"sdks\u002Fopenfeature-android\u002Fuser-context",[206,1568,1569],{},"The evaluation context maps onto the ConfigDirector user context as follows:",[223,1571,1572,1582],{},[226,1573,1574],{},[229,1575,1576,1579],{},[232,1577,1578],{},"OpenFeature evaluation context",[232,1580,1581],{},"ConfigDirector user context",[242,1583,1584,1597,1609,1621],{},[229,1585,1586,1593],{},[247,1587,1588,1589,1592],{},"The targeting key, or otherwise an ",[250,1590,1591],{},"id"," attribute",[247,1594,1595],{},[250,1596,1591],{},[229,1598,1599,1605],{},[247,1600,1601,1602,1592],{},"The ",[250,1603,1604],{},"name",[247,1606,1607],{},[250,1608,1604],{},[229,1610,1611,1617],{},[247,1612,1601,1613,1616],{},[250,1614,1615],{},"traits"," structure attribute",[247,1618,1619],{},[250,1620,1615],{},[229,1622,1623,1629],{},[247,1624,1625,1626,1592],{},"The boolean ",[250,1627,1628],{},"anonymous",[247,1630,1631],{},[250,1632,1628],{},[206,1634,1635,1636,1638,1639,221],{},"Any other attribute is ignored. Put the values your targeting rules depend on inside ",[250,1637,1615],{},". Traits are JSON-shaped values; a context the SDK could not send, such as one holding a trait that is not a finite number, is rejected with an ",[250,1640,1641],{},"InvalidContextError",[274,1643,1644,1645,1648,1649,1652,1653,1656,1657,1659,1660,1662],{},"In client SDKs (browser and mobile), updating the user context re-establishes a new connection to ConfigDirector servers with the new context. While the new connection is in flight, the OpenFeature SDK reports the ",[250,1646,1647],{},"Reconciling"," status and config values continue to evaluate to the currently cached values from the prior user context.",[1650,1651],"br",{},"\nAwaiting ",[250,1654,1655],{},"setEvaluationContextAndWait"," will wait until the new config values are downloaded or the connection times out. In the case of a timeout, the provider reports the ",[250,1658,469],{}," status and continues to attempt to connect with the new context in the background, then emits ",[250,1661,473],{}," once it succeeds.",[206,1664,1665,1668,1669,1671],{},[250,1666,1667],{},"setEvaluationContext",", without the wait, returns at once and reconciles in the background; follow ",[250,1670,660],{}," to know when the new values are in effect.",[206,1673,1036,1674,221],{},[210,1675,1040],{"href":212,"rel":1676,"target":215},[214],[201,1678,1680],{"id":1679},"events","Events",[206,1682,1683,1684,1686,1687,1689,1690,1692],{},"The provider publishes its events through ",[250,1685,1244],{},", a ",[250,1688,664],{}," filtered by event type. It emits ",[250,1691,1435],{}," whenever configs are updated on the dashboard or via the admin API, carrying the keys of the configs in the update:",[316,1694,1696],{"className":318,"code":1695,"filename":703,"language":321,"meta":322,"style":322},"import dev.openfeature.kotlin.sdk.OpenFeatureAPI\nimport dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents\n\nlifecycleScope.launch {\n    OpenFeatureAPI.observe\u003COpenFeatureProviderEvents.ProviderConfigurationChanged>().collect { event ->\n        Log.i(\"MyApp\", \"Configs updated: ${event.eventDetails?.flagsChanged}\")\n    }\n}\n\nlifecycleScope.launch {\n    OpenFeatureAPI.statusFlow.collect { status ->\n        Log.i(\"MyApp\", \"OpenFeature status: $status\")\n    }\n}\n",[250,1697,1698,1704,1710,1714,1724,1750,1778,1782,1786,1790,1798,1810,1833,1837],{"__ignoreMap":322},[326,1699,1700,1702],{"class":328,"line":329},[326,1701,500],{"class":354},[326,1703,525],{"class":503},[326,1705,1706,1708],{"class":328,"line":340},[326,1707,500],{"class":354},[326,1709,1322],{"class":503},[326,1711,1712],{"class":328,"line":348},[326,1713,386],{"emptyLinePlaceholder":39},[326,1715,1716,1719,1722],{"class":328,"line":361},[326,1717,1718],{"class":336},"lifecycleScope.",[326,1720,1721],{"class":332},"launch",[326,1723,337],{"class":336},[326,1725,1726,1729,1731,1733,1735,1737,1739,1742,1744,1747],{"class":328,"line":371},[326,1727,1728],{"class":336},"    OpenFeatureAPI.",[326,1730,1424],{"class":332},[326,1732,1427],{"class":336},[326,1734,1430],{"class":503},[326,1736,221],{"class":336},[326,1738,1435],{"class":503},[326,1740,1741],{"class":336},">().",[326,1743,1447],{"class":332},[326,1745,1746],{"class":336}," { event ",[326,1748,1749],{"class":554},"->\n",[326,1751,1752,1755,1757,1759,1761,1763,1766,1768,1771,1773,1776],{"class":328,"line":377},[326,1753,1754],{"class":336},"        Log.",[326,1756,1179],{"class":332},[326,1758,597],{"class":336},[326,1760,1184],{"class":606},[326,1762,603],{"class":336},[326,1764,1765],{"class":606},"\"Configs updated: ",[326,1767,1193],{"class":1192},[326,1769,1770],{"class":1196},"event.eventDetails?.flagsChanged",[326,1772,1203],{"class":1192},[326,1774,1775],{"class":606},"\"",[326,1777,610],{"class":336},[326,1779,1780],{"class":328,"line":383},[326,1781,374],{"class":336},[326,1783,1784],{"class":328,"line":389},[326,1785,380],{"class":336},[326,1787,1788],{"class":328,"line":396},[326,1789,386],{"emptyLinePlaceholder":39},[326,1791,1792,1794,1796],{"class":328,"line":404},[326,1793,1718],{"class":336},[326,1795,1721],{"class":332},[326,1797,337],{"class":336},[326,1799,1800,1803,1805,1808],{"class":328,"line":415},[326,1801,1802],{"class":336},"    OpenFeatureAPI.statusFlow.",[326,1804,1447],{"class":332},[326,1806,1807],{"class":336}," { status ",[326,1809,1749],{"class":554},[326,1811,1812,1814,1816,1818,1820,1822,1825,1829,1831],{"class":328,"line":420},[326,1813,1754],{"class":336},[326,1815,1179],{"class":332},[326,1817,597],{"class":336},[326,1819,1184],{"class":606},[326,1821,603],{"class":336},[326,1823,1824],{"class":606},"\"OpenFeature status: ",[326,1826,1828],{"class":1827},"s_hVV","$status",[326,1830,1775],{"class":606},[326,1832,610],{"class":336},[326,1834,1835],{"class":328,"line":639},[326,1836,374],{"class":336},[326,1838,1839],{"class":328,"line":644},[326,1840,380],{"class":336},[206,1842,1843,1844,1846,1847,1849,1850,221],{},"It emits ",[250,1845,473],{}," when config state arrives after initialization or a context change has already timed out, which moves the status from ",[250,1848,469],{}," back to ",[250,1851,656],{},[1853,1854,1855],"style",{},"html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sfo-9, html code.shiki .sfo-9{--shiki-light:#90A4AE;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":322,"searchDepth":340,"depth":340,"links":1857},[1858,1859,1860,1864,1868,1869],{"id":203,"depth":340,"text":204},{"id":297,"depth":340,"text":298},{"id":425,"depth":340,"text":426,"children":1861},[1862,1863],{"id":684,"depth":348,"text":685},{"id":804,"depth":348,"text":805},{"id":832,"depth":340,"text":833,"children":1865},[1866,1867],{"id":1043,"depth":348,"text":1044},{"id":1231,"depth":348,"text":1232},{"id":1562,"depth":340,"text":1563},{"id":1679,"depth":340,"text":1680},"ConfigDirector Provider for the OpenFeature Kotlin SDK on Android","md",null,{"modifiedAt":1874},"2026-09-22T05:34:22.000Z",{"title":91,"icon":139,"icons":1876},[139,94],{"title":186,"description":1870},"h_POU5OJ7fvtvCbtQhKmKBC944-nH_qtqwMdrxAI72E",[1880,1883],{"title":86,"path":149,"stem":150,"description":1881,"icon":139,"icons":1882,"children":-1},"ConfigDirector Provider for the OpenFeature Swift SDK",[139,89],{"title":118,"path":157,"stem":158,"description":1884,"icon":139,"icons":1885,"children":-1},"ConfigDirector Provider for the OpenFeature Node.js SDK",[139,121],{"id":1887,"title":1888,"body":1889,"description":322,"extension":1871,"meta":2050,"navigation":6,"path":2051,"seo":2052,"stem":2053,"__hash__":2054},"partials\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Finstall.md","Install",{"type":188,"value":1890,"toc":2048},[1891,2045],[1892,1893,1894,1922,1953],"code-group",{},[316,1895,1897],{"className":318,"code":1896,"filename":320,"language":321,"meta":322,"style":322},"dependencies {\n    implementation(\"com.configdirector:configdirector-openfeature-android-provider:1.0.0\")\n}\n",[250,1898,1899,1906,1918],{"__ignoreMap":322},[326,1900,1901,1904],{"class":328,"line":329},[326,1902,1903],{"class":332},"dependencies",[326,1905,337],{"class":336},[326,1907,1908,1911,1913,1916],{"class":328,"line":340},[326,1909,1910],{"class":332},"    implementation",[326,1912,597],{"class":336},[326,1914,1915],{"class":606},"\"com.configdirector:configdirector-openfeature-android-provider:1.0.0\"",[326,1917,610],{"class":336},[326,1919,1920],{"class":328,"line":348},[326,1921,380],{"class":336},[316,1923,1928],{"className":1924,"code":1925,"filename":1926,"language":1927,"meta":322,"style":322},"language-groovy shiki shiki-themes material-theme-lighter github-light github-dark","dependencies {\n    implementation 'com.configdirector:configdirector-openfeature-android-provider:1.0.0'\n}\n","build.gradle","groovy",[250,1929,1930,1935,1949],{"__ignoreMap":322},[326,1931,1932],{"class":328,"line":329},[326,1933,1934],{"class":336},"dependencies {\n",[326,1936,1937,1940,1943,1946],{"class":328,"line":340},[326,1938,1939],{"class":336},"    implementation ",[326,1941,1942],{"class":1192},"'",[326,1944,1945],{"class":606},"com.configdirector:configdirector-openfeature-android-provider:1.0.0",[326,1947,1948],{"class":1192},"'\n",[326,1950,1951],{"class":328,"line":348},[326,1952,380],{"class":336},[316,1954,1959],{"className":1955,"code":1956,"filename":1957,"language":1958,"meta":322,"style":322},"language-toml shiki shiki-themes material-theme-lighter github-light github-dark","[versions]\nconfigdirector-openfeature = \"1.0.0\"\n\n[libraries]\nopenfeature-provider = { module = \"com.configdirector:configdirector-openfeature-android-provider\", version.ref = \"configdirector-openfeature\" }\n","libs.versions.toml","toml",[250,1960,1961,1973,1989,1993,2002],{"__ignoreMap":322},[326,1962,1963,1967,1970],{"class":328,"line":329},[326,1964,1966],{"class":1965},"sP7_E","[",[326,1968,1969],{"class":503},"versions",[326,1971,1972],{"class":1965},"]\n",[326,1974,1975,1978,1980,1983,1986],{"class":328,"line":340},[326,1976,1977],{"class":336},"configdirector-openfeature ",[326,1979,355],{"class":1965},[326,1981,1982],{"class":1192}," \"",[326,1984,1985],{"class":606},"1.0.0",[326,1987,1988],{"class":1192},"\"\n",[326,1990,1991],{"class":328,"line":348},[326,1992,386],{"emptyLinePlaceholder":39},[326,1994,1995,1997,2000],{"class":328,"line":361},[326,1996,1966],{"class":1965},[326,1998,1999],{"class":503},"libraries",[326,2001,1972],{"class":1965},[326,2003,2004,2007,2009,2012,2015,2017,2019,2021,2023,2026,2029,2031,2034,2036,2038,2041,2043],{"class":328,"line":371},[326,2005,2006],{"class":336},"openfeature-provider ",[326,2008,355],{"class":1965},[326,2010,2011],{"class":1965}," {",[326,2013,2014],{"class":336}," module ",[326,2016,355],{"class":1965},[326,2018,1982],{"class":1192},[326,2020,252],{"class":606},[326,2022,1775],{"class":1192},[326,2024,2025],{"class":1965},",",[326,2027,2028],{"class":336}," version",[326,2030,221],{"class":1965},[326,2032,2033],{"class":336},"ref ",[326,2035,355],{"class":1965},[326,2037,1982],{"class":1192},[326,2039,2040],{"class":606},"configdirector-openfeature",[326,2042,1775],{"class":1192},[326,2044,1456],{"class":1965},[1853,2046,2047],{},"html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":322,"searchDepth":340,"depth":340,"links":2049},[],{},"\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Finstall",{"description":322},"_partials\u002Fsdks\u002Fopenfeature-android\u002Finstall","FQk7kTklaOLzJqmR2iydXWiXVblwbaKuGhSqaE-Kjtc",{"id":2056,"title":2057,"body":2058,"description":322,"extension":1871,"meta":2173,"navigation":6,"path":2174,"seo":2175,"stem":2176,"__hash__":2177},"partials\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Fconfigure.md","Configure",{"type":188,"value":2059,"toc":2171},[2060,2168],[316,2061,2063],{"className":318,"code":2062,"filename":703,"language":321,"meta":322,"style":322},"import com.configdirector.openfeature.ConfigDirectorProvider\nimport dev.openfeature.kotlin.sdk.ImmutableContext\nimport dev.openfeature.kotlin.sdk.OpenFeatureAPI\n\n\u002F\u002F Creating the provider makes no network calls. It throws only when the SDK key is\n\u002F\u002F blank or an option holds an unusable value.\nval provider = ConfigDirectorProvider(applicationContext, \"YOUR-CLIENT-SDK-KEY\")\n\n\u002F\u002F Connects and waits until config values are received, or until it times out.\n\u002F\u002F After a timeout the provider keeps trying to connect in the background.\nOpenFeatureAPI.setProviderAndWait(provider, ImmutableContext(targetingKey = \"user-123\"))\n\nval client = OpenFeatureAPI.getClient()\n",[250,2064,2065,2071,2077,2083,2087,2092,2097,2114,2118,2123,2128,2148,2152],{"__ignoreMap":322},[326,2066,2067,2069],{"class":328,"line":329},[326,2068,500],{"class":354},[326,2070,511],{"class":503},[326,2072,2073,2075],{"class":328,"line":340},[326,2074,500],{"class":354},[326,2076,518],{"class":503},[326,2078,2079,2081],{"class":328,"line":348},[326,2080,500],{"class":354},[326,2082,525],{"class":503},[326,2084,2085],{"class":328,"line":361},[326,2086,386],{"emptyLinePlaceholder":39},[326,2088,2089],{"class":328,"line":371},[326,2090,2091],{"class":1406},"\u002F\u002F Creating the provider makes no network calls. It throws only when the SDK key is\n",[326,2093,2094],{"class":328,"line":377},[326,2095,2096],{"class":1406},"\u002F\u002F blank or an option holds an unusable value.\n",[326,2098,2099,2101,2103,2105,2107,2110,2112],{"class":328,"line":383},[326,2100,727],{"class":354},[326,2102,589],{"class":336},[326,2104,355],{"class":354},[326,2106,594],{"class":332},[326,2108,2109],{"class":336},"(applicationContext, ",[326,2111,607],{"class":606},[326,2113,610],{"class":336},[326,2115,2116],{"class":328,"line":389},[326,2117,386],{"emptyLinePlaceholder":39},[326,2119,2120],{"class":328,"line":396},[326,2121,2122],{"class":1406},"\u002F\u002F Connects and waits until config values are received, or until it times out.\n",[326,2124,2125],{"class":328,"line":404},[326,2126,2127],{"class":1406},"\u002F\u002F After a timeout the provider keeps trying to connect in the background.\n",[326,2129,2130,2132,2134,2137,2140,2142,2144,2146],{"class":328,"line":415},[326,2131,818],{"class":336},[326,2133,458],{"class":332},[326,2135,2136],{"class":336},"(provider, ",[326,2138,2139],{"class":332},"ImmutableContext",[326,2141,628],{"class":336},[326,2143,355],{"class":354},[326,2145,633],{"class":606},[326,2147,636],{"class":336},[326,2149,2150],{"class":328,"line":420},[326,2151,386],{"emptyLinePlaceholder":39},[326,2153,2154,2156,2159,2161,2164,2166],{"class":328,"line":639},[326,2155,727],{"class":354},[326,2157,2158],{"class":336}," client ",[326,2160,355],{"class":354},[326,2162,2163],{"class":336}," OpenFeatureAPI.",[326,2165,1501],{"class":332},[326,2167,577],{"class":336},[1853,2169,2170],{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":322,"searchDepth":340,"depth":340,"links":2172},[],{},"\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Fconfigure",{"description":322},"_partials\u002Fsdks\u002Fopenfeature-android\u002Fconfigure","SdmjRDB5Ml1LGZG--RJn84OBZqHa3TbrPdfBnfKfN0A",{"id":2179,"title":2180,"body":2181,"description":322,"extension":1871,"meta":2245,"navigation":6,"path":2246,"seo":2247,"stem":2248,"__hash__":2249},"partials\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Fsimple-usage.md","Simple Usage",{"type":188,"value":2182,"toc":2243},[2183,2240],[316,2184,2186],{"className":318,"code":2185,"filename":953,"language":321,"meta":322,"style":322},"val booleanValue = client.getBooleanValue(\"my-config-key\", false)\n\nval stringValue = client.getStringValue(\"my-string-config-key\", \"Default\")\n",[250,2187,2188,2211,2215],{"__ignoreMap":322},[326,2189,2190,2192,2195,2197,2199,2201,2203,2205,2207,2209],{"class":328,"line":329},[326,2191,727],{"class":354},[326,2193,2194],{"class":336}," booleanValue ",[326,2196,355],{"class":354},[326,2198,978],{"class":336},[326,2200,863],{"class":332},[326,2202,597],{"class":336},[326,2204,1163],{"class":606},[326,2206,603],{"class":336},[326,2208,1169],{"class":1168},[326,2210,610],{"class":336},[326,2212,2213],{"class":328,"line":340},[326,2214,386],{"emptyLinePlaceholder":39},[326,2216,2217,2219,2222,2224,2226,2228,2230,2233,2235,2238],{"class":328,"line":348},[326,2218,727],{"class":354},[326,2220,2221],{"class":336}," stringValue ",[326,2223,355],{"class":354},[326,2225,978],{"class":336},[326,2227,873],{"class":332},[326,2229,597],{"class":336},[326,2231,2232],{"class":606},"\"my-string-config-key\"",[326,2234,603],{"class":336},[326,2236,2237],{"class":606},"\"Default\"",[326,2239,610],{"class":336},[1853,2241,2242],{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":322,"searchDepth":340,"depth":340,"links":2244},[],{},"\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Fsimple-usage",{"description":322},"_partials\u002Fsdks\u002Fopenfeature-android\u002Fsimple-usage","nHW1iwhGlScTNy-eolkYZldhBRESDiivev0YmfFNxFQ",{"id":2251,"title":2252,"body":2253,"description":322,"extension":1871,"meta":2398,"navigation":6,"path":2399,"seo":2400,"stem":2401,"__hash__":2402},"partials\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Fuser-context.md","User Context",{"type":188,"value":2254,"toc":2396},[2255,2393],[316,2256,2258],{"className":318,"code":2257,"filename":953,"language":321,"meta":322,"style":322},"import dev.openfeature.kotlin.sdk.ImmutableContext\nimport dev.openfeature.kotlin.sdk.OpenFeatureAPI\nimport dev.openfeature.kotlin.sdk.Value\n\nOpenFeatureAPI.setEvaluationContextAndWait(\n    ImmutableContext(\n        targetingKey = \"12345\", \u002F\u002F In OpenFeature, the targeting key represents the context's user ID\n        attributes = mapOf(\n            \"name\" to Value.String(\"Example User\"),\n            \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n            \"traits\" to Value.Structure(mapOf(\"region\" to Value.String(\"North America\"))),\n        ),\n    ),\n)\n",[250,2259,2260,2266,2272,2278,2282,2290,2297,2312,2324,2343,2348,2379,2384,2389],{"__ignoreMap":322},[326,2261,2262,2264],{"class":328,"line":329},[326,2263,500],{"class":354},[326,2265,518],{"class":503},[326,2267,2268,2270],{"class":328,"line":340},[326,2269,500],{"class":354},[326,2271,525],{"class":503},[326,2273,2274,2276],{"class":328,"line":348},[326,2275,500],{"class":354},[326,2277,962],{"class":503},[326,2279,2280],{"class":328,"line":361},[326,2281,386],{"emptyLinePlaceholder":39},[326,2283,2284,2286,2288],{"class":328,"line":371},[326,2285,818],{"class":336},[326,2287,1655],{"class":332},[326,2289,736],{"class":336},[326,2291,2292,2295],{"class":328,"line":377},[326,2293,2294],{"class":332},"    ImmutableContext",[326,2296,736],{"class":336},[326,2298,2299,2302,2304,2307,2309],{"class":328,"line":383},[326,2300,2301],{"class":336},"        targetingKey ",[326,2303,355],{"class":354},[326,2305,2306],{"class":606}," \"12345\"",[326,2308,603],{"class":336},[326,2310,2311],{"class":1406},"\u002F\u002F In OpenFeature, the targeting key represents the context's user ID\n",[326,2313,2314,2317,2319,2322],{"class":328,"line":389},[326,2315,2316],{"class":336},"        attributes ",[326,2318,355],{"class":354},[326,2320,2321],{"class":332}," mapOf",[326,2323,736],{"class":336},[326,2325,2326,2329,2332,2335,2337,2340],{"class":328,"line":396},[326,2327,2328],{"class":606},"            \"name\"",[326,2330,2331],{"class":336}," to Value.",[326,2333,2334],{"class":332},"String",[326,2336,597],{"class":336},[326,2338,2339],{"class":606},"\"Example User\"",[326,2341,2342],{"class":336},"),\n",[326,2344,2345],{"class":328,"line":404},[326,2346,2347],{"class":1406},"            \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n",[326,2349,2350,2353,2355,2357,2359,2362,2364,2367,2369,2371,2373,2376],{"class":328,"line":415},[326,2351,2352],{"class":606},"            \"traits\"",[326,2354,2331],{"class":336},[326,2356,991],{"class":332},[326,2358,597],{"class":336},[326,2360,2361],{"class":332},"mapOf",[326,2363,597],{"class":336},[326,2365,2366],{"class":606},"\"region\"",[326,2368,2331],{"class":336},[326,2370,2334],{"class":332},[326,2372,597],{"class":336},[326,2374,2375],{"class":606},"\"North America\"",[326,2377,2378],{"class":336},"))),\n",[326,2380,2381],{"class":328,"line":420},[326,2382,2383],{"class":336},"        ),\n",[326,2385,2386],{"class":328,"line":639},[326,2387,2388],{"class":336},"    ),\n",[326,2390,2391],{"class":328,"line":644},[326,2392,610],{"class":336},[1853,2394,2395],{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":322,"searchDepth":340,"depth":340,"links":2397},[],{},"\u002F_partials\u002Fsdks\u002Fopenfeature-android\u002Fuser-context",{"description":322},"_partials\u002Fsdks\u002Fopenfeature-android\u002Fuser-context","uwtF_6ovLMBoqiVvs0wLCPNppQat70-lhudbLRRvm94",1790058107259]