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

Commit 699f9c9a authored by Willie Koomson's avatar Willie Koomson
Browse files

Send APPWIDGET_UPDATE when font scale setting changes

Updates AppWidgetServiceImpl to update all of the widgets when the font
scale setting changes. Widgets often use the font scale to measure text
size when creating a layout, or they may draw text into a canvas to
create a custom bitmap. Since Launcher does not update the app widget
options when the font scale changes (since display size is the same),
we must update widgets manually so that they can relayout their text.

Bug: 434874426
Test: AppWidgetTest#testFontScaleChange
Flag: EXEMPT bugfix
Change-Id: I0e5da50ee1d03fd652a1a468d79246f325c3c36b
parent e2581034
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.database.ContentObserver;
import android.graphics.Point;
import android.graphics.drawable.Icon;
import android.net.Uri;
@@ -111,6 +112,7 @@ import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.service.appwidget.AppWidgetServiceDumpProto;
import android.service.appwidget.GeneratedPreviewsProto;
import android.service.appwidget.WidgetProto;
@@ -178,6 +180,7 @@ import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -433,6 +436,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
        computeMaximumWidgetBitmapMemory();
        registerBroadcastReceiver();
        registerOnCrossProfileProvidersChangedListener();
        registerSettingsObserver();

        LocalServices.addService(AppWidgetManagerInternal.class, new AppWidgetManagerLocal());
    }
@@ -609,6 +613,53 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
        }
    }

    /**
     * Registers a content observer for settings changes.
     */
    private void registerSettingsObserver() {
        final Uri fontScaleUri = Settings.System.getUriFor(Settings.System.FONT_SCALE);
        final Uri[] urisToObserve = new Uri[]{fontScaleUri};

        final ContentObserver mSettingsObserver = new ContentObserver(mCallbackHandler) {
            @Override
            public void onChange(boolean selfChange, @NonNull Collection<Uri> uris, int flags,
                @NonNull UserHandle user) {
                for (Uri uri : uris) {
                    if (uri.equals(fontScaleUri)) {
                        onFontScaleChanged(user.getIdentifier());
                    }
                }
            }
        };

        final ContentResolver resolver = mContext.getContentResolver();
        for (Uri uri : urisToObserve) {
            resolver.registerContentObserver(uri, /* notifyForDescendants= */ false,
                mSettingsObserver, UserHandle.USER_ALL);
        }
    }

    /**
     * When the font scale setting changes for a user, request a widget update from all of the
     * providers for that user.
     */
    private void onFontScaleChanged(int userId) {
        if (DEBUG) {
            Slog.i(TAG, "onFontScaleChanged " + userId);
        }
        synchronized (mLock) {
            for (Provider provider : mProviders) {
                if (provider.widgets.isEmpty()
                    || (userId != UserHandle.getUserId(provider.id.uid)
                        && userId != UserHandle.USER_ALL)) {
                    continue;
                }
                sendUpdateIntentLocked(provider, getWidgetIds(provider.widgets),
                    /* interactive= */ true);
            }
        }
    }

    public void setSafeMode(boolean safeMode) {
        mSafeMode = safeMode;
    }