diff options
| -rw-r--r-- | services/appwidget/Android.bp | 10 | ||||
| -rw-r--r-- | services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java | 41 | 
2 files changed, 49 insertions, 2 deletions
| diff --git a/services/appwidget/Android.bp b/services/appwidget/Android.bp index 8119073fdf7f..9548afe398b1 100644 --- a/services/appwidget/Android.bp +++ b/services/appwidget/Android.bp @@ -17,6 +17,12 @@ filegroup {  java_library_static {      name: "services.appwidget",      defaults: ["platform_service_defaults"], -    srcs: [":services.appwidget-sources"], -    libs: ["services.core"], +    srcs: [ +        ":services.appwidget-sources", +        ":statslog-framework-java-gen", +    ], +    libs: [ +        "androidx.annotation_annotation", +        "services.core", +    ],  } diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index d47aab061788..b610313c770b 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -51,6 +51,7 @@ import android.app.IApplicationThread;  import android.app.IServiceConnection;  import android.app.KeyguardManager;  import android.app.PendingIntent; +import android.app.StatsManager;  import android.app.admin.DevicePolicyManagerInternal;  import android.app.admin.DevicePolicyManagerInternal.OnCrossProfileWidgetProvidersChangeListener;  import android.app.usage.Flags; @@ -125,6 +126,7 @@ import android.util.SparseArray;  import android.util.SparseBooleanArray;  import android.util.SparseIntArray;  import android.util.SparseLongArray; +import android.util.StatsEvent;  import android.util.TypedValue;  import android.util.Xml;  import android.util.proto.ProtoInputStream; @@ -146,6 +148,7 @@ import com.android.internal.os.BackgroundThread;  import com.android.internal.os.SomeArgs;  import com.android.internal.util.ArrayUtils;  import com.android.internal.util.DumpUtils; +import com.android.internal.util.FrameworkStatsLog;  import com.android.internal.widget.IRemoteViewsFactory;  import com.android.modules.utils.TypedXmlPullParser;  import com.android.modules.utils.TypedXmlSerializer; @@ -434,6 +437,44 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku          mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);          mAppOpsManagerInternal = LocalServices.getService(AppOpsManagerInternal.class);          mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class); +        registerPullCallbacks(); +    } + +    /** +     * Register callbacks for pull atoms. +     */ +    private void registerPullCallbacks() { +        final StatsManager manager = mContext.getSystemService(StatsManager.class); +        manager.setPullAtomCallback(FrameworkStatsLog.WIDGET_MEMORY_STATS, +                new StatsManager.PullAtomMetadata.Builder().build(), +                new HandlerExecutor(mCallbackHandler), this::onPullAtom); +    } + +    /** +     * Callback from StatsManager to log events indicated by the atomTag. This function will add +     * the relevant events to the data list. +     * +     * @return PULL_SUCCESS if the pull was successful and events should be used, else PULL_SKIP. +     */ +    private int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) { +        if (atomTag == FrameworkStatsLog.WIDGET_MEMORY_STATS) { +            synchronized (mLock) { +                for (Widget widget : mWidgets) { +                    if (widget.views != null) { +                        final int uid = widget.provider.id.uid; +                        final int appWidgetId = widget.appWidgetId; +                        final long bitmapMemoryUsage = +                                widget.views.estimateTotalBitmapMemoryUsage(); +                        StatsEvent event = FrameworkStatsLog.buildStatsEvent( +                                FrameworkStatsLog.WIDGET_MEMORY_STATS, uid, appWidgetId, +                                bitmapMemoryUsage); +                        data.add(event); +                    } +                } +            } +            return StatsManager.PULL_SUCCESS; +        } +        return StatsManager.PULL_SKIP;      }      /** |