вторник мар. 24, 2009

Кога завршува часот?

Дали ви се има случено во средно училиште професорот/професорката да гњави долго време и во еден момент сакате да знаете уште колку минути има до крајот на часот, а не знаете кога завршува часот? Епа кога јас бе средно мобилни не постоеја (или беа многу скапи) а и тогаш немаа Јава поддршка. А арно ама сега имаат, па си реков малку да допринесам за нашава младина, а и да пробам да напишам Ј2МЕ за прв пат во животот, и на крај излезе оваа програма.Идејата ми беше да не мора да гледаш колку е саатот, па да се мислиш кој час е по ред тековниот, па да земеш табличка со распоред на времиња и тн. Апликацијата има една опција "Овој час" која што ти пресметува точно време кога завршува тековниот час без да специфицираш кој час е тоа. Мислам дека тоа е многу корисно, поправете ме ако грешам. Има две компајлирани верзии, во кодот и можностите се комплетно исти, само некој телефони поддржуваат MIDP 2.1, а некој мора да се стави верзија компајлирана за MIDP 2.0. Во секој случај програмата е тука: MIDP 2.1: Jar Jad , MIDP 2.0: Jar Jad За некои телефони е потребно да се стави и дескрипторот .jad фајлот. Слободно дистрибуирајте, копирајте и споделувајте, ќе го ставам и кодот само малку да го потсредам со коментари, не ми е за пред луѓе во моментов. Гарантирам дека нема никакви делови за снифање или читање на лични податоци од мобилниот телефон. Еве неколку скриншотови:

 

 

 

И како што ветив, еве го кодот:

 package com.ilija;

import java.util.Date;
import javax.microedition.lcdui.

Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.MIDlet;
import javax.microedition.rms.RecordStore;

public class Konfigurator extends MIDlet implements CommandListener {

    private Display display;     // The display for this MIDlet
    private TextBox editScreen;
    private List list;
    private Command edit,  select,  exit;
    private Alert alert;
    private RecordStore record;
    private Command saveChanges,  cancelChanges;
    static final String REC_STORE = "CASOVI";

    public Konfigurator() {
        display = Display.getDisplay(this);
        editScreen = new TextBox("Време на завршување на часот", null, 5, 0);
        list = new List("School. By Ilija Trajkoski", Choice.EXCLUSIVE);
        edit = new Command("Измени", Command.SCREEN, 1);
        select = new Command("Прикажи", Command.BACK, 0);
        exit = new Command("Излез", Command.EXIT, 2);
        saveChanges = new Command("Сними", Command.SCREEN, 0);
        cancelChanges = new Command("Назад", Command.BACK, 0);
        editScreen.addCommand(saveChanges);
        editScreen.addCommand(cancelChanges);
        editScreen.setCommandListener(this);
    }

    public void startApp() {
        list.append("Овој час", null);
        list.append("Прв час-смена 1", null);
        list.append("Втор час-смена 1", null);
        list.append("Трет час-смена 1", null);
        list.append("Четврти час-смена 1", null);
        list.append("Петти час-смена 1", null);
        list.append("Шести час-смена 1", null);
        list.append("Седми час-смена 1", null);
        list.append("Прв час-смена 2", null);
        list.append("Втор час-смена 2", null);
        list.append("Трет час-смена 2", null);
        list.append("Четврти час-смена 2", null);
        list.append("Петти час-смена 2", null);
        list.append("Шести час-смена 2", null);
        list.append("Седми час-смена 2", null);
        list.addCommand(edit);
        list.addCommand(select);
        list.addCommand(exit);
        list.setCommandListener(this);
        display.setCurrent(list);
        initializeStore();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable s) {
        int index = list.getSelectedIndex();
        if (c == list.SELECT_COMMAND || c == select) {
            int cas = index;
            if (index > 7) {
                cas = cas - 7;
            }
            
            long currentTime = System.currentTimeMillis();
            long currentMinutes = ((currentTime / 1000) / 60) % 60;
            long currentHour = (((currentTime / 1000) / 60) / 60) % 24 + 1;

            String currentMinutesStr = currentMinutes + "";
            if (currentMinutes < 10) {
                currentMinutesStr = "0" + currentMinutesStr;
            }
            String currentHourStr = currentHour + "";
            if (currentHour < 10) {
                currentHourStr = "0" + currentHourStr;
            }
            if (index > 0) {
                openStore();
                String time = readRecord(index);
                String timeToEnd = calculateTimeToEnd(time, currentHour, currentMinutes);
                closeStore();
                alert = new Alert("Време", "До крајот на часот број " + cas + " има уште: " + timeToEnd + ", часот завршува во " + time + " сега е " + currentHourStr + ":" + currentMinutesStr, null, AlertType.INFO);
            } else {
                String time = findEndTime(currentHour, currentMinutes);
                String timeToEnd = calculateTimeToEnd(time, currentHour, currentMinutes);
                alert = new Alert("Време", "До крајот на часот има уште: " + timeToEnd + ", часот завршува во " + time + " сега е " + currentHourStr + ":" + currentMinutesStr, null, AlertType.INFO);
            }
            alert.setTimeout(10000);
            display.setCurrent(alert);
        }
        if (index > 0) {
            if (c == edit) {
                openStore();
                editScreen.setString(readRecord(index));
                closeStore();
                display.setCurrent(editScreen);
            }
            if (c == exit) {
                destroyApp(false);
                notifyDestroyed();
            }
            if (c == cancelChanges) {
                display.setCurrent(list);
            }
            if (c == saveChanges) {
                openStore();
                String time = editScreen.getString();
                updateRecord(time, index);
                closeStore();
            }
        }
    }

    public void openStore() {
        try {
            record = RecordStore.openRecordStore(REC_STORE, true);
        } catch (Exception e) {
        }
    }

    public void closeStore() {
        try {
            record.closeRecordStore();
        } catch (Exception e) {
        }
    }

    public void writeRecord(String str) {
        byte[] rec = str.getBytes();
        try {
            int index = record.addRecord(rec, 0, rec.length);
        } catch (Exception e) {
        }
    }

    private String readRecord(int index) {
        String result = "";
        try {
            if (record.getNumRecords() > 0) {
                result = new String(record.getRecord(index));
            }
        } catch (Exception e) {
        }
        return result;
    }

    private void updateRecord(String str, int index) {
        try {
            byte[] rec = str.getBytes();
            record.setRecord(index, rec, 0, rec.length);
        } catch (Exception e) {
        }

    }

    private void initializeStore() {
        openStore();
        try {
            if (record.getNumRecords() <= 0) {
                writeRecord("08:00");
                writeRecord("08:50");
                writeRecord("09:50");
                writeRecord("10:45");
                writeRecord("11:40");
                writeRecord("12:30");
                writeRecord("13:20");
                writeRecord("14:15");
                writeRecord("15:05");
                writeRecord("16:05");
                writeRecord("17:00");
                writeRecord("17:50");
                writeRecord("18:40");
                writeRecord("19:35");
            }
        } catch (Exception e) {
        }
        closeStore();
    }

    private String calculateTimeToEnd(String endTime, long hours, long minutes) {
        String result = "";
        long hourDiff = 0;
        long minuteDiff = 0;
        try {
            String parsedHour = endTime.substring(0, 2);
            String parsedMinutes = endTime.substring(3, 5);
            Long storeHour = new Long(0);
            long shour = storeHour.parseLong(parsedHour);
            Long storeMinutes = new Long(0);
            long sminute = storeMinutes.parseLong(parsedMinutes);
            hourDiff = shour - hours;
            minuteDiff = sminute - minutes;
            if (minuteDiff < 0) {
                if (hourDiff > 0) {
                    hourDiff--;
                    minuteDiff = 60 + minuteDiff;
                }
            }
        } catch (Exception e) {
            result = "Грешка во есапот, провери ги времињата на часовите";
            return result;
        }
        if (hourDiff < 0 || minuteDiff < 0) {
            result = "ич, часот е поминат";
        } else {
            if (hourDiff > 0) {
                result = hourDiff + " часа и ";

            }
            if (minuteDiff >= 0) {
                result += minuteDiff + " минути";
            }
        }
        return result;
    }

    private String findEndTime(long hours, long minutes) {
        String result = "08:00";
        long hourDiff = 0;
        long minuteDiff = 0;
        openStore();
        for (int i = 14; i > 0; i--) {
            String endTime = readRecord(i);
            String parsedHour = endTime.substring(0, 2);
            String parsedMinutes = endTime.substring(3, 5);
            Long storeHour = new Long(0);
            long shour = storeHour.parseLong(parsedHour);
            Long storeMinutes = new Long(0);
            long sminute = storeMinutes.parseLong(parsedMinutes);
            hourDiff = shour - hours;
            minuteDiff = sminute - minutes;
            if (minuteDiff < 0) {
                if (hourDiff > 0) {
                    hourDiff--;
                    minuteDiff = 60 + minuteDiff;
                }
            }
            if (hourDiff < 0 || minuteDiff < 0) {
                if(i<14){
                result = readRecord(i+1);
                }else{
                   result = readRecord(i);
                }
                break;
            }
        }
        closeStore();
        return result;
    }
}