1 /*
2  * Copyright (C) 2015 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 package com.android.systemui.tuner;
17 
18 import android.app.Activity;
19 import android.app.Fragment;
20 import android.app.FragmentTransaction;
21 import android.os.Bundle;
22 import android.util.Log;
23 import android.view.MenuItem;
24 import android.view.Window;
25 import android.view.WindowManager;
26 import android.widget.Toolbar;
27 
28 import androidx.preference.Preference;
29 import androidx.preference.PreferenceFragment;
30 import androidx.preference.PreferenceScreen;
31 
32 import com.android.systemui.Dependency;
33 import com.android.systemui.R;
34 import com.android.systemui.demomode.DemoModeController;
35 import com.android.systemui.fragments.FragmentService;
36 
37 import javax.inject.Inject;
38 
39 public class TunerActivity extends Activity implements
40         PreferenceFragment.OnPreferenceStartFragmentCallback,
41         PreferenceFragment.OnPreferenceStartScreenCallback {
42 
43     private static final String TAG_TUNER = "tuner";
44 
45     private final DemoModeController mDemoModeController;
46     private final TunerService mTunerService;
47 
48     @Inject
TunerActivity(DemoModeController demoModeController, TunerService tunerService)49     TunerActivity(DemoModeController demoModeController, TunerService tunerService) {
50         super();
51         mDemoModeController = demoModeController;
52         mTunerService = tunerService;
53     }
54 
onCreate(Bundle savedInstanceState)55     protected void onCreate(Bundle savedInstanceState) {
56         super.onCreate(savedInstanceState);
57 
58         getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
59         requestWindowFeature(Window.FEATURE_NO_TITLE);
60         setContentView(R.layout.tuner_activity);
61         Toolbar toolbar = findViewById(R.id.action_bar);
62         if (toolbar != null) {
63             setActionBar(toolbar);
64         }
65 
66         if (getFragmentManager().findFragmentByTag(TAG_TUNER) == null) {
67             final String action = getIntent().getAction();
68             boolean showDemoMode = action != null && action.equals(
69                     "com.android.settings.action.DEMO_MODE");
70             final PreferenceFragment fragment = showDemoMode
71                     ? new DemoModeFragment(mDemoModeController)
72                     : new TunerFragment(mTunerService);
73             getFragmentManager().beginTransaction().replace(R.id.content_frame,
74                     fragment, TAG_TUNER).commit();
75         }
76     }
77 
78     @Override
onDestroy()79     protected void onDestroy() {
80         super.onDestroy();
81         Dependency.destroy(FragmentService.class, s -> s.destroyAll());
82     }
83 
84     @Override
onMenuItemSelected(int featureId, MenuItem item)85     public boolean onMenuItemSelected(int featureId, MenuItem item) {
86         if (item.getItemId() == android.R.id.home) {
87             onBackPressed();
88             return true;
89         }
90         return super.onMenuItemSelected(featureId, item);
91     }
92 
93     @Override
onBackPressed()94     public void onBackPressed() {
95         if (!getFragmentManager().popBackStackImmediate()) {
96             super.onBackPressed();
97         }
98     }
99 
100     @Override
onPreferenceStartFragment(PreferenceFragment caller, Preference pref)101     public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
102         try {
103             Class<?> cls = Class.forName(pref.getFragment());
104             Fragment fragment = (Fragment) cls.newInstance();
105             final Bundle b = new Bundle(1);
106             b.putString(PreferenceFragment.ARG_PREFERENCE_ROOT, pref.getKey());
107             fragment.setArguments(b);
108             FragmentTransaction transaction = getFragmentManager().beginTransaction();
109             setTitle(pref.getTitle());
110             transaction.replace(R.id.content_frame, fragment);
111             transaction.addToBackStack("PreferenceFragment");
112             transaction.commit();
113             return true;
114         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
115             Log.d("TunerActivity", "Problem launching fragment", e);
116             return false;
117         }
118     }
119 
120     @Override
onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref)121     public boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref) {
122         FragmentTransaction transaction = getFragmentManager().beginTransaction();
123         SubSettingsFragment fragment = new SubSettingsFragment();
124         final Bundle b = new Bundle(1);
125         b.putString(PreferenceFragment.ARG_PREFERENCE_ROOT, pref.getKey());
126         fragment.setArguments(b);
127         fragment.setTargetFragment(caller, 0);
128         transaction.replace(R.id.content_frame, fragment);
129         transaction.addToBackStack("PreferenceFragment");
130         transaction.commit();
131         return true;
132     }
133 
134     public static class SubSettingsFragment extends PreferenceFragment {
135         private PreferenceScreen mParentScreen;
136 
137         @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)138         public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
139             mParentScreen =
140                     (PreferenceScreen) ((PreferenceFragment) getTargetFragment())
141                             .getPreferenceScreen().findPreference(rootKey);
142             PreferenceScreen screen =
143                     getPreferenceManager().createPreferenceScreen(
144                             getPreferenceManager().getContext());
145             setPreferenceScreen(screen);
146             // Copy all the preferences over to this screen so they go into the attached state.
147             while (mParentScreen.getPreferenceCount() > 0) {
148                 Preference p = mParentScreen.getPreference(0);
149                 mParentScreen.removePreference(p);
150                 screen.addPreference(p);
151             }
152         }
153 
154         @Override
onDestroy()155         public void onDestroy() {
156             super.onDestroy();
157             // Copy all the preferences back so we don't lose them.
158             PreferenceScreen screen = getPreferenceScreen();
159             while (screen.getPreferenceCount() > 0) {
160                 Preference p = screen.getPreference(0);
161                 screen.removePreference(p);
162                 mParentScreen.addPreference(p);
163             }
164         }
165     }
166 
167 }
168