package com.door43.translationstudio.filebrowser; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.door43.translationstudio.AppContext; import com.door43.translationstudio.R; import com.door43.translationstudio.core.ArchiveDetails; import com.door43.translationstudio.core.Library; import com.door43.translationstudio.core.Util; import com.door43.util.tasks.ThreadableUI; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Locale; /** * Handles the rendering of the file browser activity */ public class DocumentFileBrowserAdapter extends BaseAdapter { private List<DocumentFileItem> mFiles = new ArrayList<>(); private int mSelectedPosition = -1; public void loadFiles(Context context, List<DocumentFileItem> files) { final Library library = AppContext.getLibrary(); mFiles = files; new ThreadableUI(context) { @Override public void onStop() { } @Override public void run() { for(DocumentFileItem item:mFiles) { if(item.isTranslationArchive()) { item.inspect(Locale.getDefault().getLanguage(), library); } } } @Override public void onPostExecute() { sortFiles(mFiles); notifyDataSetChanged(); } }.start(); } @Override public int getCount() { return mFiles.size(); } @Override public DocumentFileItem getItem(int i) { return mFiles.get(i); } @Override public long getItemId(int i) { return 0; } @Override public View getView(final int position, View convertView, final ViewGroup parent) { View v = convertView; ViewHolder holder; if(convertView == null) { v = LayoutInflater.from(parent.getContext()).inflate(R.layout.dialog_file_item, null); holder = new ViewHolder(v); } else { holder = (ViewHolder)v.getTag(); } if(mSelectedPosition == position) { v.setBackgroundColor(parent.getContext().getResources().getColor(R.color.accent_light)); } else { Drawable currentBackground = v.getBackground(); if(currentBackground != null) { v.setBackgroundDrawable(null); // clear background } } DocumentFileItem item = getItem(position); holder.icon.setImageResource(item.getIconResource()); boolean isBackupsDir = item.isBackupsDir(); if(isBackupsDir) { holder.title.setText(parent.getContext().getResources().getString(R.string.automatic_backups)); } else { holder.title.setText(item.getTitle()); } holder.archiveDetails.setVisibility(View.GONE); holder.title.setTextColor(parent.getContext().getResources().getColor(R.color.dark_secondary_text)); if(holder.archiveDetails.getChildCount() > 0) { holder.archiveDetails.removeAllViews(); } if(item.isTranslationArchive() && item.getArchiveDetails() != null) { ArchiveDetails details = item.getArchiveDetails(); holder.archiveDetails.setVisibility(View.VISIBLE); DateFormat format = DateFormat.getDateTimeInstance(); Date date = Util.dateFromUnixTime(details.createdAt); holder.title.setText(format.format(date)); // display complex archive info for (ArchiveDetails.TargetTranslationDetails td : details.targetTranslationDetails) { TextView targetTranslationTextView = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.dialog_file_sub_item, null); targetTranslationTextView.setText(td.projectName + " - " + td.targetLanguageName); holder.archiveDetails.addView(targetTranslationTextView); } } if(isBackupsDir) { holder.title.setTextColor(parent.getContext().getResources().getColor(R.color.dark_primary_text)); } return v; } private static class ViewHolder { private final ImageView icon; private final TextView title; private final LinearLayout archiveDetails; // public ThreadableUI inspectThread; public ViewHolder(View v) { this.title = (TextView)v.findViewById(R.id.title); this.icon = (ImageView)v.findViewById(R.id.icon); this.archiveDetails = (LinearLayout)v.findViewById(R.id.archive_details); v.setTag(this); } } /** * Sorts target languages by id * @param files */ private static void sortFiles(List<DocumentFileItem> files) { Collections.sort(files, new Comparator<DocumentFileItem>() { @Override public int compare(DocumentFileItem lhs, DocumentFileItem rhs) { int sort = 0; if (lhs.isUpButton || rhs.isUpButton) { // up button is always first sort = lhs.isUpButton ? -1 : 1; } else if (lhs.isBackupsDir()) { // backup dir is after archives if (rhs.isTranslationArchive()) { return 1; } else { return -1; } } else if (rhs.isBackupsDir()) { // backup dir is after archives if (lhs.isTranslationArchive()) { return -1; } else { return 1; } } else if (lhs.isTranslationArchive() && rhs.isTranslationArchive()) { // sort by date (if the archive has been inspected) if (lhs.getArchiveDetails() != null && rhs.getArchiveDetails() != null) { long lhsCreated = lhs.getArchiveDetails().createdAt; long rhsCreated = rhs.getArchiveDetails().createdAt; if (lhsCreated > rhsCreated) { sort = -1; } else if (lhsCreated < rhsCreated) { sort = 1; } } } else if (!lhs.isTranslationArchive() && !rhs.isTranslationArchive()) { // sort by name sort = lhs.getTitle().compareToIgnoreCase(rhs.getTitle()); } else { // archives are before regular files sort = lhs.isTranslationArchive() ? -1 : 1; } return sort; } }); } public int getSelectedPosition() { return mSelectedPosition; } public void setSelectedPosition(int mSelectedPosition) { this.mSelectedPosition = mSelectedPosition; } }