Skip to content

Instantly share code, notes, and snippets.

@BadDaemon
Created February 7, 2021 14:06
Show Gist options
  • Save BadDaemon/0b9222d88b2657d34c3c57bcf8c5c087 to your computer and use it in GitHub Desktop.
Save BadDaemon/0b9222d88b2657d34c3c57bcf8c5c087 to your computer and use it in GitHub Desktop.
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