package com.quran.labs.androidquran; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.content.LocalBroadcastManager; import android.text.Html; import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CursorAdapter; import android.widget.ListView; import android.widget.TextView; import com.quran.labs.androidquran.data.QuranDataProvider; import com.quran.labs.androidquran.data.QuranInfo; import com.quran.labs.androidquran.service.QuranDownloadService; import com.quran.labs.androidquran.service.util.DefaultDownloadReceiver; import com.quran.labs.androidquran.service.util.QuranDownloadNotifier; import com.quran.labs.androidquran.service.util.ServiceIntentHelper; import com.quran.labs.androidquran.ui.PagerActivity; import com.quran.labs.androidquran.ui.QuranActionBarActivity; import com.quran.labs.androidquran.ui.TranslationManagerActivity; import com.quran.labs.androidquran.util.QuranFileUtils; import com.quran.labs.androidquran.util.QuranUtils; public class SearchActivity extends QuranActionBarActivity implements DefaultDownloadReceiver.SimpleDownloadListener, LoaderManager.LoaderCallbacks<Cursor> { public static final String SEARCH_INFO_DOWNLOAD_KEY = "SEARCH_INFO_DOWNLOAD_KEY"; private static final String EXTRA_QUERY = "EXTRA_QUERY"; private TextView messageView; private TextView warningView; private Button buttonGetTranslations; private boolean downloadArabicSearchDb; private boolean isArabicSearch; private String query; private ResultAdapter adapter; private DefaultDownloadReceiver downloadReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); messageView = (TextView) findViewById(R.id.search_area); warningView = (TextView) findViewById(R.id.search_warning); buttonGetTranslations = (Button) findViewById(R.id.btnGetTranslations); buttonGetTranslations.setOnClickListener(v -> { Intent intent; if (downloadArabicSearchDb) { downloadArabicSearchDb(); return; } else { intent = new Intent(getApplicationContext(), TranslationManagerActivity.class); } startActivity(intent); finish(); }); handleIntent(getIntent()); } @Override public void onPause() { if (downloadReceiver != null) { downloadReceiver.setListener(null); LocalBroadcastManager.getInstance(this).unregisterReceiver(downloadReceiver); downloadReceiver = null; } super.onPause(); } private void downloadArabicSearchDb() { if (downloadReceiver == null) { downloadReceiver = new DefaultDownloadReceiver(this, QuranDownloadService.DOWNLOAD_TYPE_ARABIC_SEARCH_DB); LocalBroadcastManager.getInstance(this).registerReceiver( downloadReceiver, new IntentFilter(QuranDownloadNotifier.ProgressIntent.INTENT_NAME)); } downloadReceiver.setListener(this); String url = QuranFileUtils.getArabicSearchDatabaseUrl(); String notificationTitle = getString(R.string.search_data); Intent intent = ServiceIntentHelper.getDownloadIntent(this, url, QuranFileUtils.getQuranDatabaseDirectory(this), notificationTitle, SEARCH_INFO_DOWNLOAD_KEY, QuranDownloadService.DOWNLOAD_TYPE_ARABIC_SEARCH_DB); intent.putExtra(QuranDownloadService.EXTRA_OUTPUT_FILE_NAME, QuranDataProvider.QURAN_ARABIC_DATABASE); startService(intent); } @Override public void handleDownloadSuccess() { warningView.setVisibility(View.GONE); buttonGetTranslations.setVisibility(View.GONE); handleIntent(getIntent()); } @Override public void handleDownloadFailure(int errId) { } @Override protected void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { String query = args.getString(EXTRA_QUERY); this.query = query; return new CursorLoader(this, QuranDataProvider.SEARCH_URI, null, null, new String[]{ query }, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { isArabicSearch = QuranUtils.doesStringContainArabic(query); boolean showArabicWarning = (isArabicSearch && !QuranFileUtils.hasArabicSearchDatabase(this)); if (showArabicWarning) { isArabicSearch = false; } if (cursor == null) { if (showArabicWarning) { warningView.setText( getString(R.string.no_arabic_search_available)); warningView.setVisibility(View.VISIBLE); buttonGetTranslations.setText( getString(R.string.get_arabic_search_db)); buttonGetTranslations.setVisibility(View.VISIBLE); } messageView.setText(getString(R.string.no_results, new Object[]{ query })); } else { if (showArabicWarning) { warningView.setText(R.string.no_arabic_search_available); warningView.setVisibility(View.VISIBLE); buttonGetTranslations.setText( getString(R.string.get_arabic_search_db)); buttonGetTranslations.setVisibility(View.VISIBLE); downloadArabicSearchDb = true; } // Display the number of results int count = cursor.getCount(); String countString = getResources().getQuantityString( R.plurals.search_results, count, query, count); messageView.setText(countString); ListView listView = (ListView) findViewById(R.id.results_list); if (adapter == null) { adapter = new ResultAdapter(this, cursor); listView.setAdapter(adapter); listView.setOnItemClickListener((parent, view, position, id) -> { ListView p = (ListView) parent; final Cursor currentCursor = (Cursor) p.getAdapter().getItem(position); jumpToResult(currentCursor.getInt(1), currentCursor.getInt(2)); }); } else { adapter.changeCursor(cursor); } } } @Override public void onLoaderReset(Loader<Cursor> loader) { if (adapter != null) { adapter.changeCursor(null); } } private void handleIntent(Intent intent) { if (intent == null) { return; } if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); showResults(query); } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri intentData = intent.getData(); String query = intent.getStringExtra(SearchManager.USER_QUERY); if (query == null) { Bundle extras = intent.getExtras(); if (extras != null) { // bug on ics where the above returns null // http://code.google.com/p/android/issues/detail?id=22978 Object q = extras.get(SearchManager.USER_QUERY); if (q != null && q instanceof SpannableString) { query = q.toString(); } } } if (QuranUtils.doesStringContainArabic(query)) { isArabicSearch = true; } if (isArabicSearch) { // if we come from muyassar and don't have arabic db, we set // arabic search to false so we jump to the translation. if (!QuranFileUtils.hasArabicSearchDatabase(this)) { isArabicSearch = false; } } Integer id = null; try { id = intentData.getLastPathSegment() != null ? Integer.valueOf(intentData.getLastPathSegment()) : null; } catch (NumberFormatException e) { // no op } if (id != null) { int sura = 1; int total = id; for (int j = 1; j <= 114; j++) { int cnt = QuranInfo.getNumAyahs(j); total -= cnt; if (total >= 0) sura++; else { total += cnt; break; } } if (total == 0){ sura--; total = QuranInfo.getNumAyahs(sura); } jumpToResult(sura, total); finish(); } } } private void jumpToResult(int sura, int ayah) { int page = QuranInfo.getPageFromSuraAyah(sura, ayah); Intent intent = new Intent(this, PagerActivity.class); intent.putExtra(PagerActivity.EXTRA_HIGHLIGHT_SURA, sura); intent.putExtra(PagerActivity.EXTRA_HIGHLIGHT_AYAH, ayah); if (!isArabicSearch) { intent.putExtra(PagerActivity.EXTRA_JUMP_TO_TRANSLATION, true); } intent.putExtra("page", page); startActivity(intent); } private void showResults(String query) { Bundle args = new Bundle(); args.putString(EXTRA_QUERY, query); getSupportLoaderManager().restartLoader(0, args, this); } private static class ResultAdapter extends CursorAdapter { private Context context; private LayoutInflater inflater; ResultAdapter(Context context, Cursor cursor) { super(context, cursor, 0); inflater = LayoutInflater.from(context); this.context = context; } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { final View view = inflater.inflate(R.layout.search_result, parent, false); ViewHolder holder = new ViewHolder(); holder.text = (TextView) view.findViewById(R.id.verseText); holder.metadata = (TextView) view.findViewById(R.id.verseLocation); view.setTag(holder); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { final ViewHolder holder = (ViewHolder) view.getTag(); int sura = cursor.getInt(1); int ayah = cursor.getInt(2); String text = cursor.getString(3); String suraName = QuranInfo.getSuraName(this.context, sura, false); holder.text.setText(Html.fromHtml(text)); holder.metadata.setText(this.context.getString(R.string.found_in_sura, suraName, ayah)); } static class ViewHolder { TextView text; TextView metadata; } } }