package android.media; import java.util.ArrayList; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Vibrator; import android.provider.Settings; import android.util.Log; public class VibrationPattern { public static final String URI = "content://com.aokp.romcontrol.Vibrations/vibrations"; public static final String FALLBACK_NAME = "FALLBACK"; public static final String FALLBACK_PATTERN = "500,1000,1000,1000,1000"; private static final String TAG = "VibrationPattern"; private Context mContext = null; private String mName; private Uri mUri; private long[] mPattern; private Vibrator mVibrator = null; public VibrationPattern(String name, ArrayList<Long> pattern, Context context) { mContext = context; mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); mName = name; mPattern = new long[pattern.size()]; for (int i = 0; i < pattern.size() - 1; i++) { mPattern[i] = (pattern.get(i + 1) - pattern.get(i)); } } public VibrationPattern(String name, String patternString, Context context) { mContext = context; mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); mName = name; setPatternFromString(patternString); } public VibrationPattern(Uri uri, Context context) { if (uri != null) { mUri = uri; mContext = context; mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); try { Cursor vibCursor = context.getContentResolver() .query(mUri, null, null, null, null); vibCursor.moveToFirst(); mName = vibCursor.getString(1); setPatternFromString(vibCursor.getString(2)); vibCursor.close(); } catch (Exception e) { Log.d(TAG, "No vibration matching, cloning default vibration"); VibrationPattern def = new VibrationPattern(Uri.parse(VibrationPattern .getPhoneVibration(context)), context); mUri = def.getUri(); mName = def.getName(); mPattern = def.getPattern(); } } } public void setName(String newName) { mName = newName; } public String getName() { return mName; } public long[] getPattern() { return mPattern; } public void setUri(Uri uri) { mUri = uri; } public Uri getUri() { return mUri; } public int getLength() { int sum = 0; for (int i = 0; i < mPattern.length; i++) { sum += (int) mPattern[i]; } return sum; } public String getPatternString() { String result = ""; for (int i = 0; i < mPattern.length; i++) { result = result.concat(Long.toString(mPattern[i]) + ","); } return result.substring(0, result.length() - 1); } public void setPatternFromString(String patternString) { String[] split = patternString.split(","); Log.d(TAG, patternString); mPattern = new long[split.length]; for (int i = 0; i < split.length; i++) { mPattern[i] = Long.parseLong(split[i]); } } public void play() { if (mVibrator != null) { mVibrator.vibrate(mPattern, -1); } } public void stop() { if (mVibrator != null) { mVibrator.cancel(); } } public static String getPhoneVibration(Context context) { ContentResolver cr = context.getContentResolver(); String defVibration = Settings.System.getString(cr, Settings.System.PHONE_VIBRATION); if (defVibration == null) { // first time setup Settings.System.putString(cr, Settings.System.PHONE_VIBRATION, Settings.System.DEFAULT_VIBRATION_URI.toString()); return Settings.System.DEFAULT_VIBRATION_URI.toString(); } return defVibration; } // If something goes wrong with the provider. // This is used only by the Phone app's Ringer.java, if the loaded pattern // is corrupt. public static VibrationPattern getFallbackVibration(Context context) { return new VibrationPattern(FALLBACK_NAME, FALLBACK_PATTERN, context); } }