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