package com.oreilly.demo.android.pa.searchdemo; import com.oreilly.demo.android.pa.R; import android.app.ListActivity; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.SearchRecentSuggestions; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.TextView; public class SearchActivity extends ListActivity { public final static String CONTENT = "content://"; public static SearchLogicInterface SEARCHLOGIC; public static void initializeSearchLogic(Context context) throws Exception { initializeSearchLogic(context, R.raw.sonnets); } public static void initializeSearchLogic(Context context, int resourceId) throws Exception { if(SEARCHLOGIC == null) { // if UseDBSearchLogic (in res/values/bool.xml) // is true then use the SearchDBLogic else use SearchLogic SEARCHLOGIC = context.getResources().getBoolean(R.bool.UseDBSearchLogic) ? new SearchDBLogic(context, resourceId) : new SearchLogic(context, resourceId); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); try { initializeSearchLogic(this); } catch (Exception e) { e.printStackTrace(); } loadView(null); } private void loadView(Sonnet son) { clearUI(); if(SEARCHLOGIC == null) { TextView txt = (TextView) findViewById(R.id.title); txt.setText(R.string.nosonnetsloaded); txt.setVisibility(View.VISIBLE); } else if(son != null){ TextView txt = (TextView) findViewById(R.id.title); txt.setText("Sonnet ".intern() + son.title); txt.setVisibility(View.VISIBLE); for(int i=0;i<son.lines.length;i++) { TextView tline = (TextView) findViewById(getResources().getIdentifier(("line".intern()) + (i+1), "id".intern(), getPackageName())); if(tline != null) { tline.setText(son.lines[i]); tline.setVisibility(View.VISIBLE); } } } else { Intent intent = getIntent(); String query = null; if (Intent.ACTION_SEARCH.equals(intent.getAction())) { query = intent.getStringExtra(SearchManager.QUERY).toLowerCase(); search(query); } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri data = intent.getData(); if(data != null) { query = data.toString().substring(CONTENT.length()).trim(); try { loadView(SEARCHLOGIC.getSonnet(Integer.parseInt(query))); } catch (Exception e) { e.printStackTrace(); } return; } else if(intent.getDataString() != null) { query = intent.getDataString(); } else if(intent.getStringExtra(SearchManager.QUERY) != null) { query = intent.getStringExtra(SearchManager.QUERY).toLowerCase(); } else if(intent.getStringExtra(SearchManager.USER_QUERY) != null) { query = intent.getStringExtra(SearchManager.USER_QUERY).toLowerCase(); } search(query); } } } private final Handler loadViewHandler = new Handler() { public void handleMessage(Message msg) { if(msg != null) { loadView(SEARCHLOGIC.getSonnet(msg.what)); } } }; private void search(String query) { if(query != null) { SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, CustomSearchSuggestionProvider.AUTHORITY, CustomSearchSuggestionProvider.MODE); suggestions.saveRecentQuery(query, null); final SonnetFragment[] sfrags = SEARCHLOGIC.search(query); if(sfrags != null && sfrags.length > 0) { getListView().setVisibility(View.VISIBLE); getListView().addHeaderView(View.inflate(this, R.layout.searchheader, null), null, false); ArrayAdapter<SonnetFragment> arr = new ArrayAdapter<SonnetFragment>(this, R.layout.searchrow, sfrags); setListAdapter(arr); getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> adpt, View view, int pos, long id) { Message.obtain(loadViewHandler, sfrags[pos - 1].num).sendToTarget(); } }); } } } private void clearUI() { getListView().setVisibility(View.GONE); findViewById(R.id.title).setVisibility(View.GONE); findViewById(R.id.line1).setVisibility(View.GONE); findViewById(R.id.line2).setVisibility(View.GONE); findViewById(R.id.line3).setVisibility(View.GONE); findViewById(R.id.line4).setVisibility(View.GONE); findViewById(R.id.line5).setVisibility(View.GONE); findViewById(R.id.line6).setVisibility(View.GONE); findViewById(R.id.line7).setVisibility(View.GONE); findViewById(R.id.line8).setVisibility(View.GONE); findViewById(R.id.line9).setVisibility(View.GONE); findViewById(R.id.line10).setVisibility(View.GONE); findViewById(R.id.line11).setVisibility(View.GONE); findViewById(R.id.line12).setVisibility(View.GONE); findViewById(R.id.line13).setVisibility(View.GONE); findViewById(R.id.line14).setVisibility(View.GONE); findViewById(R.id.line15).setVisibility(View.GONE); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem search = menu.add(Menu.NONE, Menu.NONE, 0, R.string.search); search.setIcon(android.R.drawable.ic_search_category_default); search.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem _menuItem) { onSearchRequested(); return true; } }); MenuItem clearhistory = menu.add(Menu.NONE,Menu.NONE,1, R.string.menu_clearhistory); clearhistory.setIcon(android.R.drawable.ic_delete); clearhistory.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem _menuItem) { SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getBaseContext(), CustomSearchSuggestionProvider.AUTHORITY, CustomSearchSuggestionProvider.MODE); suggestions.clearHistory(); return true; } }); return true; } }