zoukankan      html  css  js  c++  java
  • 解决定时开关机时间差不得小于10分钟

    1.分析思路

    <1>在定时开关机功能上限制开关机时间差在10分钟以内需要考虑到一下情况:

        1.开机或关机只有一个被打开,则允许设置

        2.开机和关机功能都打开并且均为一次性操作,且时间差大于10,则允许设置

        3.开机(关机)一次性,而关机(开机)操作,且时间差大于10,则允许设置

        4.重复周天操作,且时间差大于10,则允许设置

    <2>在保存设置时间时限制,和打开关闭界面进行限制

    2.功能实现

    AlarmClock.java

            private boolean verifyConflict(Alarm mAlarm){

                Alarm verAlarm;

                if(mAlarm.mId==1){

                    verAlarm= Alarms.getAlarm(getContentResolver(), 2);

                }else{

                    verAlarm= Alarms.getAlarm(getContentResolver(), 1);

                }

                if(verAlarm == null){

                    return false;

                }

                if(isRepeat(verAlarm,mAlarm)){

                    return true;

                }else{

                    return false;

                }

            }

     

            private boolean isRepeat(Alarm verAlarm,Alarm mAlarm){

                boolean[] mDays = verAlarm.mDaysOfWeek.getBooleanArray();

                boolean[] days =mAlarm.mDaysOfWeek.getBooleanArray();

                boolean common=false;

                Calendar c=Calendar.getInstance();

                int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;

                boolean tenMore=(Math.abs((verAlarm.mHour*60+verAlarm.mMinutes)-(mAlarm.mHour*60+mAlarm.mMinutes))>=10);

                for(int i=0;i<days.length;i++){

                    for(int j=0;j<mDays.length;j++){

                        if(i==j&&days[i]==true&&mDays[j]==true){

                            common=true;

                        }

                    }

                }

     

                if(!verAlarm.mEnabled){

                    return false;

                }

     

                if(verAlarm.mDaysOfWeek.getCoded()==0&&mAlarm.mDaysOfWeek.getCoded()==0){

                    if(tenMore)

                        return false;

                    else

                        return true;

                }

                if((mAlarm.mDaysOfWeek.getCoded()==0&&mDays[today])||(verAlarm.mDaysOfWeek.getCoded()==0&&days[today])){

                    if(tenMore)

                        return false;

                    else

                        return true;

                }

     

                if(common){

                    if(tenMore)

                        return false;

                    else

                        return true;

                }

                return false;

            }

            @Override

            public void bindView(View view, Context context, Cursor cursor) {

                Xlog.d(TAG, "bindView");

                final Alarm alarm = new Alarm(cursor);

                final Context cont = context;

                CheckBox onButton = (CheckBox) view.findViewById(R.id.alarmButton);

                if (onButton != null) {

                    onButton.setChecked(alarm.mEnabled);

                    onButton.setOnClickListener(new OnClickListener() {

                        @Override

                        public void onClick(View v) {

                            boolean isChecked = ((CheckBox) v).isChecked();

                            Alarms.enableAlarm(cont, alarm.mId, isChecked);

                            if (isChecked) {

                                //+Bug285393,huangyabin.wt,ADD,20140901,The interval between power on/off schedule should be at least 10 minutes

                                if(verifyConflict(alarm)){

                                    Toast.makeText(cont,R.string.interval,Toast.LENGTH_SHORT).show();

                                    Alarms.enableAlarm(cont, alarm.mId, !isChecked);

                                    ((CheckBox) v).setChecked(!isChecked);

                                }else{

                                    SetAlarm.popAlarmSetToast(cont, alarm.mHour, alarm.mMinutes, alarm.mDaysOfWeek, alarm.mId);

                                }

                                //-Bug285393,huangyabin.wt,ADD,20140901,The interval between power on/off schedule should be at least 10 minutes

                            }

                        }

                    });

                }

     

                ImageView onOffView = (ImageView) view.findViewById(R.id.power_on_off);

                if (onOffView != null) {

                    onOffView.setImageDrawable(getResources().getDrawable(

                            (alarm.mId == 1) ? R.drawable.ic_settings_schpwron : R.drawable.ic_settings_schpwroff));

                }

                DigitalClock digitalClock = (DigitalClock) view.findViewById(R.id.digitalClock);

                // set the alarm text

                final Calendar c = Calendar.getInstance();

                c.set(Calendar.HOUR_OF_DAY, alarm.mHour);

                c.set(Calendar.MINUTE, alarm.mMinutes);

                if (digitalClock != null) {

                    digitalClock.updateTime(c);

                }

                // Set the repeat text or leave it blank if it does not repeat.

                TextView daysOfWeekView = (TextView) digitalClock.findViewById(R.id.daysOfWeek);

                final String daysOfWeekStr = alarm.mDaysOfWeek.toString(context, false);

                if (daysOfWeekView != null) {

                    if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {

                        daysOfWeekView.setText(daysOfWeekStr);

                        daysOfWeekView.setVisibility(View.VISIBLE);

                    } else {

                        daysOfWeekView.setVisibility(View.GONE);

                    }

                }

            }

        };

    SetAlarm.java

        private boolean verifyConflict(){

            Alarm verAlarm;

            if(mId==1){

                verAlarm= Alarms.getAlarm(getContentResolver(), 2);

            }else{

                verAlarm= Alarms.getAlarm(getContentResolver(), 1);

            }

            if(verAlarm == null){

                return false;

            }

            if(isRepeat(verAlarm)){

                return true;

            }else{

                return false;

            }

        }

     

        private boolean isRepeat(Alarm verAlarm){

            boolean[] verDays = verAlarm.mDaysOfWeek.getBooleanArray();

            boolean[] mDays =mRepeatPref.getDaysOfWeek().getBooleanArray();

            int mCoded=mRepeatPref.getDaysOfWeek().getCoded();

            int verCoded=verAlarm.mDaysOfWeek.getCoded();

            boolean common=false;

            Calendar c=Calendar.getInstance();

            int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;

            boolean tenMore=(Math.abs((verAlarm.mHour*60+verAlarm.mMinutes)-(mHour*60+mMinutes))>=10);

            for(int i=0;i<mDays.length;i++){

                for(int j=0;j<verDays.length;j++){

                    if(i==j&&mDays[i]==true&&verDays[j]==true){

                        common=true;

                    }

                }

           }

     

             if(!verAlarm.mEnabled){

                return false;

            }

     

             if(verCoded==0&&mCoded==0){

                if(tenMore)

                    return false;

                else

                    return true;

            }

     

            if((mCoded==0&&verDays[today])||(verCoded==0&&mDays[today])){

                if(tenMore)

                    return false;

                else

                    return true;

            }

     

            if(common){

                if(tenMore)

                    return false;

               else

                    return true;

            }

     

            return false;

        }

        private void updateTime() {

            Xlog.d(TAG, "updateTime " + mId);

            mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes, mRepeatPref.getDaysOfWeek()));

        }

        private void saveAlarm() {

            final String alert = Alarms.ALARM_ALERT_SILENT;

            //mEnabled |= mRepeatPref.mIsPressedPositive;

            if(verifyConflict()){

                mEnabled=false;

            }else{

                mEnabled = true;

            }

            Alarms.setAlarm(this, mId, mEnabled, mHour, mMinutes, mRepeatPref.getDaysOfWeek(), true, "", alert);

            if (mEnabled) {

                popAlarmSetToast(this.getApplicationContext(), mHour, mMinutes, mRepeatPref.getDaysOfWeek(), mId);

            }else{

                Toast.makeText(this.getApplicationContext(),R.string.interval,Toast.LENGTH_SHORT).show();

            }

        }

    注!红色部分为功能实现的代码

    3.测试建议

    设置打开定时开关机功能

  • 相关阅读:
    C++编译期间字节序判断
    解决:无法使用前导 .. 在顶级文件夹上退出
    手动脱WinUpack 壳实战
    浅谈cocos2dx(18) 中工厂模式
    手把手带你画一个 时尚仪表盘 Android 自己定义View
    Git实战(二)原理
    <html>
    Ubuntu局域网下利用client联网
    Desugar Scala(17) -- Option和for,以及脑子里发生的事情
    通过Canvas及File API缩放并上传图片完整演示样例
  • 原文地址:https://www.cnblogs.com/bill-technology/p/4130813.html
Copyright © 2011-2022 走看看