/*
 * 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;/*
导入android包下的app子包里的Activity类，该类是activity组件的父类
*/
import android.app.AlertDialog;/*
导入android包下的app子包里的AlertDialog类，该类是实现界面警告对话框（提示框）的
*/
import android.content.Context;/*
导入android包下的content子包里的Context类，该类为抽象类，是所有组件的父类，一个实例组件即一个context对象
*/
import android.content.DialogInterface;/*
导入android包下的content子包里的DialogInterface接口，是Dialog的接口
*/
import android.content.DialogInterface.OnClickListener;/*
导入android包下的content子包里的DialogInterface接口的子接口OnClickListener，该接口是用于监听用户点击事件的
*/
import android.content.DialogInterface.OnDismissListener;/*
导入android包下的content子包里的DialogInterface接口的子接口OnDismissListener，该接口是监听用户取消对话框事件的
*/
import android.content.Intent;/*
导入Intent类，该类是intent对象的父类
*/
import android.media.AudioManager;/*
导入android包里的子包media里的AudioManager类，该类是手机的音频管理器，可以控制手机的声音、震动
*/
import android.media.MediaPlayer;/*
导入多媒体包里的多媒体播放器类MediaPlayer，用于播放音频、视频等
*/
import android.media.RingtoneManager;/*
导入多媒体包里的RingtoneManager类，该类是铃声管理器
*/
import android.net.Uri;/*
导入net包里的Uri抽象类，uri可以代表任何要操作的资源数据
*/
import android.os.Bundle;/*
导入os包里的Bundle类，该类用于在activity类之间通过intent传递数据，待传递的数据以键值对形式组合包含于bundle对象，bundle对象又包含
于intent对象里
*/
import android.os.PowerManager;/*
导入os包里的PowerManager类，该类是电源管理器
*/
import android.provider.Settings;/*
导入Settings类，该类提供系统的设置等等
*/
import android.view.Window;/*
导入Window类，该类是窗口，是view树的载体，是view的管理者
*/
import android.view.WindowManager;/*
导入该接口，该接口是窗口管理器
*/

import net.micode.notes.R;/*
导入软件包的R类，该类是自动生成的，包含应用的资源id，与资源引用有关
*/
import net.micode.notes.data.Notes;/*
导入net.micode.notes包里的子包data里的Notes类
*/
import net.micode.notes.tool.DataUtils;/*
导入net.micode.notes包里的子包tool里的DataUtils类
*/

import java.io.IOException;/*
导入java io包的IOException类，输入输出检查异常类
*/


public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
    /* 该类是activity类，继承自Activity父类，实现可视化界面，且实现了OnClickListener, OnDismissListener接口，
    可以监听用户点击，取消事件*/
    private long mNoteId; //便签id变量
    private String mSnippet;//字符串变量
    private static final int SNIPPET_PREW_MAX_LEN = 60;//静态不可修改的整形变量
    MediaPlayer mPlayer;//定义了一个MediaPlaye变量

    @Override
    protected void onCreate(Bundle savedInstanceState) {/*
        onCreate（）方法是对父类的方法的重写，用于初始化activity对即界面，参数是bundle对象，传递数据的
        */
        super.onCreate(savedInstanceState);/*
        调用父类方法，初始化界面，绘制初始界面的，必须调用
        */
        requestWindowFeature(Window.FEATURE_NO_TITLE);/*
        该方法用于设置窗口的特征，当前参数的window类的变量，设置当前窗口无标题
        */
        final Window win = getWindow();/*
        getWindow方法 获得当前界面的窗口对象，不可修改值
        */
        win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);/*
        该方法用于向window对象增加flags，显示逻辑，flags是windowManager类里的内部类LayoutParams的变量。
        当前逻辑是锁屏时显示
        */

        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);
            /* 屏幕不亮时，增加新的flags，显示逻辑*/
        }

        Intent intent = getIntent();/*
        通过getIntent方法  获得当前界面接受到的intent对象
        */

        try {
            mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));/*
            getData（）方法是获得intent对象携带的数据的uri，getPathSegments()方法是将uri的第一个/的右部分转化为字符串类型的list，
            该语句作用为将接受到的intent对象的便签id数据赋值到mNoteId变量
            */
            mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);/*
            调用DataUtils类里的getSnippetById方法，给mSnippet赋值，getContentResolver（）用于获得当前activity界面的内容
            解析器contentResolver，用于对其他activity共享的内容进行解析，内容解析器有增删改查等方法，对数据操作
            */
            mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
                    SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)/*
                    getResources()方法 获得Resources对象，用于引用资源，getString（资源id）方法  通过资源id引用字符串资源
                    R.string.notelist_string_info 获得名为notelist_string_info的字符串的id
                    */
                    : mSnippet;
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return;
        }

        mPlayer = new MediaPlayer();//实例化MediaPlayer类
        if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
            /* 判断便签是否在便签数据库里，在则显示对话框，播放闹钟声音*/
            showActionDialog();
            playAlarmSound();
        } else {
            finish();//关闭该activity打开的一切资源，finish后调用onDestory（）销毁该activity
        }
    }

    private boolean isScreenOn() {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);/*
        getSystemService（）方法用于获得系统服务，比如当前是获得系统的电源管理器，通过context的字符串变量调用,再强制转化为owerManager
        */
        return pm.isScreenOn();//判断屏幕是否亮
    }

    private void playAlarmSound() {
        Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);/*
        调用铃声管理器的getActualDefaultRingtoneUri方法，获得安卓默认的铃声资源URI
        */

        int silentModeStreams = Settings.System.getInt(getContentResolver(),
                Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);/*
                getInt方法是获得系统设置中某些设置的值，比如当前是获得闹钟铃声音量的大小
                */

        if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
            mPlayer.setAudioStreamType(silentModeStreams);/*
            设置音量流类型
            */
        } else {
            mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
        }
        try {
            mPlayer.setDataSource(this, url);//设置播放的多媒体资源URI
            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);/*
        AlertDialog类的构造方法受保护，只能通过内部类builder的构造方法来创建对话框
        */
        dialog.setTitle(R.string.app_name);//设置对话框标题
        dialog.setMessage(mSnippet);//设置对话框内容
        dialog.setPositiveButton(R.string.notealert_ok, this);//设置响应一般YES的按钮，按钮的标题为参数
        if (isScreenOn()) {
            dialog.setNegativeButton(R.string.notealert_enter, this);//屏幕亮，设置一般响应取消的按钮
        }
        dialog.show().setOnDismissListener(this);//显示对话框，并且设置一个监听用户取消对话框的监听器
    }

    public void onClick(DialogInterface dialog, int which) {/*
        该方法用于处理用户点击
        */
        switch (which) {
            case DialogInterface.BUTTON_NEGATIVE://如果用户点击negative按钮
                Intent intent = new Intent(this, NoteEditActivity.class);/*
                创建一个显示intent，指定接受的组件为NoteEditActivity类
                */
                intent.setAction(Intent.ACTION_VIEW);//设置intent的action，接受的activity显示数据
                intent.putExtra(Intent.EXTRA_UID, mNoteId);//设置activity响应操作所需的额外的数据，是键值对
                startActivity(intent);//将intent对象传递给NoteEditActivity类
                break;
            default:
                break;
        }
    }

    public void onDismiss(DialogInterface dialog) {
        stopAlarmSound();
        finish();
    }/*响应用户取消，停止播放闹钟，结束该activity调用的一切资源*/

    private void stopAlarmSound() {
        if (mPlayer != null) {
            mPlayer.stop();
            mPlayer.release();
            mPlayer = null;
        }
    }/* 非空，停止播放，释放资源，置空*/
}
