1
0
Fork 0
mirror of https://github.com/MatomoCamp/matomocamp-companion-android.git synced 2024-09-19 16:13:46 +02:00

Implemented details display on search suggestion click and global system

search support.
This commit is contained in:
Christophe Beyls 2013-12-30 18:34:48 +01:00
parent 0164b2e280
commit 401d696b6b
5 changed files with 147 additions and 38 deletions

View file

@ -51,7 +51,8 @@
<provider
android:name=".providers.SearchSuggestionProvider"
android:authorities="be.digitalia.fosdem.search" />
android:authorities="be.digitalia.fosdem.search"
android:exported="true" />
</application>
</manifest>

View file

@ -1,32 +1,48 @@
package be.digitalia.fosdem.activities;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import be.digitalia.fosdem.R;
import be.digitalia.fosdem.db.DatabaseManager;
import be.digitalia.fosdem.fragments.EventDetailsFragment;
import be.digitalia.fosdem.loaders.LocalCacheLoader;
import be.digitalia.fosdem.model.Event;
public class EventDetailsActivity extends ActionBarActivity {
public class EventDetailsActivity extends ActionBarActivity implements LoaderCallbacks<Event> {
public static final String EXTRA_EVENT = "event";
public static final String EXTRA_EVENT_ID = "event_id";
private static final int EVENT_LOADER_ID = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content);
Event event = getIntent().getParcelableExtra(EXTRA_EVENT);
ActionBar bar = getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);
bar.setTitle(R.string.event_details);
if (savedInstanceState == null) {
Fragment f = EventDetailsFragment.newInstance(event);
getSupportFragmentManager().beginTransaction().add(R.id.content, f).commit();
Event event = getIntent().getParcelableExtra(EXTRA_EVENT);
if (event != null) {
// The event has been passed as parameter, it can be displayed immediately
if (savedInstanceState == null) {
Fragment f = EventDetailsFragment.newInstance(event);
getSupportFragmentManager().beginTransaction().add(R.id.content, f).commit();
}
} else {
// We need to load the event from the DB using its id
if ((savedInstanceState == null) || (getSupportFragmentManager().findFragmentById(R.id.content) == null)) {
getSupportLoaderManager().initLoader(EVENT_LOADER_ID, null, this);
}
}
}
@ -39,4 +55,39 @@ public class EventDetailsActivity extends ActionBarActivity {
}
return false;
}
private static class EventLoader extends LocalCacheLoader<Event> {
private final int eventId;
public EventLoader(Context context, int eventId) {
super(context);
this.eventId = eventId;
}
@Override
public Event loadInBackground() {
return DatabaseManager.getInstance().getEvent(eventId);
}
}
@Override
public Loader<Event> onCreateLoader(int id, Bundle args) {
return new EventLoader(this, getIntent().getIntExtra(EXTRA_EVENT_ID, -1));
}
@Override
public void onLoadFinished(Loader<Event> loader, Event event) {
if (event == null) {
// Event not found
finish();
return;
}
Fragment f = EventDetailsFragment.newInstance(event);
getSupportFragmentManager().beginTransaction().replace(R.id.content, f).commitAllowingStateLoss();
}
@Override
public void onLoaderReset(Loader<Event> loader) {
}
}

View file

@ -25,34 +25,48 @@ public class SearchResultActivity extends ActionBarActivity {
bar.setTitle(R.string.search_events);
if (savedInstanceState == null) {
handleIntent(getIntent());
handleIntent(getIntent(), false);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
handleIntent(intent, true);
}
private void handleIntent(Intent intent) {
if (!Intent.ACTION_SEARCH.equals(intent.getAction())) {
return;
}
private void handleIntent(Intent intent, boolean isNewIntent) {
String intentAction = intent.getAction();
if (Intent.ACTION_SEARCH.equals(intentAction)) {
// Normal search, results are displayed here
String query = intent.getStringExtra(SearchManager.QUERY);
if (query != null) {
query = query.trim();
}
if ((query == null) || (query.length() < MIN_SEARCH_LENGTH)) {
MessageDialogFragment.newInstance(R.string.error_title, R.string.search_length_error).show(getSupportFragmentManager());
return;
}
String query = intent.getStringExtra(SearchManager.QUERY);
if (query != null) {
query = query.trim();
}
if ((query == null) || (query.length() < MIN_SEARCH_LENGTH)) {
MessageDialogFragment.newInstance(R.string.error_title, R.string.search_length_error).show(getSupportFragmentManager());
return;
}
getSupportActionBar().setSubtitle(query);
getSupportActionBar().setSubtitle(query);
SearchResultListFragment f = SearchResultListFragment.newInstance(query);
getSupportFragmentManager().beginTransaction().replace(R.id.content, f).commit();
SearchResultListFragment f = SearchResultListFragment.newInstance(query);
getSupportFragmentManager().beginTransaction().replace(R.id.content, f).commit();
} else if (Intent.ACTION_VIEW.equals(intentAction)) {
// Search suggestion, dispatch to EventDetailsActivity
String eventId = intent.getDataString();
try {
Intent dispatchIntent = new Intent(this, EventDetailsActivity.class).putExtra(EventDetailsActivity.EXTRA_EVENT_ID, Integer.parseInt(eventId));
startActivity(dispatchIntent);
} catch (NumberFormatException e) {
// Ignore invalid data
}
if (!isNewIntent) {
finish();
}
}
}
@Override

View file

@ -366,6 +366,45 @@ public class DatabaseManager {
return queryNumEntries(helper.getReadableDatabase(), DatabaseHelper.EVENTS_TABLE_NAME, null, null);
}
/**
* Returns the event with the specified id.
*/
public Event getEvent(int id) {
String[] selectionArgs = new String[] { String.valueOf(id) };
Cursor cursor = helper
.getReadableDatabase()
.rawQuery(
"SELECT e.id AS _id, e.start_time, e.end_time, e.room_name, e.slug, et.title, et.subtitle, e.abstract, e.description, GROUP_CONCAT(p.name, ', '), e.day_index, d.date, t.name, t.type"
+ " FROM "
+ DatabaseHelper.EVENTS_TABLE_NAME
+ " e"
+ " JOIN "
+ DatabaseHelper.EVENTS_TITLES_TABLE_NAME
+ " et ON e.id = et.rowid"
+ " JOIN "
+ DatabaseHelper.DAYS_TABLE_NAME
+ " d ON e.day_index = d._index"
+ " JOIN "
+ DatabaseHelper.TRACKS_TABLE_NAME
+ " t ON e.track_id = t.id"
+ " JOIN "
+ DatabaseHelper.EVENTS_PERSONS_TABLE_NAME
+ " ep ON e.id = ep.event_id"
+ " JOIN "
+ DatabaseHelper.PERSONS_TABLE_NAME
+ " p ON ep.person_id = p.rowid"
+ " WHERE e.id = ?" + " GROUP BY e.id", selectionArgs);
try {
if (cursor.moveToFirst()) {
return toEvent(cursor);
} else {
return null;
}
} finally {
cursor.close();
}
}
/**
*
* @param day
@ -550,22 +589,22 @@ public class DatabaseManager {
* Method called by SearchSuggestionProvider to return search results in the format expected by the search framework.
*
*/
public Cursor getSearchSuggestionResults(String query) {
public Cursor getSearchSuggestionResults(String query, int limit) {
final String matchQuery = query + "*";
String[] selectionArgs = new String[] { matchQuery, "%" + query + "%", matchQuery };
String[] selectionArgs = new String[] { matchQuery, "%" + query + "%", matchQuery, String.valueOf(limit) };
// Query is similar to getSearchResults but returns different columns, does not join the Day table and limits the result set to 5 entries.
Cursor cursor = helper.getReadableDatabase().rawQuery(
"SELECT e.id AS " + BaseColumns._ID + ", et.title AS " + SearchManager.SUGGEST_COLUMN_TEXT_1
+ ", GROUP_CONCAT(p.name, ', ') || ' - ' || t.name AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + " FROM "
+ DatabaseHelper.EVENTS_TABLE_NAME + " e" + " JOIN " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " et ON e.id = et.rowid" + " JOIN "
+ DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" + " JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME
+ " ep ON e.id = ep.event_id" + " JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE e.id IN ( "
+ "SELECT rowid" + " FROM " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " WHERE " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME
+ " MATCH ?" + " UNION " + "SELECT e.id" + " FROM " + DatabaseHelper.EVENTS_TABLE_NAME + " e" + " JOIN "
+ DatabaseHelper.TRACKS_TABLE_NAME + " t ON e.track_id = t.id" + " WHERE t.name LIKE ?" + " UNION " + "SELECT ep.event_id" + " FROM "
+ ", GROUP_CONCAT(p.name, ', ') || ' - ' || t.name AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ", e.id AS "
+ SearchManager.SUGGEST_COLUMN_INTENT_DATA + " FROM " + DatabaseHelper.EVENTS_TABLE_NAME + " e" + " JOIN "
+ DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " et ON e.id = et.rowid" + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME
+ " t ON e.track_id = t.id" + " JOIN " + DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep ON e.id = ep.event_id" + " JOIN "
+ DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid" + " WHERE e.id IN ( " + "SELECT rowid" + " FROM "
+ DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " WHERE " + DatabaseHelper.EVENTS_TITLES_TABLE_NAME + " MATCH ?" + " UNION "
+ "SELECT e.id" + " FROM " + DatabaseHelper.EVENTS_TABLE_NAME + " e" + " JOIN " + DatabaseHelper.TRACKS_TABLE_NAME
+ " t ON e.track_id = t.id" + " WHERE t.name LIKE ?" + " UNION " + "SELECT ep.event_id" + " FROM "
+ DatabaseHelper.EVENTS_PERSONS_TABLE_NAME + " ep" + " JOIN " + DatabaseHelper.PERSONS_TABLE_NAME + " p ON ep.person_id = p.rowid"
+ " WHERE p.name MATCH ?" + " )" + " GROUP BY e.id" + " ORDER BY e.start_time ASC LIMIT 5", selectionArgs);
cursor.setNotificationUri(context.getContentResolver(), URI_SCHEDULE);
+ " WHERE p.name MATCH ?" + " )" + " GROUP BY e.id" + " ORDER BY e.start_time ASC LIMIT ?", selectionArgs);
return cursor;
}

View file

@ -1,11 +1,12 @@
package be.digitalia.fosdem.providers;
import be.digitalia.fosdem.db.DatabaseManager;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import be.digitalia.fosdem.db.DatabaseManager;
public class SearchSuggestionProvider extends ContentProvider {
@ -44,10 +45,13 @@ public class SearchSuggestionProvider extends ContentProvider {
return null;
}
query = query.trim();
if (query.length() < MIN_QUERY_LENGTH) {
if ((query.length() < MIN_QUERY_LENGTH) || ("search_suggest_query".equals(query))) {
return null;
}
return DatabaseManager.getInstance().getSearchSuggestionResults(query);
String limitParam = uri.getQueryParameter("limit");
int limit = TextUtils.isEmpty(limitParam) ? 5 : Integer.parseInt(limitParam);
return DatabaseManager.getInstance().getSearchSuggestionResults(query, limit);
}
}