package org.gdg.frisbee.android;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.wearable.view.CircledImageView;
import android.support.wearable.view.WearableListView;
import android.widget.TextView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataEvent;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataItem;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.DataMapItem;
import com.google.android.gms.wearable.Wearable;
import java.util.ArrayList;
import java.util.List;
import timber.log.Timber;
public class WearableConfigurationActivity extends Activity implements DataApi.DataListener {
private static final String TAG = "WearableConfigActivity";
private static final int REQUEST_COLOR = 0;
private static final int REQUEST_TIME = 1;
private WearableListView mListView;
private WearableConfigAdapter mAdapter;
private GoogleApiClient mGoogleApiClient;
private boolean mDisplayDate = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wearable_configuration);
final TextView headerText = (TextView) findViewById(R.id.settings_header);
mListView = (WearableListView) findViewById(R.id.settings_list);
mAdapter = new WearableConfigAdapter(this, getConfigurations());
mListView.setAdapter(mAdapter);
mListView.addOnScrollListener(new WearableListView.OnScrollListener() {
@Override
public void onScroll(int i) {
}
@Override
public void onAbsoluteScrollChange(int scroll) {
float translation = Math.min(-scroll, 0);
headerText.setTranslationY(translation);
}
@Override
public void onScrollStateChanged(int i) {
}
@Override
public void onCentralPositionChanged(int i) {
}
});
mListView.setClickListener(new WearableListView.ClickListener() {
@Override
public void onClick(WearableListView.ViewHolder viewHolder) {
WearableListItemLayout layout = (WearableListItemLayout) viewHolder.itemView;
TextView nameTextView = (TextView) layout.findViewById(R.id.setting_text_view);
String action = nameTextView.getText().toString();
switch (action) {
case WearableConfigurationUtil.CONFIG_BACKGROUND:
case WearableConfigurationUtil.CONFIG_DATE_TIME:
case WearableConfigurationUtil.CONFIG_HAND_HOUR:
case WearableConfigurationUtil.CONFIG_HAND_MINUTE:
case WearableConfigurationUtil.CONFIG_HAND_SECOND:
case WearableConfigurationUtil.CONFIG_HOUR_MARKER:
Intent intent = new Intent(WearableConfigurationActivity.this, ColorConfigActivity.class);
intent.putExtra(ColorConfigActivity.CONFIG_HEADER, action);
startActivityForResult(intent, REQUEST_COLOR);
break;
case WearableConfigurationUtil.CONFIG_DIGITAL_TIME:
intent = new Intent(WearableConfigurationActivity.this, TimeConfigActivity.class);
intent.putExtra(TimeConfigActivity.CONFIG_HEADER, action);
startActivityForResult(intent, REQUEST_TIME);
break;
case WearableConfigurationUtil.CONFIG_DATE:
TextView settingTextView = (TextView) layout.findViewById(R.id.subsetting_text_view);
CircledImageView circleImage = (CircledImageView) layout.findViewById(R.id.setting_circle);
if (getString(R.string.label_setting_on).equals(settingTextView.getText().toString())) {
settingTextView.setText(getString(R.string.label_setting_off));
circleImage.setImageResource(R.drawable.ic_date_off);
saveBooleanConfig(action, false);
mDisplayDate = false;
updateConfigurations();
} else {
settingTextView.setText(getString(R.string.label_setting_on));
circleImage.setImageResource(R.drawable.ic_date_on);
saveBooleanConfig(action, true);
mDisplayDate = true;
updateConfigurations();
}
break;
}
}
@Override
public void onTopEmptyRegionClick() {
}
});
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Timber.d("onConnected:" + bundle);
Wearable.DataApi.addListener(mGoogleApiClient, WearableConfigurationActivity.this);
updateConfigDataItemAndUi();
}
@Override
public void onConnectionSuspended(int i) {
Timber.d("onConnectionSuspended:" + i);
}
})
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Timber.d("onConnectionFailed:");
}
})
.build();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
private void updateConfigDataItemAndUi() {
WearableConfigurationUtil.fetchConfigDataMap(mGoogleApiClient,
WearableConfigurationUtil.PATH_ANALOG,
new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
if (dataItemResult.getStatus().isSuccess()) {
if (dataItemResult.getDataItem() != null) {
DataItem configDataItem = dataItemResult.getDataItem();
DataMapItem dataMapItem = DataMapItem.fromDataItem(configDataItem);
DataMap dataMap = dataMapItem.getDataMap();
if (dataMap.containsKey(WearableConfigurationUtil.CONFIG_DATE)) {
mDisplayDate = dataMap.getInt(WearableConfigurationUtil.CONFIG_DATE) == 1;
}
updateConfigurations();
}
}
}
});
}
@Override
protected void onStop() {
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
Wearable.DataApi.removeListener(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
super.onStop();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_COLOR && resultCode == RESULT_OK) {
int color = data.getIntExtra(ColorConfigActivity.CONFIG_COLOR, 0);
String action = data.getStringExtra(ColorConfigActivity.CONFIG_HEADER);
saveIntConfig(action, color);
} else if(requestCode == REQUEST_TIME && resultCode == RESULT_OK) {
int timeSetting = data.getIntExtra(TimeConfigActivity.CONFIG_VALUE, 0);
String action = data.getStringExtra(TimeConfigActivity.CONFIG_HEADER);
saveIntConfig(action, timeSetting);
}
}
private void updateConfigurations() {
mAdapter.setConfigurations(getConfigurations());
}
private List<WearableConfiguration> getConfigurations() {
List<WearableConfiguration> configurationList = new ArrayList<>();
configurationList.add(new WearableConfiguration(R.drawable.ic_palette, WearableConfigurationUtil.CONFIG_BACKGROUND));
configurationList.add(new WearableConfiguration(R.drawable.ic_date_on, WearableConfigurationUtil.CONFIG_DATE, mDisplayDate));
configurationList.add(new WearableConfiguration(R.drawable.ic_time, WearableConfigurationUtil.CONFIG_DIGITAL_TIME));
configurationList.add(new WearableConfiguration(R.drawable.ic_palette, WearableConfigurationUtil.CONFIG_DATE_TIME));
configurationList.add(new WearableConfiguration(R.drawable.ic_palette, WearableConfigurationUtil.CONFIG_HAND_HOUR));
configurationList.add(new WearableConfiguration(R.drawable.ic_palette, WearableConfigurationUtil.CONFIG_HAND_MINUTE));
configurationList.add(new WearableConfiguration(R.drawable.ic_palette, WearableConfigurationUtil.CONFIG_HAND_SECOND));
configurationList.add(new WearableConfiguration(R.drawable.ic_palette, WearableConfigurationUtil.CONFIG_HOUR_MARKER));
return configurationList;
}
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
for (DataEvent dataEvent : dataEventBuffer) {
if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
DataItem item = dataEvent.getDataItem();
DataMapItem dataMapItem = DataMapItem.fromDataItem(item);
DataMap dataMap = dataMapItem.getDataMap();
if (dataMap.containsKey(WearableConfigurationUtil.CONFIG_DATE)) {
mDisplayDate = dataMap.getInt(WearableConfigurationUtil.CONFIG_DATE) == 1;
}
updateConfigurations();
}
}
dataEventBuffer.release();
}
private void saveIntConfig(String key, int value) {
DataMap configKeysToOverwrite = new DataMap();
configKeysToOverwrite.putInt(key, value);
WearableConfigurationUtil.updateKeysInConfigDataMap(mGoogleApiClient, WearableConfigurationUtil.PATH_ANALOG, configKeysToOverwrite);
}
private void saveBooleanConfig(String key, boolean value) {
saveIntConfig(key, value ? 1 : 0);
}
}