/* * Copyright 2018, 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.managedprovisioning.task; import android.content.Context; import android.os.FileUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.managedprovisioning.analytics.MetricsWriterFactory; import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; import com.android.managedprovisioning.common.ProvisionLogger; import com.android.managedprovisioning.common.SettingsFacade; import com.android.managedprovisioning.task.nonrequiredapps.SystemAppsSnapshot; import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MigrateSystemAppsSnapshotTask extends AbstractProvisioningTask { private static final Pattern XML_FILE_NAME_PATTERN = Pattern.compile("(\\d+)\\.xml"); public MigrateSystemAppsSnapshotTask(Context context, Callback callback) { this(context, callback, new ProvisioningAnalyticsTracker( MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()), new ManagedProvisioningSharedPreferences(context))); } @VisibleForTesting public MigrateSystemAppsSnapshotTask(Context context, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker) { super(context, null, callback, provisioningAnalyticsTracker); } @Override public void run(int userId) { migrateIfNecessary(); } /** * Snapshot files are renamed from {user_id}.xml to {user_serial_number}.xml and moved * to the new folder. */ private void migrateIfNecessary() { File legacyFolder = SystemAppsSnapshot.getLegacyFolder(mContext); if (!legacyFolder.exists()) { return; } ProvisionLogger.logi("Found legacy system_apps folder, kick start migration."); SystemAppsSnapshot.getFolder(mContext).mkdirs(); File[] files = legacyFolder.listFiles(); for (File file : files) { String fileName = file.getName(); Matcher matcher = XML_FILE_NAME_PATTERN.matcher(fileName); if (!matcher.find()) { ProvisionLogger.logw("Found invalid file during migration: " + fileName); continue; } int userId = Integer.parseInt(matcher.group(1)); File destination; try { destination = SystemAppsSnapshot.getSystemAppsFile(mContext, userId); } catch (IllegalArgumentException ex) { ProvisionLogger.logi( "user " + userId + " no longer exists, skip migrating its snapshot file"); continue; } ProvisionLogger.logi( "Moving " + file.getAbsolutePath() + " to " + destination.getAbsolutePath()); boolean success = file.renameTo(destination); if (!success) { ProvisionLogger.loge("Failed to migrate " + file.getAbsolutePath()); } } FileUtils.deleteContentsAndDir(legacyFolder); } }