/* * 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; } }