JoeSchubert / kernel_adiutor

This project is a manually uploaded fork of Grarak's Kernel Adiutor (for searching reasons)
http://forum.xda-developers.com/android/apps-games/kernel-adiutor-mod-singularity-kernel-t3333549
Apache License 2.0
50 stars 47 forks source link

Vibration on the HTC 10 #89

Open nico151999 opened 7 years ago

nico151999 commented 7 years ago

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;
    }
}