package Ġcom . min ar . bir day . activities Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Audio Attributes . Builder Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os .* Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Navigation Ċ import Ġandroidx . navigation . ui . setup With Nav Controller Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġcom . af ol le st ad . material dialogs . Layout Mode Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . Which Button Ċ import Ġcom . af ol le st ad . material dialogs . actions . getAction Button Ċ import Ġcom . af ol le st ad . material dialogs . bottom sheets . Bottom Sheet Ċ import Ġcom . af ol le st ad . material dialogs . custom view . custom View Ċ import Ġcom . af ol le st ad . material dialogs . custom view . get Custom View Ċ import Ġcom . af ol le st ad . material dialogs . datetime . date Picker Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . google . android . material . switch material . Switch Material Ċ import Ġcom . min ar . bir day . R Ċ import Ġcom . min ar . bir day . adapters . Event Adapter Ċ import Ġcom . min ar . bir day . backup . B ir day Importer Ċ import Ġcom . min ar . bir day . backup . Contacts Importer Ċ import Ġcom . min ar . bir day . model . Event Ċ import Ġcom . min ar . bir day . utilities . App R ater Ċ import Ġcom . min ar . bir day . utilities . check String Ċ import Ġcom . min ar . bir day . utilities . smart Capital ize Ċ import Ġcom . min ar . bir day . view models . Home ViewModel Ċ import Ġkotlinx . android . synt hetic . main . dialog _ insert _ event . view .* Ċ import Ġjava . io . IOException Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . time . format . Format Style Ċ import Ġjava . util .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġhome ViewModel : ĠHome ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠEvent Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Prefs : ĠSharedPreferences ĊĊĠĠĠ Ġ@ Experimental Std lib Api ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġhome ViewModel Ġ= ĠViewModel Provider ( this ). get ( Home ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġshared Prefs Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠEvent Adapter ( null ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġnotification Ġchannel Ġand Ġcheck Ġthe Ġpermission Ġ( note : Ġapp Intro Ġ 6 . 0 Ġis Ġstill Ġbug gy , Ġbetter Ġavoid Ġto Ġuse Ġit Ġfor Ġasking Ġpermissions ) ĊĠĠĠĠĠĠĠ Ġask Contacts Permission () ĊĠĠĠĠĠĠĠ Ġcreate Notification Channel () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġthe Ġshared Ġpreferences ĊĠĠĠĠĠĠĠ Ġval Ġshared Prefs Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġshared Prefs . getString (" theme _ color ", Ġ" system ") ĊĠĠĠĠĠĠĠ Ġval Ġaccent Ġ= Ġshared Prefs . getString (" accent _ color ", Ġ" brown ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe Ġintroduction Ġfor Ġthe Ġfirst Ġlaunch ĊĠĠĠĠĠĠĠ Ġif Ġ( shared Prefs . getBoolean (" first ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġshared Prefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . put Boolean (" first ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠWelcome Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġbase Ġtheme Ġand Ġthe Ġaccent ĊĠĠĠĠĠĠĠ Ġwhen Ġ( theme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dark " Ġ-> ĠAppCompat Delegate . setDefault Night Mode ( AppCompat Delegate . MODE _ N IGHT _ YES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" light " Ġ-> ĠAppCompat Delegate . setDefault Night Mode ( AppCompat Delegate . MODE _ N IGHT _ NO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" system " Ġ-> ĠAppCompat Delegate . setDefault Night Mode ( AppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( accent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" blue " Ġ-> Ġset Theme ( R . style . App Theme _ Blue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" green " Ġ-> Ġset Theme ( R . style . App Theme _ Green ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" orange " Ġ-> Ġset Theme ( R . style . App Theme _ Orange ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" yellow " Ġ-> Ġset Theme ( R . style . App Theme _ Yellow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" teal " Ġ-> Ġset Theme ( R . style . App Theme _ Te al ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" vio let " Ġ-> Ġset Theme ( R . style . App Theme _ V io let ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pink " Ġ-> Ġset Theme ( R . style . App Theme _ P ink ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" light Blue " Ġ-> Ġset Theme ( R . style . App Theme _ Light Blue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" red " Ġ-> Ġset Theme ( R . style . App Theme _ Red ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" lime " Ġ-> Ġset Theme ( R . style . App Theme _ L ime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" cri ms on " Ġ-> Ġset Theme ( R . style . App Theme _ Cri ms on ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġbottom Ġnavigation Ġbar Ġand Ġconfigure Ġit Ġfor Ġthe Ġnavigation Ġplugin ĊĠĠĠĠĠĠĠ Ġval Ġnavigation Ġ= ĠfindViewById < Bottom Navigation View >( R . id . navigation ) ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller : ĠNav Controller Ġ= ĠNavigation . find Nav Controller ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav Host Fragment ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġnavigation . setup With Nav Controller ( nav Controller ) ĊĠĠĠĠĠĠĠ Ġnavigation . setOn Navigation Item Re selected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġignore Ġthe Ġre selection Ġof Ġthe Ġsame Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRating Ġstuff ĊĠĠĠĠĠĠĠ ĠApp R ater . app La unched ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠManage Ġthe Ġfab ĊĠĠĠĠĠĠĠ Ġval Ġfab Ġ= ĠfindViewById < Floating ActionButton >( R . id . fab ) ĊĠĠĠĠĠĠĠ Ġfab . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġa Ġbottom Ġsheet Ġcontaining Ġthe Ġform Ġto Ġinsert Ġa Ġnew Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Value Ġ Ġ= Ġ" error " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs urname Value Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġevent Date Value : ĠLocalDate Ġ= ĠLocalDate . of ( 1 9 7 0 , 1 , 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Year Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠMaterial Dialog ( this , ĠBottom Sheet ( Layout Mode . WRAP _ CONTENT )). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius ( res Ġ= ĠR . dim en . rounded _ corners ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( R . string . new _ event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon ( R . drawable . ic _ party _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( R . string . new _ event _ description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom View ( R . layout . dialog _ insert _ event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( R . string . insert _ event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġthe Ġdata Ġto Ġcreate Ġa Ġevent Ġobject Ġand Ġinsert Ġit Ġin Ġthe Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtuple Ġ= ĠEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 0 , Ġoriginal Date Ġ= Ġevent Date Value , Ġname Ġ= Ġname Value . smart Capital ize (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs urname Ġ= Ġs urname Value . smart Capital ize (), Ġyear Mat ter Ġ= Ġcount Year Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġusing Ġanother Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Ġ= ĠThread Ġ{ Ġhome ViewModel . insert ( tuple ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button ( R . string . cancel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup Ġlisteners Ġand Ġchecks Ġon Ġthe Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . getAction Button ( Which Button . POSITIVE ). isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom View Ġ= Ġdialog . get Custom View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcustom View . findViewById < TextView >( R . id . name Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs urname Ġ= Ġcustom View . findViewById < TextView >( R . id . surname Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Date Ġ= Ġcustom View . findViewById < TextView >( R . id . date Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Year Ġ= Ġcustom View . findViewById < Switch Material >( R . id . count Year Switch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendDate Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatter : ĠDateTime Formatter Ġ= ĠDateTime Formatter . of Localized Date ( Format Style . MEDIUM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdate Dialog : ĠMaterial Dialog ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Ġautomatically Ġshow Ġthe Ġlast Ġselected Ġdate , Ġparse Ġit Ġto Ġanother ĠCalendar Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Date Ġ= ĠCalendar . getInstance () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġboolean Ġvalue Ġon Ġeach Ġclick ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Year . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Year Value Ġ= Ġis Checked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Date . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrevent Ġdouble Ġdialog s Ġon Ġfast Ġclick ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( date Dialog Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Dialog Ġ= ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Picker ( max Date Ġ= ĠendDate , Ġcurrent Date Ġ= Ġlast Date ) Ġ{ Ġ_, Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġdate . get ( Calendar . YEAR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmonth Ġ= Ġdate . get ( Calendar . MONTH ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Ġ= Ġdate . get ( Calendar . DAY _ OF _ MONTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Date Value Ġ= ĠLocalDate . of ( year , Ġmonth , Ġday ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Date . text Ġ= Ġevent Date Value . format ( formatter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġok Ġis Ġpressed , Ġthe Ġlast Ġselected Ġdate Ġis Ġsaved Ġif Ġthe Ġdialog Ġis Ġreopen ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Date . set ( year , Ġmonth Ġ- Ġ 1 , Ġday ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ Ġdate Dialog Ġ= Ġnull Ġ}, Ġ 7 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValidate Ġeach Ġfield Ġin Ġthe Ġform Ġwith Ġthe Ġsame Ġwatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Correct Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs urname Correct Ġ= Ġtrue Ġ// ĠS urname Ġis Ġnot Ġmandatory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġevent Date Correct Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwatcher Ġ= Ġobject : ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditable Ġ=== Ġname . editable Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Text Ġ= Ġname . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Text . isBlank () Ġ|| Ġ! check String ( name Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetting Ġthe Ġerror Ġon Ġthe Ġlayout Ġis Ġimportant Ġto Ġmake Ġthe Ġproperties Ġwork . ĠKotlin Ġsynt het ics Ġare Ġbeing Ġused Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom View . name Event Layout . error Ġ= ĠgetString ( R . string . invalid _ value _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . getAction Button ( Which Button . POSITIVE ). isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Correct Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Value Ġ= Ġname Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom View . name Event Layout . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Correct Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditable Ġ=== Ġs urname . editable Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs urname Text Ġ= Ġs urname . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check String ( surname Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetting Ġthe Ġerror Ġon Ġthe Ġlayout Ġis Ġimportant Ġto Ġmake Ġthe Ġproperties Ġwork . ĠKotlin Ġsynt het ics Ġare Ġbeing Ġused Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom View . surname Event Layout . error Ġ= ĠgetString ( R . string . invalid _ value _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . getAction Button ( Which Button . POSITIVE ). isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs urname Correct Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs urname Value Ġ= Ġs urname Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom View . surname Event Layout . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs urname Correct Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnce Ġselected , Ġthe Ġdate Ġcan 't Ġbe Ġblank Ġanymore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditable Ġ=== Ġevent Date . editable Text Ġ-> Ġevent Date Correct Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( event Date Correct Ġ&& Ġname Correct Ġ&& Ġs urname Correct ) Ġdialog . getAction Button ( Which Button . POSITIVE ). isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . add TextChanged Listener ( watcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs urname . add TextChanged Listener ( watcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Date . add TextChanged Listener ( watcher ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreate Ġthe ĠNotification Channel . ĠWhen Ġcreated Ġthe Ġfirst Ġtime , Ġthis Ġcode Ġdoes Ġnothing ĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsound Uri Ġ= ĠUri . parse ( Content Resolver . SCHEME _ ANDROID _ RESOURCE Ġ+ Ġ" ://" Ġ+ Ġapplication Context . packageName Ġ+ Ġ"/" Ġ+ ĠR . raw . bir day _ notification ) ĊĠĠĠĠĠĠĠ Ġval Ġattributes : ĠAudio Attributes Ġ= ĠBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ NOTIFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠgetString ( R . string . events _ notification _ channel ) ĊĠĠĠĠĠĠĠ Ġval Ġdescription Text Ġ= ĠgetString ( R . string . events _ channel _ description ) ĊĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= ĠNotification Manager . IMPORT ANCE _ HIGH ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel (" events _ channel ", Ġname , Ġimportance ). apply Ġ{ Ġdescription Ġ= Ġdescription Text Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠAdditional Ġtuning Ġover Ġsound , Ġvi br ation Ġand Ġnotification Ġlight ĊĠĠĠĠĠĠĠ Ġchannel . set Sound ( sound Uri , Ġattributes ) ĊĠĠĠĠĠĠĠ Ġchannel . enable Lights ( true ) ĊĠĠĠĠĠĠĠ Ġchannel . light Color Ġ= ĠColor . GREEN ĊĠĠĠĠĠĠĠ Ġchannel . enable V ibration ( true ) ĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġthe Ġchannel Ġwith Ġthe Ġsystem ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager : ĠNotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠChoose Ġa Ġbackup Ġregistering Ġa Ġcallback Ġand Ġfollowing Ġthe Ġlatest Ġguidelines ĊĠĠĠ Ġval Ġselect Backup Ġ= Ġregister For Activity Result ( Activity Result Contracts . Get Content ()) Ġ Ġ{ Ġfile Uri : ĠUri ? Ġ-> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbir day Importer Ġ= ĠBir day Importer ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Uri Ġ!= Ġnull ) Ġbir day Importer . import Birth days ( this , Ġfile Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠSome Ġutility Ġfunctions , Ġused Ġfrom Ġevery Ġfragment Ġconnected Ġto Ġthis Ġactivity ĊĊĠĠĠ Ġ// ĠV ibrate Ġusing Ġa Ġstandard Ġvi br ation Ġpattern ĊĠĠĠ Ġfun Ġvi br ate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv ib Ġ= Ġthis . getSystem Service ( Context . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠ Ġif Ġ( shared Prefs . getBoolean (" vi br ation ", Ġtrue )) Ġ// ĠV ibrate Ġif Ġthe Ġvi br ation Ġin Ġoptions Ġis Ġset Ġto Ġon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ib . vi br ate ( V ibration Effect . create One Shot ( 3 0 , ĠV ibration Effect . DEFAULT _ AMP LIT UDE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAsk Ġcontacts Ġpermission ĊĠĠĠ Ġfun Ġask Contacts Permission ( code : ĠInt Ġ= Ġ 1 0 1 ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Context Compat . check Self Permission ( this , ĠManifest . permission . READ _ CONTACT S ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . READ _ CONTACT S ), Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠManifest . permission . READ _ CONTACT S ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠManage Ġuser Ġresponse Ġto Ġpermission Ġrequests ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code Ġ: ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ){ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠContact s Ġat Ġstartup ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale ( Manifest . permission . READ _ CONTACT S )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠgetString ( R . string . missing _ permission _ contacts ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠToast . makeText ( this , ĠgetString ( R . string . missing _ permission _ contacts _ fore ver ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠContact s Ġwhile Ġtrying Ġto Ġimport ĠGoogle Ġcontacts ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale ( Manifest . permission . READ _ CONTACT S )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠgetString ( R . string . missing _ permission _ contacts ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠToast . makeText ( this , ĠgetString ( R . string . missing _ permission _ contacts _ fore ver ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Importer Ġ= ĠContact s Importer ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact Importer . import Contacts ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ