Android Open Source - sigimera-android-app Persistance Controller






From Project

Back to project page sigimera-android-app.

License

The source code is released under:

GNU General Public License

If you think the Android project sigimera-android-app listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.sigimera.app.android.controller;
/**/*www .jav  a 2 s  . co m*/
 * Sigimera Crises Information Platform Android Client
 * Copyright (C) 2013 by Sigimera
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
import java.util.ArrayList;
import java.util.Date;
import java.util.Observable;
import java.util.concurrent.ExecutionException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.sigimera.app.android.backend.PersistentStorage;
import org.sigimera.app.android.backend.network.CrisesHttpHelper;
import org.sigimera.app.android.backend.network.NearCrisesHttpHelper;
import org.sigimera.app.android.backend.network.SingleCrisisHttpHelper;
import org.sigimera.app.android.backend.network.StatisticCrisesHttpHelper;
import org.sigimera.app.android.backend.network.StatisticUsersHttpHelper;
import org.sigimera.app.android.model.CrisesStats;
import org.sigimera.app.android.model.Crisis;
import org.sigimera.app.android.model.UsersStats;
import org.sigimera.app.android.util.Common;

import android.location.Location;
import android.os.AsyncTask;
import android.util.Log;

/**
 * This class is responsible for saving and retrieving the concepts persistent.
 * 
 * @author Corneliu-Valentin Stanciu
 * @email corneliu.stanciu@sigimera.org
 */
public class PersistanceController extends Observable {

  private static PersistanceController instance = null;
  private PersistentStorage pershandler;

  private PersistanceController() {
    this.pershandler = ApplicationController.getInstance()
        .getPersistentStorageHandler();
  }

  public static PersistanceController getInstance() {
    if (null == instance)
      instance = new PersistanceController();
    return instance;
  }
  
  private void storeLatestCrises(String _auth_token, int _page) {
    AsyncTask<String, Void, JSONArray> crisesHelper = new CrisesHttpHelper()
        .execute(_auth_token, _page + "");
    JSONArray crises = null;
    try {
      crises = crisesHelper.get();
      if (crises != null) {
        for (int count = 0; count < crises.length(); count++) {
          try {
            JSONObject crisis = (JSONObject) crises.get(count);
            this.pershandler.addCrisis(crisis);
          } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
      }
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ExecutionException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  
  /**
   * 
   * @param _authToken
   * @return
   */
  public CrisesStats getCrisesStats(String _authToken) {
      CrisesStats stats = this.pershandler.getCrisesStats();
      
      if ( null == stats && _authToken != null ) {
        AsyncTask<String, Void, JSONObject> crisesStatsHelper = new StatisticCrisesHttpHelper().execute(_authToken);
        try {          
        this.pershandler.addCrisesStats(crisesStatsHelper.get());            
      } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        stats = this.pershandler.getCrisesStats();
      }
      
      return stats;
    }
    
  /**
   * 
   * @param _authToken
   * @return
   */
    public UsersStats getUsersStats(String _authToken) {
      UsersStats stats = this.pershandler.getUsersStats();
      if ( (null == stats && _authToken != null) || (stats != null && stats.getUsername() == null ) ) {
        AsyncTask<String, Void, JSONObject> crisesStatsHelper = new StatisticUsersHttpHelper().execute(_authToken);
        try {          
          Log.d("[CRISES CONTROLLER]", "Response from API: " + crisesStatsHelper.get());
        this.pershandler.addUsersStats(crisesStatsHelper.get());        
      } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        stats = this.pershandler.getUsersStats();
      }
      return stats;      
    }
    
    public Crisis getCrisis(String _authToken, String _crisisID) {
      Crisis crisis = this.pershandler.getCrisis(_crisisID);
      if ( null == crisis ) {
        AsyncTask<String, Void, JSONObject> singleCrisisTask = new SingleCrisisHttpHelper().execute(_authToken, _crisisID);
        try {
          this.pershandler.addCrisis(singleCrisisTask.get());
        } catch (JSONException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } catch (ExecutionException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        crisis = this.pershandler.getCrisis(_crisisID);
      }
      return crisis;
    }
        

  /**
   * Retrieve a crisis page with X crisis.
   * 
   * @param _authToken The authentication token as retrieved after successful login
   * @param _pageThe page to retrieve, starting from page 1 (one)
   * @return 
   */
  public ArrayList<Crisis> getCrises(String _authToken, int _page) {
    ArrayList<Crisis> crises = this.pershandler.getLatestCrisesList(10,
        _page);
    if (crises.isEmpty()) {
      storeLatestCrises(_authToken, _page);
      crises = this.pershandler.getLatestCrisesList(10, _page);
    }
    return crises;
  }
  
  /**
    *
    * @param crisis The single crisis JSON object as received from the Sigimera REST API
    * @return The shortened title that is human-readable
    */
   public String getShortTitle(JSONObject crisis) {
       String title = "";
       try {
           title += crisis.getString("crisis_alertLevel");
           title += " ";
           if ( crisis.has("subject") )
             title += crisis.getString("subject");
           title += " alert ";
  
           if ( crisis.has("gn_parentCountry") && crisis.getJSONArray("gn_parentCountry").length() > 0 ){
               title += " in ";
               title += Common.capitalize(crisis.getJSONArray("gn_parentCountry").get(0).toString());
           }
           return title;
       } catch (JSONException e) {
           e.printStackTrace();
       }
       return null;
  }
  
  public long getCacheSize() { 
    return this.pershandler.getCacheSize(); 
  }
  
  public Crisis getNearCrisis(String _auth_token, Location _location) {
    String crisisID = this.pershandler.getNearCrisis();
    if ( crisisID == null ) {
      updateNearCrises(_auth_token, 1, _location);
      crisisID = this.pershandler.getNearCrisis();
    }
    Log.i("[PERSISTANCE CONTROLLER]", "Retrieve near crisis id: " + crisisID);
    
    if (crisisID != null)
      return getCrisis(_auth_token, crisisID);
    
    return null;
  }
  
  public Crisis getLatestCrisis(String _auth_token) {
    String crisisID = this.pershandler.getLatestCrisis();
    Log.i("[PERSISTANCE CONTROLLER]", "Retrieve latest crisis id: " + crisisID);
    
    if (crisisID != null)
      return getCrisis(_auth_token, crisisID);
    
    return null;
  }
  
  public ArrayList<Crisis> getTodayCrises() {
    ArrayList<Crisis> crisesList = this.pershandler.getTodayCrises();
    
    return crisesList;
  }
  
  public ArrayList<Crisis> getNearCrises() {
    return this.pershandler.getNearCrises();
  }
  
  
  /**************************************************************
   *  Methods for UPDATE functionality
   **************************************************************/
  
  /**
   * Update crises statistics
   * 
   * @param _auth_token
   * @param _location
   */
  private void updateCrisesStats(String _auth_token, Location _location) {
    Log.i("[PERSISTENT CONTROLLER]", "Check if there are new crises statistics");
    CrisesStats crisesStats = getCrisesStats(_auth_token);
    
    if ( crisesStats != null && crisesStats.getLatestCrisisAt() != null) {
      Date date = Common.getDate(crisesStats.getLatestCrisisAt());      
      
      AsyncTask<String, Void, JSONObject> crisesStatsHelper = new StatisticCrisesHttpHelper().execute(_auth_token);        
        try {
          JSONObject tmpStats = crisesStatsHelper.get();
          if ( tmpStats != null ) {
            String latestCrisisAt = tmpStats.getString("latest_crisis_at");
            if ( latestCrisisAt != null && Common.getDate(latestCrisisAt).after(date) ) {    
              Log.i("[PERSISTENT CONTROLLER]", "There are new crises statistics available. Update the existing ones");
              this.pershandler.updateCrisesStats(crisesStatsHelper.get());
//              this.pershandler.addCrisesStats(crisesStatsHelper.get());  
            }else
              Log.i("[PERSISTENT CONTROLLER]", "Crises statistics are up to date.");
          }
      } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    } else
      Log.i("[PERSISTENT CONTROLLER]", "Crises statistics or latest crisis date are empty.");
  }
  
  /**
   * Update user statistics
   * 
   * @param _auth_token
   */
  public void updateUserStats(String _auth_token) {
    Log.i("[PERSISTENT CONTROLLER]", "Check if there are new user statistics");
    UsersStats userStats = getUsersStats(_auth_token);
    
    if (userStats != null) {
      //TODO: figure some update mechanism for user stats
    }
  }
  
  public void updateNearCrisesRadius(int _radius, String _userID) {
    if (this.pershandler.updateNearCrisesRadius(_radius, _userID))
      this.changesNotifier(_radius);
  }
  
  public void updateNearCrises(String _auth_token, int _page, Location _location) {
    if ( _location != null && _auth_token != null ) {
          try {
            AsyncTask<String, Void, JSONArray> crisesHelper = new NearCrisesHttpHelper().execute(_auth_token, _page+"", _location.getLatitude()+"", _location.getLongitude()+"");
            JSONArray retArray = null;
              retArray = crisesHelper.get();
              this.pershandler.updateNearCrises(retArray);
          } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (ExecutionException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (Exception e) {
            e.printStackTrace();
          }
    }
  }
  
  /**
   * Method that synchronise everything.
   * 
   * @throws InterruptedException 
   */
  public void updateEverything(String _auth_token) throws InterruptedException {
    Log.i("[PERSISTENT CONTROLLER]", "BEGIN TO UPDATE EVERYTHING with auth token: " + _auth_token);
    ApplicationController.getInstance().setEverythingUpdated(false);        
    Location lastLocation = LocationController.getInstance().getLastKnownLocation();
    Thread.sleep(1000);
    
    Log.i("[PERSISTENT CONTROLLER]", "UPDATE CRISES");
    this.storeLatestCrises(_auth_token, 1);
    Thread.sleep(1000);
    
    Log.i("[PERSISTENT CONTROLLER]", "UPDATE CRISES STATISTICS");
    this.updateCrisesStats(_auth_token, lastLocation);
    Thread.sleep(1000);
    
//    Log.i("[PERSISTENT CONTROLLER]", "UPDATE NEAR CRISES");
//    this.updateNearCrises(_auth_token, 1, lastLocation);
//    Thread.sleep(1000);
    
    Log.i("[PERSISTENT CONTROLLER]", "UPDATE USER STATISTICS");
    this.updateUserStats(_auth_token);
    Thread.sleep(1000);
    
    ApplicationController.getInstance().setEverythingUpdated(true);
    ApplicationController.getInstance().setUpdatedOnce(true);
    Log.i("[PERSISTENT CONTROLLER]", "END TO UPDATE EVERYTHING");
  }
  
  private void changesNotifier(int radius) {
    setChanged();
    notifyObservers(radius);
  }
}




Java Source Code List

org.sigimera.app.android.CrisesListFragment.java
org.sigimera.app.android.CrisisActivity.java
org.sigimera.app.android.CrisisAlertActivity.java
org.sigimera.app.android.GCMIntentService.java
org.sigimera.app.android.LoginFragment.java
org.sigimera.app.android.MainActivity.java
org.sigimera.app.android.OfflineMode.java
org.sigimera.app.android.ProfileFragment.java
org.sigimera.app.android.StatisticFragment.java
org.sigimera.app.android.StatsFragment.java
org.sigimera.app.android.TabManager.java
org.sigimera.app.android.TabsAdapter.java
org.sigimera.app.android.ToastNotification.java
org.sigimera.app.android.backend.PersistentStorage.java
org.sigimera.app.android.backend.auth.AccountAuthenticator.java
org.sigimera.app.android.backend.auth.AuthenticationService.java
org.sigimera.app.android.backend.auth.AuthenticatorActivity.java
org.sigimera.app.android.backend.network.CrisesHttpHelper.java
org.sigimera.app.android.backend.network.LocationUpdaterHttpHelper.java
org.sigimera.app.android.backend.network.LoginHttpHelper.java
org.sigimera.app.android.backend.network.MyHttpClient.java
org.sigimera.app.android.backend.network.NearCrisesHttpHelper.java
org.sigimera.app.android.backend.network.SingleCrisisHttpHelper.java
org.sigimera.app.android.backend.network.StatisticCrisesHttpHelper.java
org.sigimera.app.android.backend.network.StatisticUsersHttpHelper.java
org.sigimera.app.android.controller.ApplicationController.java
org.sigimera.app.android.controller.DistanceController.java
org.sigimera.app.android.controller.LocationController.java
org.sigimera.app.android.controller.PersistanceController.java
org.sigimera.app.android.controller.SessionHandler.java
org.sigimera.app.android.exception.AuthenticationErrorException.java
org.sigimera.app.android.model.Constants.java
org.sigimera.app.android.model.CrisesStats.java
org.sigimera.app.android.model.Crisis.java
org.sigimera.app.android.model.UserSettings.java
org.sigimera.app.android.model.User.java
org.sigimera.app.android.model.UsersStats.java
org.sigimera.app.android.model.map.CollectionOverlay.java
org.sigimera.app.android.util.Common.java
org.sigimera.app.android.util.Config.java
org.sigimera.app.android.util.MD5Util.java