Java tutorial
/* * Copyright (C) 2007 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 info.xuluan.podcast; import info.xuluan.podcastj.R; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.json.JSONArray; import org.json.JSONObject; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; import android.text.Html; import android.text.TextWatcher; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ListView; import android.widget.Toast; import info.xuluan.podcast.fetcher.FeedFetcher; import info.xuluan.podcast.fetcher.Response; import info.xuluan.podcast.parser.SearchItem; import info.xuluan.podcast.provider.Subscription; import info.xuluan.podcast.utils.Log; public class SearchActivity extends PodcastBaseActivity implements TextWatcher, PodcastTab { private final Log log = Log.getLog(getClass()); private ProgressDialog progress = null; EditText mEditText; String mHttpContent = ""; private ArrayAdapter<String> mAdapter; private int mStart = 0; public List<SearchItem> mItems = new ArrayList<SearchItem>(); private ArrayList<String> mStrings = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_activity); setTitle(getResources().getString(R.string.title_channels)); mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings); setListAdapter(mAdapter); getListView().setOnCreateContextMenuListener(this); mEditText = (EditText) findViewById(R.id.keywords); mEditText.addTextChangedListener(this); startInit(); Button next = (Button) findViewById(R.id.ButtonNext); next.setEnabled(false); next.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String str = "&start=" + mStart; String url = getUrl(); if (url != null) { start_search(url + str); } } }); ImageButton start = (ImageButton) findViewById(R.id.ButtonStart); start.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); m.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS); m.hideSoftInputFromInputMethod(mEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); String str = "&start=" + mStart; String url = getUrl(); if (url != null) { start_search(url + str); } } }); TabsHelper.setChannelTabClickListeners(this, R.id.channel_bar_search_button); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.search_activity, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { /* case R.id.backup_channels: startActivity(new Intent(this, BackupChannelsActivity.class)); return true; case R.id.add_channel: startActivity(new Intent(this, AddChannelActivity.class)); return true; case R.id.list_channels: startActivity(new Intent(this, ChannelsActivity.class)); return true;*/ } return super.onOptionsItemSelected(item); } public String getUrl() { String prefix = "http://lfe-alpo-gm.appspot.com/search?q="; String suffix = ""; String str = SearchActivity.this.mEditText.getText().toString(); Pattern pattern = Pattern.compile("^\\s+"); Matcher matcher = pattern.matcher(str); str = matcher.replaceAll(""); pattern = Pattern.compile("\\s+$"); matcher = pattern.matcher(str); str = matcher.replaceAll(""); pattern = Pattern.compile("\\s+"); matcher = pattern.matcher(str); str = matcher.replaceAll("+"); log.debug("query string = " + str); if (str.length() > 0) return prefix + str + suffix; return null; } public List<SearchItem> parseResult(String content) { List<SearchItem> items = new ArrayList<SearchItem>(); try { JSONObject obj_match = new JSONObject(content); JSONArray arr = obj_match.getJSONArray("items"); if (arr.length() == 0) { } for (int i = 0; i < arr.length(); i++) { SearchItem item = new SearchItem(); JSONObject obj = new JSONObject(arr.get(i).toString()); item.url = obj.get("feed_url").toString(); item.link = obj.get("feed_url").toString(); item.title = obj.get("feed_title").toString(); item.content = obj.get("summary").toString(); items.add(item); } } catch (Exception e) { } return items; } public String fetchChannelInfo(String url) { FeedFetcher fetcher = new FeedFetcher("Google-Listen/1.1.2 (droid)"); try { Response response = fetcher.fetch(url); if (response != null) { return response.getContentAsString(); } } catch (Exception e) { // e.printStackTrace(); } return null; } private void start_search(String search_url) { SearchActivity.this.progress = ProgressDialog.show(SearchActivity.this, getResources().getText(R.string.dialog_title_loading), getResources().getText(R.string.dialog_message_loading), true); AsyncTask<String, ProgressDialog, String> asyncTask = new AsyncTask<String, ProgressDialog, String>() { String url; @Override protected String doInBackground(String... params) { url = params[0]; // log.debug("doInBackground URL ="+url); return fetchChannelInfo(url); } @Override protected void onPostExecute(String result) { if (SearchActivity.this.progress != null) { SearchActivity.this.progress.dismiss(); SearchActivity.this.progress = null; } if (result == null) { Toast.makeText(SearchActivity.this, getResources().getString(R.string.network_fail), Toast.LENGTH_SHORT).show(); } else { List<SearchItem> items = parseResult(result); if (items.size() == 0) { Toast.makeText(SearchActivity.this, getResources().getString(R.string.no_data_found), Toast.LENGTH_SHORT).show(); } else { mStart += items.size(); for (int i = 0; i < items.size(); i++) { mItems.add(items.get(i)); mAdapter.add(items.get(i).title); } } } updateBtn(); } }; asyncTask.execute(search_url); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { final SearchItem item = mItems.get(position); String content = item.content; AlertDialog d = new AlertDialog.Builder(this).setIcon(R.drawable.alert_dialog_icon).setTitle(item.title) .setMessage(Html.fromHtml(content)) .setPositiveButton(R.string.subscribe, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Subscription sub = new Subscription(item.url); sub.link = item.link; String tags = SearchActivity.this.mEditText.getText().toString(); String content = "<tag>" + tags + "</tag>"; content += "<content>" + item.content + "</content>"; sub.comment = content; int rc = sub.subscribe(getContentResolver()); if (rc == Subscription.ADD_FAIL_DUP) { Toast.makeText(SearchActivity.this, getResources().getString(R.string.already_subscribed), Toast.LENGTH_SHORT) .show(); } else if (rc == Subscription.ADD_SUCCESS) { Toast.makeText(SearchActivity.this, getResources().getString(R.string.success), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(SearchActivity.this, getResources().getString(R.string.fail), Toast.LENGTH_SHORT).show(); } mServiceBinder.start_update(); } }).setNegativeButton(R.string.menu_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked Cancel so do some stuff */ } }).create(); d.show(); } public void updateBtn() { Button next = (Button) findViewById(R.id.ButtonNext); if (mStart == 0) { next.setEnabled(false); } else { next.setEnabled(true); } } //@Override public void afterTextChanged(Editable arg0) { mStart = 0; mItems.clear(); mAdapter.clear(); updateBtn(); } //@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } //@Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } //PodcastTab interface public int iconResource() { return R.drawable.search_big_pic; } public int tabLabelResource(boolean isLandscape) { return R.string.channel_bar_button_search; } }