package Ġdev . mar cel p into . permission k tx . compose Ċ Ċ import Ġandroidx . activity . result . launch Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . text . Keyboard Options Ċ import Ġandroidx . compose . material .* Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . rounded . Call Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . runtime . saved instance state . savedInstanceState Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . text . input . Keyboard Type Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . sp Ċ import Ġdev . mar cel p into . permission k tx . Permission Request Ċ import Ġdev . mar cel p into . permission k tx . get Permission Status Ċ import Ġdev . mar cel p into . permission k tx . observe Permission Status Ċ Ċ @ Composable Ċ fun ĠCompose Permission Screen ( ĊĠĠĠ ĠphoneNumber : ĠMutable State < String >, ĊĠĠĠ Ġpermission Request : ĠPermission Request , ĊĠĠĠ Ġon Call : Ġ( String ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠCollect Ġthe Ġpermission Ġstatus Ġwith ĠCompose Ġcollect As State Ġextension ĊĠĠĠ Ġval Ġcall Permission Ġby Ġpermission Request . name . observe Permission Status (). collect As State ( ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġpermission Request . name . get Permission Status () ĊĠĠĠ Ġ) ĊĠĠĠ Ġvar Ġopen Rational Ġby ĠsavedInstanceState Ġ{ Ġfalse Ġ} ĊĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize (). padding ( 2 4 . dp ), ĊĠĠĠĠĠĠĠ Ġhorizontal Alignment Ġ= ĠAlignment . Center H orizontally ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTextField ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠphoneNumber . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ ĠphoneNumber . value Ġ= Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ{ ĠText ( text Ġ= Ġ" Phone Ġnumber ") Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder Ġ= Ġ{ ĠText ( text Ġ= Ġ" Who Ġto Ġcall Ġtoday ?") Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Options Ġ= ĠKeyboard Options ( keyboard Type Ġ= ĠKeyboard Type . Phone ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġpermission Ġis Ġnot Ġgranted Ġwe Ġcan Ġshow Ġa Ġsmall Ġhint ĊĠĠĠĠĠĠĠ Ġif Ġ(! call Permission . is Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Call Ġpermission Ġrequired ", Ġcolor Ġ= ĠColor . M agenta , ĠfontSize Ġ= Ġ 1 2 . sp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFloating ActionButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( 1 6 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġcalling Ġwe Ġcan Ġuse Ġthe Ġsafe Ġlaunch Ġto Ġfollow Ġthe Ġpermission Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġcase Ġthere Ġis Ġa Ġneed Ġfor Ġfurther Ġexplanation Ġwe Ġcan Ġopen Ġthe Ġr ational Ġdialog ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġwas Ġalready Ġgranted Ġsimply Ġinvoke Ġthe Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Request . safe Launch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Require Rational Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Rational Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Already Granted Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call ( phoneNumber . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĠIcon ( Icons . Rounded . Call ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( open Rational ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dismiss Request Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Rational Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Permission Ġrequired Ġto Ġcall ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" In Ġorder Ġto Ġestablish Ġthe Ġcall Ġwe Ġrequire Ġthe Ġ\" Call \" Ġpermission .\ n Please Ġgrant Ġit Ġto Ġcontinue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfirm Button Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Rational Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġuser Ġconfirm Ġthe Ġr ational Ġthen Ġlaunch Ġdirectly Ġthe Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġwith Ġthe Ġlaunch Ġextension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Request . launch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" Continue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Button Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton ( onClick Ġ= Ġ{ Ġopen Rational Ġ= Ġfalse Ġ}, Ġcontent Ġ= Ġ{ ĠText (" Not Ġnow ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ