/*
* Copyright (c) 2015. Thomas Haertel
*
* Licensed under 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.thomashaertel.device.backup;
import android.app.backup.BackupDataInputStream;
import android.app.backup.BackupDataOutput;
import android.content.ContentProvider;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ProviderInfo;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.ParcelFileDescriptor;
import com.thomashaertel.device.backup.internal.BackupUtil;
import com.thomashaertel.device.contentprovider.BackupableContentProvider;
import java.util.List;
public class CarefulDatabaseBackupHelper extends DatabaseBackupHelper {
private Context mContext;
public CarefulDatabaseBackupHelper(Context ctx, String database) {
super(ctx, database);
this.mContext = ctx;
}
public CarefulDatabaseBackupHelper(Context ctx, SQLiteDatabase database) {
super(ctx, database);
this.mContext = ctx;
}
public CarefulDatabaseBackupHelper(Context ctx, SQLiteOpenHelper helper) {
super(ctx, helper);
this.mContext = ctx;
}
@Override
public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) {
stopContentProvider();
super.performBackup(oldState, data, newState);
}
@Override
public void restoreEntity(BackupDataInputStream data) {
stopContentProvider();
super.restoreEntity(data);
}
private void stopContentProvider() {
List<ProviderInfo> providers = BackupUtil.findContentProviders(mContext);
for (ProviderInfo providerInfo : providers) {
ContentResolver resolver = mContext.getContentResolver();
ContentProviderClient client = resolver.acquireContentProviderClient(providerInfo.authority);
ContentProvider provider = client.getLocalContentProvider();
if (provider instanceof BackupableContentProvider) {
((BackupableContentProvider) provider).closeDatabase();
}
client.release();
}
}
}