You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xiaomibianqian/ui/AlarmAlertActivity.java

190 lines
7.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 版权所有 (c) 2010-2011, The MiCode 开源社区www.micode.net
*
* 根据 Apache 许可证 2.0 版(“许可证”)授权;
* 除非遵守许可证,否则不得使用此文件。
* 您可以在以下网址获得许可证的副本:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 除非适用法律要求或书面同意,否则根据许可证分发的软件
* 是按“原样”分发的,不附带任何明示或暗示的保证或条件。
* 请参阅许可证,了解许可证下的权利和限制的具体语言。
*/
package net.micode.notes.ui;
// 导入必要的 Android 类和接口
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import android.view.Window;
import android.view.WindowManager;
// 导入自定义类和资源
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.DataUtils;
import java.io.IOException;
// 定义 AlarmAlertActivity 类,扩展 Activity 并实现 OnClickListener 和 OnDismissListener 接口
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
// 声明笔记 ID、片段文本和 MediaPlayer 变量
private long mNoteId;
private String mSnippet;
private static final int SNIPPET_PREW_MAX_LEN = 60;
MediaPlayer mPlayer;
// 当活动被创建时调用 onCreate 方法
@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();
try {
// 从意图的数据中提取笔记 ID
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
// 根据笔记 ID 获取片段文本
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);
// 如果片段太长,截断并添加省略号
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;
}
// 创建一个新的 MediaPlayer 实例
mPlayer = new MediaPlayer();
// 检查笔记是否可见
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
// 显示操作对话框并播放闹钟声音
showActionDialog();
playAlarmSound();
} else {
// 如果笔记不可见,则结束活动
finish();
}
}
// 方法检查屏幕是否开启
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn();
}
// 方法播放闹钟声音
private void playAlarmSound() {
// 获取默认闹钟声音的 URI
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
// 获取静音模式流设置
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);
}
try {
// 为 MediaPlayer 设置数据源并准备播放
mPlayer.setDataSource(this, url);
mPlayer.prepare();
// 设置循环为 true 并开始播放声音
mPlayer.setLooping(true);
mPlayer.start();
} catch (IllegalArgumentException e) {
// 处理异常
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 方法显示带有选项的操作对话框
private void showActionDialog() {
// 创建一个新的 AlertDialog 构建器
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
// 设置对话框的标题和消息
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);
}
// 实现 OnClickListener 接口,处理对话框按钮点击
public void onClick(DialogInterface dialog, int which) {
// 处理按钮点击
switch (which) {
case DialogInterface.BUTTON_NEGATIVE:
// 创建意图以启动 NoteEditActivity
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(Intent.EXTRA_UID, mNoteId);
// 启动活动
startActivity(intent);
break;
default:
// 无操作
break;
}
}
// 实现 OnDismissListener 接口,处理对话框消失
public void onDismiss(DialogInterface dialog) {
// 停止闹钟声音并结束活动
stopAlarmSound();
finish();
}
// 方法停止闹钟声音
private void stopAlarmSound() {
// 如果 MediaPlayer 不为空,则停止并释放它
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
}
}