GCX-HCI / tray

a SharedPreferences replacement for Android with multiprocess support
Apache License 2.0
2.29k stars 273 forks source link

android-DirectBoot #133

Open malangstudio opened 6 years ago

malangstudio commented 6 years ago

https://android-developers.googleblog.com/2016/04/developing-for-direct-boot.html

Do you support this feature?

malangstudio commented 6 years ago

TrayContentProvider.java

like this ?

onCreate() >>

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            storageContext = getContext().createDeviceProtectedStorageContext();

            if (storageContext.moveDatabaseFrom(getContext(), TrayDBHelper.DATABASE_NAME)) {
                Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME.moveDatabaseFrom : true");
            } else {
                Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME.moveDatabaseFrom : false");
            }

            if (storageContext.moveDatabaseFrom(getContext(), TrayDBHelper.DATABASE_NAME_NO_BACKUP)) {
                Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME_NO_BACKUP.moveDatabaseFrom : true");
            } else {
                Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME_NO_BACKUP.moveDatabaseFrom : false");
            }

        } else {
            storageContext = getContext();
        }

        mUserDbHelper = new TrayDBHelper(storageContext, true);
        mDeviceDbHelper = new TrayDBHelper(storageContext, false);
StefMa commented 6 years ago

Why should we support this? I dont get the value currently...

On Tue, Jul 24, 2018, 11:27 AM malangstudio notifications@github.com wrote:

TrayContentProvider.java

like this ?

onCreate() >>

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        storageContext = getContext().createDeviceProtectedStorageContext();

        if (storageContext.moveDatabaseFrom(getContext(), TrayDBHelper.DATABASE_NAME)) {
            Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME.moveDatabaseFrom : true");
        } else {
            Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME.moveDatabaseFrom : false");
        }

        if (storageContext.moveDatabaseFrom(getContext(), TrayDBHelper.DATABASE_NAME_NO_BACKUP)) {
            Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME_NO_BACKUP.moveDatabaseFrom : true");
        } else {
            Log.d("TrayContentProvider", "[TrayDBHelper] TrayDBHelper.DATABASE_NAME_NO_BACKUP.moveDatabaseFrom : false");
        }

    } else {
        storageContext = getContext();
    }

    mUserDbHelper = new TrayDBHelper(storageContext, true);
    mDeviceDbHelper = new TrayDBHelper(storageContext, false);

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/grandcentrix/tray/issues/133#issuecomment-407342334, or mute the thread https://github.com/notifications/unsubscribe-auth/AJwYe2AJ4QNvvYjrPuU5GWQmGVnilZPfks5uJuiOgaJpZM4VcIyk .

fython commented 6 years ago

My project using Tray needs this feature too. But I recommend not to modify TrayContentProvider.java to use Context#createDeviceProtectedStorageContext() like @malangstudio 's https://github.com/grandcentrix/tray/issues/133#issuecomment-407342334 . Users should decide if using device protected storage context or a normal context by themselves.

For example:

final Context storageContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    storageContext = context.createDeviceProtectedStorageContext();
} else {
    storageContext = context;
}
mPreferences = new TrayPreferences(storageContext, PREF_NAME, 1);

However, I found Tray didn't work well with device protected storage context. I got stack trace logs:

E/SQLiteDatabase: Error inserting MIGRATED_KEY=null UPDATED=1535531359059 CREATED=1535531359059 MODULE=screenshot VALUE=true KEY=preview_floating_window
    android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:785)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1548)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1417)
        at net.grandcentrix.tray.provider.SqliteHelper.insertOrUpdate(SqliteHelper.java:148)
        at net.grandcentrix.tray.provider.TrayContentProvider.insertOrUpdate(TrayContentProvider.java:208)
        at net.grandcentrix.tray.provider.TrayContentProvider.insert(TrayContentProvider.java:188)
        at android.content.ContentProvider$Transport.insert(ContentProvider.java:265)
        at android.content.ContentResolver.insert(ContentResolver.java:1539)
        at net.grandcentrix.tray.provider.TrayProviderHelper.persist(TrayProviderHelper.java:151)
        at net.grandcentrix.tray.provider.ContentProviderStorage.put(ContentProviderStorage.java:260)
        at net.grandcentrix.tray.provider.ContentProviderStorage.put(ContentProviderStorage.java:231)
        at net.grandcentrix.tray.core.Preferences.putData(Preferences.java:310)
        at net.grandcentrix.tray.core.Preferences.put(Preferences.java:171)
        at moe.feng.nevo.decorators.enscreenshot.ScreenshotPreferences.setPreviewInFloatingWindow(ScreenshotPreferences.java:207)

I can guarantee that data can be read and written with device protected storage context. But logs told me the database is readonly. Do you have any idea?