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

Commit aaef048c authored by Andy Wickham's avatar Andy Wickham Committed by Android (Google) Code Review
Browse files

Merge "Removes System UI plugin for BC Smartspace." into sc-dev

parents 7ae022ad 46ad0118
Loading
Loading
Loading
Loading
+47 −86
Original line number Original line Diff line number Diff line
@@ -23,8 +23,6 @@ import android.app.WallpaperManager;
import android.app.smartspace.SmartspaceConfig;
import android.app.smartspace.SmartspaceConfig;
import android.app.smartspace.SmartspaceManager;
import android.app.smartspace.SmartspaceManager;
import android.app.smartspace.SmartspaceSession;
import android.app.smartspace.SmartspaceSession;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Color;
import android.text.TextUtils;
import android.text.TextUtils;
@@ -39,14 +37,13 @@ import com.android.internal.graphics.ColorUtils;
import com.android.keyguard.clock.ClockManager;
import com.android.keyguard.clock.ClockManager;
import com.android.settingslib.Utils;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
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.FeatureFlags;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.PropertyAnimator;
@@ -69,14 +66,16 @@ import javax.inject.Inject;
public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> {
public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> {
    private static final boolean CUSTOM_CLOCKS_ENABLED = true;
    private static final boolean CUSTOM_CLOCKS_ENABLED = true;


    private final Resources mResources;
    private final StatusBarStateController mStatusBarStateController;
    private final StatusBarStateController mStatusBarStateController;
    private final SysuiColorExtractor mColorExtractor;
    private final SysuiColorExtractor mColorExtractor;
    private final ClockManager mClockManager;
    private final ClockManager mClockManager;
    private final KeyguardSliceViewController mKeyguardSliceViewController;
    private final KeyguardSliceViewController mKeyguardSliceViewController;
    private final NotificationIconAreaController mNotificationIconAreaController;
    private final NotificationIconAreaController mNotificationIconAreaController;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final Executor mUiExecutor;
    private final BatteryController mBatteryController;
    private final BatteryController mBatteryController;
    private final FeatureFlags mFeatureFlags;
    private final SystemUIFactory mSystemUIFactory;


    /**
    /**
     * Clock for both small and large sizes
     * Clock for both small and large sizes
@@ -86,10 +85,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
    private AnimatableClockController mLargeClockViewController;
    private AnimatableClockController mLargeClockViewController;
    private FrameLayout mLargeClockFrame;
    private FrameLayout mLargeClockFrame;


    private PluginManager mPluginManager;
    private boolean mIsSmartspaceEnabled;
    PluginListener mPluginListener;
    private Executor mUiExecutor;
    private SmartspaceSession mSmartspaceSession;
    private SmartspaceSession mSmartspaceSession;
    private SmartspaceSession.Callback mSmartspaceCallback;
    private SmartspaceSession.Callback mSmartspaceCallback;
    private float mDozeAmount;
    private float mDozeAmount;
@@ -137,31 +132,28 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
    @Inject
    @Inject
    public KeyguardClockSwitchController(
    public KeyguardClockSwitchController(
            KeyguardClockSwitch keyguardClockSwitch,
            KeyguardClockSwitch keyguardClockSwitch,
            @Main Resources resources,
            StatusBarStateController statusBarStateController,
            StatusBarStateController statusBarStateController,
            SysuiColorExtractor colorExtractor, ClockManager clockManager,
            SysuiColorExtractor colorExtractor, ClockManager clockManager,
            KeyguardSliceViewController keyguardSliceViewController,
            KeyguardSliceViewController keyguardSliceViewController,
            NotificationIconAreaController notificationIconAreaController,
            NotificationIconAreaController notificationIconAreaController,
            ContentResolver contentResolver,
            BroadcastDispatcher broadcastDispatcher,
            BroadcastDispatcher broadcastDispatcher,
            PluginManager pluginManager,
            FeatureFlags featureFlags,
            FeatureFlags featureFlags,
            @Main Executor uiExecutor,
            @Main Executor uiExecutor,
            BatteryController batteryController,
            BatteryController batteryController,
            ConfigurationController configurationController) {
            ConfigurationController configurationController,
            SystemUIFactory systemUIFactory) {
        super(keyguardClockSwitch);
        super(keyguardClockSwitch);
        mResources = resources;
        mStatusBarStateController = statusBarStateController;
        mStatusBarStateController = statusBarStateController;
        mColorExtractor = colorExtractor;
        mColorExtractor = colorExtractor;
        mClockManager = clockManager;
        mClockManager = clockManager;
        mKeyguardSliceViewController = keyguardSliceViewController;
        mKeyguardSliceViewController = keyguardSliceViewController;
        mNotificationIconAreaController = notificationIconAreaController;
        mNotificationIconAreaController = notificationIconAreaController;
        mBroadcastDispatcher = broadcastDispatcher;
        mBroadcastDispatcher = broadcastDispatcher;
        mPluginManager = pluginManager;
        mFeatureFlags = featureFlags;
        mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled();
        mUiExecutor = uiExecutor;
        mUiExecutor = uiExecutor;
        mBatteryController = batteryController;
        mBatteryController = batteryController;
        mConfigurationController = configurationController;
        mConfigurationController = configurationController;
        mSystemUIFactory = systemUIFactory;
    }
    }


    /**
    /**
@@ -206,24 +198,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        mStatusBarStateController.addCallback(mStatusBarStateListener);
        mStatusBarStateController.addCallback(mStatusBarStateListener);
        mConfigurationController.addCallback(mConfigurationListener);
        mConfigurationController.addCallback(mConfigurationListener);


        // If a smartspace plugin is detected, replace the existing smartspace
        BcSmartspaceDataPlugin smartspaceDataPlugin = mSystemUIFactory.getSmartspaceDataProvider();
        // (keyguard_status_area), and initialize a new session
        if (mFeatureFlags.isSmartspaceEnabled() && smartspaceDataPlugin != null) {
        mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() {

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

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


                mSmartspaceView = plugin.getView(mView);
            mSmartspaceView = smartspaceDataPlugin.getView(mView);
                mSmartspaceView.registerDataProvider(plugin);
            mSmartspaceView.registerDataProvider(smartspaceDataPlugin);
            updateSmartspaceColor();
            updateSmartspaceColor();
            View asView = (View) mSmartspaceView;
            View asView = (View) mSmartspaceView;


                // Place plugin view below normal clock...
            // Place smartspace view below normal clock...
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                    MATCH_PARENT, WRAP_CONTENT);
                    MATCH_PARENT, WRAP_CONTENT);
            lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view);
            lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view);
@@ -239,42 +225,18 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            mLargeClockFrame.setLayoutParams(lp);
            mLargeClockFrame.setLayoutParams(lp);


            View nic = mView.findViewById(
            View nic = mView.findViewById(
                        com.android.systemui.R.id.left_aligned_notification_icon_container);
                    R.id.left_aligned_notification_icon_container);
            lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
            lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
            lp.addRule(RelativeLayout.BELOW, asView.getId());
            lp.addRule(RelativeLayout.BELOW, asView.getId());
            nic.setLayoutParams(lp);
            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);
                mLargeClockFrame.setLayoutParams(lp);

                mSmartspaceView = null;
            }

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


    private void updateWallpaperColor() {
    private void updateWallpaperColor() {
@@ -303,7 +265,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            mSmartspaceSession.destroy();
            mSmartspaceSession.destroy();
            mSmartspaceSession = null;
            mSmartspaceSession = null;
        }
        }
        mPluginManager.removePluginListener(mPluginListener);
        mStatusBarStateController.removeCallback(mStatusBarStateListener);
        mStatusBarStateController.removeCallback(mStatusBarStateListener);
        mConfigurationController.removeCallback(mConfigurationListener);
        mConfigurationController.removeCallback(mConfigurationListener);
    }
    }
+5 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.systemui.dagger.GlobalRootComponent;
import com.android.systemui.dagger.SysUIComponent;
import com.android.systemui.dagger.SysUIComponent;
import com.android.systemui.dagger.WMComponent;
import com.android.systemui.dagger.WMComponent;
import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider;
import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;


@@ -209,4 +210,8 @@ public class SystemUIFactory {
            AssetManager am, String modelName) {
            AssetManager am, String modelName) {
        return new BackGestureTfClassifierProvider();
        return new BackGestureTfClassifierProvider();
    }
    }

    public BcSmartspaceDataPlugin getSmartspaceDataProvider() {
        return null;
    }
}
}
+6 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.keyguard.clock.ClockModule;
import com.android.keyguard.dagger.KeyguardBouncerComponent;
import com.android.keyguard.dagger.KeyguardBouncerComponent;
import com.android.systemui.BootCompleteCache;
import com.android.systemui.BootCompleteCache;
import com.android.systemui.BootCompleteCacheImpl;
import com.android.systemui.BootCompleteCacheImpl;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.appops.dagger.AppOpsModule;
import com.android.systemui.appops.dagger.AppOpsModule;
import com.android.systemui.assist.AssistModule;
import com.android.systemui.assist.AssistModule;
import com.android.systemui.classifier.FalsingModule;
import com.android.systemui.classifier.FalsingModule;
@@ -159,6 +160,11 @@ public abstract class SystemUIModule {
    @Binds
    @Binds
    abstract SystemClock bindSystemClock(SystemClockImpl systemClock);
    abstract SystemClock bindSystemClock(SystemClockImpl systemClock);


    @Provides
    static SystemUIFactory getSystemUIFactory() {
        return SystemUIFactory.getInstance();
    }

    // TODO: This should provided by the WM component
    // TODO: This should provided by the WM component
    /** Provides Optional of BubbleManager */
    /** Provides Optional of BubbleManager */
    @SysUISingleton
    @SysUISingleton
+33 −36
Original line number Original line Diff line number Diff line
@@ -16,16 +16,15 @@


package com.android.keyguard;
package com.android.keyguard;


import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.content.ContentResolver;
import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.SmallTest;
@@ -38,13 +37,13 @@ import android.widget.RelativeLayout;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
import com.android.keyguard.clock.ClockManager;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
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.FeatureFlags;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
@@ -87,12 +86,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
    @Mock
    @Mock
    NotificationIconAreaController mNotificationIconAreaController;
    NotificationIconAreaController mNotificationIconAreaController;
    @Mock
    @Mock
    ContentResolver mContentResolver;
    @Mock
    BroadcastDispatcher mBroadcastDispatcher;
    BroadcastDispatcher mBroadcastDispatcher;
    @Mock
    @Mock
    private PluginManager mPluginManager;
    @Mock
    private FeatureFlags mFeatureFlags;
    private FeatureFlags mFeatureFlags;
    @Mock
    @Mock
    private Executor mExecutor;
    private Executor mExecutor;
@@ -106,6 +101,12 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
    BatteryController mBatteryController;
    BatteryController mBatteryController;
    @Mock
    @Mock
    ConfigurationController mConfigurationController;
    ConfigurationController mConfigurationController;
    @Mock
    BcSmartspaceDataPlugin mSmartspaceDataProvider;
    @Mock
    SmartspaceView mSmartspaceView;
    @Mock
    SystemUIFactory mSystemUIFactory;


    private KeyguardClockSwitchController mController;
    private KeyguardClockSwitchController mController;
    private View mStatusArea;
    private View mStatusArea;
@@ -129,27 +130,28 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
        when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
        when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
        when(mView.isAttachedToWindow()).thenReturn(true);
        when(mView.isAttachedToWindow()).thenReturn(true);
        when(mResources.getString(anyInt())).thenReturn("h:mm");
        when(mResources.getString(anyInt())).thenReturn("h:mm");
        when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(mSmartspaceDataProvider);
        mController = new KeyguardClockSwitchController(
        mController = new KeyguardClockSwitchController(
                mView,
                mView,
                mResources,
                mStatusBarStateController,
                mStatusBarStateController,
                mColorExtractor,
                mColorExtractor,
                mClockManager,
                mClockManager,
                mKeyguardSliceViewController,
                mKeyguardSliceViewController,
                mNotificationIconAreaController,
                mNotificationIconAreaController,
                mContentResolver,
                mBroadcastDispatcher,
                mBroadcastDispatcher,
                mPluginManager,
                mFeatureFlags,
                mFeatureFlags,
                mExecutor,
                mExecutor,
                mBatteryController,
                mBatteryController,
                mConfigurationController);
                mConfigurationController,
                mSystemUIFactory
        );


        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
        when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors);
        when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors);


        mStatusArea = mock(View.class);
        mStatusArea = new View(getContext());
        when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);
        when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);
        when(mSmartspaceDataProvider.getView(any())).thenReturn(mSmartspaceView);


    }
    }


@@ -210,43 +212,37 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
    }
    }


    @Test
    @Test
    public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() {
    public void testSmartspaceEnabledRemovesKeyguardStatusArea() {
        when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
        mController.init();
        mController.init();


        BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
        assertEquals(View.GONE, mStatusArea.getVisibility());
        TestView view = mock(TestView.class);
        when(plugin.getView(any())).thenReturn(view);

        mController.mPluginListener.onPluginConnected(plugin, mContext);
        verify(mStatusArea).setVisibility(View.GONE);
    }
    }


    @Test
    @Test
    public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() {
    public void testSmartspaceEnabledNoDataProviderShowsKeyguardStatusArea() {
        when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
        when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(null);
        mController.init();
        mController.init();


        BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
        assertEquals(View.VISIBLE, mStatusArea.getVisibility());
        TestView view = mock(TestView.class);
        when(plugin.getView(any())).thenReturn(view);

        mController.mPluginListener.onPluginConnected(plugin, mContext);
        mController.mPluginListener.onPluginDisconnected(plugin);
        verify(mStatusArea).setVisibility(View.VISIBLE);
    }
    }


    @Test
    @Test
    public void testThemeChangeNotifiesSmartspace() {
    public void testSmartspaceDisabledShowsKeyguardStatusArea() {
        when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(false);
        mController.init();
        mController.init();


        BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
        assertEquals(View.VISIBLE, mStatusArea.getVisibility());
        TestView view = mock(TestView.class);
    }
        when(plugin.getView(any())).thenReturn(view);


        mController.mPluginListener.onPluginConnected(plugin, mContext);
    @Test
    public void testThemeChangeNotifiesSmartspace() {
        mController.init();
        verify(mSmartspaceView).setPrimaryTextColor(anyInt());


        reset(view);
        mController.getConfigurationListener().onThemeChanged();
        mController.getConfigurationListener().onThemeChanged();
        verify(view).setPrimaryTextColor(anyInt());
        verify(mSmartspaceView, times(2)).setPrimaryTextColor(anyInt());
    }
    }


    private void verifyAttachment(VerificationMode times) {
    private void verifyAttachment(VerificationMode times) {
@@ -257,8 +253,9 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
        verify(mView, times).updateColors(mGradientColors);
        verify(mView, times).updateColors(mGradientColors);
    }
    }


    private static class TestView extends View implements BcSmartspaceDataPlugin.SmartspaceView {
    private static class SmartspaceView extends View
        TestView(Context context, AttributeSet attrs) {
            implements BcSmartspaceDataPlugin.SmartspaceView {
        SmartspaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
            super(context, attrs);
        }
        }