chromium/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.cronet_sample_apk;

import static org.chromium.cronet_sample_apk.SampleActivityViewModel.FRAGMENT_ID_FLAGS;
import static org.chromium.cronet_sample_apk.SampleActivityViewModel.FRAGMENT_ID_HOME;

import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider;

import java.util.HashMap;
import java.util.Map;

/** Activity for managing the Cronet Sample. */
public class CronetSampleActivity extends FragmentActivity {
    private static final String TAG = CronetSampleActivity.class.getSimpleName();

    private final Map<Integer, Integer> mFragmentIdMap = new HashMap<>();

    private LinearLayout mBottomNav;
    private SampleActivityViewModel mActivityViewModel;

    private void init() {
        setContentView(R.layout.main_activity);
        // Set up bottom navigation bar:
        mBottomNav = findViewById(R.id.nav_view);
        mFragmentIdMap.put(R.id.navigation_home, FRAGMENT_ID_HOME);
        mFragmentIdMap.put(R.id.navigation_options_ui, FRAGMENT_ID_FLAGS);
        final int childCount = mBottomNav.getChildCount();
        View.OnClickListener switchFragmentListener =
                view -> {
                    assert mFragmentIdMap.containsKey(view.getId());
                    int fragmentId = mFragmentIdMap.get(view.getId());
                    switchFragment(fragmentId);
                };
        for (int i = 0; i < childCount; i++) {
            mBottomNav.getChildAt(i).setOnClickListener(switchFragmentListener);
        }
        mActivityViewModel = new ViewModelProvider(this).get(SampleActivityViewModel.class);
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
        switchFragment(FRAGMENT_ID_HOME);
    }

    @SuppressWarnings("deprecation")
    private void updateNavigationBarUI(int chosenFragmentId) {
        final int childCount = mBottomNav.getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View view = mBottomNav.getChildAt(i);
            int fragmentId = mFragmentIdMap.get(view.getId());
            assert view instanceof TextView : "Bottom bar must have TextViews as direct children";
            TextView textView = (TextView) view;

            boolean isSelectedFragment = chosenFragmentId == fragmentId;
            // TODO: Can remove first parameter and SuppressWarnings once minApiLevel >= 23.
            textView.setTextAppearance(
                    textView.getContext(),
                    isSelectedFragment
                            ? R.style.SelectedNavigationButton
                            : R.style.UnselectedNavigationButton);
            int color =
                    isSelectedFragment
                            ? getColor(R.color.navigation_selected)
                            : getColor(R.color.navigation_unselected);
            for (Drawable drawable : textView.getCompoundDrawables()) {
                if (drawable != null) {
                    drawable.mutate();
                    drawable.setColorFilter(
                            new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
                }
            }
        }
    }

    private void switchFragment(int chosenFragmentId) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, mActivityViewModel.getFragment(chosenFragmentId))
                .commit();
        updateNavigationBarUI(chosenFragmentId);
    }
}