package com.vaguehope.onosendai.ui; import java.util.List; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import com.vaguehope.onosendai.R; import com.vaguehope.onosendai.config.Config; import com.vaguehope.onosendai.images.ImageLoader; import com.vaguehope.onosendai.model.MetaType; import com.vaguehope.onosendai.model.Tweet; import com.vaguehope.onosendai.model.TweetList; import com.vaguehope.onosendai.model.TweetListAdapter; import com.vaguehope.onosendai.storage.DbProvider; import com.vaguehope.onosendai.util.DialogHelper; import com.vaguehope.onosendai.util.LogWrapper; import com.vaguehope.onosendai.util.Result; public class LocalSearchDialog { private static final LogWrapper LOG = new LogWrapper("LS"); public interface OnTweetListener { void onTweet (int colId, Tweet tweet); } public static void show (final Context context, final Config conf, final DbProvider dbProvider, final ImageLoader imageLoader, final OnTweetListener onTweetListener) { final LocalSearchDialog lsDlg = new LocalSearchDialog(context, conf, dbProvider, imageLoader, onTweetListener); final AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(context); dlgBuilder.setView(lsDlg.getRootView()); final AlertDialog dlg = dlgBuilder.create(); lsDlg.setDialog(dlg); dlg.show(); } private final Context context; private final Config conf; private final DbProvider dbProvider; private final View llParent; private final EditText txtSearch; private final TweetListAdapter tweetAdaptor; private Dialog dialog; private LocalSearchDialog (final Context context, final Config conf, final DbProvider dbProvider, final ImageLoader imageLoader, final OnTweetListener onTweetListener) { this.context = context; this.conf = conf; this.dbProvider = dbProvider; final LayoutInflater inflater = LayoutInflater.from(context); this.llParent = inflater.inflate(R.layout.localsearch, null); this.txtSearch = (EditText) this.llParent.findViewById(R.id.txtSearch); final ListView tweetList = (ListView) this.llParent.findViewById(R.id.tweetList); tweetList.setEmptyView(this.llParent.findViewById(R.id.empty)); this.tweetAdaptor = new TweetListAdapter(context, false, imageLoader, tweetList); tweetList.setAdapter(this.tweetAdaptor); ((Button) this.llParent.findViewById(R.id.btnSearch)).setOnClickListener(new OnClickListener() { @Override public void onClick (final View v) { btnSearchClicked(); } }); tweetList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick (final AdapterView<?> parent, final View view, final int position, final long id) { final Tweet tweet = LocalSearchDialog.this.tweetAdaptor.getTweet(position); final int colId = tweet.getFirstMetaOfType(MetaType.COLUMN_ID).toInt(-1); onTweetListener.onTweet(colId, tweet); LocalSearchDialog.this.dialog.dismiss(); } }); } private void setDialog (final Dialog dialog) { this.dialog = dialog; } private View getRootView () { return this.llParent; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - protected void btnSearchClicked () { new SearchTweets(this, this.txtSearch.getText().toString()).execute(); } private static class SearchTweets extends AsyncTask<Void, Void, Result<TweetList>> { private final LocalSearchDialog dlg; private final String searchTerm; private ProgressDialog dialog; public SearchTweets (final LocalSearchDialog dlg, final String searchTerm) { this.dlg = dlg; this.searchTerm = searchTerm; } @Override protected void onPreExecute () { this.dialog = ProgressDialog.show(this.dlg.context, "Tweets", "Searching...", true); //ES } @Override protected Result<TweetList> doInBackground (final Void... params) { try { final List<Tweet> tweets = this.dlg.dbProvider.getDb().searchTweets(this.searchTerm, this.dlg.conf.getColumns(), 50); return new Result<TweetList>(new TweetList(tweets)); } catch (final Exception e) { // NOSONAR needed to report errors. return new Result<TweetList>(e); } } @Override protected void onPostExecute (final Result<TweetList> result) { this.dialog.dismiss(); if (result.isSuccess()) { this.dlg.tweetAdaptor.setInputData(result.getData()); } else { LOG.e("Failed to run local search.", result.getE()); DialogHelper.alert(this.dlg.context, result.getE()); } } } }