/* Copyright (C) 2015-2024 Andreas Shimokawa, Arjan Schrijver, Carsten
Pfeiffer, Daniele Gobbetti, José Rebelo
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see . */
package nodomain.freeyourgadget.gadgetbridge.adapter;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;
import androidx.recyclerview.widget.RecyclerView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.appmanager.AbstractAppManagerFragment;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp;
/**
* Adapter for displaying GBDeviceApp instances.
*/
public class GBDeviceAppAdapter extends RecyclerView.Adapter {
private final Logger LOG = LoggerFactory.getLogger(GBDeviceAppAdapter.class);
private final int mLayoutId;
private final List appList;
private final AbstractAppManagerFragment mParentFragment;
private final boolean allowReorder;
public List getAppList() {
return appList;
}
public GBDeviceAppAdapter(List list, int layoutId, AbstractAppManagerFragment parentFragment, boolean reorder) {
mLayoutId = layoutId;
appList = list;
mParentFragment = parentFragment;
allowReorder = reorder;
}
@Override
public long getItemId(int position) {
return appList.get(position).getUUID().getLeastSignificantBits();
}
@Override
public int getItemCount() {
return appList.size();
}
@Override
public GBDeviceAppAdapter.AppViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(mLayoutId, parent, false);
return new AppViewHolder(view);
}
@Override
public void onBindViewHolder(final AppViewHolder holder, int position) {
final GBDeviceApp deviceApp = appList.get(position);
String appVersionAuthor;
if ((deviceApp.getCreator().equals("")) || (deviceApp.getCreator().equals("(unknown)"))) {
appVersionAuthor = deviceApp.getVersion();
} else {
appVersionAuthor = GBApplication.getContext().getString(R.string.appversion_by_creator, deviceApp.getVersion(), deviceApp.getCreator());
}
holder.mDeviceAppVersionAuthorLabel.setText(appVersionAuthor);
if (deviceApp.isUpToDate()) {
holder.mDeviceAppOutdated.setVisibility(View.GONE);
} else {
holder.mDeviceAppOutdated.setVisibility(View.VISIBLE);
}
// FIXME: replace with small icons
String appNameLabelText = deviceApp.getName();
holder.mDeviceAppNameLabel.setText(appNameLabelText);
Bitmap previewImage = deviceApp.getPreviewImage();
holder.mPreviewImage.setImageBitmap(previewImage);
if (previewImage == null) {
holder.mPreviewImage.setVisibility(View.GONE);
} else {
holder.mPreviewImage.setVisibility(View.VISIBLE);
}
switch (deviceApp.getType()) {
case APP_GENERIC:
holder.mDeviceImageView.setImageResource(R.drawable.ic_watchapp);
break;
case APP_ACTIVITYTRACKER:
holder.mDeviceImageView.setImageResource(R.drawable.ic_activitytracker);
break;
case APP_SYSTEM:
holder.mDeviceImageView.setImageResource(R.drawable.ic_systemapp);
break;
case WATCHFACE:
holder.mDeviceImageView.setImageResource(R.drawable.ic_watchface);
break;
default:
holder.mDeviceImageView.setImageResource(R.drawable.ic_watchapp);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mParentFragment.onItemClick(view, deviceApp);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
return mParentFragment.openPopupMenu(view, deviceApp);
}
});
holder.mDragHandle.setVisibility(allowReorder ? View.VISIBLE : View.GONE);
holder.mDragHandle.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
mParentFragment.startDragging(holder);
return true;
}
});
}
public void onItemMove(int from, int to) {
Collections.swap(appList, from, to);
notifyItemMoved(from, to);
}
public class AppViewHolder extends RecyclerView.ViewHolder {
final TextView mDeviceAppVersionAuthorLabel;
final TextView mDeviceAppNameLabel;
final TextView mDeviceAppOutdated;
final ImageView mDeviceImageView;
final ImageView mDragHandle;
final ImageView mPreviewImage;
AppViewHolder(View itemView) {
super(itemView);
mDeviceAppVersionAuthorLabel = (TextView) itemView.findViewById(R.id.item_details);
mDeviceAppNameLabel = (TextView) itemView.findViewById(R.id.item_name);
mDeviceAppOutdated = (TextView) itemView.findViewById(R.id.item_watchapp_outdated);
mDeviceImageView = (ImageView) itemView.findViewById(R.id.item_image);
mDragHandle = (ImageView) itemView.findViewById(R.id.drag_handle);
mPreviewImage = (ImageView) itemView.findViewById(R.id.item_preview_image);
}
}
}