package com.teamluper.luper; import android.media.MediaPlayer; import android.os.Looper; import android.util.Log; import android.view.View; import android.view.ViewGroup; import java.io.FileDescriptor; import java.io.FileInputStream; import java.util.ArrayList; public class Clip { private SQLiteDataSource dataSource; // database field variables private long id; private long ownerUserID; private long parentTrackID; private long audioFileID; private int startTime; private int durationMS; private int loopCount; private int color; private boolean isLocked; private String playbackOptions; private boolean isDirty; // dirty = contains unsynced changes // references to relevant data public AudioFile audioFile = null; public Track parentTrack = null; public int remainingLoops; // references to any views depending on this data, so we can invalidate them automatically on set___ calls. public ArrayList<View> associatedViews = null; // Brad's variables (WE NEED TO REMOVE THESE) String name = null; int begin, end, duration; // FIXME these will need to be removed and instead the above stuff used //needs an array of attributes/filters/modifications? // yeah, eventually playbackOptions will be that -Mike // NOTE: DO NOT CALL THIS CONSTRUCTOR DIRECTLY unless in a cursorToClip method. // instead, use SQLiteDataSource.createClip()! public Clip(SQLiteDataSource dataSource, long id, long ownerUserID, long parentTrackID, long audioFileID, int startTime, int durationMS, int loopCount, int color, boolean isLocked, String playbackOptions, boolean isDirty) { this.dataSource = dataSource; this.id = id; this.ownerUserID = ownerUserID; this.parentTrackID = parentTrackID; this.audioFileID = audioFileID; this.startTime = startTime; this.durationMS = durationMS; this.loopCount = loopCount; this.remainingLoops = loopCount; this.color = color; this.isLocked = isLocked; this.playbackOptions = playbackOptions; this.isDirty = isDirty; this.associatedViews = new ArrayList<View>(); // brad's stuff name = null; begin = 0; end = duration; } public void addAssociatedView(View view) { this.associatedViews.add(view); Log.i("luper", "TRACK ASSOCIATED VIEWS SIZE: " + this.associatedViews.size()); } public void removeAssociatedView(View view) { this.associatedViews.remove(view); } public ArrayList<View> getAssociatedViews() { return this.associatedViews; } public void invalidateAssociatedViews() { for(View v : this.associatedViews) { if(ColorChipButton.class.isInstance(v)) { ((ColorChipButton) v).render(); } v.requestLayout(); v.refreshDrawableState(); if (Looper.myLooper() != null && Looper.myLooper() == Looper.getMainLooper()) { // we're in the main-thread / UI Thread. v.invalidate(); } else { // we're in a background thread. v.postInvalidate(); } } } //CANNOT USE THIS, NEED TO USE THE DB CALLS. THIS IS ONLY HERE SO AudioRecorderTest COMPILES, ART IS OUTDATED. Clip(String Cname) { dataSource = null; } public void resetLoop() { this.remainingLoops = this.loopCount; } // mike's database getters and setters. // TODO migrate all above stuff to use the below fields, setters, and getters public long getId() { return id; } public void setId(long id) { long oldId = this.id; this.id = id; dataSource.updateLong("Clips", oldId, "_id", id); invalidateAssociatedViews(); this.isDirty = true; } // TODO: THIS STUFF NEEDS TO BE REMOVED!!! public void setBegin(int begin){ this.begin = begin; } public void setEnd(int end){ this.end = end; } public void setDuration(int duration){ this.duration = duration; } public long getOwnerUserID() { return ownerUserID; } public void setOwnerUserID(long ownerUserID) { this.ownerUserID = ownerUserID; dataSource.updateLong("Clips", this.id, "ownerUserID", ownerUserID); invalidateAssociatedViews(); this.isDirty = true; } public long getParentTrackID() { return parentTrackID; } public void setParentTrackID(long parentTrackID) { this.parentTrackID = parentTrackID; dataSource.updateLong("Clips", this.id, "parentTrackID", parentTrackID); invalidateAssociatedViews(); this.isDirty = true; } public long getAudioFileID() { return audioFileID; } public void setAudioFileID(long audioFileID) { this.audioFileID = audioFileID; dataSource.updateLong("Clips", this.id, "audioFileID", audioFileID); invalidateAssociatedViews(); this.isDirty = true; } public int getStartTime() { return startTime; } public void setStartTime(int startTime) { this.startTime = startTime; dataSource.updateInt("Clips", this.id, "startTime", startTime); invalidateAssociatedViews(); this.isDirty = true; } public int getDurationMS() { return durationMS; } public void setDurationMS(int durationMS) { this.durationMS = durationMS; dataSource.updateInt("Clips", this.id, "durationMS", durationMS); invalidateAssociatedViews(); this.isDirty = true; } public int getLoopCount() { return loopCount; } public void setLoopCount(int loopCount) { this.loopCount = loopCount; dataSource.updateInt("Clips", this.id, "loopCount", loopCount); invalidateAssociatedViews(); this.isDirty = true; } public int getColor() { return color; } public void setColor(int color) { this.color = color; dataSource.updateInt("Clips", this.id, "color", color); invalidateAssociatedViews(); this.isDirty = true; } public boolean isLocked() { return isLocked; } public void setLocked(boolean isLocked) { this.isLocked = isLocked; dataSource.updateInt("Clips", this.id, "isLocked", (isLocked ? 1 : 0)); invalidateAssociatedViews(); this.isDirty = true; } public String getPlaybackOptions() { return playbackOptions; } public void setPlaybackOptions(String playbackOptions) { this.playbackOptions = playbackOptions; dataSource.updateString("Clips", this.id, "playbackOptions", playbackOptions); invalidateAssociatedViews(); this.isDirty = true; } public boolean isDirty() { return isDirty; } public void setDirty(boolean isDirty) { this.isDirty = isDirty; dataSource.updateInt("Clips", this.id, "isDirty", (isDirty ? 1 : 0)); invalidateAssociatedViews(); } public AudioFile getAudioFile() { return this.audioFile; } public void loadFileMetadata() { this.audioFile = dataSource.getAudioFileById(this.audioFileID); } public void loadAudio() { if(this.audioFile == null) loadFileMetadata(); this.audioFile.loadAudio(); } public boolean deleteFromProject() { // first, delete from the db this.dataSource.deleteClip(this.id); // fail if we have no reference to parentTrack (set immediately after construction) if(this.parentTrack == null) return false; for(View trackview : this.parentTrack.getAssociatedViews()) { if(TrackView.class.isInstance(trackview)) { // is this really a TrackView? // remove any and all colorchips associated with this clip TrackView tv = ((TrackView) trackview); for(View clipview : this.associatedViews) { tv.removeView(clipview); } } } return true; } }