/* * 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.activities; 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 { /** * 便签ID */ private long mNoteId; /** * 片段 */ private String mSnippet; /** * 片段前缀最长长度 */ private static final int SNIPPET_PREW_MAX_LEN = 60; MediaPlayer mPlayer; /** * onCreate 生命周期方法 * @param savedInstanceState 之前保存的实例状态 */ @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)); // 片段名称 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; } mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { // 显示弹出窗口 showActionDialog(); // 播放提示音 playAlarmSound(); } else { finish(); } } /** * 屏幕是否开着 * @return 状态 */ 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(); } 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); // 设置标题 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); } /** * 在点击时调用该时间 * @param dialog 弹窗接口 * @param which 接口类型 */ public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_NEGATIVE: Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra(Intent.EXTRA_UID, mNoteId); startActivity(intent); break; default: break; } } /** * 在活动停止调用,停止播放闹钟声音 * @param dialog */ public void onDismiss(DialogInterface dialog) { stopAlarmSound(); finish(); } /** * 停止播放闹钟声音 */ private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; } } }