6.1
690
src/Canv.java
@ -2,10 +2,11 @@ import com.nokia.mid.ui.DeviceControl;
|
||||
import com.sonyericsson.multimedia.*;
|
||||
import com.sonyericsson.multimedia.control.*;
|
||||
import java.io.IOException;
|
||||
import java.util.Calendar;
|
||||
import java.util.*;
|
||||
import javax.microedition.io.Connector;
|
||||
import javax.microedition.lcdui.*;
|
||||
import javax.microedition.sensor.*;
|
||||
import mobscrob.scrobbler.AudioScrobbler;
|
||||
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
@ -18,25 +19,47 @@ import javax.microedition.sensor.*;
|
||||
*/
|
||||
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;
|
||||
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 boolean lite;
|
||||
private int mode;
|
||||
private int accelPrevDelta = 0;
|
||||
|
||||
private Lyrics lrc;
|
||||
public RateImpl ri;
|
||||
private Engine1 e1, tmpe1;
|
||||
private Engine2 e2, tmpe2;
|
||||
private Object tmpswf;
|
||||
private Images im;
|
||||
private FWCashe mfwc;
|
||||
|
||||
private byte repeat;//ôóíêöèÿ ïîâòîðà
|
||||
private int a,b;
|
||||
|
||||
public Object swf;
|
||||
|
||||
private boolean updateAlbum;
|
||||
private Image I, album;
|
||||
private Engine2 e2;
|
||||
private Graphics G;
|
||||
private Thread thr;
|
||||
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 String URL;
|
||||
|
||||
public Canv() {
|
||||
public Canv(Images im) {
|
||||
setFullScreenMode(true);
|
||||
thr = new Thread(this);
|
||||
thr.start();
|
||||
lite = false;
|
||||
repeat = 0;
|
||||
mode = 0; //Ðåæèì ïëåéåðà
|
||||
w = getWidth();
|
||||
h = getHeight();
|
||||
volumeminus = h = getHeight();
|
||||
I = Image.createImage(w, h);
|
||||
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();
|
||||
service = MultimediaServiceManager.getMultimediaService("MediaPlayer");
|
||||
mediaControl = (MediaControl)service.getControl("MediaControl");
|
||||
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) {
|
||||
ri = new RateImpl();
|
||||
ri.open();
|
||||
@ -74,34 +111,134 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
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) {
|
||||
setFullScreenMode(true);
|
||||
//Âûáîð âèçóàëèçàöèè
|
||||
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) {
|
||||
g.setColor(background);
|
||||
g.fillRect(0, 0, w, h);
|
||||
g.setFont(medFont);
|
||||
int ih = h-2*im.statusBarHeight-medFont.getHeight()-8;
|
||||
if (media != null) {
|
||||
MetaData metaData = media.getMetaData();
|
||||
if (metaData != null) {
|
||||
Object data = getValue(metaData, MetaData.TITLE_KEY);
|
||||
if (data != null) drawTitle(g, (String) data);
|
||||
|
||||
String data = getValue(metaData, MetaData.TITLE_KEY);
|
||||
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) {
|
||||
int ih = h-2*medFont.getHeight()-6;
|
||||
if(album.getHeight()>ih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih);
|
||||
g.drawImage(album, w/2, h/2, 3);
|
||||
}else if(Rms.vis){
|
||||
int ih = h-(2*medFont.getHeight())-6;
|
||||
if(Rms.visid==0) {
|
||||
if(e2==null) {
|
||||
e2 = new Engine2(w-6, ih);
|
||||
e2 = new Engine2(w, ih);
|
||||
e2.setRun(true);
|
||||
}
|
||||
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{
|
||||
((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) {
|
||||
@ -128,40 +265,52 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
private void drawPlayerCanvas(Graphics g) {
|
||||
g.setColor(background);
|
||||
g.fillRect(0, 0, w, h);
|
||||
drawTitle(g, "SEPS by aNNiMON");
|
||||
drawTitle(g, getTime());
|
||||
int fh = smallFont_b.getHeight()+2;
|
||||
int py = fh+fh/2;
|
||||
g.setFont(medFont);
|
||||
if (media != null) {
|
||||
MetaData metaData = media.getMetaData();
|
||||
if (metaData != null) {
|
||||
Object data = getValue(metaData, MetaData.ARTIST_KEY);
|
||||
if (data != null) py = drawText(g, (String) data, py);
|
||||
String data = getValue(metaData, MetaData.ARTIST_KEY);
|
||||
g.drawImage(im.artist, 2, py, 20);
|
||||
if (data != null) py = drawText(g, scrollText(data, 0), py, 0);
|
||||
|
||||
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);
|
||||
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);
|
||||
//data = metaData.getValue(metaData.FILE_URI_KEY);
|
||||
//if (data != null)
|
||||
float div = ((float)w - 10) / (float)media.getDuration();
|
||||
g.setColor(valuet);
|
||||
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);
|
||||
if(repeat==1) g.drawLine(5+(int)(a*div), py, 5+(int)(a*div), py+10);
|
||||
if(repeat==2) {
|
||||
g.drawLine((int)(a*div), py, (int)(a*div), py+10);
|
||||
g.drawLine((int)(b*div), py, (int)(b*div), py+10);
|
||||
g.drawLine(5+(int)(a*div), py, 5+(int)(a*div), py+10);
|
||||
g.drawLine(5+(int)(b*div), py, 5+(int)(b*div), py+10);
|
||||
}
|
||||
g.setColor(text);
|
||||
g.drawRect(5, py, w-10, 10);
|
||||
if(updateAlbum) {
|
||||
byte[] alb = metaData.getAlbumArt();
|
||||
if (alb != null) album = Image.createImage(alb, 0, alb.length);
|
||||
else album = null;
|
||||
updateAlbum = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (album != null) {
|
||||
int ih = h-fh-2-py-20;
|
||||
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);
|
||||
}
|
||||
g.drawImage(e2.MainCanvas(), w/2, py+15, 17);
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
g.setColor(inf);
|
||||
if(Rms.vis) g.drawString("*-V", 2, py+15, 20);
|
||||
if(Rms.isLyric) g.drawString("0-L", 2, py+15+(smallFont_b.getHeight()+2), 20);
|
||||
if(Rms.accel) g.drawString("#-A", 2, py+15+2*(smallFont_b.getHeight()+2), 20);
|
||||
if(Rms.slpmode) g.drawString("S", 2, py+15+3*(smallFont_b.getHeight()+2), 20);
|
||||
drawSoft(g, SEPS.midlet.lang.menu, SEPS.midlet.lang.exit);
|
||||
drawSoft(g);
|
||||
}
|
||||
|
||||
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);
|
||||
if(key==-7) {
|
||||
rspressed = false;
|
||||
if(Rms.closePlayer) pauseTrack();
|
||||
SEPS.midlet.destroyApp(true);
|
||||
}
|
||||
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;
|
||||
}else if(key==KEY_NUM9) new SetSleepMode();
|
||||
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_NUM1) {
|
||||
else if(key==KEY_NUM1) {
|
||||
String art="",tit="";
|
||||
try{
|
||||
MetaData metaData = SEPS.midlet.cnv.media.getMetaData();
|
||||
@ -209,9 +426,6 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
FindLyrics fl = new FindLyrics();
|
||||
fl.find(art, tit);//SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
}
|
||||
if(key==KEY_NUM9) new SetSleepMode();//SEPS.midlet.dsp.setCurrent();
|
||||
if(ga==LEFT && key!=KEY_NUM4) prevTrack();
|
||||
if(ga==RIGHT && key!=KEY_NUM6) nextTrack();
|
||||
switch(ga) {
|
||||
case UP:
|
||||
upMode();
|
||||
@ -231,7 +445,26 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -285,7 +518,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
}
|
||||
if(!Rms.vis) Thread.sleep(100);
|
||||
if(Rms.slpmode) {
|
||||
if(getTime()) {
|
||||
if(checkTime()) {
|
||||
pauseTrack();
|
||||
SEPS.midlet.destroyApp(true);
|
||||
}
|
||||
@ -307,9 +540,41 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
thisSong = thisSong+" - "+ (String) data;
|
||||
if(!thisSong.equalsIgnoreCase(Rms.lastSong)) {
|
||||
int thisTime = media.getMediaTime();
|
||||
int allTime = media.getDuration()*20/*% ïðîèãðàíî*//100;
|
||||
int allTime = media.getDuration()*50/*% ïðîèãðàíî*//100;
|
||||
if(thisTime>allTime) {
|
||||
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) {
|
||||
Rms.lastSong = thisSong;
|
||||
cn = ri.update(thisSong);
|
||||
@ -444,7 +709,11 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
|
||||
private void fastForward() {
|
||||
try {
|
||||
mediaControl.skip(10);
|
||||
if(fastF) {
|
||||
fastF = false;
|
||||
mediaControl.play();
|
||||
}
|
||||
else mediaControl.skip(10);
|
||||
} catch (ControlException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
@ -452,20 +721,16 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
|
||||
private void rewind() {
|
||||
try {
|
||||
mediaControl.skip(-10);
|
||||
if(fastR) {
|
||||
fastR = false;
|
||||
mediaControl.play();
|
||||
}
|
||||
else mediaControl.skip(-10);
|
||||
} catch (ControlException ex) {
|
||||
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) {
|
||||
try {
|
||||
switch (eventId) {
|
||||
@ -488,11 +753,8 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
MetaData data = this.media.getMetaData();
|
||||
if (data != null) {
|
||||
byte[] alb = data.getAlbumArt();
|
||||
if (alb != null) {
|
||||
album = Image.createImage(alb, 0, alb.length);
|
||||
} else {
|
||||
album = null;
|
||||
}
|
||||
if (alb != null) album = Image.createImage(alb, 0, alb.length);
|
||||
else album = null;
|
||||
}
|
||||
a = b = 0; repeat = 0;
|
||||
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) {
|
||||
int fh = medFont.getHeight()+4;
|
||||
g.setColor(valuet);
|
||||
g.setFont(medFont);
|
||||
if(Rms.skinid==3) {text=toEmo(text);}
|
||||
g.drawString(text, w/2, 2, 17);
|
||||
drawRect(g, softUp1, softUp2, 0, 0, w, fh/2);
|
||||
drawRect(g, softDn1, softDn2, 0, fh/2, w, fh/2);
|
||||
}
|
||||
|
||||
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);
|
||||
int k = im.titleleft.getWidth();
|
||||
for(int i=k; i<w-k; i++) g.drawImage(im.title, i, 0, 20);
|
||||
g.drawImage(im.titleleft, 0, 0, 20);
|
||||
g.drawImage(im.titleright, w, 0, 24);
|
||||
g.drawString(text, k, 2, 20);
|
||||
if(mode==0) g.drawString("SEPlayerService", w-k, 2, 24);
|
||||
}
|
||||
|
||||
private void drawCenter(Graphics g, String[] lines) {
|
||||
@ -567,9 +901,9 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
int fh = sm.getHeight()+2;
|
||||
g.setFont(sm);
|
||||
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++) {
|
||||
v=Rms.skinid==3 ? toEmo(lines[i]) : lines[i];
|
||||
v=lines[i];
|
||||
if(i==2) {
|
||||
g.setColor(valuet);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private int drawText(Graphics g, String value, int y) {
|
||||
g.setColor(line);
|
||||
g.drawLine(3, y-1, w-3, y-1);
|
||||
|
||||
if(Rms.skinid==3) {value=toEmo(value);}
|
||||
|
||||
g.setColor(valuet);
|
||||
g.setFont(smallFont_b);
|
||||
g.drawString(value, w/2, y, 17);
|
||||
|
||||
return y+(smallFont_b.getHeight()+2);
|
||||
private void drawRect(Graphics g, int color1, int color2, int x1, int y1, int w, int h) {
|
||||
int a1 = (color1 >> 24) & 0xff;
|
||||
int r1 = (color1 >> 16) & 0xff;
|
||||
int g1 = (color1 >> 8) & 0xff;
|
||||
int b1 = color1 & 0xff;
|
||||
int a2 = (color2 >> 24) & 0xff;
|
||||
int r2 = (color2 >> 16) & 0xff;
|
||||
int g2 = (color2 >> 8) & 0xff;
|
||||
int b2 = color2 & 0xff;
|
||||
int beforecolor = g.getColor();
|
||||
int crd1, crd2;
|
||||
int count = h/3;
|
||||
if (count < 0) count = -count;
|
||||
if (count < 8) count = 8;
|
||||
boolean lite = false;
|
||||
if(a1==0xff && a2==0xff) lite = true;
|
||||
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);
|
||||
}
|
||||
}
|
||||
g.setColor(beforecolor);
|
||||
}
|
||||
|
||||
private String toEmo(String s) {
|
||||
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();
|
||||
int i = 0;
|
||||
boolean up = true;
|
||||
while(i<s.length()) {
|
||||
String ch = s.substring(i, i+1);
|
||||
if(up) ch = ch.toUpperCase();
|
||||
else ch = ch.toLowerCase();
|
||||
sb.append(ch);
|
||||
i++;
|
||||
up=!up;
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
private void upMode() {
|
||||
mode = 1-mode;
|
||||
e2=null;
|
||||
album = null;
|
||||
private int random(int min, int max) {
|
||||
return min + ((new Random().nextInt() >>> 1)%(max-min));
|
||||
}
|
||||
|
||||
private void ABRepeat() {
|
||||
@ -640,4 +1008,32 @@ public class Canv extends Canvas implements Runnable, MediaControlListener {
|
||||
} 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;
|
||||
}
|
||||
}
|
@ -10,23 +10,13 @@ import javax.microedition.lcdui.*;
|
||||
*/
|
||||
public class Capuchin {
|
||||
|
||||
//public FlashPlayer flashPlayer;
|
||||
public FlashImage flashImage;
|
||||
//public FlashCanvas flashCanvas;
|
||||
|
||||
public Capuchin(int i) {
|
||||
// flashPlayer = null;
|
||||
flashImage = null;
|
||||
// flashCanvas = null;
|
||||
try
|
||||
{
|
||||
flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i)+".swf"), null);
|
||||
// if(flashImage != null)
|
||||
// {
|
||||
// flashCanvas = new FlashCanvas(flashImage);
|
||||
// flashPlayer = FlashPlayer.createFlashPlayer(flashImage, flashCanvas);
|
||||
// flashCanvas.setFullScreenMode(true);
|
||||
// }
|
||||
flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i-1)+".swf"), null);
|
||||
}
|
||||
catch(Exception ex) {}
|
||||
}
|
||||
@ -34,4 +24,11 @@ public class Capuchin {
|
||||
public void drawFlash(Graphics g, int x, int y, int w, int 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;
|
||||
}
|
||||
}
|
128
src/Effects.java
@ -6,6 +6,41 @@ import javax.microedition.lcdui.*;
|
||||
*/
|
||||
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) {
|
||||
int sourceWidth = image.getWidth();
|
||||
int sourceHeight = image.getHeight();
|
||||
@ -51,4 +86,97 @@ public class Effects {
|
||||
}
|
||||
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
@ -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);
|
||||
}
|
||||
}
|
@ -17,7 +17,7 @@ public class Engine2 implements Runnable {
|
||||
|
||||
private boolean rb, gb, bb;
|
||||
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 Random rnd;
|
||||
private Thread thr;
|
||||
@ -29,6 +29,10 @@ public class Engine2 implements Runnable {
|
||||
db = Image.createImage(w, h);
|
||||
G = db.getGraphics();
|
||||
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.start();
|
||||
}
|
||||
@ -48,7 +52,6 @@ public class Engine2 implements Runnable {
|
||||
case 11: U=(rnd.nextInt() >>> 1) % 9; break;
|
||||
case 14: if(K>16) K-=15; break;
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(2000L);
|
||||
} catch (InterruptedException ex) {}
|
||||
@ -63,7 +66,6 @@ public class Engine2 implements Runnable {
|
||||
rgb(G);
|
||||
visual(G);
|
||||
return db;
|
||||
|
||||
}
|
||||
|
||||
private void rgb(Graphics grf) {
|
||||
@ -114,11 +116,7 @@ public class Engine2 implements Runnable {
|
||||
}
|
||||
|
||||
private void visual(Graphics grf) {
|
||||
if (w > h) {
|
||||
len = (float) (h / L / N);
|
||||
} else {
|
||||
len = (float) (w / L / N);
|
||||
}
|
||||
len = (float) (w>h?h:w) / L / N;
|
||||
k = (float) (Math.abs(rnd.nextFloat() * 360) * Math.PI / 180);
|
||||
float r50 = (float) (Math.abs(rnd.nextFloat()) * 50);
|
||||
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);
|
||||
ty = (float) (y + Math.sin(j * d + a[i]) * len);
|
||||
x = x + (float) (Math.cos(j * d + a[i]) * len);
|
||||
}
|
||||
if (fr == 2) {
|
||||
}else if (fr == 2) {
|
||||
tx = (float) (x + Math.sin(j * d + a[i]) * len);
|
||||
ty = (float) (y + Math.cos(j * d + a[i]) * len);
|
||||
}
|
||||
if (fr == 3) {
|
||||
}else if (fr == 3) {
|
||||
tx = (float) (x + Math.tan(j * d + a[1]) * len);
|
||||
ty = (float) (y + Math.cos(j * d + a[i]) * len);
|
||||
y = y - (float) (Math.sin(j * d + a[i]) * len);
|
||||
}
|
||||
if (fr == 4) {
|
||||
}else if (fr == 4) {
|
||||
tx = (float) (x + Math.tan(j * d + a[1]) * len);
|
||||
ty = (float) (y + Math.cos(j * d + a[i]) * len);
|
||||
x = y - (float) (Math.sin(j * d + a[i]) * len);
|
||||
}
|
||||
if (fr == 5) {
|
||||
}else if (fr == 5) {
|
||||
tx = (float) (x + Math.tan(j * d + a[1]) * 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));
|
||||
}
|
||||
if (fr == 6) {
|
||||
}else if (fr == 6) {
|
||||
tx = (float) (x + Math.cos(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);
|
||||
@ -171,46 +164,34 @@ public class Engine2 implements Runnable {
|
||||
}
|
||||
if (ar == 2) {
|
||||
grf.setColor(255, (255 - 255 * i / N), 0);
|
||||
}
|
||||
if (ar == 3) {
|
||||
}else if (ar == 3) {
|
||||
grf.setColor(rc, (255 - 255 * i / N), 255);
|
||||
}
|
||||
if (ar == 4) {
|
||||
}else if (ar == 4) {
|
||||
grf.setColor((255 - 255 * i / N), 255, 0);
|
||||
}
|
||||
if (ar == 5) {
|
||||
}else if (ar == 5) {
|
||||
grf.setColor((255 - 255 * i / N), (255 - 255 * i / N), 255);
|
||||
}
|
||||
if (ar == 6) {
|
||||
}else if (ar == 6) {
|
||||
grf.setColor((255 - 255 * i / N), 255, 255);
|
||||
}
|
||||
if (ar == 7) {
|
||||
}else if (ar == 7) {
|
||||
grf.setColor(0, 255, (255 - 255 * i / N));
|
||||
}
|
||||
if (ar == 8) {
|
||||
}else if (ar == 8) {
|
||||
grf.setColor(255, gc, (255 - 255 * i / N));
|
||||
}
|
||||
if (ar == 9) {
|
||||
}else if (ar == 9) {
|
||||
grf.setColor(255, (255 - 255 * i / N), (255 - 255 * i / N));
|
||||
}
|
||||
if (ar == 10) {
|
||||
}else if (ar == 10) {
|
||||
grf.setColor(rc, (255 - 255 * i / N), 0);
|
||||
}
|
||||
if (ar == 11) {
|
||||
}else if (ar == 11) {
|
||||
grf.setColor(255, (255 - 255 * i / N), 255);
|
||||
}
|
||||
if (ar == 12) {
|
||||
}else if (ar == 12) {
|
||||
grf.setColor((255 - 255 * i / N), 0, 255);
|
||||
}
|
||||
if (ar == 13) {
|
||||
}else if (ar == 13) {
|
||||
grf.setColor((255 - 255 * i / N), 255 * i / N, 0);
|
||||
}
|
||||
if (ar == 14) {
|
||||
}else if (ar == 14) {
|
||||
grf.setColor(bc, 255, (255 - 255 * i / N));
|
||||
}
|
||||
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);
|
||||
if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y);
|
||||
else if (T==1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360);
|
||||
else if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y);
|
||||
x = tx;
|
||||
y = ty;
|
||||
}
|
||||
@ -227,7 +208,7 @@ public class Engine2 implements Runnable {
|
||||
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) | Canv.background;
|
||||
pixelArray[io] = (int)(100-K << 24) | Canv.background & 0x00ffffff;
|
||||
}
|
||||
g.drawRGB(pixelArray, 0, w, 0, 0, w, h, true);
|
||||
}
|
||||
|
51
src/FWCashe.java
Normal 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;
|
||||
}
|
||||
}
|
@ -24,7 +24,7 @@ public class FindLyrics {
|
||||
String url = "http://www.lyricsplugin.com/winamp03/plugin/?artist="+urlName(artist)+"&title="+urlName(title);
|
||||
try {
|
||||
byte[] res = send(url);
|
||||
int lr1 = MSG.indexOf("<div id="+'"'+"lyrics"+'"'+">");
|
||||
int lr1 = MSG.indexOf("<div id=\"lyrics\">");
|
||||
int lr2 = MSG.indexOf("</div>", lr1);
|
||||
if((lr2-lr1)>30) {
|
||||
FileConnection fc;
|
||||
@ -47,7 +47,7 @@ public class FindLyrics {
|
||||
String artist = song.substring(0, song.lastIndexOf('-')).trim();
|
||||
String title = song.substring(song.lastIndexOf('-')+1).trim();
|
||||
MSG = "";
|
||||
String url = "http://annimon.z83.ru/nowplaying.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title);
|
||||
String url = "http://annimon.com/seps/seps.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title);
|
||||
try {
|
||||
send(url);
|
||||
} catch (Exception e) {
|
||||
|
@ -1,5 +1,3 @@
|
||||
|
||||
import com.sonyericsson.multimedia.MetaData;
|
||||
import javax.microedition.lcdui.*;
|
||||
|
||||
/*
|
||||
@ -13,45 +11,31 @@ import javax.microedition.lcdui.*;
|
||||
public class FindText extends Form implements CommandListener {
|
||||
|
||||
private Command back, ok;
|
||||
public TextField artist, title;
|
||||
public TextField all_tb;
|
||||
|
||||
public FindText() {
|
||||
public FindText(String all) {
|
||||
super(SEPS.midlet.lang.findtext);
|
||||
back = new Command(SEPS.midlet.lang.back, Command.BACK, 2);
|
||||
ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1);
|
||||
String ar="",ti="";
|
||||
try{
|
||||
MetaData metaData = SEPS.midlet.cnv.media.getMetaData();
|
||||
ti = getValue(metaData, MetaData.TITLE_KEY);
|
||||
ar = getValue(metaData, MetaData.ARTIST_KEY);
|
||||
}catch(Exception ex){}
|
||||
artist = new TextField(SEPS.midlet.lang.artist, ar, 255, TextField.ANY);
|
||||
title = new TextField(SEPS.midlet.lang.title, ti, 255, TextField.ANY);
|
||||
append(artist);
|
||||
append(title);
|
||||
all_tb = new TextField(SEPS.midlet.lang.artist, all, 512, TextField.ANY);
|
||||
append(all_tb);
|
||||
addCommand(ok);
|
||||
addCommand(back);
|
||||
setCommandListener(this);
|
||||
SEPS.midlet.dsp.setCurrent(this);
|
||||
}
|
||||
|
||||
private String getValue(MetaData metaData, String md) {
|
||||
String data = metaData.getValue(md);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
for(int i=0; i<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) {
|
||||
if (c == back) new Menu();
|
||||
if (c == back) SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
|
||||
if (c == ok) {
|
||||
try {
|
||||
FindLyrics fl = new FindLyrics();
|
||||
boolean check = fl.find(artist.getString(), title.getString());//SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
int id = all_tb.getString().indexOf(" - ");
|
||||
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
@ -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);
|
||||
}
|
||||
}
|
@ -33,24 +33,22 @@ public class Info extends Form implements CommandListener {
|
||||
}
|
||||
|
||||
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) {
|
||||
try {
|
||||
String scr = "";
|
||||
if(Rms.id!=0) scr="annimon.z83.ru/seps/"+String.valueOf(Rms.id)+".txt";
|
||||
String url = "http://annimon.z83.ru/";
|
||||
if(url.length()!=22) return;
|
||||
String url = "http://annimon.com/";
|
||||
if(url.length()!=19) return;
|
||||
SEPS.midlet.platformRequest(url);
|
||||
} catch (ConnectionNotFoundException ex) {
|
||||
new Menu();
|
||||
SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
}
|
||||
}
|
||||
if(c==scrob) {
|
||||
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);
|
||||
} catch (ConnectionNotFoundException ex) {
|
||||
new Menu();
|
||||
SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,11 +9,11 @@
|
||||
*/
|
||||
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 sensetivity, textfolder, vibro, skin, visual, origseps, elements,
|
||||
gothic, emo,light, start, stop, flashlight, tooff,
|
||||
statlocal, scrobbling, origjava, circles, uiactivity, listforward;
|
||||
String sensetivity, textfolder, vibro, skin, visual, elements,
|
||||
light, start, stop, flashlight, tooff,
|
||||
statlocal, scrobbling, uiactivity, listforward;
|
||||
|
||||
public Lang(int id) {
|
||||
if(id==0) {
|
||||
@ -22,8 +22,7 @@ public class Lang {
|
||||
exit = "Exit";
|
||||
ok = "Ok";
|
||||
findtext = "Text Search";
|
||||
artist = "Artist";
|
||||
title = "Title";
|
||||
artist = "Artist - Title";
|
||||
textsaving = "Text saved\n";
|
||||
nofound = "Not found\n";
|
||||
site = "Site";
|
||||
@ -36,19 +35,14 @@ public class Lang {
|
||||
sensetivity = "Sensetivity to switch:";
|
||||
textfolder = "Folder with the text:";
|
||||
vibro = "Vibration switch (in ms):";
|
||||
skin = "Skins";
|
||||
skin = "Skin";
|
||||
visual = "Visualization";
|
||||
origseps = "Original SEPS";
|
||||
gothic = "Gothic";
|
||||
emo = "Emo";
|
||||
light = "Backlight";
|
||||
start = "Launch player when program start";
|
||||
stop = "Close player when program exit";
|
||||
flashlight = "Flash backlight";
|
||||
statlocal = "Statistics (need to restart app)";
|
||||
scrobbling = "Scrobbling (annimon.z83.ru)";
|
||||
origjava = "Original Java";
|
||||
circles = "Circles (1.swf)";
|
||||
scrobbling = "Scrobbling (annimon.com)";
|
||||
elements = "Elements: ";
|
||||
tooff = "Time to turn off (in minutes):";
|
||||
uiactivity = "Sync. with ActivityMenu";
|
||||
@ -59,8 +53,7 @@ public class Lang {
|
||||
exit = "Âûõîä";
|
||||
ok = "Ok";
|
||||
findtext = "Ïîèñê òåêñòîâ";
|
||||
artist = "Èñïîëíèòåëü";
|
||||
title = "Çàãîëîâîê";
|
||||
artist = "Èñïîëíèòåëü - Çàãîëîâîê";
|
||||
textsaving = "Òåêñò ñîõðàíåí\n";
|
||||
nofound = "Íå íàéäåíî\n";
|
||||
site = "Íà ñàéò";
|
||||
@ -73,19 +66,14 @@ public class Lang {
|
||||
sensetivity = "×óâñòâèòåëüíîñòü ê ïåðåêëþ÷åíèþ:";
|
||||
textfolder = "Ïàïêà ñ òåêñòàìè:";
|
||||
vibro = "Âèáðàöèÿ ïðè ïåðåêëþ÷åíèè (â ìñ):";
|
||||
skin = "Ñêèíû";
|
||||
skin = "Ñêèí";
|
||||
visual = "Âèçóàëèçàöèè";
|
||||
origseps = "Ñòàíäàðòíûé SEPS";
|
||||
gothic = "Ãîòè÷åñêèé";
|
||||
emo = "Ýìî";
|
||||
light = "Ïîñòîÿííàÿ ïîäñâåòêà";
|
||||
start = "Çàïóñêàòü ïëåéåð ïðè ñòàðòå ïðîãðàììû";
|
||||
stop = "Çàêðûâàòü ïëåéåð ïðè âûõîäå èç ïðîãðàììû";
|
||||
flashlight = "Ìèãàíèå ïîäñâåòêîé";
|
||||
statlocal = "Âåñòè ñòàòèñòèêó (íåîáõîäèì ïåðåçàïóñê)";
|
||||
scrobbling = "Ñêðîááëèíã";
|
||||
origjava = "Ñòàíäàðòíûé Java";
|
||||
circles = "Êðóãè (1.swf)";
|
||||
elements = "Âñåãî ýëåìåíòîâ: ";
|
||||
tooff = "Âðÿìÿ äî âûêëþ÷åíèÿ (â ìèíóòàõ):";
|
||||
uiactivity = "Ñèíõð. ñ Ìåíþ Ñîáûòèé";
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -14,7 +14,7 @@ public class Options extends Form implements CommandListener {
|
||||
|
||||
private Command back,ok;
|
||||
private TextField zw, az, un;
|
||||
private ChoiceGroup skin, vis, cRC, lang;
|
||||
private ChoiceGroup cRC, lang;
|
||||
|
||||
|
||||
public Options() {
|
||||
@ -27,21 +27,16 @@ public class Options extends Form implements CommandListener {
|
||||
// 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);
|
||||
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);
|
||||
appendSkin();
|
||||
StrokeStyle();
|
||||
}
|
||||
|
||||
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)) {
|
||||
new Skin(Rms.skinid = skin.getSelectedIndex());
|
||||
SEPS.midlet.lang = new Lang(Rms.lngid = lang.getSelectedIndex());
|
||||
Rms.visid = vis.getSelectedIndex();
|
||||
if(Rms.visid!=0) SEPS.midlet.cnv.swf = new Capuchin (Rms.visid);
|
||||
Rms.sensetivity=Integer.parseInt(zw.getString());
|
||||
Rms.vibrlen=Integer.parseInt(un.getString());
|
||||
Rms.lrcpath=az.getString();
|
||||
@ -63,17 +58,15 @@ public class Options extends Form implements CommandListener {
|
||||
// P.undo=Integer.parseInt(un.getString());
|
||||
// Editor.isteps = new Image[P.undo];
|
||||
// Editor.ist=0;
|
||||
new Menu();
|
||||
SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
}
|
||||
}
|
||||
|
||||
private void StrokeStyle() {
|
||||
append(lang);
|
||||
append(skin);
|
||||
append(zw);
|
||||
append(az);
|
||||
append(un);
|
||||
append(vis);
|
||||
// append(hp);
|
||||
append(cRC);
|
||||
addCommand(ok);
|
||||
@ -87,14 +80,6 @@ public class Options extends Form implements CommandListener {
|
||||
lang.append("Ðóññêèé", null);
|
||||
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.start, 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(6, Rms.actmenu);
|
||||
cRC.setSelectedIndex(7, Rms.listfw);
|
||||
|
||||
vis.append(SEPS.midlet.lang.origjava, null);
|
||||
vis.append(SEPS.midlet.lang.circles, null);
|
||||
vis.append("Kaleidoscope black (2.swf)", null);
|
||||
vis.append("Laura sb strobe (3.swf)", null);
|
||||
vis.append("Precision red (4.swf)", null);
|
||||
vis.append("Rain (5.swf)", null);
|
||||
vis.append("Power dots (6.swf)", null);
|
||||
// vis.append("Jet (7.swf)", null);
|
||||
// vis.append("Jet (8.swf)", null);
|
||||
vis.setSelectedIndex(Rms.visid, true);
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ public class RateImpl {
|
||||
|
||||
public int numRates; //êîë-âî
|
||||
public Vector rates;
|
||||
private String[] path = {"c:/other", "e:/other", "c:/usb/other", "c:/music"};
|
||||
|
||||
public int update(String song) {
|
||||
int s = rates.size();
|
||||
@ -40,12 +41,15 @@ public class RateImpl {
|
||||
}
|
||||
|
||||
public void open() {
|
||||
FileConnection fc;
|
||||
FileConnection fc = null;
|
||||
rates = new Vector();
|
||||
StringBuffer sb = new StringBuffer();
|
||||
try {
|
||||
fc = (FileConnection) Connector.open("file:///c:/other/SEPS_Rate.txt", Connector.READ);
|
||||
if(!fc.exists()) {fc.close();return;}
|
||||
for(int i=0; i<path.length; i++) {
|
||||
fc = (FileConnection) Connector.open("file:///"+path[i]+"/SEPS_Rate.txt", Connector.READ);
|
||||
if(!fc.exists()) fc.close();
|
||||
else break;
|
||||
}
|
||||
InputStream is = fc.openInputStream();
|
||||
int ch = 0;
|
||||
while ((ch = is.read()) != -1) {
|
||||
@ -91,14 +95,20 @@ public class RateImpl {
|
||||
|
||||
public void save() {
|
||||
FileConnection fc;
|
||||
int i;
|
||||
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();}
|
||||
fc.create();
|
||||
DataOutputStream os = fc.openDataOutputStream();
|
||||
Rate[] s = sortRate();
|
||||
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, SEPS.midlet.lang.elements+l);
|
||||
|
@ -12,7 +12,7 @@ public class Rms {
|
||||
private static RecordStore rmsStore;
|
||||
public static boolean firstStart = true; // ïåðâûé ñòàðò
|
||||
public static int sensetivity = 800;
|
||||
public static int skinid = 0;
|
||||
public static int skinid = 0;//x820000;//0;
|
||||
public static boolean isLyric = true;
|
||||
public static String lrcpath = "c:/music/Lyrics/";
|
||||
public static boolean light = false;
|
||||
|
@ -16,6 +16,7 @@ public class SEPS extends MIDlet {
|
||||
public Display dsp;
|
||||
public Canv cnv;
|
||||
public Lang lang;
|
||||
public Images im;
|
||||
|
||||
public SEPS() {
|
||||
midlet = this;
|
||||
@ -24,12 +25,13 @@ public class SEPS extends MIDlet {
|
||||
public void startApp() {
|
||||
Rms.restoreOptions();
|
||||
lang = new Lang(Rms.lngid);
|
||||
im = new Images();
|
||||
if(Rms.id==0) {
|
||||
Random rnd = new Random();
|
||||
Rms.id = (rnd.nextInt() >>> 1) % 10000000;
|
||||
}
|
||||
new Skin(Rms.skinid);
|
||||
cnv = new Canv();
|
||||
cnv = new Canv(im);
|
||||
dsp = Display.getDisplay(this);
|
||||
dsp.setCurrent(cnv);
|
||||
}
|
||||
|
@ -33,19 +33,23 @@ public class SetSleepMode extends Form implements CommandListener {
|
||||
}
|
||||
|
||||
if (c == ok) {
|
||||
int time = Integer.parseInt(zw.getString());
|
||||
if(time == 0) Rms.slpmode=false;
|
||||
else {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
//òåêóùåå âðåìÿ
|
||||
int ch = cal.get(Calendar.HOUR_OF_DAY);
|
||||
int cm = cal.get(Calendar.MINUTE);
|
||||
//âðåìÿ âûêëþ÷åíèÿ
|
||||
int dh = ch;
|
||||
int dm = cm + Integer.parseInt(zw.getString());
|
||||
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;
|
||||
}
|
||||
SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv);
|
||||
}
|
||||
}
|
||||
|
121
src/Skin.java
@ -10,97 +10,44 @@
|
||||
public class Skin {
|
||||
|
||||
public Skin(int skin) {
|
||||
switch(skin) {
|
||||
case 0: //default
|
||||
setSEPS();
|
||||
break;
|
||||
case 1: //PPM
|
||||
setPPM();
|
||||
break;
|
||||
case 2: //Gothic
|
||||
setGothic();
|
||||
break;
|
||||
case 3: //Emo
|
||||
setEmo();
|
||||
break;
|
||||
case 4: //SEclub
|
||||
setSEclub();
|
||||
break;
|
||||
case 5: //SEclub
|
||||
setaNM();
|
||||
break;
|
||||
if(skin==1) skin = Rms.skinid = 0xFF3477d5;
|
||||
else if(skin==2) skin = Rms.skinid = 0xFF181818;
|
||||
else if(skin==3) skin = Rms.skinid = 0xFFCE6BA6;
|
||||
else if(skin==4) skin = Rms.skinid = 0;
|
||||
else if(skin==5) skin = Rms.skinid = 0xFFFFFF99;
|
||||
Canv.background = 0xFF2F8400;
|
||||
Canv.valuet = 0xFFFFFFFF;
|
||||
if(skin!=0) {
|
||||
Canv.softUp1 = Effects.changeHSV(Canv.background, 2, 0.4352941f);
|
||||
Canv.softUp2 = Effects.changeHSV(Canv.background, 2, 0.19215685f);
|
||||
Canv.softDn1 = Effects.changeHSV(Canv.background, 2, -0.007843137f);
|
||||
Canv.softDn2 = Effects.changeHSV(Canv.background, 2, -0.16862747f);
|
||||
Canv.line = Effects.changeHSV(Canv.background, 0, 22);
|
||||
Canv.line = Effects.changeHSV(Canv.line, 2, 0.21568626f);
|
||||
Canv.text = Effects.changeHSV(Canv.background, 0, 22);
|
||||
Canv.text = Effects.changeHSV(Canv.text, 2, 0.082352936f);
|
||||
Canv.inf = Effects.changeHSV(Canv.background, 2, -0.16078433f);
|
||||
for(int i=0; i<=2; i++) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
private void setSEPS() {
|
||||
Canv.softUp1 = 0xFF242424;
|
||||
Canv.softUp2 = 0x87282828;
|
||||
Canv.softDn1 = 0x87151515;
|
||||
Canv.softDn2 = 0xFF181818;
|
||||
Canv.background = 0x00;
|
||||
Canv.background = skin;
|
||||
}else{
|
||||
Canv.softUp1 = 0xFF57f300;
|
||||
Canv.softUp2 = 0xFF41b500;
|
||||
Canv.softDn1 = 0xFF2e8200;
|
||||
Canv.softDn2 = 0xFF205900;
|
||||
Canv.line = 0x00BB00;
|
||||
Canv.text = 0x009900;
|
||||
Canv.valuet = 0x0000E6;
|
||||
Canv.inf = 0x992235;
|
||||
Canv.inf = 0x215B00;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
25
src/about
@ -1,15 +1,15 @@
|
||||
Sony Ericsson Player Service 5.2
|
||||
Sony Ericsson Player Service 7.0
|
||||
|
||||
Автор: Виктор aNNiMON Мельник
|
||||
Сайт разработчика: http://annimon.z83.ru/
|
||||
Сайт разработчика: http://annimon.com/
|
||||
|
||||
Программа - управление родным плейером для телефонов Sony Ericsson с поддержкой MultimediaService API и датчиком движения.
|
||||
Программа - управление стандартным плейером телефонов Sony Ericsson с поддержкой Multimedia Service API и акселерометром.
|
||||
|
||||
Управление:
|
||||
Влево/Вправо/Движение акселерометром - Переключение песен.
|
||||
Вверх/Вниз - переключение режимов: Всё/Визуализация/Текст.
|
||||
Вверх/Вниз - переключение режимов: Всё/Визуализация.
|
||||
1 - Горячая клавиша поиска текста.
|
||||
3 - установить начало/конец отрезка или отключить повтор.
|
||||
3 - установить начало/конец отрезка для повтора или отключить повтор.
|
||||
4/6 - Перемотка назад/вперед.
|
||||
5/Огонь - Пауза.
|
||||
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
|
||||
- Добавлен пункт в настройках, при котором переключение треков будет идти только вперед, независимо от направления рывка.
|
||||
- Поддержка русской кодировки в именах файлов.
|
||||
|
276
src/mobscrob/scrobbler/AudioScrobbler.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
79
src/mobscrob/scrobbler/ByteUtil.java
Normal 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] = '+';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
192
src/mobscrob/scrobbler/HTTPUtil.java
Normal 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); }
|
||||
}
|
||||
}
|
||||
}
|
648
src/mobscrob/scrobbler/MD5.java
Normal 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;
|
||||
}
|
||||
}
|
@ -1,2 +1,2 @@
|
||||
aNNiMON, Ну Вот юин эсприта, основной плагмэйкер... 2542902 Вот LocID
|
||||
//SE сфотошопить + aNNiMOON
|
||||
визуализация смены громкости
|
||||
Быстрая перемотка
|
BIN
src/res/album.png
Normal file
After Width: | Height: | Size: 751 B |
BIN
src/res/artist.png
Normal file
After Width: | Height: | Size: 587 B |
BIN
src/res/exit.png
Normal file
After Width: | Height: | Size: 548 B |
BIN
src/res/pal.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/res/pound.png
Normal file
After Width: | Height: | Size: 930 B |
BIN
src/res/sb.png
Normal file
After Width: | Height: | Size: 100 B |
BIN
src/res/sbl.png
Normal file
After Width: | Height: | Size: 231 B |
BIN
src/res/star.png
Normal file
After Width: | Height: | Size: 185 B |
BIN
src/res/t.png
Normal file
After Width: | Height: | Size: 132 B |
BIN
src/res/tl.png
Normal file
After Width: | Height: | Size: 252 B |
BIN
src/res/track.png
Normal file
After Width: | Height: | Size: 803 B |
BIN
src/res/zero.png
Normal file
After Width: | Height: | Size: 504 B |