package com.newsrob.activities; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.SpannableString; import android.text.style.UnderlineSpan; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.TextView.OnEditorActionListener; import com.newsrob.DiscoveredFeed; import com.newsrob.EntryManager; import com.newsrob.R; import com.newsrob.ReaderAPIException; public class SubscribeFeedActivity extends Activity { private ListView listView; private View progressMonitor; private View empty; private EditText query; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.subscribe_feed); progressMonitor = findViewById(R.id.progress); listView = (ListView) findViewById(R.id.discovered_feeds_list); empty = findViewById(R.id.empty); query = (EditText) findViewById(R.id.query); Button searchButton = (Button) findViewById(R.id.search_button); searchButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initiateSearch(); } }); query.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { initiateSearch(); return true; } }); // TEXT & SUBJECT are available per se if (getIntent().hasExtra(Intent.EXTRA_TEXT)) { query.setText(getIntent().getStringExtra(Intent.EXTRA_TEXT)); searchButton.performClick(); } } void initiateSearch() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(query.getWindowToken(), 0); new DiscoverFeedsTask().execute(query.getText().toString().replaceAll("\\s", "")); } private void showProgressMonitor() { listView.setVisibility(View.GONE); empty.setVisibility(View.GONE); progressMonitor.setVisibility(View.VISIBLE); } private void showList() { progressMonitor.setVisibility(View.GONE); if (listView.getCount() == 0) empty.setVisibility(View.VISIBLE); else { listView.setVisibility(View.VISIBLE); } } class SubscribeFeedTask extends AsyncTask<String, Void, Void> { private Exception exception; @Override protected Void doInBackground(String... feedUrls) { for (String feedUrl : feedUrls) try { EntryManager.getInstance(SubscribeFeedActivity.this).getEntriesRetriever().submitSubscribe(feedUrl); } catch (ReaderAPIException e) { exception = e; e.printStackTrace(); break; } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); showList(); if (exception != null) Toast.makeText(SubscribeFeedActivity.this, exception.getClass().getSimpleName() + ": " + exception.getMessage(), Toast.LENGTH_LONG).show(); else Toast.makeText(SubscribeFeedActivity.this, "Feed subscribed.\nSync/Refresh to fetch articles.", Toast.LENGTH_LONG).show(); } @Override protected void onPreExecute() { super.onPreExecute(); showProgressMonitor(); } } class DiscoverFeedsTask extends AsyncTask<String, Void, List<DiscoveredFeed>> { private Exception exception; @Override protected void onPreExecute() { super.onPreExecute(); showProgressMonitor(); } @Override protected void onPostExecute(final List<DiscoveredFeed> result) { super.onPostExecute(result); if (result == null) { progressMonitor.setVisibility(View.GONE); empty.setVisibility(View.VISIBLE); if (exception != null) Toast.makeText(SubscribeFeedActivity.this, exception.getClass().getSimpleName() + ": " + exception.getMessage(), Toast.LENGTH_LONG) .show(); } else { ArrayAdapter<DiscoveredFeed> listAdapter = populateList(result); listView.setAdapter(listAdapter); showList(); } } private ArrayAdapter<DiscoveredFeed> populateList(final List<DiscoveredFeed> result) { ArrayAdapter<DiscoveredFeed> listAdapter = new ArrayAdapter<DiscoveredFeed>(SubscribeFeedActivity.this, R.layout.discovered_feed, result) { @Override public View getView(int position, View convertView, ViewGroup parent) { final DiscoveredFeed df = result.get(position); if (convertView == null) convertView = getLayoutInflater().inflate(R.layout.discovered_feed, null); TextView tv = (TextView) convertView.findViewById(R.id.title); SpannableString content = new SpannableString(df.title); content.setSpan(new UnderlineSpan(), 0, content.length(), 0); tv.setText(content); if (df.alternateUrl != null) { tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(df.alternateUrl))); } }); } else tv.setOnClickListener(null); tv = (TextView) convertView.findViewById(R.id.url); tv.setText(df.feedUrl); tv = (TextView) convertView.findViewById(R.id.snippet); tv.setText(df.snippet != null ? df.snippet : ""); tv.setVisibility(df.snippet != null ? View.VISIBLE : View.GONE); Button b = (Button) convertView.findViewById(R.id.subscribe_button); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new SubscribeFeedTask().execute(df.feedUrl); } }); return convertView; } }; return listAdapter; } @Override protected List<DiscoveredFeed> doInBackground(String... params) { List<DiscoveredFeed> result = null; try { result = EntryManager.getInstance(SubscribeFeedActivity.this).getEntriesRetriever().discoverFeeds( params[0]); } catch (Exception e) { this.exception = e; } return result; } } }