package org.commcare.dalvik.activities;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import org.commcare.android.framework.CommCareActivity;
import org.commcare.android.tasks.VerificationTask;
import org.commcare.android.tasks.VerificationTaskListener;
import org.commcare.dalvik.R;
import org.commcare.dalvik.application.CommCareApplication;
import org.commcare.dalvik.dialogs.CustomProgressDialog;
import org.commcare.resources.model.MissingMediaException;
import org.javarosa.core.services.locale.Localization;
import org.javarosa.core.util.SizeBoundVector;
import android.content.Intent;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class CommCareVerificationActivity extends CommCareActivity<CommCareVerificationActivity> implements VerificationTaskListener, OnClickListener {
TextView missingMediaPrompt;
private static final int MENU_UNZIP = Menu.FIRST;
public static final String KEY_REQUIRE_REFRESH = "require_referesh";
Button retryButton;
VerificationTask task;
public static int RESULT_RETRY = 2;
public static int RESULT_IGNORE = 3;
public static int DIALOG_VERIFY_PROGRESS = 0;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.missing_multimedia_layout);
retryButton = (Button)findViewById(R.id.screen_multimedia_retry);
retryButton.setOnClickListener(this);
missingMediaPrompt = (TextView)findViewById(R.id.MissingMediaPrompt);
fire();
}
private void fire() {
CommCareVerificationActivity last = (CommCareVerificationActivity)this.getDestroyedActivityState();
if(last == null) {
missingMediaPrompt.setText("Verifying media...");
retryButton.setText("Retry");
verifyResourceInstall();
} else {
//For some reason android just isn't recovering our prompt text here, which
//is super obnoxious
missingMediaPrompt.setText(last.missingMediaPrompt.getText());
if(last.task != null && last.task.getStatus() == Status.RUNNING) {
this.task = last.task;
last.task.setListener(this);
} else {
verifyResourceInstall();
//don't worry about it
}
}
}
public void verifyResourceInstall() {
task = new VerificationTask(this);
task.setListener(this);
showProgressDialog(DIALOG_VERIFY_PROGRESS);
task.execute((String[])null);
}
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.VerificationTaskListener#onFinished(org.javarosa.core.util.SizeBoundVector)
*/
@Override
public void onFinished(SizeBoundVector<MissingMediaException> problems) {
dismissProgressDialog();
if(problems.size() > 0 ) {
String message = Localization.get("verification.fail.message");
Hashtable<String, Vector<String>> problemList = new Hashtable<String,Vector<String>>();
for(Enumeration en = problems.elements() ; en.hasMoreElements() ;) {
MissingMediaException ure = (MissingMediaException)en.nextElement();
String res = ure.getResource().getResourceId();
Vector<String> list;
if(problemList.containsKey(res)) {
list = problemList.get(res);
} else{
list = new Vector<String>();
}
list.addElement(ure.getMessage());
problemList.put(res, list);
}
for(Enumeration en = problemList.keys(); en.hasMoreElements();) {
String resource = (String)en.nextElement();
message += "\n-----------";
for(String s : problemList.get(resource)) {
message += "\n" + prettyString(s);
}
}
if(problems.getAdditional() > 0) {
message += "\n\n..." + problems.getAdditional() + " more";
}
missingMediaPrompt.setText(message);
}
}
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.VerificationTaskListener#updateVerifyProgress(int, int)
*/
@Override
public void updateVerifyProgress(int done, int pending) {
updateProgress(Localization.get("verification.progress",new String[] {""+done,""+pending}),
DIALOG_VERIFY_PROGRESS);
}
/*
* (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onPostResume()
*/
@Override
protected void onPostResume() {
super.onPostResume();
fire();
}
public void done(boolean requireRefresh) {
//TODO: We might have gotten here due to being called from the outside, in which
//case we should manually start up the home activity
if(Intent.ACTION_VIEW.equals(CommCareVerificationActivity.this.getIntent().getAction())) {
//Call out to CommCare Home
Intent i = new Intent(getApplicationContext(), CommCareHomeActivity.class);
i.putExtra(KEY_REQUIRE_REFRESH, requireRefresh);
startActivity(i);
finish();
return;
} else {
//Good to go
Intent i = new Intent(getIntent());
i.putExtra(KEY_REQUIRE_REFRESH, requireRefresh);
setResult(RESULT_OK, i);
finish();
return;
}
}
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.VerificationTaskListener#success()
*/
@Override
public void success() {
CommCareApplication._().getCurrentApp().setResourcesValidated(true);
done(true);
}
/*
* (non-Javadoc)
* @see org.commcare.android.tasks.VerificationTaskListener#failUnknown()
*/
@Override
public void failUnknown() {
missingMediaPrompt.setText("Validation failed for an unknown reason");
}
public String prettyString(String rawString){
int marker = rawString.indexOf("/sdcard");
if(marker<0){return rawString;}
else{return rawString.substring(marker);}
}
/*
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.screen_multimedia_retry:
verifyResourceInstall();
return;
}
}
/*
* (non-Javadoc)
* @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_UNZIP, 0, "Install Multimedia").setIcon(android.R.drawable.ic_menu_gallery);
return true;
}
/*
* (non-Javadoc)
* @see org.commcare.android.framework.CommCareActivity#onOptionsItemSelected(android.view.MenuItem)
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_UNZIP:
Intent i = new Intent(this, MultimediaInflaterActivity.class);
i.putExtra(MultimediaInflaterActivity.EXTRA_FILE_DESTINATION, CommCareApplication._().getCurrentApp().storageRoot());
this.startActivityForResult(i, 0);
return true;
}
return super.onOptionsItemSelected(item);
}
/*
* (non-Javadoc)
* @see org.commcare.android.framework.CommCareActivity#generateProgressDialog(int)
*
* Implementation of generateProgressDialog() for DialogController -- other methods
* handled entirely in CommCareActivity
*/
@Override
public CustomProgressDialog generateProgressDialog(int taskId) {
if (taskId == DIALOG_VERIFY_PROGRESS) {
return CustomProgressDialog.newInstance
(Localization.get("verification.title"), Localization.get("verification.checking"), taskId);
}
System.out.println("WARNING: taskId passed to generateProgressDialog does not match "
+ "any valid possibilities in CommCareVerificationActivity");
return null;
}
}