package com.betomaluje.android.miband.example.activities;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.betomaluje.android.miband.example.R;
import com.betomaluje.android.miband.example.WaterReceiver;
import com.betomaluje.android.miband.example.WaterScheduler;
import com.betomaluje.android.miband.example.services.MiBandService;
import com.betomaluje.miband.MiBand;
import com.betomaluje.miband.bluetooth.MiBandWrapper;
import com.betomaluje.miband.bluetooth.NotificationConstants;
import com.betomaluje.miband.colorpicker.ColorPickerDialog;
import com.betomaluje.miband.model.BatteryInfo;
import java.util.HashMap;
public class MainServiceActivity extends BaseActivity {
private final String TAG = getClass().getSimpleName();
private int BT_REQUEST_CODE = 1001;
private Button btn_connect, btn_lights, btn_lights_2, btn_notification, btn_vibrate, btn_battery, btn_water, btn_water_cancel, btn_apps, btn_sync, btn_chart, btn_chart_2;
private TextView textView_status;
private boolean isConnected = false;
private PendingIntent pendingIntent;
private AlarmManager alarmManager;
private BroadcastReceiver bluetoothStatusReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = intent.getExtras();
String action = b.getString("type");
if (action.equals(NotificationConstants.MI_BAND_CONNECT)) {
isConnected = true;
btn_connect.setEnabled(true);
startMiBand();
} else if (action.equals(NotificationConstants.MI_BAND_DISCONNECT)) {
isConnected = false;
int errorCode = b.getInt("errorCode");
if (errorCode == NotificationConstants.BLUETOOTH_OFF) {
//turn on bluetooth
Log.d(TAG, "turn on Bluetooth");
startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), BT_REQUEST_CODE, null);
} else {
Log.d(TAG, "not found");
stopMiBand();
}
} else if (action.equals(NotificationConstants.MI_BAND_BATTERY)) {
BatteryInfo batteryInfo = b.getParcelable("battery");
textView_status.setText(batteryInfo.toString());
} else if (action.equals(NotificationConstants.MI_BAND_REQUEST_CONNECTION) && b.containsKey("isConnected")) {
isConnected = b.getBoolean("isConnected", false);
Log.d(TAG, "requested connection: " + isConnected);
if (isConnected) {
startMiBand();
} else {
stopMiBand();
}
} else if (action.equals("CANCEL_WATER")) {
if (alarmManager != null)
alarmManager.cancel(pendingIntent);
} else if (action.equals(NotificationConstants.MI_BAND_SYNC_SUCCESS)) {
textView_status.setText("Sync completed");
}else if (action.equals(NotificationConstants.MI_BAND_SYNC_FAIL)) {
textView_status.setText("Sync error: " + b.getString("errorCode", "default"));
}
}
};
@Override
protected int getLayoutResource() {
return R.layout.activity_main_band;
}
@Override
protected boolean getDisplayHomeAsUpEnabled() {
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent alarmIntent = new Intent(this, WaterReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
btn_connect = (Button) findViewById(R.id.btn_connect);
btn_lights = (Button) findViewById(R.id.btn_lights);
btn_lights_2 = (Button) findViewById(R.id.btn_lights_2);
btn_notification = (Button) findViewById(R.id.btn_notification);
btn_vibrate = (Button) findViewById(R.id.btn_vibrate);
btn_battery = (Button) findViewById(R.id.btn_battery);
btn_water = (Button) findViewById(R.id.btn_water);
btn_water_cancel = (Button) findViewById(R.id.btn_water_cancel);
btn_apps = (Button) findViewById(R.id.btn_apps);
btn_sync = (Button) findViewById(R.id.btn_sync);
btn_chart = (Button) findViewById(R.id.btn_chart);
btn_chart_2 = (Button) findViewById(R.id.btn_chart_2);
textView_status = (TextView) findViewById(R.id.textView_status);
btn_connect.setOnClickListener(btnListener);
btn_lights.setOnClickListener(btnListener);
btn_lights_2.setOnClickListener(btnListener);
btn_notification.setOnClickListener(btnListener);
btn_vibrate.setOnClickListener(btnListener);
btn_battery.setOnClickListener(btnListener);
btn_water.setOnClickListener(btnListener);
btn_water_cancel.setOnClickListener(btnListener);
btn_apps.setOnClickListener(btnListener);
btn_sync.setOnClickListener(btnListener);
btn_chart.setOnClickListener(btnListener);
btn_chart_2.setOnClickListener(btnListener);
Bundle b = getIntent().getExtras();
if (b != null) {
if (b.getBoolean("service", false)) {
stopService(new Intent(MainServiceActivity.this, MiBandService.class));
} else {
connectToMiBand();
}
} else {
connectToMiBand();
}
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(MainServiceActivity.this).unregisterReceiver(bluetoothStatusReceiver);
}
@Override
protected void onResume() {
super.onResume();
//resetToolbar();
//we are listening from the mi band service
LocalBroadcastManager.getInstance(MainServiceActivity.this).registerReceiver(bluetoothStatusReceiver, new IntentFilter(NotificationConstants.ACTION_MIBAND_SERVICE));
isConnected = false;
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (MiBandService.class.getName().equals(service.service.getClassName())) {
MiBandWrapper.getInstance(MainServiceActivity.this).sendAction(MiBandWrapper.ACTION_REQUEST_CONNECTION);
break;
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
MiBandWrapper.getInstance(MainServiceActivity.this).sendAction(MiBandWrapper.ACTION_STOP_SYNC);
}
private View.OnClickListener btnListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_connect:
if (!isConnected)
connectToMiBand();
else
disconnectMiBand();
break;
case R.id.btn_lights:
new ColorPickerDialog(MainServiceActivity.this, 255, new ColorPickerDialog.OnColorSelectedListener() {
@Override
public void onColorSelected(int rgb) {
Log.i(TAG, "selected color: " + rgb);
textView_status.setText("Playing with lights! Color: " + rgb);
HashMap<String, Integer> params = new HashMap<String, Integer>();
params.put(NotificationConstants.KEY_COLOR, rgb);
MiBand.sendAction(MiBandWrapper.ACTION_LIGHTS, params);
}
}).show();
break;
case R.id.btn_lights_2:
new ColorPickerDialog(MainServiceActivity.this, 255, new ColorPickerDialog.OnColorSelectedListener() {
@Override
public void onColorSelected(int rgb) {
Log.i(TAG, "cool selected color: " + rgb);
textView_status.setText("Playing with cool lights! Color: " + rgb);
HashMap<String, Integer> params = new HashMap<String, Integer>();
params.put(NotificationConstants.KEY_COLOR, rgb);
params.put(NotificationConstants.KEY_PAUSE_TIME, 500);
MiBand.sendAction(MiBandWrapper.ACTION_NOTIFY, params);
}
}).show();
break;
case R.id.btn_notification:
createNotification("Test", MainServiceActivity.this);
break;
case R.id.btn_vibrate:
textView_status.setText("Vibrating");
HashMap<String, Integer> params = new HashMap<String, Integer>();
params.put(NotificationConstants.KEY_TIMES, 3);
params.put(NotificationConstants.KEY_ON_TIME, 250);
params.put(NotificationConstants.KEY_PAUSE_TIME, 250);
MiBand.sendAction(MiBandWrapper.ACTION_VIBRATE_CUSTOM, params);
break;
case R.id.btn_battery:
MiBand.sendAction(MiBandWrapper.ACTION_BATTERY);
break;
case R.id.btn_water:
scheduleWater();
break;
case R.id.btn_water_cancel:
if (alarmManager != null) {
alarmManager.cancel(pendingIntent);
Toast.makeText(MainServiceActivity.this, "Water alarm deactivated", Toast.LENGTH_LONG).show();
}
break;
case R.id.btn_apps:
thumbNailScaleAnimation(v);
break;
case R.id.btn_sync:
MiBand.sendAction(MiBandWrapper.ACTION_START_SYNC);
break;
case R.id.btn_chart:
startActivity(new Intent(MainServiceActivity.this, SleepChartActivity.class));
break;
case R.id.btn_chart_2:
startActivity(new Intent(MainServiceActivity.this, ActivitiesChartActivity.class));
break;
}
}
};
public void createNotification(String text, Context context) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Test notification")
.setContentText(text);
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(context, MainServiceActivity.class);
// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(MainServiceActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(676, mBuilder.build());
}
private void connectToMiBand() {
//MiBand.initService(MainServiceActivity.this);
Intent miBandService = new Intent(MainServiceActivity.this, MiBandService.class);
miBandService.setAction(NotificationConstants.MI_BAND_CONNECT);
startService(miBandService);
btn_connect.setEnabled(false);
textView_status.setText("Connecting...");
}
private void disconnectMiBand() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
MainServiceActivity.this);
// set title
alertDialogBuilder.setTitle("Disconnect to Mi Band");
// set dialog message
alertDialogBuilder
.setMessage("Are you sure you want to Disconnect to your Mi Band?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MiBand.disconnect();
stopMiBand();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// if this button is clicked, just close
// the dialog box and do nothing
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
private void startMiBand() {
btn_connect.setText("Disconnect");
textView_status.setText("Connected");
btn_lights.setEnabled(true);
btn_lights_2.setEnabled(true);
//btn_notification.setEnabled(true);
btn_vibrate.setEnabled(true);
btn_battery.setEnabled(true);
btn_sync.setEnabled(true);
btn_chart.setEnabled(true);
btn_chart_2.setEnabled(true);
}
private void stopMiBand() {
btn_connect.setText("Connect");
textView_status.setText("Disconnected");
btn_connect.setEnabled(true);
btn_lights.setEnabled(false);
btn_lights_2.setEnabled(false);
//btn_notification.setEnabled(false);
btn_vibrate.setEnabled(false);
btn_battery.setEnabled(false);
btn_sync.setEnabled(false);
btn_chart.setEnabled(false);
btn_chart_2.setEnabled(false);
isConnected = false;
}
private void scheduleWater() {
WaterScheduler.getInstance(MainServiceActivity.this).schedule(new WaterScheduler.ScheduleCallback() {
@Override
public void OnScheduleNext() {
Toast.makeText(MainServiceActivity.this, "Water alarm activated every 45 minutes", Toast.LENGTH_LONG).show();
}
@Override
public void OnScheduleTomorrow() {
Toast.makeText(MainServiceActivity.this, "Next Water alarm set for tomorrow at 8 am", Toast.LENGTH_LONG).show();
}
});
}
private void thumbNailScaleAnimation(View view) {
view.setDrawingCacheEnabled(true);
view.setPressed(false);
view.refreshDrawableState();
Bitmap bitmap = view.getDrawingCache();
ActivityOptionsCompat opts = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(
view, bitmap, 0, 0);
// Request the activity be started, using the custom animation options.
startActivity(new Intent(MainServiceActivity.this, AppsPreferencesActivity.class),
opts.toBundle());
view.setDrawingCacheEnabled(false);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == BT_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
//connectToMiBand();
btn_connect.setEnabled(false);
textView_status.setText("Connecting...");
} else {
stopMiBand();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}