aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Mortimer <sam@mortimer.me.uk>2017-09-14 17:03:06 -0700
committerDan Pasanen <dan.pasanen@gmail.com>2018-01-27 13:25:35 +0000
commite7008a222e17d4868e74bd8758ccf842852df389 (patch)
tree2625249b9d7a527b0e991c9fb26481e897000da0
parent22e88073d7a3f8c8c73e813187cdac1e31b4bf0a (diff)
downloadlineage-sdk-e7008a222e17d4868e74bd8758ccf842852df389.tar.gz
lineage-sdk-e7008a222e17d4868e74bd8758ccf842852df389.tar.bz2
lineage-sdk-e7008a222e17d4868e74bd8758ccf842852df389.zip
LineageSettingsProvider: Support migration from cmsettings
*) Migrate database from cmsettings.db to lineagesettings.db *) Remove old CMSettingsProvider.xml shared_prefs. *) Remove the code to disable the PreBootReceiver component. PackageManager is not yet ready for component lookups when LineageSettings is called during fw/b service startups. However, the preboot intent is only sent when the build fingerprint changes so disabling it doesn't really buy us anything. We also track and check migration state in sharedPrefs anyway. Change-Id: I636f8315ce8a36f6d223d6a5accfe11c40ef9570
-rw-r--r--packages/LineageSettingsProvider/AndroidManifest.xml2
-rw-r--r--packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageDatabaseHelper.java55
-rw-r--r--packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageSettingsProvider.java36
-rw-r--r--packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/PreBootReceiver.java8
4 files changed, 72 insertions, 29 deletions
diff --git a/packages/LineageSettingsProvider/AndroidManifest.xml b/packages/LineageSettingsProvider/AndroidManifest.xml
index e6301013..e916f6d6 100644
--- a/packages/LineageSettingsProvider/AndroidManifest.xml
+++ b/packages/LineageSettingsProvider/AndroidManifest.xml
@@ -22,6 +22,8 @@
to run in the system process in order to start the content provider prior to running migration
for LineageSettings on user starting -->
+ <original-package android:name="org.cyanogenmod.cmsettings" />
+
<uses-permission android:name="android.permission.MANAGE_USERS" />
<application android:icon="@mipmap/ic_launcher_settings"
diff --git a/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageDatabaseHelper.java b/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageDatabaseHelper.java
index 1d75b217..e9afe723 100644
--- a/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageDatabaseHelper.java
+++ b/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageDatabaseHelper.java
@@ -1,5 +1,6 @@
/**
* Copyright (c) 2015, The CyanogenMod Project
+ * Copyright (c) 2017, The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,8 +35,11 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
+
import lineageos.providers.LineageSettings;
+import org.lineageos.internal.util.FileUtils;
+
import java.io.File;
/**
@@ -49,6 +53,8 @@ public class LineageDatabaseHelper extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "lineagesettings.db";
private static final int DATABASE_VERSION = 8;
+ private static final String DATABASE_NAME_OLD = "cmsettings.db";
+
public static class LineageTableNames {
public static final String TABLE_SYSTEM = "system";
public static final String TABLE_SECURE = "secure";
@@ -78,26 +84,65 @@ public class LineageDatabaseHelper extends SQLiteOpenHelper{
* @param userId The database path for this user
* @return The database path string
*/
- static String dbNameForUser(final int userId) {
- // The owner gets the unadorned db name;
+ private static String dbNameForUser(Context context, int userId, String baseName) {
if (userId == UserHandle.USER_OWNER) {
- return DATABASE_NAME;
+ return context.getDatabasePath(baseName).getPath();
} else {
// Place the database in the user-specific data tree so that it's
// cleaned up automatically when the user is deleted.
File databaseFile = new File(
- Environment.getUserSystemDirectory(userId), DATABASE_NAME);
+ Environment.getUserSystemDirectory(userId), baseName);
return databaseFile.getPath();
}
}
/**
+ * Migrate db files (if needed).
+ */
+ public static void migrateDbFiles(Context context, int userId) {
+ final String dbPath = dbNameForUser(context, userId, DATABASE_NAME);
+ final String dbPathOld = dbNameForUser(context, userId, DATABASE_NAME_OLD);
+
+ // Only rename databases that we know we can write to later.
+ if (!FileUtils.isFileWritable(dbPathOld)) {
+ return;
+ }
+ if (FileUtils.fileExists(dbPath) && !FileUtils.delete(dbPath)) {
+ Log.e(TAG, "Unable to delete existing settings db file " + dbPath);
+ return;
+ }
+ if (!FileUtils.rename(dbPathOld, dbPath)) {
+ Log.e(TAG, "Found old settings db " + dbPathOld + " but could not rename it to "
+ + dbPath);
+ return;
+ }
+ // Move any additional sqlite files that might exist.
+ // The list of suffixes is taken from fw/b SQLiteDatabase.java deleteDatabase().
+ final String[] suffixes = { "-journal", "-shm", "-wal" };
+ for (String s: suffixes) {
+ final String oldFile = dbPathOld + s;
+ final String newFile = dbPath + s;
+ if (!FileUtils.fileExists(oldFile)) {
+ continue;
+ }
+ if (FileUtils.fileExists(newFile) && !FileUtils.delete(newFile)) {
+ Log.e(TAG, "Unable to delete existing settings db file " + newFile);
+ continue;
+ }
+ if (!FileUtils.rename(oldFile, newFile)) {
+ Log.e(TAG, "Unable to rename existing settings db file " + oldFile + " to "
+ + newFile);
+ }
+ }
+ }
+
+ /**
* Creates an instance of {@link LineageDatabaseHelper}
* @param context
* @param userId
*/
public LineageDatabaseHelper(Context context, int userId) {
- super(context, dbNameForUser(userId), null, DATABASE_VERSION);
+ super(context, dbNameForUser(context, userId, DATABASE_NAME), null, DATABASE_VERSION);
mContext = context;
mUserHandle = userId;
diff --git a/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageSettingsProvider.java b/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageSettingsProvider.java
index 3d80ee9f..950968a3 100644
--- a/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageSettingsProvider.java
+++ b/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/LineageSettingsProvider.java
@@ -61,9 +61,12 @@ public class LineageSettingsProvider extends ContentProvider {
public static final String TAG = "LineageSettingsProvider";
private static final boolean LOCAL_LOGV = false;
+ private static final String SHARED_PREF_NAME_OLD = "CMSettingsProvider";
+
private static final boolean USER_CHECK_THROWS = true;
- public static final String PREF_HAS_MIGRATED_LINEAGE_SETTINGS = "has_migrated_cm13_settings";
+ public static final String PREF_HAS_MIGRATED_LINEAGE_SETTINGS =
+ "migrated_settings_to_lineage_15_1";
private static final Bundle NULL_SETTING = Bundle.forPair("value", null);
@@ -148,6 +151,9 @@ public class LineageSettingsProvider extends ContentProvider {
if (!hasMigratedLineageSettings) {
long startTime = System.currentTimeMillis();
+ // Remove any lingering old shared_prefs file
+ getContext().deleteSharedPreferences(SHARED_PREF_NAME_OLD);
+
for (UserInfo user : mUserManager.getUsers()) {
migrateLineageSettingsForUser(user.id);
}
@@ -168,6 +174,18 @@ public class LineageSettingsProvider extends ContentProvider {
synchronized (this) {
if (LOCAL_LOGV) Log.d(TAG, "Lineage settings will be migrated for user id: " + userId);
+ // Rename database files (if needed)
+ LineageDatabaseHelper dbHelper = mDbHelpers.get(userId);
+ if (dbHelper != null) {
+ dbHelper.close();
+ mDbHelpers.delete(userId);
+ }
+ LineageDatabaseHelper.migrateDbFiles(getContext(), userId);
+ if (dbHelper != null) {
+ establishDbTracking(userId);
+ dbHelper = null;
+ }
+
// Migrate system settings
int rowsMigrated = migrateLineageSettingsForTable(userId,
LineageDatabaseHelper.LineageTableNames.TABLE_SYSTEM, LineageSettings.System.LEGACY_SYSTEM_SETTINGS);
@@ -296,22 +314,6 @@ public class LineageSettingsProvider extends ContentProvider {
}
}
- boolean hasMigratedLineageSettings = mSharedPrefs.getBoolean(PREF_HAS_MIGRATED_LINEAGE_SETTINGS,
- false);
- final ComponentName preBootReceiver = new ComponentName("org.lineageos.lineagesettings",
- "org.lineageos.lineagesettings.PreBootReceiver");
- final PackageManager packageManager = getContext().getPackageManager();
- if (!hasMigratedLineageSettings &&
- packageManager.getComponentEnabledSetting(preBootReceiver)
- == PackageManager.COMPONENT_ENABLED_STATE_DISABLED ) {
- if (LOCAL_LOGV) {
- Log.d(TAG, "Reenabling component preboot receiver");
- }
- packageManager.setComponentEnabledSetting(preBootReceiver,
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
- PackageManager.DONT_KILL_APP);
- }
-
// Migrate methods
if (LineageSettings.CALL_METHOD_MIGRATE_SETTINGS.equals(method)) {
migrateLineageSettingsForExistingUsersIfNeeded();
diff --git a/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/PreBootReceiver.java b/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/PreBootReceiver.java
index 04697320..34eb6fef 100644
--- a/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/PreBootReceiver.java
+++ b/packages/LineageSettingsProvider/src/org/lineageos/lineagesettings/PreBootReceiver.java
@@ -17,14 +17,13 @@
package org.lineageos.lineagesettings;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.IContentProvider;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.util.Log;
+
import lineageos.providers.LineageSettings;
public class PreBootReceiver extends BroadcastReceiver{
@@ -44,11 +43,6 @@ public class PreBootReceiver extends BroadcastReceiver{
try{
contentProvider.call(contentResolver.getPackageName(),
LineageSettings.CALL_METHOD_MIGRATE_SETTINGS, null, null);
-
- context.getPackageManager().setComponentEnabledSetting(
- new ComponentName(context, getClass()),
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
} catch (RemoteException ex) {
Log.w(TAG, "Failed to trigger settings migration due to RemoteException");
}