Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 416f0d44 authored by Danny Baumann's avatar Danny Baumann
Browse files

Also backup profiles file via backup manager.

Change-Id: Id70cb1bce15b7de127e4291e9482ab3fd7270f9f
parent a48d4ed2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -613,6 +613,13 @@ public final class Profile implements Parcelable, Comparable {
        }
    }

    /** @hide */
    public void validateRingtones(Context context) {
        for (ProfileGroup pg : profileGroups.values()) {
            pg.validateOverrideUris(context);
        }
    }

    /** @hide */
    public static Profile fromXml(XmlPullParser xpp, Context context)
            throws XmlPullParserException, IOException {
+28 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Parcel;
@@ -218,6 +219,33 @@ public final class ProfileGroup implements Parcelable {
        return notification;
    }

    private boolean validateOverrideUri(Context context, Uri uri) {
        if (RingtoneManager.isDefault(uri)) {
            return true;
        }
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        boolean valid = false;

        if (cursor != null) {
            valid = cursor.moveToFirst();
            cursor.close();
        }
        return valid;
    }

    void validateOverrideUris(Context context) {
        if (!validateOverrideUri(context, mSoundOverride)) {
            mSoundOverride = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            mSoundMode = Mode.DEFAULT;
            mDirty = true;
        }
        if (!validateOverrideUri(context, mRingerOverride)) {
            mRingerOverride = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            mRingerMode = Mode.DEFAULT;
            mDirty = true;
        }
    }

    private void silenceNotification(Notification notification) {
        notification.defaults &= (~Notification.DEFAULT_SOUND);
        notification.sound = null;
+25 −7
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.app.IProfileManager;
import android.app.NotificationGroup;
import android.app.Profile;
import android.app.ProfileGroup;
import android.app.backup.BackupManager;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -34,12 +35,14 @@ import android.content.res.XmlResourceParser;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiSsid;
import android.net.wifi.WifiInfo;
import android.os.Environment;
import android.os.RemoteException;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
import android.os.ParcelUuid;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
@@ -70,7 +73,8 @@ public class ProfileManagerService extends IProfileManager.Stub {

    public static final String PERMISSION_CHANGE_SETTINGS = "android.permission.WRITE_SETTINGS";

    private static final String PROFILE_FILENAME = "/data/system/profiles.xml";
    /* package */ static final File PROFILE_FILE =
            new File(Environment.getSystemSecureDirectory(), "profiles.xml");

    private static final String TAG = "ProfileService";

@@ -89,7 +93,7 @@ public class ProfileManagerService extends IProfileManager.Stub {

    private Context mContext;
    private boolean mDirty;

    private BackupManager mBackupManager;
    private WifiManager mWifiManager;
    private String mLastConnectedSSID;

@@ -142,6 +146,7 @@ public class ProfileManagerService extends IProfileManager.Stub {

    public ProfileManagerService(Context context) {
        mContext = context;
        mBackupManager = new BackupManager(mContext);
        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
        mLastConnectedSSID = getActiveSSID();

@@ -498,10 +503,19 @@ public class ProfileManagerService extends IProfileManager.Stub {
        return null;
    }

    // Called by SystemBackupAgent after files are restored to disk.
    void settingsRestored() {
        initialize();
        for (Profile p : mProfiles.values()) {
            p.validateRingtones(mContext);
        }
        persistIfDirty();
    }

    private void loadFromFile() throws RemoteException, XmlPullParserException, IOException {
        XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
        XmlPullParser xpp = xppf.newPullParser();
        FileReader fr = new FileReader(PROFILE_FILENAME);
        FileReader fr = new FileReader(PROFILE_FILE);
        xpp.setInput(fr);
        loadXml(xpp, mContext);
        fr.close();
@@ -530,7 +544,7 @@ public class ProfileManagerService extends IProfileManager.Stub {
                    addNotificationGroupInternal(ng);
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while reading " + PROFILE_FILENAME);
                throw new IOException("Premature end of file while reading " + PROFILE_FILE);
            }
            event = xpp.next();
        }
@@ -609,11 +623,15 @@ public class ProfileManagerService extends IProfileManager.Stub {
        if (dirty) {
            try {
                Log.d(TAG, "Saving profile data...");
                FileWriter fw = new FileWriter(PROFILE_FILENAME);
                FileWriter fw = new FileWriter(PROFILE_FILE);
                fw.write(getXmlString());
                fw.close();
                Log.d(TAG, "Save completed.");
                mDirty = false;

                long token = clearCallingIdentity();
                mBackupManager.dataChanged();
                restoreCallingIdentity(token);
            } catch (Throwable e) {
                e.printStackTrace();
            }
+30 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server;


import android.app.backup.AbsoluteFileBackupHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupAgentHelper;
@@ -46,6 +47,11 @@ public class SystemBackupAgent extends BackupAgentHelper {
    private static final String WALLPAPER_IMAGE_FILENAME = "wallpaper";
    private static final String WALLPAPER_INFO_FILENAME = "wallpaper_info.xml";

    private static final String PROFILES_FILENAME =
            ProfileManagerService.PROFILE_FILE.getName();
    private static final String PROFILES_FILE_DIRECTORY =
            ProfileManagerService.PROFILE_FILE.getParentFile().getAbsolutePath();

    // TODO: Will need to change if backing up non-primary user's wallpaper
    private static final String WALLPAPER_IMAGE_DIR =
            Environment.getUserSystemDirectory(UserHandle.USER_OWNER).getAbsolutePath();
@@ -75,13 +81,16 @@ public class SystemBackupAgent extends BackupAgentHelper {
            keys = new String[] { WALLPAPER_INFO_KEY };
        }
        addHelper("wallpaper", new WallpaperBackupHelper(SystemBackupAgent.this, files, keys));
        addHelper("profiles", new AbsoluteFileBackupHelper(SystemBackupAgent.this,
                    ProfileManagerService.PROFILE_FILE.getAbsolutePath()));
        super.onBackup(oldState, data, newState);
    }

    @Override
    public void onFullBackup(FullBackupDataOutput data) throws IOException {
        // At present we back up only the wallpaper
        // At present we back up only the wallpaper and profiles
        fullWallpaperBackup(data);
        fullProfilesBackup(data);
    }

    private void fullWallpaperBackup(FullBackupDataOutput output) {
@@ -95,6 +104,11 @@ public class SystemBackupAgent extends BackupAgentHelper {
                WALLPAPER_IMAGE_DIR, WALLPAPER_IMAGE, output.getData());
    }

    private void fullProfilesBackup(FullBackupDataOutput output) {
        FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
                PROFILES_FILE_DIRECTORY, PROFILES_FILENAME, output.getData());
    }

    @Override
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
            throws IOException {
@@ -105,13 +119,19 @@ public class SystemBackupAgent extends BackupAgentHelper {
        addHelper("system_files", new WallpaperBackupHelper(SystemBackupAgent.this,
                new String[] { WALLPAPER_IMAGE },
                new String[] { WALLPAPER_IMAGE_KEY} ));
        addHelper("profiles", new AbsoluteFileBackupHelper(SystemBackupAgent.this,
                ProfileManagerService.PROFILE_FILE.getAbsolutePath()));

        try {
            super.onRestore(data, appVersionCode, newState);

            WallpaperManagerService wallpaper = (WallpaperManagerService)ServiceManager.getService(
                    Context.WALLPAPER_SERVICE);
            ProfileManagerService profiles = (ProfileManagerService)ServiceManager.getService(
                    Context.PROFILE_SERVICE);

            wallpaper.settingsRestored();
            profiles.settingsRestored();
        } catch (IOException ex) {
            // If there was a failure, delete everything for the wallpaper, this is too aggressive,
            // but this is hopefully a rare failure.
@@ -129,6 +149,7 @@ public class SystemBackupAgent extends BackupAgentHelper {

        // Bits to indicate postprocessing we may need to perform
        boolean restoredWallpaper = false;
        boolean restoredProfiles = false;

        File outFile = null;
        // Various domain+files we understand a priori
@@ -139,6 +160,9 @@ public class SystemBackupAgent extends BackupAgentHelper {
            } else if (path.equals(WALLPAPER_IMAGE_FILENAME)) {
                outFile = new File(WALLPAPER_IMAGE);
                restoredWallpaper = true;
            } else if (path.equals(PROFILES_FILENAME)) {
                outFile = ProfileManagerService.PROFILE_FILE;
                restoredProfiles = true;
            }
        }

@@ -154,6 +178,11 @@ public class SystemBackupAgent extends BackupAgentHelper {
                        Context.WALLPAPER_SERVICE);
                wallpaper.settingsRestored();
            }
            if (restoredProfiles) {
                ProfileManagerService profiles = (ProfileManagerService)
                        ServiceManager.getService(Context.PROFILE_SERVICE);
                profiles.settingsRestored();
            }
        } catch (IOException e) {
            if (restoredWallpaper) {
                // Make sure we wind up in a good state