/* * Copyright (C) 2014 The CyanogenMod Project * * 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 com.naman14.timber.provider; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; public class SearchHistory { private static final int MAX_ITEMS_IN_DB = 25; private static SearchHistory sInstance = null; private MusicDB mMusicDatabase = null; public SearchHistory(final Context context) { mMusicDatabase = MusicDB.getInstance(context); } public static final synchronized SearchHistory getInstance(final Context context) { if (sInstance == null) { sInstance = new SearchHistory(context.getApplicationContext()); } return sInstance; } public void onCreate(final SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + SearchHistoryColumns.NAME + " (" + SearchHistoryColumns.SEARCHSTRING + " STRING NOT NULL," + SearchHistoryColumns.TIMESEARCHED + " LONG NOT NULL);"); } public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { } public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + SearchHistoryColumns.NAME); onCreate(db); } public void addSearchString(final String searchString) { if (searchString == null) { return; } String trimmedString = searchString.trim(); if (trimmedString.isEmpty()) { return; } final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.beginTransaction(); try { database.delete(SearchHistoryColumns.NAME, SearchHistoryColumns.SEARCHSTRING + " = ? COLLATE NOCASE", new String[]{trimmedString}); final ContentValues values = new ContentValues(2); values.put(SearchHistoryColumns.SEARCHSTRING, trimmedString); values.put(SearchHistoryColumns.TIMESEARCHED, System.currentTimeMillis()); database.insert(SearchHistoryColumns.NAME, null, values); Cursor oldest = null; try { database.query(SearchHistoryColumns.NAME, new String[]{SearchHistoryColumns.TIMESEARCHED}, null, null, null, null, SearchHistoryColumns.TIMESEARCHED + " ASC"); if (oldest != null && oldest.getCount() > MAX_ITEMS_IN_DB) { oldest.moveToPosition(oldest.getCount() - MAX_ITEMS_IN_DB); long timeOfRecordToKeep = oldest.getLong(0); database.delete(SearchHistoryColumns.NAME, SearchHistoryColumns.TIMESEARCHED + " < ?", new String[]{String.valueOf(timeOfRecordToKeep)}); } } finally { if (oldest != null) { oldest.close(); oldest = null; } } } finally { database.setTransactionSuccessful(); database.endTransaction(); } } public Cursor queryRecentSearches(final String limit) { final SQLiteDatabase database = mMusicDatabase.getReadableDatabase(); return database.query(SearchHistoryColumns.NAME, new String[]{SearchHistoryColumns.SEARCHSTRING}, null, null, null, null, SearchHistoryColumns.TIMESEARCHED + " DESC", limit); } public ArrayList<String> getRecentSearches() { Cursor searches = queryRecentSearches(String.valueOf(MAX_ITEMS_IN_DB)); ArrayList<String> results = new ArrayList<String>(MAX_ITEMS_IN_DB); try { if (searches != null && searches.moveToFirst()) { int colIdx = searches.getColumnIndex(SearchHistoryColumns.SEARCHSTRING); do { results.add(searches.getString(colIdx)); } while (searches.moveToNext()); } } finally { if (searches != null) { searches.close(); searches = null; } } return results; } public interface SearchHistoryColumns { /* Table name */ String NAME = "searchhistory"; /* What was searched */ String SEARCHSTRING = "searchstring"; /* Time of search */ String TIMESEARCHED = "timesearched"; } }