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:
parent
0164b2e280
commit
401d696b6b
5 changed files with 147 additions and 38 deletions
|
@ -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>
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue