/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠAnd re - max Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . andre _ max . tik tok clone . presentation . ui . upload . record Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . andre _ max . tik tok clone . R Ċ import Ġcom . andre _ max . tik tok clone . databinding . Fragment Record Video Binding Ċ import Ġcom . andre _ max . tik tok clone . utils . Bottom Nav View Utils . hide Bottom NavBar Ċ import Ġcom . andre _ max . tik tok clone . utils . Bottom Nav View Utils . show Bottom NavBar Ċ import Ġcom . andre _ max . tik tok clone . utils . Permission Utils Ċ import Ġcom . andre _ max . tik tok clone . utils . Permission Utils . are Permissions Granted Ċ import Ġcom . andre _ max . tik tok clone . utils . Permission Utils . record Video Permissions Ċ import Ġcom . andre _ max . tik tok clone . utils . System Bar Colors Ċ import Ġcom . andre _ max . tik tok clone . utils . View Utils . change System Bars Ċ import Ġcom . andre _ max . tik tok clone . utils . View Utils . hide Status And NavBar Ċ import Ġcom . andre _ max . tik tok clone . utils . View Utils . show Status And NavBar Ċ import Ġcom . andre _ max . tik tok clone . utils . architecture . Base Fragment Ċ import Ġcom . otal i ast ud ios . cam er av iew . Camera View Ċ import Ġcom . otal i ast ud ios . cam er av iew . controls . Audio Ċ import Ġcom . otal i ast ud ios . cam er av iew . controls . Facing Ċ import Ġcom . otal i ast ud ios . cam er av iew . controls . Flash Ċ import Ġcom . otal i ast ud ios . cam er av iew . controls . Mode Ċ import Ġcom . otal i ast ud ios . cam er av iew . gesture . Gesture Ċ import Ġcom . otal i ast ud ios . cam er av iew . gesture . Gesture Action Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠRecord Video Fragment Ġ: ĠBase Fragment ( R . layout . fragment _ record _ video ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Record Video Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera View : ĠCamera View ĊĊĠĠĠ Ġoverride Ġval ĠviewModel Ġby Ġview Models < Record Video ViewModel >() ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġcamera View Ġ= Ġbinding . camera View ĊĠĠĠĠĠĠĠ Ġinit Camera View () ĊĠĠĠĠĠĠĠ Ġchange UI Based On Permissions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Camera View () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfacing Ġ= ĠF acing . BACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Ġ= ĠAudio . ON ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= ĠMode . VIDEO ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Camera Listener ( viewModel . get Camera Listener ( require Context ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Gesture ( Gesture . PIN CH , ĠGest ure Action . ZO OM ) Ġ// ĠPin ch Ġto Ġzoom ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Gesture ( Gesture . T AP , ĠGest ure Action . AUTO _ FOCUS ) Ġ// ĠT ap Ġto Ġfocus ! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetUp Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Record Video Binding . bind ( require View ()). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . lifecycle Owner Ġ= Ġview Lifecycle Owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . viewModel Ġ= ĠviewModel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetUp LiveData () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setUp LiveData () ĊĠĠĠĠĠĠĠ ĠviewModel . show Little Space . observe ( view Lifecycle Owner ) Ġ{ Ġhas Little Space Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . little Space Layout . root . visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Little Space ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . local Video . observe ( view Lifecycle Owner ) Ġ{ Ġlocal Video Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Video ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecord Video Fragment Directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. action Record Video Fragment To Preview Video Fragment ( local Video ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Local Video () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetUp Click Listeners () Ġ{ ĊĠĠĠĠĠĠĠ ĠsetUp Camera Settings () ĊĠĠĠĠĠĠĠ ĠsetUp Permission Click Listeners () ĊĠĠĠĠĠĠĠ Ġset Little Space Click Listeners () ĊĊĠĠĠĠĠĠĠ Ġbinding . close Btn . setOnClickListener Ġ{ Ġfind Nav Controller (). pop Back Stack () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . upload Image Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . action _ record Video Fragment _ to _ create Video Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . start Recording Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠResume Ġrecording ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . has Recording Started . value Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . resume Video () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġrecording ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileDescriptor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Video ( require Context ()) Ġ?: Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera View . take Video ( file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . pause Recording Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera View . stop Video () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . pause Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . finish Recording Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . has Recording Started . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera View . stop Video () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . stop Video ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Little Space Click Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . little Space Layout . little Space Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reset Show Little Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Permission Click Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . permissions Layout . grant Permissions Btn . setOnClickListener Ġ{ Ġrequest Permissions () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġturn On Camera Preview () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" turn On Camera Preview Ġcalled ") ĊĠĠĠĠĠĠĠ Ġcamera View . open () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Camera Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . flip Camera Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera View . facing Ġ= Ġif Ġ( camera View . facing Ġ== ĠF acing . FRONT ) ĠF acing . BACK Ġelse ĠF acing . FRONT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . flash Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Flash Off Ġ= Ġcamera View . flash Ġ== ĠFlash . OFF ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera View . flash Ġ= Ġif Ġ( is Flash Off ) ĠFlash . ON Ġelse ĠFlash . OFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . flash Btn . setImage Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Flash Off ) ĠR . drawable . ic _ round _ flash _ on Ġelse ĠR . drawable . ic _ round _ flash _ off ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdialog Multiple Permissions Listener Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPermission Utils . Dialog Multiple Permissions Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġrequire View (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Permissions Granted Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . permissions Layout . root . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn On Camera Preview () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Permissions Denied Ġ= Ġ{ Ġbinding . permissions Layout . root . visibility Ġ= ĠView . VISIBLE Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Permissions () Ġ{ ĊĠĠĠĠĠĠĠ ĠPermission Utils . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Multiple Permissions Listener , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Video Permissions ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange UI Based On Permissions () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( are Permissions Granted ( require Context (), Ġrecord Video Permissions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn On Camera Preview () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange System Bars ( require Activity (), ĠSystem Bar Colors . DARK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Bottom NavBar ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Status And NavBar ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . permissions Layout . root . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Bottom NavBar ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Status And NavBar ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . permissions Layout . root . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġchange UI Based On Permissions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġif Ġ( are Permissions Granted ( require Context (), Ġrecord Video Permissions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Status And NavBar ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera View . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . stop Video ( require Context ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġcamera View . destroy () ĊĠĠĠ Ġ} Ċ }