mirror of https://github.com/iSoron/uhabits.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.1 KiB
94 lines
3.1 KiB
/*
|
|
* Copyright (C) 2016-2025 Álinson Santos Xavier <git@axavier.org>
|
|
*
|
|
* This file is part of Loop Habit Tracker.
|
|
*
|
|
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package com.android.datetimepicker;
|
|
|
|
import android.app.Service;
|
|
import android.content.Context;
|
|
import android.database.ContentObserver;
|
|
import android.net.Uri;
|
|
import android.os.SystemClock;
|
|
import android.os.Vibrator;
|
|
import android.provider.Settings;
|
|
|
|
/**
|
|
* A simple utility class to handle haptic feedback.
|
|
*/
|
|
public class HapticFeedbackController {
|
|
private static final int VIBRATE_DELAY_MS = 125;
|
|
private static final int VIBRATE_LENGTH_MS = 5;
|
|
|
|
private static boolean checkGlobalSetting(Context context) {
|
|
return Settings.System.getInt(context.getContentResolver(),
|
|
Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 1;
|
|
}
|
|
|
|
private final Context mContext;
|
|
private final ContentObserver mContentObserver;
|
|
|
|
private Vibrator mVibrator;
|
|
private boolean mIsGloballyEnabled;
|
|
private long mLastVibrate;
|
|
|
|
public HapticFeedbackController(Context context) {
|
|
mContext = context;
|
|
mContentObserver = new ContentObserver(null) {
|
|
@Override
|
|
public void onChange(boolean selfChange) {
|
|
mIsGloballyEnabled = checkGlobalSetting(mContext);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Call to setup the controller.
|
|
*/
|
|
public void start() {
|
|
mVibrator = (Vibrator) mContext.getSystemService(Service.VIBRATOR_SERVICE);
|
|
|
|
// Setup a listener for changes in haptic feedback settings
|
|
mIsGloballyEnabled = checkGlobalSetting(mContext);
|
|
Uri uri = Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED);
|
|
mContext.getContentResolver().registerContentObserver(uri, false, mContentObserver);
|
|
}
|
|
|
|
/**
|
|
* Call this when you don't need the controller anymore.
|
|
*/
|
|
public void stop() {
|
|
mVibrator = null;
|
|
mContext.getContentResolver().unregisterContentObserver(mContentObserver);
|
|
}
|
|
|
|
/**
|
|
* Try to vibrate. To prevent this becoming a single continuous vibration, nothing will
|
|
* happen if we have vibrated very recently.
|
|
*/
|
|
public void tryVibrate() {
|
|
if (mVibrator != null && mIsGloballyEnabled) {
|
|
long now = SystemClock.uptimeMillis();
|
|
// We want to try to vibrate each individual tick discretely.
|
|
if (now - mLastVibrate >= VIBRATE_DELAY_MS) {
|
|
mVibrator.vibrate(VIBRATE_LENGTH_MS);
|
|
mLastVibrate = now;
|
|
}
|
|
}
|
|
}
|
|
}
|