mirror of https://github.com/MiCode/Notes.git
add DateTimePicker and remove bug of NotesPrefereceActivity on Clicking menu button
This commit is contained in:
parent
34395605d7
commit
502fc7204d
190
NOTICE
190
NOTICE
|
@ -1,190 +0,0 @@
|
|||
|
||||
Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="horizontal"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<NumberPicker
|
||||
android:id="@+id/date"
|
||||
android:layout_width="120dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
|
||||
<NumberPicker
|
||||
android:id="@+id/hour"
|
||||
android:layout_width="50dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="5dip"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
|
||||
<NumberPicker
|
||||
android:id="@+id/minute"
|
||||
android:layout_width="50dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="5dip"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
|
||||
<NumberPicker
|
||||
android:id="@+id/amPm"
|
||||
android:layout_width="50dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="5dip"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
</LinearLayout>
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/datetime_picker_dialog_Layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
</LinearLayout>
|
|
@ -37,13 +37,12 @@
|
|||
<item
|
||||
android:id="@+id/menu_send_to_desktop"
|
||||
android:title="@string/menu_send_to_desktop"/>
|
||||
<!--
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_alert"
|
||||
android:title="@string/menu_alert" /> -->
|
||||
android:title="@string/menu_alert" />
|
||||
|
||||
<!--
|
||||
<item
|
||||
android:id="@+id/menu_delete_remind"
|
||||
android:title="@string/menu_remove_remind" /> -->
|
||||
android:title="@string/menu_remove_remind" />
|
||||
</menu>
|
||||
|
|
|
@ -42,12 +42,11 @@
|
|||
android:id="@+id/menu_send_to_desktop"
|
||||
android:title="@string/menu_send_to_desktop"/>
|
||||
|
||||
<!--
|
||||
<item
|
||||
android:id="@+id/menu_alert"
|
||||
android:title="@string/menu_alert" /> -->
|
||||
<!--
|
||||
android:title="@string/menu_alert" />
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_delete_remind"
|
||||
android:title="@string/menu_remove_remind" /> -->
|
||||
android:title="@string/menu_remove_remind" />
|
||||
</menu>
|
|
@ -25,6 +25,7 @@
|
|||
<string name="notelist_string_info">...</string>
|
||||
<string name="notelist_menu_new">新建便签</string>
|
||||
<string name="delete_remind_time_message">成功删除提醒</string>
|
||||
<string name="set_remind_time_message">创建提醒</string>
|
||||
<string name="note_alert_expired">已过期</string>
|
||||
<string name="format_date_ymd">yyyyMMdd</string>
|
||||
<string name="format_datetime_mdhm">MM月dd日 kk:mm</string>
|
||||
|
@ -116,6 +117,8 @@
|
|||
<string name="search_hint">搜索便签</string>
|
||||
<string name="search_setting_description">便签中的文字</string>
|
||||
<string name="search">便签</string>
|
||||
<string name="datetime_dialog_ok">设置</string>
|
||||
<string name="datetime_dialog_cancel">取消</string>
|
||||
<plurals name="search_results_title">
|
||||
<item quantity="other"><xliff:g id="NUMBER">%1$s</xliff:g> 条符合“<xliff:g id="SEARCH">%2$s</xliff:g>”的搜索结果</item>
|
||||
</plurals>
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
<string name="notelist_string_info">...</string>
|
||||
<string name="notelist_menu_new">Add note</string>
|
||||
<string name="delete_remind_time_message">Delete reminder successfully</string>
|
||||
<string name="set_remind_time_message">Set reminder</string>
|
||||
<string name="note_alert_expired">Expired</string>
|
||||
<string name="format_date_ymd">yyyyMMdd</string>
|
||||
<string name="format_datetime_mdhm">MMMd kk:mm</string>
|
||||
|
@ -123,6 +124,8 @@
|
|||
<string name="search_hint">Search notes</string>
|
||||
<string name="search_setting_description">Text in your notes</string>
|
||||
<string name="search">Notes</string>
|
||||
<string name="datetime_dialog_ok">set</string>
|
||||
<string name="datetime_dialog_cancel">cancel</string>
|
||||
<plurals name="search_results_title">
|
||||
<item quantity="one"><xliff:g id="number" example="1">%1$s</xliff:g> result for \"<xliff:g id="search" example="???">%2$s</xliff:g>\"</item>
|
||||
<!-- Case of 0 or 2 or more results. -->
|
||||
|
|
|
@ -0,0 +1,426 @@
|
|||
package hw.micode.widget;
|
||||
|
||||
import java.text.DateFormatSymbols;
|
||||
import java.util.Calendar;
|
||||
|
||||
import net.micode.notes.R;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.format.DateFormat;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.NumberPicker;
|
||||
|
||||
public class DateTimePicker extends FrameLayout {
|
||||
|
||||
private static final boolean DEFAULT_ENABLE_STATE = true;
|
||||
|
||||
private static final int HOURS_IN_HALF_DAY = 12;
|
||||
private static final int HOURS_IN_ALL_DAY = 24;
|
||||
private static final int DAYS_IN_ALL_WEEK = 7;
|
||||
|
||||
private static final int WIDTH_DATE_SPINNER_24_HOURVIEW = 140;
|
||||
private static final int WIDTH_HOUR_SPINNER_24_HOURVIEW = 70;
|
||||
private static final int WIDTH_MINUTE_SPINNER_24_HOURVIEW = 70;
|
||||
private static final int WIDTH_DATE_SPINNER_12_HOURVIEW = 120;
|
||||
private static final int WIDTH_HOUR_SPINNER_12_HOURVIEW = 50;
|
||||
private static final int WIDTH_MINUTE_SPINNER_12_HOURVIEW = 50;
|
||||
|
||||
private final NumberPicker mDateSpinner;
|
||||
private final NumberPicker mHourSpinner;
|
||||
private final NumberPicker mMinuteSpinner;
|
||||
private final NumberPicker mAmPmSpinner;
|
||||
Calendar mDate = Calendar.getInstance();
|
||||
|
||||
String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK];
|
||||
|
||||
/*private final EditText mHourSpinnerInput;
|
||||
private final EditText mMinuteSpinnerInput;
|
||||
private final EditText mAmPmSpinnerInput;*/
|
||||
|
||||
private boolean mIsAm;
|
||||
|
||||
boolean mIs24HourView;
|
||||
|
||||
boolean mIsEnabled = DEFAULT_ENABLE_STATE;
|
||||
|
||||
boolean mInitialising;
|
||||
|
||||
private OnDateTimeChangedListener mOnDateTimeChangedListener;
|
||||
|
||||
private NumberPicker.OnValueChangeListener mOnPickerValueChangedListener = new NumberPicker.OnValueChangeListener() {
|
||||
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
|
||||
if (picker == mDateSpinner) {
|
||||
int offset = newVal - oldVal;
|
||||
mDate.add(Calendar.DAY_OF_YEAR, offset);
|
||||
updateDateControl();
|
||||
onDateTimeChanged();
|
||||
} else if (picker == mHourSpinner) {
|
||||
/*updateInputState();*/
|
||||
boolean isDateChanged = false;
|
||||
Calendar cal = Calendar.getInstance();
|
||||
if (!is24HourView()) {
|
||||
if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) {
|
||||
cal.setTimeInMillis(mDate.getTimeInMillis());
|
||||
cal.add(Calendar.DAY_OF_YEAR, 1);
|
||||
isDateChanged = true;
|
||||
} else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) {
|
||||
cal.setTimeInMillis(mDate.getTimeInMillis());
|
||||
cal.add(Calendar.DAY_OF_YEAR, -1);
|
||||
isDateChanged = true;
|
||||
}
|
||||
if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY ||
|
||||
oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) {
|
||||
mIsAm = !mIsAm;
|
||||
updateAmPmControl();
|
||||
}
|
||||
} else {
|
||||
if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) {
|
||||
cal.setTimeInMillis(mDate.getTimeInMillis());
|
||||
cal.add(Calendar.DAY_OF_YEAR, 1);
|
||||
isDateChanged = true;
|
||||
} else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) {
|
||||
cal.setTimeInMillis(mDate.getTimeInMillis());
|
||||
cal.add(Calendar.DAY_OF_YEAR, -1);
|
||||
isDateChanged = true;
|
||||
}
|
||||
}
|
||||
int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY);
|
||||
mDate.set(Calendar.HOUR_OF_DAY, newHour);
|
||||
onDateTimeChanged();
|
||||
if (isDateChanged) {
|
||||
setCurrentYear(cal.get(Calendar.YEAR));
|
||||
setCurrentMonth(cal.get(Calendar.MONTH));
|
||||
setCurrentDay(cal.get(Calendar.DAY_OF_MONTH));
|
||||
}
|
||||
} else if (picker == mMinuteSpinner) {
|
||||
/*updateInputState();*/
|
||||
int minValue = mMinuteSpinner.getMinValue();
|
||||
int maxValue = mMinuteSpinner.getMaxValue();
|
||||
int offset = 0;
|
||||
if (oldVal == maxValue && newVal == minValue) {
|
||||
offset += 1;
|
||||
} else if (oldVal == minValue && newVal == maxValue) {
|
||||
offset -= 1;
|
||||
}
|
||||
if (offset != 0) {
|
||||
mDate.add(Calendar.HOUR_OF_DAY, offset);
|
||||
mHourSpinner.setValue(getCurrentHour());
|
||||
updateDateControl();
|
||||
int newHour = getCurrentHourOfDay();
|
||||
if (newHour >= HOURS_IN_HALF_DAY) {
|
||||
mIsAm = false;
|
||||
updateAmPmControl();
|
||||
} else {
|
||||
mIsAm = true;
|
||||
updateAmPmControl();
|
||||
}
|
||||
}
|
||||
mDate.set(Calendar.MINUTE, newVal);
|
||||
onDateTimeChanged();
|
||||
} else if (picker == mAmPmSpinner) {
|
||||
/*
|
||||
updateInputState();
|
||||
picker.requestFocus();*/
|
||||
mIsAm = !mIsAm;
|
||||
if (mIsAm) {
|
||||
mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);
|
||||
} else {
|
||||
mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);
|
||||
}
|
||||
updateAmPmControl();
|
||||
onDateTimeChanged();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public interface OnDateTimeChangedListener {
|
||||
void onDateTimeChanged(DateTimePicker view, int year, int month,
|
||||
int dayOfMonth, int hourOfDay, int minute);
|
||||
}
|
||||
|
||||
public DateTimePicker(Context context) {
|
||||
this(context, System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public DateTimePicker(Context context, long date) {
|
||||
this(context, date, DateFormat.is24HourFormat(context));
|
||||
}
|
||||
|
||||
public DateTimePicker(Context context, long date, boolean is24HourView) {
|
||||
super(context);
|
||||
mInitialising = true;
|
||||
mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY;
|
||||
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
inflater.inflate(R.layout.datetime_picker, this, true);
|
||||
|
||||
mDateSpinner = (NumberPicker) findViewById(R.id.date);
|
||||
mDateSpinner.setMinValue(0);
|
||||
mDateSpinner.setMaxValue(6);
|
||||
mDateSpinner.setOnValueChangedListener(mOnPickerValueChangedListener);
|
||||
|
||||
mHourSpinner = (NumberPicker) findViewById(R.id.hour);
|
||||
mHourSpinner.setOnValueChangedListener(mOnPickerValueChangedListener);
|
||||
/*
|
||||
mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
|
||||
mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);*/
|
||||
/*
|
||||
mDivider = (TextView) findViewById(R.id.divider);
|
||||
if (mDivider != null) {
|
||||
mDivider.setText(R.string.time_picker_separator);
|
||||
}*/
|
||||
mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
|
||||
mMinuteSpinner.setMinValue(0);
|
||||
mMinuteSpinner.setMaxValue(59);
|
||||
mMinuteSpinner.setOnLongPressUpdateInterval(100);
|
||||
/*mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);*/
|
||||
mMinuteSpinner.setOnValueChangedListener(mOnPickerValueChangedListener);
|
||||
/*
|
||||
mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
|
||||
mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);*/
|
||||
|
||||
String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings();
|
||||
mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm);
|
||||
mAmPmSpinner.setMinValue(0);
|
||||
mAmPmSpinner.setMaxValue(1);
|
||||
mAmPmSpinner.setDisplayedValues(stringsForAmPm);
|
||||
mAmPmSpinner.setOnValueChangedListener(mOnPickerValueChangedListener);
|
||||
/*
|
||||
mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
|
||||
mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);*/
|
||||
|
||||
// update controls to initial state
|
||||
updateDateControl();
|
||||
updateHourControl();
|
||||
updateAmPmControl();
|
||||
|
||||
setIs24HourView(is24HourView);
|
||||
|
||||
// set to current time
|
||||
setCurrentDate(date);
|
||||
|
||||
if (!isEnabled()) {
|
||||
setEnabled(false);
|
||||
}
|
||||
|
||||
// set the content descriptions
|
||||
/*setContentDescriptions();*/
|
||||
mInitialising = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean enabled) {
|
||||
if (mIsEnabled == enabled) {
|
||||
return;
|
||||
}
|
||||
super.setEnabled(enabled);
|
||||
mDateSpinner.setEnabled(enabled);
|
||||
mMinuteSpinner.setEnabled(enabled);
|
||||
/*
|
||||
if (mDivider != null) {
|
||||
mDivider.setEnabled(enabled);
|
||||
}*/
|
||||
mHourSpinner.setEnabled(enabled);
|
||||
mAmPmSpinner.setEnabled(enabled);
|
||||
mIsEnabled = enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return mIsEnabled;
|
||||
}
|
||||
|
||||
public long getCurrentDate() {
|
||||
return mDate.getTimeInMillis();
|
||||
}
|
||||
|
||||
public void setCurrentDate(long date) {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTimeInMillis(date);
|
||||
setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),
|
||||
cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
|
||||
}
|
||||
|
||||
public void setCurrentDate(int year, int month,
|
||||
int dayOfMonth, int hourOfDay, int minute) {
|
||||
setCurrentYear(year);
|
||||
setCurrentMonth(month);
|
||||
setCurrentDay(dayOfMonth);
|
||||
setCurrentHour(hourOfDay);
|
||||
setCurrentMinute(minute);
|
||||
}
|
||||
|
||||
public int getCurrentYear() {
|
||||
return mDate.get(Calendar.YEAR);
|
||||
}
|
||||
|
||||
public void setCurrentYear(int year) {
|
||||
if (!mInitialising && year == getCurrentYear()) {
|
||||
return;
|
||||
}
|
||||
mDate.set(Calendar.YEAR, year);
|
||||
updateDateControl();
|
||||
onDateTimeChanged();
|
||||
}
|
||||
|
||||
public int getCurrentMonth() {
|
||||
return mDate.get(Calendar.MONTH);
|
||||
}
|
||||
|
||||
public void setCurrentMonth(int month) {
|
||||
if (!mInitialising && month == getCurrentMonth()) {
|
||||
return;
|
||||
}
|
||||
mDate.set(Calendar.MONTH, month);
|
||||
updateDateControl();
|
||||
onDateTimeChanged();
|
||||
}
|
||||
|
||||
public int getCurrentDay() {
|
||||
return mDate.get(Calendar.DAY_OF_MONTH);
|
||||
}
|
||||
|
||||
public void setCurrentDay(int dayOfMonth) {
|
||||
if (!mInitialising && dayOfMonth == getCurrentDay()) {
|
||||
return;
|
||||
}
|
||||
mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
|
||||
updateDateControl();
|
||||
onDateTimeChanged();
|
||||
}
|
||||
|
||||
public int getCurrentHourOfDay() {
|
||||
return mDate.get(Calendar.HOUR_OF_DAY);
|
||||
}
|
||||
|
||||
public int getCurrentHour() {
|
||||
if (is24HourView()){
|
||||
return getCurrentHourOfDay();
|
||||
} else {
|
||||
int hour = getCurrentHourOfDay();
|
||||
if (hour > HOURS_IN_HALF_DAY) {
|
||||
return hour - HOURS_IN_HALF_DAY;
|
||||
} else {
|
||||
return hour == 0 ? HOURS_IN_HALF_DAY : hour;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setCurrentHour(int hourOfDay) {
|
||||
if (!mInitialising && hourOfDay == getCurrentHourOfDay()) {
|
||||
return;
|
||||
}
|
||||
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
|
||||
if (!is24HourView()) {
|
||||
if (hourOfDay >= HOURS_IN_HALF_DAY) {
|
||||
mIsAm = false;
|
||||
if (hourOfDay > HOURS_IN_HALF_DAY) {
|
||||
hourOfDay -= HOURS_IN_HALF_DAY;
|
||||
}
|
||||
} else {
|
||||
mIsAm = true;
|
||||
if (hourOfDay == 0) {
|
||||
hourOfDay = HOURS_IN_HALF_DAY;
|
||||
}
|
||||
}
|
||||
updateAmPmControl();
|
||||
}
|
||||
mHourSpinner.setValue(hourOfDay);
|
||||
onDateTimeChanged();
|
||||
}
|
||||
|
||||
public int getCurrentMinute() {
|
||||
return mDate.get(Calendar.MINUTE);
|
||||
}
|
||||
|
||||
public void setCurrentMinute(int minute) {
|
||||
if (!mInitialising && minute == getCurrentMinute()) {
|
||||
return;
|
||||
}
|
||||
mMinuteSpinner.setValue(minute);
|
||||
mDate.set(Calendar.MINUTE, minute);
|
||||
onDateTimeChanged();
|
||||
}
|
||||
|
||||
public boolean is24HourView () {
|
||||
return mIs24HourView;
|
||||
}
|
||||
|
||||
public void setIs24HourView(boolean is24HourView) {
|
||||
if (mIs24HourView == is24HourView) {
|
||||
return;
|
||||
}
|
||||
mIs24HourView = is24HourView;
|
||||
if (is24HourView) {
|
||||
mDateSpinner.setLayoutParams(
|
||||
new LinearLayout.LayoutParams(WIDTH_DATE_SPINNER_24_HOURVIEW, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
mHourSpinner.setLayoutParams(
|
||||
new LinearLayout.LayoutParams(WIDTH_HOUR_SPINNER_24_HOURVIEW, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
mMinuteSpinner.setLayoutParams(
|
||||
new LinearLayout.LayoutParams(WIDTH_MINUTE_SPINNER_24_HOURVIEW, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
} else {
|
||||
mDateSpinner.setLayoutParams(
|
||||
new LinearLayout.LayoutParams(WIDTH_DATE_SPINNER_12_HOURVIEW, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
mHourSpinner.setLayoutParams(
|
||||
new LinearLayout.LayoutParams(WIDTH_HOUR_SPINNER_12_HOURVIEW, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
mMinuteSpinner.setLayoutParams(
|
||||
new LinearLayout.LayoutParams(WIDTH_MINUTE_SPINNER_12_HOURVIEW, LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
}
|
||||
int hour = getCurrentHourOfDay();
|
||||
updateHourControl();
|
||||
setCurrentHour(hour);
|
||||
updateAmPmControl();
|
||||
}
|
||||
|
||||
private void updateDateControl() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
final String fomater = "MM.dd EEEE";
|
||||
cal.setTimeInMillis(mDate.getTimeInMillis());
|
||||
cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);
|
||||
mDateSpinner.setDisplayedValues(null);
|
||||
for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) {
|
||||
cal.add(Calendar.DAY_OF_YEAR, 1);
|
||||
mDateDisplayValues[i] = (String) DateFormat.format(fomater, cal);
|
||||
}
|
||||
mDateSpinner.setDisplayedValues(mDateDisplayValues);
|
||||
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
|
||||
mDateSpinner.invalidate();
|
||||
}
|
||||
|
||||
private void updateAmPmControl() {
|
||||
if (is24HourView()) {
|
||||
mAmPmSpinner.setVisibility(View.GONE);
|
||||
} else {
|
||||
int index = mIsAm ? Calendar.AM : Calendar.PM;
|
||||
mAmPmSpinner.setValue(index);
|
||||
mAmPmSpinner.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateHourControl() {
|
||||
if (is24HourView()) {
|
||||
mHourSpinner.setMinValue(0);
|
||||
mHourSpinner.setMaxValue(23);
|
||||
/*mHourSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);*/
|
||||
} else {
|
||||
mHourSpinner.setMinValue(1);
|
||||
mHourSpinner.setMaxValue(12);
|
||||
/*mHourSpinner.setFormatter(null)*/
|
||||
}
|
||||
}
|
||||
|
||||
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
|
||||
mOnDateTimeChangedListener = callback;
|
||||
}
|
||||
|
||||
private void onDateTimeChanged() {
|
||||
/*sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);*/
|
||||
if (mOnDateTimeChangedListener != null) {
|
||||
mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),
|
||||
getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
package hw.micode.widget;
|
||||
|
||||
import hw.micode.widget.DateTimePicker.OnDateTimeChangedListener;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
import net.micode.notes.R;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.DialogInterface.OnClickListener;
|
||||
import android.text.format.DateFormat;
|
||||
import android.text.format.DateUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
|
||||
|
||||
LinearLayout mLayout;
|
||||
Calendar mDate = Calendar.getInstance();
|
||||
private boolean mIs24HourView;
|
||||
OnDateTimeSetListener mOnDateTimeSetListener;
|
||||
DateTimePicker mDateTimePicker;
|
||||
|
||||
public interface OnDateTimeSetListener {
|
||||
void OnDateTimeSet(AlertDialog dialog, int year, int month, int dayOfMonth, int hourOfDay, int minute);
|
||||
}
|
||||
|
||||
public DateTimePickerDialog(Context context, long date) {
|
||||
this(context, new Date(date));
|
||||
}
|
||||
|
||||
public DateTimePickerDialog(Context context, int year, int month,
|
||||
int dayOfMonth, int hourOfDay, int minute) {
|
||||
this(context, new Date(year - 1900, month, dayOfMonth, hourOfDay, minute));
|
||||
}
|
||||
|
||||
public DateTimePickerDialog(Context context, Date date) {
|
||||
super(context);
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
View view = inflater.inflate(R.layout.datetime_picker_dialog, null);
|
||||
mLayout = (LinearLayout) view.findViewById(R.id.datetime_picker_dialog_Layout);
|
||||
setView(view);
|
||||
mDateTimePicker = new DateTimePicker(context);
|
||||
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
|
||||
public void onDateTimeChanged(DateTimePicker view, int year, int month,
|
||||
int dayOfMonth, int hourOfDay, int minute) {
|
||||
mDate.set(Calendar.YEAR, year);
|
||||
mDate.set(Calendar.MONTH, month);
|
||||
mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
|
||||
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
|
||||
mDate.set(Calendar.MINUTE, minute);
|
||||
updateTitle(mDate.getTimeInMillis());
|
||||
}
|
||||
});
|
||||
mLayout.addView(mDateTimePicker);
|
||||
mDate.setTime(date);
|
||||
mDate.set(Calendar.SECOND, 0);
|
||||
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
|
||||
setButton(context.getString(R.string.datetime_dialog_ok), this);
|
||||
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
|
||||
setIs24HourView(DateFormat.is24HourFormat(this.getContext()));
|
||||
updateTitle(mDate.getTimeInMillis());
|
||||
}
|
||||
|
||||
public void setIs24HourView(boolean is24HourView) {
|
||||
mIs24HourView = is24HourView;
|
||||
}
|
||||
|
||||
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack)
|
||||
{
|
||||
mOnDateTimeSetListener = callBack;
|
||||
}
|
||||
|
||||
private void updateTitle(long date)
|
||||
{
|
||||
int flag =
|
||||
DateUtils.FORMAT_SHOW_YEAR |
|
||||
DateUtils.FORMAT_SHOW_DATE |
|
||||
DateUtils.FORMAT_SHOW_TIME;
|
||||
if (mIs24HourView) {
|
||||
flag |= DateUtils.FORMAT_24HOUR;
|
||||
} else {
|
||||
flag |= DateUtils.FORMAT_12HOUR;
|
||||
}
|
||||
String s = DateUtils.formatDateTime(this.getContext(), date, flag);
|
||||
setTitle(s);
|
||||
}
|
||||
|
||||
public void onClick(DialogInterface arg0, int arg1) {
|
||||
// TODO Auto-generated method stub
|
||||
if (mOnDateTimeSetListener != null) {
|
||||
mOnDateTimeSetListener.OnDateTimeSet(this,
|
||||
mDate.get(Calendar.YEAR),
|
||||
mDate.get(Calendar.MONTH),
|
||||
mDate.get(Calendar.DAY_OF_MONTH),
|
||||
mDate.get(Calendar.HOUR_OF_DAY),
|
||||
mDate.get(Calendar.MINUTE));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -64,6 +64,10 @@ import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
|
|||
import net.micode.notes.widget.NoteWidgetProvider_2x;
|
||||
import net.micode.notes.widget.NoteWidgetProvider_4x;
|
||||
|
||||
import hw.micode.widget.DateTimePickerDialog;
|
||||
import hw.micode.widget.DateTimePickerDialog.OnDateTimeSetListener;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
|
@ -493,6 +497,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|||
} else {
|
||||
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
|
||||
}
|
||||
if (mWorkingNote.hasClockAlert()) {
|
||||
menu.findItem(R.id.menu_alert).setVisible(false);
|
||||
} else {
|
||||
menu.findItem(R.id.menu_delete_remind).setVisible(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -532,11 +541,29 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|||
case R.id.menu_send_to_desktop:
|
||||
sendToDesktop();
|
||||
break;
|
||||
case R.id.menu_alert:
|
||||
setReminder();
|
||||
break;
|
||||
case R.id.menu_delete_remind:
|
||||
mWorkingNote.setAlertDate(0, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void setReminder() {
|
||||
DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
|
||||
d.setOnDateTimeSetListener(new OnDateTimeSetListener() {
|
||||
public void OnDateTimeSet(AlertDialog dialog, int year, int month,
|
||||
int dayOfMonth, int hourOfDay, int minute) {
|
||||
Date d = new Date(year - 1900, month, dayOfMonth, hourOfDay, minute, 0);
|
||||
mWorkingNote.setAlertDate(d.getTime(), true);
|
||||
}
|
||||
});
|
||||
d.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Share note to apps that support {@link Intent#ACTION_SEND} action
|
||||
|
|
|
@ -18,6 +18,7 @@ package net.micode.notes.ui;
|
|||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.app.ActionBar;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentValues;
|
||||
|
@ -371,7 +372,10 @@ public class NotesPreferenceActivity extends PreferenceActivity {
|
|||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getActionBar().setHomeButtonEnabled(true);
|
||||
ActionBar ab = getActionBar();
|
||||
if (ab != null) {
|
||||
ab.setHomeButtonEnabled(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue