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

Commit bbf2dc49 authored by Vania Januar's avatar Vania Januar Committed by Android (Google) Code Review
Browse files

Merge "USB firmware update for stylus in Stylus USI Device Details" into udc-qpr-dev

parents a94cfc7b 986fe4eb
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -30,4 +30,7 @@
    <PreferenceCategory
        android:key="device_stylus"/>

    <PreferenceCategory
        android:key="stylus_usb_firmware"
        settings:controller="com.android.settings.connecteddevice.stylus.StylusUsbFirmwareController"/>
</PreferenceScreen>
 No newline at end of file
+47 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.connecteddevice.stylus;

import android.content.Context;
import android.hardware.usb.UsbDevice;

import androidx.preference.Preference;

import java.util.List;

import javax.annotation.Nullable;

/** FeatureProvider for USB settings */
public interface StylusFeatureProvider {

    /**
     * Returns whether the current attached USB device allows firmware updates.
     *
     * @param usbDevice The USB device to check
     */
    boolean isUsbFirmwareUpdateEnabled(UsbDevice usbDevice);

    /**
     * Returns a list of preferences for the connected USB device if exists. If not, returns
     * null. If an update is not available but firmware update feature is enabled for the device,
     * the list will contain only the preference showing the current firmware version.
     *
     * @param context The context
     */
    @Nullable
    List<Preference> getUsbFirmwareUpdatePreferences(Context context);
}
+37 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.connecteddevice.stylus;

import android.content.Context;
import android.hardware.usb.UsbDevice;

import androidx.preference.Preference;

import java.util.List;

/** Default implementation for StylusFeatureProvider */
public class StylusFeatureProviderImpl implements StylusFeatureProvider {
    @Override
    public boolean isUsbFirmwareUpdateEnabled(UsbDevice usbDevice) {
        return false;
    }

    @Override
    public List<Preference> getUsbFirmwareUpdatePreferences(Context context) {
        return null;
    }
}
+142 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.connecteddevice.stylus;

import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;

import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;

import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

import java.util.ArrayList;
import java.util.List;

/** Preference controller for stylus firmware updates via USB */
public class StylusUsbFirmwareController extends BasePreferenceController
        implements LifecycleObserver, OnStart, OnStop {
    private static final String TAG = StylusUsbFirmwareController.class.getSimpleName();
    @Nullable
    private UsbDevice mStylusUsbDevice;
    private final UsbStylusBroadcastReceiver mUsbStylusBroadcastReceiver;

    private PreferenceScreen mPreferenceScreen;
    private PreferenceCategory mPreference;

    @VisibleForTesting
    UsbStylusBroadcastReceiver.UsbStylusConnectionListener mUsbConnectionListener =
            (stylusUsbDevice, attached) -> {
                refresh();
            };

    public StylusUsbFirmwareController(Context context, String key) {
        super(context, key);
        mUsbStylusBroadcastReceiver = new UsbStylusBroadcastReceiver(context,
                mUsbConnectionListener);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        mPreferenceScreen = screen;
        refresh();
        super.displayPreference(screen);
    }

    @Override
    public int getAvailabilityStatus() {
        // always available, preferences will be added or
        // removed according to the connected usb device
        return AVAILABLE;
    }

    private void refresh() {
        if (mPreferenceScreen == null) return;

        UsbDevice device = getStylusUsbDevice();
        if (device == mStylusUsbDevice) {
            return;
        }
        mStylusUsbDevice = device;
        mPreference = mPreferenceScreen.findPreference(getPreferenceKey());
        if (mPreference != null) {
            mPreferenceScreen.removePreference(mPreference);
        }
        if (hasUsbStylusFirmwareUpdateFeature(mStylusUsbDevice)) {
            StylusFeatureProvider featureProvider = FeatureFactory.getFactory(
                    mContext).getStylusFeatureProvider();
            List<Preference> preferences =
                    featureProvider.getUsbFirmwareUpdatePreferences(mContext);

            if (preferences != null) {
                mPreference = new PreferenceCategory(mContext);
                mPreference.setKey(getPreferenceKey());
                mPreferenceScreen.addPreference(mPreference);

                for (Preference preference : preferences) {
                    mPreference.addPreference(preference);
                }
            }
        }
    }

    @Override
    public void onStart() {
        mUsbStylusBroadcastReceiver.register();
    }

    @Override
    public void onStop() {
        mUsbStylusBroadcastReceiver.unregister();
    }

    private UsbDevice getStylusUsbDevice() {
        UsbManager usbManager = mContext.getSystemService(UsbManager.class);

        if (usbManager == null) {
            return null;
        }

        List<UsbDevice> devices = new ArrayList<>(usbManager.getDeviceList().values());
        if (devices.isEmpty()) {
            return null;
        }

        UsbDevice usbDevice = devices.get(0);
        if (hasUsbStylusFirmwareUpdateFeature(usbDevice)) {
            return usbDevice;
        }
        return null;
    }

    static boolean hasUsbStylusFirmwareUpdateFeature(UsbDevice usbDevice) {
        if (usbDevice == null) return false;

        StylusFeatureProvider featureProvider = FeatureFactory.getFactory(
                FeatureFactory.getAppContext()).getStylusFeatureProvider();

        return featureProvider.isUsbFirmwareUpdateEnabled(usbDevice);
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -54,7 +54,6 @@ public class StylusUsiDetailsFragment extends DashboardFragment {
        }
    }


    @Override
    public int getMetricsCategory() {
        return SettingsEnums.USI_DEVICE_DETAILS;
Loading