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