Created
February 7, 2021 14:06
-
-
Save BadDaemon/0b9222d88b2657d34c3c57bcf8c5c087 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/app/src/main/java/org/lineageos/recorder/ListActivity.java b/app/src/main/java/org/lineageos/recorder/ListActivity.java | |
index 5917b54..0d950e5 100644 | |
--- a/app/src/main/java/org/lineageos/recorder/ListActivity.java | |
+++ b/app/src/main/java/org/lineageos/recorder/ListActivity.java | |
@@ -18,6 +18,10 @@ package org.lineageos.recorder; | |
import android.content.Intent; | |
import android.net.Uri; | |
import android.os.Bundle; | |
+import android.view.ActionMode; | |
+import android.view.Menu; | |
+import android.view.MenuInflater; | |
+import android.view.MenuItem; | |
import android.view.View; | |
import android.widget.ProgressBar; | |
import android.widget.TextView; | |
@@ -40,6 +44,8 @@ public class ListActivity extends AppCompatActivity implements RecordingItemCall | |
private static final String TYPE_AUDIO = "audio/*"; | |
private RecordingsAdapter mAdapter; | |
+ private ActionMode mActionMode; | |
+ private ActionModeCallback mActionModeCallback; | |
@Override | |
protected void onCreate(@Nullable Bundle savedInstanceState) { | |
@@ -81,6 +87,8 @@ public class ListActivity extends AppCompatActivity implements RecordingItemCall | |
mAdapter.setData(list); | |
} | |
}); | |
+ | |
+ mActionModeCallback = new ActionModeCallback(); | |
} | |
@Override | |
@@ -124,4 +132,51 @@ public class ListActivity extends AppCompatActivity implements RecordingItemCall | |
); | |
dialog.show(); | |
} | |
+ | |
+ @Override | |
+ public void onRowClicked(int position) { | |
+ if (mActionMode != null) { | |
+ mAdapter.toggleSelection(position); | |
+ } else { | |
+ onPlay(mAdapter.getUri(position)); | |
+ } | |
+ } | |
+ | |
+ @Override | |
+ public boolean onRowLongClicked(int position) { | |
+ if (mActionMode == null) { | |
+ mActionMode = startActionMode(mActionModeCallback); | |
+ } | |
+ mAdapter.setChecked(position, true); | |
+ return true; | |
+ } | |
+ | |
+ private class ActionModeCallback implements ActionMode.Callback { | |
+ @Override | |
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) { | |
+ MenuInflater inflater = mode.getMenuInflater(); | |
+ inflater.inflate(R.menu.menu_actions, menu); | |
+ return true; | |
+ } | |
+ | |
+ @Override | |
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) { | |
+ return false; | |
+ } | |
+ | |
+ @Override | |
+ public void onDestroyActionMode(ActionMode mode) { | |
+ mAdapter.removeSelection(); | |
+ mActionMode = null; | |
+ } | |
+ | |
+ @Override | |
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { | |
+ switch (item.getItemId()) { | |
+ case R.id.menu_delete: | |
+ break; | |
+ } | |
+ return true; | |
+ } | |
+ } | |
} | |
diff --git a/app/src/main/java/org/lineageos/recorder/list/RecordingItemCallbacks.java b/app/src/main/java/org/lineageos/recorder/list/RecordingItemCallbacks.java | |
index ef0c53a..ef17afc 100644 | |
--- a/app/src/main/java/org/lineageos/recorder/list/RecordingItemCallbacks.java | |
+++ b/app/src/main/java/org/lineageos/recorder/list/RecordingItemCallbacks.java | |
@@ -24,4 +24,7 @@ public interface RecordingItemCallbacks { | |
void onShare(@NonNull Uri uri); | |
void onDelete(int index, @NonNull Uri uri); | |
void onRename(int index, @NonNull Uri uri, @NonNull String currentName); | |
+ | |
+ void onRowClicked(int position); | |
+ boolean onRowLongClicked(int position); | |
} | |
diff --git a/app/src/main/java/org/lineageos/recorder/list/RecordingItemViewHolder.java b/app/src/main/java/org/lineageos/recorder/list/RecordingItemViewHolder.java | |
index 8bbf4d9..bc46177 100644 | |
--- a/app/src/main/java/org/lineageos/recorder/list/RecordingItemViewHolder.java | |
+++ b/app/src/main/java/org/lineageos/recorder/list/RecordingItemViewHolder.java | |
@@ -31,9 +31,11 @@ import java.util.Locale; | |
public class RecordingItemViewHolder extends RecyclerView.ViewHolder { | |
private static final String SUMMARY_FORMAT = "%s - %02d:%02d"; | |
+ private final View mItemView; | |
private final SimpleDateFormat mDateFormat; | |
private final TextView mTitleView; | |
private final TextView mSummaryView; | |
+ private final RecordingItemCallbacks mCallbacks; | |
private Uri mUri; | |
public RecordingItemViewHolder(@NonNull View itemView, | |
@@ -41,7 +43,9 @@ public class RecordingItemViewHolder extends RecyclerView.ViewHolder { | |
@NonNull SimpleDateFormat dateFormat) { | |
super(itemView); | |
+ mItemView = itemView; | |
mDateFormat = dateFormat; | |
+ mCallbacks = callbacks; | |
mTitleView = itemView.findViewById(R.id.item_title); | |
mSummaryView = itemView.findViewById(R.id.item_date); | |
ImageView playView = itemView.findViewById(R.id.item_play); | |
@@ -66,4 +70,13 @@ public class RecordingItemViewHolder extends RecyclerView.ViewHolder { | |
mSummaryView.setText(String.format(Locale.getDefault(), SUMMARY_FORMAT, | |
mDateFormat.format(data.getDate()), minutes, seconds)); | |
} | |
+ | |
+ public Uri getUri() { | |
+ return mUri; | |
+ } | |
+ | |
+ public void setClickEvents(int position) { | |
+ mItemView.setOnClickListener(v -> mCallbacks.onRowClicked(position)); | |
+ mItemView.setOnLongClickListener(v -> mCallbacks.onRowLongClicked(position)); | |
+ } | |
} | |
diff --git a/app/src/main/java/org/lineageos/recorder/list/RecordingsAdapter.java b/app/src/main/java/org/lineageos/recorder/list/RecordingsAdapter.java | |
index 57347a0..4f6f402 100644 | |
--- a/app/src/main/java/org/lineageos/recorder/list/RecordingsAdapter.java | |
+++ b/app/src/main/java/org/lineageos/recorder/list/RecordingsAdapter.java | |
@@ -15,6 +15,8 @@ | |
*/ | |
package org.lineageos.recorder.list; | |
+import android.net.Uri; | |
+import android.util.SparseBooleanArray; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
@@ -39,6 +41,9 @@ public class RecordingsAdapter extends RecyclerView.Adapter<RecordingItemViewHol | |
@NonNull | |
private List<RecordingData> mData; | |
+ private SparseBooleanArray mCheckStates = new SparseBooleanArray(); | |
+ | |
+ | |
public RecordingsAdapter(@NonNull RecordingItemCallbacks callbacks) { | |
mCallbacks = callbacks; | |
mData = new ArrayList<>(); | |
@@ -55,6 +60,7 @@ public class RecordingsAdapter extends RecyclerView.Adapter<RecordingItemViewHol | |
@Override | |
public void onBindViewHolder(@NonNull RecordingItemViewHolder holder, int position) { | |
holder.setData(mData.get(position)); | |
+ holder.setClickEvents(position); | |
} | |
@Override | |
@@ -78,4 +84,21 @@ public class RecordingsAdapter extends RecyclerView.Adapter<RecordingItemViewHol | |
oldData.getDuration())); | |
notifyItemChanged(index); | |
} | |
+ | |
+ public Uri getUri(int index) { | |
+ return mData.get(index).getUri(); | |
+ } | |
+ | |
+ public void removeSelection() { | |
+ mCheckStates = new SparseBooleanArray(); | |
+ notifyDataSetChanged(); | |
+ } | |
+ | |
+ public void setChecked(int position, boolean checked) { | |
+ mCheckStates.put(position, checked); | |
+ } | |
+ | |
+ public void toggleSelection(int position) { | |
+ mCheckStates.put(position, !mCheckStates.get(position, false)); | |
+ } | |
} | |
diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml | |
index 463adac..5dae96b 100644 | |
--- a/app/src/main/res/layout/activity_list.xml | |
+++ b/app/src/main/res/layout/activity_list.xml | |
@@ -19,12 +19,19 @@ | |
android:layout_height="match_parent" | |
android:orientation="vertical"> | |
- <androidx.appcompat.widget.Toolbar | |
- android:id="@+id/toolbar" | |
+ <com.google.android.material.appbar.AppBarLayout | |
+ android:id="@+id/app_bar" | |
android:layout_width="match_parent" | |
- android:layout_height="?attr/actionBarSize" | |
- android:background="?android:attr/colorPrimary" | |
- android:elevation="8dp" /> | |
+ android:layout_height="wrap_content" | |
+ android:elevation="8dp"> | |
+ | |
+ <androidx.appcompat.widget.Toolbar | |
+ android:id="@+id/toolbar" | |
+ android:layout_width="match_parent" | |
+ android:layout_height="?attr/actionBarSize" | |
+ android:background="?android:attr/colorPrimary" | |
+ android:elevation="8dp" /> | |
+ </com.google.android.material.appbar.AppBarLayout> | |
<FrameLayout | |
android:layout_width="match_parent" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment