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

Commit d11c5510 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

OMS: Fix bug where overlay settings wouldn't persist

The dead user check was using a List.removeAll() call to find
the subset of users that have been removed and need deleting
from the overlay settings. The target class, UserInfo, does not
implement equals(), therefore no UserInfos would be removed from
the set and all user IDs would be candidates for deleting.

This change avoids the UserInfo class entirely and manipulates userIds.

Bug: 36099320
Test: Pick a theme and reboot.
Test: Theme should still be applied on next boot.
Change-Id: I1ee57839515460bf578664dfe1bd67df7d10d041
parent 39608b85
Loading
Loading
Loading
Loading
+12 −13
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -754,26 +755,24 @@ public final class OverlayManagerService extends SystemService {
                // restarted before we received USER_REMOVED. Remove data for
                // users that will not exist after the system is ready.

                final List<UserInfo> deadUsers = getDeadUsers();
                final int N = deadUsers.size();
                for (int i = 0; i < N; i++) {
                    final UserInfo deadUser = deadUsers.get(i);
                    final int userId = deadUser.getUserHandle().getIdentifier();
                final List<UserInfo> liveUsers = mUserManager.getUsers(true /*excludeDying*/);
                final int[] liveUserIds = new int[liveUsers.size()];
                for (int i = 0; i < liveUsers.size(); i++) {
                    liveUserIds[i] = liveUsers.get(i).getUserHandle().getIdentifier();
                }
                Arrays.sort(liveUserIds);

                for (int userId : mSettings.getUsers()) {
                    if (Arrays.binarySearch(liveUserIds, userId) < 0) {
                        mSettings.removeUser(userId);
                    }
                }
            } catch (IOException | XmlPullParserException e) {
                Slog.e(TAG, "failed to restore overlay state", e);
            }
        }
    }

    private List<UserInfo> getDeadUsers() {
        final List<UserInfo> users = mUserManager.getUsers(false);
        final List<UserInfo> onlyLiveUsers = mUserManager.getUsers(true);
        users.removeAll(onlyLiveUsers);
        return users;
    }

    private static final class PackageManagerHelper implements
            OverlayManagerServiceImpl.PackageManagerHelper {

+4 −0
Original line number Diff line number Diff line
@@ -109,6 +109,10 @@ final class OverlayManagerServiceImpl {
                    if (overlayPackage.isStaticOverlay ||
                            mDefaultOverlays.contains(overlayPackage.packageName)) {
                        // Enable this overlay by default.
                        if (DEBUG) {
                            Slog.d(TAG, "Enabling overlay " + overlayPackage.packageName
                                    + " for user " + newUserId + " by default");
                        }
                        mSettings.setEnabled(overlayPackage.packageName, newUserId, true);
                    }
                } else {
+8 −0
Original line number Diff line number Diff line
@@ -16,11 +16,15 @@

package com.android.server.om;

import static com.android.server.om.OverlayManagerService.DEBUG;
import static com.android.server.om.OverlayManagerService.TAG;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.om.OverlayInfo;
import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.Xml;

import com.android.internal.util.FastXmlSerializer;
@@ -185,6 +189,10 @@ final class OverlayManagerSettings {
        for (int i = 0; i < mItems.size(); i++) {
            final SettingsItem item = mItems.get(i);
            if (item.getUserId() == userId) {
                if (DEBUG) {
                    Slog.d(TAG, "Removing overlay " + item.mPackageName + " for user " + userId
                            + " from settings because user was removed");
                }
                mItems.remove(i);
                removed = true;
                i--;