From 0774b5eda9bf430ea5f31b34885af07a8f91dc45 Mon Sep 17 00:00:00 2001 From: MRSa Date: Sat, 16 Mar 2019 00:18:09 +0900 Subject: [PATCH] =?utf8?q?=E9=95=B7=E6=8A=BC=E3=81=97=E3=81=A7=E7=94=BB?= =?utf8?q?=E5=83=8F=E3=81=AE=E9=81=B8=E6=8A=9E=E3=82=92=E3=81=A7=E3=81=8D?= =?utf8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=A6=E3=81=BF?= =?utf8?q?=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../pkremote/playback/ImageGridViewFragment.java | 87 ++++++++++++++++- .../MultiFileDownloadConfirmationDialog.java | 105 +++++++++++++++++++++ .../pkremote/playback/detail/CameraContentEx.java | 12 +++ .../playback/grid/ImageGridCellViewHolder.java | 9 +- .../playback/grid/ImageGridViewAdapter.java | 12 ++- app/src/main/res/drawable/ic_check_green_24dp.xml | 5 + .../main/res/drawable/ic_select_all_grey_24dp.xml | 5 + .../layout/dialog_confirmation_batch_download.xml | 82 ++++++++++++++++ app/src/main/res/layout/view_grid_cell.xml | 16 ++++ app/src/main/res/values/strings.xml | 10 ++ build.gradle | 2 +- 11 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/net/osdn/gokigen/pkremote/playback/MultiFileDownloadConfirmationDialog.java create mode 100644 app/src/main/res/drawable/ic_check_green_24dp.xml create mode 100644 app/src/main/res/drawable/ic_select_all_grey_24dp.xml create mode 100644 app/src/main/res/layout/dialog_confirmation_batch_download.xml diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/playback/ImageGridViewFragment.java b/app/src/main/java/net/osdn/gokigen/pkremote/playback/ImageGridViewFragment.java index bf15c59..ecba1e2 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/playback/ImageGridViewFragment.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/playback/ImageGridViewFragment.java @@ -50,7 +50,7 @@ import androidx.preference.PreferenceManager; * * */ -public class ImageGridViewFragment extends Fragment implements AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener +public class ImageGridViewFragment extends Fragment implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener, AdapterView.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener, MultiFileDownloadConfirmationDialog.Callback { private final String TAG = this.toString(); @@ -110,6 +110,7 @@ public class ImageGridViewFragment extends Fragment implements AdapterView.OnIte gridView = view.findViewById(R.id.gridView1); gridView.setAdapter(adapter); gridView.setOnItemClickListener(this); + gridView.setOnItemLongClickListener(this); gridView.setOnScrollListener(adapter); } return (view); @@ -424,6 +425,45 @@ public class ImageGridViewFragment extends Fragment implements AdapterView.OnIte } } + + @Override + public boolean onItemLongClick(final AdapterView parent, View view, int position, long id) + { + try + { + CameraContentEx infoEx = imageContentList.get(position); + if (infoEx != null) + { + boolean isChecked = infoEx.isSelected(); + infoEx.setSelected(!isChecked); + } + view.invalidate(); + runOnUiThread(new Runnable() + { + @Override + public void run() + { + try + { + ImageGridViewAdapter adapter = (ImageGridViewAdapter) parent.getAdapter(); + adapter.notifyDataSetChanged(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + }); + return (true); + } + catch (Exception e) + { + e.printStackTrace(); + } + return (false); + } + + // AdapterView.OnItemSelectedListener @Override public void onItemSelected(AdapterView parent, View view, int position, long id) @@ -483,4 +523,49 @@ public class ImageGridViewFragment extends Fragment implements AdapterView.OnIte e.printStackTrace(); } } + + @Override + public void confirmSelection(int selectedButtonId, boolean withRaw) + { + Log.v(TAG, "confirmSelection : " + selectedButtonId + " (" + withRaw + ")"); +/* + float downloadSize; + switch (selectedButtonId) + { + case R.id.radio_download__1024x768: + downloadSize = OLYCamera.IMAGE_RESIZE_1024; + break; + case R.id.radio_download__1600x1200: + downloadSize = OLYCamera.IMAGE_RESIZE_1600; + break; + case R.id.radio_download__1920x1440: + downloadSize = OLYCamera.IMAGE_RESIZE_1920; + break; + case R.id.radio_download__2048x1536: + downloadSize = OLYCamera.IMAGE_RESIZE_2048; + break; + + case R.id.radio_download__original_size: + default: + downloadSize = OLYCamera.IMAGE_RESIZE_NONE; + break; + } + + List contentList = contentListHolder.getSelectedContentList(); + for (OLYCameraContentInfoEx item : contentList) + { + Log.v(TAG, " " + item.getFileInfo().getFilename()); + } + + try + { + ImageDownloader downloader = new ImageDownloader(getActivity(), camera); + downloader.startDownloadMulti(contentList, downloadSize, withRaw, this); + } + catch (Exception e) + { + e.printStackTrace(); + } +*/ + } } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/playback/MultiFileDownloadConfirmationDialog.java b/app/src/main/java/net/osdn/gokigen/pkremote/playback/MultiFileDownloadConfirmationDialog.java new file mode 100644 index 0000000..3c619a2 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/pkremote/playback/MultiFileDownloadConfirmationDialog.java @@ -0,0 +1,105 @@ +package net.osdn.gokigen.pkremote.playback; + +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; +import android.widget.RadioGroup; +import android.widget.TextView; + +import net.osdn.gokigen.pkremote.R; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +/** + * 複数ファイルの一括ダウンロードを実施することを確認するダイアログ + * + */ +public class MultiFileDownloadConfirmationDialog extends DialogFragment +{ + private final String TAG = this.toString(); + + private Callback callback; + private int nofPictures; + + public static MultiFileDownloadConfirmationDialog newInstance(@NonNull Callback callback, int nofPictures) + { + MultiFileDownloadConfirmationDialog instance = new MultiFileDownloadConfirmationDialog(); + instance.prepare(callback, nofPictures); + + return (instance); + } + + private void prepare(Callback callback, int nofPictures) + { + this.callback = callback; + this.nofPictures = nofPictures; + } + + @Override + public @NonNull Dialog onCreateDialog(Bundle savedInstanceState) + { + Activity activity = getActivity(); + LayoutInflater inflater = activity.getLayoutInflater(); + View view = inflater.inflate(R.layout.dialog_confirmation_batch_download, null, false); + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(activity.getString(R.string.dialog_title_batch_download)); + TextView textView = view.findViewById(R.id.label_batch_download_info); + if (textView != null) + { + String label = getString(R.string.dialog_label_batch_download) + nofPictures; + textView.setText(label); + } + final RadioGroup radio = view.findViewById(R.id.radio_group_select_category); + final CheckBox checkWithRaw = view.findViewById(R.id.radio_download__raw); + + // ボタンを設定する(実行ボタン) + builder.setPositiveButton(activity.getString(R.string.dialog_positive_download), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + int buttonId = 0; + boolean withRaw = false; + try { + if (radio != null) + { + buttonId = radio.getCheckedRadioButtonId(); + } + if (checkWithRaw != null) + { + withRaw = checkWithRaw.isChecked(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + dialog.dismiss(); + //Log.v(TAG, "confirmSelection() " + buttonId + " [" + withRaw + "]"); + callback.confirmSelection(buttonId, withRaw); + } + }); + + // ボタンを設定する (キャンセルボタン) + builder.setNegativeButton(activity.getString(R.string.dialog_negative_cancel), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + builder.setView(view); + return (builder.create()); + } + + // コールバックインタフェース + public interface Callback + { + void confirmSelection(int selectedButtonId, boolean withRaw); + } + +} diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/playback/detail/CameraContentEx.java b/app/src/main/java/net/osdn/gokigen/pkremote/playback/detail/CameraContentEx.java index c179c22..de0728d 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/playback/detail/CameraContentEx.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/playback/detail/CameraContentEx.java @@ -10,12 +10,14 @@ public class CameraContentEx private static final String MOVIE_SUFFIX = ".mov"; private String rawSuffix; private boolean hasRaw; + private boolean isSelected; public CameraContentEx(ICameraContent fileInfo, boolean hasRaw, String rawSuffix) { this.fileInfo = fileInfo; this.hasRaw = hasRaw; this.rawSuffix = rawSuffix; + this.isSelected = false; } public void setHasRaw(boolean value, String rawSuffix) @@ -24,6 +26,11 @@ public class CameraContentEx this.rawSuffix = rawSuffix; } + public void setSelected(boolean isSelected) + { + this.isSelected = isSelected; + } + public boolean hasRaw() { return (hasRaw); @@ -35,6 +42,11 @@ public class CameraContentEx return (contentName.endsWith(MOVIE_SUFFIX)); } + public boolean isSelected() + { + return (isSelected); + } + public String getRawSuffix() { return (rawSuffix); diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridCellViewHolder.java b/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridCellViewHolder.java index 50aef24..817b268 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridCellViewHolder.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridCellViewHolder.java @@ -6,11 +6,13 @@ class ImageGridCellViewHolder { private ImageView imageView; private ImageView iconView; + private ImageView selectView; - ImageGridCellViewHolder(ImageView image, ImageView icon) + ImageGridCellViewHolder(ImageView image, ImageView icon, ImageView selection) { this.imageView = image; this.iconView = icon; + this.selectView = selection; } ImageView getImageView() @@ -23,4 +25,9 @@ class ImageGridCellViewHolder return (iconView); } + ImageView getSelectView() + { + return (selectView); + } + } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridViewAdapter.java b/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridViewAdapter.java index 2dc9a62..9322b16 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridViewAdapter.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/playback/grid/ImageGridViewAdapter.java @@ -89,7 +89,7 @@ public class ImageGridViewAdapter extends BaseAdapter implements AbsListView.OnS convertView = inflater.inflate(R.layout.view_grid_cell, parent, false); if (convertView != null) { - viewHolder = new ImageGridCellViewHolder((ImageView) convertView.findViewById(R.id.imageViewY), (ImageView) convertView.findViewById(R.id.imageViewZ)); + viewHolder = new ImageGridCellViewHolder((ImageView) convertView.findViewById(R.id.imageViewY), (ImageView) convertView.findViewById(R.id.imageViewZ), (ImageView) convertView.findViewById(R.id.imageViewX)); convertView.setTag(viewHolder); } else @@ -110,6 +110,7 @@ public class ImageGridViewAdapter extends BaseAdapter implements AbsListView.OnS { viewHolder.getImageView().setImageResource(R.drawable.ic_satellite_grey_24dp); viewHolder.getIconView().setImageDrawable(null); + viewHolder.getSelectView().setImageDrawable(null); return (convertView); } String path = new File(item.getContentPath(), item.getContentName()).getPath(); @@ -118,6 +119,7 @@ public class ImageGridViewAdapter extends BaseAdapter implements AbsListView.OnS { viewHolder.getImageView().setImageResource(R.drawable.ic_satellite_grey_24dp); viewHolder.getIconView().setImageDrawable(null); + viewHolder.getSelectView().setImageDrawable(null); if (!gridViewIsScrolling) { if (executor.isShutdown()) @@ -142,6 +144,14 @@ public class ImageGridViewAdapter extends BaseAdapter implements AbsListView.OnS { viewHolder.getIconView().setImageDrawable(null); } + if (infoEx.isSelected()) + { + viewHolder.getSelectView().setImageResource(R.drawable.ic_check_green_24dp); + } + else + { + viewHolder.getSelectView().setImageDrawable(null); + } } return (convertView); } diff --git a/app/src/main/res/drawable/ic_check_green_24dp.xml b/app/src/main/res/drawable/ic_check_green_24dp.xml new file mode 100644 index 0000000..2513654 --- /dev/null +++ b/app/src/main/res/drawable/ic_check_green_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_select_all_grey_24dp.xml b/app/src/main/res/drawable/ic_select_all_grey_24dp.xml new file mode 100644 index 0000000..d8ab502 --- /dev/null +++ b/app/src/main/res/drawable/ic_select_all_grey_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/dialog_confirmation_batch_download.xml b/app/src/main/res/layout/dialog_confirmation_batch_download.xml new file mode 100644 index 0000000..bb67162 --- /dev/null +++ b/app/src/main/res/layout/dialog_confirmation_batch_download.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/view_grid_cell.xml b/app/src/main/res/layout/view_grid_cell.xml index a82d8ff..2e710d8 100644 --- a/app/src/main/res/layout/view_grid_cell.xml +++ b/app/src/main/res/layout/view_grid_cell.xml @@ -26,4 +26,20 @@ android:scaleType="centerCrop" android:src="@null" tools:ignore="ContentDescription" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94378c2..3bbdbfb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -158,4 +158,14 @@ Date Path + + Download with RAW + Batch Download(select size) + Download + Selected : + + Finished. Number of Pics. : + Finished. # of Pics. : + Failures : + Download was failed… diff --git a/build.gradle b/build.gradle index 3c23acc..e11a5b3 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' + classpath 'com.android.tools.build:gradle:3.3.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files -- 2.11.0