package org.openlmis.core.view.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.google.inject.Inject;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.manager.SharedPreferenceMgr;
import org.openlmis.core.presenter.SyncErrorsPresenter;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.view.activity.BaseActivity;
import roboguice.RoboGuice;
import roboguice.inject.InjectView;
public class SyncTimeView extends LinearLayout implements View.OnClickListener {
@InjectView(R.id.pb_sync_data)
ProgressBar progressBar;
@InjectView(R.id.tx_sync_time)
TextView txSyncTime;
@InjectView(R.id.iv_sync_time_icon)
ImageView ivSyncTimeIcon;
@Inject
SyncErrorsPresenter syncErrorsPresenter;
protected Context context;
protected long rnrLastSyncTime;
protected long stockLastSyncTime;
public SyncTimeView(Context context) {
super(context);
init(context);
}
public SyncTimeView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
this.context = context;
LayoutInflater.from(context).inflate(R.layout.view_sync_time, this);
RoboGuice.injectMembers(getContext(), this);
RoboGuice.getInjector(getContext()).injectViewMembers(this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
txSyncTime.setOnClickListener(this);
}
public void showLastSyncTime() {
hideSyncProgressBarAndShowIcon();
rnrLastSyncTime = SharedPreferenceMgr.getInstance().getRnrLastSyncTime();
stockLastSyncTime = SharedPreferenceMgr.getInstance().getStockLastSyncTime();
if (isNeverSyncSuccessful()) {
if (hasSyncFailed()) {
txSyncTime.setText(LMISApp.getContext().getString(R.string.initial_sync_failed));
}
return;
}
updateSyncTimeViewUI();
}
private void updateSyncTimeViewUI() {
long syncTimeInterval = getSyncTimeInterval(rnrLastSyncTime, stockLastSyncTime);
String syncTimeIntervalWithUnit;
if (syncTimeInterval < DateUtil.MILLISECONDS_HOUR) {
int quantity = (int) (syncTimeInterval / DateUtil.MILLISECONDS_MINUTE);
syncTimeIntervalWithUnit = getResources().getQuantityString(R.plurals.minute_unit, quantity, quantity);
ivSyncTimeIcon.setImageResource(R.drawable.icon_circle_green);
} else if (syncTimeInterval < DateUtil.MILLISECONDS_DAY) {
int quantity = (int) (syncTimeInterval / DateUtil.MILLISECONDS_HOUR);
syncTimeIntervalWithUnit = getResources().getQuantityString(R.plurals.hour_unit, quantity, quantity);
ivSyncTimeIcon.setImageResource(R.drawable.icon_circle_green);
} else if (syncTimeInterval < DateUtil.MILLISECONDS_DAY * 3) {
int quantity = (int) (syncTimeInterval / DateUtil.MILLISECONDS_DAY);
syncTimeIntervalWithUnit = getResources().getQuantityString(R.plurals.day_unit, quantity, quantity);
ivSyncTimeIcon.setImageResource(R.drawable.icon_circle_yellow);
} else {
int quantity = (int) (syncTimeInterval / DateUtil.MILLISECONDS_DAY);
syncTimeIntervalWithUnit = getResources().getQuantityString(R.plurals.day_unit, quantity, quantity);
ivSyncTimeIcon.setImageResource(R.drawable.icon_circle_red);
}
txSyncTime.setText(LMISApp.getContext().getResources().getString(R.string.label_last_synced_ago, syncTimeIntervalWithUnit));
}
private boolean isNeverSyncSuccessful() {
return rnrLastSyncTime == 0 && stockLastSyncTime == 0;
}
private boolean hasSyncFailed() {
return syncErrorsPresenter.hasRnrSyncError() || syncErrorsPresenter.hasStockCardSyncError();
}
private long getSyncTimeInterval(long rnrLastSyncTime, long stockLastSyncTime) {
long latestSyncTime;
if (rnrLastSyncTime > stockLastSyncTime) {
latestSyncTime = rnrLastSyncTime;
} else {
latestSyncTime = stockLastSyncTime;
}
return DateUtil.calculateTimeIntervalFromNow(latestSyncTime);
}
@Override
public void onClick(View v) {
showLastSyncTime();
popUpBottomSheet();
}
private void popUpBottomSheet() {
SyncDateBottomSheet syncDateBottomSheet = new SyncDateBottomSheet();
syncDateBottomSheet.setArguments(SyncDateBottomSheet.getArgumentsToMe(rnrLastSyncTime, stockLastSyncTime));
syncDateBottomSheet.show(((BaseActivity) context).getFragmentManager());
}
public void showSyncProgressBarAndHideIcon() {
ivSyncTimeIcon.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
}
private void hideSyncProgressBarAndShowIcon() {
progressBar.setVisibility(GONE);
ivSyncTimeIcon.setVisibility(VISIBLE);
}
}