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

Commit b2df16ae authored by Steven Moreland's avatar Steven Moreland Committed by Android (Google) Code Review
Browse files

Merge "LightService: recover if light hal fails."

parents be7febfd 8dd89024
Loading
Loading
Loading
Loading
+64 −46
Original line number Original line Diff line number Diff line
@@ -43,63 +43,46 @@ static sp<ILight> gLight;
static bool validate(jint light, jint flash, jint brightness) {
static bool validate(jint light, jint flash, jint brightness) {
    bool valid = true;
    bool valid = true;


    if (light < 0 || light >= static_cast<int>(Type::COUNT)) {
    if (light < 0 || light >= static_cast<jint>(Type::COUNT)) {
        ALOGE("Invalid light parameter %d.", light);
        ALOGE("Invalid light parameter %d.", light);
        valid = false;
        valid = false;
    }
    }


    if (flash != static_cast<int>(Flash::NONE) &&
    if (flash != static_cast<jint>(Flash::NONE) &&
        flash != static_cast<int>(Flash::TIMED) &&
        flash != static_cast<jint>(Flash::TIMED) &&
        flash != static_cast<int>(Flash::HARDWARE)) {
        flash != static_cast<jint>(Flash::HARDWARE)) {
        ALOGE("Invalid flash parameter %d.", flash);
        ALOGE("Invalid flash parameter %d.", flash);
        valid = false;
        valid = false;
    }
    }


    if (brightness != static_cast<int>(Brightness::USER) &&
    if (brightness != static_cast<jint>(Brightness::USER) &&
        brightness != static_cast<int>(Brightness::SENSOR) &&
        brightness != static_cast<jint>(Brightness::SENSOR) &&
        brightness != static_cast<int>(Brightness::LOW_PERSISTENCE)) {
        brightness != static_cast<jint>(Brightness::LOW_PERSISTENCE)) {
        ALOGE("Invalid brightness parameter %d.", brightness);
        ALOGE("Invalid brightness parameter %d.", brightness);
        valid = false;
        valid = false;
    }
    }


    if (brightness == static_cast<jint>(Brightness::LOW_PERSISTENCE) &&
        light != static_cast<jint>(Type::BACKLIGHT)) {
        ALOGE("Cannot set low-persistence mode for non-backlight device.");
        valid = false;
    }

    return valid;
    return valid;
}
}


static void setLight_native(
static LightState constructState(
        JNIEnv* /* env */,
        jobject /* clazz */,
        jint light,
        jint colorARGB,
        jint colorARGB,
        jint flashMode,
        jint flashMode,
        jint onMS,
        jint onMS,
        jint offMS,
        jint offMS,
        jint brightnessMode){
        jint brightnessMode){

    if (!validate(light, flashMode, brightnessMode)) {
        return;
    }

    // TODO(b/31632518)
    if (gLight == nullptr) {
        gLight = ILight::getService();
    }

    if (gLight == nullptr) {
        ALOGE("LightService unable to get ILight interface.");
        return;
    }

    Type type = static_cast<Type>(light);
    Flash flash = static_cast<Flash>(flashMode);
    Flash flash = static_cast<Flash>(flashMode);
    Brightness brightness = static_cast<Brightness>(brightnessMode);
    Brightness brightness = static_cast<Brightness>(brightnessMode);


    LightState state{};
    LightState state{};


    if (brightnessMode == static_cast<int>(Brightness::LOW_PERSISTENCE)) {
    if (brightness == Brightness::LOW_PERSISTENCE) {
        if (light != static_cast<int>(Type::BACKLIGHT)) {
            ALOGE("Cannot set low-persistence mode for non-backlight device.");
            return;
        }
        state.flashMode = Flash::NONE;
        state.flashMode = Flash::NONE;
    } else {
    } else {
        // Only set non-brightness settings when not in low-persistence mode
        // Only set non-brightness settings when not in low-persistence mode
@@ -111,27 +94,28 @@ static void setLight_native(
    state.color = colorARGB;
    state.color = colorARGB;
    state.brightnessMode = brightness;
    state.brightnessMode = brightness;


    Status status;
    return state;
    {
}
        ALOGD_IF_SLOW(50, "Excessive delay setting light");
        Return<Status> ret = gLight->setLight(type, state);


static void processReturn(
        const Return<Status> &ret,
        Type type,
        const LightState &state) {
    if (!ret.isOk()) {
    if (!ret.isOk()) {
        ALOGE("Failed to issue set light command.");
        ALOGE("Failed to issue set light command.");
        gLight = nullptr;
        return;
        return;
    }
    }


        status = static_cast<Status>(ret); // hal status
    switch (static_cast<Status>(ret)) {
    }

    switch (status) {
        case Status::SUCCESS:
        case Status::SUCCESS:
            break;
            break;
        case Status::LIGHT_NOT_SUPPORTED:
        case Status::LIGHT_NOT_SUPPORTED:
            ALOGE("Light requested not availale on this device.");
            ALOGE("Light requested not available on this device. %d", type);
            break;
            break;
        case Status::BRIGHTNESS_NOT_SUPPORTED:
        case Status::BRIGHTNESS_NOT_SUPPORTED:
            ALOGE("Brightness parameter not supported on this device.");
            ALOGE("Brightness parameter not supported on this device: %d",
                state.brightnessMode);
            break;
            break;
        case Status::UNKNOWN:
        case Status::UNKNOWN:
        default:
        default:
@@ -139,6 +123,40 @@ static void setLight_native(
    }
    }
}
}


static void setLight_native(
        JNIEnv* /* env */,
        jobject /* clazz */,
        jint light,
        jint colorARGB,
        jint flashMode,
        jint onMS,
        jint offMS,
        jint brightnessMode) {

    if (!validate(light, flashMode, brightnessMode)) {
        return;
    }

    if (gLight == nullptr || !gLight->ping().isOk()) {
        gLight = ILight::getService();
    }

    if (gLight == nullptr) {
        ALOGE("Unable to get ILight interface.");
        return;
    }

    Type type = static_cast<Type>(light);
    LightState state = constructState(
        colorARGB, flashMode, onMS, offMS, brightnessMode);

    {
        ALOGD_IF_SLOW(50, "Excessive delay setting light");
        Return<Status> ret = gLight->setLight(type, state);
        processReturn(ret, type, state);
    }
}

static const JNINativeMethod method_table[] = {
static const JNINativeMethod method_table[] = {
    { "setLight_native", "(IIIIII)V", (void*)setLight_native },
    { "setLight_native", "(IIIIII)V", (void*)setLight_native },
};
};