package com.yassirh.digitalocean.service; import android.content.Context; import android.content.SharedPreferences; import android.util.Log; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.SyncHttpClient; import com.yassirh.digitalocean.data.DatabaseHelper; import com.yassirh.digitalocean.data.FloatingIPDao; import com.yassirh.digitalocean.data.ImageDao; import com.yassirh.digitalocean.model.Account; import com.yassirh.digitalocean.model.Droplet; import com.yassirh.digitalocean.model.FloatingIP; import com.yassirh.digitalocean.model.Image; import com.yassirh.digitalocean.model.Region; import com.yassirh.digitalocean.model.Size; import com.yassirh.digitalocean.utils.ApiHelper; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import java.util.Locale; import cz.msebera.android.httpclient.Header; public class FloatingIPService { private Context context; private boolean isRefreshing; private boolean refreshing; public FloatingIPService(Context context) { this.context = context; } public FloatingIP findById(long id) { FloatingIPDao floatingIPDao = new FloatingIPDao(DatabaseHelper.getInstance(context)); return floatingIPDao.findById(id); } public void getAllFromAPI(boolean showProgress) { Account currentAccount = ApiHelper.getCurrentAccount(context); if(currentAccount == null){ return; } isRefreshing = true; String url = String.format("%s/floating_ips/", ApiHelper.API_URL); AsyncHttpClient client = new AsyncHttpClient(); client.addHeader("Authorization", String.format("Bearer %s", currentAccount.getToken())); client.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { try { JSONObject jsonObject = new JSONObject(new String(responseBody)); List<FloatingIP> floatingIPs = new ArrayList<>(); JSONArray ipsJSONArray = jsonObject.getJSONArray("floating_ips"); for (int i = 0; i < ipsJSONArray.length(); i++) { JSONObject ipJSONObject = ipsJSONArray.getJSONObject(i); FloatingIP ip = jsonObjectToFloatingIP(ipJSONObject); floatingIPs.add(ip); } FloatingIPService.this.deleteAll(); FloatingIPService.this.saveAll(floatingIPs); FloatingIPService.this.setRequiresRefresh(true); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { if(statusCode == 401){ ApiHelper.showAccessDenied(); } } }); } private void saveAll(List<FloatingIP> floatingIPs) { FloatingIPDao floatingIPDao = new FloatingIPDao(DatabaseHelper.getInstance(context)); for (FloatingIP floatingIP : floatingIPs) { floatingIPDao.create(floatingIP); } } public void deleteAll() { FloatingIPDao floatingIPDao = new FloatingIPDao(DatabaseHelper.getInstance(context)); floatingIPDao.deleteAll(); } private static FloatingIP jsonObjectToFloatingIP(JSONObject ipJSONObject) throws JSONException { FloatingIP floatingIP = new FloatingIP(); floatingIP.setIp(ipJSONObject.getString("ip")); Region region = RegionService.jsonObjectToRegion(ipJSONObject.getJSONObject("region")); floatingIP.setRegion(region); if(!ipJSONObject.isNull("droplet")) { Droplet droplet = DropletService.jsonObjectToDroplet(ipJSONObject.getJSONObject("droplet")); floatingIP.setDroplet(droplet); } return floatingIP; } private void setRequiresRefresh(boolean requireRefresh) { SharedPreferences settings = context.getSharedPreferences("prefrences", 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("floatingip_require_refresh", requireRefresh); editor.commit(); } public Boolean requiresRefresh(){ SharedPreferences settings = context.getSharedPreferences("prefrences", 0); return settings.getBoolean("floatingip_require_refresh", true); } public List<FloatingIP> getAll() { FloatingIPDao floatingIPDao = new FloatingIPDao(DatabaseHelper.getInstance(context)); return floatingIPDao.getAll(null); } public void delete(String ip) { Account currentAccount = ApiHelper.getCurrentAccount(context); if(currentAccount == null){ return; } String url = String.format(Locale.US,"%s/floating_ips/%s", ApiHelper.API_URL, ip); AsyncHttpClient client = new AsyncHttpClient(); client.addHeader("Authorization", String.format("Bearer %s", currentAccount.getToken())); client.delete(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) { requiresRefresh(); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) { if(statusCode == 401){ ApiHelper.showAccessDenied(); } } }); } public boolean isRefreshing() { return refreshing; } }