/*
 * Copyright (C) 2011 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
 */

package com.android.providers.media;

import java.io.File;

import android.app.ActivityManagerNative;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.RemoteException;
import android.util.Log;
import android.util.Slog;

/**
 * This will be launched during system boot, after the core system has
 * been brought up but before any non-persistent processes have been
 * started.  It is launched in a special state, with no content provider
 * or custom application class associated with the process running.
 *
 * It's job is to prime the contacts database. Either create it
 * if it doesn't exist, or open it and force any necessary upgrades.
 * All of this heavy lifting happens before the boot animation ends.
 */
public class MediaUpgradeReceiver extends BroadcastReceiver {
    static final String TAG = "MediaUpgradeReceiver";
    static final String PREF_DB_VERSION = "db_version";

    @Override
    public void onReceive(Context context, Intent intent) {
        // We are now running with the system up, but no apps started,
        // so can do whatever cleanup after an upgrade that we want.

        // Lookup the last known database version
        SharedPreferences prefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
        int prefVersion = prefs.getInt(PREF_DB_VERSION, 0);
        int dbVersion = MediaProvider.getDatabaseVersion(context);
        if (prefVersion == dbVersion) {
            return;
        }
        prefs.edit().putInt(PREF_DB_VERSION, dbVersion).commit();

        try {
            File dbDir = context.getDatabasePath("foo").getParentFile();
            String[] files = dbDir.list();
            if (files == null) return;
            for (int i=0; i<files.length; i++) {
                String file = files[i];
                if (MediaProvider.isMediaDatabaseName(file)) {
                    long startTime = System.currentTimeMillis();
                    Slog.i(TAG, "---> Start upgrade of media database " + file);
                    SQLiteDatabase db = null;
                    try {
                        MediaProvider.DatabaseHelper helper = new MediaProvider.DatabaseHelper(
                                context, file, MediaProvider.isInternalMediaDatabaseName(file),
                                false, null);
                        db = helper.getWritableDatabase();
                    } catch (Throwable t) {
                        Log.wtf(TAG, "Error during upgrade of media db " + file, t);
                    } finally {
                        if (db != null) {
                            db.close();
                        }
                    }
                    Slog.i(TAG, "<--- Finished upgrade of media database " + file
                            + " in " + (System.currentTimeMillis()-startTime) + "ms");
                }
            }
        } catch (Throwable t) {
            // Something has gone terribly wrong.
            Log.wtf(TAG, "Error during upgrade attempt.", t);
        }
    }
}
