Skip to content

Vibration on the HTC 10 #89

@nico151999

Description

@nico151999

I discussed it with @tbalden some months ago but somehow forgot it. It seems like it isn't only me getting the following error. The only kernel app that seems to be able to handle it currently is EX Kernel Manager by flar2. Well, as the title says the vibration on the HTC 10 can't be set at all. Kernel Adiutor can't read the value as it seems. In the attachment you can find two screenshots I took which may help. I hope someone can fix that. Thanks a lot!
screenshot_20170310-173649
screenshot_20170310-173639

Edit:
Here's a working solution, the code of the beanstalk settings app:

/**
 * Copyright (C) 2013-2016 The CyanogenMod 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.hardware;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Color;
import android.graphics.LightingColorFilter;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.preference.DialogPreference;
import android.support.v7.preference.PreferenceManager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Button;

import com.android.settings.CustomDialogPreference;
import com.android.settings.R;

import cyanogenmod.hardware.CMHardwareManager;
import cyanogenmod.providers.CMSettings;

public class VibratorIntensity extends CustomDialogPreference
        implements SeekBar.OnSeekBarChangeListener {

    private int mOriginalValue;
    private int mMinValue;
    private int mMaxValue;
    private int mDefaultValue;
    private int mWarningValue;

    private SeekBar mSeekBar;
    private TextView mValueText;
    private TextView mWarningText;

    private Drawable mProgressDrawable;
    private Drawable mProgressThumb;
    private LightingColorFilter mRedFilter;

    public VibratorIntensity(final Context context, final AttributeSet attrs) {
        super(context, attrs);

        setDialogLayoutResource(R.layout.vibrator_intensity);
    }

    @Override
    protected void onPrepareDialogBuilder(final AlertDialog.Builder builder,
            final DialogInterface.OnClickListener listener) {
        builder.setNeutralButton(R.string.vibrator_intensity_dialog_reset, null);
    }

    @Override
    protected void onBindDialogView(final View view) {
        super.onBindDialogView(view);

        mSeekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
        mValueText = (TextView) view.findViewById(R.id.value);
        mWarningText = (TextView) view.findViewById(R.id.warning_text);

        // Read the current value in case user wants to dismiss his changes
        final CMHardwareManager hardware = CMHardwareManager.getInstance(getContext());
        mOriginalValue = hardware.getVibratorIntensity();
        mWarningValue = hardware.getVibratorWarningIntensity();
        mMinValue = hardware.getVibratorMinIntensity();
        mMaxValue = hardware.getVibratorMaxIntensity();
        mDefaultValue = hardware.getVibratorDefaultIntensity();

        final String message = getContext().getResources().getString(
                R.string.vibrator_intensity_dialog_warning,
                intensityToPercent(mMinValue, mMaxValue, mWarningValue));
        mWarningText.setText(message);
        if (mWarningValue <= 0) {
            mWarningText.setVisibility(View.GONE);
        }

        final Drawable progressDrawable = mSeekBar.getProgressDrawable();
        if (progressDrawable instanceof LayerDrawable) {
            LayerDrawable ld = (LayerDrawable) progressDrawable;
            mProgressDrawable = ld.findDrawableByLayerId(android.R.id.progress);
        }
        mProgressThumb = mSeekBar.getThumb();
        mRedFilter = new LightingColorFilter(Color.BLACK,
                getContext().getResources().getColor(android.R.color.holo_red_light));

        mSeekBar.setOnSeekBarChangeListener(this);
        mSeekBar.setMax(mMaxValue - mMinValue);
        mSeekBar.setProgress(mOriginalValue - mMinValue);
    }

    @Override
    protected boolean onDismissDialog(final DialogInterface dialog, final int which) {
        // Can't use onPrepareDialogBuilder for this as we want the dialog
        // to be kept open on click
        if (which == DialogInterface.BUTTON_NEUTRAL) {
            mSeekBar.setProgress(mDefaultValue - mMinValue);
            setVibratorIntensity(mDefaultValue);
            testVibration();
            return false;
        }
        return true;
    }

    @Override
    protected void onDialogClosed(final boolean positiveResult) {
        super.onDialogClosed(positiveResult);

        if (positiveResult) {
            // Store percent value in SharedPreferences object
            final SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(getContext());
            final int intensity = mSeekBar.getProgress() + mMinValue;
            final int percent = intensityToPercent(mMinValue, mMaxValue, intensity);
            prefs.edit().putInt(CMSettings.Secure.VIBRATOR_INTENSITY, percent).commit();
            CMSettings.Secure.putInt(getContext().getContentResolver(),
                    CMSettings.Secure.VIBRATOR_INTENSITY, intensity);
        } else {
            setVibratorIntensity(mOriginalValue);
            CMSettings.Secure.putInt(getContext().getContentResolver(),
                    CMSettings.Secure.VIBRATOR_INTENSITY, mOriginalValue);
        }
    }

    @Override
    public void onProgressChanged(
                final SeekBar seekBar, final int progress, final boolean fromUser) {
        final int intensity = progress + mMinValue;
        final boolean shouldWarn = mWarningValue > 0 && intensity >= mWarningValue;

        if (mProgressDrawable != null) {
            mProgressDrawable.setColorFilter(shouldWarn ? mRedFilter : null);
        }
        if (mProgressThumb != null) {
            mProgressThumb.setColorFilter(shouldWarn ? mRedFilter : null);
        }

        mValueText.setText(
                String.format("%d%%", intensityToPercent(mMinValue, mMaxValue, intensity)));
    }

    @Override
    public void onStartTrackingTouch(final SeekBar seekBar) {
        // Do nothing
    }

    @Override
    public void onStopTrackingTouch(final SeekBar seekBar) {
        setVibratorIntensity(seekBar.getProgress() + mMinValue);
        testVibration();
    }

    private void setVibratorIntensity(final int intensity) {
        final CMHardwareManager hardware = CMHardwareManager.getInstance(getContext());
        hardware.setVibratorIntensity(intensity);
    }

    private void testVibration() {
        final Vibrator vib = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
        vib.vibrate(200);
    }

    private static int intensityToPercent(final int min, final int max, final int value) {
        int percent = Math.round((value - min) * (100.f / (max - min)));

        if (percent > 100) {
            percent = 100;
        } else if (percent < 0) {
            percent = 0;
        }

        return percent;
    }

    private static int percentToIntensity(final int min, final int max, final int percent) {
        int value = Math.round((((max - min) * percent) / 100.f) + min);

        if (value > max) {
            value = max;
        } else if (value < min) {
            value = min;
        }

        return value;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions