NavigatorVibration::VibrationPattern NavigatorVibration::sanitizeVibrationPattern(const UnsignedLongOrUnsignedLongSequence& pattern)
{
    VibrationPattern sanitized;

    if (pattern.isUnsignedLong())
        sanitized.append(pattern.getAsUnsignedLong());
    else if (pattern.isUnsignedLongSequence())
        sanitized = pattern.getAsUnsignedLongSequence();

    return sanitizeVibrationPatternInternal(sanitized);
}
bool NavigatorVibration::vibrate(const VibrationPattern& pattern)
{
    VibrationPattern sanitized = pattern;
    size_t length = sanitized.size();

    // If the pattern is too long then truncate it.
    if (length > kVibrationPatternLengthMax) {
        sanitized.shrink(kVibrationPatternLengthMax);
        length = kVibrationPatternLengthMax;
    }

    // If any pattern entry is too long then truncate it.
    for (size_t i = 0; i < length; ++i) {
        if (sanitized[i] > blink::kVibrationDurationMax)
            sanitized[i] = blink::kVibrationDurationMax;
    }

    // If the last item in the pattern is a pause then discard it.
    if (length && !(length % 2))
        sanitized.removeLast();

    // Cancelling clears the stored pattern so do it before setting the new one.
    if (m_isVibrating)
        cancelVibration();

    m_pattern = sanitized;

    if (m_timerStart.isActive())
        m_timerStart.stop();

    if (!m_pattern.size())
        return true;

    if (m_pattern.size() == 1 && !m_pattern[0]) {
        m_pattern.clear();
        return true;
    }

    m_timerStart.startOneShot(0, FROM_HERE);
    m_isVibrating = true;
    return true;
}
Example #3
0
bool NavigatorVibration::vibrate(const VibrationPattern& pattern)
{
    size_t length = pattern.size();

    // If the pattern is too long then abort.
    if (length > kVibrationPatternLengthMax)
        return false;

    // If any pattern entry is too long then abort.
    for (size_t i = 0; i < length; ++i) {
        if (pattern[i] > kVibrationDurationMax)
            return false;
    }

    // Cancelling clears the pattern so do this before setting the new pattern.
    if (m_isVibrating)
        cancelVibration();

    // If the last item in the pattern is a pause then discard it.
    if (length && !(length % 2)) {
        VibrationPattern tempPattern = pattern;
        tempPattern.removeLast();
        m_pattern = tempPattern;
    } else {
        m_pattern = pattern;
    }

    if (m_timerStart.isActive())
        m_timerStart.stop();

    if (!m_pattern.size())
        return true;

    if (m_pattern.size() == 1 && !m_pattern[0]) {
        m_pattern.clear();
        return true;
    }

    m_timerStart.startOneShot(0);
    return true;
}
Example #4
0
void Vibration::vibrate(const VibrationPattern& pattern)
{
    int length = pattern.size();

    // Cancel the pre-existing instance of vibration patterns, if the pattern is 0 or an empty list.
    if (!length || (length == 1 && !pattern[0])) {
        cancelVibration();
        return;
    }

    if (m_isVibrating)
        cancelVibration();

    if (m_timerStart.isActive())
        m_timerStart.stop();

    m_pattern = pattern;
    m_timerStart.startOneShot(0);
}
bool NavigatorVibration::vibrate(Navigator& navigator, unsigned time)
{
    VibrationPattern pattern;
    pattern.append(time);
    return NavigatorVibration::vibrate(navigator, pattern);
}