package com.buzzbuddy.android;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.buzzbuddy.android.R;
import com.buzzbuddy.android.CountdownTimer.CountdownCallback;
public class VibrationPatternDialog extends Dialog implements OnClickListener, CountdownCallback {
private static final String O_SECONDS_TEXT = "0:00";
private static final int THIRTY_SECONDS = 30;
private static final String TAG = VibrationPatternDialog.class.getSimpleName();
private ImageButton record;
private final Resources res;
private static final long[] PATTERN = { 0, 5 };
private final Vibrator vibrator;
private boolean isRecording = false;
private TextView instructions;
private final String generalInstructions;
private final String recordingText;
private VibrationPattern vibrationPattern;
private ImageButton accept;
private final CountdownTimer timer;
private TextView timerText;
private TextView titleText;
private ImageView titleIcon;
private ResolveInfo currentApp;
private final PackageManager packageManager;
private final DrawableManager drawableManager;
public VibrationPatternDialog(final Context context, final int theme) {
super(context, theme);
if (BuildConfig.DEBUG) {
Log.d(TAG, "constructor");
}
drawableManager = ((BuzzBuddyApp) context.getApplicationContext()).getDrawableManager();
res = context.getResources();
packageManager = context.getPackageManager();
generalInstructions = res.getString(R.string.vibration_pattern_explanation);
recordingText = res.getString(R.string.vibration_pattern_tapping);
vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
timer = new CountdownTimer(THIRTY_SECONDS);
timer.setCountdownCallback(this);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (BuildConfig.DEBUG) {
Log.d(TAG, "onCreate");
}
setContentView(R.layout.vibration_pattern);
final ImageButton cancel = (ImageButton) findViewById(R.id.cancel);
accept = (ImageButton) findViewById(R.id.accept);
record = (ImageButton) findViewById(R.id.record);
cancel.setOnClickListener(this);
accept.setOnClickListener(this);
record.setOnClickListener(this);
instructions = (TextView) findViewById(R.id.vibration_instructions);
timerText = (TextView) findViewById(R.id.timer);
final LinearLayout dialogTitle = (LinearLayout) findViewById(R.id.dialog_title);
titleText = (TextView) dialogTitle.findViewById(R.id.app_name);
titleIcon = (ImageView) dialogTitle.findViewById(R.id.app_icon);
}
@Override
protected void onStart() {
super.onStart();
if (BuildConfig.DEBUG) {
Log.d(TAG, "onStart");
}
final ApplicationInfo applicationInfo = currentApp.activityInfo.applicationInfo;
titleText.setText(applicationInfo.loadLabel(packageManager));
titleIcon.setImageDrawable(drawableManager.fetchDrawable(applicationInfo.packageName, currentApp));
setInitialMode();
}
private void setInitialMode() {
instructions.setText(generalInstructions);
isRecording = false;
setAcceptButtonEnabled(vibrationPattern.isPatternPresent());
record.setSelected(true);
timerText.setSelected(true);
timerText.setText(O_SECONDS_TEXT);
timer.stop();
timer.reset();
}
@Override
protected void onStop() {
super.onStop();
isRecording = false;
timer.stop();
if (BuildConfig.DEBUG) {
Log.d(TAG, "onStop");
}
}
private void setAcceptButtonEnabled(final boolean isEnabled) {
accept.setEnabled(isEnabled);
accept.setClickable(isEnabled);
}
public void setVibrationPattern(final VibrationPattern vibPattern) {
vibrationPattern = vibPattern;
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.cancel:
Log.i(TAG, "cancel clicked");
cancel();
break;
case R.id.accept:
Log.i(TAG, "accept clicked");
dismiss();
break;
case R.id.record:
if (v.isSelected()) {
Log.i(TAG, "recording");
setRecordingMode();
record.setSelected(false);
timerText.setSelected(false);
vibrationPattern.initializePattern();
break;
}
Log.w(TAG, "stopping");
setInitialMode();
break;
}
}
private void setRecordingMode() {
instructions.setText(recordingText);
setAcceptButtonEnabled(false);
isRecording = true;
}
@Override
public boolean onTouchEvent(final MotionEvent e) {
if (isRecording) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "Action down");
if (!timer.isRunning()) {
timer.start();
}
vibrator.vibrate(PATTERN, 0);
vibrationPattern.updateLastTouched();
return true;
case MotionEvent.ACTION_UP:
Log.i(TAG, "Action up");
vibrator.cancel();
vibrationPattern.updateLastTouched();
return true;
}
}
return false;
}
@Override
public void onTimerStop() {
if (isRecording) {
record.performClick();
Toast.makeText(getContext(), res.getString(R.string.pattern_limit_length), Toast.LENGTH_LONG).show();
}
}
@Override
public void onDecrement(final int time) {
final int displayTime = THIRTY_SECONDS - time;
if (displayTime < 10) {
timerText.setText("0:0" + displayTime);
return;
}
timerText.setText("0:" + displayTime);
}
@Override
public void onTimerStart() {
// do nothing
}
public void setCurrentApp(final ResolveInfo currentItem) {
currentApp = currentItem;
}
}