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