|
|
@ -13,6 +13,13 @@ import android.support.annotation.NonNull; |
|
|
|
import android.support.annotation.Nullable; |
|
|
|
import android.support.annotation.Nullable; |
|
|
|
import android.support.annotation.WorkerThread; |
|
|
|
import android.support.annotation.WorkerThread; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.anthonycr.bonsai.Completable; |
|
|
|
|
|
|
|
import com.anthonycr.bonsai.CompletableAction; |
|
|
|
|
|
|
|
import com.anthonycr.bonsai.CompletableSubscriber; |
|
|
|
|
|
|
|
import com.anthonycr.bonsai.Single; |
|
|
|
|
|
|
|
import com.anthonycr.bonsai.SingleAction; |
|
|
|
|
|
|
|
import com.anthonycr.bonsai.SingleSubscriber; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
@ -22,9 +29,15 @@ import javax.inject.Singleton; |
|
|
|
import acr.browser.lightning.R; |
|
|
|
import acr.browser.lightning.R; |
|
|
|
import acr.browser.lightning.database.HistoryItem; |
|
|
|
import acr.browser.lightning.database.HistoryItem; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* The disk backed download database. |
|
|
|
|
|
|
|
* See {@link HistoryModel} for method |
|
|
|
|
|
|
|
* documentation. |
|
|
|
|
|
|
|
*/ |
|
|
|
@Singleton |
|
|
|
@Singleton |
|
|
|
@WorkerThread |
|
|
|
@WorkerThread |
|
|
|
public class HistoryDatabase extends SQLiteOpenHelper { |
|
|
|
public class HistoryDatabase extends SQLiteOpenHelper implements HistoryModel { |
|
|
|
|
|
|
|
|
|
|
|
// All Static variables
|
|
|
|
// All Static variables
|
|
|
|
// Database Version
|
|
|
|
// Database Version
|
|
|
@ -45,9 +58,8 @@ public class HistoryDatabase extends SQLiteOpenHelper { |
|
|
|
@Nullable private SQLiteDatabase mDatabase; |
|
|
|
@Nullable private SQLiteDatabase mDatabase; |
|
|
|
|
|
|
|
|
|
|
|
@Inject |
|
|
|
@Inject |
|
|
|
HistoryDatabase(@NonNull Application application) { |
|
|
|
public HistoryDatabase(@NonNull Application application) { |
|
|
|
super(application, DATABASE_NAME, null, DATABASE_VERSION); |
|
|
|
super(application, DATABASE_NAME, null, DATABASE_VERSION); |
|
|
|
mDatabase = HistoryDatabase.this.getWritableDatabase(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Creating Tables
|
|
|
|
// Creating Tables
|
|
|
@ -87,33 +99,101 @@ public class HistoryDatabase extends SQLiteOpenHelper { |
|
|
|
return mDatabase; |
|
|
|
return mDatabase; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
@NonNull |
|
|
|
synchronized void deleteHistory() { |
|
|
|
@Override |
|
|
|
lazyDatabase().delete(TABLE_HISTORY, null, null); |
|
|
|
public Completable deleteHistory() { |
|
|
|
lazyDatabase().close(); |
|
|
|
return Completable.create(new CompletableAction() { |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public void onSubscribe(@NonNull CompletableSubscriber subscriber) { |
|
|
|
|
|
|
|
lazyDatabase().delete(TABLE_HISTORY, null, null); |
|
|
|
|
|
|
|
lazyDatabase().close(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subscriber.onComplete(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
@NonNull |
|
|
|
synchronized void deleteHistoryItem(@NonNull String url) { |
|
|
|
@Override |
|
|
|
lazyDatabase().delete(TABLE_HISTORY, KEY_URL + " = ?", new String[]{url}); |
|
|
|
public Completable deleteHistoryItem(@NonNull final String url) { |
|
|
|
|
|
|
|
return Completable.create(new CompletableAction() { |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public void onSubscribe(@NonNull CompletableSubscriber subscriber) { |
|
|
|
|
|
|
|
lazyDatabase().delete(TABLE_HISTORY, KEY_URL + " = ?", new String[]{url}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subscriber.onComplete(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
@NonNull |
|
|
|
synchronized void visitHistoryItem(@NonNull String url, @Nullable String title) { |
|
|
|
@Override |
|
|
|
ContentValues values = new ContentValues(); |
|
|
|
public Completable visitHistoryItem(@NonNull final String url, @Nullable final String title) { |
|
|
|
values.put(KEY_TITLE, title == null ? "" : title); |
|
|
|
return Completable.create(new CompletableAction() { |
|
|
|
values.put(KEY_TIME_VISITED, System.currentTimeMillis()); |
|
|
|
@Override |
|
|
|
|
|
|
|
public void onSubscribe(@NonNull CompletableSubscriber subscriber) { |
|
|
|
|
|
|
|
ContentValues values = new ContentValues(); |
|
|
|
|
|
|
|
values.put(KEY_TITLE, title == null ? "" : title); |
|
|
|
|
|
|
|
values.put(KEY_TIME_VISITED, System.currentTimeMillis()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Cursor cursor = lazyDatabase().query(false, TABLE_HISTORY, new String[]{KEY_URL}, |
|
|
|
|
|
|
|
KEY_URL + " = ?", new String[]{url}, null, null, null, "1"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (cursor.getCount() > 0) { |
|
|
|
|
|
|
|
lazyDatabase().update(TABLE_HISTORY, values, KEY_URL + " = ?", new String[]{url}); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
addHistoryItem(new HistoryItem(url, title == null ? "" : title)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cursor.close(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Cursor cursor = lazyDatabase().query(false, TABLE_HISTORY, new String[]{KEY_URL}, |
|
|
|
@NonNull |
|
|
|
KEY_URL + " = ?", new String[]{url}, null, null, null, "1"); |
|
|
|
@Override |
|
|
|
|
|
|
|
public Single<List<HistoryItem>> findHistoryItemsContaining(@NonNull final String query) { |
|
|
|
|
|
|
|
return Single.create(new SingleAction<List<HistoryItem>>() { |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public void onSubscribe(@NonNull SingleSubscriber<List<HistoryItem>> subscriber) { |
|
|
|
|
|
|
|
List<HistoryItem> itemList = new ArrayList<>(5); |
|
|
|
|
|
|
|
|
|
|
|
if (cursor.getCount() > 0) { |
|
|
|
String search = '%' + query + '%'; |
|
|
|
lazyDatabase().update(TABLE_HISTORY, values, KEY_URL + " = ?", new String[]{url}); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
addHistoryItem(new HistoryItem(url, title == null ? "" : title)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cursor.close(); |
|
|
|
Cursor cursor = lazyDatabase().query(TABLE_HISTORY, null, KEY_TITLE + " LIKE ? OR " + KEY_URL + " LIKE ?", |
|
|
|
|
|
|
|
new String[]{search, search}, null, null, KEY_TIME_VISITED + " DESC", "5"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (cursor.moveToNext()) { |
|
|
|
|
|
|
|
itemList.add(fromCursor(cursor)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cursor.close(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subscriber.onItem(itemList); |
|
|
|
|
|
|
|
subscriber.onComplete(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@NonNull |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public Single<List<HistoryItem>> lastHundredVisitedHistoryItems() { |
|
|
|
|
|
|
|
return Single.create(new SingleAction<List<HistoryItem>>() { |
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public void onSubscribe(@NonNull SingleSubscriber<List<HistoryItem>> subscriber) { |
|
|
|
|
|
|
|
List<HistoryItem> itemList = new ArrayList<>(100); |
|
|
|
|
|
|
|
Cursor cursor = lazyDatabase().query(TABLE_HISTORY, null, null, null, null, null, KEY_TIME_VISITED + " DESC", "100"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (cursor.moveToNext()) { |
|
|
|
|
|
|
|
itemList.add(fromCursor(cursor)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cursor.close(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subscriber.onItem(itemList); |
|
|
|
|
|
|
|
subscriber.onComplete(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
@WorkerThread |
|
|
@ -140,43 +220,6 @@ public class HistoryDatabase extends SQLiteOpenHelper { |
|
|
|
return m; |
|
|
|
return m; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
|
|
|
|
@NonNull |
|
|
|
|
|
|
|
synchronized List<HistoryItem> findItemsContaining(@Nullable String search) { |
|
|
|
|
|
|
|
List<HistoryItem> itemList = new ArrayList<>(5); |
|
|
|
|
|
|
|
if (search == null) { |
|
|
|
|
|
|
|
return itemList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
search = '%' + search + '%'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Cursor cursor = lazyDatabase().query(TABLE_HISTORY, null, KEY_TITLE + " LIKE ? OR " + KEY_URL + " LIKE ?", |
|
|
|
|
|
|
|
new String[]{search, search}, null, null, KEY_TIME_VISITED + " DESC", "5"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (cursor.moveToNext()) { |
|
|
|
|
|
|
|
itemList.add(fromCursor(cursor)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cursor.close(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return itemList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
|
|
|
|
@NonNull |
|
|
|
|
|
|
|
synchronized List<HistoryItem> getLastHundredItems() { |
|
|
|
|
|
|
|
List<HistoryItem> itemList = new ArrayList<>(100); |
|
|
|
|
|
|
|
Cursor cursor = lazyDatabase().query(TABLE_HISTORY, null, null, null, null, null, KEY_TIME_VISITED + " DESC", "100"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (cursor.moveToNext()) { |
|
|
|
|
|
|
|
itemList.add(fromCursor(cursor)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cursor.close(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return itemList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@WorkerThread |
|
|
|
@WorkerThread |
|
|
|
@NonNull |
|
|
|
@NonNull |
|
|
|
synchronized List<HistoryItem> getAllHistoryItems() { |
|
|
|
synchronized List<HistoryItem> getAllHistoryItems() { |
|
|
|