1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2014 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpackage com.android.tv.settings; 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport com.android.tv.settings.dialog.old.Action; 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport com.android.tv.settings.dialog.old.ActionAdapter; 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport com.android.tv.settings.dialog.old.ActionFragment; 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport com.android.tv.settings.dialog.old.ContentFragment; 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport com.android.tv.settings.dialog.old.DialogActivity; 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport android.app.Fragment; 26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopianimport android.content.res.Resources; 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport android.net.Uri; 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport android.os.Bundle; 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport android.view.KeyEvent; 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.ArrayList; 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.Stack; 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic abstract class BaseSettingsActivity extends DialogActivity { 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected Object mState; 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected Stack<Object> mStateStack = new Stack<Object>(); 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected Resources mResources; 393c772b706dd8e53fe17b284bb2e60c146867f787Mathias Agopian protected Fragment mContentFragment; 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected Fragment mActionFragment; 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected ArrayList<Action> mActions; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This method initializes the parameter and sets the initial state. <br/> 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Activities extending {@link BaseSettingsActivity} should initialize their 465728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan * own local variables, if any, before calling {@link #onCreate} 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project @Override 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mResources = getResources(); 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mActions = new ArrayList<Action>(); 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project super.onCreate(savedInstanceState); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setState(getInitialState(), true); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected abstract Object getInitialState(); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected void setState(Object state, boolean updateStateStack) { 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (updateStateStack && mState != null) { 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mStateStack.push(mState); 6283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian } 6383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian mState = state; 6483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 6583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian updateView(); 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected void setView(int titleResId, int breadcrumbResId, int descResId, int iconResId) { 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String title = titleResId != 0 ? mResources.getString(titleResId) : null; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String breadcrumb = breadcrumbResId != 0 ? mResources.getString(breadcrumbResId) : null; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String description = descResId != 0 ? mResources.getString(descResId) : null; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setView(title, breadcrumb, description, iconResId); 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected void setView(String title, String breadcrumb, String description, int iconResId) { 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mContentFragment = ContentFragment.newInstance(title, breadcrumb, description, iconResId, 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getResources().getColor(R.color.icon_background)); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mActionFragment = ActionFragment.newInstance(mActions); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setContentAndActionFragments(mContentFragment, mActionFragment); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Set the view. 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * @param uri Uri of icon resource. 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project protected void setView(String title, String breadcrumb, String description, Uri uri) { 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mContentFragment = ContentFragment.newInstance(title, breadcrumb, null, uri, 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getResources().getColor(R.color.icon_background)); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mActionFragment = ActionFragment.newInstance(mActions); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setContentAndActionFragments(mContentFragment, mActionFragment); 9283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian } 9383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 9483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian protected void setView(int titleResId, String breadcrumb, int descResId, Uri uri) { 9583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian String title = titleResId != 0 ? mResources.getString(titleResId) : null; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String description = descResId != 0 ? mResources.getString(descResId) : null; 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setView(title, breadcrumb, description, uri); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * This method is called by {@link #setState}, and updates the layout based 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * on the current state 103 */ 104 protected abstract void updateView(); 105 106 /** 107 * This method is called to update the contents of mActions to reflect the 108 * list of actions for the current state. 109 */ 110 protected abstract void refreshActionList(); 111 112 /** 113 * This method is used to set boolean properties 114 * 115 * @param enable whether or not to enable the property 116 */ 117 protected abstract void setProperty(boolean enable); 118 119 @Override 120 public boolean onKeyDown(int keyCode, KeyEvent event) { 121 if (keyCode == KeyEvent.KEYCODE_BACK) { 122 goBack(); 123 return true; 124 } 125 return super.onKeyDown(keyCode, event); 126 } 127 128 protected void goBack(){ 129 if (mState.equals(getInitialState())) { 130 finish(); 131 } else if (getPrevState() != null) { 132 mState = mStateStack.pop(); 133 // Using the synchronous version of popBackStack so that we can get 134 // the updated 135 // instance of the action Fragment on the following line. 136 getFragmentManager().popBackStackImmediate(); 137 mActionFragment = getActionFragment(); 138 // Update Current State Actions 139 if ((mActionFragment != null) && (mActionFragment instanceof ActionFragment)) { 140 ActionFragment actFrag = (ActionFragment) mActionFragment; 141 refreshActionList(); 142 ((ActionAdapter) actFrag.getAdapter()).setActions(mActions); 143 } 144 } 145 } 146 147 protected Object getPrevState() { 148 return mStateStack.isEmpty() ? null : mStateStack.peek(); 149 } 150} 151