package com.ushahidi.platform.mobile.app.data.database; import com.ushahidi.platform.mobile.app.data.PrefsFactory; import com.ushahidi.platform.mobile.app.data.entity.PostEntity; import android.app.SearchManager; import android.content.ContentValues; import android.content.SearchRecentSuggestionsProvider; import android.content.SharedPreferences; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; import java.util.ArrayList; import java.util.List; import java.util.Locale; import static android.content.Context.MODE_PRIVATE; /** * Posts {@link android.content.ContentProvider} for providing search suggestions * * @author Ushahidi Team <team@ushahidi.com> */ public class PostContentProvider extends SearchRecentSuggestionsProvider { /** The content provider authority's name */ public static final String AUTHORITY = PostContentProvider.class .getName(); /** Database mode **/ public static final int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES; private static final String TAG = PostContentProvider.class.getSimpleName(); private static final String[] COLUMNS = { BaseColumns._ID, // must include this column SearchManager.SUGGEST_COLUMN_TEXT_1, // First line (title) SearchManager.SUGGEST_COLUMN_TEXT_2, // Second line (smaller text) SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, SearchManager.SUGGEST_COLUMN_INTENT_ACTION, SearchManager.SUGGEST_COLUMN_SHORTCUT_ID }; public PostContentProvider() { setupSuggestions(AUTHORITY, MODE); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String query = selectionArgs[0]; if (query == null || query.length() == 0) { return null; } MatrixCursor cursor = new MatrixCursor(COLUMNS); try { List<PostEntity> list = getSearchResults(query); for (int i = 0; i < list.size(); i++) { cursor.addRow(createRow(i, list.get(i).getTitle(), list.get(i).getContent(), list.get(i)._id)); } } catch (Exception e) { Log.e(TAG, "Failed to lookup " + query, e); } return cursor; } @Override public Uri insert(Uri uri, ContentValues values) { throw new UnsupportedOperationException(); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } private Object[] createRow(Integer id, String text1, String text2, Long rowId) { return new Object[]{ id, // _id text1, // text1 text2, // text2 rowId, "android.intent.action.VIEW", // action SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT}; } private List<PostEntity> getSearchResults(String query) { List<PostEntity> postEntities = new ArrayList<>(); final PostDatabaseHelper mPostDatabaseHelper = new PostDatabaseHelper(getContext()); if (!TextUtils.isEmpty(query)) { final String queryLowerCase = query.toLowerCase(Locale.getDefault()); postEntities = mPostDatabaseHelper.searchQuery( getPrefsFactoryInstance().getActiveDeploymentId().get(), queryLowerCase); } return postEntities; } /** * Not sure how to cleanly get {@link PrefsFactory} injected into the class via dagger so doing * that by hand * * @return An instance of PrefsFactory */ private PrefsFactory getPrefsFactoryInstance() { SharedPreferences sharedPreferences = getContext().getApplicationContext() .getSharedPreferences("ushahidi-android-shared-prefs", MODE_PRIVATE); return new PrefsFactory(sharedPreferences); } }