package com.door43.translationstudio.newui.library;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.door43.translationstudio.R;
import com.door43.translationstudio.core.LibraryUpdates;
import com.door43.translationstudio.core.SourceLanguage;
import com.door43.translationstudio.core.Typography;
import com.door43.translationstudio.tasks.DownloadSourceLanguageTask;
import com.door43.translationstudio.AppContext;
import com.door43.util.tasks.ManagedTask;
import com.door43.util.tasks.TaskManager;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* This adpater handles the display of source languages in the server library
*/
public class ServerLibraryLanguageAdapter extends BaseAdapter {
private final Context mContext;
private String mProjectId = null;
private ListItem[] items;
private LibraryUpdates mUpdates;
public ServerLibraryLanguageAdapter(Context context) {
mContext = context;
}
@Override
public int getCount() {
if(items == null) {
return 0;
} else {
return items.length;
}
}
@Override
public ListItem getItem(int i) {
return items[i];
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
View v = view;
ViewHolder holder;
if(view == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.fragment_server_library_languages_item, null);
holder = new ViewHolder(v);
} else {
holder = (ViewHolder)v.getTag();
}
ListItem item = getItem(position);
// disconnect from task
DownloadSourceLanguageTask task = (DownloadSourceLanguageTask)TaskManager.getTask(mProjectId + "-" + item.sourceLanguage.getId());
if(task != null) {
task.removeOnFinishedListener(item.onFinishedListener);
task.removeOnProgressListener(item.onProgressListener);
}
// icon
boolean isDownloaded = AppContext.getLibrary().sourceLanguageHasSource(mProjectId, item.sourceLanguage.getId());
if(isDownloaded) {
holder.mStatus.setBackgroundResource(R.drawable.ic_bookmark_black_24dp);
} else {
holder.mStatus.setBackgroundResource(0);
}
// identify updates
if(isDownloaded && mUpdates.hasSourceLanguageUpdate(mProjectId, item.sourceLanguage.getId())) {
holder.mStatus.setBackgroundResource(R.drawable.ic_refresh_black_24dp);
}
// name
holder.mName.setText(getItem(position).sourceLanguage.name);
holder.mCode.setText(getItem(position).sourceLanguage.code);
Typography.format(mContext, holder.mName, getItem(position).sourceLanguage.getId(), getItem(position).sourceLanguage.direction);
// progress
holder.mProgressBar.setVisibility(View.GONE);
final ViewHolder staticHolder = holder;
// progress listener
item.onProgressListener = new ManagedTask.OnProgressListener() {
@Override
public void onProgress(final ManagedTask task, final double progress, String message, boolean secondary) {
Handler hand = new Handler(Looper.getMainLooper());
hand.post(new Runnable() {
@Override
public void run() {
staticHolder.mStatus.setBackgroundResource(R.drawable.ic_cloud_download_black_24dp);
staticHolder.mProgressBar.setVisibility(View.VISIBLE);
staticHolder.mProgressBar.setMax(task.maxProgress());
if (progress == -1) {
staticHolder.mProgressBar.setIndeterminate(true);
staticHolder.mProgressBar.setProgress(staticHolder.mProgressBar.getMax());
} else {
staticHolder.mProgressBar.setIndeterminate(false);
staticHolder.mProgressBar.setProgress((int)progress);
}
}
});
}
};
// finish listener
item.onFinishedListener = new ManagedTask.OnFinishedListener() {
@Override
public void onFinished(final ManagedTask task) {
TaskManager.clearTask(task);
Handler hand = new Handler(Looper.getMainLooper());
hand.post(new Runnable() {
@Override
public void run() {
staticHolder.mProgressBar.setVisibility(View.GONE);
if(((DownloadSourceLanguageTask)task).getSuccess()) {
staticHolder.mStatus.setBackgroundResource(R.drawable.ic_bookmark_black_24dp);
} else {
// TODO: the download failed notify the user with option to report bug
staticHolder.mStatus.setBackgroundResource(R.drawable.ic_warning_black_24dp);
}
}
});
}
};
// connect to task
if(task != null) {
task.addOnProgressListener(item.onProgressListener);
task.addOnFinishedListener(item.onFinishedListener);
}
return v;
}
/**
* Changes the dataset
* @param languages
*/
public void changeDataSet(String projectId, LibraryUpdates updates, List<SourceLanguage> languages) {
mProjectId = projectId;
sortSourceLanguages(languages, "");
mUpdates = updates;
items = new ListItem[languages.size()];
for(int i = 0; i < languages.size(); i ++) {
items[i] = new ListItem(languages.get(i));
}
notifyDataSetChanged();
}
/**
* Sorts source languages by id
* @param languages
* @param referenceId languages are sorted according to the reference id
*/
private static void sortSourceLanguages(List<SourceLanguage> languages, final CharSequence referenceId) {
Collections.sort(languages, new Comparator<SourceLanguage>() {
@Override
public int compare(SourceLanguage lhs, SourceLanguage rhs) {
String lhId = lhs.getId();
String rhId = rhs.getId();
// give priority to matches with the reference
if (lhId.startsWith(referenceId.toString().toLowerCase())) {
lhId = "!" + lhId;
}
if (rhId.startsWith(referenceId.toString().toLowerCase())) {
rhId = "!" + rhId;
}
return lhId.compareToIgnoreCase(rhId);
}
});
}
private class ViewHolder {
private final TextView mCode;
private final ImageView mStatus;
public TextView mName;
public ProgressBar mProgressBar;
public ViewHolder(View v) {
mName = (TextView)v.findViewById(R.id.language_name);
mCode = (TextView)v.findViewById(R.id.language_code);
mStatus = (ImageView)v.findViewById(R.id.status_icon);
mProgressBar = (ProgressBar)v.findViewById(R.id.progress_bar);
mProgressBar.setMax(100);
v.setTag(this);
}
}
public class ListItem {
public SourceLanguage sourceLanguage;
public ManagedTask.OnProgressListener onProgressListener;
public ManagedTask.OnFinishedListener onFinishedListener;
public ListItem(SourceLanguage sourceLanguage) {
this.sourceLanguage = sourceLanguage;
}
}
}