package au.id.teda.broadband.usage.helper; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import au.id.teda.broadband.usage.activity.BaseActivity; import au.id.teda.broadband.usage.util.NetworkUtilities; @SuppressLint("DefaultLocale") // For some reason cannot remove the lint warning public class AccountStatusHelper { //private static final String DEBUG_TAG = BaseActivity.DEBUG_TAG; // Set static string values for preference keys private final static String ACCOUNT = "account"; private final static String QUOTA_RESET_DATE = "quotaResetDate"; private final static String QUOTA_START_DATE = "quotaStartDate"; private final static String ANYTIME_DATA_USED = "anyTimeDataUsed"; private final static String ANYTIME_SPEED = "anyTimeSpeed"; private final static String ANYTIME_IS_SHAPED = "anyTimeIsShaped"; private final static String PEAK_DATA_USED = "peakDataUsed"; private final static String PEAK_SPEED = "peakSpeed"; private final static String PEAK_IS_SHAPED = "peakIsShaped"; private final static String OFFPEAK_DATA_USED = "offpeakDataUsed"; private final static String OFFPEAK_SPEED = "offpeakSpeed"; private final static String OFFPEAK_IS_SHAPED = "offpeakIsShaped"; private final static String UPLOADS_DATA_USED = "uploadsDataUsed"; private final static String FREEZONE_DATA_USED = "freezoneDataUsed"; private final static String IP_ADDRESS = "ipAddress"; private final static String UP_TIME_DATE = "upTimeDate"; private final static long GB = 1000000000; private final static long MB = 1000000; private final static long DAY_IN_MILLIS = 1000 * 60 * 60 * 24; //private final static String FORMAT_dd_MMM_YYYY = "dd-MMM-yyyy HH:mm"; private final static String FORMAT_EEE_dd_MMM_YYYY = "EEE, dd-MMM-yyyy HH:mm"; // Activity context private static Context mContext; // Activity shared preferences SharedPreferences mSettings; SharedPreferences.Editor mEditor; AccountInfoHelper mInfo; // Class constructor public AccountStatusHelper(Context context) { AccountStatusHelper.mContext = context; mSettings = PreferenceManager.getDefaultSharedPreferences(context); mEditor = mSettings.edit(); mInfo = new AccountInfoHelper(mContext); } public void setAccoutStatus(String userAccount, long quotaResetDate, long quotaStartDate , long anyTimeDataUsed, boolean anyTimeIsShaped, long anyTimeSpeed , long peakDataUsed, boolean peakIsShaped, long peakSpeed , long offpeakDataUsed, boolean offpeakIsShaped, long offpeakSpeed , long uploadsDataUsed , long freezoneDataUsed , String ipAddress, long upTimeDate) { mEditor.putString(ACCOUNT, userAccount); mEditor.putLong(QUOTA_RESET_DATE, quotaResetDate); mEditor.putLong(QUOTA_START_DATE, quotaStartDate); mEditor.putLong(ANYTIME_DATA_USED, anyTimeDataUsed); mEditor.putBoolean(ANYTIME_IS_SHAPED, anyTimeIsShaped); mEditor.putLong(ANYTIME_SPEED, anyTimeSpeed); mEditor.putLong(PEAK_DATA_USED, peakDataUsed); mEditor.putBoolean(PEAK_IS_SHAPED, peakIsShaped); mEditor.putLong(PEAK_SPEED, peakSpeed); mEditor.putLong(OFFPEAK_DATA_USED, offpeakDataUsed); mEditor.putBoolean(OFFPEAK_IS_SHAPED, offpeakIsShaped); mEditor.putLong(OFFPEAK_SPEED, offpeakSpeed); mEditor.putLong(UPLOADS_DATA_USED, uploadsDataUsed); mEditor.putLong(FREEZONE_DATA_USED, freezoneDataUsed); mEditor.putString(IP_ADDRESS, ipAddress); mEditor.putLong(UP_TIME_DATE, upTimeDate); // Commit values to preferences mEditor.commit(); } public boolean isStatusSet() { /** Log.d(DEBUG_TAG, "" + mInfo.isAccountAnyTime() + isQuotaResetDateSet() + isQuotaStartDateSet() + isAnytimeDataSet() + isAnytimeIsShapedSet() + isAnytimeSpeedSet() + isUploadsDataSet() + isFreezoneDataSet() + isUpTimeDateSet()); **/ if (mInfo.isAccountAnyTime() && isQuotaResetDateSet() && isQuotaStartDateSet() && isAnytimeDataSet() && isAnytimeIsShapedSet() && isAnytimeSpeedSet() && isUploadsDataSet() && isFreezoneDataSet()){ return true; } else if (!mInfo.isAccountAnyTime() && isQuotaResetDateSet() && isQuotaStartDateSet() && isPeakDataSet() && isPeakIsShapedSet() && isPeakSpeedSet() && isOffpeakDataSet() && isOffpeakIsShapedSet() && isOffpeakSpeedSet() && isUploadsDataSet() && isFreezoneDataSet()){ return true; } else { return false; } } public Calendar getQuotaResetDate(){ long milliseconds = mSettings.getLong(QUOTA_RESET_DATE, 0); Calendar mCalendar = Calendar.getInstance(); mCalendar.setTimeInMillis(milliseconds); return mCalendar; } public long getDaysToGoMillis(){ // Get current date/time Calendar now = Calendar.getInstance(); // Get rollover date/time Calendar rollover = getQuotaResetDate(); // Difference in milliseconds divided by day in millisecond long diffInDays = (rollover.getTimeInMillis() - now.getTimeInMillis()); return diffInDays; } public int getDaysToGo(){ int diffInDays = (int) (getDaysToGoMillis() / DAY_IN_MILLIS); return diffInDays; } public String getDaysToGoString(){ int diffInDays = getDaysToGo(); String daysToGo = Integer.toString(diffInDays); if (diffInDays < 0){ daysToGo = "00"; } else if (diffInDays < 10 ){ daysToGo = "0" + daysToGo; } return daysToGo; } public String getCurrentMonthString(){ // How to format date String FORMAT_MMMM_yyyy = "MMMMM yyyy"; // Set calendar to rollover date Calendar rollover = getQuotaResetDate(); //Set up formater SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_MMMM_yyyy, Locale.UK); // Get date value of calendar and format String currentMonth = sdf.format(rollover.getTime()); return currentMonth.toUpperCase(Locale.getDefault()); } public String getDataBaseMonthString(){ // How to format date String FORMAT_YYYYMM = "yyyyMM"; // Set calendar to rollover date Calendar rollover = getQuotaResetDate(); //Set up formater SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_YYYYMM, Locale.UK); return sdf.format(rollover.getTime()); } public String getRolloverDateString(){ // How to format date String FORMAT_dd_MMMM_yyyy = "dd MMMMM yyyy"; // Set calendar to rollover date Calendar rollover = getQuotaResetDate(); //Set up formater SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_dd_MMMM_yyyy, Locale.getDefault()); // Get date value of calendar and format String rolloverDate = sdf.format(rollover.getTime()); return rolloverDate.toUpperCase(Locale.getDefault()); } public Calendar getQuotaStartDate(){ long milliseconds = mSettings.getLong(QUOTA_START_DATE, 0); Calendar mCalendar = Calendar.getInstance(); mCalendar.setTimeInMillis(milliseconds); return mCalendar; } public int getDaysSoFar(){ // Get current date/time Calendar now = Calendar.getInstance(); // Get rollover date/time Calendar start = getQuotaStartDate(); // Difference in milliseconds divided by day in millisecond int diffInDays = (int) ((now.getTimeInMillis() - start.getTimeInMillis()) / DAY_IN_MILLIS ); return diffInDays; } public String getDaysSoFarString(){ int diffInDays = getDaysSoFar(); String daysSoFar = Integer.toString(diffInDays); if (diffInDays < 10 ){ daysSoFar = "0" + daysSoFar; } else if (diffInDays > 31){ daysSoFar = "00"; } return daysSoFar; } public String getStartDateString(){ // How to format date String FORMAT_dd_MMMM_yyyy = "dd MMMMM yyyy"; // Set calendar to rollover date Calendar start = getQuotaStartDate(); //Set up formater SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_dd_MMMM_yyyy, Locale.getDefault()); // Get date value of calendar and format String startDate = sdf.format(start.getTime()); return startDate.toUpperCase(Locale.getDefault()); } public int getDaysThisPeriod(){ int daysToGo = getDaysToGo(); int daysSoFar = getDaysSoFar(); int daysThisPeriod = daysSoFar + daysToGo; return daysThisPeriod; } public String getDaysThisPeriodString(){ String days = String.valueOf(getDaysThisPeriod()); return "/ " + days + " days so far"; } /** * Start any time methods */ public long getAnytimeDataUsed(){ return mSettings.getLong(ANYTIME_DATA_USED, 0); } public long getAnytimeDataUsedMb(){ return (getAnytimeDataUsed() / MB); } public int getAnytimeDataUsedGb(){ int data = (int) (getAnytimeDataUsed() / GB); return data; } public int getAnytimeDailyAverageUsedMb(){ long used = getAnytimeDataUsedMb(); long days = getDaysSoFar(); int average = (int) (used / days); return average; } public int getAnytimeAverageVariationMb(){ long quota = mInfo.getAnyTimeQuotaDailyMb(); long daily = getAnytimeDailyAverageUsedMb(); int variation = (int) (daily - quota); return variation; } public int getAnytimeDataUsedLessUploadsGb(){ int download = (int) getAnytimeDataUsedGb(); int upload = getUploadsDataUsedGb(); return (download - upload); } public String getAnytimeDataUsedGbString(){ long data = getAnytimeDataUsedGb(); String used = Long.toString(data); if (data < 10 ){ used = "0" + used; } return used; } public String getAnytimeDataUsedLessUploadsGbString(){ long data = getAnytimeDataUsedLessUploadsGb(); String used = Long.toString(data); if (data < 10 ){ used = "0" + used; } return used; } public int getAnytimeDataUsedPercent(){ long used = getAnytimeDataUsed(); long quota = mInfo.getAnyTimeQuota(); int percent = (int) ((used * 100.0f) / quota); return percent; } public String getAnytimeDataUsedPercentString(){ int percent = getAnytimeDataUsedPercent(); return String.valueOf(percent) + "%"; } public long getAnytimeDataRemaining(){ long quota = mInfo.getAnyTimeQuota(); long used = getAnytimeDataUsed(); return (quota - used); } public int getAnytimeDataRemaingGb(){ return (int) ( getAnytimeDataRemaining() / GB ); } public String getAnytimeDataRemaingGbString(){ int data = getAnytimeDataRemaingGb(); String remaining = String.valueOf(data); if (data < 10 ){ remaining = "0" + remaining; } return remaining; } public boolean isAnytimeShaped(){ return mSettings.getBoolean(ANYTIME_IS_SHAPED, false); } public String getAnytimeShapedUsedString(){ boolean isShaped = isAnytimeShaped(); if (isShaped){ return "USED DATA (SHAPED)"; } else { return "USED DATA (UNSHAPED)"; } } public String getAnytimeShapedRemainingString(){ boolean isShaped = isAnytimeShaped(); if (isShaped){ return "REMAINING DATA (SHAPED)"; } else { return "REMAINING DATA (UNSHAPED)"; } } public long getAnytimeSpeed(){ return mSettings.getLong(ANYTIME_SPEED, 0); } /** * Start Peak Data Methods */ public long getPeakDataUsed(){ return mSettings.getLong(PEAK_DATA_USED, 0); } public int getPeakDailyAverageUsedMb(){ long used = getPeakDataUsed() / MB; long days = getDaysSoFar(); int average = (int) (used / days); return average; } public int getPeakAverageVariationMb(){ long quota = mInfo.getPeakQuotaDailyMb(); long daily = getPeakDailyAverageUsedMb(); int variation = (int) (daily - quota); return variation; } public int getPeakDataUsedGb(){ return (int) (mSettings.getLong(PEAK_DATA_USED, 0) / GB); } public int getPeakDataUsedLessUploadsGb(){ int download = getPeakDataUsedGb(); int upload = getUploadsDataUsedGb(); return (download - upload); } public String getPeakDataUsedGbString(){ long peak = getPeakDataUsedGb(); String used = Long.toString(peak); if (peak < 10 ){ used = "0" + used; } return used; } public String getPeakDataUsedLessUploadsGbString(){ long peak = getPeakDataUsedLessUploadsGb(); String used = Long.toString(peak); if (peak < 10 ){ used = "0" + used; } return used; } public int getPeakDataUsedPercent(){ long used = getPeakDataUsed(); long quota = mInfo.getPeakQuota(); int percent = (int) ((used * 100.0f) / quota); return percent; } public String getPeakDataUsedPercentString(){ int percent = getPeakDataUsedPercent(); return String.valueOf(percent) + "%"; } public long getPeakDataRemaining(){ long quota = mInfo.getPeakQuota(); long used = getPeakDataUsed(); return (quota - used); } public int getPeakDataRemaingGb(){ return (int) ( getPeakDataRemaining() / GB ); } public String getPeakDataRemaingGbString(){ int data = getPeakDataRemaingGb(); String remaining = String.valueOf(data); if (data < 10 ){ remaining = "0" + remaining; } return remaining; } public boolean isPeakShaped(){ return mSettings.getBoolean(PEAK_IS_SHAPED, false); } public String getPeakShapedUsedString(){ boolean isShaped = isPeakShaped(); if (isShaped){ return "USED DATA (SHAPED)"; } else { return "USED DATA (UNSHAPED)"; } } public String getPeakShapedRemainingString(){ boolean isShaped = isPeakShaped(); if (isShaped){ return "REMAINING DATA (SHAPED)"; } else { return "REMAINING DATA (UNSHAPED)"; } } public long getPeakSpeed(){ return mSettings.getLong(PEAK_SPEED, 0); } /** * Start off peak */ public long getOffpeakDataUsed(){ return mSettings.getLong(OFFPEAK_DATA_USED, 0); } public int getOffpeakDailyAverageUsedMb(){ long used = getOffpeakDataUsed() / MB; long days = getDaysSoFar(); int average = (int) (used / days); return average; } public int getOffpeakAverageVariationMb(){ long quota = mInfo.getOffpeakQuotaDailyMb(); long daily = getOffpeakDailyAverageUsedMb(); int variation = (int) (daily - quota); return variation; } public int getOffpeakDataUsedGb(){ return (int) (mSettings.getLong(OFFPEAK_DATA_USED, 0) / GB); } public int getOffpeakDataUsedLessUploadsGb(){ int download = getOffpeakDataUsedGb(); int upload = getUploadsDataUsedGb(); return (download - upload); } public int getOffpeakDataUsedPercent(){ long used = getOffpeakDataUsed(); long quota = mInfo.getOffpeakQuota(); int percent = (int) ((used * 100.0f) / quota); return percent; } public String getOffpeakDataUsedPercentString(){ int percent = getOffpeakDataUsedPercent(); return String.valueOf(percent) + "%"; } public String getOffpeakDataUsedGbString(){ long offpeak = getOffpeakDataUsedGb(); String used = Long.toString(offpeak); if (offpeak < 10 ){ used = "0" + used; } return used; } public long getOffpeakDataRemaining(){ long quota = mInfo.getOffpeakQuota(); long used = getOffpeakDataUsed(); return (quota - used); } public int getOffpeakDataRemaingGb(){ int remaining = (int) ( getOffpeakDataRemaining() / GB ); return remaining ; } public String getOffpeakDataRemaingGbString(){ int data = getOffpeakDataRemaingGb(); String remaining = String.valueOf(data); if (data < 10 ){ remaining = "0" + remaining; } return remaining; } public String getOffpeakDataUsedLessUploadsGbString(){ long peak = getOffpeakDataUsedLessUploadsGb(); String used = Long.toString(peak); if (peak < 10 ){ used = "0" + used; } return used; } public boolean isOffpeakShaped(){ return mSettings.getBoolean(OFFPEAK_IS_SHAPED, false); } public String getOffpeakShapedUsedString(){ boolean isShaped = isOffpeakShaped(); if (isShaped){ return "USED DATA (SHAPED)"; } else { return "USED DATA (UNSHAPED)"; } } public String getOffpeakShapedRemainingString(){ boolean isShaped = isOffpeakShaped(); if (isShaped){ return "REMAINING DATA (SHAPED)"; } else { return "REMAINING DATA (UNSHAPED)"; } } public long getOffpeakSpeed(){ return mSettings.getLong(OFFPEAK_SPEED, 0); } public long getUploadsDataUsed(){ return mSettings.getLong(UPLOADS_DATA_USED, 0); } public int getUploadsDataUsedGb(){ return (int) (getUploadsDataUsed() / GB); } public String getUploadsDataUsedGbString(){ long offpeak = getUploadsDataUsedGb(); String used = Long.toString(offpeak); if (offpeak < 10 ){ used = "0" + used; } return used; } public long getFreezoneDataUsed(){ return mSettings.getLong(FREEZONE_DATA_USED, 0); } public int getFreezoneDataUsedGb(){ return (int) (getFreezoneDataUsed() / GB); } public String getFreezoneDataUsedGbString(){ long offpeak = getFreezoneDataUsedGb(); String used = Long.toString(offpeak); if (offpeak < 10 ){ used = "0" + used; } return used; } public String getIpAddress(){ return mSettings.getString(IP_ADDRESS, ""); } public String getIpAddressStrng(){ String ip = mSettings.getString(IP_ADDRESS, ""); return ip + " (IP)"; } public Calendar getUpTimeDate(){ long milliseconds = mSettings.getLong(UP_TIME_DATE, -1); Calendar mCalendar = Calendar.getInstance(); mCalendar.setTimeInMillis(milliseconds); return mCalendar; } public int getUpTimeDays(){ // Get current date/time Calendar now = Calendar.getInstance(); // Get rollover date/time Calendar uptime = getUpTimeDate(); // Difference in milliseconds divided by day in millisecond int diffInDays = (int) ((now.getTimeInMillis() - uptime.getTimeInMillis()) / DAY_IN_MILLIS ); return diffInDays; } public String getUpTimeDaysString(){ int upDays = getUpTimeDays(); String days = Integer.toString(upDays); if (upDays < 0){ days = "00"; } else if (upDays < 10 ){ days = "0" + days; } else if (upDays > 31){ days = "00"; } return days; } private Long getLastSyncTime(){ return mSettings.getLong(NetworkUtilities.PREF_LAST_SYNC_KEY, 0); } public String getLastSyncTimeString(){ long lastSyncMillis = getLastSyncTime(); Calendar lastSyncCal = Calendar.getInstance(); lastSyncCal.setTimeInMillis(lastSyncMillis); //Set up formatter SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_EEE_dd_MMM_YYYY, Locale.getDefault()); // Get date value of calendar and format String syncDateTime = sdf.format(lastSyncCal.getTime()); return "Synced: " + syncDateTime; } public boolean isQuotaResetDateSet(){ if (getQuotaResetDate().getTimeInMillis() > 0){ return true; } else { return false; } } public boolean isQuotaStartDateSet(){ if (getQuotaStartDate().getTimeInMillis() > 0){ return true; } else { return false; } } public boolean isAnytimeDataSet(){ if (getAnytimeDataUsed() > 0){ return true; } else { return false; } } public boolean isAnytimeIsShapedSet(){ if (isAnytimeShaped()){ return false; } else { return true; } } public boolean isAnytimeSpeedSet(){ if (getAnytimeSpeed() > -1){ return true; } else { return false; } } public boolean isPeakDataSet(){ if (getPeakDataUsed() > 0){ return true; } else { return false; } } public boolean isPeakIsShapedSet(){ if (isPeakShaped()){ return false; } else { return true; } } public boolean isPeakSpeedSet(){ if (getPeakSpeed() > -1){ return true; } else { return false; } } public boolean isOffpeakDataSet(){ if (getOffpeakDataUsed() > 0){ return true; } else { return false; } } public boolean isOffpeakIsShapedSet(){ if (isOffpeakShaped()){ return false; } else { return true; } } public boolean isOffpeakSpeedSet(){ if (getOffpeakSpeed() > -1){ return true; } else { return false; } } public boolean isUploadsDataSet(){ if (getUploadsDataUsed() > 0){ return true; } else { return false; } } public boolean isFreezoneDataSet(){ if (getFreezoneDataUsed() > 0){ return true; } else { return false; } } public boolean isIpAddressSet(){ if (getIpAddress().length() > 0){ return true; } else { return false; } } public boolean isUpTimeDateSet(){ if (getUpTimeDate().getTimeInMillis() > 0){ return true; } else { return false; } } private Calendar getCalendarFromMillis(long milliseconds){ Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(milliseconds); return cal; } }