/*
 * Copyright (C) 2016 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.kitchensink.displayinfo;

import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

import com.google.android.car.kitchensink.R;

/**
 * Shows alert dialogs
 */
public class DisplayInfoFragment extends Fragment {

    private LinearLayout list;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.display_info, container, false);

        list = (LinearLayout) view.findViewById(R.id.list);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        Point screenSize = new Point();
        getActivity().getWindowManager().getDefaultDisplay().getSize(screenSize);
        addTextView("window size(px): " + screenSize.x + " x " + screenSize.y);
        addTextView("display density(dpi): " + getResources().getDisplayMetrics().densityDpi);
        addTextView("display default density(dpi): "
                + getResources().getDisplayMetrics().DENSITY_DEFAULT);

        addTextView("======================================");
        addTextView("All size are in DP.");
        View rootView = getActivity().findViewById(android.R.id.content);
        addTextView("view size: "
                + convertPixelsToDp(rootView.getWidth(), getContext())
                + " x " + convertPixelsToDp(rootView.getHeight(), getContext()));

        addTextView("window size: "
                + convertPixelsToDp(screenSize.x, getContext())
                + " x " + convertPixelsToDp(screenSize.y, getContext()));

        addDimenText("car_keyline_1");
        addDimenText("car_keyline_2");
        addDimenText("car_keyline_3");
        addDimenText("car_keyline_4");
        addDimenText("car_margin");
        addDimenText("car_gutter_size");
        addDimenText("car_primary_icon_size");
        addDimenText("car_secondary_icon_size");
        addDimenText("car_title_size");
        addDimenText("car_title2_size");
        addDimenText("car_headline1_size");
        addDimenText("car_headline2_size");
        addDimenText("car_headline3_size");
        addDimenText("car_headline4_size");
        addDimenText("car_body1_size");
        addDimenText("car_body2_size");
        addDimenText("car_body3_size");
        addDimenText("car_body4_size");
        addDimenText("car_body5_size");
        addDimenText("car_action1_size");
        addDimenText("car_touch_target_size");
        addDimenText("car_action_bar_height");
    }

    private void addDimenText(String dimenName) {
        addTextView(dimenName + " : " + convertPixelsToDp(
                getResources().getDimensionPixelSize(
                        getResources().getIdentifier(
                                dimenName, "dimen", getContext().getPackageName())),
                getContext()));
    }

    private void addTextView(String text) {
        TextView textView = new TextView(getContext());
        textView.setTextAppearance(R.style.TextAppearance_Car_Body2);
        textView.setText(text);
        list.addView(textView);
    }

    private static float convertPixelsToDp(float px, Context context){
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float dp = px / ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
        return dp;
    }
}
