/*******************************************************************************
* Copyright 2012 Crazywater
*
* 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 de.knufficast.ui.search;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import de.knufficast.App;
import de.knufficast.R;
import de.knufficast.events.EventBus;
import de.knufficast.events.Listener;
import de.knufficast.events.NewImageEvent;
import de.knufficast.logic.AddFeedTask;
import de.knufficast.search.ITunesSearch;
import de.knufficast.search.PodcastSearch;
import de.knufficast.search.PodcastSearch.Result;
import de.knufficast.ui.main.MainActivity;
import de.knufficast.ui.settings.SettingsActivity;
import de.knufficast.util.BooleanCallback;
public class SearchFeedActivity extends Activity implements
AddFeedTask.Presenter {
private SearchView searchView;
private ProgressBar searchProgress;
private AddFeedTask addFeedTask;
private ListView searchResultsList;
private ProgressDialog progressDialog;
private final PodcastSearch podcastSearch = new ITunesSearch();
private final List<Result> searchResults = new ArrayList<Result>();
private final Listener<NewImageEvent> newImageListener = new Listener<NewImageEvent>() {
@Override
public void onEvent(NewImageEvent event) {
searchResultsAdapter.notifyDataSetChanged();
}
};
private final OnItemClickListener addFeedListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position,
long arg3) {
// toggle details
addFeed(searchResults.get(position).getFeedUrl());
}
};
private final OnQueryTextListener queryListener = new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
String input = searchView.getQuery().toString();
if (!"".equals(input)) {
if (input.startsWith("http://") || input.startsWith("https://")
|| input.startsWith("www.")) {
addFeed(input);
} else {
searchProgress.setVisibility(View.VISIBLE);
podcastSearch.search(input, searchCallback);
}
}
return true;
}
};
private SearchResultsAdapter searchResultsAdapter;
private EventBus eventBus;
private final BooleanCallback<List<Result>, String> searchCallback = new BooleanCallback<List<Result>, String>() {
@Override
public void success(List<Result> a) {
searchResults.clear();
searchResults.addAll(a);
runOnUiThread(new Runnable() {
@Override
public void run() {
searchProgress.setVisibility(View.GONE);
searchResultsAdapter.notifyDataSetChanged();
}
});
}
@Override
public void fail(String error) {
searchResults.clear();
runOnUiThread(new Runnable() {
@Override
public void run() {
searchProgress.setVisibility(View.GONE);
searchResultsAdapter.notifyDataSetChanged();
}
});
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.activity_feed_search);
searchProgress = (ProgressBar) findViewById(R.id.add_feed_progress);
searchResultsList = (ListView) findViewById(R.id.add_feed_search_results);
searchResultsAdapter = new SearchResultsAdapter(this,
R.layout.search_result_list_item, searchResults);
searchResultsList.setAdapter(searchResultsAdapter);
searchResultsList.setOnItemClickListener(addFeedListener);
}
@Override
public void onStart() {
super.onStart();
eventBus = App.get().getEventBus();
eventBus.addListener(NewImageEvent.class, newImageListener);
}
private void addFeed(String url) {
addFeedTask = new AddFeedTask(this);
addFeedTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
}
@Override
public void onStop() {
super.onStop();
if (addFeedTask != null) {
addFeedTask.cancel(true);
}
eventBus.removeListener(NewImageEvent.class, newImageListener);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// The Android way to ensure correct behavior of the "Up" button in the
// action bar
Intent parentActivityIntent = new Intent(this, MainActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();
return true;
case R.id.menu_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
default:
return false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_feed_search, menu);
searchView = (SearchView) menu.findItem(R.id.add_feed_search)
.getActionView();
Uri uri = getIntent().getData();
if (uri != null) {
searchView.setQuery(uri.toString(), true);
}
searchView.setOnQueryTextListener(queryListener);
searchView.setIconifiedByDefault(false);
searchView.requestFocus();
return true;
}
@Override
public void onFeedAdded() {
addFeedTask = null;
disableProgressDialog();
finish();
}
@Override
public void onFeedAddError(String error) {
addFeedTask = null;
disableProgressDialog();
new AlertDialog.Builder(this).setTitle(R.string.add_feed_failed)
.setMessage(error).show();
}
@Override
public void onStartAddingFeed() {
enableProgressDialog();
}
private void enableProgressDialog() {
String title = getString(R.string.add_feed_progress_title);
String message = getString(R.string.add_feed_progress_message);
progressDialog = ProgressDialog.show(this, title, message);
progressDialog.setCancelable(true);
progressDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
addFeedTask.cancel(true);
}
});
// lock orientation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}
private void disableProgressDialog() {
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}
// unlock orientation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}