This commit is contained in:
Victor 2018-11-14 22:44:45 +02:00
commit 594b336d46
46 changed files with 1876 additions and 0 deletions

83
build.xml Normal file
View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<project name="TimeSpeaker" default="jar" basedir=".">
<description>Builds, tests, and runs the project .</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
pre-init: called before initialization of project properties
post-init: called after initialization of project properties
pre-preprocess: called before text preprocessing of sources
post-preprocess: called after text preprocessing of sources
pre-compile: called before source compilation
post-compile: called after source compilation
pre-obfuscate: called before obfuscation
post-obfuscate: called after obfuscation
pre-preverify: called before preverification
post-preverify: called after preverification
pre-jar: called before jar building
post-jar: called after jar building
pre-build: called before final distribution building
post-build: called after final distribution building
pre-clean: called before cleaning build products
post-clean: called after cleaning build products
Example of pluging a my-special-task after the compilation could look like
<target name="post-compile">
<my-special-task>
<fileset dir="${build.classes.dir}"/>
</my-special-task>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Other way how to customize the build is by overriding existing main targets.
The target of interest are:
preprocess: preprocessing
extract-libs: extraction of libraries and resources
compile: compilation
create-jad: construction of jad and jar manifest source
obfuscate: obfuscation
preverify: preverification
jar: jar archive building
run: execution
debug: execution in debug mode
build: building of the final distribution
javadoc: javadoc generation
Example of overriding the target for project execution could look like
<target name="run" depends="init,jar">
<my-special-exec jadfile="${dist.dir}/${dist.jad}"/>
</target>
Be careful about correct dependencies when overriding original target.
Again, for list of available properties which you can use check the target
you are overriding in nbproject/build-impl.xml file.
A special target for-all-configs can be used to run some specific targets for
all project configurations in a sequence. File nbproject/build-impl.xml
already contains some "for-all" targets:
jar-all
javadoc-all
clean-all
Example of definition of target iterating over all project configurations:
<target name="jar-all">
<property name="target.to.call" value="jar"/>
<antcall target="for-all-configs"/>
</target>
-->
</project>

1247
nbproject/build-impl.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
build.xml.data.CRC32=83c2feaf
build.xml.script.CRC32=5f3bfc00
build.xml.stylesheet.CRC32=9c6a911d
nbproject/build-impl.xml.data.CRC32=83c2feaf
nbproject/build-impl.xml.script.CRC32=fbedd971
nbproject/build-impl.xml.stylesheet.CRC32=e46c2d22

View File

@ -0,0 +1,7 @@
#Mon, 30 Apr 2012 02:28:02 +0300
app-version.autoincrement=true
config.active=
deployment.counter=7
deployment.number=0.0.6
javadoc.preview=true
netbeans.user=C\:\\Users\\aNNiMON\\.netbeans\\7.1

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
</project-private>

View File

@ -0,0 +1,106 @@
abilities=MMAPI=1.1,SATSAJCRMI=1.0,SATSACRYPTO=1.0,JSR82=1.1,NOKIAUI=1.0,JSR226=1.0,capuchin=1.0,MIDP=2.1,JSR229=1.1.0,SATSAAPDU=1.0,CLDC=1.1,JSR177=1.0,JSR179=1.0.1,eSWT=1.1,J2MEWS=1.0,VSCL=2.1,WMA=2.0,JSR172=1.0,JSR256=1.1,SEMC_EXT_JP8=1.0,ColorScreen,NokiaUI=1.0,OBEX=1.0,JSR238=1.0,JSR239=1.0,JSR211=1.0,JSR234=1.0,ScreenWidth=240,MascotV3=1.0,JSR75=1.0,IAPInfo=1.0,SATSAPKI=1.0,JSR184=1.1,ScreenHeight=321,ScreenColorDepth=8,JSR180=1.0.1,J2MEXMLRPC=1.0,
all.configurations=\
application.args=
application.description=
application.description.detail=
application.name=
application.vendor=Vendor
build.classes.dir=${build.dir}/compiled
build.classes.excludes=**/*.java,**/*.form,**/*.class,**/.nbintdb,**/*.mvd,**/*.wsclient,**/*.vmd
build.dir=build/${config.active}
build.root.dir=build
debug.level=debug
debugger.timeout=
deployment.copy.target=deploy
deployment.instance=default
deployment.jarurl=${dist.jar}
deployment.method=NONE
deployment.override.jarurl=false
dist.dir=dist/${config.active}
dist.jad=TimeSpeaker.jad
dist.jar=TimeSpeaker.jar
dist.javadoc.dir=${dist.dir}/doc
dist.root.dir=dist
extra.classpath=
file.reference.TimeSpeaker-res=res
filter.exclude.tests=false
filter.excludes=
filter.more.excludes=**/overview.html,**/package.html
filter.use.standard=true
jar.compress=true
javac.debug=true
javac.deprecation=false
javac.encoding=UTF-8
javac.optimize=false
javac.source=1.3
javac.target=1.3
javadoc.author=false
javadoc.encoding=
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
libs.classpath=${file.reference.TimeSpeaker-res}
main.class=
main.class.class=applet
manifest.apipermissions=
manifest.file=manifest.mf
manifest.is.liblet=false
manifest.jad=
manifest.manifest=
manifest.midlets=MIDlet-1: TimeSpeaker, , Main\n
manifest.others=MIDlet-Vendor: Vendor\nMIDlet-Name: TimeSpeaker\nMIDlet-Version: 1.0\n
manifest.pushregistry=
name=TimeSpeaker
no.dependencies=false
nokiaS80.application.icon=
obfuscated.classes.dir=${build.dir}/obfuscated
obfuscation.custom=@E:\\SETUPS\\Disk\\Programming\\Java\\annimon.pro
obfuscation.level=1
obfuscator.destjar=${build.dir}/obfuscated.jar
obfuscator.srcjar=${build.dir}/before-obfuscation.jar
platform.active=Sony_Ericsson_SDK_2_5_0_6_for_the_Java_TM__ME_Platform_Emulator_
platform.active.description=Sony Ericsson SDK 2.5.0.6 for the Java(TM) ME Platform(Emulator)
platform.apis=WMA-2.0,JSR211-1.0,JSR82-1.1,JSR177-1.0,JSR234-1.0,SATSA-APDU-1.0,capuchin-1.0,J2ME-WS-1.0,J2ME-XMLRPC-1.0,SATSA-JCRMI-1.0,SATSA-CRYPTO-1.0,JSR239-1.0,MascotV3-1.0,JSR238-1.0,MMAPI-1.1,JSR256-1.1,NokiaUI-1.0,IAPInfo-1.0,JSR229-1.1.0,SATSA-PKI-1.0,JSR180-1.0.1,JSR226-1.0,SEMC_EXT_JP8-1.0,VSCL-2.0,VSCL-2.1,eSWT-1.1,JSR75-1.0,JSR184-1.1,JSR179-1.0.1
platform.bootclasspath=${platform.home}/lib/eswt.jar:${platform.home}/lib/mascotv3.jar:${platform.home}/lib/jsr226.jar:${platform.home}/lib/jsr256.jar:${platform.home}/lib/satsa-crypto.jar:${platform.home}/lib/jsr229.jar:${platform.home}/lib/jsr238.jar:${platform.home}/lib/j2me-xmlrpc.jar:${platform.home}/lib/jsr211.jar:${platform.home}/lib/vscl21.jar:${platform.home}/lib/satsa-jcrmi.jar:${platform.home}/lib/jsr082.jar:${platform.home}/lib/satsa-apdu.jar:${platform.home}/lib/jsr184.jar:${platform.home}/lib/nokiaext.jar:${platform.home}/lib/capuchin.jar:${platform.home}/lib/jsr239.jar:${platform.home}/lib/jsr75.jar:${platform.home}/lib/satsa-pki.jar:${platform.home}/lib/jsr179.jar:${platform.home}/lib/jsr180.jar:${platform.home}/lib/iapinfo.jar:${platform.home}/lib/vscl.jar:${platform.home}/lib/mmapi.jar:${platform.home}/lib/j2me-ws.jar:${platform.home}/lib/wma20.jar:${platform.home}/lib/jsr234.jar:${platform.home}/lib/semc_ext_jp8.jar:${platform.home}/lib/cldcapi10.jar:${platform.home}/lib/midpapi20.jar
platform.configuration=CLDC-1.0
platform.device=SonyEricsson_JP8_240x320_Emu
platform.fat.jar=true
platform.profile=MIDP-2.0
platform.trigger=CLDC
platform.type=UEI-1.0.1
preprocessed.dir=${build.dir}/preprocessed
preverify.classes.dir=${build.dir}/preverified
preverify.sources.dir=${build.dir}/preverifysrc
resources.dir=resources
run.cmd.options=
run.jvmargs=
run.method=STANDARD
run.security.domain=trusted
run.use.security.domain=false
savaje.application.icon=
savaje.application.icon.focused=
savaje.application.icon.small=
savaje.application.uid=TBD
savaje.bundle.base=
savaje.bundle.debug=false
savaje.bundle.debug.port=
semc.application.caps=
semc.application.icon=
semc.application.icon.count=
semc.application.icon.splash=
semc.application.icon.splash.installonly=false
semc.application.uid=E7748318
semc.certificate.path=
semc.private.key.password=
semc.private.key.path=
sign.alias=
sign.enabled=false
sign.keystore=
src.dir=src
use.emptyapis=true
use.preprocessor=true

10
nbproject/project.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.kjava.j2meproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2me-project">
<name>TimeSpeaker</name>
<minimum-ant-version>1.6</minimum-ant-version>
</data>
</configuration>
</project>

BIN
res/font.ppf Normal file

Binary file not shown.

BIN
res/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

BIN
res/res/1.mp3 Normal file

Binary file not shown.

BIN
res/res/10.mp3 Normal file

Binary file not shown.

BIN
res/res/11.mp3 Normal file

Binary file not shown.

BIN
res/res/12.mp3 Normal file

Binary file not shown.

BIN
res/res/13.mp3 Normal file

Binary file not shown.

BIN
res/res/14.mp3 Normal file

Binary file not shown.

BIN
res/res/15.mp3 Normal file

Binary file not shown.

BIN
res/res/16.mp3 Normal file

Binary file not shown.

BIN
res/res/17.mp3 Normal file

Binary file not shown.

BIN
res/res/18.mp3 Normal file

Binary file not shown.

BIN
res/res/19.mp3 Normal file

Binary file not shown.

BIN
res/res/1a.mp3 Normal file

Binary file not shown.

BIN
res/res/2.mp3 Normal file

Binary file not shown.

BIN
res/res/20.mp3 Normal file

Binary file not shown.

BIN
res/res/2a.mp3 Normal file

Binary file not shown.

BIN
res/res/3.mp3 Normal file

Binary file not shown.

BIN
res/res/30.mp3 Normal file

Binary file not shown.

BIN
res/res/4.mp3 Normal file

Binary file not shown.

BIN
res/res/40.mp3 Normal file

Binary file not shown.

BIN
res/res/5.mp3 Normal file

Binary file not shown.

BIN
res/res/50.mp3 Normal file

Binary file not shown.

BIN
res/res/6.mp3 Normal file

Binary file not shown.

BIN
res/res/7.mp3 Normal file

Binary file not shown.

BIN
res/res/8.mp3 Normal file

Binary file not shown.

BIN
res/res/9.mp3 Normal file

Binary file not shown.

BIN
res/res/hour1.mp3 Normal file

Binary file not shown.

BIN
res/res/hour2.mp3 Normal file

Binary file not shown.

BIN
res/res/hour3.mp3 Normal file

Binary file not shown.

BIN
res/res/minute1.mp3 Normal file

Binary file not shown.

BIN
res/res/minute2.mp3 Normal file

Binary file not shown.

BIN
res/res/minute3.mp3 Normal file

Binary file not shown.

33
src/Main.java Normal file
View File

@ -0,0 +1,33 @@
/*
* aNNiMON 2012
* For more info visit http://annimon.com/
*/
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
/**
* @author aNNiMON
*/
public class Main extends MIDlet {
public Display dsp;
public static Main midlet;
private TimeCanvas canv;
public Main() {
midlet = Main.this;
dsp = Display.getDisplay(Main.this);
canv = new TimeCanvas();
}
public void startApp() {
dsp.setCurrent(canv);
}
public void pauseApp() {}
public void destroyApp(boolean ex) {
notifyDestroyed();
}
}

52
src/Sound.java Normal file
View File

@ -0,0 +1,52 @@
import java.io.InputStream;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
/*
* aNNiMON 2012
* For more info visit http://annimon.com/
*/
/**
*
* @author aNNiMON
*/
public class Sound implements PlayerListener {
private Player plr;
private String[] soundsToPlay;
private int current;
public Sound(String[] soundsToPlay) {
this.soundsToPlay = soundsToPlay;
current = 0;
plr = null;
}
public void speak() {
if (plr != null) {
plr.close();
}
try {
System.out.println(soundsToPlay[current]);
InputStream is = getClass().getResourceAsStream("/res/"+soundsToPlay[current]+".mp3");
plr = Manager.createPlayer(is, "audio/mpeg");
plr.realize();
plr.prefetch();
plr.addPlayerListener(this);
plr.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void playerUpdate(Player player, String event, Object eventData) {
if (event.equals(PlayerListener.END_OF_MEDIA)) {
current++;
if (current < soundsToPlay.length) speak();
else Main.midlet.destroyApp(true);
}
}
}

43
src/TimeCanvas.java Normal file
View File

@ -0,0 +1,43 @@
/*
* aNNiMON 2012
* For more info visit http://annimon.com/
*/
import com.annimon.ppf.PPFont;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
/**
* @author aNNiMON
*/
public class TimeCanvas extends Canvas {
private int w, h;
private int fontWidth, fontHeight;
private PPFont font;
private Sound sound;
private String time;
public TimeCanvas() {
setFullScreenMode(true);
w = getWidth();
h = getHeight();
time = TimeUtil.getTime();
font = new PPFont("/font.ppf");
fontWidth = font.getTextWidth(time);
fontHeight = font.getFontHeight(true);
String[] names = TimeUtil.getStringsToSpeak();
sound = new Sound(names);
sound.speak();
}
public void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, w, h);
font.drawText(g, w/2-fontWidth/2, h/2-fontHeight/2, time);
}
}

110
src/TimeUtil.java Normal file
View File

@ -0,0 +1,110 @@
import java.util.Calendar;
import java.util.Vector;
/*
* aNNiMON 2012
* For more info visit http://annimon.com/
*/
/**
*
* @author aNNiMON
*/
public class TimeUtil {
private static final int[] NORMAL_1_TO_20 = {
12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
};
private static final int[] NAMES_TEN = {
10, 20, 30, 40, 50
};
private static final String[] NAMES_1_2 = {
"1a", "2a"
};
private static final String[] NAMES_HOUR = {
"hour1", "hour2", "hour3"
};
private static final String[] NAMES_MINUTE = {
"minute1", "minute2", "minute3"
};
/**
* Получить время
* @return строка с временем вида: HH:MM
*/
public static String getTime() {
StringBuffer sb = new StringBuffer();
Calendar cal = Calendar.getInstance();
// Час
int 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();
}
public static String[] getStringsToSpeak() {
Vector audioNames = new Vector();
Calendar cal = Calendar.getInstance();
// Час
int hour = cal.get(Calendar.HOUR_OF_DAY);
appendHourString(audioNames, hour);
// Минута
int minute = cal.get(Calendar.MINUTE);
appendMinuteString(audioNames, minute);
String[] out = new String[audioNames.size()];
audioNames.copyInto(out);
return out;
}
private static void appendHourString(Vector audioNames, int hour) {
int minHour = Math.min(hour, 20);
audioNames.addElement(String.valueOf(NORMAL_1_TO_20[minHour])); // 0..20
if (hour > 20) audioNames.addElement(String.valueOf(NORMAL_1_TO_20[hour % 20])); //21..23
// Час
if ( (hour == 1) || (hour == 21) ) audioNames.addElement(NAMES_HOUR[0]);
else if ( ((1 < hour) && (hour <= 4)) || ((21 < hour) && (hour <= 23)) ) audioNames.addElement(NAMES_HOUR[1]);
else audioNames.addElement(NAMES_HOUR[2]);
}
private static void appendMinuteString(Vector audioNames, int minute) {
// Ноль минут нет
if (minute == 0) return;
// От пяти до двадцати одинаково
if ((5 <= minute) && (minute <= 20) ) {
audioNames.addElement(String.valueOf(NORMAL_1_TO_20[minute]));
audioNames.addElement(NAMES_MINUTE[0]);
return;
}
// Десятки минут
int tenMinute = minute / 10;
if (tenMinute != 0) audioNames.addElement(String.valueOf(NAMES_TEN[tenMinute - 1]));
int modMinute = minute % 10;
// Одна минута / две минуты
if ( (modMinute == 1) || (modMinute == 2)) {
audioNames.addElement(NAMES_1_2[modMinute - 1]);
audioNames.addElement(NAMES_MINUTE[modMinute]);
return;
}
// без десятков
if (modMinute != 0) audioNames.addElement(String.valueOf(NORMAL_1_TO_20[modMinute]));
// x2, x3, x4 минуты
if ( (2 <= modMinute) && (modMinute <= 4) ) audioNames.addElement(NAMES_MINUTE[2]);
else audioNames.addElement(NAMES_MINUTE[0]); // минут
}
}

View File

@ -0,0 +1,18 @@
/*
* aNNiMON 2011
* For more info visit http://annimon.com/
*/
package com.annimon.ppf;
import javax.microedition.lcdui.Image;
/**
*
* @author aNNiMON
*/
public class Char {
public Image charImage;
short x, y, xx;
}

View File

@ -0,0 +1,155 @@
/*
* aNNiMON 2011
* For more info visit http://annimon.com/
*/
package com.annimon.ppf;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
*
* @author aNNiMON
*/
public class PPFont {
public Hashtable ht;
public boolean isModificated;
private String fontName;
private short fontHeight;
private short startIndex, endIndex;
private char[] charTable;
private int textcolor;
/**
* Конструктор класса
* @param path - путь к ppf-шрифту
*/
public PPFont(String path) {
try {
InputStream is = getClass().getResourceAsStream(path);
DataInputStream dis = new DataInputStream(is);
//Проверка сигнатуры
if (dis.readInt() != 0x50504600) return;
fontName = dis.readUTF();//Название шрифта
fontHeight = dis.readShort();//размер шрифта
startIndex = dis.readShort();//начальный символ
endIndex = dis.readShort();//конечный символ
charTable = new char[endIndex-startIndex+1];
ht = new Hashtable(charTable.length);
for (int i = startIndex; i <= endIndex; i++) {
//Создаем объект для хранения данных
Char co = new Char();
//Читаем символ
char t = charTable[i-startIndex] = dis.readChar();
Character ch = new Character(t);
//Размеры символа и позиции
short width = dis.readShort();
short height = dis.readShort();
short x = dis.readShort();
short y = dis.readShort();
short xx = dis.readShort();//m.getAdvanceX()
int[] rgb = new int[width*height];
for (int j = 0; j < rgb.length; j++) {
rgb[j] = dis.readBoolean() ? 0xFF000000 : 0;//если true - цвет чёрный
}
//Записываем переменные в объект
co.charImage = Image.createRGBImage(rgb, width, height, true);
co.x = x;
co.y = y;
co.xx = xx;
ht.put(ch, co);
}
dis.close();
textcolor = 0xFF000000;
isModificated = false;
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* Изменить цвет шрифта
* @param newcolor - новый цвет
*/
public void setColor(int newcolor) {
if(newcolor==textcolor || isModificated) return;//предотвращение повторной установки цвета
if(newcolor==0) newcolor=0x10;//предотвращение установки цвета фона
for (int i = startIndex; i <= endIndex; i++) {
Character o = new Character(charTable[i-startIndex]);
//Получаем объект Char
Char co = (Char) ht.get(o);
Image charImage = co.charImage;
int width = charImage.getWidth();
int height = charImage.getHeight();
int length = width * height;
int[] rgb = new int[length];
charImage.getRGB(rgb, 0, width, 0, 0, width, height);
for (int pos = 0; pos < length; pos++) {
if (rgb[pos] != 0) {
rgb[pos] = newcolor;
}
}
//Записываем переменные в объект
co.charImage = Image.createRGBImage(rgb, width, height, true);
ht.put(o, co);
}
textcolor = newcolor;
}
/**
* Отрисовка текста
* @param g - Graphics
* @param x - x-координата левого верхнего угла
* @param y - y-координата левого верхнего угла
* @param s - текст
* @return - ширина строки
*/
public int drawText(Graphics g, int x, int y, String s) {
int wdh = 0;
int length = s.length();
int temp = (fontHeight*3)/4;
for (int i = 0; i < length; i++) {
Char co = (Char) ht.get(new Character(s.charAt(i)));
if (co != null && co.charImage != null) {
if(g!=null) g.drawImage(co.charImage, x + co.x + wdh, y + co.y + temp, 20);
wdh += co.xx;
}
}
return wdh;
}
/**
* Ширина строки
* @param s - текст
* @return - ширина строки s
*/
public int getTextWidth(String s) {
return drawText(null, 0, 0, s);
}
/**
* Высота шрифта
* @param absolute - true - высота шрифта, false - высота букв
* @return высота шрифта/букв
*/
public short getFontHeight(boolean absolute) {
return (short) (absolute ? fontHeight : (fontHeight * 3) / 4);
}
/**
* Получение названия шрифта
* @return - имя шрифта
*/
public String getFontName() {
return fontName;
}
}