Merge "Clean up demo dir when leaving demo mode" into nyc-mr1-dev

am: 2c5cbd4012

* commit '2c5cbd4012aef736c94a7afc84a778623c639d10':
  Clean up demo dir when leaving demo mode

Change-Id: Ia7891f8e5106130d669a1daa7fcc691db1f5e4c7
This commit is contained in:
Fyodor Kupolov
2016-05-27 00:54:20 +00:00
committed by android-build-merger
2 changed files with 61 additions and 1 deletions

View File

@@ -323,6 +323,33 @@ public class Environment {
return new File(getDataUserDeDirectory(volumeUuid, userId), packageName);
}
/**
* Return preloads directory.
* <p>This directory may contain pre-loaded content such as
* {@link #getDataPreloadsDemoDirectory() demo videos} and
* {@link #getDataPreloadsAppsDirectory() APK files} .
* {@hide}
*/
public static File getDataPreloadsDirectory() {
return new File(getDataDirectory(), "preloads");
}
/**
* @see #getDataPreloadsDirectory()
* {@hide}
*/
public static File getDataPreloadsDemoDirectory() {
return new File(getDataPreloadsDirectory(), "demo");
}
/**
* @see #getDataPreloadsDirectory()
* {@hide}
*/
public static File getDataPreloadsAppsDirectory() {
return new File(getDataPreloadsDirectory(), "apps");
}
/**
* Return the primary shared/external storage directory. This directory may
* not currently be accessible if it has been mounted by the user on their

View File

@@ -25,6 +25,8 @@ import android.content.IntentFilter;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
import android.os.PowerManager;
import android.os.ServiceManager;
@@ -33,10 +35,13 @@ import android.os.UserManager;
import android.provider.Settings;
import android.util.Slog;
import com.android.internal.os.BackgroundThread;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
import com.android.server.pm.UserManagerService;
import java.io.File;
public class RetailDemoModeService extends SystemService {
private static final boolean DEBUG = false;
@@ -111,19 +116,47 @@ public class RetailDemoModeService extends SystemService {
private void registerSettingsChangeObserver() {
final Uri deviceDemoModeUri = Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE);
final Uri deviceProvisionedUri = Settings.Global.getUriFor(
Settings.Global.DEVICE_PROVISIONED);
final ContentResolver cr = getContext().getContentResolver();
final ContentObserver deviceDemoModeSettingObserver = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
boolean deviceInDemoMode = UserManager.isDeviceInDemoMode(getContext());
if (deviceDemoModeUri.equals(uri)) {
if (UserManager.isDeviceInDemoMode(getContext())) {
if (deviceInDemoMode) {
createAndSwitchToDemoUser();
}
}
// If device is provisioned and left demo mode - run the cleanup in demo folder
if (!deviceInDemoMode && isDeviceProvisioned()) {
// Run on the bg thread to not block the fg thread
BackgroundThread.getHandler().post(new Runnable() {
@Override
public void run() {
if (!deleteDemoFolderContents()) {
Slog.w(TAG, "Failed to delete demo folder contents");
}
}
});
}
}
};
cr.registerContentObserver(deviceDemoModeUri, false, deviceDemoModeSettingObserver,
UserHandle.USER_SYSTEM);
cr.registerContentObserver(deviceProvisionedUri, false, deviceDemoModeSettingObserver,
UserHandle.USER_SYSTEM);
}
boolean isDeviceProvisioned() {
return Settings.Global.getInt(
getContext().getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0;
}
private boolean deleteDemoFolderContents() {
File dir = Environment.getDataPreloadsDemoDirectory();
Slog.i(TAG, "Deleting contents of " + dir);
return FileUtils.deleteContents(dir);
}
private void registerBroadcastReceiver() {