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

Commit 37d3636c authored by Matt Pietal's avatar Matt Pietal
Browse files

Enable smartspace

Allow KeyguardSliceProvider to be replaced by content coming from the
BcSmartspaceDataPlugin, only when the plugin is enabled.

Bug: 172360102
Test: manual
Change-Id: I77a4ef72c7131f955fe37763e02542726c36927b
parent 47fe6523
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -275,6 +275,8 @@
    <!-- Permission to make accessibility service access Bubbles -->
    <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" />

    <!-- Can control and display smartspace content -->
    <uses-permission android:name="android.permission.MANAGE_SMARTSPACE" />

    <protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
    <protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" />
+16 −0
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

package com.android.systemui.plugins;

import android.app.smartspace.SmartspaceTarget;
import android.os.Parcelable;
import android.view.ViewGroup;

import com.android.systemui.plugins.annotations.ProvidesInterface;

@@ -36,9 +38,23 @@ public interface BcSmartspaceDataPlugin extends Plugin {
    /** Unregister a listener. */
    void unregisterListener(SmartspaceTargetListener listener);

    /**
     * Create a view to be shown within the parent. Do not add the view, as the parent
     * will be responsible for correctly setting the LayoutParams
     */
    SmartspaceView getView(ViewGroup parent);

    /** Updates Smartspace data and propagates it to any listeners. */
    void onTargetsAvailable(List<SmartspaceTarget> targets);

    /** Provides Smartspace data to registered listeners. */
    interface SmartspaceTargetListener {
        /** Each Parcelable is a SmartspaceTarget that represents a card. */
        void onSmartspaceTargetsUpdated(List<? extends Parcelable> targets);
    }

    /** View to which this plugin can be registered, in order to get updates. */
    interface SmartspaceView {
        void registerDataProvider(BcSmartspaceDataPlugin plugin);
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -52,4 +52,6 @@
    <bool name="flag_charging_ripple">false</bool>

    <bool name="flag_ongoing_call_status_bar_chip">false</bool>

    <bool name="flag_smartspace">false</bool>
</resources>
+99 −1
Original line number Diff line number Diff line
@@ -16,8 +16,15 @@

package com.android.keyguard;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;

import android.app.WallpaperManager;
import android.app.smartspace.SmartspaceConfig;
import android.app.smartspace.SmartspaceManager;
import android.app.smartspace.SmartspaceSession;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings;
import android.text.TextUtils;
@@ -25,6 +32,7 @@ import android.text.format.DateFormat;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;

import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
@@ -32,8 +40,12 @@ import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
@@ -43,6 +55,7 @@ import com.android.systemui.util.ViewController;

import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.Executor;

import javax.inject.Inject;

@@ -68,6 +81,13 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
    private AnimatableClockController mNewLockScreenLargeClockViewController;
    private FrameLayout mNewLockScreenLargeClockFrame;

    private PluginManager mPluginManager;
    private boolean mIsSmartspaceEnabled;
    PluginListener mPluginListener;
    private Executor mUiExecutor;
    private SmartspaceSession mSmartspaceSession;
    private SmartspaceSession.Callback mSmartspaceCallback;

    private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;

    private final StatusBarStateController.StateListener mStateListener =
@@ -96,6 +116,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
    private ClockManager.ClockChangedListener mClockChangedListener = this::setClockPlugin;
    private String mTimeFormat;

    // If set, will replace keyguard_status_area
    private BcSmartspaceDataPlugin.SmartspaceView mSmartspaceView;

    @Inject
    public KeyguardClockSwitchController(
            KeyguardClockSwitch keyguardClockSwitch,
@@ -105,7 +128,10 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            KeyguardSliceViewController keyguardSliceViewController,
            NotificationIconAreaController notificationIconAreaController,
            ContentResolver contentResolver,
            BroadcastDispatcher broadcastDispatcher) {
            BroadcastDispatcher broadcastDispatcher,
            PluginManager pluginManager,
            FeatureFlags featureFlags,
            @Main Executor uiExecutor) {
        super(keyguardClockSwitch);
        mResources = resources;
        mStatusBarStateController = statusBarStateController;
@@ -115,6 +141,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        mNotificationIconAreaController = notificationIconAreaController;
        mBroadcastDispatcher = broadcastDispatcher;
        mTimeFormat = Settings.System.getString(contentResolver, Settings.System.TIME_12_24);
        mPluginManager = pluginManager;
        mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled();
        mUiExecutor = uiExecutor;
    }

    /**
@@ -137,6 +166,63 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        updateAodIcons();
        mNewLockScreenClockFrame = mView.findViewById(R.id.new_lockscreen_clock_view);
        mNewLockScreenLargeClockFrame = mView.findViewById(R.id.new_lockscreen_clock_view_large);

        // If a smartspace plugin is detected, replace the existing smartspace
        // (keyguard_status_area), and initialize a new session
        mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() {

            @Override
            public void onPluginConnected(BcSmartspaceDataPlugin plugin, Context pluginContext) {
                if (!mIsSmartspaceEnabled) return;

                View ksa = mView.findViewById(R.id.keyguard_status_area);
                int ksaIndex = mView.indexOfChild(ksa);
                ksa.setVisibility(View.GONE);

                mSmartspaceView = plugin.getView(mView);
                mSmartspaceView.registerDataProvider(plugin);

                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                        MATCH_PARENT, WRAP_CONTENT);
                lp.addRule(RelativeLayout.BELOW, R.id.new_lockscreen_clock_view);
                mView.addView((View) mSmartspaceView, ksaIndex, lp);

                View nic = mView.findViewById(
                        com.android.systemui.R.id.left_aligned_notification_icon_container);
                lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
                lp.addRule(RelativeLayout.BELOW, ((View) mSmartspaceView).getId());
                nic.setLayoutParams(lp);

                createSmartspaceSession(plugin);
            }

            @Override
            public void onPluginDisconnected(BcSmartspaceDataPlugin plugin) {
                if (!mIsSmartspaceEnabled) return;

                mView.removeView((View) mSmartspaceView);
                mView.findViewById(R.id.keyguard_status_area).setVisibility(View.VISIBLE);

                View nic = mView.findViewById(
                        com.android.systemui.R.id.left_aligned_notification_icon_container);
                RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)
                        nic.getLayoutParams();
                lp.addRule(RelativeLayout.BELOW, R.id.keyguard_status_area);
                nic.setLayoutParams(lp);

                mSmartspaceView = null;
            }

            private void createSmartspaceSession(BcSmartspaceDataPlugin plugin) {
                mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
                        .createSmartspaceSession(
                                new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
                mSmartspaceCallback = targets -> plugin.onTargetsAvailable(targets);
                mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback);
                mSmartspaceSession.requestSmartspaceUpdate();
            }
        };
        mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false);
    }

    @Override
@@ -147,6 +233,13 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        mStatusBarStateController.removeCallback(mStateListener);
        mColorExtractor.removeOnColorsChangedListener(mColorsListener);
        mView.setClockPlugin(null, mStatusBarStateController.getState());

        if (mSmartspaceSession != null) {
            mSmartspaceSession.unregisterSmartspaceUpdates(mSmartspaceCallback);
            mSmartspaceSession.destroy();
            mSmartspaceSession = null;
        }
        mPluginManager.removePluginListener(mPluginListener);
    }

    /**
@@ -222,6 +315,11 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            PropertyAnimator.setProperty(mNewLockScreenLargeClockFrame, AnimatableProperty.SCALE_Y,
                    scale, props, animate);
        }

        if (mSmartspaceView != null) {
            PropertyAnimator.setProperty((View) mSmartspaceView, AnimatableProperty.TRANSLATION_X,
                    x, props, animate);
        }
        mKeyguardSliceViewController.updatePosition(x, props, animate);
        mNotificationIconAreaController.updatePosition(x, props, animate);
    }
+4 −0
Original line number Diff line number Diff line
@@ -102,4 +102,8 @@ public class FeatureFlags {
    public boolean isOngoingCallStatusBarChipEnabled() {
        return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip);
    }

    public boolean isSmartspaceEnabled() {
        return mFlagReader.isEnabled(R.bool.flag_smartspace);
    }
}
Loading