package co.smartreceipts.android.sync.widget.backups; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.TimeZone; import co.smartreceipts.android.R; import co.smartreceipts.android.activities.NavigationHandler; import co.smartreceipts.android.model.utils.ModelUtils; import co.smartreceipts.android.settings.UserPreferenceManager; import co.smartreceipts.android.settings.catalog.UserPreference; import co.smartreceipts.android.sync.BackupProvidersManager; import co.smartreceipts.android.sync.model.RemoteBackupMetadata; import co.smartreceipts.android.sync.network.NetworkManager; import co.smartreceipts.android.sync.network.SupportedNetworkType; public class RemoteBackupsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int TYPE_HEADER = 0; private static final int TYPE_ITEM = 1; private final View headerView; private final NavigationHandler navigationHandler; private final BackupProvidersManager backupProvidersManager; private final UserPreferenceManager preferences; private final NetworkManager networkManager; private final List<RemoteBackupMetadata> backupMetadataList; public RemoteBackupsListAdapter(@NonNull View headerView, @NonNull NavigationHandler navigationHandler, @NonNull BackupProvidersManager backupProvidersManager, @NonNull UserPreferenceManager preferences, @NonNull NetworkManager networkManager) { this(headerView, navigationHandler, backupProvidersManager, preferences, networkManager, Collections.<RemoteBackupMetadata>emptyList()); } public RemoteBackupsListAdapter(@NonNull View headerView, @NonNull NavigationHandler navigationHandler, @NonNull BackupProvidersManager backupProvidersManager, @NonNull UserPreferenceManager preferences, @NonNull NetworkManager networkManager, @NonNull List<RemoteBackupMetadata> backupMetadataList) { this.headerView = Preconditions.checkNotNull(headerView); this.navigationHandler = Preconditions.checkNotNull(navigationHandler); this.backupProvidersManager = Preconditions.checkNotNull(backupProvidersManager); this.preferences = Preconditions.checkNotNull(preferences); this.networkManager = Preconditions.checkNotNull(networkManager); this.backupMetadataList = new ArrayList<>(backupMetadataList); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_HEADER) { return new HeaderViewHolder(headerView); } else { final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.remote_backups_list_item, parent, false); return new ItemViewHolder(view); } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof ItemViewHolder) { final ItemViewHolder itemHolder = (ItemViewHolder) holder; final Context context = itemHolder.backupDeviceNameTextView.getContext(); final RemoteBackupMetadata metadata = backupMetadataList.get(position - 1); if (metadata.getSyncDeviceId().equals(backupProvidersManager.getDeviceSyncId())) { itemHolder.backupDeviceNameTextView.setText(context.getString(R.string.existing_remote_backup_current_device, metadata.getSyncDeviceName())); } else { itemHolder.backupDeviceNameTextView.setText(metadata.getSyncDeviceName()); } itemHolder.backupProviderTextView.setText(R.string.auto_backup_source_google_drive); itemHolder.backupDateTextView.setText(ModelUtils.getFormattedDate(metadata.getLastModifiedDate(), TimeZone.getDefault(), context, preferences.get(UserPreference.General.DateSeparator))); final View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View view) { final PopupMenu popupMenu = new PopupMenu(context, itemHolder.backupOverflowView); popupMenu.getMenuInflater().inflate(R.menu.remote_backups_list_item_menu, popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (!networkManager.isNetworkAvailable() && networkManager.getSupportedNetworkType() == SupportedNetworkType.WifiOnly) { Toast.makeText(headerView.getContext(), headerView.getContext().getString(R.string.error_no_wifi), Toast.LENGTH_SHORT).show(); return true; } else { if (item.getItemId() == R.id.remote_backups_list_item_menu_restore) { navigationHandler.showDialog(ImportRemoteBackupDialogFragment.newInstance(metadata)); return true; } else if (item.getItemId() == R.id.remote_backups_list_item_menu_delete) { navigationHandler.showDialog(DeleteRemoteBackupDialogFragment.newInstance(metadata)); return true; } else if (item.getItemId() == R.id.remote_backups_list_item_menu_download_images) { navigationHandler.showDialog(DownloadRemoteBackupImagesProgressDialogFragment.newInstance(metadata)); return true; } else if (item.getItemId() == R.id.remote_backups_list_item_menu_download_images_debug) { navigationHandler.showDialog(DownloadRemoteBackupImagesProgressDialogFragment.newInstance(metadata, true)); return true; } else { throw new IllegalArgumentException("Unsupported menu type was selected"); } } } }); popupMenu.show(); } }; itemHolder.parentView.setOnClickListener(onClickListener); itemHolder.backupOverflowView.setOnClickListener(onClickListener); } } @Override public int getItemCount() { return backupMetadataList.size() + 1; } @Override public int getItemViewType(int position) { if (position == 0) { return TYPE_HEADER; } else { return TYPE_ITEM; } } private static class HeaderViewHolder extends RecyclerView.ViewHolder { final View headerView; HeaderViewHolder(@NonNull View view) { super(view); headerView = view; } } private static class ItemViewHolder extends RecyclerView.ViewHolder { final View parentView; final TextView backupDeviceNameTextView; final TextView backupProviderTextView; final TextView backupDateTextView; final ImageView backupOverflowView; ItemViewHolder(@NonNull View view) { super(view); parentView = view; backupDeviceNameTextView = (TextView) view.findViewById(R.id.remote_backup_device_name); backupProviderTextView = (TextView) view.findViewById(R.id.remote_backup_provider); backupDateTextView = (TextView) view.findViewById(R.id.remote_backup_date); backupOverflowView = (ImageView) view.findViewById(R.id.remote_backup_metadata_overflow); } } }