package com.nutomic.syncthingandroid.util;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.nutomic.syncthingandroid.BuildConfig;
import com.nutomic.syncthingandroid.R;
import com.nutomic.syncthingandroid.syncthing.RestApi;
import java.util.HashMap;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.nutomic.syncthingandroid.syncthing.RestApi.readableFileSize;
/**
* Generates item views for folder items.
*/
public class FoldersAdapter extends ArrayAdapter<RestApi.Folder>
implements RestApi.OnReceiveModelListener {
private final HashMap<String, RestApi.Model> mModels = new HashMap<>();
private final LayoutInflater mInflater;
public FoldersAdapter(Context context) {
super(context, R.layout.item_folder_list);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
@NonNull
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
if (convertView == null)
convertView = mInflater.inflate(R.layout.item_folder_list, parent, false);
TextView label = (TextView) convertView.findViewById(R.id.label);
TextView state = (TextView) convertView.findViewById(R.id.state);
TextView directory = (TextView) convertView.findViewById(R.id.directory);
TextView items = (TextView) convertView.findViewById(R.id.items);
TextView size = (TextView) convertView.findViewById(R.id.size);
TextView invalid = (TextView) convertView.findViewById(R.id.invalid);
RestApi.Folder folder = getItem(position);
RestApi.Model model = mModels.get(folder.id);
label.setText(TextUtils.isEmpty(folder.label) ? folder.id : folder.label);
state.setTextColor(ContextCompat.getColor(getContext(), R.color.text_green));
directory.setText(folder.path);
if (model != null) {
int percentage = (model.globalBytes != 0)
? Math.round(100 * model.inSyncBytes / model.globalBytes)
: 100;
state.setText(getLocalizedState(getContext(), model.state, percentage));
items.setVisibility(VISIBLE);
items.setText(getContext()
.getString(R.string.files, model.inSyncFiles, model.globalFiles));
size.setVisibility(VISIBLE);
size.setText(getContext().getString(R.string.folder_size_format,
readableFileSize(getContext(), model.inSyncBytes),
readableFileSize(getContext(), model.globalBytes)));
setTextOrHide(invalid, model.invalid);
} else {
items.setVisibility(GONE);
size.setVisibility(GONE);
setTextOrHide(invalid, folder.invalid);
}
return convertView;
}
/**
* Returns the folder's state as a localized string.
*/
public static String getLocalizedState(Context c, String state, int percentage) {
switch (state) {
case "idle": return c.getString(R.string.state_idle);
case "scanning": return c.getString(R.string.state_scanning);
case "cleaning": return c.getString(R.string.state_cleaning);
case "syncing": return c.getString(R.string.state_syncing, percentage);
case "error": return c.getString(R.string.state_error);
case "unknown": // Fallthrough
case "": return c.getString(R.string.state_unknown);
}
if (BuildConfig.DEBUG) {
throw new AssertionError("Unexpected folder state " + state);
}
return "";
}
/**
* Requests updated model info from the api for all visible items.
*/
public void updateModel(RestApi api) {
for (int i = 0; i < getCount(); i++) {
api.getModel(getItem(i).id, this);
}
}
@Override
public void onReceiveModel(String folderId, RestApi.Model model) {
mModels.put(folderId, model);
notifyDataSetChanged();
}
private void setTextOrHide(TextView view, String text) {
if (TextUtils.isEmpty(text)) {
view.setVisibility(GONE);
} else {
view.setText(text);
view.setVisibility(VISIBLE);
}
}
}