Index: sqlite3/build.gradle ================================================================== --- sqlite3/build.gradle +++ sqlite3/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 23 + compileSdkVersion 15 buildToolsVersion "23.0.3" - defaultConfig { - minSdkVersion 16 + minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { @@ -14,19 +13,18 @@ release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - sourceSets.main.jni.srcDirs = [] //disable automatic ndk-build call - sourceSets.main { jniLibs.srcDir 'src/main/libs' } - + productFlavors { + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' } ADDED sqlite3/src/main/aidl/org/sqlite/os/ICancellationSignal.aidl Index: sqlite3/src/main/aidl/org/sqlite/os/ICancellationSignal.aidl ================================================================== --- /dev/null +++ sqlite3/src/main/aidl/org/sqlite/os/ICancellationSignal.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2012 The Android Open Source 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. + */ +/* +** Modified to support SQLite extensions by the SQLite developers: +** sqlite-dev@sqlite.org. +*/ + +package org.sqlite.os; + +/** + * @hide + */ +interface ICancellationSignal { + oneway void cancel(); +} Index: sqlite3/src/main/java/org/sqlite/database/ExtraUtils.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/ExtraUtils.java +++ sqlite3/src/main/java/org/sqlite/database/ExtraUtils.java @@ -34,11 +34,11 @@ import org.sqlite.database.sqlite.SQLiteDiskIOException; import org.sqlite.database.sqlite.SQLiteException; import org.sqlite.database.sqlite.SQLiteFullException; import org.sqlite.database.sqlite.SQLiteProgram; import org.sqlite.database.sqlite.SQLiteStatement; -import android.os.OperationCanceledException; +import org.sqlite.os.OperationCanceledException; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.text.TextUtils; import android.util.Log; Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteConnection.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteConnection.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteConnection.java @@ -26,12 +26,12 @@ import android.database.Cursor; import android.database.CursorWindow; import android.database.DatabaseUtils; import org.sqlite.database.ExtraUtils; import org.sqlite.database.sqlite.SQLiteDebug.DbStats; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; +import org.sqlite.os.CancellationSignal; +import org.sqlite.os.OperationCanceledException; import android.os.ParcelFileDescriptor; import android.util.Log; import android.util.LruCache; import android.util.Printer; Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteConnectionPool.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteConnectionPool.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteConnectionPool.java @@ -21,12 +21,12 @@ package org.sqlite.database.sqlite; import org.sqlite.database.sqlite.CloseGuard; import org.sqlite.database.sqlite.SQLiteDebug.DbStats; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; +import org.sqlite.os.CancellationSignal; +import org.sqlite.os.OperationCanceledException; import android.os.SystemClock; import android.util.Log; /* import android.util.PrefixPrinter; */ import android.util.Printer; Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteDatabase.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteDatabase.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteDatabase.java @@ -26,13 +26,13 @@ import android.database.DatabaseUtils; import org.sqlite.database.ExtraUtils; import org.sqlite.database.DefaultDatabaseErrorHandler; import org.sqlite.database.SQLException; import org.sqlite.database.sqlite.SQLiteDebug.DbStats; -import android.os.CancellationSignal; +import org.sqlite.os.CancellationSignal; import android.os.Looper; -import android.os.OperationCanceledException; +import org.sqlite.os.OperationCanceledException; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; import android.util.Pair; import android.util.Printer; Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteDirectCursorDriver.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteDirectCursorDriver.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteDirectCursorDriver.java @@ -20,11 +20,11 @@ package org.sqlite.database.sqlite; import android.database.Cursor; import org.sqlite.database.sqlite.SQLiteDatabase.CursorFactory; -import android.os.CancellationSignal; +import org.sqlite.os.CancellationSignal; /** * A cursor driver that uses the given query directly. * * @hide Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteProgram.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteProgram.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteProgram.java @@ -19,11 +19,11 @@ */ package org.sqlite.database.sqlite; import android.database.DatabaseUtils; -import android.os.CancellationSignal; +import org.sqlite.os.CancellationSignal; import java.util.Arrays; /** * A base class for compiled SQLite programs. Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteQuery.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteQuery.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteQuery.java @@ -19,12 +19,12 @@ */ package org.sqlite.database.sqlite; import android.database.CursorWindow; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; +import org.sqlite.os.CancellationSignal; +import org.sqlite.os.OperationCanceledException; import android.util.Log; /** * Represents a query that reads the resulting rows into a {@link SQLiteQuery}. * This class is used by {@link SQLiteCursor} and isn't useful itself. Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteQueryBuilder.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteQueryBuilder.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteQueryBuilder.java @@ -20,12 +20,12 @@ package org.sqlite.database.sqlite; import android.database.Cursor; import android.database.DatabaseUtils; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; +import org.sqlite.os.CancellationSignal; +import org.sqlite.os.OperationCanceledException; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; import java.util.Iterator; Index: sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteSession.java ================================================================== --- sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteSession.java +++ sqlite3/src/main/java/org/sqlite/database/sqlite/SQLiteSession.java @@ -20,12 +20,12 @@ package org.sqlite.database.sqlite; import android.database.CursorWindow; import android.database.DatabaseUtils; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; +import org.sqlite.os.CancellationSignal; +import org.sqlite.os.OperationCanceledException; import android.os.ParcelFileDescriptor; /** * Provides a single client the ability to use a database. * ADDED sqlite3/src/main/java/org/sqlite/os/CancellationSignal.java Index: sqlite3/src/main/java/org/sqlite/os/CancellationSignal.java ================================================================== --- /dev/null +++ sqlite3/src/main/java/org/sqlite/os/CancellationSignal.java @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2012 The Android Open Source 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. + */ +/* +** Modified to support SQLite extensions by the SQLite developers: +** sqlite-dev@sqlite.org. +*/ + +package org.sqlite.os; + +import org.sqlite.os.ICancellationSignal; +import android.os.RemoteException; + +/** + * Provides the ability to cancel an operation in progress. + */ +public final class CancellationSignal { + private boolean mIsCanceled; + private OnCancelListener mOnCancelListener; + private ICancellationSignal mRemote; + private boolean mCancelInProgress; + + /** + * Creates a cancellation signal, initially not canceled. + */ + public CancellationSignal() { + } + + /** + * Returns true if the operation has been canceled. + * + * @return True if the operation has been canceled. + */ + public boolean isCanceled() { + synchronized (this) { + return mIsCanceled; + } + } + + /** + * Throws {@link OperationCanceledException} if the operation has been canceled. + * + * @throws OperationCanceledException if the operation has been canceled. + */ + public void throwIfCanceled() { + if (isCanceled()) { + throw new OperationCanceledException(); + } + } + + /** + * Cancels the operation and signals the cancellation listener. + * If the operation has not yet started, then it will be canceled as soon as it does. + */ + public void cancel() { + final OnCancelListener listener; + final ICancellationSignal remote; + synchronized (this) { + if (mIsCanceled) { + return; + } + mIsCanceled = true; + mCancelInProgress = true; + listener = mOnCancelListener; + remote = mRemote; + } + + try { + if (listener != null) { + listener.onCancel(); + } + if (remote != null) { + try { + remote.cancel(); + } catch (RemoteException ex) { + } + } + } finally { + synchronized (this) { + mCancelInProgress = false; + notifyAll(); + } + } + } + + /** + * Sets the cancellation listener to be called when canceled. + * + * This method is intended to be used by the recipient of a cancellation signal + * such as a database or a content provider to handle cancellation requests + * while performing a long-running operation. This method is not intended to be + * used by applications themselves. + * + * If {@link CancellationSignal#cancel} has already been called, then the provided + * listener is invoked immediately. + * + * This method is guaranteed that the listener will not be called after it + * has been removed. + * + * @param listener The cancellation listener, or null to remove the current listener. + */ + public void setOnCancelListener(OnCancelListener listener) { + synchronized (this) { + waitForCancelFinishedLocked(); + + if (mOnCancelListener == listener) { + return; + } + mOnCancelListener = listener; + if (!mIsCanceled || listener == null) { + return; + } + } + listener.onCancel(); + } + + /** + * Sets the remote transport. + * + * If {@link CancellationSignal#cancel} has already been called, then the provided + * remote transport is canceled immediately. + * + * This method is guaranteed that the remote transport will not be called after it + * has been removed. + * + * @param remote The remote transport, or null to remove. + * + * @hide + */ + public void setRemote(ICancellationSignal remote) { + synchronized (this) { + waitForCancelFinishedLocked(); + + if (mRemote == remote) { + return; + } + mRemote = remote; + if (!mIsCanceled || remote == null) { + return; + } + } + try { + remote.cancel(); + } catch (RemoteException ex) { + } + } + + private void waitForCancelFinishedLocked() { + while (mCancelInProgress) { + try { + wait(); + } catch (InterruptedException ex) { + } + } + } + + /** + * Creates a transport that can be returned back to the caller of + * a Binder function and subsequently used to dispatch a cancellation signal. + * + * @return The new cancellation signal transport. + * + * @hide + */ + public static ICancellationSignal createTransport() { + return new Transport(); + } + + /** + * Given a locally created transport, returns its associated cancellation signal. + * + * @param transport The locally created transport, or null if none. + * @return The associated cancellation signal, or null if none. + * + * @hide + */ + public static CancellationSignal fromTransport(ICancellationSignal transport) { + if (transport instanceof Transport) { + return ((Transport)transport).mCancellationSignal; + } + return null; + } + + /** + * Listens for cancellation. + */ + public interface OnCancelListener { + /** + * Called when {@link CancellationSignal#cancel} is invoked. + */ + void onCancel(); + } + + private static final class Transport extends ICancellationSignal.Stub { + final CancellationSignal mCancellationSignal = new CancellationSignal(); + + @Override + public void cancel() throws RemoteException { + mCancellationSignal.cancel(); + } + } +} ADDED sqlite3/src/main/java/org/sqlite/os/OperationCanceledException.java Index: sqlite3/src/main/java/org/sqlite/os/OperationCanceledException.java ================================================================== --- /dev/null +++ sqlite3/src/main/java/org/sqlite/os/OperationCanceledException.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2012 The Android Open Source 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. + */ +/* +** Modified to support SQLite extensions by the SQLite developers: +** sqlite-dev@sqlite.org. +*/ + +package org.sqlite.os; + + +/** + * An exception type that is thrown when an operation in progress is canceled. + * + * @see CancellationSignal + */ +public class OperationCanceledException extends RuntimeException { + public OperationCanceledException() { + this(null); + } + + public OperationCanceledException(String message) { + super(message != null ? message : "The operation has been canceled."); + } +} Index: sqlite3test/build.gradle ================================================================== --- sqlite3test/build.gradle +++ sqlite3test/build.gradle @@ -1,23 +1,24 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 + compileSdkVersion 15 buildToolsVersion "23.0.3" - defaultConfig { applicationId "org.sqlite.customsqlitetest" - minSdkVersion 16 + minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + } + productFlavors { } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') Index: sqlite3test/src/main/java/org/sqlite/customsqlitetest/MainActivity.java ================================================================== --- sqlite3test/src/main/java/org/sqlite/customsqlitetest/MainActivity.java +++ sqlite3test/src/main/java/org/sqlite/customsqlitetest/MainActivity.java @@ -374,11 +374,11 @@ } public void run_the_tests(View view){ System.loadLibrary("sqliteX"); DB_PATH = getApplicationContext().getDatabasePath("test.db"); - DB_PATH.getParentFile().mkdirs(); + DB_PATH.mkdirs(); myTV.setText(""); myNErr = 0; myNTest = 0;