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.
MINOTES/src/ui/AlarmAlertActivity.java

202 lines
7.8 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.

/*
* 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.ui;
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;
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
private long mNoteId; //用于存储笔记Id
private String mSnippet; //用于存储笔记内容摘要
private static final int SNIPPET_PREW_MAX_LEN = 60;//限制笔记长度
MediaPlayer mPlayer;
//onCreate() 函数在 Activity 初始化时调用,用于初始化
//savedInstanceState 该参数用于恢复 Activity 状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//界面显示:无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//获取 Window 对象,添加 FLAG_SHOW_WHEN_LOCKED 标记
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 intent = getIntent();
//从Intent对象中获取笔记的 Id 和内容
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
//根据便签Id从数据库中获取便签内容
//getContentResolver() 实现数据共享,实例存储
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 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 {
mPlayer.setDataSource(this, url); //设置报警铃声
mPlayer.prepare(); //准备同步
mPlayer.setLooping(true); //设置循环播放
mPlayer.start(); //开始播放
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
//以下的 e.printStackTrace() 函数功能是抛出异常,还将显示出更深的调用信息
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();
}
}
//创建一个对话框标题为app的名字内容为mSnippet确定按钮为notealert_ok
// 当屏幕开启时取消按钮为notealert_enter点击弹出框外部可以隐藏弹出框
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
//为对话框设置标题
dialog.setTitle(R.string.app_name);
//为对话框设置内容
dialog.setMessage(mSnippet);
//给对话框添加“OK”按钮
dialog.setPositiveButton(R.string.notealert_ok, this);
if (isScreenOn()) {
//给对话框添加“CANCEL”按钮
dialog.setNegativeButton(R.string.notealert_enter, this);
}
//给对话框设置监听器
dialog.show().setOnDismissListener(this);
}
//当对话框界面内某个按钮被点击时调用以下方法
// 接收 对话框界面 和 点击的按钮位置which 为参数
public void onClick(DialogInterface dialog, int which) {
//switch语句根据按钮位置的不同执行不同的操作
switch (which) {
//当点击点击的是返回按键
case DialogInterface.BUTTON_NEGATIVE:
//将编辑的便签内容传输到特定类中
Intent intent = new Intent(this, NoteEditActivity.class);
//设置操作属性
intent.setAction(Intent.ACTION_VIEW);
//创建一个特定的Note Id传输给便签
intent.putExtra(Intent.EXTRA_UID, mNoteId);
//开始操作
startActivity(intent);
break;
//如果是其他按钮被点击则不执行任何操作
default:
break;
}
}
public void onDismiss(DialogInterface dialog) {
//终止报警声音
stopAlarmSound();
//完成动作
finish();
}
private void stopAlarmSound() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
//释放 MediaPlayer(媒体播放器)对象
mPlayer = null;
}
}
}