// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.components.runtime; import android.content.pm.ActivityInfo; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.google.appinventor.components.runtime.util.AnimationUtil; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.inputmethod.InputMethodManager; /** * ListPickerActivity class - Brings up a list of items specified in an intent * and returns the selected item as the result. * * @author sharon@google.com (Sharon Perl) * @author M. Hossein Amerkashi (kkashi01@gmail.com) */ public class ListPickerActivity extends Activity implements AdapterView.OnItemClickListener { private String closeAnim = ""; private ListView listView; // Listview Adapter MyAdapter adapter; // Search EditText EditText txtSearchBox; static int itemColor; static int backgroundColor; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout viewLayout = new LinearLayout(this); viewLayout.setOrientation(LinearLayout.VERTICAL); Intent myIntent = getIntent(); if (myIntent.hasExtra(ListPicker.LIST_ACTIVITY_ANIM_TYPE)) { closeAnim = myIntent.getStringExtra(ListPicker.LIST_ACTIVITY_ANIM_TYPE); } if (myIntent.hasExtra(ListPicker.LIST_ACTIVITY_ORIENTATION_TYPE)) { String orientation = myIntent.getStringExtra(ListPicker.LIST_ACTIVITY_ORIENTATION_TYPE).toLowerCase(); if (orientation.equals("portrait")) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else if (orientation.equals("landscape")) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } if (myIntent.hasExtra(ListPicker.LIST_ACTIVITY_TITLE)) { String title = myIntent.getStringExtra(ListPicker.LIST_ACTIVITY_TITLE); setTitle(title); } if (myIntent.hasExtra(ListPicker.LIST_ACTIVITY_ARG_NAME)) { String items[] = getIntent().getStringArrayExtra(ListPicker.LIST_ACTIVITY_ARG_NAME); listView = new ListView(this); listView.setOnItemClickListener(this); listView.setScrollingCacheEnabled(false); itemColor = myIntent.getIntExtra(ListPicker.LIST_ACTIVITY_ITEM_TEXT_COLOR, ListPicker.DEFAULT_ITEM_TEXT_COLOR); backgroundColor = myIntent.getIntExtra(ListPicker.LIST_ACTIVITY_BACKGROUND_COLOR, ListPicker.DEFAULT_ITEM_BACKGROUND_COLOR); viewLayout.setBackgroundColor(backgroundColor); // Adding items to listview adapter = new MyAdapter(this, items); listView.setAdapter(adapter); String showFilterBar =myIntent.getStringExtra(ListPicker.LIST_ACTIVITY_SHOW_SEARCH_BAR); // Determine if we should even show the search bar txtSearchBox = new EditText(this); txtSearchBox.setSingleLine(true); txtSearchBox.setWidth(Component.LENGTH_FILL_PARENT); txtSearchBox.setPadding(10, 10, 10, 10); txtSearchBox.setHint("Search list..."); if (showFilterBar == null || !showFilterBar.equalsIgnoreCase("true")) { txtSearchBox.setVisibility(View.GONE); } //set up the listener txtSearchBox.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text ListPickerActivity.this.adapter.getFilter().filter(cs); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // no-op. Required method } @Override public void afterTextChanged(Editable arg0) { // no-op. Required method } }); } else { setResult(RESULT_CANCELED); finish(); AnimationUtil.ApplyCloseScreenAnimation(this, closeAnim); } viewLayout.addView(txtSearchBox); viewLayout.addView(listView); this.setContentView(viewLayout); viewLayout.requestLayout(); //hide the keyboard InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String selected = (String) parent.getAdapter().getItem(position); Intent resultIntent = new Intent(); resultIntent.putExtra(ListPicker.LIST_ACTIVITY_RESULT_NAME, selected); resultIntent.putExtra(ListPicker.LIST_ACTIVITY_RESULT_INDEX, position + 1); closeAnim = selected; setResult(RESULT_OK, resultIntent); finish(); AnimationUtil.ApplyCloseScreenAnimation(this, closeAnim); } // Capture the hardware back button to make sure the screen animation // still applies. (In API level 5, we can override onBackPressed instead) @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { boolean handled = super.onKeyDown(keyCode, event); AnimationUtil.ApplyCloseScreenAnimation(this, closeAnim); return handled; } return super.onKeyDown(keyCode, event); } private static class MyAdapter extends ArrayAdapter<String> { private final Context mContext; public MyAdapter(final Context context, final String[] items) { super(context, android.R.layout.activity_list_item, items); mContext = context; } @Override public long getItemId(final int position) { return getItem(position).hashCode(); } @Override public View getView(final int position, final View convertView, final ViewGroup parent) { TextView tv = (TextView) convertView; if (tv == null) { tv = (TextView) LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_1, parent, false); } tv.setText(getItem(position)); tv.setTextColor(itemColor); return tv; } } }