package com.door43.translationstudio.newui.library; import android.app.AlertDialog; import android.app.ProgressDialog; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.design.widget.Snackbar; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import com.door43.translationstudio.R; import com.door43.translationstudio.core.Library; import com.door43.translationstudio.core.Project; import com.door43.translationstudio.dialogs.CustomAlertDialog; import com.door43.translationstudio.newui.BaseActivity; import com.door43.translationstudio.tasks.DownloadAllProjectsTask; import com.door43.translationstudio.tasks.DownloadUpdatesTask; import com.door43.translationstudio.tasks.GetLibraryUpdatesTask; import com.door43.translationstudio.AppContext; import com.door43.util.tasks.ManagedTask; import com.door43.util.tasks.TaskManager; import com.door43.widget.ViewUtil; import java.text.NumberFormat; import java.util.Locale; public class ServerLibraryActivity extends BaseActivity implements ServerLibraryDetailFragment.OnEventListener, ServerLibraryFragment.OnClickListener, ManagedTask.OnFinishedListener, ManagedTask.OnProgressListener, DialogInterface.OnCancelListener { public static final String ARG_SHOW_UPDATES = "only_show_updates"; public static final String ARG_SHOW_NEW = "only_show_new"; private CustomAlertDialog mConfirmDialog; /** * Whether or not the activity is in two-pane mode, i.e. running on a tablet * device. */ private boolean mTwoPane; private Toolbar mToolbar; private ProgressDialog mProgressDialog; private ServerLibraryFragment mListFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_server_library_list); // set up tool bar mToolbar = (Toolbar)findViewById(R.id.toolbar_server_library); setSupportActionBar(mToolbar); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); mListFragment = ((ServerLibraryFragment) getSupportFragmentManager().findFragmentById(R.id.project_list)); if(mListFragment != null) { mListFragment.setActivatedPosition(ListView.INVALID_POSITION); } // Identify two pane mode (large screens) if (findViewById(R.id.detail_container) != null) { mTwoPane = true; mListFragment.setActivateOnItemClick(true); } if(savedInstanceState == null) { // check for available updates GetLibraryUpdatesTask getUpdatesTask = new GetLibraryUpdatesTask(); getUpdatesTask.addOnFinishedListener(this); getUpdatesTask.addOnProgressListener(this); TaskManager.addTask(getUpdatesTask, GetLibraryUpdatesTask.TASK_ID); } else { // populated cached data Library serverLibrary = AppContext.getLibrary(); Project[] projects = serverLibrary.getProjects(Locale.getDefault().getLanguage()); mListFragment.setData(serverLibrary.getAvailableUpdates(), projects); // connect to tasks DownloadAllProjectsTask downloadAllTask = (DownloadAllProjectsTask)TaskManager.getTask(DownloadAllProjectsTask.TASK_ID); DownloadUpdatesTask downloadUpdatesTask = (DownloadUpdatesTask)TaskManager.getTask(DownloadUpdatesTask.TASK_ID); GetLibraryUpdatesTask getUpdatesTask = (GetLibraryUpdatesTask)TaskManager.getTask(GetLibraryUpdatesTask.TASK_ID); if(downloadAllTask != null) { downloadAllTask.addOnProgressListener(this); downloadAllTask.addOnFinishedListener(this); } if(downloadUpdatesTask != null) { downloadUpdatesTask.addOnProgressListener(this); downloadUpdatesTask.addOnFinishedListener(this); } if(getUpdatesTask != null) { getUpdatesTask.addOnProgressListener(this); getUpdatesTask.addOnFinishedListener(this); } } } /** * Callback method from {@link ServerLibraryFragment.OnClickListener} * indicating that the item with the given ID was selected. */ @Override public void onProjectSelected(String projectId) { if(projectId != null) { if (mTwoPane) { Bundle arguments = getIntent().getExtras(); if(arguments == null) { arguments = new Bundle(); } arguments.putString(ServerLibraryDetailFragment.ARG_PROJECT_ID, projectId); // TODO: animate the card fading in and out. ServerLibraryDetailFragment fragment = (ServerLibraryDetailFragment)getFragmentManager().findFragmentById(R.id.detail_container); if(fragment == null) { fragment = new ServerLibraryDetailFragment(); fragment.setArguments(arguments); getFragmentManager().beginTransaction().replace(R.id.detail_container, fragment).commit(); } else { fragment.setProjectId(projectId); } } else { // In single-pane mode, simply start the detail activity // for the selected item ID. Intent detailIntent = new Intent(this, ProjectLibraryDetailActivity.class); Bundle arguments = getIntent().getExtras(); if(arguments == null) { arguments = new Bundle(); } if (arguments != null) { detailIntent.putExtras(arguments); } detailIntent.putExtra(ServerLibraryDetailFragment.ARG_PROJECT_ID, projectId); startActivity(detailIntent); } } else { reload(false); } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_server_library, menu); return super.onCreateOptionsMenu(menu); } /** * Connects to an existing task */ public void connectDownloadTasks() { DownloadAllProjectsTask downloadAllProjectsTask = (DownloadAllProjectsTask)TaskManager.getTask(DownloadAllProjectsTask.TASK_ID); DownloadUpdatesTask downloadUpdatesTask = (DownloadUpdatesTask)TaskManager.getTask(DownloadUpdatesTask.TASK_ID); if(downloadAllProjectsTask != null) { // connect to existing task downloadAllProjectsTask.addOnProgressListener(this); downloadAllProjectsTask.addOnFinishedListener(this); } else if(downloadUpdatesTask != null) { // connect to existing task downloadUpdatesTask.addOnProgressListener(this); downloadUpdatesTask.addOnProgressListener(this); } else { onFinished(null); } } @Override public boolean onPrepareOptionsMenu(Menu menu) { // hook up the search SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE); final MenuItem searchMenuItem = menu.findItem(R.id.action_search); final SearchView searchViewAction = (SearchView) MenuItemCompat.getActionView(searchMenuItem); searchViewAction.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return true; } @Override public boolean onQueryTextChange(String s) { search(s); return true; } }); searchViewAction.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); // display download updates if(AppContext.getLibrary().getAvailableUpdates().numSourceTranslationUpdates() > 0) { menu.findItem(R.id.action_download_updates).setVisible(true); } else { menu.findItem(R.id.action_download_updates).setVisible(false); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_download_all: mConfirmDialog = CustomAlertDialog.Create(this); mConfirmDialog.setTitle(R.string.action_download_all) .setMessage(R.string.download_confirmation) .setIcon(R.drawable.ic_cloud_download_black_24dp) .setPositiveButton(R.string.yes, new View.OnClickListener() { @Override public void onClick(View v) { DownloadAllProjectsTask task = (DownloadAllProjectsTask)TaskManager.getTask(DownloadAllProjectsTask.TASK_ID); if(task == null) { // start new task task = new DownloadAllProjectsTask(); task.addOnProgressListener(ServerLibraryActivity.this); task.addOnFinishedListener(ServerLibraryActivity.this); TaskManager.addTask(task, DownloadAllProjectsTask.TASK_ID); } else { connectDownloadTasks(); } } }) .setNegativeButton(R.string.no, null) .show("DlAllConfirm"); return true; case R.id.action_download_updates: mConfirmDialog = CustomAlertDialog.Create(this); mConfirmDialog.setTitle(R.string.action_download_updates) .setMessage(R.string.download_confirmation) .setIcon(R.drawable.ic_cloud_download_black_24dp) .setPositiveButton(R.string.yes, new View.OnClickListener() { @Override public void onClick(View v) { DownloadUpdatesTask task = (DownloadUpdatesTask)TaskManager.getTask(DownloadUpdatesTask.TASK_ID); if(task == null) { // start new task task = new DownloadUpdatesTask(AppContext.getLibrary().getAvailableUpdates()); task.addOnProgressListener(ServerLibraryActivity.this); task.addOnFinishedListener(ServerLibraryActivity.this); TaskManager.addTask(task, DownloadUpdatesTask.TASK_ID); } else { connectDownloadTasks(); } } }) .setNegativeButton(R.string.no, null) .show("DlUpdateConfirm"); return true; case R.id.action_search: return true; default: return super.onOptionsItemSelected(item); } } private void reload(boolean scrollToTop) { invalidateOptionsMenu(); if(mTwoPane) { // remove details if(getFragmentManager().findFragmentById(R.id.detail_container) != null) { getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.detail_container)).commit(); } } // reload list mListFragment.reload(scrollToTop); } public void onDestroy() { if(mConfirmDialog != null) { mConfirmDialog.dismiss(); } if(mProgressDialog != null) { mProgressDialog.dismiss(); } DownloadAllProjectsTask downloadAllProjectsTask = (DownloadAllProjectsTask)TaskManager.getTask(DownloadAllProjectsTask.TASK_ID); if(downloadAllProjectsTask != null) { downloadAllProjectsTask.removeOnFinishedListener(this); downloadAllProjectsTask.removeOnProgressListener(this); } DownloadUpdatesTask downloadUpdatesTask = (DownloadUpdatesTask)TaskManager.getTask(DownloadUpdatesTask.TASK_ID); if(downloadUpdatesTask != null) { downloadUpdatesTask.removeOnFinishedListener(this); downloadUpdatesTask.removeOnProgressListener(this); } GetLibraryUpdatesTask getLibraryUpdatesTask = (GetLibraryUpdatesTask)TaskManager.getTask(GetLibraryUpdatesTask.TASK_ID); if(getLibraryUpdatesTask != null) { getLibraryUpdatesTask.removeOnFinishedListener(this); getLibraryUpdatesTask.removeOnProgressListener(this); } super.onDestroy(); } @Override protected void onNewIntent(Intent intent) { handleIntent(intent); } /** * Handles the search * @param intent */ private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); search(query); } } /** * Performs the search * @param query */ private void search(String query) { mListFragment.filter(query); } @Override public void onFinished(final ManagedTask task) { TaskManager.clearTask(task); Handler hand = new Handler(Looper.getMainLooper()); hand.post(new Runnable() { @Override public void run() { invalidateOptionsMenu(); Library serverLibrary = AppContext.getLibrary(); Project[] projects = serverLibrary.getProjects(Locale.getDefault().getLanguage()); mListFragment.setData(serverLibrary.getAvailableUpdates(), projects); if(mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } mProgressDialog = null; if(task instanceof DownloadAllProjectsTask || task instanceof DownloadUpdatesTask) { if (!task.isCanceled()) { CustomAlertDialog.Create(ServerLibraryActivity.this) .setTitle(R.string.success) .setIcon(R.drawable.ic_done_black_24dp) .setMessage(R.string.download_complete) .setCancelableChainable(false) .setPositiveButton(R.string.label_ok, null) .show("DlComplete"); } } } }); } @Override public void onProgress(final ManagedTask task, final double progress, final String message, final boolean secondary) { if(!task.isFinished()) { Handler hand = new Handler(Looper.getMainLooper()); hand.post(new Runnable() { @Override public void run() { if (task.isFinished()) { // because we start on a new thread we need to make sure the task didn't finish while this thread was starting. if (mProgressDialog != null) { mProgressDialog.dismiss(); } return; } if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(ServerLibraryActivity.this); mProgressDialog.setCancelable(true); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCanceledOnTouchOutside(false); mProgressDialog.setOnCancelListener(ServerLibraryActivity.this); mProgressDialog.setIcon(R.drawable.ic_cloud_download_black_24dp); if(task instanceof GetLibraryUpdatesTask) { mProgressDialog.setTitle(getResources().getString(R.string.checking_for_updates)); } else if(task instanceof DownloadAllProjectsTask) { mProgressDialog.setTitle(getResources().getString(R.string.downloading)); } else if(task instanceof DownloadUpdatesTask) { mProgressDialog.setTitle(getResources().getString(R.string.downloading)); } mProgressDialog.setMessage(""); } mProgressDialog.setMax(task.maxProgress()); if (!mProgressDialog.isShowing()) { mProgressDialog.show(); } if (progress == -1) { mProgressDialog.setIndeterminate(true); mProgressDialog.setProgress(mProgressDialog.getMax()); mProgressDialog.setProgressNumberFormat(null); mProgressDialog.setProgressPercentFormat(null); } else { mProgressDialog.setIndeterminate(false); if(secondary) { mProgressDialog.setSecondaryProgress((int)progress); } else { mProgressDialog.setProgress((int) progress); } mProgressDialog.setProgressNumberFormat("%1d/%2d"); mProgressDialog.setProgressPercentFormat(NumberFormat.getPercentInstance()); } if ((task instanceof DownloadAllProjectsTask || task instanceof DownloadUpdatesTask) && !message.isEmpty()) { mProgressDialog.setMessage(String.format(getResources().getString(R.string.downloading_project), message)); } else { mProgressDialog.setMessage(""); } } }); } } @Override public void onCancel(DialogInterface dialogInterface) { // the dialog was canceled mProgressDialog = null; DownloadAllProjectsTask downloadAllProjectsTask = (DownloadAllProjectsTask) TaskManager.getTask(DownloadAllProjectsTask.TASK_ID); if(downloadAllProjectsTask != null) { TaskManager.cancelTask(downloadAllProjectsTask); } DownloadUpdatesTask downloadUpdatesTask = (DownloadUpdatesTask) TaskManager.getTask(DownloadUpdatesTask.TASK_ID); if(downloadUpdatesTask != null) { TaskManager.cancelTask(downloadUpdatesTask); } GetLibraryUpdatesTask getLibraryUpdatesTask = (GetLibraryUpdatesTask) TaskManager.getTask(GetLibraryUpdatesTask.TASK_ID); if(getLibraryUpdatesTask != null) { TaskManager.cancelTask(getLibraryUpdatesTask); // warn user they may not see all the available updates Snackbar snack = Snackbar.make(findViewById(android.R.id.content), R.string.list_may_be_outdated, Snackbar.LENGTH_LONG); ViewUtil.setSnackBarTextColor(snack, getResources().getColor(R.color.light_primary_text)); snack.show(); } } @Override public void onSourceLanguageDownloaded(String projectId, String sourceLanguageId) { mListFragment.reload(false); } @Override public void onProjectDeleted(String projectId) { invalidateOptionsMenu(); mListFragment.reload(false); onProjectSelected(projectId); } }