blob: 5af70197c08aa84b6423443a47bd13ef0330164a [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.car.garagemode.testapp;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity {
private static final Logger LOG = new Logger("MainActivity");
private final List<MenuEntry> mMenuEntries = new ArrayList<MenuEntry>() {
{
add("Offcar testing", OffcarTestingFragment.class);
add("Quit", MainActivity.this::finish);
}
<T extends Fragment> void add(String text, Class<T> clazz) {
add(new FragmentMenuEntry(text, clazz));
}
void add(String text, ClickHandler onClick) {
add(new OnClickMenuEntry(text, onClick));
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
// Until we have more than one fragment, hide the selection button
findViewById(R.id.offcar_test_btn).setVisibility(View.INVISIBLE);
mMenuEntries.get(0).onClick();
findViewById(R.id.offcar_test_btn).setOnClickListener((v) -> mMenuEntries.get(0).onClick());
findViewById(R.id.exit_button_container).setOnClickListener(
(v) -> mMenuEntries.get(1).onClick());
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
private interface ClickHandler {
void onClick();
}
private abstract static class MenuEntry implements ClickHandler {
abstract String getText();
}
private final class OnClickMenuEntry extends MenuEntry {
private final String mText;
private final ClickHandler mClickHandler;
OnClickMenuEntry(String text, ClickHandler clickHandler) {
mText = text;
mClickHandler = clickHandler;
}
@Override
String getText() {
return mText;
}
@Override
public void onClick() {
mClickHandler.onClick();
}
}
private final class FragmentMenuEntry<T extends Fragment> extends MenuEntry {
private final class FragmentClassOrInstance<T extends Fragment> {
final Class<T> mClazz;
T mFragment = null;
FragmentClassOrInstance(Class<T> clazz) {
mClazz = clazz;
}
T getFragment() {
if (mFragment == null) {
try {
mFragment = mClazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
LOG.e("unable to create fragment", e);
}
}
return mFragment;
}
}
private final String mText;
private final FragmentClassOrInstance<T> mFragment;
FragmentMenuEntry(String text, Class<T> clazz) {
mText = text;
mFragment = new FragmentClassOrInstance<>(clazz);
}
@Override
String getText() {
return mText;
}
@Override
public void onClick() {
Fragment fragment = mFragment.getFragment();
if (fragment != null) {
MainActivity.this.showFragment(fragment);
} else {
LOG.e("cannot show fragment for " + getText());
}
}
}
private void showFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.activity_content, fragment)
.commit();
}
}