package Ġcom . air bnb . mv rx Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġorg . junit . Test Ċ import Ġorg . ro bo lectric . Ro bo lectric Ċ Ċ class ĠState Rest or ation Test Ġ: ĠBaseTest () Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest State Rest or ation With BaseType Declaration Suc ceeds () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAttach Ġan Ġinstance Ġof ĠFragment 1 , Ġcausing Ġthe ĠChild ViewModel Ġto Ġbe Ġinitialized ĊĠĠĠĠĠĠĠ Ġval Ġ( activity Controller , Ġfragment 1 ) Ġ= Ġcreate Fragment < Fragment 1 , ĠTest Activity >() ĊĠĠĠĠĠĠĠ Ġ// ĠRemove ĠFragment 1 Ġfrom Ġthe ĠActivity Ġback stack Ġso Ġwe Ġdon 't Ġtry Ġto Ġrestore Ġit ĊĠĠĠĠĠĠĠ Ġactivity Controller . get (). support FragmentManager . beginTransaction (). remove ( fragment 1 ). commit Now () ĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe ĠM aver icks Ġstate Ġof Ġthe ĠActivity Ġinto Ġa ĠBundle ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġactivity Controller . save InstanceState ( bundle ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRestore Ġa Ġnew ĠActivity Ġwith Ġthe Ġpreviously Ġsaved Ġstate Ġand Ġattach Ġan Ġinstance Ġof ĠFragment 2 ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġm im ics Ġthe Ġapp Ġprocess Ġbeing Ġrestored Ġwith ĠFragment 2 Ġon Ġtop Ġof Ġthe Ġback stack , Ġwhich Ġwe Ġdon 't Ġhave Ġthe Ġability Ġto Ġdirectly Ġtest ĊĠĠĠĠĠĠĠ Ġval Ġnew Controller Ġ= ĠRo bo lectric . build Activity ( Test Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġnew Controller . setup ( bundle ) ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġnew Controller . get () ĊĠĠĠĠĠĠĠ ĠFragment 2 (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( this , Ġ" TAG ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit Now () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠParent ViewModel < S Ġ: ĠParent State >( initialState : ĠS ) Ġ: ĠM aver icks ViewModel < S >( initialState ) ĊĊĠĠĠ Ġabstract Ġclass ĠParent State Ġ: ĠM aver icks State ĊĊĠĠĠ Ġclass ĠChild ViewModel ( initialState : ĠChild State ) Ġ: ĠParent ViewModel < Child State >( initialState ) ĊĊĠĠĠ Ġdata Ġclass ĠChild State ( val Ġstring : ĠString Ġ= Ġ" value ") Ġ: ĠParent State () ĊĊĠĠĠ Ġclass ĠFragment 1 Ġ: ĠFragment (), ĠM aver icks View Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactivity Vm : ĠChild ViewModel Ġby Ġactivity ViewModel Ġ{ ĠviewModel Key Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis ĠFragment Ġis Ġintended Ġto Ġbe Ġattached Ġafter Ġ[ Fragment 1 ], Ġand Ġdecl ares Ġa Ġ[ Parent ViewModel ] Ġinstead Ġof Ġ[ Child ViewModel ]. ĠThis Ġsim ulates ĊĠĠĠĠ Ġ* Ġa Ġsetup Ġwhere Ġ[ Fragment 2 ] Ġdoes Ġnot Ġhave Ġaccess Ġto Ġthe Ġ[ Child ViewModel ] Ġclass Ġat Ġcompile Ġtime . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠFragment 2 Ġ: ĠFragment (), ĠM aver icks View Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġneed Ġto Ġuse Ġa Ġshared Ġkey Ġfor Ġretrieving Ġthe ĠViewModel , Ġbecause ĠM aver icks Ġwill Ġotherwise Ġuse Ġthe Ġdeclaration Ġsite Ġclass , Ġwhich Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġabstract Ġin Ġthis Ġcase Ġ- Ġwe Ġwant Ġto Ġretrieve Ġthe Ġ[ Child ViewModel ] Ġinitialized Ġby Ġ[ Fragment 1 ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexisting Vm : ĠParent ViewModel < Parent State > Ġby Ġexisting ViewModel Ġ{ ĠviewModel Key Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠviewModel Key Ġ= Ġ" key Ġfor Ġretrieving ĠChild ViewModel " ĊĠĠĠ Ġ} Ċ } Ċ