blob: 5af70197c08aa84b6423443a47bd13ef0330164a [file] [log] [blame]
Serik Beketayev6415f012018-07-09 16:16:36 -07001/*
2 * Copyright (C) 2018 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 */
16package com.google.android.car.garagemode.testapp;
17
Anthony Chenab8a3ef2018-12-13 16:22:13 -080018import android.content.res.Configuration;
Serik Beketayev6415f012018-07-09 16:16:36 -070019import android.os.Bundle;
Jim Kaye8085fdc2020-04-22 16:35:51 -070020import android.view.View;
Serik Beketayev6415f012018-07-09 16:16:36 -070021
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070022import androidx.fragment.app.Fragment;
Cassie(Yitong) Wang8d289b82019-03-13 11:55:52 -070023import androidx.fragment.app.FragmentActivity;
Serik Beketayev6415f012018-07-09 16:16:36 -070024
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070025import java.util.ArrayList;
26import java.util.List;
Serik Beketayev6415f012018-07-09 16:16:36 -070027
Cassie(Yitong) Wang8d289b82019-03-13 11:55:52 -070028public class MainActivity extends FragmentActivity {
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070029 private static final Logger LOG = new Logger("MainActivity");
Serik Beketayev6415f012018-07-09 16:16:36 -070030
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070031 private final List<MenuEntry> mMenuEntries = new ArrayList<MenuEntry>() {
32 {
33 add("Offcar testing", OffcarTestingFragment.class);
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070034 add("Quit", MainActivity.this::finish);
35 }
Serik Beketayev6415f012018-07-09 16:16:36 -070036
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070037 <T extends Fragment> void add(String text, Class<T> clazz) {
38 add(new FragmentMenuEntry(text, clazz));
39 }
40
41 void add(String text, ClickHandler onClick) {
42 add(new OnClickMenuEntry(text, onClick));
43 }
44 };
Serik Beketayev6415f012018-07-09 16:16:36 -070045
46 @Override
47 protected void onCreate(Bundle savedInstanceState) {
48 super.onCreate(savedInstanceState);
Anthony Chenab8a3ef2018-12-13 16:22:13 -080049 setContentView(R.layout.main_activity);
Jim Kaye8085fdc2020-04-22 16:35:51 -070050 // Until we have more than one fragment, hide the selection button
51 findViewById(R.id.offcar_test_btn).setVisibility(View.INVISIBLE);
Anthony Chenab8a3ef2018-12-13 16:22:13 -080052
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070053 mMenuEntries.get(0).onClick();
Anthony Chenab8a3ef2018-12-13 16:22:13 -080054
Cassie(Yitong) Wang8d289b82019-03-13 11:55:52 -070055 findViewById(R.id.offcar_test_btn).setOnClickListener((v) -> mMenuEntries.get(0).onClick());
Cassie(Yitong) Wang8d289b82019-03-13 11:55:52 -070056 findViewById(R.id.exit_button_container).setOnClickListener(
Jim Kaye8085fdc2020-04-22 16:35:51 -070057 (v) -> mMenuEntries.get(1).onClick());
Anthony Chenab8a3ef2018-12-13 16:22:13 -080058 }
59
60 @Override
61 protected void onStop() {
62 super.onStop();
Anthony Chenab8a3ef2018-12-13 16:22:13 -080063 }
64
65 @Override
66 public void onConfigurationChanged(Configuration newConfig) {
67 super.onConfigurationChanged(newConfig);
Serik Beketayev0afa3a82018-07-17 13:53:03 -070068 }
69
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070070 private interface ClickHandler {
71 void onClick();
Serik Beketayev0afa3a82018-07-17 13:53:03 -070072 }
73
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070074 private abstract static class MenuEntry implements ClickHandler {
75 abstract String getText();
76 }
77
78 private final class OnClickMenuEntry extends MenuEntry {
79 private final String mText;
80 private final ClickHandler mClickHandler;
81
82 OnClickMenuEntry(String text, ClickHandler clickHandler) {
83 mText = text;
84 mClickHandler = clickHandler;
Serik Beketayev6415f012018-07-09 16:16:36 -070085 }
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070086
87 @Override
88 String getText() {
89 return mText;
Serik Beketayev6415f012018-07-09 16:16:36 -070090 }
Serik Beketayev6415f012018-07-09 16:16:36 -070091
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070092 @Override
93 public void onClick() {
94 mClickHandler.onClick();
Serik Beketayev6415f012018-07-09 16:16:36 -070095 }
96 }
97
Serik Beketayevbfa32bc2018-07-18 11:10:49 -070098 private final class FragmentMenuEntry<T extends Fragment> extends MenuEntry {
99 private final class FragmentClassOrInstance<T extends Fragment> {
100 final Class<T> mClazz;
101 T mFragment = null;
102
103 FragmentClassOrInstance(Class<T> clazz) {
104 mClazz = clazz;
105 }
106
107 T getFragment() {
108 if (mFragment == null) {
109 try {
110 mFragment = mClazz.newInstance();
111 } catch (InstantiationException | IllegalAccessException e) {
112 LOG.e("unable to create fragment", e);
113 }
114 }
115 return mFragment;
116 }
117 }
118
119 private final String mText;
120 private final FragmentClassOrInstance<T> mFragment;
121
122 FragmentMenuEntry(String text, Class<T> clazz) {
123 mText = text;
124 mFragment = new FragmentClassOrInstance<>(clazz);
125 }
126
127 @Override
128 String getText() {
129 return mText;
130 }
131
132 @Override
133 public void onClick() {
134 Fragment fragment = mFragment.getFragment();
135 if (fragment != null) {
136 MainActivity.this.showFragment(fragment);
137 } else {
138 LOG.e("cannot show fragment for " + getText());
139 }
140 }
Serik Beketayev6415f012018-07-09 16:16:36 -0700141 }
142
Serik Beketayevbfa32bc2018-07-18 11:10:49 -0700143 private void showFragment(Fragment fragment) {
144 getSupportFragmentManager().beginTransaction()
145 .replace(R.id.activity_content, fragment)
146 .commit();
Serik Beketayev6415f012018-07-09 16:16:36 -0700147 }
Serik Beketayev6415f012018-07-09 16:16:36 -0700148}