Skip to content

Commit

Permalink
Added long click to delete recording, and material designed toolbar t…
Browse files Browse the repository at this point in the history
…abs.
  • Loading branch information
dkim0419 committed Jan 2, 2015
1 parent 0c8b6fc commit 1ac6e16
Show file tree
Hide file tree
Showing 11 changed files with 168 additions and 48 deletions.
2 changes: 1 addition & 1 deletion app/app.iml
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,9 @@
</content>
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="pagerslidingtabstrip-1.0.1" level="project" />
<orderEntry type="library" exported="" name="library-2.4.0" level="project" />
<orderEntry type="library" exported="" name="floatingactionbutton-1.1.0" level="project" />
<orderEntry type="library" exported="" name="library-1.0.6" level="project" />
<orderEntry type="library" exported="" name="recyclerview-v7-21.0.3" level="project" />
<orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />
<orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
Expand Down
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ android {
dependencies {
compile 'com.android.support:appcompat-v7:21.0.2'
compile 'com.melnykov:floatingactionbutton:1.1.0'
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
compile 'com.jpardogo.materialtabstrip:library:1.0.6'
compile 'com.android.support:cardview-v7:21.0.+'
compile 'com.android.support:recyclerview-v7:21.0.+'

Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
android:allowBackup="true"
Expand Down
73 changes: 37 additions & 36 deletions app/src/main/java/com/danielkim/soundrecorder/DBHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class DBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "saved_recordings.db";
private static final int DATABASE_VERSION = 1;

public static abstract class RecordingDatabaseItem implements BaseColumns {
public static abstract class DBHelperItem implements BaseColumns {
public static final String TABLE_NAME = "saved_recordings";

public static final String COLUMN_NAME_RECORDING_NAME = "recording_name";
Expand All @@ -36,46 +36,47 @@ public interface OnDatabaseChangedListener {
private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + RecordingDatabaseItem.TABLE_NAME + " (" +
RecordingDatabaseItem._ID + " INTEGER PRIMARY KEY" + COMMA_SEP +
RecordingDatabaseItem.COLUMN_NAME_RECORDING_NAME + TEXT_TYPE + COMMA_SEP +
RecordingDatabaseItem.COLUMN_NAME_RECORDING_FILE_PATH + TEXT_TYPE + COMMA_SEP +
RecordingDatabaseItem.COLUMN_NAME_RECORDING_LENGTH + " INTEGER " + COMMA_SEP +
RecordingDatabaseItem.COLUMN_NAME_TIME_ADDED + " INTEGER " + ")";
"CREATE TABLE " + DBHelperItem.TABLE_NAME + " (" +
DBHelperItem._ID + " INTEGER PRIMARY KEY" + COMMA_SEP +
DBHelperItem.COLUMN_NAME_RECORDING_NAME + TEXT_TYPE + COMMA_SEP +
DBHelperItem.COLUMN_NAME_RECORDING_FILE_PATH + TEXT_TYPE + COMMA_SEP +
DBHelperItem.COLUMN_NAME_RECORDING_LENGTH + " INTEGER " + COMMA_SEP +
DBHelperItem.COLUMN_NAME_TIME_ADDED + " INTEGER " + ")";

@SuppressWarnings("unused")
private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + RecordingDatabaseItem.TABLE_NAME;
private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + DBHelperItem.TABLE_NAME;

public long addRecording(String recordingName, String filePath, long length) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_NAME, recordingName);
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_FILE_PATH, filePath);
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_LENGTH, length);
cv.put(RecordingDatabaseItem.COLUMN_NAME_TIME_ADDED, System.currentTimeMillis());
long rowId = db.insert(RecordingDatabaseItem.TABLE_NAME, null, cv);
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_NAME, recordingName);
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_FILE_PATH, filePath);
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_LENGTH, length);
cv.put(DBHelperItem.COLUMN_NAME_TIME_ADDED, System.currentTimeMillis());
long rowId = db.insert(DBHelperItem.TABLE_NAME, null, cv);
if (mOnDatabaseChangedListener != null)
mOnDatabaseChangedListener.onDatabaseEntryUpdated();

return rowId;
}

public RecordingItem getItemAt(int position) {
SQLiteDatabase db = getReadableDatabase();
String[] projection = {
RecordingDatabaseItem._ID,
RecordingDatabaseItem.COLUMN_NAME_RECORDING_NAME,
RecordingDatabaseItem.COLUMN_NAME_RECORDING_FILE_PATH,
RecordingDatabaseItem.COLUMN_NAME_RECORDING_LENGTH,
RecordingDatabaseItem.COLUMN_NAME_TIME_ADDED
DBHelperItem._ID,
DBHelperItem.COLUMN_NAME_RECORDING_NAME,
DBHelperItem.COLUMN_NAME_RECORDING_FILE_PATH,
DBHelperItem.COLUMN_NAME_RECORDING_LENGTH,
DBHelperItem.COLUMN_NAME_TIME_ADDED
};
Cursor c = db.query(RecordingDatabaseItem.TABLE_NAME, projection, null, null, null, null, null);
Cursor c = db.query(DBHelperItem.TABLE_NAME, projection, null, null, null, null, null);
if (c.moveToPosition(position)) {
RecordingItem item = new RecordingItem();
item.setId(c.getInt(c.getColumnIndex(RecordingDatabaseItem._ID)));
item.setLength(c.getInt(c.getColumnIndex(RecordingDatabaseItem.COLUMN_NAME_RECORDING_LENGTH)));
item.setFilePath(c.getString(c.getColumnIndex(RecordingDatabaseItem.COLUMN_NAME_RECORDING_FILE_PATH)));
item.setName(c.getString(c.getColumnIndex(RecordingDatabaseItem.COLUMN_NAME_RECORDING_NAME)));
item.setTime(c.getLong(c.getColumnIndex(RecordingDatabaseItem.COLUMN_NAME_TIME_ADDED)));
item.setId(c.getInt(c.getColumnIndex(DBHelperItem._ID)));
item.setName(c.getString(c.getColumnIndex(DBHelperItem.COLUMN_NAME_RECORDING_NAME)));
item.setFilePath(c.getString(c.getColumnIndex(DBHelperItem.COLUMN_NAME_RECORDING_FILE_PATH)));
item.setLength(c.getInt(c.getColumnIndex(DBHelperItem.COLUMN_NAME_RECORDING_LENGTH)));
item.setTime(c.getLong(c.getColumnIndex(DBHelperItem.COLUMN_NAME_TIME_ADDED)));
c.close();
return item;
}
Expand All @@ -85,15 +86,15 @@ public RecordingItem getItemAt(int position) {
public void removeItemWithId(int id) {
SQLiteDatabase db = getWritableDatabase();
String[] whereArgs = { String.valueOf(id) };
db.delete(RecordingDatabaseItem.TABLE_NAME, "_id=?", whereArgs);
db.delete(DBHelperItem.TABLE_NAME, "_ID=?", whereArgs);
if (mOnDatabaseChangedListener != null)
mOnDatabaseChangedListener.onDatabaseEntryUpdated();
}

public int getCount() {
SQLiteDatabase db = getReadableDatabase();
String[] projection = { RecordingDatabaseItem._ID };
Cursor c = db.query(RecordingDatabaseItem.TABLE_NAME, projection, null, null, null, null, null);
String[] projection = { DBHelperItem._ID };
Cursor c = db.query(DBHelperItem.TABLE_NAME, projection, null, null, null, null, null);
int count = c.getCount();
c.close();
return count;
Expand Down Expand Up @@ -129,9 +130,9 @@ public int compare(RecordingItem item1, RecordingItem item2) {
public void renameItem(RecordingItem item, String recordingName) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_NAME, recordingName);
db.update(RecordingDatabaseItem.TABLE_NAME, cv,
RecordingDatabaseItem._ID + "=" + item.getId(), null);
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_NAME, recordingName);
db.update(DBHelperItem.TABLE_NAME, cv,
DBHelperItem._ID + "=" + item.getId(), null);
if (mOnDatabaseChangedListener != null)
mOnDatabaseChangedListener.onDatabaseEntryUpdated();
}
Expand All @@ -143,12 +144,12 @@ public void setOnDatabaseChangedListener(OnDatabaseChangedListener listener) {
public long restoreRecording(RecordingItem item) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_NAME, item.getName());
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_FILE_PATH, item.getFilePath());
cv.put(RecordingDatabaseItem.COLUMN_NAME_RECORDING_LENGTH, item.getLength());
cv.put(RecordingDatabaseItem.COLUMN_NAME_TIME_ADDED, item.getTime());
cv.put(RecordingDatabaseItem._ID, item.getId());
long rowId = db.insert(RecordingDatabaseItem.TABLE_NAME, null, cv);
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_NAME, item.getName());
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_FILE_PATH, item.getFilePath());
cv.put(DBHelperItem.COLUMN_NAME_RECORDING_LENGTH, item.getLength());
cv.put(DBHelperItem.COLUMN_NAME_TIME_ADDED, item.getTime());
cv.put(DBHelperItem._ID, item.getId());
long rowId = db.insert(DBHelperItem.TABLE_NAME, null, cv);
if (mOnDatabaseChangedListener != null)
mOnDatabaseChangedListener.onDatabaseEntryUpdated();
return rowId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.FileObserver;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;

import com.danielkim.soundrecorder.activities.MainActivity;
import com.danielkim.soundrecorder.adapters.FileViewerAdapter;
import com.danielkim.soundrecorder.fragments.FileViewerFragment;

import java.io.IOException;
import java.text.SimpleDateFormat;
Expand Down Expand Up @@ -112,11 +116,17 @@ public void startRecording() {
public void stopRecording() {
mRecorder.stop();
mRecorder.release();
Toast.makeText(this, R.string.toast_recording_finish + mFileName, Toast.LENGTH_LONG).show();
Toast.makeText(this, R.string.toast_recording_finish + " " + mFilePath, Toast.LENGTH_LONG).show();
mRecorder = null;

try {
mDatabase.addRecording(mFileName, mFilePath, mElapsedSeconds);
FileViewerAdapter adapter = new FileViewerAdapter(getApplicationContext());
RecyclerView view = new RecyclerView(getApplicationContext());
view.swapAdapter(adapter, true);

//add the new file to the top of the list (position 0)
adapter.notifyItemInserted(0);

} catch (Exception e){
Log.e(LOG_TAG, "exception", e);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,58 +1,113 @@
package com.danielkim.soundrecorder.adapters;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.danielkim.soundrecorder.DBHelper;
import com.danielkim.soundrecorder.R;
import com.danielkim.soundrecorder.RecordingItem;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TooManyListenersException;

/**
* Created by Daniel on 12/29/2014.
*/
public class FileViewerAdapter extends RecyclerView.Adapter<FileViewerAdapter.RecordingsViewHolder>{

private static final String LOG_TAG = "FileViewerAdapter";

private DBHelper db;
private static final SimpleDateFormat mDateAddedFormatter = new SimpleDateFormat("MMM dd, yyyy - hh:mm a", Locale.getDefault());
private static final SimpleDateFormat mLengthFormatter = new SimpleDateFormat("mm:ss", Locale.getDefault());

RecordingItem item;
Context mContext;

@Override
public void onBindViewHolder(RecordingsViewHolder holder, int position) {
RecordingItem item = getItem(position);
public void onBindViewHolder(final RecordingsViewHolder holder, int position) {

item = getItem(position);

holder.vName.setText(item.getName());
holder.vLength.setText(mLengthFormatter.format(item.getLength()));
holder.vDateAdded.setText(mDateAddedFormatter.format((int)item.getTime()));

holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {

// File delete confirm
AlertDialog.Builder confirmDelete = new AlertDialog.Builder(mContext);
confirmDelete.setTitle("Confirm Delete...");
confirmDelete.setMessage("Are you sure you would like to delete this file?");
confirmDelete.setCancelable(true);
confirmDelete.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
//remove item from database, recyclerview, and storage
remove(holder.getPosition());

} catch (Exception e) {
Log.e(LOG_TAG, "exception", e);
}

dialog.cancel();
}
});
confirmDelete.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});

AlertDialog alert = confirmDelete.create();
alert.show();

return false;
}
});
}

@Override
public RecordingsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.

final View itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.card_view, parent, false);

mContext = parent.getContext();

return new RecordingsViewHolder(itemView);
}


public static class RecordingsViewHolder extends RecyclerView.ViewHolder {
protected TextView vName;
protected TextView vLength;
protected TextView vDateAdded;
protected View cardView;

public RecordingsViewHolder(View v) {
super(v);
vName = (TextView) v.findViewById(R.id.file_name_text);
vLength = (TextView) v.findViewById(R.id.file_length_text);
vDateAdded = (TextView) v.findViewById(R.id.file_date_added_text);
cardView = v.findViewById(R.id.card_view);
}
}

Expand All @@ -68,5 +123,20 @@ public RecordingItem getItem(int position) {
public FileViewerAdapter(Context context) {
super();
db = new DBHelper(context);
mContext = context;
}

public void remove(int position) {
//remove item from database, recyclerview and storage

//delete file from storage
File file = new File(getItem(position).getFilePath());
file.delete();

Toast.makeText(mContext, getItem(position).getName() + " successfully deleted",
Toast.LENGTH_SHORT).show();

db.removeItemWithId(getItem(position).getId());
notifyItemRemoved(position);
}
}
Loading

0 comments on commit 1ac6e16

Please sign in to comment.