com.android.talkbacktests.testsession.PopupViewTest.java Source code

Java tutorial

Introduction

Here is the source code for com.android.talkbacktests.testsession.PopupViewTest.java

Source

/*
 * 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.android.talkbacktests.testsession;

import android.content.Context;
import android.support.v4.widget.PopupWindowCompat;
import android.support.v7.widget.ListPopupWindow;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.Spinner;
import android.widget.TextView;

import com.android.talkbacktests.R;

public class PopupViewTest extends BaseTestContent implements View.OnClickListener {

    private static final Integer[] sWindowHeight = new Integer[] { ViewGroup.LayoutParams.WRAP_CONTENT, 200, 400,
            600, 800 };

    private static final Integer[] sListSize = new Integer[] { 1, 2, 3, 5, 10, 20 };

    private final String[] mWindowTypes;

    private Spinner mWindowTypeSpinner;
    private Spinner mWindowHeightSpinner;
    private Spinner mListSizeSpinner;
    private CheckBox mModalCheckbox;
    private CheckBox mDefaultInflaterCheckbox;

    public PopupViewTest(Context context, String subtitle, String description) {
        super(context, subtitle, description);
        mWindowTypes = context.getResources().getStringArray(R.array.window_type_array);
    }

    @Override
    public View getView(final LayoutInflater inflater, ViewGroup container, Context context) {
        View view = inflater.inflate(R.layout.test_popup_view, container, false);

        final ArrayAdapter<String> windowTypeAdapter = new ArrayAdapter<>(context,
                android.R.layout.simple_spinner_item, mWindowTypes);
        windowTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        final ArrayAdapter<Integer> windowHeightAdapter = new ArrayAdapter<Integer>(context,
                android.R.layout.simple_spinner_item, sWindowHeight) {

        };
        windowHeightAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        final ArrayAdapter<Integer> listSizeAdapter = new ArrayAdapter<>(context,
                android.R.layout.simple_spinner_item, sListSize);
        listSizeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        mWindowTypeSpinner = (Spinner) view.findViewById(R.id.window_type_spinner);
        mWindowTypeSpinner.setAdapter(windowTypeAdapter);
        mWindowTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
                if (pos == 0) {
                    mModalCheckbox.setEnabled(false);
                } else {
                    mModalCheckbox.setEnabled(true);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                mModalCheckbox.setEnabled(false);
            }
        });
        mWindowHeightSpinner = (Spinner) view.findViewById(R.id.window_height_spinner);
        mWindowHeightSpinner.setAdapter(windowHeightAdapter);
        mListSizeSpinner = (Spinner) view.findViewById(R.id.list_size_spinner);
        mListSizeSpinner.setAdapter(listSizeAdapter);
        mListSizeSpinner.setSelection(4); // Set initial size to 10. The index is 4.
        mModalCheckbox = (CheckBox) view.findViewById(R.id.modal_checkbox);
        mModalCheckbox.setChecked(true);
        mDefaultInflaterCheckbox = (CheckBox) view.findViewById(R.id.inflater_checkbox);
        mDefaultInflaterCheckbox.setChecked(true);
        view.findViewById(R.id.button).setOnClickListener(this);
        return view;
    }

    @Override
    public void onClick(View v) {
        final String windowType = (String) mWindowTypeSpinner.getSelectedItem();
        final int windowHeight = (int) mWindowHeightSpinner.getSelectedItem();
        final int listSize = (int) mListSizeSpinner.getSelectedItem();
        final boolean useDefaultInfalter = mDefaultInflaterCheckbox.isChecked();
        if (mWindowTypes[0].equals(windowType)) {
            showPopupWindow(v, windowHeight, listSize, useDefaultInfalter);
        } else {
            final boolean isModal = mModalCheckbox.isChecked();
            showListPopupWindow(v, windowHeight, listSize, isModal, useDefaultInfalter);
        }
    }

    /**
     * Shows a PopupWindow at the anchor view with given window height and list size.
     */
    private void showPopupWindow(View button, int height, int listSize, boolean useDefaultInflater) {
        final Context context = button.getContext();
        final ListView listView = new ListView(context);
        final BaseAdapter adapter;
        if (useDefaultInflater) {
            adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, android.R.id.text1,
                    createSampleArray(listSize));
        } else {
            adapter = new MyAdapter(button.getContext(), createSampleArray(listSize));
        }
        listView.setAdapter(adapter);

        listView.setVerticalScrollBarEnabled(true);
        listView.setBackgroundColor(0xFFFFFF);
        final PopupWindow window = new PopupWindow(listView, ViewGroup.LayoutParams.WRAP_CONTENT, height, true);
        window.setBackgroundDrawable(context.getResources().getDrawable(android.R.drawable.editbox_background));
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (window.isShowing()) {
                    window.dismiss();
                }
            }
        });
        PopupWindowCompat.showAsDropDown(window, button, 0, 0, Gravity.NO_GRAVITY);
    }

    /**
     * Shows a ListPopupWindow at the anchor view with given window height, list size and isModal.
     */
    private void showListPopupWindow(View button, int height, int listSize, boolean isModal,
            boolean useDefaultInflater) {
        final Context context = button.getContext();

        final BaseAdapter adapter;
        if (useDefaultInflater) {
            adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, android.R.id.text1,
                    createSampleArray(listSize));
        } else {
            adapter = new MyAdapter(button.getContext(), createSampleArray(listSize));
        }
        final ListPopupWindow window = new ListPopupWindow(context, null);
        window.setAnchorView(button);
        window.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        window.setHeight(height);
        window.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (window.isShowing()) {
                    window.dismiss();
                }
            }
        });
        window.setModal(isModal);
        window.setAdapter(adapter);
        window.show();
    }

    private String[] createSampleArray(int size) {
        String[] result = new String[size];
        for (int i = 0; i < size; i++) {
            result[i] = getContext().getString(R.string.list_item_template1, (i + 1));
        }
        return result;
    }

    private static final class MyAdapter extends BaseAdapter {
        private String[] mItems;
        private Context mContext;

        public MyAdapter(Context context, String[] items) {
            mItems = items;
            mContext = context;
        }

        @Override
        public int getCount() {
            return mItems.length;
        }

        @Override
        public Object getItem(int i) {
            return mItems[i];
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = LayoutInflater.from(mContext).inflate(R.layout.test_popupview_list_item, viewGroup,
                        false);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.text.setText(mItems[i]);
            return convertView;
        }
    }

    private static final class ViewHolder {
        public TextView text;

    }
}