diff --git a/README.md b/README.md index d10ec38..ee6cac1 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ You can change path to playlist and music files by "Playlist directory" preferen ## TODO - implement music player as Service to play long time +- change webview into photo view, movie player... - Design for tablets - support HVGA, WVGA, WVGA+ resolution -- http://developer.android.com/resources/dashboard/screens.html @@ -60,28 +61,25 @@ You can change path to playlist and music files by "Playlist directory" preferen -- scale of web contents - localize: French, Chinese - add mode to display alert dialog if device is not charged when alarm is set +- improve UI to edit playlist - refactor class design, activity, player and playlist - show notification while playing music - fix UI update bug when sleep timer expires (broadcast -> activity) -- remove duplicate time from list which is specified by voice - conditional playlist -- Sunday, holiday playlist etc... - make COOL widget to set alarm (make clock widget?) -- improve UI to edit playlist - add more test cases -- double touch of webview -- label text is updated when music is stopped or alarm is canceled -- check default config value --- test landscape mode - fix vibrator timing -- fix bug when native player is used.... -- change webview into photo view, movie player... - add source of malarm_test into this repository - refactor code to clear browser history - support podcast - use Actionbar ? - record wakeup time? - support shuffle? +- fix bug when native player is used.... ## Appendix ### How To Build From Command Line diff --git a/src/com/mamewo/malarm24/MalarmActivity.java b/src/com/mamewo/malarm24/MalarmActivity.java index deb9f89..8247175 100644 --- a/src/com/mamewo/malarm24/MalarmActivity.java +++ b/src/com/mamewo/malarm24/MalarmActivity.java @@ -13,7 +13,10 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; @@ -896,15 +899,17 @@ public TimePickerTime(int hour, int min, String speach) { } } - private class ClickListener implements DialogInterface.OnClickListener { - private ArrayList mTimeList; + private class ClickListener + implements DialogInterface.OnClickListener + { + private TimePickerTime[] mTimeList; - public ClickListener(ArrayList time) { + public ClickListener(TimePickerTime[] time) { mTimeList = time; } @Override public void onClick(DialogInterface dialog, int which) { - setTimePickerTime(mTimeList.get(which)); + setTimePickerTime(mTimeList[which]); } } @@ -921,9 +926,10 @@ private void setTimePickerTime(TimePickerTime time) { protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); - ArrayList result = new ArrayList(); - for (String speach : matches) { - Matcher m = TIME_PATTERN.matcher(speach); + //ArrayList result = new ArrayList(); + Map result = new HashMap(); + for (String speech : matches) { + Matcher m = TIME_PATTERN.matcher(speech); if (m.matches()) { int hour = Integer.valueOf(m.group(1)) % 24; int minute; @@ -937,10 +943,13 @@ else if ("半".equals(min_part)) { else { minute = Integer.valueOf(m.group(3)) % 60; } - result.add(new TimePickerTime(hour, minute, speach)); + String key = hour + ":" + minute; + if(! result.containsKey(key)){ + result.put(key, new TimePickerTime(hour, minute, speech)); + } } else { - Matcher m2 = AFTER_TIME_PATTERN.matcher(speach); + Matcher m2 = AFTER_TIME_PATTERN.matcher(speech); if (m2.matches()) { final String hour_part = m2.group(2); final String min_part = m2.group(3); @@ -962,8 +971,12 @@ else if ("半".equals(min_part)) { } final Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(System.currentTimeMillis() + after_millis); - result.add(new TimePickerTime(cal.get(Calendar.HOUR_OF_DAY), - cal.get(Calendar.MINUTE), speach)); + int hour = cal.get(Calendar.HOUR_OF_DAY); + int min = cal.get(Calendar.MINUTE); + String key = hour + ":" + min; + if(!result.containsKey(key)){ + result.put(key, new TimePickerTime(hour, min, speech)); + } } } } @@ -971,18 +984,19 @@ else if ("半".equals(min_part)) { showMessage(this, getString(R.string.voice_fail)); } else if (result.size() == 1) { - setTimePickerTime(result.get(0)); + setTimePickerTime(result.values().iterator().next()); } else { - String [] speach_array = new String[result.size()]; - for (int i = 0; i < result.size(); i++) { - TimePickerTime time = result.get(i); - speach_array[i] = time.mSpeach + String.format(" (%02d:%02d)", time.mHour, time.mMin); + String [] speechArray = new String[result.size()]; + Iterator iter = result.values().iterator(); + for(int i = 0; i < result.size(); i++){ + TimePickerTime time = iter.next(); + speechArray[i] = time.mSpeach + String.format(" (%02d:%02d)", time.mHour, time.mMin); } //select from list dialog new AlertDialog.Builder(this) .setTitle(R.string.select_time_from_list) - .setItems(speach_array, new ClickListener(result)) + .setItems(speechArray, new ClickListener(result.values().toArray(new TimePickerTime[0]))) .create() .show(); }