package io.evercam.androidapp.sync; import android.accounts.Account; import android.content.AbstractThreadedSyncAdapter; import android.content.ContentProviderClient; import android.content.Context; import android.content.SyncResult; import android.os.Bundle; import android.util.Log; import java.util.ArrayList; import io.evercam.API; import io.evercam.Camera; import io.evercam.androidapp.authentication.EvercamAccount; import io.evercam.androidapp.dal.DbCamera; import io.evercam.androidapp.dto.AppUser; import io.evercam.androidapp.dto.EvercamCamera; public class CameraListSyncAdapter extends AbstractThreadedSyncAdapter { private static final String TAG = "CameraListSyncAdapter"; private Context mContext; public CameraListSyncAdapter (Context context, boolean autoInitialize) { super(context, autoInitialize); mContext = context; } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { Log.d(TAG, "onPerformSync: " + account.name); boolean updateDB = false; String originalApiKey = API.getUserKeyPair()[0]; String originalApiId = API.getUserKeyPair()[1]; // Get the user details for the current account AppUser appUser = new EvercamAccount(mContext).retrieveUserDetailFromAccount(account); String apiKey = appUser.getApiKey(); String apiId = appUser.getApiId(); String username = appUser.getUsername(); boolean isDefault = appUser.getIsDefault(); if(isDefault) { //Only sync the default user for now because multiple users are causing problems try { API.setUserKeyPair(apiKey, apiId); ArrayList<EvercamCamera> databaseCameralist = new DbCamera(mContext).getCamerasByOwner(username, 500); Log.d(TAG, "Total cameras for user - " + username + " from DB: " + databaseCameralist.size()); ArrayList<Camera> cameras = Camera.getAll(username, true, false); //Reset API key pair for default user because here it could be syncing other // users' cameras API.setUserKeyPair(originalApiKey, originalApiId); ArrayList<EvercamCamera> evercamCameras = new ArrayList<>(); for(io.evercam.Camera camera : cameras) { EvercamCamera evercamCamera = new EvercamCamera().convertFromEvercam(camera); evercamCameras.add(evercamCamera); } if(databaseCameralist.size() != cameras.size()) { updateDB = true; } for(EvercamCamera camera : evercamCameras) { if(!databaseCameralist.contains(camera)) { Log.d(TAG, "new camera detected: " + camera.getCameraId()); updateDB = true; break; } } // Step 3: Check if any local camera no longer exists in Evercam if(!updateDB) { for(EvercamCamera camera : databaseCameralist) { if(!evercamCameras.contains(camera)) { Log.d(TAG, "camera deleted"); updateDB = true; break; } } } // Step 4: If any different camera, replace all local camera data. if(updateDB) { Log.d(TAG, "Updating DB in sync!!!!!"); DbCamera dbCamera = new DbCamera(mContext); dbCamera.deleteCameraByOwner(username); for(EvercamCamera camera : evercamCameras) { dbCamera.addCamera(camera); } } } catch(Exception e) { e.printStackTrace(); } } } }