package Ġcom . h awesome . ble config . view . main Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . cl j . fast ble . data . B le Device Ċ import Ġcom . h awesome . ble config . R Ċ import Ġcom . h awesome . ble config . ext . show Toast Ċ import Ġcom . h awesome . ble config . ext . startActivity Ċ import Ġcom . h awesome . ble config . ext . to Res Drawable Ċ import Ġcom . h awesome . ble config . kit . Bluetooth Kit Ċ import Ġcom . h awesome . ble config . kit . Tag Kit Ċ import Ġcom . h awesome . ble config . model . XS Location Ċ import Ġcom . h awesome . ble config . view . config . Config Activity Ċ import Ġcom . h awesome . ble connector . view . main . Main ViewModel Ċ import Ġcom . u uz uc he . lib _ zx ing . activity . Capture Activity Ċ import Ġcom . u uz uc he . lib _ zx ing . activity . Code Utils Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . android . synt hetic . main . item _ button .* Ċ import Ġpermissions . dispatcher .* ĊĊ Ċ /* Ċ * ĠåĪĿå§ĭåĮĸ é¡µéĿ¢ ï¼Į éļĲèĹı çĬ¶æĢģ æłı ï¼Į æĿĥéĻĲ çĶ³è¯· Ċ * Ġ è®¢ éĺħ èĵĿ çī Ļ ä¸Ńå¿ĥ ï¼ļ â ĳ ł åıĳçİ° åı¯çĶ¨ èĵĿ çī Ļ åĪĹè¡¨ ï¼Ľ â ĳ ¡ è¯·æ±Ĥ éĵ¾æİ¥ çļĦ èĵĿ çī Ļ çĬ¶æĢģ Ċ * ĠåĪĿå§ĭåĮĸ åĲİ é©¬ ä¸Ĭ å¼Ģå§ĭ æī«æıı èĵĿ çī Ļ Ċ * Ġ çĤ¹åĩ» è®¾å¤ĩ åĪĹè¡¨ / æī« çłģ è¿ŀæİ¥ èĵĿ çī Ļ Ċ * Ġä¸ĭ æĭī åĪ·æĸ° ï¼Į éĩįæĸ° æī«æıı èĵĿ çī Ļ è®¾å¤ĩ Ċ * Ġ*/ Ċ Ċ @ Runtime Permissions Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ SCAN Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdevice List Ġ= Ġmutable ListOf < B le Device >() ĊĠĠĠ Ġprivate Ġval Ġdevice Adapter Ġ= ĠDevice Adapter () ĊĠĠĠ Ġprivate Ġvar Ġconnecting Progress : ĠProgress Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Provider ( this ). get ( Main ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġ// åı¯çĶ¨ è®¾å¤ĩ åĪĹè¡¨ ĊĠĠĠĠĠĠĠ Ġdevice Recycler . layout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġdevice Recycler . adapter Ġ= Ġdevice Adapter ĊĠĠĠĠĠĠĠ Ġ// ä¸ĭ æĭī åĪ·æĸ° ï¼Ī æī«æıı ï¼ī ĊĠĠĠĠĠĠĠ Ġswipe Refresh . setColor Scheme Resources ( R . color . red _ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġswipe Refresh . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Devices With Permission Check () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// éļĲèĹı çĬ¶æĢģ æłı ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. hide () ĊĠĠĠĠĠĠĠ Ġwindow . set Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ LAYOUT _ NO _ LIMIT S , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ LAYOUT _ NO _ LIMIT S ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġscan Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Camera Permission With Permission Check () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// æīĵå¼Ģ å®ĺ ç½ĳ ĊĠĠĠĠĠĠĠ Ġupdate Image . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . data Ġ= ĠUri . parse (" http :// s . eds . ink / download / fac on fig ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// èĵĿ çī Ļ çĬ¶æĢģ è®¢ éĺħ ĊĠĠĠĠĠĠĠ ĠBluetooth Kit . ble Device LiveData . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . ble Device List . observe ( this ) Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Progress . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . connect Result . observe ( this @ MainActivity ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . get OrNull () Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿ŀæİ¥ æĪĲåĬŁ : åĪĿå§ĭåĮĸ å·¥åħ· ç±» ï¼Į è·³è½¬ è®¾å¤ĩ é¡µ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= ĠviewModel . connect LiveData . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠBluetooth Kit . get DeviceType ( device . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTag Kit . on Connected ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity < Config Activity >( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . putExtra ( Config Activity . EXT _ DEVICE , Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . blue _ connect _ failure . show Toast () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnecting Progress ?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscan Devices With Permission Check () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Needs Permission ( ĊĠĠĠĠĠĠĠ ĠManifest . permission . BL U ETO OTH , ĊĠĠĠĠĠĠĠ ĠManifest . permission . BL U ETO OTH _ ADMIN , ĊĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION , ĊĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġscan Devices () Ġ{ ĊĠĠĠĠĠĠĠ ĠBluetooth Kit . open () ĊĠĠĠĠĠĠĠ Ġval Ġt int Color Ġ= Ġget Color ( R . color . bluetooth _ on ) ĊĠĠĠĠĠĠĠ Ġbluetooth Text . setText ( R . string . blue _ on ) ĊĠĠĠĠĠĠĠ Ġbluetooth Text . setTextColor ( tint Color ) ĊĠĠĠĠĠĠĠ Ġbluetooth Image . drawable . set Tint ( tint Color ) ĊĊĠĠĠĠĠĠĠ ĠX S Location . check In Region ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Progress . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Needs Permission ( Manifest . permission . CAMERA , ĠManifest . permission . V IB RATE ) ĊĠĠĠ Ġfun Ġcheck Camera Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠCapture Activity :: class . java ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠREQUEST _ SCAN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ!= ĠREQUEST _ SCAN Ġ|| Ġdata Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbundle : ĠBundle Ġ= Ġdata . get Extras () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( bundle . getInt ( Code Utils . RESULT _ TYPE ) Ġ!= ĠCode Utils . RESULT _ SUCCESS ) Ġreturn ĊĠĠĠĠĠĠĠ Ġbundle . getString ( Code Utils . RESULT _ STRING )?. let Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List . first OrNull Ġ{ Ġinfo . contains ( it . name ) Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( it , Ġscan Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠR . string . scan _ fail . show Toast () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnect ( ble Device : ĠB le Device , ĠprogressBar : ĠProgress Bar ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . connect ( ble Device ) ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġconnecting Progress Ġ= ĠprogressBar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠDevice Adapter Ġ: ĠRecyclerView . Adapter < Device Adapter . ViewHolder >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Image Ġ= ĠitemView . findViewById < ImageView >( R . id . device Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Name Ġ= ĠitemView . findViewById < TextView >( R . id . device Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Progress Ġ= ĠitemView . findViewById < ProgressBar >( R . id . device Progress ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemView Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . item _ device , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Ġ= ĠViewHolder ( item View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġdevice List [ holder . adapter Position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect ( device , Ġholder . device Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġholder ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġble Name Ġ= Ġdevice List [ position ]. name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Type Ġ= ĠBluetooth Kit . get DeviceType ( ble Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . device Image . setImage Drawable ( device Type . to Res Drawable ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . device Name . setText ( ble Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġdevice List . size ĊĠĠĠ Ġ} Ċ Ċ }