This commit is contained in:
Victor 2018-11-14 15:54:07 +02:00
parent e2ead286e2
commit b5ee8d3251
39 changed files with 2349 additions and 457 deletions

BIN
src/4.swf

Binary file not shown.

BIN
src/5.swf

Binary file not shown.

BIN
src/6.swf

Binary file not shown.

View File

@ -2,10 +2,11 @@ import com.nokia.mid.ui.DeviceControl;
import com.sonyericsson.multimedia.*; import com.sonyericsson.multimedia.*;
import com.sonyericsson.multimedia.control.*; import com.sonyericsson.multimedia.control.*;
import java.io.IOException; import java.io.IOException;
import java.util.Calendar; import java.util.*;
import javax.microedition.io.Connector; import javax.microedition.io.Connector;
import javax.microedition.lcdui.*; import javax.microedition.lcdui.*;
import javax.microedition.sensor.*; import javax.microedition.sensor.*;
import mobscrob.scrobbler.AudioScrobbler;
/* /*
* To change this template, choose Tools | Templates * To change this template, choose Tools | Templates
@ -18,25 +19,47 @@ import javax.microedition.sensor.*;
*/ */
public class Canv extends Canvas implements Runnable, MediaControlListener { public class Canv extends Canvas implements Runnable, MediaControlListener {
//public static int softUp1 = 0xFF242424, softUp2 = 0x87282828, softDn1 = 0x87151515, softDn2 = 0xFF181818, background = 0x00,
// line = 0x00BB00, text = 0x009900, valuet = 0x0000E6, inf = 0x992235;
public static int softUp1, softUp2, softDn1, softDn2, background, line, text, valuet, inf; public static int softUp1, softUp2, softDn1, softDn2, background, line, text, valuet, inf;
private boolean rspressed;
//Ìåíþ
private String[] m = new String[] {SEPS.midlet.lang.sleepmode,
SEPS.midlet.lang.findtext, SEPS.midlet.lang.visual, SEPS.midlet.lang.skin, SEPS.midlet.lang.options, SEPS.midlet.lang.about,
SEPS.midlet.lang.minimise, SEPS.midlet.lang.exit};
private int menuwidth, menuheight, mcur, menuy, menuup;
private boolean menu, skin, vis;
private int volumeplus, volumeminus; //âèçóàëèçàöèÿ èçìåíåíèÿ ãðîìêîñòè
private boolean fastF, fastR; //áûñòðàÿ ïåðåìîòêà
private int cx, cy, thisskin;//âûáîð ñêèíà
private int chngx, chngmode;//ïåðåêëþ÷åíèå mode (all, visual)
private int accelPrevDelta = 0;
//Ñêðîëëëèíã òåêñòà (èñï, òðåê, àëüá, òåêñò)
private int[] scrollPos = {0,0,0,0};
private int[] sleepPos = {0,0,0,0};
private boolean[] scrolldirection = {false, false, false, false};
private int textWidth, lyricWidth;
private Image old;
private int w,h; private int w,h;
private boolean lite;
private int mode; private int mode;
private int accelPrevDelta = 0;
private Lyrics lrc; private Lyrics lrc;
public RateImpl ri; public RateImpl ri;
private Engine1 e1, tmpe1;
private Engine2 e2, tmpe2;
private Object tmpswf;
private Images im;
private FWCashe mfwc;
private byte repeat;//ôóíêöèÿ ïîâòîðà private byte repeat;//ôóíêöèÿ ïîâòîðà
private int a,b; private int a,b;
public Object swf; public Object swf;
private boolean updateAlbum;
private Image I, album; private Image I, album;
private Engine2 e2;
private Graphics G; private Graphics G;
private Thread thr; private Thread thr;
private final Font medFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM); private final Font medFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
@ -51,22 +74,36 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
private SensorConnection sensor; private SensorConnection sensor;
private String URL; private String URL;
public Canv() { public Canv(Images im) {
setFullScreenMode(true); setFullScreenMode(true);
thr = new Thread(this);
thr.start();
lite = false;
repeat = 0;
mode = 0; //Ðåæèì ïëåéåðà
w = getWidth(); w = getWidth();
h = getHeight(); volumeminus = h = getHeight();
I = Image.createImage(w, h); I = Image.createImage(w, h);
G = I.getGraphics(); G = I.getGraphics();
this.im = im;
thr = new Thread(this);
thr.start();
lyricWidth = w/(smallFont_b.charWidth('a')+1);
textWidth = lyricWidth - 3;
mfwc = FWCashe.getCache(medFont);
menuwidth = mfwc.stringWidth(m[0]);
menuheight = m.length * (medFont.getHeight()+2);
for(int i=1; i<m.length; i++) {
if(mfwc.stringWidth(m[i])>menuwidth) menuwidth = mfwc.stringWidth(m[i]);
}
menuwidth+=6;
menuy = 2*im.statusBarHeight-menuheight;
updateAlbum = menu = rspressed = false;
volumeplus = menuup = mcur = chngx = repeat = 0;
mode = 0; //Ðåæèì ïëåéåðà
getInfo(); getInfo();
service = MultimediaServiceManager.getMultimediaService("MediaPlayer"); service = MultimediaServiceManager.getMultimediaService("MediaPlayer");
mediaControl = (MediaControl)service.getControl("MediaControl"); mediaControl = (MediaControl)service.getControl("MediaControl");
mediaControl.addMediaControlListener(this); mediaControl.addMediaControlListener(this);
if(Rms.visid!=0) swf = new Capuchin(Rms.visid); cx = w/2;
cy = 4*im.statusBarHeight+im.pal.getHeight()/2;
if(Rms.visid>=6) Rms.visid = 1;
if(Rms.visid>1) swf = new Capuchin(Rms.visid);
if(Rms.stat) { if(Rms.stat) {
ri = new RateImpl(); ri = new RateImpl();
ri.open(); ri.open();
@ -74,34 +111,134 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
if(Rms.startPlayer) playTrack(); if(Rms.startPlayer) playTrack();
} }
protected void sizeChanged(int w, int h) {
w = getWidth();
h = getHeight();
volumeminus = h = getHeight();
I = Image.createImage(w, h);
G = I.getGraphics();
lyricWidth = w/(smallFont_b.charWidth('a')+1);
textWidth = lyricWidth - 3;
cx = w/2;
super.sizeChanged(w, h);
}
protected void paint(Graphics g) { protected void paint(Graphics g) {
if(mode==0) drawPlayerCanvas(G); setFullScreenMode(true);
else if(mode==1) drawVisual(G); //Âûáîð âèçóàëèçàöèè
g.drawImage(I, 0, 0, 20); if(vis) {choiceVisual(g, Rms.visid); return;}
if(skin) {choiceSkin(g, cx, cy); return;}
//Ïåðåêëþ÷åíèå ðåæèìîâ (all, visual)
if(chngx>0) {
if(old==null) {
old = Image.createImage(I.getWidth(), I.getHeight());
old.getGraphics().drawImage(I, 0, 0, 20);
if(mode==0) drawPlayerCanvas(G);
else if(mode==1) drawVisual(G);
if(chngmode<3) chngx = h;
else chngx = w;
}
switch(chngmode) {
case 0:
g.drawImage(I, 0, -chngx, 20);
g.drawImage(old, 0, h-chngx, 20);
break;
case 1:
g.drawImage(I, 0, chngx, 20);
g.drawImage(old, 0, chngx-h, 20);
break;
case 2:
g.drawImage(old, 0, 0, 20);
g.drawRegion(I, 0, 0, w, h/2, 0, 0, -chngx/2, 20);
g.drawRegion(I, 0, h/2, w, h/2, 0, 0, h/2+chngx/2, 20);
break;
case 3:
g.drawImage(I, 0, 0, 20);
g.drawRegion(old, 0, 0, w, h/2, 0, 0, chngx/2-h/2, 20);
g.drawRegion(old, 0, h/2, w, h/2, 0, 0, -chngx/2+h, 20);
break;
case 4:
g.drawImage(I, -chngx, 0, 20);
g.drawImage(old, w-chngx, 0, 20);
break;
case 5:
g.drawImage(I, chngx, 0, 20);
g.drawImage(old, chngx-w, 0, 20);
break;
case 6:
g.drawImage(old, 0, 0, 20);
g.drawRegion(I, 0, 0, w/2, h, 0, -chngx/2, 0, 20);
g.drawRegion(I, w/2, 0, w/2, h, 0, w/2+chngx/2, 0, 20);
break;
default:
g.drawImage(I, 0, 0, 20);
g.drawRegion(old, 0, 0, w/2, h, 0, chngx/2-w/2, 0, 20);
g.drawRegion(old, w/2, 0, w/2, h, 0, -chngx/2+w, 0, 20);
break;
}
chngx-=4;
repaint();
}else{
if(mode==0) drawPlayerCanvas(G);
else if(mode==1) drawVisual(G);
g.drawImage(I, 0, 0, 20);
//Ìåíþ
if(menuup!=0) {
if(menuup>0) {
menuy-=25;
if(menuy<=2*im.statusBarHeight-menuheight) {menu = false; menuup=0;}
} else {
menuy+=25;
if(menuy>=2*im.statusBarHeight) {menu = true; menuup=0;}
}
drawMenu(g, mcur, menuy);
}else if(menu) drawMenu(g, mcur, menuy);
//Âèçóàëèçàöèè èçìåíåíèÿ ãðîìêîñòè
if(volumeplus>0) {
drawRect(g, 0x33000000, 0xAA000000, 0, volumeplus-20, w, 20);
drawRect(g, 0xAA000000, 0x33000000, 0, volumeplus, w, 20);
volumeplus-=10;
}
if(volumeminus<h) {
drawRect(g, 0x33000000, 0xAA000000, 0, volumeminus-20, w, 20);
drawRect(g, 0xAA000000, 0x33000000, 0, volumeminus, w, 20);
volumeminus+=10;
}
}
} }
private void drawVisual(Graphics g) { private void drawVisual(Graphics g) {
g.setColor(background); g.setColor(background);
g.fillRect(0, 0, w, h); g.fillRect(0, 0, w, h);
g.setFont(medFont); g.setFont(medFont);
int ih = h-2*im.statusBarHeight-medFont.getHeight()-8;
if (media != null) { if (media != null) {
MetaData metaData = media.getMetaData(); MetaData metaData = media.getMetaData();
if (metaData != null) { if (metaData != null) {
Object data = getValue(metaData, MetaData.TITLE_KEY); String data = getValue(metaData, MetaData.TITLE_KEY);
if (data != null) drawTitle(g, (String) data); if (data != null) drawTitle(g, data);
if(updateAlbum) {
byte[] alb = metaData.getAlbumArt();
if (alb != null) album = Image.createImage(alb, 0, alb.length);
else album = null;
updateAlbum = false;
}
if (album != null) { if (album != null) {
int ih = h-2*medFont.getHeight()-6;
if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih);
g.drawImage(album, w/2, h/2, 3); g.drawImage(album, w/2, h/2, 3);
}else if(Rms.vis){ }else if(Rms.vis){
int ih = h-(2*medFont.getHeight())-6;
if(Rms.visid==0) { if(Rms.visid==0) {
if(e2==null) { if(e2==null) {
e2 = new Engine2(w-6, ih); e2 = new Engine2(w, ih);
e2.setRun(true); e2.setRun(true);
} }
g.drawImage(e2.MainCanvas(), w/2, h/2, 3); g.drawImage(e2.MainCanvas(), w/2, h/2, 3);
} else if(Rms.visid==1) {
if(e1==null) {
e1 = new Engine1(w, ih);
e1.setRun(true);
}
g.drawImage(e1.MainCanvas(), w/2, h/2, 3);
} else{ } else{
((Capuchin) swf).drawFlash(g, 3, h/2-(ih/2), w-6, ih); ((Capuchin) swf).drawFlash(g, 3, h/2-(ih/2), w-6, ih);
} }
@ -113,7 +250,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
} }
} }
} }
drawSoft(g, SEPS.midlet.lang.menu, SEPS.midlet.lang.exit); drawSoft(g);
} }
private String getValue(MetaData metaData, String md) { private String getValue(MetaData metaData, String md) {
@ -128,40 +265,52 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
private void drawPlayerCanvas(Graphics g) { private void drawPlayerCanvas(Graphics g) {
g.setColor(background); g.setColor(background);
g.fillRect(0, 0, w, h); g.fillRect(0, 0, w, h);
drawTitle(g, "SEPS by aNNiMON"); drawTitle(g, getTime());
int fh = smallFont_b.getHeight()+2; int fh = smallFont_b.getHeight()+2;
int py = fh+fh/2; int py = fh+fh/2;
g.setFont(medFont); g.setFont(medFont);
if (media != null) { if (media != null) {
MetaData metaData = media.getMetaData(); MetaData metaData = media.getMetaData();
if (metaData != null) { if (metaData != null) {
Object data = getValue(metaData, MetaData.ARTIST_KEY); String data = getValue(metaData, MetaData.ARTIST_KEY);
if (data != null) py = drawText(g, (String) data, py); g.drawImage(im.artist, 2, py, 20);
if (data != null) py = drawText(g, scrollText(data, 0), py, 0);
data = getValue(metaData, MetaData.TITLE_KEY); data = getValue(metaData, MetaData.TITLE_KEY);
if (data != null) py = drawText(g, (String) data, py); g.drawImage(im.track, 1, py, 20);
if (data != null) py = drawText(g, scrollText(data, 1), py, 1);
data = getValue(metaData, MetaData.ALBUM_KEY); data = getValue(metaData, MetaData.ALBUM_KEY);
if (data != null) py = drawText(g, (String) data, py); g.drawImage(im.album, 2, py, 20);
if (data != null) py = drawText(g, scrollText(data, 2), py, 2);
if(Rms.isLyric && lrc!=null) py = drawText(g, lrc.getLine(media.getMediaTime()), py); if(Rms.isLyric && lrc!=null) py = drawText(g, scrollText(lrc.getLine(media.getMediaTime()), 3), py, 3);
//else if(lrc==null) py = drawText(g, String.valueOf(media.getMediaTime()), "", py); //else if(lrc==null) py = drawText(g, String.valueOf(media.getMediaTime()), "", py);
//data = metaData.getValue(metaData.FILE_URI_KEY); //data = metaData.getValue(metaData.FILE_URI_KEY);
//if (data != null) //if (data != null)
float div = ((float)w - 10) / (float)media.getDuration(); float div = ((float)w - 10) / (float)media.getDuration();
g.setColor(valuet); g.setColor(valuet);
int mgt = media.getMediaTime(); int mgt = media.getMediaTime();
g.fillRect(5, py, (int)(mgt * div), 10); int k = im.statusBarleftWidth+3;
drawRect(g, softUp1, softUp2, 5, py, (int)(mgt * div), im.statusBarHeight);
for(int i=k; i<w-k; i++) g.drawImage(im.statusBar, i, py, 20);
g.drawImage(im.statusBarleft, 3, py, 20);
g.drawImage(im.statusBarright, w-3, py, 24);
g.setColor(inf); g.setColor(inf);
if(repeat==1) g.drawLine(5+(int)(a*div), py, 5+(int)(a*div), py+10); if(repeat==1) g.drawLine(5+(int)(a*div), py, 5+(int)(a*div), py+10);
if(repeat==2) { if(repeat==2) {
g.drawLine((int)(a*div), py, (int)(a*div), py+10); g.drawLine(5+(int)(a*div), py, 5+(int)(a*div), py+10);
g.drawLine((int)(b*div), py, (int)(b*div), py+10); g.drawLine(5+(int)(b*div), py, 5+(int)(b*div), py+10);
}
if(updateAlbum) {
byte[] alb = metaData.getAlbumArt();
if (alb != null) album = Image.createImage(alb, 0, alb.length);
else album = null;
updateAlbum = false;
} }
g.setColor(text);
g.drawRect(5, py, w-10, 10);
} }
} }
if (album != null) { if (album != null) {
int ih = h-fh-2-py-20; int ih = h-fh-2-py-20;
if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih);
@ -174,32 +323,100 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
e2.setRun(true); e2.setRun(true);
} }
g.drawImage(e2.MainCanvas(), w/2, py+15, 17); g.drawImage(e2.MainCanvas(), w/2, py+15, 17);
} else{ } else if(Rms.visid==1) {
if(e1==null) {
e1 = new Engine1(ih, ih);
e1.setRun(true);
}
g.drawImage(e1.MainCanvas(), w/2, py+15, 17);
}else{
((Capuchin) swf).drawFlash(g, w/2-ih/2, py+15, ih, ih); ((Capuchin) swf).drawFlash(g, w/2-ih/2, py+15, ih, ih);
} }
} }
g.setColor(inf); 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); 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); drawSoft(g);
} }
public void keyPressed(int key) { public void keyPressed(int key) {
if(key==-6 && !menu) {
menuup = menu?1:-1;
}
if((menuup!=0 || menu) && !vis && !skin) {
if(key==-6) {
menuup = menu?1:-1;
}
int ga=getGameAction(key);
switch (ga) {
case UP:
mcur--;
if(mcur<0) mcur=m.length-1;
break;
case DOWN:
mcur++;
if(mcur>=m.length) mcur=0;
break;
case FIRE:
menuAction(mcur);
break;
}
}else if(vis) {
int ga=getGameAction(key);
switch (ga) {
case UP:
case LEFT:
Rms.visid--;
if(Rms.visid<0) Rms.visid=5;
tmpswf=null;
break;
case DOWN:
case RIGHT:
Rms.visid++;
if(Rms.visid>=6) Rms.visid=0;
tmpswf=null;
break;
}
if(ga==FIRE || key==-6) {
tmpe2=null; tmpe1=null; tmpswf=null;
if(Rms.visid>1) swf = new Capuchin(Rms.visid);
vis = false;
}
}else if(skin) {
int ga=getGameAction(key);
if(ga==UP) {cy--;if(cy<4*im.statusBarHeight) cy=4*im.statusBarHeight+im.pal.getHeight()-1;}
else if(ga==DOWN) {cy++;if(cy>=4*im.statusBarHeight+im.pal.getHeight()) cy=4*im.statusBarHeight+1;}
else if(ga==LEFT) {cx--;if(cx<w/2-im.pal.getWidth()/2) cx=w/2+im.pal.getWidth()/2-1;}
else if(ga==RIGHT) {cx++;if(cx>=w/2+im.pal.getWidth()/2) cx=w/2-im.pal.getWidth()/2;}
else if(ga==FIRE || key==-6) {
Rms.skinid = thisskin;
new Skin(Rms.skinid);
skin = false;
}
}else{
if(key==-7) rspressed = true;
else if(key==KEY_POUND) Rms.accel=!Rms.accel;
else if(key==KEY_STAR) Rms.vis=!Rms.vis;
else if(key==KEY_NUM0) Rms.isLyric=!Rms.isLyric;
else if(key== -36) volumeplus = h;//vol+;
else if(key== -37) volumeminus = 0;//vol-;
}
repaint();
}
public void keyReleased(int key) {
if(menuup!=0 || menu) return;
int ga=getGameAction(key); int ga=getGameAction(key);
if(key==-7) { if(key==-7) {
rspressed = false;
if(Rms.closePlayer) pauseTrack(); if(Rms.closePlayer) pauseTrack();
SEPS.midlet.destroyApp(true); SEPS.midlet.destroyApp(true);
} }else if(key==KEY_NUM9) new SetSleepMode();
if(key==-6) new Menu();
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_NUM4) rewind(); if(key==KEY_NUM4) rewind();
if(key==KEY_NUM6) fastForward(); else if(key==KEY_NUM6) fastForward();
if(ga==LEFT && key!=KEY_NUM4) prevTrack();
else if(ga==RIGHT && key!=KEY_NUM6) nextTrack();
if(key==KEY_NUM3) ABRepeat(); if(key==KEY_NUM3) ABRepeat();
if(key==KEY_NUM1) { else if(key==KEY_NUM1) {
String art="",tit=""; String art="",tit="";
try{ try{
MetaData metaData = SEPS.midlet.cnv.media.getMetaData(); MetaData metaData = SEPS.midlet.cnv.media.getMetaData();
@ -209,9 +426,6 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
FindLyrics fl = new FindLyrics(); FindLyrics fl = new FindLyrics();
fl.find(art, tit);//SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); 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) { switch(ga) {
case UP: case UP:
upMode(); upMode();
@ -231,7 +445,26 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
} }
public void keyRepeated(int key) { public void keyRepeated(int key) {
keyPressed(key); if(key==KEY_NUM4) {
try {
if(!fastR) {
mediaControl.rewind();
fastR = true;
}
} catch (ControlException ex) {
ex.printStackTrace();
}
}else if(key==KEY_NUM6) {
try {
if(!fastF) {
mediaControl.fastForward();
fastF = true;
}
} catch (ControlException ex) {
ex.printStackTrace();
}
}else keyPressed(key);
} }
public int getDelta(int channel, int threshold) { public int getDelta(int channel, int threshold) {
@ -285,7 +518,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
} }
if(!Rms.vis) Thread.sleep(100); if(!Rms.vis) Thread.sleep(100);
if(Rms.slpmode) { if(Rms.slpmode) {
if(getTime()) { if(checkTime()) {
pauseTrack(); pauseTrack();
SEPS.midlet.destroyApp(true); SEPS.midlet.destroyApp(true);
} }
@ -307,9 +540,41 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
thisSong = thisSong+" - "+ (String) data; thisSong = thisSong+" - "+ (String) data;
if(!thisSong.equalsIgnoreCase(Rms.lastSong)) { if(!thisSong.equalsIgnoreCase(Rms.lastSong)) {
int thisTime = media.getMediaTime(); int thisTime = media.getMediaTime();
int allTime = media.getDuration()*20/*% ïðîèãðàíî*//100; int allTime = media.getDuration()*50/*% ïðîèãðàíî*//100;
if(thisTime>allTime) { if(thisTime>allTime) {
int cn = 1; int cn = 1;
try {
//GetPass
String username = "aNMCore"; //[0]
String password = "abcdcba"; //[1]
String md5pass = ""; //[2]
if (md5pass.equals("")) {
md5pass = AudioScrobbler.GetPasswordMD5(password);
}
//if (audioscrobbler == null)
AudioScrobbler audioscrobbler = new AudioScrobbler("tst", "1.0", username, md5pass);
audioscrobbler.connect();
Thread.sleep(3000);
audioscrobbler.Submit(
(String) getValue(metaData, MetaData.ARTIST_KEY),
(String) getValue(metaData, MetaData.TITLE_KEY),
(String) getValue(metaData, MetaData.ALBUM_KEY),
"1", media.getDuration()
);
/*MobScrobblerImpl ms = new MobScrobblerImpl();
ms.scrobble(
(String) getValue(metaData, MetaData.ARTIST_KEY),
(String) getValue(metaData, MetaData.TITLE_KEY),
(String) getValue(metaData, MetaData.ALBUM_KEY),
media.getDuration(),
thisTime
);*/
}catch(Exception ex) {
SEPS.midlet.dsp.setCurrent(new Alert("Ahtung", ex.getMessage(), null, AlertType.INFO));
}
if(Rms.stat) { if(Rms.stat) {
Rms.lastSong = thisSong; Rms.lastSong = thisSong;
cn = ri.update(thisSong); cn = ri.update(thisSong);
@ -444,7 +709,11 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
private void fastForward() { private void fastForward() {
try { try {
mediaControl.skip(10); if(fastF) {
fastF = false;
mediaControl.play();
}
else mediaControl.skip(10);
} catch (ControlException ex) { } catch (ControlException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
@ -452,20 +721,16 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
private void rewind() { private void rewind() {
try { try {
mediaControl.skip(-10); if(fastR) {
fastR = false;
mediaControl.play();
}
else mediaControl.skip(-10);
} catch (ControlException ex) { } catch (ControlException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
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) { public void mediaControlUpdate(int eventId, ControlEvent event) {
try { try {
switch (eventId) { switch (eventId) {
@ -488,11 +753,8 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
MetaData data = this.media.getMetaData(); MetaData data = this.media.getMetaData();
if (data != null) { if (data != null) {
byte[] alb = data.getAlbumArt(); byte[] alb = data.getAlbumArt();
if (alb != null) { if (alb != null) album = Image.createImage(alb, 0, alb.length);
album = Image.createImage(alb, 0, alb.length); else album = null;
} else {
album = null;
}
} }
a = b = 0; repeat = 0; a = b = 0; repeat = 0;
if(Rms.isLyric) initLyric(this.media); if(Rms.isLyric) initLyric(this.media);
@ -502,63 +764,135 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
} }
private void upMode() {
old = null;
chngmode = random(0,8);
chngx = 2;
mode = 1-mode;
e2=null;
e1=null;
if(album!=null) updateAlbum = true;
}
private void menuAction(int i) {
if(m[i].equals(SEPS.midlet.lang.sleepmode)) SEPS.midlet.dsp.setCurrent(new SetSleepMode());
else if(m[i].equals(SEPS.midlet.lang.findtext)) {
MetaData metaData = this.media.getMetaData();
String all = getValue(metaData, MetaData.ARTIST_KEY) + " - " + getValue(metaData, MetaData.TITLE_KEY);
SEPS.midlet.dsp.setCurrent(new FindText(all));
}
else if(m[i].equals(SEPS.midlet.lang.options)) SEPS.midlet.dsp.setCurrent(new Options());
else if(m[i].equals(SEPS.midlet.lang.about)) SEPS.midlet.dsp.setCurrent(new Info());
else if(m[i].equals(SEPS.midlet.lang.minimise)) SEPS.midlet.dsp.setCurrent(null);
else if(m[i].equals(SEPS.midlet.lang.exit)) SEPS.midlet.destroyApp(true);
else if(m[i].equals(SEPS.midlet.lang.skin)) skin = true;
else if(m[i].equals(SEPS.midlet.lang.visual)) vis = true;
}
//GUI - GRAPHICAL USER INTERFACE
private int drawText(Graphics g, String value, int y, int id) {
g.setColor(line);
g.drawLine(3, y-1, w-3, y-1);
g.setColor(valuet);
g.setFont(smallFont_b);
g.drawString(value, (id!=3?im.track.getWidth()+4:w/2), y, (id!=3?20:17));
return y+(smallFont_b.getHeight()+2);
}
private void drawMenu(Graphics g, int cur, int y) {
ACLS(g,180,0x00);
int fh = medFont.getHeight()+2;
int x = w/2-menuwidth/2;
for(int i=0; i<m.length; i++) {
if(i==cur) {
drawRect(g, softUp1, softUp2, x, y+fh*i, menuwidth, fh);
g.setColor(valuet);
g.drawString(m[i], w/2, y+fh*i, 17);
}else{
drawRect(g, softDn1, softDn2, x, y+fh*i, menuwidth, fh);
g.setColor(text);
g.drawString(m[i], w/2, y+fh*i, 17);
}
}
drawTitle(g, getTime());
}
private void choiceVisual(Graphics g, int cur) {
g.setColor(0);
g.fillRect(0, 0, w, h);
Image kdr;
int ww = w-w/4;
//if(ww>(h-2*im.statusBarHeight)) ww = h-2*im.statusBarHeight;
if(cur==0) {
if(tmpe2==null) tmpe2 = new Engine2(ww, ww);
kdr = tmpe2.MainCanvas();
}else if(cur==1) {
if(tmpe1==null) tmpe1 = new Engine1(ww, ww);
kdr = tmpe1.MainCanvas();
}else {
if(tmpswf==null) tmpswf = new Capuchin(Rms.visid);
kdr = ((Capuchin)tmpswf).getImage(ww, ww);
}
g.drawImage(Effects.reflection(kdr, 0.5D), w/2, 2*im.statusBarHeight, 17);
drawTitle(g, getTime());
}
private void choiceSkin(Graphics g, int cx, int cy) {
g.setColor(0);
int x = w/2-im.pal.getWidth()/2;
g.fillRect(0, 0, w, h);
g.drawImage(im.pal, x, 4*im.statusBarHeight, 20);
//cursor
g.setColor(0x00);
int dcur = 4;
g.drawLine(cx + 1, cy, cx + dcur, cy);
g.drawLine(cx - dcur, cy, cx - 1, cy);
g.drawLine(cx, cy - dcur, cx, cy - 1);
g.drawLine(cx, cy + 1, cx, cy + dcur);
//
thisskin=Effects.get(im.pal, cx-x, cy-4*im.statusBarHeight);
drawTitle(g, Integer.toHexString(thisskin));
}
private void drawSoft(Graphics g) {
int fh = medFont.getHeight()+2;
int wsoft = 26;
int msoft = (w-wsoft*2)/3;
g.setFont(medFont);
//Ëèíèÿ
g.setColor(0);
g.drawLine(0, h-fh-1, w, h-fh-1);
//Ìåíþ
drawRect(g, (menuup!=0 || menu)?softUp1:softDn1, (menuup!=0 || menu)?softUp2:softDn2, 0, h-fh, wsoft, fh);
g.setColor(valuet);
g.fillTriangle(wsoft/2, h-5, 3, h-fh+7, wsoft-3, h-fh+7);
//Âûõîä
drawRect(g, rspressed?softUp1:softDn1, rspressed?softUp2:softDn2, w-wsoft, h-fh, wsoft, fh);
g.drawImage(im.exit, w-2, h-fh, 24);
//* - Âèçóàëèçàöèÿ
drawRect(g, Rms.vis?softUp1:softDn1, Rms.vis?softUp2:softDn2, wsoft, h-fh, msoft, fh);
g.drawChar('*', wsoft+msoft/6, h-fh+2, 20);
g.drawImage(im.star, wsoft+msoft-msoft/6, h-fh+fh/2, 10);
//0 - Òåêñòû Ïåñåí
drawRect(g, Rms.isLyric?softUp1:softDn1, Rms.isLyric?softUp2:softDn2, wsoft+msoft, h-fh, w-2*(wsoft+msoft), fh);
g.drawChar('0', w/2-msoft/4, h-fh+2, 17);
g.drawImage(im.zero, w/2+msoft/4, h-fh+fh/2, 3);
// - Àêñåëåðîìåòð
drawRect(g, Rms.accel?softUp1:softDn1, Rms.accel?softUp2:softDn2, w-wsoft-msoft, h-fh, msoft, fh);
g.drawChar('#', w-wsoft-msoft+msoft/6, h-fh+2, 20);
g.drawImage(im.pound, w-wsoft-msoft/6, h-fh+fh/2, 10);
}
private void drawTitle(Graphics g, String text) { private void drawTitle(Graphics g, String text) {
int fh = medFont.getHeight()+4;
g.setColor(valuet); g.setColor(valuet);
g.setFont(medFont); g.setFont(medFont);
if(Rms.skinid==3) {text=toEmo(text);} int k = im.titleleft.getWidth();
g.drawString(text, w/2, 2, 17); for(int i=k; i<w-k; i++) g.drawImage(im.title, i, 0, 20);
drawRect(g, softUp1, softUp2, 0, 0, w, fh/2); g.drawImage(im.titleleft, 0, 0, 20);
drawRect(g, softDn1, softDn2, 0, fh/2, w, fh/2); g.drawImage(im.titleright, w, 0, 24);
} g.drawString(text, k, 2, 20);
if(mode==0) g.drawString("SEPlayerService", w-k, 2, 24);
public void drawRect(Graphics g, int color1, int color2, int x1, int y1, int w, int h) {
int a1 = (color1 >> 24) & 0xff;
int r1 = ((color1 & 0xFF0000) >> 16);
int g1 = ((color1 & 0x00FF00) >> 8);
int b1 = (color1 & 0x0000FF);
int a2 = (color2 >> 24) & 0xff;
int r2 = ((color2 & 0xFF0000) >> 16);
int g2 = ((color2 & 0x00FF00) >> 8);
int b2 = (color2 & 0x0000FF);
int count = h / 3;
if (count < 0) {
count = -count;
}
if (count < 8) {
count = 8;
}
int crd1, crd2;
for (int i = count - 1; i >= 0; i--) {
crd1 = i * h / count + y1;
crd2 = (i + 1) * h / count + y1;
if (crd1 == crd2) {
continue;
}
if(lite) {
g.setColor(i * (r2 - r1) / (count - 1) + r1, i * (g2 - g1) / (count - 1) + g1, i * (b2 - b1) / (count - 1) + b1);
g.fillRect(x1, crd1, w, crd2 - crd1);
}else{
int[] pixelArray = new int[w * (crd2 - crd1)];
for(int zi = 0; zi < pixelArray.length; zi++)
pixelArray[zi] = (int) ((i * (a2 - a1) / (count - 1) + a1) << 24) |
((i * (r2 - r1) / (count - 1) + r1) << 16) |
((i * (g2 - g1) / (count - 1) + g1) << 8) | (i * (b2 - b1) / (count - 1) + b1);
g.drawRGB(pixelArray, 0, w, x1, crd1, w, crd2 - crd1, true);
}
}
}
private void drawSoft(Graphics g, String lsoft, String rsoft) {
int fh = medFont.getHeight()+2;
g.setColor(text);
g.setFont(medFont);
g.drawString(lsoft, 2, h-2, 36);
g.drawString(rsoft, w-2, h-2, 40);
drawRect(g, softUp1, softUp2, 0, h-fh, w, fh/2);
drawRect(g, softDn1, softDn2, 0, h-fh/2, w, fh/2);
} }
private void drawCenter(Graphics g, String[] lines) { private void drawCenter(Graphics g, String[] lines) {
@ -567,9 +901,9 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
int fh = sm.getHeight()+2; int fh = sm.getHeight()+2;
g.setFont(sm); g.setFont(sm);
String v; String v;
drawRect(g, ((160<<24)| Canv.background),((160<<24)| Canv.background), 0, h/2-fh*2, w, fh*5); drawRect(g, ((160<<24)| Canv.background & 0x00ffffff),((160<<24)| Canv.background & 0x00ffffff), 0, h/2-fh*2, w, fh*5);
for(int i=0; i<lines.length; i++) { for(int i=0; i<lines.length; i++) {
v=Rms.skinid==3 ? toEmo(lines[i]) : lines[i]; v=lines[i];
if(i==2) { if(i==2) {
g.setColor(valuet); g.setColor(valuet);
g.drawString(v, w/2, h/2+(fh*(i-2)), 17); g.drawString(v, w/2, h/2+(fh*(i-2)), 17);
@ -582,41 +916,75 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
g.drawString(v, w/2-1, h/2+(fh*(i-2))-1, 17); g.drawString(v, w/2-1, h/2+(fh*(i-2))-1, 17);
} }
} }
} }
private int drawText(Graphics g, String value, int y) { private void drawRect(Graphics g, int color1, int color2, int x1, int y1, int w, int h) {
g.setColor(line); int a1 = (color1 >> 24) & 0xff;
g.drawLine(3, y-1, w-3, y-1); int r1 = (color1 >> 16) & 0xff;
int g1 = (color1 >> 8) & 0xff;
if(Rms.skinid==3) {value=toEmo(value);} int b1 = color1 & 0xff;
int a2 = (color2 >> 24) & 0xff;
g.setColor(valuet); int r2 = (color2 >> 16) & 0xff;
g.setFont(smallFont_b); int g2 = (color2 >> 8) & 0xff;
g.drawString(value, w/2, y, 17); int b2 = color2 & 0xff;
int beforecolor = g.getColor();
return y+(smallFont_b.getHeight()+2); int crd1, crd2;
} int count = h/3;
if (count < 0) count = -count;
private String toEmo(String s) { if (count < 8) count = 8;
StringBuffer sb = new StringBuffer(); boolean lite = false;
int i = 0; if(a1==0xff && a2==0xff) lite = true;
boolean up = true; for (int i=count-1; i>=0; i--) {
while(i<s.length()) { crd1 = i*h/count+y1;
String ch = s.substring(i, i+1); crd2 = (i+1)*h/count+y1;
if(up) ch = ch.toUpperCase(); if (crd1 == crd2) continue;
else ch = ch.toLowerCase(); if(lite) {
sb.append(ch); g.setColor(i * (r2 - r1) / (count - 1) + r1, i * (g2 - g1) / (count - 1) + g1, i * (b2 - b1) / (count - 1) + b1);
i++; g.fillRect(x1, crd1, w, crd2 - crd1);
up=!up; }else{
int[] pixelArray = new int[w * (crd2 - crd1)];
for(int zi = 0; zi < pixelArray.length; zi++)
pixelArray[zi] = (int) ((i * (a2 - a1) / (count - 1) + a1) << 24) |
((i * (r2 - r1) / (count - 1) + r1) << 16) |
((i * (g2 - g1) / (count - 1) + g1) << 8) | (i * (b2 - b1) / (count - 1) + b1);
g.drawRGB(pixelArray, 0, w, x1, crd1, w, crd2 - crd1, true);
}
} }
g.setColor(beforecolor);
}
private void ACLS(Graphics g, int a1, int color) {
int[] pixelArray = new int[g.getClipWidth() * g.getClipHeight()];
for(int i = 0; i < pixelArray.length; i++)
pixelArray[i] = (int) (a1 << 24| color & 0x00ffffff);
g.drawRGB(pixelArray, 0, g.getClipWidth(), 0, 0, g.getClipWidth(), g.getClipHeight(), true);
}
//Methods
private boolean checkTime() {
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);
}
private String getTime() {
StringBuffer sb = new StringBuffer();
Calendar cal = Calendar.getInstance();
int tmp;
tmp = cal.get(Calendar.HOUR_OF_DAY);
if(tmp<=9) sb.append('0'); sb.append(tmp);
sb.append(':');
//Ìèíóòà
tmp = cal.get(Calendar.MINUTE);
if(tmp<=9) sb.append('0'); sb.append(tmp);
return sb.toString(); return sb.toString();
} }
private void upMode() { private int random(int min, int max) {
mode = 1-mode; return min + ((new Random().nextInt() >>> 1)%(max-min));
e2=null;
album = null;
} }
private void ABRepeat() { private void ABRepeat() {
@ -640,4 +1008,32 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
} catch (Exception e) { } catch (Exception e) {
} }
} }
private String scrollText(String text, int id) {
int count;
if(id==3) count = lyricWidth;
else count = textWidth;
String tmp = text;
int lent = text.length();
int scr = lent - count;
try {
if (lent > count) {
tmp = text.substring(scrollPos[id], scrollPos[id] + count);
if(sleepPos[id]<smallFont_b.charWidth('a')) sleepPos[id]++;
else {
if (scrolldirection[id]) scrollPos[id]--;
else scrollPos[id]++;
if (scrollPos[id] > scr) {
scrollPos[id]--;
scrolldirection[id] = !scrolldirection[id];
} else if (scrollPos[id] < 0) {
scrollPos[id] = 0;
scrolldirection[id] = !scrolldirection[id];
}
sleepPos[id] = 0;
}
}
}catch(Exception ex) {tmp = text;}
return tmp;
}
} }

View File

@ -10,23 +10,13 @@ import javax.microedition.lcdui.*;
*/ */
public class Capuchin { public class Capuchin {
//public FlashPlayer flashPlayer;
public FlashImage flashImage; public FlashImage flashImage;
//public FlashCanvas flashCanvas;
public Capuchin(int i) { public Capuchin(int i) {
// flashPlayer = null;
flashImage = null; flashImage = null;
// flashCanvas = null;
try try
{ {
flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i)+".swf"), null); flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i-1)+".swf"), null);
// if(flashImage != null)
// {
// flashCanvas = new FlashCanvas(flashImage);
// flashPlayer = FlashPlayer.createFlashPlayer(flashImage, flashCanvas);
// flashCanvas.setFullScreenMode(true);
// }
} }
catch(Exception ex) {} catch(Exception ex) {}
} }
@ -34,4 +24,11 @@ public class Capuchin {
public void drawFlash(Graphics g, int x, int y, int w, int h) { public void drawFlash(Graphics g, int x, int y, int w, int h) {
if(flashImage!=null) flashImage.render(g, x, y, w, h); if(flashImage!=null) flashImage.render(g, x, y, w, h);
} }
public Image getImage(int w, int h) {
Image img = Image.createImage(w, h);
Graphics g = img.getGraphics();
if(flashImage!=null) flashImage.render(g, 0, 0, w, h);
return img;
}
} }

View File

@ -6,6 +6,41 @@ import javax.microedition.lcdui.*;
*/ */
public class Effects { public class Effects {
public static Image reflection(Image img, double percent) {
int w = img.getWidth();
int h = img.getHeight();
int[] rgb = new int[w * h];
int[] newRgb = new int[w * (h * 2 + 1)];
img.getRGB(rgb, 0, w, 0, 0, w, h);
double column = 255D / ((double)h * percent);
System.arraycopy(rgb, 0, newRgb, 0, rgb.length);
for(int i=0; i<w; i++)
{
for(int j=h-1; j>=h-h*percent; j--)
{
int alpha = (rgb[j*w+i] >> 24) & 0xff;
int red = (rgb[j*w+i] >> 16) & 0xff;
int green = (rgb[j*w+i] >> 8) & 0xff;
int blue = rgb[j*w+i] & 0xff;
int alp = (int)(255D - column * (double)(h - 1 - j));
if(alp > alpha) alp = alpha;
newRgb[(2*h-j)*w+i] = (alp << 24) | (red << 16) | (green << 8) | blue;
}
}
Image image = Image.createRGBImage(newRgb, w, h*2+1, true);
rgb = null;
newRgb = null;
return image;
}
public static int get(Image img, int x, int y) {
int[] pixel = new int[1];
img.getRGB(pixel, 0, img.getWidth(), x, y, 1, 1);
return pixel[0];
}
public static Image createScaledImage(Image image, int screenWidth, int screenHeight) { public static Image createScaledImage(Image image, int screenWidth, int screenHeight) {
int sourceWidth = image.getWidth(); int sourceWidth = image.getWidth();
int sourceHeight = image.getHeight(); int sourceHeight = image.getHeight();
@ -51,4 +86,97 @@ public class Effects {
} }
return temp2; return temp2;
} }
public static Image HSV(Image img, float hh) {
float[] hsb = new float[3];
int w = img.getWidth();
int h = img.getHeight();
int[] pixel = new int[w * h];
img.getRGB(pixel, 0, w, 0, 0, w, h);
for (int io = 0; io < pixel.length; io++) {
int qa = (pixel[io] >> 24) & 0xff;
int qr = (pixel[io] >> 16) & 0xff;
int qg = (pixel[io] >> 8) & 0xff;
int qb = pixel[io] & 0xff;
hsb = Effects.RGBtoHSV(qr, qg, qb, hsb);
hsb[0] += hh;
while(hsb[0]>360) hsb[0]-=360;
/*if(c=='S' || c == 's') hsb[1] = hsb[1] + (float) (ch/256);
if(c=='B' || c == 'b') hsb[2] = hsb[2] + (float) (ch/256);*/
pixel[io] = (qa << 24) | Effects.HSVtoRGB(hsb[0], hsb[1], hsb[2]);
}
return Image.createRGBImage(pixel, w, h, true);
}
public static float getHSV(int color, int c) {//0-h, 1-s, 2-v
float[] hsb = new float[3];
int qr = (color >> 16) & 0xff;
int qg = (color >> 8) & 0xff;
int qb = color & 0xff;
hsb = Effects.RGBtoHSV(qr, qg, qb, hsb);
return hsb[c];
}
public static int changeHSV(int color, int c, float value) {//0-h, 1-s, 2-v
float[] hsb = new float[3];
int qa = (color >> 24) & 0xff;
int qr = (color >> 16) & 0xff;
int qg = (color >> 8) & 0xff;
int qb = color & 0xff;
hsb = Effects.RGBtoHSV(qr, qg, qb, hsb);
hsb[c]+=value;
if(c==0) while(hsb[0]>360) hsb[0]-=360;
else {
if(hsb[c]>1.0) hsb[c]=hsb[c]-1.0f;
else if(hsb[c]<0) hsb[c]=-hsb[c];
}
return (qa << 24) | Effects.HSVtoRGB(hsb[0], hsb[1], hsb[2]);
}
private static int HSVtoRGB(float h, float s, float v) {
float qr = 0, qg = 0, qb = 0;
int r = 0, g = 0, b = 0;
if(s==0.0 && h==-1.0) return ((int)v << 16) | ((int)v << 8) | (int)v;
int Hi = (int) ((h / 60) % 6);
float f = (float) (h / 60 - (float)Math.floor(h/60));
float p = (float) ((float)v*(1.0f - (float)s));
float q = (float) ((float)v*(1.0f - (float)f*(float)s));
float t = (float) ((float)v*(1.0f - (s*(1.0-f))));
switch(Hi) {
case 0: qr = v; qg = t; qb = p; break;
case 1: qr = q; qg = v; qb = p; break;
case 2: qr = p; qg = v; qb = t; break;
case 3: qr = p; qg = q; qb = v; break;
case 4: qr = t; qg = p; qb = v; break;
case 5: qr = v; qg = p; qb = q; break;
}
r = (int) (255 * qr); g = (int) (255 * qg); b = (int) (255 * qb);
return (r << 16) | (g << 8) | b;
}
private static float[] RGBtoHSV(int qr, int qg, int qb, float[] hsv) {
float h = 0, s, v;
if (hsv == null) {
hsv = new float[3];
}
float r = (float) qr/255; float g = (float) qg/255; float b = (float) qb/255;
v = (r > g) ? r : g;
if (b > v) v = b;
float min = (r < g) ? r : g;
if (b < min) min = b;
// hue
if(v==min) h=0;
if(v==r && g>=b) h = 60 * ((g-b)/(v-min));
if(v==r && g<b) h = 60 * ((g-b)/(v-min))+360;
if(v==g) h = 60 * ((b-r)/(v-min))+120;
if(v==b) h = 60 * ((r-g)/(v-min))+240;
//saturation
if(v==0) s = 0;
else s=((v - min)/v);//1-(min/max);
if(s==0) h=-1;
hsv[0] = h;
hsv[1] = s;
hsv[2] = v;
return hsv;
}
} }

195
src/Engine1.java Normal file
View File

@ -0,0 +1,195 @@
import java.util.Random;
import javax.microedition.lcdui.*;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author aNNiMON
*/
public class Engine1 implements Runnable{
public Image db;
private Graphics G;
private int w,h;
private int K,i,mode;
private int max, spd, cf;
private int[] starx,stary,starz;
private long time, dt;
private boolean up,dn;
private Random rnd;
private Thread thr;
public boolean run;
public Engine1(int w, int h) {
this.w=w;
this.h=h;
db = Image.createImage(w, h);
G=db.getGraphics();
rnd = new Random();
max = 300; spd = 200; K=60;
mode = (rnd.nextInt() >>> 1) % 4;
init(max);
time = System.currentTimeMillis();
thr = new Thread(this);
thr.start();
}
public void run() {
while (run) {
if(up) {
while(cf!=0) {
spd++; cf--;
try { Thread.sleep(25L);} catch (InterruptedException ex) {ex.printStackTrace();}
}
up=false;
}
if(dn) {
while(cf!=0) {
spd--; cf--;
try { Thread.sleep(25L);} catch (InterruptedException ex) {ex.printStackTrace();}
}
dn=false;
}
int r = (rnd.nextInt() >>> 1) % 20;
switch(r) {
case 5: up=true; cf=100; break;
case 15: up=true; cf=400; break;
case 8: dn=true; cf=100; break;
case 18: dn=true; cf=400; break;
case 3: if(max>11) max-=10; break;
case 13: if(max<1000) init(max+=100); break;
case 4: if(K<84) K+=15; break;
case 14: if(K>16) K-=15; break;
case 6: mode = (rnd.nextInt() >>> 1) % 4; break;
}
try {
if(spd<25 && spd>-25) Thread.sleep(500L);
else Thread.sleep(2000L);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public void setRun(boolean run) {
this.run=run;
}
public Image MainCanvas() {
dt = System.currentTimeMillis() - time;
time = System.currentTimeMillis();
if(K>=3) ACLS(G);
else CLS(G);
for (i = 1; i<max; i++) {
starz[i] = (int) (starz[i] - spd * dt / 1000);
if(spd>0) {
if (starz[i] <= -200) {
starx[i] = (rnd.nextInt()>>>1)%(w * 4) - w * 2;
stary[i] = (rnd.nextInt()>>>1)%(h * 4) - h * 2;
starz[i] = (rnd.nextInt()>>>1)%1900;
}
SetPix((255 - 255 * (starz[i] + 200) / 2100));
}else{
if (starz[i] > 2000) {
starx[i] = (rnd.nextInt()>>>1)%(w * 4) - w * 2;
stary[i] = (rnd.nextInt()>>>1)%(h * 4) - h * 2;
starz[i] = (rnd.nextInt()>>>1)%1900;
}
SetPix((255-255 * (starz[i]%2100) / 2100));
}
}
return db;
}
private void CLS(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, w, h);
}
private void ACLS(Graphics g) {
int[] pixelArray = new int[w * h];
for (int io = 0; io < pixelArray.length; io++) {
pixelArray[io] = (int) ((100-K) << 24) | 0;
}
g.drawRGB(pixelArray, 0, w, 0, 0, w, h, true);
}
private void SetPix(int c) {
int sx, sy, sx1 = 0, sy1 = 0;
sx = (w / 2 + starx[i] * 200 / (starz[i] + 200));
sy = (h / 2 - stary[i] * 200 / (starz[i] + 200));
if(c>255) c=255; if(c<0) c=0;
switch(mode) {
case 0:
G.setColor(c, c, c);
if(i!=22) G.drawLine(sx, sy, sx, sy);
else try{G.fillRoundRect(sx, sy, starz[i]/(255-c), starz[i]/(255-c), i, i);}catch(Exception ex) {};
break;
case 1:
G.setColor(c, c, c);
int u=starz[i]==0?1:starz[i];
G.fillArc(sx, sy, c/u, c/u, 0, 360);
break;
case 2:
u=(rnd.nextInt()>>>1)%6;
switch(u) {
case 0: G.setColor(255-c, c, c); break;
case 1: G.setColor(c, 255-c, c); break;
case 2: G.setColor(c, c, 255-c); break;
case 3: G.setColor(255-c, 255-c, c); break;
case 4: G.setColor(255-c, c, 255-c); break;
case 5: G.setColor(c, 255-c, 255-c); break;
case 6: G.setColor(255-c, 255-c, 255-c); break;
}
if(i!=22) G.drawLine(sx, sy, sx, sy);
else try{G.fillRoundRect(sx, sy, starz[i]/(255-c), starz[i]/(255-c), i, i);}catch(Exception ex) {}; break;
case 3:
u=rnd.nextInt()%6;
switch(u) {
case 0: G.setColor(255-c, c, c); break;
case 1: G.setColor(c, 255-c, c); break;
case 2: G.setColor(c, c, 255-c); break;
case 3: G.setColor(255-c, 255-c, c); break;
case 4: G.setColor(255-c, c, 255-c); break;
case 5: G.setColor(c, 255-c, 255-c); break;
case 6: G.setColor(255-c, 255-c, 255-c); break;
}
u=starz[i]==0?1:starz[i];
G.fillArc(sx, sy, c/u, c/u, 0, 360);
break;
case 4:
u=rnd.nextInt()%6;
switch(u) {
case 0: G.setColor(255-c, c, c); break;
case 1: G.setColor(c, 255-c, c); break;
case 2: G.setColor(c, c, 255-c); break;
case 3: G.setColor(255-c, 255-c, c); break;
case 4: G.setColor(255-c, c, 255-c); break;
case 5: G.setColor(c, 255-c, 255-c); break;
case 6: G.setColor(255-c, 255-c, 255-c); break;
}
if(i>1) {
sx1 = (w / 2 + starx[i-1] * 200 / (starz[i-1] + 200));
sy1 = (h / 2 - stary[i-1] * 200 / (starz[i-1] + 200));
}
G.drawLine(sx1, sy1, sx, sy); break;
}
}
private void init(int max) {
starx = new int[max];stary = new int[max];starz = new int[max];
for (i = 0; i<max; i++) {
starx[i] = (rnd.nextInt()>>>1)%(w * 4) - w * 2;
stary[i] = (rnd.nextInt()>>>1)%(h * 4) - h * 2;
starz[i] = (rnd.nextInt()>>>1)%1900;
}
CLS(G);
}
}

View File

@ -17,7 +17,7 @@ public class Engine2 implements Runnable {
private boolean rb, gb, bb; private boolean rb, gb, bb;
private float x, y, tx, ty, k, d, len; private float x, y, tx, ty, k, d, len;
private int rc = 0, gc = 0, bc = 0, rgb = 1, fr = 1, ar = 1; private int rc, gc, bc, rgb, fr, ar;
private float[] a = new float[40]; private float[] a = new float[40];
private Random rnd; private Random rnd;
private Thread thr; private Thread thr;
@ -29,6 +29,10 @@ public class Engine2 implements Runnable {
db = Image.createImage(w, h); db = Image.createImage(w, h);
G = db.getGraphics(); G = db.getGraphics();
rnd = new Random(); rnd = new Random();
rc = gc = bc = 0;
ar=(rnd.nextInt() >>> 1) % 14;
fr=((rnd.nextInt()>>>1)%6)+1;
rgb = 1;
thr = new Thread(this); thr = new Thread(this);
thr.start(); thr.start();
} }
@ -48,7 +52,6 @@ public class Engine2 implements Runnable {
case 11: U=(rnd.nextInt() >>> 1) % 9; break; case 11: U=(rnd.nextInt() >>> 1) % 9; break;
case 14: if(K>16) K-=15; break; case 14: if(K>16) K-=15; break;
} }
try { try {
Thread.sleep(2000L); Thread.sleep(2000L);
} catch (InterruptedException ex) {} } catch (InterruptedException ex) {}
@ -63,7 +66,6 @@ public class Engine2 implements Runnable {
rgb(G); rgb(G);
visual(G); visual(G);
return db; return db;
} }
private void rgb(Graphics grf) { private void rgb(Graphics grf) {
@ -114,11 +116,7 @@ public class Engine2 implements Runnable {
} }
private void visual(Graphics grf) { private void visual(Graphics grf) {
if (w > h) { len = (float) (w>h?h:w) / L / N;
len = (float) (h / L / N);
} else {
len = (float) (w / L / N);
}
k = (float) (Math.abs(rnd.nextFloat() * 360) * Math.PI / 180); k = (float) (Math.abs(rnd.nextFloat() * 360) * Math.PI / 180);
float r50 = (float) (Math.abs(rnd.nextFloat()) * 50); float r50 = (float) (Math.abs(rnd.nextFloat()) * 50);
d = (float) (Math.PI * 2 / S); d = (float) (Math.PI * 2 / S);
@ -139,27 +137,22 @@ public class Engine2 implements Runnable {
tx = (float) (x + Math.cos(j * d + a[1]) * len); tx = (float) (x + Math.cos(j * d + a[1]) * len);
ty = (float) (y + Math.sin(j * d + a[i]) * len); ty = (float) (y + Math.sin(j * d + a[i]) * len);
x = x + (float) (Math.cos(j * d + a[i]) * len); x = x + (float) (Math.cos(j * d + a[i]) * len);
} }else if (fr == 2) {
if (fr == 2) {
tx = (float) (x + Math.sin(j * d + a[i]) * len); tx = (float) (x + Math.sin(j * d + a[i]) * len);
ty = (float) (y + Math.cos(j * d + a[i]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len);
} }else if (fr == 3) {
if (fr == 3) {
tx = (float) (x + Math.tan(j * d + a[1]) * len); tx = (float) (x + Math.tan(j * d + a[1]) * len);
ty = (float) (y + Math.cos(j * d + a[i]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len);
y = y - (float) (Math.sin(j * d + a[i]) * len); y = y - (float) (Math.sin(j * d + a[i]) * len);
} }else if (fr == 4) {
if (fr == 4) {
tx = (float) (x + Math.tan(j * d + a[1]) * len); tx = (float) (x + Math.tan(j * d + a[1]) * len);
ty = (float) (y + Math.cos(j * d + a[i]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len);
x = y - (float) (Math.sin(j * d + a[i]) * len); x = y - (float) (Math.sin(j * d + a[i]) * len);
} }else if (fr == 5) {
if (fr == 5) {
tx = (float) (x + Math.tan(j * d + a[1]) * len); tx = (float) (x + Math.tan(j * d + a[1]) * len);
ty = (float) (y + Math.cos(j * d + a[i]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len);
x = (float) (x * ty * d + a[i] - (float) (Math.sin(j * d + a[i]) * len)); x = (float) (x * ty * d + a[i] - (float) (Math.sin(j * d + a[i]) * len));
} }else if (fr == 6) {
if (fr == 6) {
tx = (float) (x + Math.cos(j * d + a[1]) * len); tx = (float) (x + Math.cos(j * d + a[1]) * len);
ty = (float) (y + Math.sin(j * d + a[1]) * len); ty = (float) (y + Math.sin(j * d + a[1]) * len);
x = x + (float) (Math.sin(j * d + a[i]) * len); x = x + (float) (Math.sin(j * d + a[i]) * len);
@ -171,46 +164,34 @@ public class Engine2 implements Runnable {
} }
if (ar == 2) { if (ar == 2) {
grf.setColor(255, (255 - 255 * i / N), 0); grf.setColor(255, (255 - 255 * i / N), 0);
} }else if (ar == 3) {
if (ar == 3) {
grf.setColor(rc, (255 - 255 * i / N), 255); grf.setColor(rc, (255 - 255 * i / N), 255);
} }else if (ar == 4) {
if (ar == 4) {
grf.setColor((255 - 255 * i / N), 255, 0); grf.setColor((255 - 255 * i / N), 255, 0);
} }else if (ar == 5) {
if (ar == 5) {
grf.setColor((255 - 255 * i / N), (255 - 255 * i / N), 255); grf.setColor((255 - 255 * i / N), (255 - 255 * i / N), 255);
} }else if (ar == 6) {
if (ar == 6) {
grf.setColor((255 - 255 * i / N), 255, 255); grf.setColor((255 - 255 * i / N), 255, 255);
} }else if (ar == 7) {
if (ar == 7) {
grf.setColor(0, 255, (255 - 255 * i / N)); grf.setColor(0, 255, (255 - 255 * i / N));
} }else if (ar == 8) {
if (ar == 8) {
grf.setColor(255, gc, (255 - 255 * i / N)); grf.setColor(255, gc, (255 - 255 * i / N));
} }else if (ar == 9) {
if (ar == 9) {
grf.setColor(255, (255 - 255 * i / N), (255 - 255 * i / N)); grf.setColor(255, (255 - 255 * i / N), (255 - 255 * i / N));
} }else if (ar == 10) {
if (ar == 10) {
grf.setColor(rc, (255 - 255 * i / N), 0); grf.setColor(rc, (255 - 255 * i / N), 0);
} }else if (ar == 11) {
if (ar == 11) {
grf.setColor(255, (255 - 255 * i / N), 255); grf.setColor(255, (255 - 255 * i / N), 255);
} }else if (ar == 12) {
if (ar == 12) {
grf.setColor((255 - 255 * i / N), 0, 255); grf.setColor((255 - 255 * i / N), 0, 255);
} }else if (ar == 13) {
if (ar == 13) {
grf.setColor((255 - 255 * i / N), 255 * i / N, 0); grf.setColor((255 - 255 * i / N), 255 * i / N, 0);
} }else if (ar == 14) {
if (ar == 14) {
grf.setColor(bc, 255, (255 - 255 * i / N)); grf.setColor(bc, 255, (255 - 255 * i / N));
} }
if (T==0) grf.drawLine((int) x, (int) y, (int) tx, (int) ty); if (T==0) grf.drawLine((int) x, (int) y, (int) tx, (int) ty);
if (T==1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360); else if (T==1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360);
if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y); else if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y);
x = tx; x = tx;
y = ty; y = ty;
} }
@ -227,7 +208,7 @@ public class Engine2 implements Runnable {
private void ACLS(Graphics g) { private void ACLS(Graphics g) {
int[] pixelArray = new int[w * h]; int[] pixelArray = new int[w * h];
for (int io = 0; io < pixelArray.length; io++) { for (int io = 0; io < pixelArray.length; io++) {
pixelArray[io] = (int) (100-K << 24) | Canv.background; pixelArray[io] = (int)(100-K << 24) | Canv.background & 0x00ffffff;
} }
g.drawRGB(pixelArray, 0, w, 0, 0, w, h, true); g.drawRGB(pixelArray, 0, w, 0, 0, w, h, true);
} }

51
src/FWCashe.java Normal file
View File

@ -0,0 +1,51 @@
import javax.microedition.lcdui.Font;
import java.util.Vector;
public class FWCashe
{
public static FWCashe getCache (Font font)
{
Vector fwc = new Vector ();
Vector fwc_f = new Vector ();
for (int i = 0; i < fwc.size (); i++)
if (fwc_f.elementAt(i).equals (font))
return (FWCashe)fwc.elementAt(i);
fwc_f.addElement (font);
FWCashe f;
fwc.addElement (f = new FWCashe (font));
return f;
}
protected Font font;
protected byte caches [][];
protected FWCashe (Font font)
{
this.font = font;
caches = new byte [256][];
for (int i = 0; i < 256; i++)
caches [i] = null;
}
public int charWidth (char ch) {
int hi = (ch >> 8)&0xFF, lo = (ch)&0xFF;
if (caches[hi] == null) {
caches[hi] = new byte [256];
for (int i = 0; i < 256; i++)
caches [hi][i] = -1;
}
if (caches [hi][lo] == -1)
caches [hi][lo] = (byte) font.charWidth(ch);
return caches [hi][lo];
}
public int stringWidth(String s)
{
int l = s.length (), i, r;
for (r = 0, i = 0; i < l; i++)
r += charWidth(s.charAt(i));
return r;
}
}

View File

@ -24,7 +24,7 @@ public class FindLyrics {
String url = "http://www.lyricsplugin.com/winamp03/plugin/?artist="+urlName(artist)+"&title="+urlName(title); String url = "http://www.lyricsplugin.com/winamp03/plugin/?artist="+urlName(artist)+"&title="+urlName(title);
try { try {
byte[] res = send(url); byte[] res = send(url);
int lr1 = MSG.indexOf("<div id="+'"'+"lyrics"+'"'+">"); int lr1 = MSG.indexOf("<div id=\"lyrics\">");
int lr2 = MSG.indexOf("</div>", lr1); int lr2 = MSG.indexOf("</div>", lr1);
if((lr2-lr1)>30) { if((lr2-lr1)>30) {
FileConnection fc; FileConnection fc;
@ -47,7 +47,7 @@ public class FindLyrics {
String artist = song.substring(0, song.lastIndexOf('-')).trim(); String artist = song.substring(0, song.lastIndexOf('-')).trim();
String title = song.substring(song.lastIndexOf('-')+1).trim(); String title = song.substring(song.lastIndexOf('-')+1).trim();
MSG = ""; MSG = "";
String url = "http://annimon.z83.ru/nowplaying.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title); String url = "http://annimon.com/seps/seps.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title);
try { try {
send(url); send(url);
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,5 +1,3 @@
import com.sonyericsson.multimedia.MetaData;
import javax.microedition.lcdui.*; import javax.microedition.lcdui.*;
/* /*
@ -13,45 +11,31 @@ import javax.microedition.lcdui.*;
public class FindText extends Form implements CommandListener { public class FindText extends Form implements CommandListener {
private Command back, ok; private Command back, ok;
public TextField artist, title; public TextField all_tb;
public FindText() { public FindText(String all) {
super(SEPS.midlet.lang.findtext); super(SEPS.midlet.lang.findtext);
back = new Command(SEPS.midlet.lang.back, Command.BACK, 2); back = new Command(SEPS.midlet.lang.back, Command.BACK, 2);
ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1); ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1);
String ar="",ti=""; all_tb = new TextField(SEPS.midlet.lang.artist, all, 512, TextField.ANY);
try{ append(all_tb);
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(ok);
addCommand(back); addCommand(back);
setCommandListener(this); setCommandListener(this);
SEPS.midlet.dsp.setCurrent(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<data.length(); i++) {
sb.append(StringEncoder.checkCP1251(data.charAt(i)));//.decodeCharCP1251((byte) data.charAt(i)));
}
return sb.toString();//data;
}
public void commandAction(Command c, Displayable d) { public void commandAction(Command c, Displayable d) {
if (c == back) new Menu(); if (c == back) SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
if (c == ok) { if (c == ok) {
FindLyrics fl = new FindLyrics(); try {
boolean check = fl.find(artist.getString(), title.getString());//SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); FindLyrics fl = new FindLyrics();
if(check) append(SEPS.midlet.lang.textsaving); int id = all_tb.getString().indexOf(" - ");
else append(SEPS.midlet.lang.nofound); boolean check = fl.find(all_tb.getString().substring(0, id), all_tb.getString().substring(id+3));
if(check) append(SEPS.midlet.lang.textsaving);
else append(SEPS.midlet.lang.nofound);
}catch(Exception ex){}
} }
} }
} }

69
src/Images.java Normal file
View File

@ -0,0 +1,69 @@
import java.io.IOException;
import javax.microedition.lcdui.Image;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author aNNiMON
*/
public class Images {
public Image titleleft, title, titleright,
statusBarleft,statusBar,statusBarright,
track, artist, album, exit,
star, zero, pound, pal;
public int statusBarHeight, statusBarleftWidth;
public Images() {
titleleft = getImage("tl");
title = getImage("t");
titleright = flipImage(titleleft);
statusBarleft = getImage("sbl");
statusBar = getImage("sb");
statusBarright = flipImage(statusBarleft);
track = getImage("track");
artist = getImage("artist");
album = getImage("album");
exit = getImage("exit");
star = getImage("star");
zero = getImage("zero");
pound = getImage("pound");
pal = getImage("pal");
//if(Rms.skinid!=0) changeHue();
//---Ðàçìåðû---//
statusBarleftWidth = statusBarleft.getWidth();
statusBarHeight = statusBarleft.getHeight();
}
/*private void changeHue() {
float h = Effects.getHSV(Rms.skinid, 0)-Effects.getHSV(0xFF2F8400, 0);
titleleft = Effects.HSV(titleleft, h);
title = Effects.HSV(title, h);
titleright = flipImage(titleleft);
statusBarleft = Effects.HSV(statusBarleft, h);
statusBar = Effects.HSV(statusBar, h);
statusBarright = flipImage(statusBarleft);
star = Effects.HSV(star, h);
zero = Effects.HSV(zero, h);
pound = Effects.HSV(pound, h);
}*/
private Image getImage(String path) {
Image img = null;
try {
img = Image.createImage("/res/"+path+".png");
} catch (IOException ex) {
ex.printStackTrace();
}
return img;
}
private Image flipImage(Image img) {
return Image.createImage(img, 0, 0, img.getWidth(), img.getHeight(), 2);
}
}

View File

@ -33,24 +33,22 @@ public class Info extends Form implements CommandListener {
} }
public void commandAction(Command c, Displayable d) { public void commandAction(Command c, Displayable d) {
if(c==back) new Menu(); if(c==back) SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
if(c==site) { if(c==site) {
try { try {
String scr = ""; String url = "http://annimon.com/";
if(Rms.id!=0) scr="annimon.z83.ru/seps/"+String.valueOf(Rms.id)+".txt"; if(url.length()!=19) return;
String url = "http://annimon.z83.ru/";
if(url.length()!=22) return;
SEPS.midlet.platformRequest(url); SEPS.midlet.platformRequest(url);
} catch (ConnectionNotFoundException ex) { } catch (ConnectionNotFoundException ex) {
new Menu(); SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
} }
} }
if(c==scrob) { if(c==scrob) {
try { try {
String url = "http://annimon.z83.ru/seps/"+String.valueOf(Rms.id)+".txt"; String url = "http://annimon.com/seps/seps.php?id="+String.valueOf(Rms.id);
SEPS.midlet.platformRequest(url); SEPS.midlet.platformRequest(url);
} catch (ConnectionNotFoundException ex) { } catch (ConnectionNotFoundException ex) {
new Menu(); SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
} }
} }
} }

View File

@ -9,11 +9,11 @@
*/ */
public class Lang { public class Lang {
String menu, back, exit, ok, findtext, artist, title, textsaving, nofound; String menu, back, exit, ok, findtext, artist, textsaving, nofound;
String site, scrobdb, about, sreturn, sleepmode, options, minimise; String site, scrobdb, about, sreturn, sleepmode, options, minimise;
String sensetivity, textfolder, vibro, skin, visual, origseps, elements, String sensetivity, textfolder, vibro, skin, visual, elements,
gothic, emo,light, start, stop, flashlight, tooff, light, start, stop, flashlight, tooff,
statlocal, scrobbling, origjava, circles, uiactivity, listforward; statlocal, scrobbling, uiactivity, listforward;
public Lang(int id) { public Lang(int id) {
if(id==0) { if(id==0) {
@ -22,8 +22,7 @@ public class Lang {
exit = "Exit"; exit = "Exit";
ok = "Ok"; ok = "Ok";
findtext = "Text Search"; findtext = "Text Search";
artist = "Artist"; artist = "Artist - Title";
title = "Title";
textsaving = "Text saved\n"; textsaving = "Text saved\n";
nofound = "Not found\n"; nofound = "Not found\n";
site = "Site"; site = "Site";
@ -36,19 +35,14 @@ public class Lang {
sensetivity = "Sensetivity to switch:"; sensetivity = "Sensetivity to switch:";
textfolder = "Folder with the text:"; textfolder = "Folder with the text:";
vibro = "Vibration switch (in ms):"; vibro = "Vibration switch (in ms):";
skin = "Skins"; skin = "Skin";
visual = "Visualization"; visual = "Visualization";
origseps = "Original SEPS";
gothic = "Gothic";
emo = "Emo";
light = "Backlight"; light = "Backlight";
start = "Launch player when program start"; start = "Launch player when program start";
stop = "Close player when program exit"; stop = "Close player when program exit";
flashlight = "Flash backlight"; flashlight = "Flash backlight";
statlocal = "Statistics (need to restart app)"; statlocal = "Statistics (need to restart app)";
scrobbling = "Scrobbling (annimon.z83.ru)"; scrobbling = "Scrobbling (annimon.com)";
origjava = "Original Java";
circles = "Circles (1.swf)";
elements = "Elements: "; elements = "Elements: ";
tooff = "Time to turn off (in minutes):"; tooff = "Time to turn off (in minutes):";
uiactivity = "Sync. with ActivityMenu"; uiactivity = "Sync. with ActivityMenu";
@ -59,8 +53,7 @@ public class Lang {
exit = "Âûõîä"; exit = "Âûõîä";
ok = "Ok"; ok = "Ok";
findtext = "Ïîèñê òåêñòîâ"; findtext = "Ïîèñê òåêñòîâ";
artist = "Èñïîëíèòåëü"; artist = "Èñïîëíèòåëü - Çàãîëîâîê";
title = "Çàãîëîâîê";
textsaving = "Òåêñò ñîõðàíåí\n"; textsaving = "Òåêñò ñîõðàíåí\n";
nofound = "Íå íàéäåíî\n"; nofound = "Íå íàéäåíî\n";
site = "Íà ñàéò"; site = "Íà ñàéò";
@ -73,19 +66,14 @@ public class Lang {
sensetivity = "×óâñòâèòåëüíîñòü ê ïåðåêëþ÷åíèþ:"; sensetivity = "×óâñòâèòåëüíîñòü ê ïåðåêëþ÷åíèþ:";
textfolder = "Ïàïêà ñ òåêñòàìè:"; textfolder = "Ïàïêà ñ òåêñòàìè:";
vibro = "Âèáðàöèÿ ïðè ïåðåêëþ÷åíèè (â ìñ):"; vibro = "Âèáðàöèÿ ïðè ïåðåêëþ÷åíèè (â ìñ):";
skin = "Ñêèíû"; skin = "Ñêèí";
visual = "Âèçóàëèçàöèè"; visual = "Âèçóàëèçàöèè";
origseps = "Ñòàíäàðòíûé SEPS";
gothic = "Ãîòè÷åñêèé";
emo = "Ýìî";
light = "Ïîñòîÿííàÿ ïîäñâåòêà"; light = "Ïîñòîÿííàÿ ïîäñâåòêà";
start = "Çàïóñêàòü ïëåéåð ïðè ñòàðòå ïðîãðàììû"; start = "Çàïóñêàòü ïëåéåð ïðè ñòàðòå ïðîãðàììû";
stop = "Çàêðûâàòü ïëåéåð ïðè âûõîäå èç ïðîãðàììû"; stop = "Çàêðûâàòü ïëåéåð ïðè âûõîäå èç ïðîãðàììû";
flashlight = "Ìèãàíèå ïîäñâåòêîé"; flashlight = "Ìèãàíèå ïîäñâåòêîé";
statlocal = "Âåñòè ñòàòèñòèêó (íåîáõîäèì ïåðåçàïóñê)"; statlocal = "Âåñòè ñòàòèñòèêó (íåîáõîäèì ïåðåçàïóñê)";
scrobbling = "Ñêðîááëèíã"; scrobbling = "Ñêðîááëèíã";
origjava = "Ñòàíäàðòíûé Java";
circles = "Êðóãè (1.swf)";
elements = "Âñåãî ýëåìåíòîâ: "; elements = "Âñåãî ýëåìåíòîâ: ";
tooff = "Âðÿìÿ äî âûêëþ÷åíèÿ (â ìèíóòàõ):"; tooff = "Âðÿìÿ äî âûêëþ÷åíèÿ (â ìèíóòàõ):";
uiactivity = "Ñèíõð. ñ Ìåíþ Ñîáûòèé"; uiactivity = "Ñèíõð. ñ Ìåíþ Ñîáûòèé";

View File

@ -1,42 +0,0 @@
import javax.microedition.lcdui.*;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author aNNiMON
*/
public class Menu implements CommandListener {
private List ls;
private Display dsp;
public Menu() {
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);
}
public void commandAction(Command c, Displayable d) {
if(c.equals(List.SELECT_COMMAND)) {
int i = ls.getSelectedIndex();
switch(i) {
case 0: dsp.setCurrent(SEPS.midlet.cnv); 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;
}
}
}
}

View File

@ -14,7 +14,7 @@ public class Options extends Form implements CommandListener {
private Command back,ok; private Command back,ok;
private TextField zw, az, un; private TextField zw, az, un;
private ChoiceGroup skin, vis, cRC, lang; private ChoiceGroup cRC, lang;
public Options() { public Options() {
@ -27,21 +27,16 @@ public class Options extends Form implements CommandListener {
// cc = new TextField(L.str[L.cch]+":", "000000", 6, TextField.ANY); // 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); // hp = new TextField(L.str[L.ach], String.valueOf(P.heap), 2, TextField.ANY);
lang = new ChoiceGroup ("Language / ßçûê", 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); cRC = new ChoiceGroup ("", ChoiceGroup.MULTIPLE);
appendSkin(); appendSkin();
StrokeStyle(); StrokeStyle();
} }
public void commandAction(Command c, Displayable d) { public void commandAction(Command c, Displayable d) {
if (c==back) {new Menu();} if (c==back) SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
if ((c==ok || c==List.SELECT_COMMAND)) { if ((c==ok || c==List.SELECT_COMMAND)) {
new Skin(Rms.skinid = skin.getSelectedIndex());
SEPS.midlet.lang = new Lang(Rms.lngid = lang.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.sensetivity=Integer.parseInt(zw.getString());
Rms.vibrlen=Integer.parseInt(un.getString()); Rms.vibrlen=Integer.parseInt(un.getString());
Rms.lrcpath=az.getString(); Rms.lrcpath=az.getString();
@ -63,17 +58,15 @@ public class Options extends Form implements CommandListener {
// P.undo=Integer.parseInt(un.getString()); // P.undo=Integer.parseInt(un.getString());
// Editor.isteps = new Image[P.undo]; // Editor.isteps = new Image[P.undo];
// Editor.ist=0; // Editor.ist=0;
new Menu(); SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
} }
} }
private void StrokeStyle() { private void StrokeStyle() {
append(lang); append(lang);
append(skin);
append(zw); append(zw);
append(az); append(az);
append(un); append(un);
append(vis);
// append(hp); // append(hp);
append(cRC); append(cRC);
addCommand(ok); addCommand(ok);
@ -87,14 +80,6 @@ public class Options extends Form implements CommandListener {
lang.append("Ðóññêèé", null); lang.append("Ðóññêèé", null);
lang.setSelectedIndex(Rms.lngid, true); lang.setSelectedIndex(Rms.lngid, true);
skin.append(SEPS.midlet.lang.origseps, null);
skin.append("ProPaintMobile", 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(SEPS.midlet.lang.light, null); cRC.append(SEPS.midlet.lang.light, null);
cRC.append(SEPS.midlet.lang.start, null); cRC.append(SEPS.midlet.lang.start, null);
cRC.append(SEPS.midlet.lang.stop, null); cRC.append(SEPS.midlet.lang.stop, null);
@ -113,16 +98,5 @@ public class Options extends Form implements CommandListener {
cRC.setSelectedIndex(5, Rms.urlstat); cRC.setSelectedIndex(5, Rms.urlstat);
cRC.setSelectedIndex(6, Rms.actmenu); cRC.setSelectedIndex(6, Rms.actmenu);
cRC.setSelectedIndex(7, Rms.listfw); 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);
} }
} }

View File

@ -16,6 +16,7 @@ public class RateImpl {
public int numRates; //êîë-âî public int numRates; //êîë-âî
public Vector rates; public Vector rates;
private String[] path = {"c:/other", "e:/other", "c:/usb/other", "c:/music"};
public int update(String song) { public int update(String song) {
int s = rates.size(); int s = rates.size();
@ -40,12 +41,15 @@ public class RateImpl {
} }
public void open() { public void open() {
FileConnection fc; FileConnection fc = null;
rates = new Vector(); rates = new Vector();
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
try { try {
fc = (FileConnection) Connector.open("file:///c:/other/SEPS_Rate.txt", Connector.READ); for(int i=0; i<path.length; i++) {
if(!fc.exists()) {fc.close();return;} fc = (FileConnection) Connector.open("file:///"+path[i]+"/SEPS_Rate.txt", Connector.READ);
if(!fc.exists()) fc.close();
else break;
}
InputStream is = fc.openInputStream(); InputStream is = fc.openInputStream();
int ch = 0; int ch = 0;
while ((ch = is.read()) != -1) { while ((ch = is.read()) != -1) {
@ -91,14 +95,20 @@ public class RateImpl {
public void save() { public void save() {
FileConnection fc; FileConnection fc;
int i;
try { try {
fc = (FileConnection) Connector.open("file:///c:/other/SEPS_Rate.txt"); for(i=0; i<path.length; i++) {
fc = (FileConnection) Connector.open("file:///"+path[i], Connector.READ);
if(!fc.exists()) fc.close();
else break;
}
fc = (FileConnection) Connector.open("file:///"+path[i]+"/SEPS_Rate.txt");
if(fc.exists()) {fc.delete();} if(fc.exists()) {fc.delete();}
fc.create(); fc.create();
DataOutputStream os = fc.openDataOutputStream(); DataOutputStream os = fc.openDataOutputStream();
Rate[] s = sortRate(); Rate[] s = sortRate();
int l = s.length; int l = s.length;
for(int i=0; i<l; i++) { for(i=0; i<l; i++) {
addText(os, s[i].rate+" | "+s[i].song); addText(os, s[i].rate+" | "+s[i].song);
} }
addText(os, SEPS.midlet.lang.elements+l); addText(os, SEPS.midlet.lang.elements+l);

View File

@ -12,7 +12,7 @@ public class Rms {
private static RecordStore rmsStore; private static RecordStore rmsStore;
public static boolean firstStart = true; // ïåðâûé ñòàðò public static boolean firstStart = true; // ïåðâûé ñòàðò
public static int sensetivity = 800; public static int sensetivity = 800;
public static int skinid = 0; public static int skinid = 0;//x820000;//0;
public static boolean isLyric = true; public static boolean isLyric = true;
public static String lrcpath = "c:/music/Lyrics/"; public static String lrcpath = "c:/music/Lyrics/";
public static boolean light = false; public static boolean light = false;

View File

@ -16,6 +16,7 @@ public class SEPS extends MIDlet {
public Display dsp; public Display dsp;
public Canv cnv; public Canv cnv;
public Lang lang; public Lang lang;
public Images im;
public SEPS() { public SEPS() {
midlet = this; midlet = this;
@ -24,12 +25,13 @@ public class SEPS extends MIDlet {
public void startApp() { public void startApp() {
Rms.restoreOptions(); Rms.restoreOptions();
lang = new Lang(Rms.lngid); lang = new Lang(Rms.lngid);
im = new Images();
if(Rms.id==0) { if(Rms.id==0) {
Random rnd = new Random(); Random rnd = new Random();
Rms.id = (rnd.nextInt() >>> 1) % 10000000; Rms.id = (rnd.nextInt() >>> 1) % 10000000;
} }
new Skin(Rms.skinid); new Skin(Rms.skinid);
cnv = new Canv(); cnv = new Canv(im);
dsp = Display.getDisplay(this); dsp = Display.getDisplay(this);
dsp.setCurrent(cnv); dsp.setCurrent(cnv);
} }

View File

@ -33,19 +33,23 @@ public class SetSleepMode extends Form implements CommandListener {
} }
if (c == ok) { if (c == ok) {
Calendar cal = Calendar.getInstance(); int time = Integer.parseInt(zw.getString());
//òåêóùåå âðåìÿ if(time == 0) Rms.slpmode=false;
int ch = cal.get(Calendar.HOUR_OF_DAY); else {
int cm = cal.get(Calendar.MINUTE); Calendar cal = Calendar.getInstance();
//âðåìÿ âûêëþ÷åíèÿ //òåêóùåå âðåìÿ
int dh = ch; int ch = cal.get(Calendar.HOUR_OF_DAY);
int dm = cm + Integer.parseInt(zw.getString()); int cm = cal.get(Calendar.MINUTE);
while(dm>=60) { //âðåìÿ âûêëþ÷åíèÿ
dm=dm-60; dh++; int dh = ch;
int dm = cm + time;
while(dm>=60) {
dm=dm-60; dh++;
}
if(dh>=24) dh=dh-24;
Rms.slpmode=true;
Rms.dh=dh; Rms.dm=dm;
} }
if(dh>=24) dh=dh-24;
Rms.slpmode=true;
Rms.dh=dh; Rms.dm=dm;
SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
} }
} }

View File

@ -10,97 +10,44 @@
public class Skin { public class Skin {
public Skin(int skin) { public Skin(int skin) {
switch(skin) { if(skin==1) skin = Rms.skinid = 0xFF3477d5;
case 0: //default else if(skin==2) skin = Rms.skinid = 0xFF181818;
setSEPS(); else if(skin==3) skin = Rms.skinid = 0xFFCE6BA6;
break; else if(skin==4) skin = Rms.skinid = 0;
case 1: //PPM else if(skin==5) skin = Rms.skinid = 0xFFFFFF99;
setPPM(); Canv.background = 0xFF2F8400;
break; Canv.valuet = 0xFFFFFFFF;
case 2: //Gothic if(skin!=0) {
setGothic(); Canv.softUp1 = Effects.changeHSV(Canv.background, 2, 0.4352941f);
break; Canv.softUp2 = Effects.changeHSV(Canv.background, 2, 0.19215685f);
case 3: //Emo Canv.softDn1 = Effects.changeHSV(Canv.background, 2, -0.007843137f);
setEmo(); Canv.softDn2 = Effects.changeHSV(Canv.background, 2, -0.16862747f);
break; Canv.line = Effects.changeHSV(Canv.background, 0, 22);
case 4: //SEclub Canv.line = Effects.changeHSV(Canv.line, 2, 0.21568626f);
setSEclub(); Canv.text = Effects.changeHSV(Canv.background, 0, 22);
break; Canv.text = Effects.changeHSV(Canv.text, 2, 0.082352936f);
case 5: //SEclub Canv.inf = Effects.changeHSV(Canv.background, 2, -0.16078433f);
setaNM(); for(int i=0; i<=2; i++) {
break; float delta = Effects.getHSV(skin, i) - Effects.getHSV(Canv.background, i);
if(delta>-0.05 && delta<0.05) continue;
Canv.softUp1 = Effects.changeHSV(Canv.softUp1, i, delta);
Canv.softUp2 = Effects.changeHSV(Canv.softUp2, i, delta);
Canv.softDn1 = Effects.changeHSV(Canv.softDn1, i, delta);
Canv.softDn2 = Effects.changeHSV(Canv.softDn2, i, delta);
Canv.line = Effects.changeHSV(Canv.line, i, delta);
Canv.text = Effects.changeHSV(Canv.text, i, delta);
Canv.inf = Effects.changeHSV(Canv.inf, i, delta);
}
Canv.background = skin;
}else{
Canv.softUp1 = 0xFF57f300;
Canv.softUp2 = 0xFF41b500;
Canv.softDn1 = 0xFF2e8200;
Canv.softDn2 = 0xFF205900;
Canv.line = 0x00BB00;
Canv.text = 0x009900;
Canv.inf = 0x215B00;
} }
}
private void setSEPS() {
Canv.softUp1 = 0xFF242424;
Canv.softUp2 = 0x87282828;
Canv.softDn1 = 0x87151515;
Canv.softDn2 = 0xFF181818;
Canv.background = 0x00;
Canv.line = 0x00BB00;
Canv.text = 0x009900;
Canv.valuet = 0x0000E6;
Canv.inf = 0x992235;
}
private void setPPM() {
Canv.softUp1 = 0xFF3477d5;
Canv.softUp2 = 0x883477d5;
Canv.softDn1 = 0x8812396f;
Canv.softDn2 = 0xFF12396f;
Canv.background = 0xFFFFFF;
Canv.line = 0x0064A8;
Canv.text = 0x282828;
Canv.valuet = 0x296321;
Canv.inf = 0xA2DBF9;
}
private void setGothic() {
Canv.softUp1 = 0xFF141414;
Canv.softUp2 = 0x87181818;
Canv.softDn1 = 0x87151515;
Canv.softDn2 = 0xFF181818;
Canv.background = 0x00;
Canv.line = 0x6D6D6D;
Canv.text = 0x595959;
Canv.valuet = 0x666666;
Canv.inf = 0x474747;
}
private void setEmo() {
Canv.softUp1 = 0xFF1E1012;
Canv.softUp2 = 0x8887466D;
Canv.softDn1 = 0x88512C31;
Canv.softDn2 = 0xFFCE6BA6;
Canv.background = 0xFF879B;
Canv.line = 0xFF28A9;
Canv.text = 0x00;
Canv.valuet = 0x60204A;
Canv.inf = 0xD17DDB;
}
private void setSEclub() {
Canv.softUp1 = 0xFF295723;
Canv.softUp2 = 0x88295723;
Canv.softDn1 = 0x8834EB5E;
Canv.softDn2 = 0xFF34EB5E;
Canv.background = 0x295723;
Canv.line = 0xDFFFFF;
Canv.text = 0x2ED45E;
Canv.valuet = 0x34EB5E;
Canv.inf = 0xCAC410;
}
private void setaNM() {
Canv.softUp1 = 0xFF99AACC;
Canv.softUp2 = 0x7599AACC;
Canv.softDn1 = 0x75CCFF99;
Canv.softDn2 = 0xFFCCFF99;
Canv.background = 0xFFFF99;
Canv.line = 0x002B55;
Canv.text = 0x333399;
Canv.valuet = 0x640022;
Canv.inf = 0x008000;
} }
} }

View File

@ -1,15 +1,15 @@
Sony Ericsson Player Service 5.2 Sony Ericsson Player Service 7.0
Автор: Виктор aNNiMON Мельник Автор: Виктор aNNiMON Мельник
Сайт разработчика: http://annimon.z83.ru/ Сайт разработчика: http://annimon.com/
Программа - управление родным плейером для телефонов Sony Ericsson с поддержкой MultimediaService API и датчиком движения. Программа - управление стандартным плейером телефонов Sony Ericsson с поддержкой Multimedia Service API и акселерометром.
Управление: Управление:
Влево/Вправо/Движение акселерометром - Переключение песен. Влево/Вправо/Движение акселерометром - Переключение песен.
Вверх/Вниз - переключение режимов: Всё/Визуализация/Текст. Вверх/Вниз - переключение режимов: Всё/Визуализация.
1 - Горячая клавиша поиска текста. 1 - Горячая клавиша поиска текста.
3 - установить начало/конец отрезка или отключить повтор. 3 - установить начало/конец отрезка для повтора или отключить повтор.
4/6 - Перемотка назад/вперед. 4/6 - Перемотка назад/вперед.
5/Огонь - Пауза. 5/Огонь - Пауза.
9 - Спящий режим. 9 - Спящий режим.
@ -18,6 +18,21 @@ Sony Ericsson Player Service 5.2
# - Включение/Отключение акселерометра. # - Включение/Отключение акселерометра.
Изменения: Изменения:
Версия 7.0
- При выборе цвета скина, по нажатию кн.0 можно выбрать цвет текста.
Версия 6.0
- Перерисован интерфейс. Огромное спасибо за идею EviGL.
- Выбор цвета скина. Принципиально новая технология - весь интерфейс строиться всего-лишь на одном цвете - цвете фона. Остальные цвета генерируются при помощи некоторой системы преобразований.
- Добавил еще одну программную визуализацию - звезды.
- Выбор визуализации теперь доступен из отдельного пункта меню, при этом есть возможность её предпросмотра. Кнопки 4/6 - переключить визуализацию.
- Визуализация переключения режимов (показ всех данных / визуализация).
- Скробблинг теперь успешно перенесен на сайт annimon.com.
- Обновление скрипта скробблера: теперь вместо текстового режима будет выдаваться html-страница; в списке проигранных треков, теперь будет выдаваться ссылка на просмотр текста песен; сортировка по последним обновленным записям; некоторые другие исправления. Теперь скрипт доступен по адресу http://annimon.com/seps/seps.php.
- Отключение таймера при вводе 0 в спящем режиме.
- Скроллинг длинных названий песен.
- Добавлена быстрая перемотка на зажатие кнопок 4 или 6.
- Добавлена визуализация смены громкости.
Версия 5.2 Версия 5.2
- Добавлен пункт в настройках, при котором переключение треков будет идти только вперед, независимо от направления рывка. - Добавлен пункт в настройках, при котором переключение треков будет идти только вперед, независимо от направления рывка.
- Поддержка русской кодировки в именах файлов. - Поддержка русской кодировки в именах файлов.

View File

@ -0,0 +1,276 @@
/*
* aNNiMON 2011
* For more info visit http://annimon.com/
*/
package mobscrob.scrobbler;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Image;
/**
*
* @author aNNiMON
*/
public class AudioScrobbler {
private Image avatarBitmap;
private String challenge;
private String clientId;
private String clientVersion;
private boolean connected = false;
private String handshakeUrl;
private String md5Response;
private String passwordMD5;
private String submitUrl;
private String user;
private static final String DEFAULT_HOST = "";//"post.audioscrobbler.com";
/*
* private void SubmitTrack()
* {
* if (this.LastFM[2] == string.Empty)
* {
* this.LastFM[2] = Audioscrobbler.GetPasswordMD5(this.LastFM[1]);
* }
* if (this.audioscrobbler == null)
* {
* this.audioscrobbler = new Audioscrobbler("opa", "0.1", this.LastFM[0], this.LastFM[2]);
* this.audioscrobbler.ConnectionFailed += new EventHandler(audioscrobbler_ConnectionFailed);
* this.audioscrobbler.Submitted += new EventHandler(this.audioscrobbler_Submitted);
* this.audioscrobbler.ConnectionEstablished += new EventHandler(audioscrobbler_ConnectionEstablished);
* }
* this.audioscrobbler.Connect();
* }
*
* ((Audioscrobbler)sender).Submit(frmMain.CurrentTrackInfo[1], frmMain.CurrentTrackInfo[3], frmMain.CurrentTrackInfo[2],
* "1", frmMain.CurrentTrackLength / 1000);
*/
//"opa", "0.1", this.LastFM[0], this.LastFM[2]
public AudioScrobbler(String clientId, String clientVersion, String user, String passwordMD5) {
this.clientId = clientId;
this.clientVersion = clientVersion;
this.user = user;
this.passwordMD5 = passwordMD5;
this.handshakeUrl = "http://post.audioscrobbler.com/?hs=true&p=1.1&c=" + this.clientId + "&v=" + this.clientVersion + "&u=" + this.user;
}
private void connectNow() {
try {
this.avatarBitmap = null;
byte[] body = HTTPUtil.getUrl(this.handshakeUrl, DEFAULT_HOST);
Vector lines = ByteUtil.readLines(body);
// check is OK
String str = (String) lines.elementAt(0);
if (str.equals("UPTODATE") || str.startsWith("UPDATE"))
{
this.challenge = (String) lines.elementAt(1);
this.submitUrl = (String) lines.elementAt(2);
String s = this.passwordMD5 + this.challenge;
this.md5Response = MD5.getHashString(s).replace('-', '\0').toLowerCase();
this.connected = true;
//ConnectionEstablished(this, new EventArgs());
}
} catch (Exception ex) {
//ConnectionFailed(this, new EventArgs());
}
}
public void connect() {
Thread thread = new Thread(new Runnable() {
public void run() {
connectNow();
}
});
thread.start();
}
private void downloadAvatar() {
String str = MD5.getHashString(this.user).replace('-', '\0').toLowerCase();
try {
byte[] img = HTTPUtil.getUrl("http://static.last.fm/avatar/" + str + ".jpg/", "");
this.avatarBitmap = Image.createImage(img, 0, img.length);
} catch (Exception ex) {
}
}
public static String GetPasswordMD5(String password) {
return MD5.getHashString(password).replace('-', '\0').toLowerCase();
}
public void Submit(String artist, String song, String album, String musicBrainzId, int length) {
if (this.connected) {
final Submittor submittor = new Submittor(this.submitUrl, this.user, this.md5Response, artist, song, album, musicBrainzId, length, 3);
Thread thread = new Thread(new Runnable() {
public void run() {
submittor.execute();
}
});
thread.start();
}
}
public Image AvatarBitmap() {
return this.avatarBitmap;
}
private class Submittor {
private String album;
private String artist;
private int length;
private String musicBrainzId;
private String response;
private int retry;
private String song;
private String url;
private String user;
public Submittor(String url, String user, String response, String artist, String song, String album, String musicBrainzId, int length, int retry) {
this.url = url;
this.user = user;
this.response = response;
this.artist = (retry == 0) ? HTTPUtil.encodeParam(artist) : artist;
this.song = (retry == 0) ? HTTPUtil.encodeParam(song) : song;
this.album = (retry == 0) ? HTTPUtil.encodeParam(album) : album;
this.musicBrainzId = musicBrainzId;
this.length = length;
this.retry = retry;
}
private String getTime() {
StringBuffer sb = new StringBuffer();
Calendar cal = Calendar.getInstance();
int tmp;
//Ãîä 2009-06-15 20:45:30Z
tmp = cal.get(Calendar.YEAR);
if (tmp <= 9) {
sb.append('0');
}
sb.append(tmp);
sb.append('-');
//Ìåñÿö
tmp = cal.get(Calendar.MONTH) + 1;
if (tmp <= 9) {
sb.append('0');
}
sb.append(tmp);
sb.append('-');
//Äåíü
tmp = cal.get(Calendar.DAY_OF_MONTH);
if (tmp <= 9) {
sb.append('0');
}
sb.append(tmp);
sb.append(' ');
//×àñ
tmp = cal.get(Calendar.HOUR_OF_DAY);
if (tmp <= 9) {
sb.append('0');
}
sb.append(tmp);
sb.append(':');
//Ìèíóòà
tmp = cal.get(Calendar.MINUTE);
if (tmp <= 9) {
sb.append('0');
}
sb.append(tmp);
sb.append(':');
//Ñåêóíäà
tmp = cal.get(Calendar.SECOND);
if (tmp <= 9) {
sb.append('0');
}
sb.append(tmp);
return sb.toString();
}
public void execute() {
HttpConnection conn = null;
OutputStream os = null;
try {
StringBuffer sb = new StringBuffer();
sb.append("u=").append(this.user); //User
sb.append("&s=").append(this.response); //Session
sb.append("&a[0]=").append(this.artist); //Artist
sb.append("&t[0]=").append(this.song); //Title
sb.append("&b[0]=").append(this.album); //Album
sb.append("&m[0]=").append(this.musicBrainzId); //MusicBrainzId
sb.append("&l[0]=").append(this.length); //Length (Duration)
sb.append("&i[0]=").append(getTime()); //Current Time
byte[] bytes = sb.toString().getBytes("UTF-8");
// set up HTTP connection
conn = (HttpConnection) Connector.open(this.url);
conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty("User-Agent", "SEPlayerService");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(bytes.length));
// try opening output stream first
os = conn.openOutputStream();
// try writing byte by byte
try {
os.write(bytes, 0, bytes.length);
} finally {
os.close();
}
/*for (int i = 0; i < paramBytes.length; i++) {
os.write((int) paramBytes[i]);
}*/
byte[] resp = HTTPUtil.readHttpResponse(conn);
Vector lines = ByteUtil.readLines(resp);
try {
String str2 = (String) lines.elementAt(0);
int interval = 0;
String str3 = (String) lines.elementAt(1);
if ((str3 != null) && str3.startsWith("INTERVAL")) {
try {
interval = Integer.parseInt(str3.substring("INTERVAL ".length()));
} catch (Exception ex) {
}
}
if (str2.startsWith("FAILED")) {
this.retry(interval);
} else if (str2.startsWith("BADAUTH")) {
throw new Exception();
}
} finally {
conn.close();
}
} catch (Exception ex) {
}
}
private void retry(int interval) {
if (this.retry <= 3) {
this.retry++;
try {
Thread.sleep((int) ((interval * this.retry) * 0x3e8));
} catch (InterruptedException ex) {
}
final AudioScrobbler.Submittor submittor = new AudioScrobbler.Submittor(this.url, this.user, this.response, this.artist, this.song, this.album, this.musicBrainzId, this.length, this.retry);
Thread thread = new Thread(new Runnable() {
public void run() {
submittor.execute();
}
});
thread.start();
}
}
}
}

View File

@ -0,0 +1,79 @@
/**
* ByteUtil.java
* @date 30 Sep 2008
*
* This program is distributed under the terms of the GNU General Public
* License
* Copyright 2008 NJ Pearman
*
* This file is part of MobScrob.
*
* MobScrob is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MobScrob is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MobScrob. If not, see <http://www.gnu.org/licenses/>.
*/
package mobscrob.scrobbler;
import java.util.Vector;
/**
*
*/
/**
* @author Neill
*
*/
public class ByteUtil {
/**
* Utility class so private constructor
*/
private ByteUtil() {
}
/**
* Returns a Vector of Strings representing the lines present in the byte
* array, separated by '\n' return feed.
*
* @param bytes
* @return
*/
public static Vector readLines(byte[] bytes) {
//final String methodName = "1";
Vector lines = new Vector();
if (bytes == null || bytes.length == 0) {
return lines;
}
StringBuffer line = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] == '\n') {
lines.addElement(line.toString());
line = new StringBuffer();
} else {
// add to current line
line.append((char) bytes[i]);
}
}
return lines;
}
public static void replaceSpaceWithPlus(byte[] bytes) {
if (bytes != null) {
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] == ' ') {
bytes[i] = '+';
}
}
}
}
}

View File

@ -0,0 +1,192 @@
/**
* HTTPUtil.java
*
* This program is distributed under the terms of the GNU General Public
* License
* Copyright 2008 NJ Pearman
*
* This file is part of MobScrob.
*
* MobScrob is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MobScrob is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MobScrob. If not, see <http://www.gnu.org/licenses/>.
*/
package mobscrob.scrobbler;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
/**
* @author Neill
*
*/
public class HTTPUtil {
private static final String ENC_UTF8 = "UTF-8";
public static final String HEADER_HOST = "Host";
private HTTPUtil() {}
/**
* Encodes a parameter, also ensuring that it is UTF-8
*
* @param s
* @return
* @throws UnsupportedEncodingException
*/
public static String encodeParam(String s) {
if (s == null) {
return s;
}
// encode as UTF-8
String utf8Str;
try {
utf8Str = new String(s.getBytes(), ENC_UTF8);
} catch (UnsupportedEncodingException ex) {
utf8Str = s;
}
StringBuffer sb = new StringBuffer(utf8Str.length() * 3);
char[] chars = utf8Str.toCharArray();
int next;
// encode the chars in the UTF-8 String
for (int i = 0; i < chars.length; i++) {
next = chars[i];
if ((next >= 0x30 && next <= 0x39) || // 0-9
(next >= 0x41 && next <= 0x5A) || // A-Z
(next >= 0x61 && next <= 0x7A)) { // a-z
sb.append((char) next);
} else if ((next == 0xA0)) { // ' ' (whitespace)
sb.append('+');
} else { // encode all other chars
sb.append("%");
if (next <= 0xf)
sb.append("0");
sb.append(Integer.toHexString(next));
}
}
return sb.toString();
}
/**
* Attempts to open a URL using the GET method over HTTP and read the
* response into a byte array. Any IOExceptions are simply thrown out of
* this method to be caught elsewhere.
*
* @param url
* @return
* @throws IOException
*/
public static byte[] getUrl(String url, String headerHostname) throws IOException {
HttpConnection conn = null;
try {
conn = (HttpConnection) Connector.open(url);
// set the compulsory HTTP/1.1 Host: header, as GET
conn.setRequestMethod(HttpConnection.GET);
//if(!headerHostname.equals(""))
// conn.setRequestProperty(HEADER_HOST, headerHostname);
byte[] body = readHttpResponse(conn);
return body;
} finally {
closeHttpConnection(conn);
}
}
/**
* Reads the response from the specified HTTP connection into a byte array.
*
* @param conn
* @return
* @throws IOException
*/
public static byte[] readHttpResponse(HttpConnection conn) throws IOException {
final String methodName = "6";
int rc = conn.getResponseCode();
if (rc != HttpConnection.HTTP_OK) {
String msg = "HTTP response code not OK: " + rc;
throw new IOException(msg);
}
String connHeader = conn.getHeaderField("Connection");
// connect
int len = (int) conn.getLength();
InputStream is = null;
try {
is = conn.openInputStream();
// read response
if (len > -1) {
byte[] body = new byte[len];
int actual = 0;
int bytesread = 0;
while ((bytesread != len) && (actual != -1)) {
actual = is.read(body, bytesread, len - bytesread);
bytesread += actual;
}
// do something
return body;
} else {
// read byte by byte...?
Vector bytes = new Vector();
Byte byteObj;
int next;
while ((next = is.read()) > -1) {
byteObj = new Byte((byte) next);
bytes.addElement(byteObj);
}
byte[] body = new byte[bytes.size()];
Enumeration e = bytes.elements();
int i = 0;
while (e.hasMoreElements()) {
byteObj = (Byte) e.nextElement();
body[i++] = byteObj.byteValue();
}
return body;
}
} finally {
if (is != null) {
try {
is.close();
} catch (Exception e) {
}
}
}
}
public static void closeHttpConnection(HttpConnection conn) {
final String methodName = "7";
if (conn != null) {
try { conn.close(); }
catch (Exception e) { } //log.error(methodName, "Unable to close HTTP connecton: " + e.getMessage(), e); }
}
}
}

View File

@ -0,0 +1,648 @@
/**
* MD5.java
* @author NJ Pearman
* @date 7 Oct 2008
*
* This program is distributed under the terms of the GNU General Public
* License
* Copyright 2008 NJ Pearman
*
* This file is part of MobScrob.
*
* MobScrob is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MobScrob is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MobScrob. If not, see <http://www.gnu.org/licenses/>.
*/
package mobscrob.scrobbler;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
/**
* @author Neill
*
*/
public class MD5 {
/**
* Class constructor
*
* @since ostermillerutils 1.00.00
*/
public MD5() {
reset();
}
/**
* Gets this hash sum as an array of 16 bytes.
*
* @return Array of 16 bytes, the hash of all updated bytes.
*
* @since ostermillerutils 1.00.00
*/
public byte[] getHash() {
if (!finalState.valid) {
finalState.copy(workingState);
long bitCount = finalState.bitCount;
// Compute the number of left over bits
int leftOver = (int) (((bitCount >>> 3)) & 0x3f);
// Compute the amount of padding to add based on number of left over bits.
int padlen = (leftOver < 56) ? (56 - leftOver) : (120 - leftOver);
// add the padding
update(finalState, padding, 0, padlen);
// add the length (computed before padding was added)
update(finalState, encode(bitCount), 0, 8);
finalState.valid = true;
}
// make a copy of the hash before returning it.
return encode(finalState.state, 16);
}
/**
* Returns 32-character hex representation of this hash.
*
* @return String representation of this object's hash.
*
* @since ostermillerutils 1.00.00
*/
public String getHashString() {
return toHex(this.getHash());
}
/**
* Gets the MD5 hash of the given byte array.
*
* @param b byte array for which an MD5 hash is desired.
* @return Array of 16 bytes, the hash of all updated bytes.
*
* @since ostermillerutils 1.00.00
*/
public static byte[] getHash(byte[] b) {
MD5 md5 = new MD5();
md5.update(b);
return md5.getHash();
}
/**
* Gets the MD5 hash of the given byte array.
*
* @param b byte array for which an MD5 hash is desired.
* @return 32-character hex representation the data's MD5 hash.
*
* @since ostermillerutils 1.00.00
*/
public static String getHashString(byte[] b) {
MD5 md5 = new MD5();
md5.update(b);
return md5.getHashString();
}
/**
* Gets the MD5 hash the data on the given InputStream.
*
* @param in byte array for which an MD5 hash is desired.
* @return Array of 16 bytes, the hash of all updated bytes.
* @throws IOException if an I/O error occurs.
*
* @since ostermillerutils 1.00.00
*/
public static byte[] getHash(InputStream in) throws IOException {
MD5 md5 = new MD5();
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
md5.update(buffer, read);
}
return md5.getHash();
}
/**
* Gets the MD5 hash the data on the given InputStream.
*
* @param in byte array for which an MD5 hash is desired.
* @return 32-character hex representation the data's MD5 hash.
* @throws IOException if an I/O error occurs.
*
* @since ostermillerutils 1.00.00
*/
public static String getHashString(InputStream in) throws IOException {
MD5 md5 = new MD5();
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
md5.update(buffer, read);
}
return md5.getHashString();
}
/**
* Gets the MD5 hash of the given String.
* The string is converted to bytes using the current
* platform's default character encoding.
*
* @param s String for which an MD5 hash is desired.
* @return Array of 16 bytes, the hash of all updated bytes.
*
* @since ostermillerutils 1.00.00
*/
public static byte[] getHash(String s) {
MD5 md5 = new MD5();
md5.update(s);
return md5.getHash();
}
/**
* Gets the MD5 hash of the given String.
* The string is converted to bytes using the current
* platform's default character encoding.
*
* @param s String for which an MD5 hash is desired.
* @return 32-character hex representation the data's MD5 hash.
*
* @since ostermillerutils 1.00.00
*/
public static String getHashString(String s) {
MD5 md5 = new MD5();
md5.update(s);
return md5.getHashString();
}
/**
* Gets the MD5 hash of the given String.
*
* @param s String for which an MD5 hash is desired.
* @param enc The name of a supported character encoding.
* @return Array of 16 bytes, the hash of all updated bytes.
* @throws UnsupportedEncodingException If the named encoding is not supported.
*
* @since ostermillerutils 1.00.00
*/
public static byte[] getHash(String s, String enc) throws UnsupportedEncodingException {
MD5 md5 = new MD5();
md5.update(s, enc);
return md5.getHash();
}
/**
* Gets the MD5 hash of the given String.
*
* @param s String for which an MD5 hash is desired.
* @param enc The name of a supported character encoding.
* @return 32-character hex representation the data's MD5 hash.
* @throws UnsupportedEncodingException If the named encoding is not supported.
*
* @since ostermillerutils 1.00.00
*/
public static String getHashString(String s, String enc) throws UnsupportedEncodingException {
MD5 md5 = new MD5();
md5.update(s, enc);
return md5.getHashString();
}
/**
* Reset the MD5 sum to its initial state.
*
* @since ostermillerutils 1.00.00
*/
public void reset() {
workingState.reset();
finalState.valid = false;
}
/**
* Returns 32-character hex representation of this hash.
*
* @return String representation of this object's hash.
*
* @since ostermillerutils 1.00.00
*/
public String toString() {
return getHashString();
}
/**
* Update this hash with the given data.
* <p>
* A state may be passed into this method so that we can add padding
* and finalize a md5 hash without limiting our ability to update
* more data later.
* <p>
* If length bytes are not available to be hashed, as many bytes as
* possible will be hashed.
*
* @param state Which state is updated.
* @param buffer Array of bytes to be hashed.
* @param offset Offset to buffer array.
* @param length number of bytes to hash.
*
* @since ostermillerutils 1.00.00
*/
private void update(MD5State state, byte buffer[], int offset, int length) {
finalState.valid = false;
// if length goes beyond the end of the buffer, cut it short.
if ((length + offset) > buffer.length) {
length = buffer.length - offset;
}
// compute number of bytes mod 64
// this is what we have sitting in a buffer
// that have not been hashed yet
int index = (int) (state.bitCount >>> 3) & 0x3f;
// add the length to the count (translate bytes to bits)
state.bitCount += length << 3;
int partlen = 64 - index;
int i = 0;
if (length >= partlen) {
System.arraycopy(buffer, offset, state.buffer, index, partlen);
transform(state, decode(state.buffer, 64, 0));
for (i = partlen; (i + 63) < length; i += 64) {
transform(state, decode(buffer, 64, i));
}
index = 0;
}
// buffer remaining input
if (i < length) {
for (int start = i; i < length; i++) {
state.buffer[index + i - start] = buffer[i + offset];
}
}
}
/**
* Update this hash with the given data.
* <p>
* If length bytes are not available to be hashed, as many bytes as
* possible will be hashed.
*
* @param buffer Array of bytes to be hashed.
* @param offset Offset to buffer array.
* @param length number of bytes to hash.
*
* @since ostermillerutils 1.00.00
*/
public void update(byte buffer[], int offset, int length) {
update(workingState, buffer, offset, length);
}
/**
* Update this hash with the given data.
* <p>
* If length bytes are not available to be hashed, as many bytes as
* possible will be hashed.
*
* @param buffer Array of bytes to be hashed.
* @param length number of bytes to hash.
*
* @since ostermillerutils 1.00.00
*/
public void update(byte buffer[], int length) {
update(buffer, 0, length);
}
/**
* Update this hash with the given data.
*
* @param buffer Array of bytes to be hashed.
*
* @since ostermillerutils 1.00.00
*/
public void update(byte buffer[]) {
update(buffer, 0, buffer.length);
}
/**
* Updates this hash with a single byte.
*
* @param b byte to be hashed.
*
* @since ostermillerutils 1.00.00
*/
public void update(byte b) {
byte buffer[] = new byte[1];
buffer[0] = b;
update(buffer, 1);
}
/**
* Update this hash with a String.
* The string is converted to bytes using the current
* platform's default character encoding.
*
* @param s String to be hashed.
*
* @since ostermillerutils 1.00.00
*/
public void update(String s) {
update(s.getBytes());
}
/**
* Update this hash with a String.
*
* @param s String to be hashed.
* @param enc The name of a supported character encoding.
* @throws UnsupportedEncodingException If the named encoding is not supported.
*
* @since ostermillerutils 1.00.00
*/
public void update(String s, String enc) throws UnsupportedEncodingException {
update(s.getBytes(enc));
}
/**
* The current state from which the hash sum
* can be computed or updated.
*
* @since ostermillerutils 1.00.00
*/
private MD5State workingState = new MD5State();
/**
* Cached copy of the final MD5 hash sum. This is created when
* the hash is requested and it is invalidated when the hash
* is updated.
*
* @since ostermillerutils 1.00.00
*/
private MD5State finalState = new MD5State();
/**
* Temporary buffer cached here for performance reasons.
*
* @since ostermillerutils 1.00.00
*/
private int[] decodeBuffer = new int[16];
/**
* 64 bytes of padding that can be added if the length
* is not divisible by 64.
*
* @since ostermillerutils 1.00.00
*/
private static final byte padding[] = {
(byte) 0x80, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,};
/**
* Contains internal state of the MD5 class.
* Passes MD5 test suite as defined in RFC1321.
*
* @since ostermillerutils 1.00.00
*/
private class MD5State {
/**
* True if this state is valid.
*
* @since ostermillerutils 1.00.00
*/
private boolean valid = true;
/**
* Reset to initial state.
*
* @since ostermillerutils 1.00.00
*/
private void reset() {
state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;
bitCount = 0;
}
/**
* 128-byte state
*
* @since ostermillerutils 1.00.00
*/
private int state[] = new int[4];
/**
* 64-bit count of the number of bits that have been hashed.
*
* @since ostermillerutils 1.00.00
*/
private long bitCount;
/**
* 64-byte buffer (512 bits) for storing to-be-hashed characters
*
* @since ostermillerutils 1.00.00
*/
private byte buffer[] = new byte[64];
private MD5State() {
reset();
}
/**
* Set this state to be exactly the same as some other.
*
* @param from state to copy from.
*
* @since ostermillerutils 1.00.00
*/
private void copy(MD5State from) {
System.arraycopy(from.buffer, 0, this.buffer, 0, this.buffer.length);
System.arraycopy(from.state, 0, this.state, 0, this.state.length);
this.valid = from.valid;
this.bitCount = from.bitCount;
}
}
/**
* Turns array of bytes into string representing each byte as
* a two digit unsigned hex number.
*
* @param hash Array of bytes to convert to hex-string
* @return Generated hex string
*
* @since ostermillerutils 1.00.00
*/
private static String toHex(byte hash[]) {
StringBuffer buf = new StringBuffer(hash.length * 2);
for (int i = 0; i < hash.length; i++) {
int intVal = hash[i] & 0xff;
if (intVal < 0x10) {
// append a zero before a one digit hex
// number to make it two digits.
buf.append("0");
}
buf.append(Integer.toHexString(intVal));
}
return buf.toString();
}
private static int FF(int a, int b, int c, int d, int x, int s, int ac) {
a += ((b & c) | (~b & d));
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}
private static int GG(int a, int b, int c, int d, int x, int s, int ac) {
a += ((b & d) | (c & ~d));
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}
private static int HH(int a, int b, int c, int d, int x, int s, int ac) {
a += (b ^ c ^ d);
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}
private static int II(int a, int b, int c, int d, int x, int s, int ac) {
a += (c ^ (b | ~d));
a += x;
a += ac;
//return rotateLeft(a, s) + b;
a = (a << s) | (a >>> (32 - s));
return a + b;
}
private static byte[] encode(long l) {
byte[] out = new byte[8];
out[0] = (byte) (l & 0xff);
out[1] = (byte) ((l >>> 8) & 0xff);
out[2] = (byte) ((l >>> 16) & 0xff);
out[3] = (byte) ((l >>> 24) & 0xff);
out[4] = (byte) ((l >>> 32) & 0xff);
out[5] = (byte) ((l >>> 40) & 0xff);
out[6] = (byte) ((l >>> 48) & 0xff);
out[7] = (byte) ((l >>> 56) & 0xff);
return out;
}
private static byte[] encode(int input[], int len) {
byte[] out = new byte[len];
int i, j;
for (i = j = 0; j < len; i++, j += 4) {
out[j] = (byte) (input[i] & 0xff);
out[j + 1] = (byte) ((input[i] >>> 8) & 0xff);
out[j + 2] = (byte) ((input[i] >>> 16) & 0xff);
out[j + 3] = (byte) ((input[i] >>> 24) & 0xff);
}
return out;
}
private int[] decode(byte buffer[], int len, int offset) {
int i, j;
for (i = j = 0; j < len; i++, j += 4) {
decodeBuffer[i] = ((buffer[j + offset] & 0xff))
| (((buffer[j + 1 + offset] & 0xff)) << 8)
| (((buffer[j + 2 + offset] & 0xff)) << 16)
| (((buffer[j + 3 + offset] & 0xff)) << 24);
}
return decodeBuffer;
}
private static void transform(MD5State state, int[] x) {
int a = state.state[0];
int b = state.state[1];
int c = state.state[2];
int d = state.state[3];
/* Round 1 */
a = FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */
d = FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */
c = FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */
b = FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */
a = FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */
d = FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */
c = FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */
b = FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */
a = FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */
d = FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */
c = FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
b = FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
a = FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
d = FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
c = FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
b = FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */
/* Round 2 */
a = GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */
d = GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */
c = GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
b = GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */
a = GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */
d = GG(d, a, b, c, x[10], 9, 0x02441453); /* 22 */
c = GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
b = GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */
a = GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */
d = GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
c = GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */
b = GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */
a = GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
d = GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */
c = GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */
b = GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
/* Round 3 */
a = HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */
d = HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */
c = HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
b = HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
a = HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */
d = HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */
c = HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */
b = HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
a = HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
d = HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */
c = HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */
b = HH(b, c, d, a, x[ 6], 23, 0x04881d05); /* 44 */
a = HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */
d = HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
c = HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
b = HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */
/* Round 4 */
a = II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */
d = II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */
c = II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
b = II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */
a = II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
d = II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */
c = II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
b = II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */
a = II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */
d = II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
c = II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */
b = II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
a = II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */
d = II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
c = II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */
b = II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */
state.state[0] += a;
state.state[1] += b;
state.state[2] += c;
state.state[3] += d;
}
}

View File

@ -1,2 +1,2 @@
aNNiMON, Ну Вот юин эсприта, основной плагмэйкер... 2542902 Вот LocID визуализация смены громкости
//SE сфотошопить + aNNiMOON Быстрая перемотка

BIN
src/res/album.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

BIN
src/res/artist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

BIN
src/res/exit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

BIN
src/res/pal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/res/pound.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

BIN
src/res/sb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

BIN
src/res/sbl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

BIN
src/res/star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

BIN
src/res/t.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

BIN
src/res/tl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

BIN
src/res/track.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

BIN
src/res/zero.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B