1daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler/* 2daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * Copyright (C) 2016 The Android Open Source Project 3daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * 4daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 5daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * you may not use this file except in compliance with the License. 6daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * You may obtain a copy of the License at 7daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * 8daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * http://www.apache.org/licenses/LICENSE-2.0 9daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * 10daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * Unless required by applicable law or agreed to in writing, software 11daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 12daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * See the License for the specific language governing permissions and 14daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler * limitations under the License 15daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler */ 16daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 17daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerpackage com.android.tv.settings; 18daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 19daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.app.Activity; 20daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.app.Fragment; 21daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.os.Bundle; 22daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.support.annotation.Nullable; 23daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.transition.Scene; 24daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.transition.Slide; 25daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.transition.Transition; 26daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.transition.TransitionManager; 27d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantlerimport android.util.Log; 28daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.view.Gravity; 29daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.view.ViewGroup; 30daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerimport android.view.ViewTreeObserver; 31daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 32daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantlerpublic abstract class TvSettingsActivity extends Activity { 33d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler private static final String TAG = "TvSettingsActivity"; 34daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 35daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler private static final String SETTINGS_FRAGMENT_TAG = 36daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler "com.android.tv.settings.MainSettings.SETTINGS_FRAGMENT"; 37daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 38daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 39daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler protected void onCreate(@Nullable Bundle savedInstanceState) { 40daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler super.onCreate(savedInstanceState); 41daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler if (savedInstanceState == null) { 42daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 43d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler final ViewGroup root = findViewById(android.R.id.content); 44daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler root.getViewTreeObserver().addOnPreDrawListener( 45daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler new ViewTreeObserver.OnPreDrawListener() { 46daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 47daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public boolean onPreDraw() { 48daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler root.getViewTreeObserver().removeOnPreDrawListener(this); 49daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler final Scene scene = new Scene(root); 50d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler scene.setEnterAction(() -> { 51d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler if (getFragmentManager().isStateSaved() 52d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler || getFragmentManager().isDestroyed()) { 53d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler Log.d(TAG, "Got torn down before adding fragment"); 54d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler return; 55d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler } 56d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler final Fragment fragment = createSettingsFragment(); 57d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler if (fragment != null) { 58d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler getFragmentManager().beginTransaction() 59d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler .add(android.R.id.content, fragment, 60d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler SETTINGS_FRAGMENT_TAG) 61d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler .commitNow(); 62daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 63daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler }); 64daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 65daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler final Slide slide = new Slide(Gravity.END); 66daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler slide.setSlideFraction( 67daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler getResources().getDimension(R.dimen.lb_settings_pane_width) 68daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler / root.getWidth()); 69daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler TransitionManager.go(scene, slide); 70daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 71daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler // Skip the current draw, there's nothing in it 72daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler return false; 73daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 74daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler }); 75daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 76daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 77daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 78daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 79daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public void finish() { 80daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler final Fragment fragment = getFragmentManager().findFragmentByTag(SETTINGS_FRAGMENT_TAG); 81daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler if (isResumed() && fragment != null) { 82d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler final ViewGroup root = findViewById(android.R.id.content); 83daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler final Scene scene = new Scene(root); 84d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler scene.setEnterAction(() -> getFragmentManager().beginTransaction() 85d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler .remove(fragment) 86d8a878583ed83b41694e3fc2ef11513df14139cfTony Mantler .commitNow()); 87daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler final Slide slide = new Slide(Gravity.END); 88daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler slide.setSlideFraction( 89daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler getResources().getDimension(R.dimen.lb_settings_pane_width) / root.getWidth()); 90daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler slide.addListener(new Transition.TransitionListener() { 91daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 92daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public void onTransitionStart(Transition transition) { 93daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler getWindow().setDimAmount(0); 94daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 95daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 96daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 97daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public void onTransitionEnd(Transition transition) { 98daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler transition.removeListener(this); 99daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler TvSettingsActivity.super.finish(); 100daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 101daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 102daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 103daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public void onTransitionCancel(Transition transition) { 104daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 105daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 106daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 107daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public void onTransitionPause(Transition transition) { 108daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 109daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 110daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler @Override 111daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler public void onTransitionResume(Transition transition) { 112daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 113daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler }); 114daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler TransitionManager.go(scene, slide); 115daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } else { 116daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler super.finish(); 117daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 118daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler } 119daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler 120daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler protected abstract Fragment createSettingsFragment(); 121daa191c3bd054122a9f065b3ebaaec7492310f5dTony Mantler} 122