Compare commits

..

3 Commits

Author SHA1 Message Date
zhangwenqing 1758da827a baodao
3 months ago
zhangwenqing 6982984f9a Merge branch 'main' of https://bdgit.educoder.net/pyqg8khpo/5MI into zhangwenqing
3 months ago
zhangwenqing 6bc054a2ea baodao
3 months ago

@ -0,0 +1,73 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
package net.micode.notes.data;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Data;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import java.util.HashMap;
public class Contact {
private static HashMap<String, String> sContactCache;
private static final String TAG = "Contact";
private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER
+ ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'"
+ " AND " + Data.RAW_CONTACT_ID + " IN "
+ "(SELECT raw_contact_id "
+ " FROM phone_lookup"
+ " WHERE min_match = '+')";
public static String getContact(Context context, String phoneNumber) {
if(sContactCache == null) {
sContactCache = new HashMap<String, String>();
}
if(sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
String selection = CALLER_ID_SELECTION.replace("+",
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
Cursor cursor = context.getContentResolver().query(
Data.CONTENT_URI,
new String [] { Phone.DISPLAY_NAME },
selection,
new String[] { phoneNumber },
null);
if (cursor != null && cursor.moveToFirst()) {
try {
String name = cursor.getString(0);
sContactCache.put(phoneNumber, name);
return name;
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, " Cursor get string error " + e.toString());
return null;
} finally {
cursor.close();
}
} else {
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
}
}

@ -0,0 +1,82 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
package net.micode.notes.gtask.data;
import android.database.Cursor;
import android.util.Log;
import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
public class MetaData extends Task {
private final static String TAG = MetaData.class.getSimpleName();
private String mRelatedGid = null;
public void setMeta(String gid, JSONObject metaInfo) {
try {
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
} catch (JSONException e) {
Log.e(TAG, "failed to put related gid");
}
setNotes(metaInfo.toString());
setName(GTaskStringUtils.META_NOTE_NAME);
}
public String getRelatedGid() {
return mRelatedGid;
}
@Override
public boolean isWorthSaving() {
return getNotes() != null;
}
@Override
public void setContentByRemoteJSON(JSONObject js) {
super.setContentByRemoteJSON(js);
if (getNotes() != null) {
try {
JSONObject metaInfo = new JSONObject(getNotes().trim());
mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
} catch (JSONException e) {
Log.w(TAG, "failed to get related gid");
mRelatedGid = null;
}
}
}
@Override
public void setContentByLocalJSON(JSONObject js) {
// this function should not be called
throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
}
@Override
public JSONObject getLocalJSONFromContent() {
throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
}
@Override
public int getSyncAction(Cursor c) {
throw new IllegalAccessError("MetaData:getSyncAction should not be called");
}
}

@ -1,236 +0,0 @@
以下是对这段代码每一行的注释:
```java
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
* 版权声明指出代码由The MiCode Open Source Community拥有版权并提供了他们的网址。
*
* Licensed under the Apache License, Version 2.0 (the "License");
* 声明代码遵循Apache License 2.0。
* you may not use this file except in compliance with the License.
* 你不能使用此文件,除非遵守该许可证。
* You may obtain a copy of the License at
* 你可以通过以下网址获取许可证的副本:
*
* http://www.apache.org/licenses/LICENSE-2.0
* 许可证的网址。
*
* 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.
* 请参考许可证以了解有关权限和限制的具体条款。
*/
package net.micode.notes.ui;
// 声明代码属于哪个包。
import android.app.Activity;
// 导入Activity类是Android应用程序的基础类。
import android.app.AlertDialog;
// 导入AlertDialog类用于显示对话框。
import android.content.Context;
// 导入Context类提供关于应用程序环境的信息。
import android.content.DialogInterface;
// 导入DialogInterface类是对话框中按钮监听器的基接口。
import android.content.DialogInterface.OnClickListener;
// 导入OnClickListener接口用于处理对话框按钮点击事件。
import android.content.DialogInterface.OnDismissListener;
// 导入OnDismissListener接口用于处理对话框被关闭的事件。
import android.content.Intent;
// 导入Intent类用于在组件之间传递消息。
import android.media.AudioManager;
// 导入AudioManager类用于管理与音频相关的操作。
import android.media.MediaPlayer;
// 导入MediaPlayer类用于播放音频文件。
import android.media.RingtoneManager;
// 导入RingtoneManager类用于管理铃声。
import android.net.Uri;
// 导入Uri类表示一个统一的资源标识符。
import android.os.Bundle;
// 导入Bundle类用于存储键值对的数据。
import android.os.PowerManager;
// 导入PowerManager类用于管理系统电源。
import android.provider.Settings;
// 导入Settings类用于访问系统设置。
import android.view.Window;
// 导入Window类表示应用窗口。
import android.view.WindowManager;
// 导入WindowManager类用于管理窗口。
import net.micode.notes.R;
// 导入R类包含了应用程序的资源。
import net.micode.notes.data.Notes;
// 导入Notes类用于处理笔记数据。
import net.micode.notes.tool.DataUtils;
// 导入DataUtils类提供了数据操作的工具方法。
import java.io.IOException;
// 导入IOException类表示I/O异常。
```
```java
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
// 声明一个名为AlarmAlertActivity的公共类继承自Activity类并实现OnClickListener和OnDismissListener接口。
private long mNoteId;
// 定义一个私有成员变量mNoteId用于存储笔记的ID。
private String mSnippet;
// 定义一个私有成员变量mSnippet用于存储笔记的预览文本。
private static final int SNIPPET_PREW_MAX_LEN = 60;
// 定义一个常量,限定预览文本的最大长度。
MediaPlayer mPlayer;
// 定义一个MediaPlayer对象用于播放音频。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 请求一个没有标题的窗口特性。
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// 设置窗口参数,即使在锁定屏幕时也能显示窗口。
if (!isScreenOn()) {
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
}
// 如果屏幕不亮,则设置窗口参数以保持屏幕常亮。
Intent intent = getIntent();
// 获取启动该Activity的Intent。
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
// 从Intent中获取笔记ID。
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);
// 根据笔记ID获取笔记的预览文本。
mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)
: mSnippet;
// 如果预览文本超过最大长度,则截断并添加省略号。
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}
mPlayer = new MediaPlayer();
// 初始化MediaPlayer对象。
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();
// 显示操作对话框。
playAlarmSound();
// 播放闹钟声音。
} else {
finish();
// 如果笔记不在数据库中则结束该Activity。
}
}
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
// 获取电源服务。
return pm.isScreenOn();
// 返回屏幕是否亮着。
}
private void playAlarmSound() {
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
// 获取默认闹钟铃声的Uri。
int silentModeStreams = Settings.System.getInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
// 获取静音模式下受影响的音频流。
if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
mPlayer.setAudioStreamType(silentModeStreams);
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
// 设置MediaPlayer的音频流类型。
try {
mPlayer.setDataSource(this, url);
// 设置MediaPlayer的数据源。
mPlayer.prepare();
// 准备MediaPlayer。
mPlayer.setLooping(true);
// 设置MediaPlayer循环播放。
mPlayer.start();
// 开始播放。
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
// 创建AlertDialog的构造器。
dialog.setTitle(R.string.app_name);
// 设置对话框标题。
dialog.setMessage(mSnippet);
// 设置对话框消息。
dialog.setPositiveButton(R.string.notealert_ok, this);
// 设置对话框的确定按钮。
if (isScreenOn()) {
dialog.setNegativeButton(R.string.notealert_enter, this);
}
// 如果屏幕亮着,设置对话框的进入按钮。
dialog.show().setOnDismissListener(this);
// 显示对话框并设置对话框消失监听器。
}
public void onClick(DialogInterface dialog, int which) {
// 实现OnClickListener接口的onClick方法。
switch (which) {
case DialogInterface.BUTTON_NEGATIVE:
Intent intent = new Intent(this, NoteEditActivity.class);
// 创建一个新的Intent意图是打开NoteEditActivity。
intent.setAction(Intent.ACTION_VIEW);
// 设置Intent的动作为查看。
intent.putExtra(Intent.EXTRA_UID, mNoteId);
// 将笔记ID作为额外信息传递给NoteEditActivity。
startActivity(intent);
// 启动NoteEditActivity。
break;
default:
break;
}
}
public void onDismiss(DialogInterface dialog) {
// 实现OnDismissListener接口的onDismiss方法。
stopAlarmSound();
// 停止闹钟声音。
finish();
// 结束该Activity。
}
private void stopAlarmSound() {
// 定义一个私有方法来停止闹钟声音。
if (mPlayer != null) {
mPlayer.stop();
// 停止MediaPlayer。
mPlayer.release();
// 释放MediaPlayer资源。
mPlayer = null;
// 将MediaPlayer对象设置为null。
}
}
}
```
Loading…
Cancel
Save