package com.door43.translationstudio; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.widget.ProgressBar; import android.widget.TextView; import com.door43.tools.reporting.GlobalExceptionHandler; import com.door43.translationstudio.newui.BaseActivity; import com.door43.translationstudio.tasks.InitializeLibraryTask; import com.door43.translationstudio.tasks.LoadTargetLanguagesTask; import com.door43.translationstudio.tasks.UpdateAppTask; import com.door43.util.tasks.ManagedTask; import com.door43.util.tasks.TaskManager; import java.io.File; /** * This activity initializes the app */ public class SplashScreenActivity extends BaseActivity implements ManagedTask.OnFinishedListener, ManagedTask.OnStartListener { private TextView mProgressTextView; private ProgressBar mProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); mProgressTextView = (TextView)findViewById(R.id.loadingText); mProgressBar = (ProgressBar)findViewById(R.id.loadingBar); mProgressBar.setMax(100); mProgressBar.setIndeterminate(true); if(savedInstanceState != null) { mProgressTextView.setText(savedInstanceState.getString("message")); } } @Override public void onResume() { super.onResume(); if(!waitingForPermissions()) { // check if we crashed File dir = new File(AppContext.getPublicDirectory(), AppContext.context().STACKTRACE_DIR); String[] files = GlobalExceptionHandler.getStacktraces(dir); if (files.length > 0) { Intent intent = new Intent(this, CrashReporterActivity.class); startActivity(intent); finish(); return; } // connect to tasks boolean isWorking = false; isWorking = connectToTask(LoadTargetLanguagesTask.TASK_ID) ? true : isWorking; isWorking = connectToTask(InitializeLibraryTask.TASK_ID) ? true : isWorking; isWorking = connectToTask(UpdateAppTask.TASK_ID) ? true : isWorking; // start new task if (!isWorking) { UpdateAppTask updateTask = new UpdateAppTask(AppContext.context()); updateTask.addOnFinishedListener(this); updateTask.addOnStartListener(this); TaskManager.addTask(updateTask, UpdateAppTask.TASK_ID); } } } /** * Connect to an existing task * @param id * @return true if the task exists */ private boolean connectToTask(String id) { ManagedTask t = TaskManager.getTask(id); if(t != null) { t.addOnFinishedListener(this); t.addOnStartListener(this); return true; } else { return false; } } /** * Disconnects this activity from a task * @param t */ private void disconnectTask(ManagedTask t) { if(t != null) { t.removeOnStartListener(this); t.removeOnFinishedListener(this); } } /** * Disconnects this activity from a task * @param id */ private void disconnectTask(String id) { ManagedTask t = TaskManager.getTask(id); disconnectTask(t); } @Override public void onFinished(final ManagedTask task) { TaskManager.clearTask(task); disconnectTask(task); Handler hand = new Handler(Looper.getMainLooper()); hand.post(new Runnable() { @Override public void run() { mProgressBar.setIndeterminate(true); mProgressBar.setProgress(task.maxProgress()); } }); if(task instanceof UpdateAppTask) { if(!AppContext.getLibrary().exists()) { InitializeLibraryTask libraryTask = new InitializeLibraryTask(); libraryTask.addOnFinishedListener(this); libraryTask.addOnStartListener(this); TaskManager.addTask(libraryTask, InitializeLibraryTask.TASK_ID); } else { // skip straight to loading languages if library is already initialized LoadTargetLanguagesTask langTask = new LoadTargetLanguagesTask(); langTask.addOnFinishedListener(this); langTask.addOnStartListener(this); TaskManager.addTask(langTask, LoadTargetLanguagesTask.TASK_ID); } } else if(task instanceof InitializeLibraryTask) { LoadTargetLanguagesTask langTask = new LoadTargetLanguagesTask(); langTask.addOnFinishedListener(this); langTask.addOnStartListener(this); TaskManager.addTask(langTask, LoadTargetLanguagesTask.TASK_ID); } else if(task instanceof LoadTargetLanguagesTask) { openMainActivity(); } } private void openMainActivity() { Intent intent = new Intent(this, ProfileActivity.class); startActivity(intent); finish(); } @Override public void onStart(final ManagedTask task) { Handler hand = new Handler(Looper.getMainLooper()); hand.post(new Runnable() { @Override public void run() { if(task instanceof UpdateAppTask) { mProgressTextView.setText(R.string.updating_app); } else if(task instanceof InitializeLibraryTask) { mProgressTextView.setText(R.string.preparing_for_first_use); } else if(task instanceof LoadTargetLanguagesTask) { mProgressTextView.setText(R.string.loading_languages); } } }); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("message", mProgressTextView.getText().toString()); outState.putInt("progress", mProgressBar.getProgress()); super.onSaveInstanceState(outState); } @Override public void onDestroy() { disconnectTask(LoadTargetLanguagesTask.TASK_ID); disconnectTask(InitializeLibraryTask.TASK_ID); disconnectTask(UpdateAppTask.TASK_ID); super.onDestroy(); } }