package Ġcom . ta iko . nob len ote . filesystem Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . ta iko . nob len ote . Pref Ċ import Ġcom . ta iko . nob len ote . R Ċ import Ġcom . ta iko . nob len ote . fragments . Preference Fragment Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* Ġhandles Ġmigration Ġfrom Ġearlier Ġversions Ġof Ġthis Ġapp Ġthat Ġuse Ġabsolute Ġfile Ġpaths Ġinstead Ġof Ġdocument Ġcontent :// Ġur is Ċ Ġ*/ Ċ object ĠLegacy Storage Migration Ġ{ ĊĊĊĠĠĠ Ġprivate Ġvar Ġresolution Required : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlegacy RootPath : ĠString ? Ġ= Ġnull ; ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate From Legacy Storage () Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( Uri . parse ( Pref . rootPath . value ). scheme Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthese Ġandroid Ġversions Ġdo Ġnot Ġuse Ġcontent :// Ġur is Ġin Ġthis Ġapp Ġbut Ġinstead Ġrely Ġon Ġfile :// Ġur is ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Build . VERSION . SDK _ INT Ġ<= ĠBuild . VERSION _ CODES . M ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Legacy FilePath To Uri () Ġ// Ġthis Ġadds Ġthe Ġfile :// Ġscheme Ġto Ġthe Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ// ĠAndroid ĠN Ġand Ġgreater , Ġonly Ġuse Ġfile :// Ġuri Ġfor Ġthe Ġfallback Ġroot Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlegacy Fallback RootPath Ġ= ĠFile ( Pref . context . files Dir . absolute Path ," / nn "). absolute Path ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Pref . rootPath . value Ġ== Ġlegacy Fallback RootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Legacy FilePath To Uri (); Ġ Ġ// Ġthis Ġadds Ġthe Ġfile :// Ġscheme Ġto Ġthe Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ Ġ// Ġuser Ġinteraction Ġrequired , Ġwe Ġwant Ġto Ġmigrate Ġto Ġcontent :// Ġvia Ġthe Ġsystem Ġfile Ġpicker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlegacy RootPath Ġ= ĠPref . rootPath . value ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġactivate Ġthe Ġfallback Ġroot Path Ġjust Ġin Ġcase Ġthe Ġuser Ġcancel s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsystem Ġfile Ġpicker Ġand Ġwe Ġwould Ġend Ġup Ġwith Ġan Ġinvalid Ġroot Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Fallback RootPath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolution Required Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Resolution Dialog If Required ( fragment : ĠFragment ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġmigrate From Legacy Storage (); ĊĊĠĠĠĠĠĠĠ Ġif (! resolution Required ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresolution Required Ġ= Ġfalse ; Ġ// Ġshow Ġdialog Ġonly Ġonce ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( fragment . require Activity ()) ĊĊĠĠĠĠĠĠĠ Ġbuilder . setTitle ( R . string . title _ upgrade _ info ); ĊĊĠĠĠĠĠĠĠ Ġbuilder . setMessage ( fragment . require Activity (). getString ( R . string . msg _ upgrade , Ġlegacy RootPath )); ĊĠĠĠĠĠĠĠ Ġbuilder . set Negative Button ( android . R . string . cancel ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( android . R . string . ok ) Ġ{ Ġdialog , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString ( Preference Fragment . LA UNCH _ SA F _ FOLDER _ P ICK ER , ĠPreference Fragment . LA UNCH _ SA F _ FOLDER _ P ICK ER ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . find Nav Controller (). navigate ( R . id . preference Fragment , bundle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuse Fallback RootPath (){ ĊĠĠĠĠĠĠĠ ĠPref . rootPath . onNext ( Pref . fallback RootPath ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Legacy FilePath To Uri () Ġ{ ĊĠĠĠĠĠĠĠ ĠPref . rootPath . onNext ( File ( Pref . rootPath . value ). to S File (). uri . toString ()); ĊĠĠĠ Ġ} Ċ }