blob: d33e2b94052408761538057e7188412e6c57fef2 [file] [log] [blame]
/*
* Copyright (C) 2009 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.quicksearchbox;
import com.android.quicksearchbox.ui.CorporaAdapter;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
/**
* Corpus selection dialog.
*/
public class CorpusSelectionDialog extends Dialog {
private static final boolean DBG = false;
private static final String TAG = "QSB.SelectSearchSourceDialog";
private final SearchSettings mSettings;
private GridView mCorpusGrid;
private ImageView mEditItems;
private OnCorpusSelectedListener mListener;
private Corpus mCorpus;
private CorporaAdapter mAdapter;
public CorpusSelectionDialog(Context context, SearchSettings settings) {
super(context, R.style.Theme_SelectSearchSource);
mSettings = settings;
}
protected SearchSettings getSettings() {
return mSettings;
}
/**
* Shows the corpus selection dialog.
*
* @param corpus The currently selected corpus.
*/
public void show(Corpus corpus) {
mCorpus = corpus;
show();
}
public void setOnCorpusSelectedListener(OnCorpusSelectedListener listener) {
mListener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.corpus_selection_dialog);
mCorpusGrid = (GridView) findViewById(R.id.corpus_grid);
mCorpusGrid.setOnItemClickListener(new CorpusClickListener());
// TODO: for some reason, putting this in the XML layout instead makes
// the list items unclickable.
mCorpusGrid.setFocusable(true);
mEditItems = (ImageView) findViewById(R.id.corpus_edit_items);
mEditItems.setOnClickListener(new CorpusEditListener());
Window window = getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
// Put window on top of input method
lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
window.setAttributes(lp);
if (DBG) Log.d(TAG, "Window params: " + lp);
}
@Override
protected void onStart() {
super.onStart();
Corpora corpora = getQsbApplication().getCorpora();
CorporaAdapter adapter =
new CorporaAdapter(getContext(), corpora, R.layout.corpus_grid_item);
adapter.setCurrentCorpus(mCorpus);
setAdapter(adapter);
mCorpusGrid.setSelection(adapter.getCorpusPosition(mCorpus));
}
@Override
protected void onStop() {
setAdapter(null);
super.onStop();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
getSettings().addMenuItems(menu, true);
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// Cancel dialog on any touch down event which is not handled by the corpus grid
cancel();
return true;
}
return false;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean handled = super.onKeyDown(keyCode, event);
if (handled) {
return handled;
}
// Dismiss dialog on up move when nothing, or an item on the top row, is selected.
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
if (mEditItems.isFocused()) {
cancel();
return true;
}
}
// Dismiss dialog when typing on hard keyboard (soft keyboard is behind the dialog,
// so that can't be typed on)
if (event.isPrintingKey()) {
cancel();
return true;
}
return false;
}
@Override
public void onBackPressed() {
SearchActivity searchActivity = getSearchActivity();
if (searchActivity.startedIntoCorpusSelectionDialog()) {
searchActivity.onBackPressed();
}
cancel();
}
private SearchActivity getSearchActivity() {
return (SearchActivity) getOwnerActivity();
}
private void setAdapter(CorporaAdapter adapter) {
if (adapter == mAdapter) return;
if (mAdapter != null) mAdapter.close();
mAdapter = adapter;
mCorpusGrid.setAdapter(mAdapter);
}
private QsbApplication getQsbApplication() {
return QsbApplication.get(getContext());
}
protected void selectCorpus(Corpus corpus) {
dismiss();
if (mListener != null) {
String corpusName = corpus == null ? null : corpus.getName();
mListener.onCorpusSelected(corpusName);
}
}
private class CorpusClickListener implements AdapterView.OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Corpus corpus = (Corpus) parent.getItemAtPosition(position);
if (DBG) Log.d(TAG, "Corpus selected: " + corpus);
selectCorpus(corpus);
}
}
private class CorpusEditListener implements View.OnClickListener {
public void onClick(View v) {
Intent intent = getSettings().getSearchableItemsIntent();
getContext().startActivity(intent);
}
}
public interface OnCorpusSelectedListener {
void onCorpusSelected(String corpusName);
}
}