Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.psksoft.watchphone.viewmodels;
- import android.os.Bundle;
- import android.util.Log;
- import com.google.android.gms.common.ConnectionResult;
- import com.google.android.gms.common.api.GoogleApiClient;
- import com.google.android.gms.common.api.PendingResult;
- import com.google.android.gms.common.api.ResultCallback;
- import com.google.android.gms.wearable.Asset;
- 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.DataItemBuffer;
- import com.google.android.gms.wearable.DataMap;
- import com.google.android.gms.wearable.DataMapItem;
- import com.google.android.gms.wearable.Wearable;
- import com.psksoft.commonlib.activities.IActivityViewModel;
- import com.psksoft.commonlib.models.MessageNames;
- import com.psksoft.commonlib.services.ActivityServices;
- import com.psksoft.commonlib.services.WearableCommunicationService;
- import com.psksoft.watchphone.models.Contact;
- import com.psksoft.watchphone.services.WearMessageListenerService;
- import org.json.JSONArray;
- import org.json.JSONObject;
- import org.robobinding.annotation.ItemPresentationModel;
- import org.robobinding.presentationmodel.HasPresentationModelChangeSupport;
- import org.robobinding.presentationmodel.PresentationModelChangeSupport;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.TimeUnit;
- @org.robobinding.annotation.PresentationModel
- public class ContactsActivityViewModel implements IActivityViewModel,
- HasPresentationModelChangeSupport,
- DataApi.DataListener,
- GoogleApiClient.ConnectionCallbacks,
- GoogleApiClient.OnConnectionFailedListener {
- ActivityServices _ActivityServices;
- PresentationModelChangeSupport _ChangeNotify;
- WearableCommunicationService _WearableCommunicationService;
- WearMessageListenerService _WearMessageListenerService;
- List<Contact> _Contacts;
- private GoogleApiClient mGoogleApiClient;
- public ContactsActivityViewModel(ActivityServices activityServices, WearableCommunicationService wearableCommunicationService, WearMessageListenerService wearMessageListenerService) {
- _ActivityServices = activityServices;
- _ChangeNotify = new PresentationModelChangeSupport(this);
- _WearableCommunicationService = wearableCommunicationService;
- _Contacts = new ArrayList<Contact>();
- _WearMessageListenerService = wearMessageListenerService;
- }
- @ItemPresentationModel(ContactItemViewModel.class)
- public List<Contact> getContacts() {
- return _Contacts;
- }
- public void setContacts(List<Contact> value) {
- _Contacts = value;
- }
- public void clickContact() {
- }
- @Override
- public PresentationModelChangeSupport getPresentationModelChangeSupport() {
- return _ChangeNotify;
- }
- @Override
- public void onConnected(Bundle bundle) {
- _WearableCommunicationService.sendMessage(MessageNames.RequestContacts, "");
- PendingResult<DataItemBuffer> results = Wearable.DataApi.getDataItems(mGoogleApiClient);
- results.setResultCallback(new ResultCallback<DataItemBuffer>() {
- @Override
- public void onResult(DataItemBuffer dataItems) {
- if (dataItems.getCount() != 0) {
- DataItem dataItem = dataItems.get(0);
- readContactsFromDataItem(dataItem);
- }
- dataItems.release();
- }
- });
- }
- @Override
- public void onConnectionSuspended(int i) {
- }
- private void readContactsFromDataItem(DataItem dataItem) {
- if (dataItem.getUri().getPath().equals("/wear_phone/contacts")) {
- DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
- Asset asset = dataMap.getAsset("contacts");
- if (!mGoogleApiClient.isConnected()) {
- ConnectionResult result = mGoogleApiClient.blockingConnect(10000, TimeUnit.MILLISECONDS);
- if (!result.isSuccess()) {
- Log.w("watch phone", "Can not connect to Google Api");
- return;
- }
- }
- PendingResult<DataApi.GetFdForAssetResult> pendingResult = Wearable.DataApi.getFdForAsset(mGoogleApiClient, asset);
- pendingResult.setResultCallback(new ResultCallback<DataApi.GetFdForAssetResult>() {
- @Override
- public void onResult(DataApi.GetFdForAssetResult result) {
- String json = "";
- InputStream assetInputStream = result.getInputStream();
- byte[] buffer = new byte[1024];
- try {
- ByteArrayOutputStream mem = new ByteArrayOutputStream();
- int cnt = assetInputStream.read(buffer, 0, buffer.length);
- if (cnt > 0) {
- mem.write(buffer, 0, cnt);
- while (cnt == buffer.length) {
- try {
- cnt = assetInputStream.read(buffer, 0, buffer.length);
- mem.write(buffer, 0, cnt);
- } catch (Exception ex) {
- Log.e("watch phone", ex.getMessage());
- }
- }
- }
- json = new String(mem.toByteArray(), "UTF-8");
- } catch (Exception ex) {
- Log.e("watch phone", ex.getMessage());
- }
- _Contacts = new ArrayList<Contact>();
- try {
- JSONArray jContacts = new JSONArray(json);
- for (int i = 0; i < jContacts.length(); i++) {
- JSONObject jContact = jContacts.getJSONObject(i);
- Contact contact = new Contact();
- contact.setDisplayName(jContact.getString("name"));
- _Contacts.add(contact);
- }
- } catch (Exception ex) {
- Log.e("watch phone - deserializing json contacts", ex.getMessage());
- }
- try {
- _ChangeNotify.firePropertyChange("Contacts");
- }catch(Exception ex){
- Log.e("watch phone", ex.getMessage());
- }
- }
- });
- }
- }
- @Override
- public void onDataChanged(DataEventBuffer dataEvents) {
- for (DataEvent event : dataEvents) {
- if (event.getType() == DataEvent.TYPE_CHANGED) {
- DataItem dataItem = event.getDataItem();
- readContactsFromDataItem(dataItem);
- } else if (event.getType() == DataEvent.TYPE_DELETED) {
- }
- }
- }
- @Override
- public void onConnectionFailed(ConnectionResult connectionResult) {
- }
- @Override
- public void onStart() {
- }
- @Override
- public void onRestart() {
- }
- @Override
- public void onResume() {
- Wearable.DataApi.addListener(mGoogleApiClient, this);
- mGoogleApiClient.connect();
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- mGoogleApiClient = new GoogleApiClient.Builder(_ActivityServices.getAppication())
- .addApi(Wearable.API)
- .addConnectionCallbacks(this)
- .addOnConnectionFailedListener(this)
- .build();
- }
- @Override
- public void onPause() {
- Wearable.DataApi.removeListener(mGoogleApiClient, this);
- mGoogleApiClient.disconnect();
- }
- @Override
- public void onStop() {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement