package device.cdPlayer; import device.Device; import device.cdPlayer.exceptions.*; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class CDPlayer implements Device { // 0-Leer; true-1 private int CdDriveContent=0; private int CdFlap=0; private int volume = 0; private String infoText=null; private List<String> supportedFormats = new ArrayList<String>(Arrays.asList(new String[] {"Audio","MP3","WMA","AAC"})); private String actualPlayTrack=""; private CD loadedCD=null; private CDWechseler cdWechseler=null; private String activeSource="CDDrive";//or CDWechseler private List<String>favoriteSongs=new ArrayList<>(); @Override public void louder() { if(volume < 100) { volume += 1; } else { volume = 100; } } @Override public void quieter() { if(volume > 0) { volume -= 1; } else { volume = 0; } } @Override public int getVolume() { return volume; } @Override public void next() { List<String> playList = Arrays.asList(loadedCD.getPlayList()); int indexOfActualPlayTrack=playList.indexOf(actualPlayTrack); int indexOfNextPlayTrack=(indexOfActualPlayTrack+1)%loadedCD.getPlayList().length; this.actualPlayTrack=playList.get(indexOfNextPlayTrack ); } @Override public void prev() { List<String> playList = Arrays.asList(loadedCD.getPlayList()); int actualIndex=playList.indexOf(actualPlayTrack); if(actualIndex>0){ actualIndex-=1; }else{ actualIndex=0; } this.actualPlayTrack=playList.get(actualIndex); } @Override public String getInfoText() { if(infoText==null){ throw new ReturnValueNullException(); } return infoText; } @Override public String[] getOptions() { Method[] methods=this.getClass().getDeclaredMethods(); String[] outMethods=new String[methods.length]; for (int i = 0; i <methods.length ; i++) { outMethods[i]=methods[i].getName(); } return outMethods; } @Override public String chooseItem(int itemNr) { if(this.loadedCD==null){ throw new ReturnValueNullException(); } if(itemNr<0){ throw new NegativeInputException(); } if(!(itemNr>=0 && itemNr<loadedCD.getPlayList().length)){ throw new ItemNumberNotFoundException(); } return loadedCD.getPlayList()[itemNr]; } @Override public String[] getItemList() { return loadedCD.getPlayList(); } @Override public String mute() { return null; } @Override public String unmute() { return null; } @Override public String play() { if(isCdFlapOpen()){ throw new CdFlapIsOpenException(); } else if(!isCdFlapOpen()&&getCdDriveContent()==0){ throw new NoCDException(); } else if(!isCdFlapOpen()&&getCdDriveContent()==1&&!checkFormat(loadedCD.getFormat())){ throw new FormatNotSupportedException(); } else if(!isCdFlapOpen()&&getCdDriveContent()==1&&checkFormat(loadedCD.getFormat())){ System.out.println(loadedCD.getFormat()+" "+this.actualPlayTrack+" is playing."); return "AllConditionsForPlayMet"; } return null; } public String changePlaySource(){ if(activeSource.equals("CDDrive")) { this.activeSource = "CDWechseler"; this.cdWechseler=new CDWechseler(); this.cdWechseler.activate(); }else this.activeSource="CDDrive"; return activeSource; } public void loadCDWechseler(CD cd,int index){ if(cdWechseler==null||!cdWechseler.isRunning()){ throw new CDWechselerNotRunningException(); } if(!(this.supportedFormats.contains(cd.getFormat()))){ throw new FormatNotSupportedException(); } if(index>10){ throw new MaxCapacityExceededException(); } cdWechseler.loadOneCD(cd,index); this.loadedCD=cdWechseler.getCDList().get(0); } public void changeToNextCD(){ if(activeSource.equals("CDDrive")){ throw new ChangeCDOnlyOnCDWechselerException(); } List<CD> CDList = cdWechseler.getCDList(); int indexOfLoadedCD=CDList.indexOf(loadedCD); int nextIndex=(indexOfLoadedCD+1)%CDList.size(); this.loadedCD=CDList.get(nextIndex); } public void addToFavoriteSongs(String song){ if(activeSource.equals("CDDrive")){ throw new CDWechselerNotRunningException(); } if(!(favoriteSongs.contains(song))) { favoriteSongs.add(song); } } //Getters, Setters und SupportMethods public void setCD(CD _loadedCD) { loadedCD=_loadedCD; this.setCdDriveContent(); this.actualPlayTrack=loadedCD.getPlayList()[0]; } private void setCdDriveContent() { CdDriveContent = 1; } public void tapOnCdFlap(){ this.CdFlap+=1; } private boolean checkFormat(String format){ if(this.supportedFormats.contains(format)) return true; else return false; } private int getCdDriveContent() { return CdDriveContent; } private boolean isCdFlapOpen() { if(CdFlap==1) { return true; } else return false; } public String getSongByNumber(int songNr){ List<String> playList = Arrays.asList(loadedCD.getPlayList()); return playList.get(songNr); } public String getActualPlayTrack() { return actualPlayTrack; } public void setInfoText() { this.infoText=this.getClass().getSimpleName()+": Item->"+actualPlayTrack+" from Album->"+this.loadedCD.getAlbumName()+" running."; } public CD getCD() { return this.loadedCD; } public CDWechseler getCdWechseler() { return cdWechseler; } public List<String> getFavoriteSongs() { return favoriteSongs; } }