/*
* Copyright 2014 Yaroslav Mytkalyk
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.docd.purefm.adapters;
import com.docd.purefm.R;
import com.docd.purefm.file.CommandLineFile;
import com.docd.purefm.file.GenericFile;
import com.docd.purefm.utils.PFMFileUtils;
import com.docd.purefm.utils.PFMTextUtils;
import com.docd.purefm.ui.view.OverlayImageView;
import android.app.Activity;
import android.graphics.Typeface;
import android.support.v4.util.LongSparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.support.annotation.NonNull;
import java.math.BigInteger;
/**
* Browser adapter for ListView
* @author Doctoror
*/
public final class BrowserListAdapter extends BrowserBaseAdapter {
@NonNull
private final Typeface mTypefaceMonospace;
@NonNull
private final LongSparseArray<String> mHumanReadableLastModified = new LongSparseArray<>();
@NonNull
private final LongSparseArray<String> mHumanReadableLength = new LongSparseArray<>();
public BrowserListAdapter(@NonNull final Activity context) {
super(context);
mTypefaceMonospace = Typeface.createFromAsset(context.getAssets(), "DroidSansMono.ttf");
}
@Override
public View getView(int pos, View v, ViewGroup arg2) {
if (pos >= this.getCount()) {
//workaround for indexOutOfBoundsException when deleting from adapter
// and notifyDataSetChanged is not yet called
return v;
}
Holder h;
if (v == null) {
v = this.mLayoutInflater
.inflate(R.layout.list_item_file, arg2, false);
if (v == null) {
throw new RuntimeException("Inflated View is null");
}
h = new Holder();
h.mIcon = (OverlayImageView) v.findViewById(android.R.id.icon);
h.mTitle = (TextView) v.findViewById(android.R.id.title);
h.mDate = (TextView) v.findViewById(android.R.id.text1);
h.mPerm = (TextView) v.findViewById(android.R.id.text2);
h.mSize = (TextView) v.findViewById(R.id.size);
h.mDate.setTypeface(this.mTypefaceMonospace);
h.mPerm.setTypeface(this.mTypefaceMonospace);
h.mSize.setTypeface(this.mTypefaceMonospace);
v.setTag(h);
} else {
h = (Holder) v.getTag();
}
final GenericFile f = this.getItem(pos);
this.setIcon(f, h.mIcon, false);
this.applyOverlay(f, h.mIcon);
if (mSettings.listShowPreviewsEnabled()) {
loadPreview(f, h.mIcon);
}
h.mTitle.setText(f.getName());
if (mSettings.listShowModifiedDateEnabled()) {
final long lastModified = f.lastModified();
String humanReadableLastModified = mHumanReadableLastModified.get(lastModified);
if (humanReadableLastModified == null) {
humanReadableLastModified = PFMTextUtils.humanReadableDate(
lastModified,
f instanceof CommandLineFile);
mHumanReadableLastModified.put(lastModified, humanReadableLastModified);
}
h.mDate.setText(humanReadableLastModified);
} else {
h.mDate.setText(null);
}
if (mSettings.listShowFileSizeEnabled() && !f.isDirectory()) {
final long fileSize = f.length();
String humanReadableFileSize = mHumanReadableLength.get(fileSize);
if (humanReadableFileSize == null) {
humanReadableFileSize = PFMFileUtils.byteCountToDisplaySize(BigInteger.valueOf(fileSize));
mHumanReadableLength.put(fileSize, humanReadableFileSize);
}
h.mSize.setText(humanReadableFileSize);
} else {
h.mSize.setText(null);
}
if (mSettings.listShowPermissionsEnabled()) {
h.mPerm.setText(f.getPermissions().toString());
} else {
h.mPerm.setText(null);
}
return v;
}
private static final class Holder {
Holder() {}
OverlayImageView mIcon;
TextView mTitle;
TextView mSize;
TextView mDate;
TextView mPerm;
}
}