diff --git a/build.xml b/build.xml index 1639645..a0aed17 100644 --- a/build.xml +++ b/build.xml @@ -2,7 +2,7 @@ - + Builds, tests, and runs the project . - + @@ -936,7 +936,7 @@ - + @@ -945,7 +945,7 @@ - + @@ -1059,7 +1059,7 @@ - + @@ -1074,7 +1074,7 @@ - + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index a3de28a..48224f5 100644 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -1,8 +1,8 @@ # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -build.xml.data.CRC32=b8ca046e -build.xml.script.CRC32=518797bb +build.xml.data.CRC32=d5ed72e0 +build.xml.script.CRC32=4c4ce240 build.xml.stylesheet.CRC32=03eab09b -nbproject/build-impl.xml.data.CRC32=b8ca046e -nbproject/build-impl.xml.script.CRC32=a371a0b9 -nbproject/build-impl.xml.stylesheet.CRC32=d670562e +nbproject/build-impl.xml.data.CRC32=d5ed72e0 +nbproject/build-impl.xml.script.CRC32=c6fa47a7 +nbproject/build-impl.xml.stylesheet.CRC32=a4fc63f1 diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties index 4cfb46a..286945a 100644 --- a/nbproject/private/private.properties +++ b/nbproject/private/private.properties @@ -1,7 +1,7 @@ -#Thu Jan 07 23:51:00 EET 2010 -netbeans.user=C\:\\Users\\aNNiMON\\.netbeans\\6.7 +#Wed May 05 19:16:46 EEST 2010 +netbeans.user=C:\\Users\\aNNiMON\\.netbeans\\6.9m1 javadoc.preview=true -deployment.counter=3 config.active= -deployment.number=0.0.2 +deployment.counter=160 app-version.autoincrement=true +deployment.number=0.1.59 diff --git a/nbproject/project.properties b/nbproject/project.properties index ea068d7..3cdfc48 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -17,7 +17,7 @@ deployment.method=NONE deployment.override.jarurl=false dist.dir=dist/${config.active} dist.jad=SEPlayerService.jad -dist.jar=SEPlayerServiceLite.jar +dist.jar=SEPlayerService.jar dist.javadoc.dir=${dist.dir}/doc dist.root.dir=dist extra.classpath=${file.reference.MultimediaServices_API.jar} @@ -50,8 +50,8 @@ manifest.apipermissions= manifest.file=manifest.mf manifest.jad= manifest.manifest= -manifest.midlets=MIDlet-1: SEPSLite,/icon.png,SEPS\n -manifest.others=MIDlet-Vendor: aNNiMON\nMIDlet-Name: SEPlayerServiceLite\nMIDlet-Version: 3.0\n +manifest.midlets=MIDlet-1: SEPS,/icon.png,SEPS\n +manifest.others=MIDlet-Vendor: aNNiMON\nMIDlet-Name: SEPlayerService\nMIDlet-Version: 5.3\n manifest.pushregistry= name=SEPlayerService no.dependencies=false @@ -68,8 +68,8 @@ obfuscator.destjar=${build.dir}/obfuscated.jar obfuscator.srcjar=${build.dir}/before-obfuscation.jar platform.active=Sony_Ericsson_SDK_2_5_0_4_for_the_Java_TM__ME_Platform_Emulator_ platform.active.description=Sony Ericsson SDK 2.5.0.4 for the Java(TM) ME Platform(Emulator) -platform.apis=JSR234-1.0,SATSA-APDU-1.0,JSR211-1.0,JSR75-1.0,J2ME-WS-1.0,J2ME-XMLRPC-1.0,JSR82-1.1,SATSA-JCRMI-1.0,SATSA-CRYPTO-1.0,JSR239-1.0,JSR179-1.0.1,MascotV3-1.0,JSR184-1.1,JSR238-1.0,MMAPI-1.1,NokiaUI-1.0,JSR229-1.1.0,SATSA-PKI-1.0,JSR180-1.0.1,JSR226-1.0,JSR177-1.0,SEMC_EXT_JP8-1.0,VSCL-2.0,VSCL-2.1,WMA-2.0,lib/semc_ext_jp8.jar -platform.bootclasspath=${platform.home}/lib/mascotv3.jar:${platform.home}/lib/jsr226.jar:${platform.home}/lib/jsr256.jar:${platform.home}/lib/satsa-crypto.jar:${platform.home}/lib/jsr229.jar:${platform.home}/lib/jsr238.jar:${platform.home}/lib/j2me-xmlrpc.jar:${platform.home}/lib/jsr211.jar:${platform.home}/lib/vscl21.jar:${platform.home}/lib/satsa-jcrmi.jar:${platform.home}/lib/jsr082.jar:${platform.home}/lib/satsa-apdu.jar:${platform.home}/lib/jsr184.jar:${platform.home}/lib/nokiaext.jar:${platform.home}/lib/jsr239.jar:${platform.home}/lib/jsr75.jar:${platform.home}/lib/jsr179.jar:${platform.home}/lib/satsa-pki.jar:${platform.home}/lib/jsr180.jar:${platform.home}/lib/vscl.jar:${platform.home}/lib/mmapi.jar:${platform.home}/lib/j2me-ws.jar:${platform.home}/lib/wma20.jar:${platform.home}/lib/jsr234.jar:${platform.home}/lib/semc_ext_jp8.jar:${platform.home}/lib/cldcapi11.jar:${platform.home}/lib/midpapi20.jar +platform.apis=JSR234-1.0,SATSA-APDU-1.0,capuchin-1.0,JSR211-1.0,JSR75-1.0,J2ME-WS-1.0,J2ME-XMLRPC-1.0,JSR82-1.1,SATSA-JCRMI-1.0,SATSA-CRYPTO-1.0,JSR239-1.0,JSR179-1.0.1,MascotV3-1.0,JSR184-1.1,JSR238-1.0,MMAPI-1.1,JSR256-1.1,NokiaUI-1.0,JSR229-1.1.0,SATSA-PKI-1.0,JSR180-1.0.1,JSR226-1.0,JSR177-1.0,SEMC_EXT_JP8-1.0,VSCL-2.0,VSCL-2.1,WMA-2.0 +platform.bootclasspath=${platform.home}/lib/mascotv3.jar:${platform.home}/lib/jsr226.jar:${platform.home}/lib/jsr256.jar:${platform.home}/lib/satsa-crypto.jar:${platform.home}/lib/jsr229.jar:${platform.home}/lib/jsr238.jar:${platform.home}/lib/j2me-xmlrpc.jar:${platform.home}/lib/jsr211.jar:${platform.home}/lib/vscl21.jar:${platform.home}/lib/satsa-jcrmi.jar:${platform.home}/lib/jsr082.jar:${platform.home}/lib/satsa-apdu.jar:${platform.home}/lib/jsr184.jar:${platform.home}/lib/nokiaext.jar:${platform.home}/lib/capuchin.jar:${platform.home}/lib/jsr239.jar:${platform.home}/lib/jsr75.jar:${platform.home}/lib/satsa-pki.jar:${platform.home}/lib/jsr179.jar:${platform.home}/lib/jsr180.jar:${platform.home}/lib/vscl.jar:${platform.home}/lib/mmapi.jar:${platform.home}/lib/j2me-ws.jar:${platform.home}/lib/wma20.jar:${platform.home}/lib/jsr234.jar:${platform.home}/lib/semc_ext_jp8.jar:${platform.home}/lib/cldcapi11.jar:${platform.home}/lib/midpapi20.jar platform.configuration=CLDC-1.1 platform.device=SonyEricsson_JP8_240x320_Emu platform.fat.jar=true diff --git a/nbproject/project.xml b/nbproject/project.xml index 77e54fd..02e0398 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -3,7 +3,7 @@ org.netbeans.modules.kjava.j2meproject - SEPlayerService_Lite + SEPlayerService 1.6 diff --git a/src/1.swf b/src/1.swf new file mode 100644 index 0000000..053818c Binary files /dev/null and b/src/1.swf differ diff --git a/src/2.swf b/src/2.swf new file mode 100644 index 0000000..7b924a2 Binary files /dev/null and b/src/2.swf differ diff --git a/src/3.swf b/src/3.swf new file mode 100644 index 0000000..6d80f6d Binary files /dev/null and b/src/3.swf differ diff --git a/src/4.swf b/src/4.swf new file mode 100644 index 0000000..079d0a7 Binary files /dev/null and b/src/4.swf differ diff --git a/src/5.swf b/src/5.swf new file mode 100644 index 0000000..60b3f77 Binary files /dev/null and b/src/5.swf differ diff --git a/src/6.swf b/src/6.swf new file mode 100644 index 0000000..6773efc Binary files /dev/null and b/src/6.swf differ diff --git a/src/Canv.java b/src/Canv.java index 8c5b0dd..629b9c1 100644 --- a/src/Canv.java +++ b/src/Canv.java @@ -1,8 +1,11 @@ - import com.nokia.mid.ui.DeviceControl; import com.sonyericsson.multimedia.*; import com.sonyericsson.multimedia.control.*; +import java.io.IOException; +import java.util.Calendar; +import javax.microedition.io.Connector; import javax.microedition.lcdui.*; +import javax.microedition.sensor.*; /* * To change this template, choose Tools | Templates @@ -20,10 +23,17 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { public static int softUp1, softUp2, softDn1, softDn2, background, line, text, valuet, inf; private int w,h; - private boolean lite, vis; + private boolean lite; private int mode; + private int accelPrevDelta = 0; private Lyrics lrc; + public RateImpl ri; + + private byte repeat;//функция повтора + private int a,b; + + public Object swf; private Image I, album; private Engine2 e2; @@ -34,23 +44,34 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private MultimediaService service = null; private MediaControl mediaControl = null; - private Media media = null; + public Media media = null; + + private int[] channels = new int[3]; + private String[] channelNames = new String[3]; + private SensorConnection sensor; + private String URL; public Canv() { setFullScreenMode(true); thr = new Thread(this); thr.start(); lite = false; - vis = true; + repeat = 0; mode = 0; //Режим плейера w = getWidth(); h = getHeight(); I = Image.createImage(w, h); G = I.getGraphics(); + getInfo(); service = MultimediaServiceManager.getMultimediaService("MediaPlayer"); mediaControl = (MediaControl)service.getControl("MediaControl"); mediaControl.addMediaControlListener(this); - playTrack(); + if(Rms.visid!=0) swf = new Capuchin(Rms.visid); + if(Rms.stat) { + ri = new RateImpl(); + ri.open(); + } + if(Rms.startPlayer) playTrack(); } protected void paint(Graphics g) { @@ -66,27 +87,42 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { if (media != null) { MetaData metaData = media.getMetaData(); if (metaData != null) { - Object data = metaData.getValue(MetaData.TITLE_KEY); + Object data = getValue(metaData, MetaData.TITLE_KEY); if (data != null) drawTitle(g, (String) data); if (album != null) { int ih = h-2*medFont.getHeight()-6; if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); g.drawImage(album, w/2, h/2, 3); - }else if(vis){ - if(e2==null) { - int ih = h-(2*medFont.getHeight())-6; - e2 = new Engine2(w-6, ih); - e2.setRun(true); + }else if(Rms.vis){ + int ih = h-(2*medFont.getHeight())-6; + if(Rms.visid==0) { + if(e2==null) { + e2 = new Engine2(w-6, ih); + e2.setRun(true); + } + g.drawImage(e2.MainCanvas(), w/2, h/2, 3); + } else{ + ((Capuchin) swf).drawFlash(g, 3, h/2-(ih/2), w-6, ih); } - g.drawImage(e2.MainCanvas(), w/2, h/2, 3); } if(Rms.isLyric && lrc!=null) { - drawCenter(g, lrc.get5Lines(media.getMediaTime())); + try { + drawCenter(g, lrc.get5Lines(media.getMediaTime())); + } catch (Exception e) {} } } } - drawSoft(g, "Меню", "Выход"); + drawSoft(g, SEPS.midlet.lang.menu, SEPS.midlet.lang.exit); + } + + private String getValue(MetaData metaData, String md) { + String data = metaData.getValue(md); + StringBuffer sb = new StringBuffer(); + for(int i=0; iih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); - g.drawImage(album, w/2, py+15, 17); - }else if(vis){ - if(e2==null) { - int ih = h-fh-2-py-20; - e2 = new Engine2(ih, ih); - e2.setRun(true); - } - g.drawImage(e2.MainCanvas(), w/2, py+15, 17); - } - - if(vis) { - g.setColor(inf); - g.drawString("Visual", 2, py+15+(smallFont_b.getHeight()+2), 20); - } - if(Rms.isLyric) { - g.setColor(inf); - g.drawString("Lyrics", 2, py+15+2*(smallFont_b.getHeight()+2), 20); - } - float div = ((float)w - 10) / (float)media.getDuration(); g.setColor(valuet); - g.fillRect(5, py, (int)(media.getMediaTime() * div), 10); + int mgt = media.getMediaTime(); + g.fillRect(5, py, (int)(mgt * div), 10); + g.setColor(inf); + if(repeat==1) g.drawLine(5+(int)(a*div), py, 5+(int)(a*div), py+10); + if(repeat==2) { + g.drawLine((int)(a*div), py, (int)(a*div), py+10); + g.drawLine((int)(b*div), py, (int)(b*div), py+10); + } g.setColor(text); g.drawRect(5, py, w-10, 10); } } - drawSoft(g, "Меню", "Выход"); + if (album != null) { + int ih = h-fh-2-py-20; + if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); + g.drawImage(album, w/2, py+15, 17); + }else if(Rms.vis){ + int ih = h-fh-2-py-20; + if(Rms.visid==0) { + if(e2==null) { + e2 = new Engine2(ih, ih); + e2.setRun(true); + } + g.drawImage(e2.MainCanvas(), w/2, py+15, 17); + } else{ + ((Capuchin) swf).drawFlash(g, w/2-ih/2, py+15, ih, ih); + } + } + g.setColor(inf); + if(Rms.vis) g.drawString("*-V", 2, py+15, 20); + if(Rms.isLyric) g.drawString("0-L", 2, py+15+(smallFont_b.getHeight()+2), 20); + if(Rms.accel) g.drawString("#-A", 2, py+15+2*(smallFont_b.getHeight()+2), 20); + if(Rms.slpmode) g.drawString("S", 2, py+15+3*(smallFont_b.getHeight()+2), 20); + drawSoft(g, SEPS.midlet.lang.menu, SEPS.midlet.lang.exit); } public void keyPressed(int key) { int ga=getGameAction(key); if(key==-7) { - pauseTrack(); + if(Rms.closePlayer) pauseTrack(); SEPS.midlet.destroyApp(true); } if(key==-6) new Menu(); - if(key==KEY_STAR) vis=!vis; + if(key==KEY_POUND) Rms.accel=!Rms.accel; + if(key==KEY_STAR) Rms.vis=!Rms.vis; if(key==KEY_NUM0) Rms.isLyric=!Rms.isLyric; - if(key==KEY_NUM1) rewind(); - if(key==KEY_NUM3) fastForward(); + if(key==KEY_NUM4) rewind(); + if(key==KEY_NUM6) fastForward(); + if(key==KEY_NUM3) ABRepeat(); + if(key==KEY_NUM1) { + String art="",tit=""; + try{ + MetaData metaData = SEPS.midlet.cnv.media.getMetaData(); + tit = getValue(metaData, MetaData.TITLE_KEY); + art = getValue(metaData, MetaData.ARTIST_KEY); + }catch(Exception ex){} + FindLyrics fl = new FindLyrics(); + fl.find(art, tit);//SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); + } + if(key==KEY_NUM9) new SetSleepMode();//SEPS.midlet.dsp.setCurrent(); + if(ga==LEFT && key!=KEY_NUM4) prevTrack(); + if(ga==RIGHT && key!=KEY_NUM6) nextTrack(); switch(ga) { - case LEFT: - prevTrack(); - break; - case RIGHT: - nextTrack(); - break; case UP: upMode(); break; case DOWN: - downMode(); + upMode(); break; case FIRE: try { - if (mediaControl.getState() == mediaControl.STATE_PLAY) pauseTrack(); + if (mediaControl.getState() == mediaControl.STATE_PLAY) pauseTrack(); else playTrack(); } catch (Exception e) { } @@ -184,11 +234,120 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { keyPressed(key); } + public int getDelta(int channel, int threshold) { + int delta = 0; + try { + Data[] data = sensor.getData(1, -1, false, false, false); + int drx = 0; + + for (int i = 0; i < data.length; i++) { + if (data[i].getChannelInfo().getName().equals(channelNames[channel])) { + drx = data[i].getIntValues()[0]; + } + } + + delta = channels[channel] - drx; + channels[channel] = drx; + + if (Math.abs(delta) < threshold) { + delta = 0; + } + } catch (Throwable t) { + } + + return delta; + } + public void run() { while (true) { try { if(Rms.light) DeviceControl.setLights(0, 100); - if(!vis) Thread.sleep(100); + final int delta = getDelta(0, Rms.sensetivity); + if (delta != 0) { + if (accelPrevDelta != 0 && (delta * accelPrevDelta) < 0) { + accelPrevDelta = 0; + } else { + accelPrevDelta = delta; + + Runnable runnable = new Runnable() { + + public void run() { + if (delta > 0 && Rms.accel) { + nextTrack(); + } else if (delta < 0 && Rms.accel) { + if(Rms.listfw) nextTrack(); + else prevTrack(); + } + } + }; + (new Thread(runnable)).start(); + } + } + if(!Rms.vis) Thread.sleep(100); + if(Rms.slpmode) { + if(getTime()) { + pauseTrack(); + SEPS.midlet.destroyApp(true); + } + } + if(repeat==2) { + try { + int mgt = media.getMediaTime(); + int sk = Math.abs(b-a); + if(mgt>=b) mediaControl.skip(-sk); + } catch (ControlException ex) { + ex.printStackTrace(); + } + } + if((Rms.stat || Rms.urlstat || Rms.actmenu) && media!=null) { + MetaData metaData = media.getMetaData(); + Object data = getValue(metaData, MetaData.ARTIST_KEY); + String thisSong = (String) data; + data = getValue(metaData, MetaData.TITLE_KEY); + thisSong = thisSong+" - "+ (String) data; + if(!thisSong.equalsIgnoreCase(Rms.lastSong)) { + int thisTime = media.getMediaTime(); + int allTime = media.getDuration()*20/*% проиграно*//100; + if(thisTime>allTime) { + int cn = 1; + if(Rms.stat) { + Rms.lastSong = thisSong; + cn = ri.update(thisSong); + } + if(Rms.urlstat) { + FindLyrics fl = new FindLyrics(); + fl.scrob(thisSong); + Rms.lastSong = thisSong; + } + if(Rms.actmenu) { + try { + Image icon = Image.createImage("/icon.png"); + StringBuffer sb = new StringBuffer();//String desc = ""; + if(Rms.stat) { sb.append(cn); sb.append(" |");} + allTime = media.getDuration(); + int hh = 0, m=0, s = 0; + if(allTime<60) s=allTime; + else { + if(allTime<3600) { + m = allTime/60; + s = allTime - m*60; + }else{ + m = allTime/60; + hh = m/60; m=m-hh*60; + } + } + if(hh>0) {sb.append(hh); sb.append(" :");} + if(m>0) {if(m>10) sb.append(0); sb.append(m); sb.append(" :");} + if(s>10) sb.append(0); + sb.append(s); + com.sonyericsson.ui.UIActivityMenu.getInstance(SEPS.midlet).addEvent(thisSong, sb.toString(), icon, null); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + } + } if (service != null) { repaint(); } @@ -198,6 +357,36 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } } + /** + * Переключение трека + */ + private void newTrack() { + a=b=0; repeat = 0; + SEPS.midlet.dsp.vibrate(Rms.vibrlen); + if (Rms.flash) { + DeviceControl.setLights(0, 0); + DeviceControl.setLights(0, 100); + } + } + + private void getInfo() { + SensorInfo[] info = SensorManager.findSensors("acceleration", null); + for (int i = 0; i < info.length; i++) { + SensorInfo s = info[i]; + URL = s.getUrl(); + ChannelInfo[] ci = s.getChannelInfos(); + for (int r = 0; r < ci.length; r++) { + ChannelInfo c = ci[r]; + channelNames[r] = c.getName(); + } + } + try { + sensor = (SensorConnection) Connector.open(URL); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + private void initLyric(Media med) { if (med == null) {return;} lrc = null; @@ -205,13 +394,13 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { String fl = ""; MetaData metaData = med.getMetaData(); if (metaData != null) { - Object data = metaData.getValue(MetaData.ARTIST_KEY); + Object data = getValue(metaData, MetaData.ARTIST_KEY); if (data != null) at=at +(String)(data) + " - "; - data = metaData.getValue(MetaData.TITLE_KEY); + data = getValue(metaData, MetaData.TITLE_KEY); if (data != null) at+=(String) data; - data = metaData.getValue(MetaData.FILE_URI_KEY); + data = getValue(metaData, MetaData.FILE_URI_KEY); if (data != null) {fl=(String) data;fl=fl.substring(fl.lastIndexOf('/')+1, fl.lastIndexOf('.'));} if(Lyrics.isExists(at)) lrc = new Lyrics(at); @@ -221,6 +410,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private void nextTrack() { try { + newTrack(); mediaControl.next(); } catch (ControlException ex) { ex.printStackTrace(); @@ -229,6 +419,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private void prevTrack() { try { + newTrack(); mediaControl.prev(); } catch (ControlException ex) { ex.printStackTrace(); @@ -267,31 +458,13 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } } -// public static String getTime(int mode) { -// String dd, mm, yy, _h, m, s; -// Calendar cal = Calendar.getInstance (); -// dd = String.valueOf (cal.get (Calendar.DAY_OF_MONTH)); -// if (dd.length () == 1) -// dd = "0" + dd; -// mm = String.valueOf (cal.get (Calendar.MONTH) + 1); -// if (mm.length () == 1) -// mm = "0" + mm; -// yy = String.valueOf (cal.get (Calendar.YEAR)); -// _h = String.valueOf (cal.get (Calendar.HOUR_OF_DAY)); -// if (_h.length () == 1) -// _h = "0" + _h; -// m = String.valueOf (cal.get (Calendar.MINUTE)); -// if (m.length () == 1) -// m = "0" + m; -// s = String.valueOf (cal.get (Calendar.SECOND)); -// if (s.length () == 1) -// s = "0" + s; -// String time; -// if(mode==1) time = _h+":"+m+":"+s; -// else if(mode==2) time = (dd+"."+mm+"."+yy.substring(2)); -// else time = (dd+"."+mm+"."+yy.substring(2)+" "+_h+":"+m+":"+s); -// return time; -// } + private boolean getTime() { + Calendar cal = Calendar.getInstance (); + int ch = cal.get(Calendar.HOUR_OF_DAY); + int cm = cal.get(Calendar.MINUTE); + if(ch!=Rms.dh) return false; + else return (cm>=Rms.dm); + } public void mediaControlUpdate(int eventId, ControlEvent event) { try { @@ -321,6 +494,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { album = null; } } + a = b = 0; repeat = 0; if(Rms.isLyric) initLyric(this.media); } catch (Throwable t) { t.printStackTrace(); @@ -411,23 +585,15 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } - private int drawText(Graphics g, String name, String value, int y) { + private int drawText(Graphics g, String value, int y) { g.setColor(line); g.drawLine(3, y-1, w-3, y-1); - if(Rms.skinid==3) {value=toEmo(value); name=toEmo(name);} + if(Rms.skinid==3) {value=toEmo(value);} - g.setColor(text); - g.setFont(smallFont_b); - g.drawString(name, 5, y, 20); - - int tw = 15+smallFont_b.stringWidth(name); g.setColor(valuet); - if(smallFont_b.stringWidth(value)>tw) { - g.translate(tw-10, g.getTranslateY()); - g.drawString(value, 2, y, 20); - g.translate(-(tw-10), -g.getTranslateY()); - }else g.drawString(value, w-5, y, 24); + g.setFont(smallFont_b); + g.drawString(value, w/2, y, 17); return y+(smallFont_b.getHeight()+2); } @@ -447,15 +613,31 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { return sb.toString(); } - private void downMode() { - mode = 1-mode; - e2=null; - album = null; - } - private void upMode() { mode = 1-mode; e2=null; album = null; } + + private void ABRepeat() { + try { + repeat++; + switch (repeat) { + case 1: // ставим A + a = media.getMediaTime(); + break; + case 2: // ставим B + b = media.getMediaTime(); + if(a>b) { + int t = b; b=a; a=t; + } + break; + case 3: // конец повтора + a = b = 0; + repeat = 0; + break; + } + } catch (Exception e) { + } + } } \ No newline at end of file diff --git a/src/Capuchin.java b/src/Capuchin.java new file mode 100644 index 0000000..db558ea --- /dev/null +++ b/src/Capuchin.java @@ -0,0 +1,37 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +import com.sonyericsson.capuchin.*; +import javax.microedition.lcdui.*; + +/** + * @author aNNiMON + */ +public class Capuchin { + + //public FlashPlayer flashPlayer; + public FlashImage flashImage; + //public FlashCanvas flashCanvas; + + public Capuchin(int i) { +// flashPlayer = null; + flashImage = null; +// flashCanvas = null; + try + { + flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i)+".swf"), null); +// if(flashImage != null) +// { +// flashCanvas = new FlashCanvas(flashImage); +// flashPlayer = FlashPlayer.createFlashPlayer(flashImage, flashCanvas); +// flashCanvas.setFullScreenMode(true); +// } + } + catch(Exception ex) {} + } + + public void drawFlash(Graphics g, int x, int y, int w, int h) { + if(flashImage!=null) flashImage.render(g, x, y, w, h); + } +} \ No newline at end of file diff --git a/src/FindLyrics.java b/src/FindLyrics.java new file mode 100644 index 0000000..a87c343 --- /dev/null +++ b/src/FindLyrics.java @@ -0,0 +1,142 @@ + +import java.io.*; +import javax.microedition.io.*; +import javax.microedition.io.file.FileConnection; + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author aNNiMON + */ +public class FindLyrics { + + String MSG; + + public FindLyrics() { + + } + public boolean find(String artist, String title) { + MSG = ""; + String url = "http://www.lyricsplugin.com/winamp03/plugin/?artist="+urlName(artist)+"&title="+urlName(title); + try { + byte[] res = send(url); + int lr1 = MSG.indexOf("
"); + int lr2 = MSG.indexOf("
", lr1); + if((lr2-lr1)>30) { + FileConnection fc; + fc = (FileConnection) Connector.open("file:///" + Rms.lrcpath+artist+" - "+title+".html"); + if(fc.exists()) fc.delete(); + fc.create(); + OutputStream os = fc.openOutputStream(); + os.write(res); + os.flush(); + os.close(); + fc.close(); + return true; + } + } catch (Exception e) { + } + return false; + } + + public void scrob(String song) { + String artist = song.substring(0, song.lastIndexOf('-')).trim(); + String title = song.substring(song.lastIndexOf('-')+1).trim(); + MSG = ""; + String url = "http://annimon.z83.ru/nowplaying.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title); + try { + send(url); + } catch (Exception e) { + } + } + + private byte[] send(String url) throws Exception { + HttpConnection hc = null; + InputStream is = null; + byte[] res = null; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try { + hc = (HttpConnection) Connector.open(url); + int ch; + is = hc.openInputStream(); + StringBuffer sb = new StringBuffer(); + while ((ch = is.read()) != -1) { + sb.append(StringEncoder.decodeCharCP1251((byte)ch)); + bos.write(ch); + } + MSG = sb.toString(); + res = bos.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (bos != null) bos.close(); + if (is != null) is.close(); + if (hc != null) hc.close(); + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return res; + } + + private String urlName(String url) { + if (url == null) return null; + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < url.length(); i++) { + char ch = url.charAt(i); + switch (ch) { + default: + if (ch < '\200') { + sb.append(ch); + break; + } + if (ch > '\177' && ch < '\u0800') { + sb.append('%'); + sb.append(Integer.toHexString((ch >> 6 | 0xc0) + 256).substring(1)); + sb.append('%'); + sb.append(Integer.toHexString((ch & 0x3f | 0x80) + 256).substring(1)); + break; + } + if (ch > '\u07FF' && ch < '\0') { + sb.append('%'); + sb.append(Integer.toHexString((ch >> 12 | 0xe0) + 256).substring(1)); + sb.append('%'); + sb.append(Integer.toHexString((ch >> 6 & 0x3f | 0x80) + 256).substring(1)); + sb.append('%'); + sb.append(Integer.toHexString((ch & 0x3f | 0x80) + 256).substring(1)); + } + break; + case 0: //'\0' + case 32: sb.append("%20"); break;// ' ' + case 61: sb.append("%3d"); break;// '=' + case 43: sb.append("%2b"); break;// '+' + case 39: sb.append("%27"); break;// '\'' + case 46: sb.append("%2E"); break;// '.' + case 60: sb.append("%3c"); break;// '<' + case 62: sb.append("%3e"); break;// '>' + case 35: sb.append("%23"); break;// '#' + case 37: sb.append("%25"); break;// '%' + case 38: sb.append("%26"); break;// '&' + case 123:sb.append("%7b"); break;// '{' + case 125:sb.append("%7d"); break;// '}' + case 92: sb.append("%5c"); break;// '\\' + case 94: sb.append("%5e"); break;// '^' + case 126:sb.append("%73"); break;// '~' + case 91: sb.append("%5b"); break;// '[' + case 93: sb.append("%5d"); break;// ']' + case 58: sb.append("%3A"); break;// ':' + case 47: sb.append("%2F"); break;// '/' + case 63: sb.append("%3F"); break;// '?' + case 45: sb.append("%2D"); break;// '-' + case 33: sb.append("%21"); break;// '!' + case 59: sb.append("%3B"); break;// ';' + } + } + return sb.toString(); + } +} diff --git a/src/FindText.java b/src/FindText.java new file mode 100644 index 0000000..aeb6936 --- /dev/null +++ b/src/FindText.java @@ -0,0 +1,57 @@ + +import com.sonyericsson.multimedia.MetaData; +import javax.microedition.lcdui.*; + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +/** + * + * @author aNNiMON + */ +public class FindText extends Form implements CommandListener { + + private Command back, ok; + public TextField artist, title; + + public FindText() { + super(SEPS.midlet.lang.findtext); + back = new Command(SEPS.midlet.lang.back, Command.BACK, 2); + ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1); + String ar="",ti=""; + try{ + MetaData metaData = SEPS.midlet.cnv.media.getMetaData(); + ti = getValue(metaData, MetaData.TITLE_KEY); + ar = getValue(metaData, MetaData.ARTIST_KEY); + }catch(Exception ex){} + artist = new TextField(SEPS.midlet.lang.artist, ar, 255, TextField.ANY); + title = new TextField(SEPS.midlet.lang.title, ti, 255, TextField.ANY); + append(artist); + append(title); + addCommand(ok); + addCommand(back); + setCommandListener(this); + SEPS.midlet.dsp.setCurrent(this); + } + + private String getValue(MetaData metaData, String md) { + String data = metaData.getValue(md); + StringBuffer sb = new StringBuffer(); + for(int i=0; i= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch)); + strBuff.append(StringEncoder.decodeCharCP1251((byte)ch)); } dis.close(); } catch (Exception e) {e.printStackTrace();} diff --git a/src/Lang.java b/src/Lang.java new file mode 100644 index 0000000..8d86109 --- /dev/null +++ b/src/Lang.java @@ -0,0 +1,97 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author aNNiMON + */ +public class Lang { + + String menu, back, exit, ok, findtext, artist, title, textsaving, nofound; + String site, scrobdb, about, sreturn, sleepmode, options, minimise; + String sensetivity, textfolder, vibro, skin, visual, origseps, elements, + gothic, emo,light, start, stop, flashlight, tooff, + statlocal, scrobbling, origjava, circles, uiactivity, listforward; + + public Lang(int id) { + if(id==0) { + menu = "Menu"; + back = "Back"; + exit = "Exit"; + ok = "Ok"; + findtext = "Text Search"; + artist = "Artist"; + title = "Title"; + textsaving = "Text saved\n"; + nofound = "Not found\n"; + site = "Site"; + scrobdb = "Scrobbling info"; + about = "About"; + sreturn = "Return"; + sleepmode = "Sleep Mode"; + options = "Options"; + minimise = "Minimise"; + sensetivity = "Sensetivity to switch:"; + textfolder = "Folder with the text:"; + vibro = "Vibration switch (in ms):"; + skin = "Skins"; + visual = "Visualization"; + origseps = "Original SEPS"; + gothic = "Gothic"; + emo = "Emo"; + light = "Backlight"; + start = "Launch player when program start"; + stop = "Close player when program exit"; + flashlight = "Flash backlight"; + statlocal = "Statistics (need to restart app)"; + scrobbling = "Scrobbling (annimon.z83.ru)"; + origjava = "Original Java"; + circles = "Circles (1.swf)"; + elements = "Elements: "; + tooff = "Time to turn off (in minutes):"; + uiactivity = "Sync. with ActivityMenu"; + listforward = "List Forward"; + }else{ + menu = "Меню"; + back = "Назад"; + exit = "Выход"; + ok = "Ok"; + findtext = "Поиск текстов"; + artist = "Исполнитель"; + title = "Заголовок"; + textsaving = "Текст сохранен\n"; + nofound = "Не найдено\n"; + site = "На сайт"; + scrobdb = "Данные скробблинга"; + about = "О программе"; + sreturn = "Вернуться"; + sleepmode = "Спящий режим"; + options = "Настройки"; + minimise = "Свернуть"; + sensetivity = "Чувствительность к переключению:"; + textfolder = "Папка с текстами:"; + vibro = "Вибрация при переключении (в мс):"; + skin = "Скины"; + visual = "Визуализации"; + origseps = "Стандартный SEPS"; + gothic = "Готический"; + emo = "Эмо"; + light = "Постоянная подсветка"; + start = "Запускать плейер при старте программы"; + stop = "Закрывать плейер при выходе из программы"; + flashlight = "Мигание подсветкой"; + statlocal = "Вести статистику (необходим перезапуск)"; + scrobbling = "Скробблинг"; + origjava = "Стандартный Java"; + circles = "Круги (1.swf)"; + elements = "Всего элементов: "; + tooff = "Врямя до выключения (в минутах):"; + uiactivity = "Синхр. с Меню Событий"; + listforward = "Листать вперед"; + } + } + + +} diff --git a/src/Lyrics.java b/src/Lyrics.java index a7395f3..f1dd213 100644 --- a/src/Lyrics.java +++ b/src/Lyrics.java @@ -87,7 +87,7 @@ public class Lyrics { int ch = 0; while ((ch = is.read()) != -1) { - sb.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch)); + sb.append(StringEncoder.decodeCharCP1251((byte)ch)); } is.close(); fc.close(); @@ -108,6 +108,7 @@ public class Lyrics { { Vector v = new Vector(); char c = '\n'; + for(int i=0; i<=5; i++) {text=("[00:00.00] \n")+text+("[999:00.00] \n");} int j = text.length(); String s2 = ""; for(int k = 0; k < j; k++) @@ -115,7 +116,7 @@ public class Lyrics { int i = text.charAt(k); if(i == c) { - if(s2.length() > 0) + if(s2.length() > 0 && s2.startsWith("[")) { if(time && isNumChar(s2.charAt(1))) v.addElement(s2.substring(0, s2.indexOf(']')+1).trim()); else if(isNumChar(s2.charAt(1))) v.addElement(s2.substring(s2.lastIndexOf(']')+1).trim()); @@ -126,7 +127,7 @@ public class Lyrics { s2 = s2 + String.valueOf((char)i); } } - if(s2.length() > 0) { + if(s2.length() > 0 && s2.startsWith("[")) { if(time && isNumChar(s2.charAt(1))) v.addElement(s2.substring(0, s2.indexOf(']')+1).trim()); else if(isNumChar(s2.charAt(1))) v.addElement(s2.substring(s2.lastIndexOf(']')+1).trim()); } @@ -174,7 +175,7 @@ public class Lyrics { * Преобразовывает все неинтернет ссылки в нормальные, например убирая пробелы или лишние символы. * @param url - исходный адрес * @return - правильный адрес на выходе - */ + private String urlName(String url) { if (url == null) return null; StringBuffer sb = new StringBuffer(); @@ -229,5 +230,5 @@ public class Lyrics { } } return sb.toString(); - } + }*/ } diff --git a/src/Menu.java b/src/Menu.java index b3be7f6..b3aa97f 100644 --- a/src/Menu.java +++ b/src/Menu.java @@ -15,8 +15,10 @@ public class Menu implements CommandListener { private Display dsp; public Menu() { - String[] m = new String[] {"Вернуться", "Настройки", "О программе", "Свернуть", "Выход"}; - ls = new List("Меню", List.IMPLICIT, m, null); + String[] m = new String[] {SEPS.midlet.lang.sreturn, SEPS.midlet.lang.sleepmode, + SEPS.midlet.lang.findtext, SEPS.midlet.lang.options, SEPS.midlet.lang.about, + SEPS.midlet.lang.minimise, SEPS.midlet.lang.exit}; + ls = new List(SEPS.midlet.lang.menu, List.IMPLICIT, m, null); ls.setCommandListener(this); dsp = SEPS.midlet.dsp; dsp.setCurrent(ls); @@ -27,10 +29,12 @@ public class Menu implements CommandListener { int i = ls.getSelectedIndex(); switch(i) { case 0: dsp.setCurrent(SEPS.midlet.cnv); break; - case 1: dsp.setCurrent(new Options()); break; - case 2: dsp.setCurrent(new Info()); break; - case 3: dsp.setCurrent(null); break; - case 4: SEPS.midlet.destroyApp(true); break; + case 1: dsp.setCurrent(new SetSleepMode()); break; + case 2: dsp.setCurrent(new FindText()); break; + case 3: dsp.setCurrent(new Options()); break; + case 4: dsp.setCurrent(new Info()); break; + case 5: dsp.setCurrent(null); break; + case 6: SEPS.midlet.destroyApp(true); break; } } } diff --git a/src/Options.java b/src/Options.java index 277b58b..e2bea30 100644 --- a/src/Options.java +++ b/src/Options.java @@ -1,3 +1,4 @@ +import java.util.Random; import javax.microedition.lcdui.*; /* @@ -12,21 +13,24 @@ import javax.microedition.lcdui.*; public class Options extends Form implements CommandListener { private Command back,ok; - private TextField az, un, cc, hp; - private ChoiceGroup skin, cRC; + private TextField zw, az, un; + private ChoiceGroup skin, vis, cRC, lang; public Options() { - super("Настройки"); - back = new Command("Назад", Command.BACK, 3); - ok = new Command("Ok", Command.OK, 1); - az = new TextField("Папка с текстами:", Rms.lrcpath, 256, TextField.ANY); -// un = new TextField(L.str[L.noc]+":", String.valueOf(P.undo), 2, TextField.NUMERIC); + super(SEPS.midlet.lang.options); + back = new Command(SEPS.midlet.lang.back, Command.BACK, 3); + ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1); + zw = new TextField(SEPS.midlet.lang.sensetivity, String.valueOf(Rms.sensetivity), 4, TextField.NUMERIC); + az = new TextField(SEPS.midlet.lang.textfolder, Rms.lrcpath, 256, TextField.ANY); + un = new TextField(SEPS.midlet.lang.vibro, String.valueOf(Rms.vibrlen), 4, TextField.NUMERIC); // cc = new TextField(L.str[L.cch]+":", "000000", 6, TextField.ANY); // hp = new TextField(L.str[L.ach], String.valueOf(P.heap), 2, TextField.ANY); - skin = new ChoiceGroup ("Скины", ChoiceGroup.EXCLUSIVE); + lang = new ChoiceGroup ("Language / Язык", ChoiceGroup.EXCLUSIVE); + skin = new ChoiceGroup (SEPS.midlet.lang.skin, ChoiceGroup.EXCLUSIVE); + vis = new ChoiceGroup (SEPS.midlet.lang.visual, ChoiceGroup.EXCLUSIVE); cRC = new ChoiceGroup ("", ChoiceGroup.MULTIPLE); - appendOther(); + appendSkin(); StrokeStyle(); } @@ -35,16 +39,27 @@ public class Options extends Form implements CommandListener { if ((c==ok || c==List.SELECT_COMMAND)) { new Skin(Rms.skinid = skin.getSelectedIndex()); + SEPS.midlet.lang = new Lang(Rms.lngid = lang.getSelectedIndex()); + Rms.visid = vis.getSelectedIndex(); + if(Rms.visid!=0) SEPS.midlet.cnv.swf = new Capuchin (Rms.visid); + Rms.sensetivity=Integer.parseInt(zw.getString()); + Rms.vibrlen=Integer.parseInt(un.getString()); Rms.lrcpath=az.getString(); // P.az=Integer.parseInt(az.getString()); // P.curcolor = getHexValue(cc.getString()); // P.heap = Integer.parseInt(hp.getString()); Rms.light = cRC.isSelected(0); -// P.dsI = cRC.isSelected(1); -// P.isUndo = cRC.isSelected(2); -// P.isEfView = cRC.isSelected(3); -// P.isLight = cRC.isSelected(4); -// P.BOC = cRC.isSelected(5); + Rms.startPlayer = cRC.isSelected(1); + Rms.closePlayer = cRC.isSelected(2); + Rms.flash = cRC.isSelected(3); + Rms.statGo = cRC.isSelected(4); if(!Rms.statGo) Rms.stat=Rms.statGo; + Rms.urlstat = cRC.isSelected(5); + Rms.actmenu = cRC.isSelected(6); + Rms.listfw = cRC.isSelected(7); + if(Rms.urlstat && Rms.id==0) { + Random rnd = new Random(); + Rms.id = (rnd.nextInt() >>> 1) % 10000000; + } // P.undo=Integer.parseInt(un.getString()); // Editor.isteps = new Image[P.undo]; // Editor.ist=0; @@ -53,38 +68,61 @@ public class Options extends Form implements CommandListener { } private void StrokeStyle() { + append(lang); append(skin); + append(zw); append(az); -// append(cc); + append(un); + append(vis); // append(hp); append(cRC); -// append(un); addCommand(ok); addCommand(back); setCommandListener(this); SEPS.midlet.dsp.setCurrent(this); } - private void appendOther() { - skin.append("Стандартный SEPS", null); + private void appendSkin() { + lang.append("English", null); + lang.append("Русский", null); + lang.setSelectedIndex(Rms.lngid, true); + + skin.append(SEPS.midlet.lang.origseps, null); skin.append("ProPaintMobile", null); - skin.append("Готический", null); - skin.append("Эмо", null); + skin.append(SEPS.midlet.lang.gothic, null); + skin.append(SEPS.midlet.lang.emo, null); skin.append("SEclub.ORG", null); skin.append("aNNiMON Forum", null); skin.setSelectedIndex(Rms.skinid, true); - cRC.append("Постоянная подсветка", null); -// cRC.append(L.str[L.stias], null); -// cRC.append(L.str[L.aplca], null); -// cRC.append(L.str[L.prwef], null); + cRC.append(SEPS.midlet.lang.light, null); + cRC.append(SEPS.midlet.lang.start, null); + cRC.append(SEPS.midlet.lang.stop, null); + cRC.append(SEPS.midlet.lang.flashlight, null); + cRC.append(SEPS.midlet.lang.statlocal, null); + cRC.append(SEPS.midlet.lang.scrobbling, null); + cRC.append(SEPS.midlet.lang.uiactivity, null); + cRC.append(SEPS.midlet.lang.listforward, null); // cRC.append(L.str[120], null); // cRC.append(L.str[123], null); cRC.setSelectedIndex(0, Rms.light); -// cRC.setSelectedIndex(1, P.dsI); -// cRC.setSelectedIndex(2, P.isUndo); -// cRC.setSelectedIndex(3, P.isEfView); -// cRC.setSelectedIndex(4, P.isLight); -// cRC.setSelectedIndex(5, P.BOC); + cRC.setSelectedIndex(1, Rms.startPlayer); + cRC.setSelectedIndex(2, Rms.closePlayer); + cRC.setSelectedIndex(3, Rms.flash); + cRC.setSelectedIndex(4, Rms.stat); + cRC.setSelectedIndex(5, Rms.urlstat); + cRC.setSelectedIndex(6, Rms.actmenu); + cRC.setSelectedIndex(7, Rms.listfw); + + vis.append(SEPS.midlet.lang.origjava, null); + vis.append(SEPS.midlet.lang.circles, null); + vis.append("Kaleidoscope black (2.swf)", null); + vis.append("Laura sb strobe (3.swf)", null); + vis.append("Precision red (4.swf)", null); + vis.append("Rain (5.swf)", null); + vis.append("Power dots (6.swf)", null); +// vis.append("Jet (7.swf)", null); +// vis.append("Jet (8.swf)", null); + vis.setSelectedIndex(Rms.visid, true); } } diff --git a/src/Rate.java b/src/Rate.java new file mode 100644 index 0000000..71ffbef --- /dev/null +++ b/src/Rate.java @@ -0,0 +1,14 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author aNNiMON + */ +public class Rate { + + String song; + int rate; +} diff --git a/src/RateImpl.java b/src/RateImpl.java new file mode 100644 index 0000000..161850d --- /dev/null +++ b/src/RateImpl.java @@ -0,0 +1,139 @@ +import java.io.*; +import java.util.Vector; +import javax.microedition.io.*; +import javax.microedition.io.file.FileConnection; + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author aNNiMON + */ +public class RateImpl { + + public int numRates; //кол-во + public Vector rates; + + public int update(String song) { + int s = rates.size(); + if(s!=0) + for(int i=0; i 0) + { + try { + Rate r = new Rate(); + r.rate = Integer.parseInt(s2.substring(0, s2.lastIndexOf('|')).trim()); + r.song = s2.substring(s2.lastIndexOf('|') + 1).trim(); + rates.addElement(r); + } catch (Exception ex) { + } + s2 = ""; + } + }else s2 = s2 + String.valueOf((char)i); + } + if(s2.length() > 0) { + try { + Rate r = new Rate(); + r.rate = Integer.parseInt(s2.substring(0, s2.lastIndexOf('|')).trim()); + r.song = s2.substring(s2.lastIndexOf('|') + 1).trim(); + rates.addElement(r); + } catch (Exception exc) { + } + } + } + + public void save() { + FileConnection fc; + try { + fc = (FileConnection) Connector.open("file:///c:/other/SEPS_Rate.txt"); + if(fc.exists()) {fc.delete();} + fc.create(); + DataOutputStream os = fc.openDataOutputStream(); + Rate[] s = sortRate(); + int l = s.length; + for(int i=0; i>> 1) % 10000000; + } + new Skin(Rms.skinid); + cnv = new Canv(); + dsp = Display.getDisplay(this); dsp.setCurrent(cnv); } @@ -32,8 +39,10 @@ public class SEPS extends MIDlet { public void destroyApp(boolean unco) { if(Rms.firstStart) Rms.firstStart=false; + if(Rms.stat) cnv.ri.save(); + if(Rms.statGo) Rms.stat=true; Rms.saveOptions(); - cnv.pauseTrack(); + if(Rms.closePlayer) cnv.pauseTrack(); notifyDestroyed(); } } diff --git a/src/SetSleepMode.java b/src/SetSleepMode.java new file mode 100644 index 0000000..320adb6 --- /dev/null +++ b/src/SetSleepMode.java @@ -0,0 +1,52 @@ + +import java.util.Calendar; +import javax.microedition.lcdui.*; + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +/** + * + * @author aNNiMON + */ +public class SetSleepMode extends Form implements CommandListener { + + private Command back, ok; + private TextField zw; + + public SetSleepMode() { + super(SEPS.midlet.lang.sleepmode); + back = new Command(SEPS.midlet.lang.back, Command.BACK, 2); + ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1); + zw = new TextField(SEPS.midlet.lang.tooff, String.valueOf(10), 2, TextField.NUMERIC); + append(zw); + addCommand(ok); + addCommand(back); + setCommandListener(this); + SEPS.midlet.dsp.setCurrent(this); + } + + public void commandAction(Command c, Displayable d) { + if (c == back) { + SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); + } + + if (c == ok) { + Calendar cal = Calendar.getInstance(); + //текущее время + int ch = cal.get(Calendar.HOUR_OF_DAY); + int cm = cal.get(Calendar.MINUTE); + //время выключения + int dh = ch; + int dm = cm + Integer.parseInt(zw.getString()); + while(dm>=60) { + dm=dm-60; dh++; + } + if(dh>=24) dh=dh-24; + Rms.slpmode=true; + Rms.dh=dh; Rms.dm=dm; + SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); + } + } +} diff --git a/src/StringEncoder.java b/src/StringEncoder.java new file mode 100644 index 0000000..87bcbb7 --- /dev/null +++ b/src/StringEncoder.java @@ -0,0 +1,66 @@ + + +public class StringEncoder +{ + protected static char cp1251 [] = + { + '\u0410', '\u0411', '\u0412', '\u0413', '\u0414', '\u0415', '\u0416', + '\u0417', '\u0418', '\u0419', '\u041A', '\u041B', '\u041C', '\u041D', + '\u041E', '\u041F', '\u0420', '\u0421', '\u0422', '\u0423', '\u0424', + '\u0425', '\u0426', '\u0427', '\u0428', '\u0429', '\u042A', '\u042B', + '\u042C', '\u042D', '\u042E', '\u042F', '\u0430', '\u0431', '\u0432', + '\u0433', '\u0434', '\u0435', '\u0436', '\u0437', '\u0438', '\u0439', + '\u043A', '\u043B', '\u043C', '\u043D', '\u043E', '\u043F', '\u0440', + '\u0441', '\u0442', '\u0443', '\u0444', '\u0445', '\u0446', '\u0447', + '\u0448', '\u0449', '\u044A', '\u044B', '\u044C', '\u044D', '\u044E', + '\u044F' + }; + + public static char decodeCharCP1251 (byte b) + { + int ich = b & 0xff; + if (ich == 0xb8) // С‘ + return 0x0451; + else if (ich == 0xa8) // РЃ + return 0x0401; + else if (ich >= 0xc0) + return cp1251[ich-192]; + return (char)ich; + } + + public static byte encodeCharCP1251 (char ch) + { + if (ch > 0 && ch < 128) + return (byte) ch; + else if (ch == 0x401) + return -88; // Ё + else if (ch == 0x404) + return -86; // Є + else if (ch == 0x407) + return -81; // Ї + else if (ch == 0x451) + return -72; // ё + else if (ch == 0x454) + return -70; // є + else if (ch == 0x457) + return -65; // ї + return (byte)((byte)(ch) + 176); + } + + public static char checkCP1251 (char ch) + { + int bt = (byte) ch; + if(bt < 0) return decodeCharCP1251((byte) (256 + bt)); + else return ch; + /*byte b = encodeCharCP1251(ch); + int ich = b & 0xff; + if (ich == 0xb8) // С‘ + return 0x0451; + else if (ich == 0xa8) // РЃ + return 0x0401; + else if (ich >= 0xc0) + return (char)(ich-192); + return (char)ich;*/ + //return decodeCharCP1251(encodeCharCP1251(ch)); + } +} diff --git a/src/about b/src/about index 219fa33..593cdca 100644 --- a/src/about +++ b/src/about @@ -1,20 +1,47 @@ -Sony Ericsson Player Service 3.0 +Sony Ericsson Player Service 5.2 Автор: Виктор aNNiMON Мельник -Сайт разработчика: http://annimon.wen.ru/ +Сайт разработчика: http://annimon.z83.ru/ Программа - управление родным плейером для телефонов Sony Ericsson с поддержкой MultimediaService API и датчиком движения. Управление: Влево/Вправо/Движение акселерометром - Переключение песен. Вверх/Вниз - переключение режимов: Всё/Визуализация/Текст. - 1/3 - Перемотка назад/вперед. + 1 - Горячая клавиша поиска текста. + 3 - установить начало/конец отрезка или отключить повтор. + 4/6 - Перемотка назад/вперед. 5/Огонь - Пауза. + 9 - Спящий режим. 0 - Включение/Отключение текстов песен. * - Включение/Отключение визуализации. # - Включение/Отключение акселерометра. Изменения: + Версия 5.2 + - Добавлен пункт в настройках, при котором переключение треков будет идти только вперед, независимо от направления рывка. + - Поддержка русской кодировки в именах файлов. + - Другие исправления и изменения. + Версия 5.0 && 5.1 + - Добавлена сортировка списка файлов по рейтингу. + - Добавлен английский язык. + - Исправлены найденные ошибки. + - Добавил статистику проигрывания треков. + - Исправил повтор треков при свернутом приложении. + - Добавил поиск текстов песен. + - Сделал некое подобие скробблинга. Данные о проигруемой музыке отсылаются на сайт annimon.z83.ru + + Версия 4.0 + - Исправлена ошибка при открытии .lrc-файлов содержащих пустые строки. + - Исправлена ошибка при отображении начальных строк текстов песен. + - Добавил настройки: "Запускать плейер при старте программы", "Закрывать плейер при выходе из программы". + - Добавил вибрацию при переключении треков и настройку длительности. + - Добавил эффект мигания подсветкой при переключении треков и настройку. + - Сменил клавиши перемотки с 1/3 на 4/6. + - Добавил повтор отрезков. Кнопкой 3 устанавливаются отрезки. + - Добавил спящий режим (кн. 9 или пункт в меню). По истечению времени программа закроется вместе с плейером. + - Добавил настройку визуализаций. Теперь используется Project Capuchin. + Версия 3.0 - Исправлен показ обложки в полноэкранном режиме. - Добавил поддержку текстов песен (lrc). Файлы кидаем в папку Lyrics. Например c:/music/Lyrics/Bullet For My Valentine - Hand of Blood.lrc @@ -28,6 +55,9 @@ Sony Ericsson Player Service 3.0 - Режим визуализации. Переключается клавишами Вверх/Вниз, - Добавил перемотку клавишами 1 и 3. +Скробблинг: + В версии 5.0 сделал некое подобие скробблинга, то есть информация о проигруемом файле отсылается на сайт. Потом вы можете смотреть статистику проигрывания музыки. + Поддержка lrc: Lyrics-файл (.lrc) должен быть записан в кодировке WIN-1251, иначе возможны ошибки при чтении. Имя lrc-файла должно быть либо "[Название группы] - [Название песни].lrc", либо "[Название исходного фудиофайла].ltc". diff --git a/src/newfile b/src/newfile index 20b41e8..f227890 100644 --- a/src/newfile +++ b/src/newfile @@ -1 +1,2 @@ -aNNiMON, Ну Вот юин эсприта, основной плагмэйкер... 2542902 Вот LocID \ No newline at end of file +aNNiMON, Ну Вот юин эсприта, основной плагмэйкер... 2542902 Вот LocID +//SE сфотошопить + aNNiMOON \ No newline at end of file