/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . jetbrains . android . refactor ing Ċ Ċ import Ġcom . android . ide . common . repository . Gradle Version Ċ import Ġcom . android . sdk lib . Android Target Hash Ċ import Ġcom . android . sdk lib . Android Version Ċ import Ġcom . android . support . Migration Parser Visitor Ċ import Ġcom . android . support . parse Migration File Ċ import Ġcom . android . tools . idea . gradle . dsl . api . Gradle Build Model Ċ import Ġcom . android . tools . idea . gradle . dsl . api . Project Build Model Ċ import Ġcom . android . tools . idea . gradle . dsl . api . ext . Gradle Property Model Ċ import Ġcom . android . tools . idea . gradle . util . Gradle Projects Ċ import Ġcom . android . tools . idea . model . Android Module Info Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . intellij . lang . Language Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . DataContext Ċ import Ġcom . intellij . openapi . action System . Platform Core Data Keys Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . module . Module Util Core Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Messages Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . refactor ing . Ref actor ing Action Handler Ċ import Ġcom . intellij . refactor ing . actions . Base Ref actor ing Action Ċ import Ġorg . jetbrains . android . refactor ing . AppCompat Migration Entry . Class Migration Entry Ċ import Ġorg . jetbrains . android . refactor ing . AppCompat Migration Entry . Gradle Dependency Migration Entry Ċ import Ġorg . jetbrains . android . refactor ing . AppCompat Migration Entry . Package Migration Entry Ċ import Ġorg . jetbrains . android . refactor ing . AppCompat Migration Entry . Update Gradle Dependency Version Migration Entry Ċ Ċ class ĠMigrate To Android x Action Ġ: ĠBase Ref actor ing Action () Ġ{ ĊĊĠ Ġoverride Ġfun Ġis Available In Editor Only () Ġ= Ġfalse ĊĊĠ Ġoverride Ġfun Ġis Enabled On DataContext ( data Context : ĠData Context ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġmodule Ġ= Ġdata Context . getData ( Platform Core Data Keys . MODULE ) ĊĠĠĠ Ġreturn Ġmodule Ġ!= Ġnull Ġ&& ĠGradle Projects . is Ide a Android Module ( module ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġis Enabled On Elements ( elements : ĠArray < out ĠPsi Element >) Ġ= ĊĠĠĠ Ġelements . any Ġ{ ĠModule Util Core . find Module For Psi Element ( it )?. let Ġ{ ĠGradle Projects . is Ide a Android Module ( it ) Ġ} Ġ== Ġtrue Ġ} ĊĊĠ Ġoverride Ġfun Ġis Available On Element In Editor And File ( element : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor : ĠEditor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠPsi File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠData Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġmodule Ġ= Ġcontext . getData ( Platform Core Data Keys . MODULE ) ĊĠĠĠ Ġreturn Ġmodule Ġ!= Ġnull Ġ&& ĠGradle Projects . is Ide a Android Module ( module ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Handler ( data Context : ĠData Context ): ĠRefactor ing Action Handler ? Ġ= ĠMigrate To Android x Handler () ĊĊĠ Ġoverride Ġfun Ġupdate ( an ActionEvent : ĠAn ActionEvent ) Ġ{ ĊĠĠĠ Ġan ActionEvent . presentation . description Ġ= Ġ" Migr ates Ġto ĠAndroid X Ġpackage Ġnames " ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġis Available For Language ( language : ĠLanguage ) Ġ= Ġtrue Ċ } Ċ Ċ class ĠMigrate To Android x Handler ( var Ġshow Warning Dialog : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcall Sync After Migration : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcheck Pr erequisites : ĠBoolean Ġ= Ġtrue Ċ ) Ġ: ĠRefactor ing Action Handler Ġ{ ĊĠ Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġeditor : ĠEditor ?, Ġfile : ĠPsi File ?, Ġdata Context : ĠData Context ?) Ġ{ ĊĠĠĠ Ġinvoke ( project , Ġif Ġ( file Ġ== Ġnull ) ĠarrayOf () Ġelse ĠarrayOf < Psi Element >( file ), Ġdata Context ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġelements : ĠArray < out ĠPsi Element >, Ġdata Context : ĠData Context ?) Ġ{ ĊĠĠĠ Ġif Ġ( check Pr erequisites Ġ&& Ġ! check Ref actor ing Pr erequisites ( project )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrun Processor Ġ= Ġ{ ĊĠĠĠĠĠ Ġval Ġprocessor Ġ= ĠMigrate To Android x Processor ( project , Ġparse Migration Map (), Ġcall Sync After Migration Ġ= Ġcall Sync After Migration ) ĊĠĠĠĠĠ Ġwith ( processor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Preview Usage s ( true ) ĊĠĠĠĠĠĠĠ Ġrun () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( show Warning Dialog ) Ġ{ ĊĠĠĠĠĠ Ġoffer To Create Backup And Run ( project , Ġ" Migrate Ġto ĠAndroid X ", Ġrun Processor ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġrun Processor () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ ĠReturns Ġthe Ġ[ Android Version ] Ġvalue Ġfor Ġthe Ġgiven Ġreceiver Ġ[ String ] Ġor ĊĠĠ Ġ* Ġ Ġnull Ġif Ġit 's Ġnot Ġa Ġvalid Ġversion . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠString . to Android Version (): ĠAndroid Version ? Ġ= ĠAndroid Target Hash . get Platform Version ( this ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġbuild Sdk Ġvalue Ġof Ġa Ġthe Ġreceiver Ġ[ Module ] Ġor Ġnull ĊĠĠ Ġ* Ġif Ġthe Ġ[ Module ] Ġbuild Sdk Ġcould Ġnot Ġbe Ġfound . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠPair < Module , ĠGradle Build Model ?> . find Build Sdk (): ĠAndroid Version ? Ġ{ ĊĠĠĠ Ġval Ġmodel Version Ġ= Ġsecond ?. android () ĊĠĠĠĠĠ Ġ? . compile Sdk Version () ĊĠĠĠĠĠ Ġ? . toString () ĊĠĠĠĠĠ Ġ? . to Android Version () ĊĊĠĠĠ Ġ// ĠIf Ġwe Ġcouldn 't Ġfind Ġthe Ġversion Ġfrom Ġthe Ġmodel Ġparser , Ġtry Ġto Ġget Ġit ĊĠĠĠ Ġ// Ġfrom Ġthe ĠAndroid Module Info . ĠThis Ġcould Ġhappen Ġif Ġthe Ġversion Ġis Ġcoming ĊĠĠĠ Ġ// Ġfrom Ġa Ġvariable Ġthat Ġthe ĠGradle Ġparser Ġis Ġnot Ġhandling Ġcorrectly ĊĠĠĠ Ġreturn Ġmodel Version Ġ?: ĠAndroid Module Info . getInstance ( first )?. build Sdk Version ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Ref actor ing Pr erequisites ( project : ĠProject ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġbuild Model Ġ= ĠProject Build Model . get ( project ) ĊĠĠĠ Ġval Ġmodule Models Ġ= ĠModule Manager . getInstance ( project ). modules ĊĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit Ġto Ġbuild Model . getModule Build Model ( it ) Ġ} ĊĠĠĠ Ġval Ġhighest Compile Sdk Version Ġ= Ġmodule Models ĊĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . find Build Sdk () Ġ} ĊĠĠĠĠĠ Ġ. sorted () ĊĠĠĠĠĠ Ġ. last OrNull () ĊĠĠĠ Ġval Ġsupported Compile Sdk Ġ= Ġif Ġ( highest Compile Sdk Version Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠAndroid Version ( 2 8 ) Ġ<= Ġhighest Compile Sdk Version Ġ|| Ġhighest Compile Sdk Version . cod ename Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġtrue Ġ// ĠEnable Ġby Ġdefault Ġwhen Ġwe Ġcan Ġnot Ġfind Ġout Ġthe Ġversion ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġgradle Version String Ġ= Ġmodule Models . map NotNull Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . build script (). dependencies () Ġ} ĊĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . artifacts () Ġ} ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name (). force String () Ġ== Ġ" gradle " Ġ&& Ġit . group (). force String () Ġ== Ġ" com . android . tools . build " Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . version (). getValue ( Gradle Property Model . STRING _ TYPE ) Ġ} ĊĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠ Ġval Ġsupported Gradle Version Ġ= Ġif Ġ( gradle Version String ?. startsWith ('$ ') Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠ ĠGradle Version . try Parse ( gradle Version String )?. is At Least In cluding Pre views ( 3 , Ġ 2 , Ġ 0 ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// ĠFor Ġnow , Ġignore Ġthis Ġcase Ġsince Ġthe ĠDSL Ġparser Ġdoes Ġnot Ġseem Ġto Ġhandle Ġthat Ġcorrectly ĊĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( supported Compile Sdk Ġ&& Ġsupported Gradle Version ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġwarning Content Ġ= Ġif Ġ(! supported Compile Sdk ) Ġ{ ĊĠĠĠĠĠ Ġ" You Ġneed Ġto Ġhave Ġcompile Sdk Ġset Ġto Ġat Ġleast Ġ 2 8 Ġin Ġyour Ġmodule Ġbuild . gradle Ġto Ġmigrate Ġto ĠAndroid X ." ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} Ġ+ Ġif Ġ(! supported Gradle Version ) Ġ{ ĊĠĠĠĠĠ Ġ" The Ġgradle Ġplugin Ġversion Ġin Ġyour Ġproject Ġbuild . gradle Ġfile Ġneeds Ġto Ġbe Ġset Ġto Ġat Ġleast Ġcom . android . tools . build : gradle : 3 . 2 . 0 Ġ" Ġ+ ĊĠĠĠĠĠ Ġ" in Ġorder Ġto Ġmigrate Ġto ĠAndroid X ." ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠMessages . show Error Dialog ( warning Content , Ġ" Unable Ġto Ġmigrate Ġto ĠAndroid X ") ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġ@ Visible ForTesting ĊĠ Ġprivate Ġfun Ġparse Migration Map (): ĠList < AppCompat Migration Entry > Ġ{ ĊĠĠĠ Ġval Ġclasses And Coordinates Ġ= Ġmutable ListOf < AppCompat Migration Entry >() ĊĠĠĠ Ġval Ġpackages Ġ= Ġmutable ListOf < Package Migration Entry >() ĊĊĠĠĠ Ġparse Migration File ( object Ġ: ĠMigration Parser Visitor Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class ( old : ĠString , Ġnew : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses And Coordinates . add ( Class Migration Entry ( old , Ġnew )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Package ( old : ĠString , Ġnew : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpackages . add ( Package Migration Entry ( old , Ġnew )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Gradle Coordinate ( ĊĠĠĠĠĠĠĠ Ġold GroupName : ĠString , ĊĠĠĠĠĠĠĠ Ġold Artifact Name : ĠString , ĊĠĠĠĠĠĠĠ Ġnew GroupName : ĠString , ĊĠĠĠĠĠĠĠ Ġnew Artifact Name : ĠString , ĊĠĠĠĠĠĠĠ Ġnew Base Version : ĠString ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses And Coordinates . add ( ĊĠĠĠĠĠĠĠĠĠ ĠGradle Dependency Migration Entry ( old GroupName , Ġold Artifact Name , Ġnew GroupName , Ġnew Artifact Name , Ġnew Base Version )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġvisit Gradle Coordinate Upgrade ( groupName : ĠString , Ġartifact Name : ĠString , Ġnew Base Version : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses And Coordinates . add ( ĊĠĠĠĠĠĠĠĠĠ ĠUpdate Gradle Dependency Version Migration Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgroupName , Ġartifact Name , Ġnew Base Version )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġ// ĠPackages Ġneed Ġto Ġbe Ġsorted Ġso Ġthe Ġrefactoring Ġis Ġapplied Ġcorrectly . ĠWe Ġneed Ġto Ġapply ĊĠĠĠ Ġ// Ġthe Ġlongest Ġnames Ġfirst Ġso , Ġif Ġthere Ġare Ġconflicting Ġrefactor ings , Ġthe Ġlongest Ġone ĊĠĠĠ Ġ// Ġis Ġapplied Ġfirst . ĊĠĠĠ Ġpackages . sortBy Descending Ġ{ Ġit . my Old Name . length Ġ} ĊĠĠĠ Ġclasses And Coordinates . addAll ( packages ) ĊĠĠĠ Ġreturn Ġclasses And Coordinates ĊĠ Ġ} Ċ }