package org.commcare.activities;
import android.content.Intent;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.commcare.heartbeat.UpdatePromptHelper;
import org.commcare.heartbeat.UpdateToPrompt;
import org.commcare.dalvik.R;
import org.commcare.views.ManagedUi;
import org.commcare.views.UiElement;
import org.javarosa.core.services.locale.Localization;
/**
* Activity used to prompt users to update to a newer .apk or app version. Will be launched
* periodically while there is a pending update to prompt.
*
* Created by amstone326 on 4/19/17.
*/
@ManagedUi(R.layout.prompt_update_view)
public class PromptUpdateActivity extends SessionAwareCommCareActivity {
private static final int DO_AN_UPDATE = 1;
private UpdateToPrompt apkUpdate;
private UpdateToPrompt cczUpdate;
@UiElement(value = R.id.updates_available_title)
private TextView updatesAvailableTitle;
@UiElement(value = R.id.update_later_option)
private TextView updateLaterText;
@UiElement(value = R.id.ccz_update_info_text)
private TextView cczUpdateInfoText;
@UiElement(value = R.id.ccz_update_button)
private Button updateCczButton;
@UiElement(value = R.id.apk_update_info_text)
private TextView apkUpdateInfoText;
@UiElement(value = R.id.apk_update_button)
private Button updateApkButton;
@Override
protected void onCreateSessionSafe(Bundle savedInstanceState) {
super.onCreateSessionSafe(savedInstanceState);
refreshUpdateToPromptObjects();
setupUI();
}
private void refreshUpdateToPromptObjects() {
cczUpdate = UpdatePromptHelper.getCurrentUpdateToPrompt(false);
apkUpdate = UpdatePromptHelper.getCurrentUpdateToPrompt(true);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == DO_AN_UPDATE) {
refreshUpdateToPromptObjects();
if (cczUpdate == null && apkUpdate == null) {
finish();
} else {
updateVisibilities();
}
}
}
private void setupUI() {
setUpComponents();
updateVisibilities();
}
private void setUpComponents() {
updatesAvailableTitle.setText(
Localization.get(inForceMode() ? "update.required.title" : "updates.available.title"));
SpannableString content = new SpannableString(Localization.get("update.later.option"));
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
updateLaterText.setText(content);
updateLaterText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
cczUpdateInfoText.setText(Localization.get(
cczUpdateIsForced() ? "forced.ccz.update.info" : "prompted.ccz.update.info"));
updateCczButton.setText(Localization.get("ccz.update.action"));
updateCczButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchUpdateActivity();
}
});
if (cczUpdateIsForced()) {
cczUpdateInfoText.setTextColor(getResources().getColor(R.color.cc_attention_negative_color));
cczUpdateInfoText.setTypeface(Typeface.DEFAULT_BOLD);
}
apkUpdateInfoText.setText(Localization.get(
apkUpdateIsForced() ? "forced.apk.update.info" : "prompted.apk.update.info"));
updateApkButton.setText(Localization.get("apk.update.action"));
updateApkButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchCommCareOnPlayStore();
}
});
if (apkUpdateIsForced()) {
apkUpdateInfoText.setTextColor(getResources().getColor(R.color.cc_attention_negative_color));
apkUpdateInfoText.setTypeface(Typeface.DEFAULT_BOLD);
}
}
private void updateVisibilities() {
View cczView = findViewById(R.id.ccz_update_container);
if (cczUpdate != null) {
cczView.setVisibility(View.VISIBLE);
} else {
cczView.setVisibility(View.GONE);
}
View apkView = findViewById(R.id.apk_update_container);
if (apkUpdate != null) {
apkView.setVisibility(View.VISIBLE);
} else {
apkView.setVisibility(View.GONE);
}
if (inForceMode()) {
updateLaterText.setVisibility(View.GONE);
} else {
updateLaterText.setVisibility(View.VISIBLE);
}
}
private boolean inForceMode() {
return cczUpdateIsForced() || apkUpdateIsForced();
}
private boolean cczUpdateIsForced() {
return cczUpdate != null && cczUpdate.isPastForceByDate();
}
private boolean apkUpdateIsForced() {
return apkUpdate != null && apkUpdate.isPastForceByDate();
}
private void launchUpdateActivity() {
startActivityForResult(new Intent(this, UpdateActivity.class), DO_AN_UPDATE);
}
private void launchCommCareOnPlayStore() {
final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object
Intent intent;
try {
intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=" + appPackageName));
} catch (android.content.ActivityNotFoundException e) {
intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName));
}
startActivityForResult(intent, DO_AN_UPDATE);
}
@Override
public void onBackPressed() {
// Prevent navigating away from this activity if we're in force mode
if (!inForceMode()) {
super.onBackPressed();
}
}
@Override
public boolean isBackEnabled() {
return !inForceMode();
}
}