keep slient when message income in project L05 and L03.
authorkfl_614 <kfl_614@163.com>
Thu, 10 Dec 2020 08:45:16 +0000 (16:45 +0800)
committerkfl_614 <kfl_614@163.com>
Thu, 10 Dec 2020 08:45:16 +0000 (16:45 +0800)
app/build.gradle
app/release/ICSer_V517_2012101455_release.apk [new file with mode: 0644]
app/release/output.json
app/src/main/AndroidManifest.xml
app/src/main/java/com/enqualcomm/support/BootCompleteReceiver.java
app/src/main/java/com/enqualcomm/support/MainActivity.java
app/src/main/java/com/enqualcomm/support/service/SilentManager.java
app/src/main/java/com/enqualcomm/support/utils/ProcessReceiver.java
app/src/main/java/com/ic/protocols/protocol_mqtt_client.java
app/src/main/java/se/wetcat/qatja/android/QatjaService.java
app/version_code.properties

index 140dfff..5ca36f5 100644 (file)
@@ -90,8 +90,8 @@ android {
 //    }
 }
 dependencies {
-    compileOnly files ('libs/frameworks-full-debug.jar')
-    provided files ('libs/telephony_common-full-debug.jar')
+    compileOnly files('libs/frameworks-full-debug.jar')
+    provided files('libs/telephony_common-full-debug.jar')
 
     implementation 'com.android.support.constraint:constraint-layout:1.1.3'
     //compile fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
@@ -100,12 +100,12 @@ dependencies {
     })
     implementation 'com.android.support:appcompat-v7:25.1.0'
     implementation 'com.github.ChestnutPlus:TestModules:v1.0.16'
-    testCompile 'junit:junit:4.12'
+    testImplementation 'junit:junit:4.12'
     implementation project(path: ':dNSCache')
     implementation 'com.android.support:recyclerview-v7:25.1.0'
-    compile files ('libs/android-logging-log4j-1.0.3.jar','libs/ftp4j-1.7.2.jar','libs/log4j-1.2.17.jar','libs/okio-2.4.3.jar' )
-    compile files ('libs/mail.jar' )
-    compile files ('libs/activation.jar','libs/additionnal.jar' )
+    implementation files('libs/android-logging-log4j-1.0.3.jar', 'libs/ftp4j-1.7.2.jar', 'libs/log4j-1.2.17.jar', 'libs/okio-2.4.3.jar')
+    implementation files('libs/mail.jar')
+    implementation files('libs/activation.jar', 'libs/additionnal.jar')
 
     implementation 'se.wetcat.qatja:core:1.0.4'
 //    implementation "androidx.recyclerview:recyclerview:1.1.0
@@ -135,10 +135,11 @@ def releaseTime() {
     return new Date().format("yyMMddHHmm", TimeZone.getTimeZone("GMT+08:00"))
 
 }
+
 preBuild {
 
     doLast {
-        def imlFile = file( project.name + ".iml")
+        def imlFile = file(project.name + ".iml")
         println 'Change ' + project.name + '.iml order'
         try {
             def parsedXml = (new XmlParser()).parse(imlFile)
diff --git a/app/release/ICSer_V517_2012101455_release.apk b/app/release/ICSer_V517_2012101455_release.apk
new file mode 100644 (file)
index 0000000..f121b3d
Binary files /dev/null and b/app/release/ICSer_V517_2012101455_release.apk differ
index d751308..26a3d12 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":516,"versionName":"2009051621","enabled":true,"outputFile":"ICSer_V516_2009051621_release.apk","fullName":"release","baseName":"release"},"path":"ICSer_V516_2009051621_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":517,"versionName":"2012101455","enabled":true,"outputFile":"ICSer_V517_2012101455_release.apk","fullName":"release","baseName":"release"},"path":"ICSer_V517_2012101455_release.apk","properties":{}}]
\ No newline at end of file
index b3da421..c5afcd3 100644 (file)
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:supportsRtl="true"
-        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
-        >
-        <activity android:name=".toolActivity"></activity>
-        <activity android:name=".GPSActivity"></activity>
-        <activity android:name=".DeviceInfoActivity"></activity>
+        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
+        <activity android:name=".toolActivity" />
+        <activity android:name=".GPSActivity" />
+        <activity android:name=".DeviceInfoActivity" />
         <activity android:name=".MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
         <service android:name="se.wetcat.qatja.android.QatjaService"> <!-- MQTT协议通讯服务 -->
             <intent-filter>
                 <action android:name="com.ic.mqtt.startsrv" />
                 <action android:name="com.enqualcomm.support.HEART_ALARM" />
                 <action android:name="com.enqualcomm.support.ANTI_ALARM" />
                 <action android:name="com.enqualcomm.support.TEMP_ALARM" />
-                <action android:name="com.ic.action.CHECK_ANTIOFF_EVENT"/>
+                <action android:name="com.ic.action.CHECK_ANTIOFF_EVENT" />
             </intent-filter>
         </service>
         <service android:name=".CoreService$InnerService" />
                 <action android:name="com.ic.action.playtime" />
                 <action android:name="com.enqualcomm.support.ACTION_RETRY_SERVER_CONNECT" />
                 <action android:name="com.enqualcomm.support.ACTION_CHECK_LOCATION_RESULT" />
-                <action android:name= "com.ic.action.message_sent" />
-                <action android:name= "com.ic.action.temp_result" />
-                <action android:name= "com.ic.action.set_sit_range" />
+                <action android:name="com.ic.action.message_sent" />
+                <action android:name="com.ic.action.temp_result" />
+                <action android:name="com.ic.action.set_sit_range" />
                 <!-- <action android:name="com.eqc.heartrate.action.SILENT_START" /> -->
             </intent-filter>
         </receiver>
index f43d40f..a135646 100644 (file)
@@ -7,10 +7,10 @@ import android.content.Intent;
 import com.enqualcomm.support.utils.ICLogger;\r
 \r
 public class BootCompleteReceiver extends BroadcastReceiver {\r
-  public void onReceive(Context paramContext, Intent paramIntent) {\r
-    ICLogger.i("监听到开机广播");\r
-    paramContext.startService(new Intent(paramContext, com.enqualcomm.support.CoreService.class));\r
-  }\r
+    public void onReceive(Context paramContext, Intent paramIntent) {\r
+        ICLogger.i("监听到开机广播");\r
+        paramContext.startService(new Intent(paramContext, CoreService.class));\r
+    }\r
 }\r
 \r
 \r
index f4b16d7..6f310a3 100644 (file)
@@ -6,13 +6,10 @@ import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Color;
+import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.Message;
-import android.os.StatFs;
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.widget.TextView;
@@ -30,32 +27,26 @@ import java.io.FileOutputStream;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import chestnut.utils.RegexUtils;
-import rx.Observable;
-import rx.functions.Action1;
-
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 
 public class MainActivity extends Activity {
     TextView tv;
 
-    private boolean showmessage=false;
+    private boolean showmessage = false;
     private ScheduledThreadPoolExecutor timer;
-    Handler handler=new Handler(new Handler.Callback() {
+    Handler handler = new Handler(new Handler.Callback() {
         @Override
         public boolean handleMessage(Message message) {
 
-
-            StringBuilder sb=new StringBuilder();
+            StringBuilder sb = new StringBuilder();
             try {
-
                 if (showmessage) {
-                    if (CoreService.getInstance()!=null)
+                    if (CoreService.getInstance() != null)
                         sb.append(CoreService.getInstance().getServerAlive());
                     tv.setText(sb.toString());
                 }
 
-            }catch(Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
             }
 
@@ -63,21 +54,22 @@ public class MainActivity extends Activity {
             return false;
         }
     });
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         Button btnConnect = (Button) findViewById(R.id.btnConnect);
-        tv = (TextView)findViewById(R.id.textView);
+        tv = (TextView) findViewById(R.id.textView);
 
         btnConnect.setOnClickListener(clickListener);
 
-        Button tbtn = (Button)findViewById(R.id.btn_tools);
+        Button tbtn = (Button) findViewById(R.id.btn_tools);
         tbtn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                Intent intent=new Intent();
+                Intent intent = new Intent();
                 ComponentName var3 = new ComponentName("com.enqualcomm.support", "com.enqualcomm.support.toolActivity");
                 intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
                 intent.setComponent(var3);
@@ -85,7 +77,7 @@ public class MainActivity extends Activity {
             }
         });
 
-     //   tesetSharedKey();
+        //   tesetSharedKey();
 
 
 //               SimSignalUtil.send_at_to_onoff_simcard(CoreService.getInstance().runtime));
@@ -114,28 +106,28 @@ public class MainActivity extends Activity {
 //        ICLogger.i(" lat="+latitude+",lon="+longitude);
 
 
-        TextView tv_version=(TextView)findViewById(R.id.textViewVersion);
-        tv_version.setText(DeviceInfoUtil.getVersionCode(this)+"-"+DeviceInfoUtil.getVersionName(this));
+        TextView tv_version = (TextView) findViewById(R.id.textViewVersion);
+        tv_version.setText(DeviceInfoUtil.getVersionCode(this) + "-" + DeviceInfoUtil.getVersionName(this));
 //        testpic();
     }
 
     @Override
-    protected  void onResume() {
+    protected void onResume() {
         super.onResume();
-        timer=new ScheduledThreadPoolExecutor(10);
+        timer = new ScheduledThreadPoolExecutor(10);
         timer.scheduleAtFixedRate(new Runnable() {
             @Override
             public void run() {
                 handler.sendEmptyMessage(0);
             }
-        }, 0, 2000,TimeUnit.MILLISECONDS);
-        showmessage=true;
+        }, 0, 2000, TimeUnit.MILLISECONDS);
+        showmessage = true;
     }
 
     @Override
     protected void onPause() {
         super.onPause();
-        if (timer!=null) {
+        if (timer != null) {
             timer.shutdownNow();
 //            while(!timer.isTerminated())
 //            {
@@ -149,57 +141,57 @@ public class MainActivity extends Activity {
             timer.purge();
             timer = null;
         }
-        showmessage=false;
+        showmessage = false;
 
 
     }
 
-    public void testpic(){
+    public void testpic() {
 
-            String str = null;
-            try {
-                if (Environment.getExternalStorageState().equals("mounted")) {
+        String str = null;
+        try {
+            if (Environment.getExternalStorageState().equals("mounted")) {
 //                    if ((new StatFs(Environment.getExternalStorageDirectory().toString())).getAvailableBytes() < paramArrayOfByte.length)
 
-                    str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
-                    StringBuilder stringBuilder = new StringBuilder();
-                    stringBuilder.append(str);
-                    stringBuilder.append("/TakePhoto_080835");
-                    stringBuilder.append(".jpg");
-                    str = stringBuilder.toString();
-                    Bitmap bitmap2 =BitmapFactory.decodeFile(str);
+                str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
+                StringBuilder stringBuilder = new StringBuilder();
+                stringBuilder.append(str);
+                stringBuilder.append("/TakePhoto_080835");
+                stringBuilder.append(".jpg");
+                str = stringBuilder.toString();
+                Bitmap bitmap2 = BitmapFactory.decodeFile(str);
 //                    Bitmap bitmap2 = BitmapFactory.decodeByteArray(paramArrayOfByte, 0, paramArrayOfByte.length);
 //                    Bitmap bitmap1 = bitmap2;
-                    Bitmap bitmap3 = bitmap2;
-                    if ((this.getResources().getConfiguration()).orientation == 1) {
+                Bitmap bitmap3 = bitmap2;
+                if ((this.getResources().getConfiguration()).orientation == 1) {
 //                        Matrix matrix = new Matrix();
 //                        matrix.reset();
-                        //   matrix.postRotate(this.mOrientation);
-                        // bitmap1 = Bitmap.createBitmap(bitmap2, 0, 0, bitmap2.getWidth(), bitmap2.getHeight(), matrix, true);
-
-                    }
-                    bitmap3 = ImageUtil.drawTextToLeftTop(this,bitmap2, TimeUtil.getSystemTime(),24, Color.RED, 20, 20);
-                    str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
-                    stringBuilder = new StringBuilder();
-                    stringBuilder.append(str);
-                    stringBuilder.append("/TakePhoto_0808352");
-                    stringBuilder.append(".jpg");
-                    str = stringBuilder.toString();
-                    File file = new File(str);
-                    if (!file.exists())
-                        file.createNewFile();
-                    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
-                    bitmap3.compress(Bitmap.CompressFormat.JPEG, 100, bufferedOutputStream);
-                    bufferedOutputStream.flush();
-                    bufferedOutputStream.close();
-
-                    ICLogger.i("Take Photo and Save to "+str);
+                    //   matrix.postRotate(this.mOrientation);
+                    // bitmap1 = Bitmap.createBitmap(bitmap2, 0, 0, bitmap2.getWidth(), bitmap2.getHeight(), matrix, true);
+
                 }
+                bitmap3 = ImageUtil.drawTextToLeftTop(this, bitmap2, TimeUtil.getSystemTime(), 24, Color.RED, 20, 20);
+                str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
+                stringBuilder = new StringBuilder();
+                stringBuilder.append(str);
+                stringBuilder.append("/TakePhoto_0808352");
+                stringBuilder.append(".jpg");
+                str = stringBuilder.toString();
+                File file = new File(str);
+                if (!file.exists())
+                    file.createNewFile();
+                BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
+                bitmap3.compress(Bitmap.CompressFormat.JPEG, 100, bufferedOutputStream);
+                bufferedOutputStream.flush();
+                bufferedOutputStream.close();
+
+                ICLogger.i("Take Photo and Save to " + str);
+            }
 
-            } catch (Exception e) {
-                e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
 
-            }
+        }
 
 
     }
@@ -210,9 +202,9 @@ public class MainActivity extends Activity {
             switch (view.getId()) {
                 case R.id.btnConnect:
                     //进行连接Socket:这里使用的是,在本地上开启了一个服务器。
-                    if (CoreService.getInstance()!=null)
-                    Util.ShowToast(CoreService.getInstance().runtime,"Start ProtocolService!");
-                    startService(new Intent(MainActivity.this,CoreService.class));// protocol service
+                    if (CoreService.getInstance() != null)
+                        Util.ShowToast(CoreService.getInstance().runtime, "Start ProtocolService!");
+                    startService(new Intent(MainActivity.this, CoreService.class));// protocol service
 
 //                    Observable.timer(5000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {
 //
@@ -236,13 +228,13 @@ public class MainActivity extends Activity {
     };
 
 
-    public void tesetSharedKey(){
-            Config.setSleepScore(this,344);
-            Config.setSleepDate(this,TimeUtil.getSystemTime3());
-            Config.setKeepSitRangeInMinutes(this,3);
-        ICLogger.d("SHAREKEY_SETTING_SLEEP_SCORE_DATE "+ SharPreferenceUtil.getPrefStringPublic(this,Constants.SHAREKEY_SETTING_SLEEP_SCORE_DATE,""));
-        ICLogger.d("SHAREKEY_SETTING_SLEEP_SCORE "+ SharPreferenceUtil.getPrefIntPublic(this,Constants.SHAREKEY_SETTING_SLEEP_SCORE,0));
-        ICLogger.d("SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES "+ SharPreferenceUtil.getPrefIntPublic(this,Constants.SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES,0));
+    public void tesetSharedKey() {
+        Config.setSleepScore(this, 344);
+        Config.setSleepDate(this, TimeUtil.getSystemTime3());
+        Config.setKeepSitRangeInMinutes(this, 3);
+        ICLogger.d("SHAREKEY_SETTING_SLEEP_SCORE_DATE " + SharPreferenceUtil.getPrefStringPublic(this, Constants.SHAREKEY_SETTING_SLEEP_SCORE_DATE, ""));
+        ICLogger.d("SHAREKEY_SETTING_SLEEP_SCORE " + SharPreferenceUtil.getPrefIntPublic(this, Constants.SHAREKEY_SETTING_SLEEP_SCORE, 0));
+        ICLogger.d("SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES " + SharPreferenceUtil.getPrefIntPublic(this, Constants.SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES, 0));
 
     }
 }
index 4bb6997..1b6e9ed 100644 (file)
@@ -13,20 +13,17 @@ import android.os.Handler;
 import android.os.Message;\r
 import android.os.Messenger;\r
 import android.telephony.PhoneStateListener;\r
-import android.telephony.PreciseCallState;\r
 import android.telephony.TelephonyManager;\r
 \r
 import com.enqualcomm.support.Config;\r
 import com.enqualcomm.support.CoreService;\r
 import com.enqualcomm.support.ICContentProvider;\r
-import com.enqualcomm.support.MainActivity;\r
 import com.enqualcomm.support.bean.Alarm;\r
 import com.enqualcomm.support.bean.Antioff;\r
 import com.enqualcomm.support.bean.NoticeContent;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.bean.Silent;\r
 import com.enqualcomm.support.bean.StheartRate;\r
-\r
 import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;\r
 import com.enqualcomm.support.utils.AlarmHelper;\r
 import com.enqualcomm.support.utils.Connection;\r
@@ -36,7 +33,6 @@ import com.enqualcomm.support.utils.ICLogger;
 import com.enqualcomm.support.utils.MissedCallContentObserver;\r
 import com.enqualcomm.support.utils.SharPreferenceUtil;\r
 import com.enqualcomm.support.utils.TimeUtil;\r
-import com.enqualcomm.support.utils.Util;\r
 \r
 import java.util.ArrayList;\r
 import java.util.Calendar;\r
@@ -47,832 +43,828 @@ import java.util.concurrent.TimeUnit;
 import rx.Observable;\r
 import rx.functions.Action1;\r
 \r
-import static android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED;\r
 import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;\r
 import static android.telephony.TelephonyManager.CALL_STATE_RINGING;\r
 import static com.enqualcomm.support.Constants.ACTION_CARE_ALARM;\r
 import static com.enqualcomm.support.Constants.ACTION_CLOSE_UNREAD_MSG;\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
 import static com.enqualcomm.support.Constants.SERVICE_CLS_NAME;\r
 import static com.enqualcomm.support.Constants.SERVICE_PKG_NAME;\r
 \r
 public class SilentManager extends AbstractInvokeHandlerService {\r
-  private static final long ONE_WEEK = 604800000L;\r
-  private static final long ONE_DAY = 86400000L;\r
-\r
-  private ArrayList<Alarm> alarms;\r
-  private boolean haveHandSilence;\r
-  private boolean isCalling;\r
-  AlarmManager mAlarmManager;\r
-  private SilentManager.AlramReceiver mAlramReceiver;\r
-  Connection mConnection;\r
-  ContentObserver mContentObserver = new ContentObserver(new Handler()) {\r
-    public void onChange(boolean var1) {\r
-      ICLogger.i("静默有变化");\r
-      SilentManager.this.silentList = SilentManager.this.querySilent();\r
-      SilentManager.this.getSilentListStartAndEndTime();\r
-      SilentManager.this.handleSilent(mRuntime, true);\r
+    private static final long ONE_WEEK = 604800000L;\r
+    private static final long ONE_DAY = 86400000L;\r
+\r
+    private ArrayList<Alarm> alarms;\r
+    private boolean haveHandSilence;\r
+    private boolean isCalling;\r
+    AlarmManager mAlarmManager;\r
+    private SilentManager.AlramReceiver mAlramReceiver;\r
+    Connection mConnection;\r
+    ContentObserver mContentObserver = new ContentObserver(new Handler()) {\r
+        public void onChange(boolean var1) {\r
+            ICLogger.i("静默有变化");\r
+            SilentManager.this.silentList = SilentManager.this.querySilent();\r
+            SilentManager.this.getSilentListStartAndEndTime();\r
+            SilentManager.this.handleSilent(mRuntime, true);\r
+        }\r
+    };\r
+    private Context mContext;\r
+    private DBHelper mDbHelper;\r
+    private boolean mInSilent;\r
+    private String mInterval;\r
+    private boolean mIsNeedAntioff;\r
+    private boolean mIsStheartRate;\r
+    private MissedCallContentObserver mMissedCallContentObserver;\r
+    Runtime mRuntime;\r
+    private int mStheartRateInterval;\r
+    private int mTodayWeek;\r
+    private boolean mValue_isSilence;\r
+\r
+    public static final int PRECISE_CALL_STATE_NOT_VALID = -1;\r
+    public static final int PRECISE_CALL_STATE_IDLE = 0;  //空闲\r
+    public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话\r
+    public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起\r
+    public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始\r
+    public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出\r
+    public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电\r
+    public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待\r
+    public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成\r
+    public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断\r
+\r
+    private static SilentManager mSilentManger = null;\r
+\r
+    public static SilentManager getInstance() {\r
+        if (mSilentManger == null)\r
+            mSilentManger = new SilentManager();\r
+        return mSilentManger;\r
     }\r
-  };\r
-  private Context mContext;\r
-  private DBHelper mDbHelper;\r
-  private boolean mInSilent;\r
-  private String mInterval;\r
-  private boolean mIsNeedAntioff;\r
-  private boolean mIsStheartRate;\r
-  private MissedCallContentObserver mMissedCallContentObserver;\r
-  Runtime mRuntime;\r
-  private int mStheartRateInterval;\r
-  private int mTodayWeek;\r
-  private boolean mValue_isSilence;\r
-\r
-  public static final int PRECISE_CALL_STATE_NOT_VALID = -1;\r
-  public static final int PRECISE_CALL_STATE_IDLE = 0;  //空闲\r
-  public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话\r
-  public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起\r
-  public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始\r
-  public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出\r
-  public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电\r
-  public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待\r
-  public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成\r
-  public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断\r
-\r
-  private static SilentManager mSilentManger=null;\r
-\r
-  public static SilentManager getInstance(){\r
-    if (mSilentManger==null)\r
-      mSilentManger=new SilentManager();\r
-    return mSilentManger;\r
-  }\r
-  private PhoneStateListener phoneStateListener = new PhoneStateListener() {\r
-    public void onCallStateChanged(int state, String incomingNumber) {\r
-      super.onCallStateChanged(state, incomingNumber);\r
-\r
-      ICLogger.i("========onCallStateChanged state "+state+", incomingNumber "+incomingNumber);\r
-      switch(state) {\r
-        case PRECISE_CALL_STATE_DISCONNECTING: //挂电话\r
-        case PRECISE_CALL_STATE_DISCONNECTED: //挂电话\r
-          isCalling = false;\r
+\r
+    private PhoneStateListener phoneStateListener = new PhoneStateListener() {\r
+        public void onCallStateChanged(int state, String incomingNumber) {\r
+            super.onCallStateChanged(state, incomingNumber);\r
+\r
+            ICLogger.i("========onCallStateChanged state " + state + ", incomingNumber " + incomingNumber);\r
+            switch (state) {\r
+                case PRECISE_CALL_STATE_DISCONNECTING: //挂电话\r
+                case PRECISE_CALL_STATE_DISCONNECTED: //挂电话\r
+                    isCalling = false;\r
 //          if (SilentManager.this.haveHandSilence) {\r
 //            SilentManager.this.handSilence(SilentManager.this.mContext, SilentManager.this.mValue_isSilence);\r
 //          }\r
-          if(ICAudioManager.needMute==true)\r
-          {\r
+                    if (ICAudioManager.needMute == true) {\r
 //            ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
-            Observable.timer(2000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
-              public void call(Long param1Long) {\r
-                ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
-                ICAudioManager.needMute=false;\r
-              }\r
-            });\r
-\r
-          }\r
-          ICLogger.i("========Hung up!");\r
-          break;\r
-        case PRECISE_CALL_STATE_INCOMING: //来电\r
-        case PRECISE_CALL_STATE_ALERTING:\r
-        case PRECISE_CALL_STATE_DIALING:\r
-          isCalling = true;\r
-          Intent var3 = new Intent();\r
-          var3.setAction(ACTION_CLOSE_UNREAD_MSG);\r
-          mContext.sendBroadcast(var3);\r
-\r
-          ICLogger.i("========Ring!");\r
-          if(ICAudioManager.needMute==true)\r
-          {\r
-            ICAudioManager.setVolumnMute(mContext);\r
-            Observable.timer(2000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
-              public void call(Long param1Long) {\r
-                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
-              }\r
-            });\r
-\r
-          }\r
-          break;\r
-        case PRECISE_CALL_STATE_ACTIVE://接电话\r
-        {\r
-          if (ICAudioManager.needMute == false){\r
-            if (Config.custom_branch_name.equals("AK"))\r
-              ICAudioManager.setVoiceCallMaxVolumn(mContext); //设置最大音量\r
-          }\r
+                        Observable.timer(2000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
+                            public void call(Long param1Long) {\r
+                                ICAudioManager.restoreVolumn(mContext); //2秒后恢复音量\r
+                                ICAudioManager.needMute = false;\r
+                            }\r
+                        });\r
+\r
+                    }\r
+                    ICLogger.i("========Hung up!");\r
+                    break;\r
+                case PRECISE_CALL_STATE_INCOMING: //来电\r
+                case PRECISE_CALL_STATE_ALERTING:\r
+                case PRECISE_CALL_STATE_DIALING:\r
+                    isCalling = true;\r
+                    Intent var3 = new Intent();\r
+                    var3.setAction(ACTION_CLOSE_UNREAD_MSG);\r
+                    mContext.sendBroadcast(var3);\r
+\r
+                    ICLogger.i("========Ring!");\r
+                    if (ICAudioManager.needMute == true) {\r
+                        ICAudioManager.setVolumnMute(mContext);\r
+                        Observable.timer(2000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
+                            public void call(Long param1Long) {\r
+                                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
+                            }\r
+                        });\r
+\r
+                    }\r
+                    break;\r
+                case PRECISE_CALL_STATE_ACTIVE://接电话\r
+                {\r
+                    if (ICAudioManager.needMute == false) {\r
+                        if (Config.custom_branch_name.equals("AK"))\r
+                            ICAudioManager.setVoiceCallMaxVolumn(mContext); //设置最大音量\r
+                    }\r
+                }\r
+                case PRECISE_CALL_STATE_HOLDING://接电话\r
+                case PRECISE_CALL_STATE_WAITING:\r
+                    isCalling = true;\r
+                    ICLogger.i("========Answer Call !");\r
+                    if (ICAudioManager.needMute == true) {\r
+                        ICAudioManager.setVolumnMute(mContext);\r
+                        Observable.timer(2000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
+                            public void call(Long param1Long) {\r
+                                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
+                            }\r
+                        });\r
+                    }\r
+\r
+            }\r
+\r
         }\r
-        case PRECISE_CALL_STATE_HOLDING://接电话\r
-        case PRECISE_CALL_STATE_WAITING:\r
-          isCalling = true;\r
-          ICLogger.i("========Answer Call !");\r
-          if(ICAudioManager.needMute==true)\r
-          {\r
-            ICAudioManager.setVolumnMute(mContext);\r
-            Observable.timer(2000L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
-              public void call(Long param1Long) {\r
-                ICAudioManager.setVolumnMute(mContext); //2秒后恢复音量\r
-              }\r
-            });\r
-          }\r
-\r
-      }\r
+    };\r
+    private ArrayList<Antioff> sAntioffList;\r
+    private ArrayList<Silent> silentList;\r
+    private ArrayList<StheartRate> stheartRateList;\r
+    private ArrayList<NoticeContent> voiceNotice;\r
 \r
-    }\r
-  };\r
-  private ArrayList<Antioff> sAntioffList;\r
-  private ArrayList<Silent> silentList;\r
-  private ArrayList<StheartRate> stheartRateList;\r
-  private ArrayList<NoticeContent> voiceNotice;\r
-\r
-  public SilentManager() {\r
-  }\r
-\r
-  private void callback(Messenger var1, boolean var2) {\r
-    short var3;\r
-    if (var2) {\r
-      var3 = 600;\r
-    } else {\r
-      var3 = 700;\r
+    public SilentManager() {\r
     }\r
 \r
-    if (var1 != null) {\r
-      try {\r
-        var1.send(Message.obtain((Handler)null, var3));\r
-      } catch (Exception var4) {\r
-        var4.printStackTrace();\r
-      }\r
-    }\r
+    private void callback(Messenger var1, boolean var2) {\r
+        short var3;\r
+        if (var2) {\r
+            var3 = 600;\r
+        } else {\r
+            var3 = 700;\r
+        }\r
 \r
-  }\r
+        if (var1 != null) {\r
+            try {\r
+                var1.send(Message.obtain((Handler) null, var3));\r
+            } catch (Exception var4) {\r
+                var4.printStackTrace();\r
+            }\r
+        }\r
 \r
-  private void cancelAlarm(ArrayList<Alarm> var1) {\r
-    Iterator var2 = var1.iterator();\r
+    }\r
 \r
-    while(var2.hasNext()) {\r
-      Alarm var3 = (Alarm)var2.next();\r
-      String var10 = var3.time;\r
-      String var4 = var3.week;\r
-      String var5 = var3.ring;\r
-      String var11 = var3.name;\r
-      char[] var6 = var4.toCharArray();\r
-      int var7 = var6.length;\r
+    private void cancelAlarm(ArrayList<Alarm> var1) {\r
+        Iterator var2 = var1.iterator();\r
+\r
+        while (var2.hasNext()) {\r
+            Alarm var3 = (Alarm) var2.next();\r
+            String var10 = var3.time;\r
+            String var4 = var3.week;\r
+            String var5 = var3.ring;\r
+            String var11 = var3.name;\r
+            char[] var6 = var4.toCharArray();\r
+            int var7 = var6.length;\r
+\r
+            for (int var8 = 1; var8 < var7; ++var8) {\r
+                char var9 = var6[var8];\r
+                this.mAlarmManager.cancel(this.getPendingIntent(var10, var4, var5, var11, var9 - 47));\r
+            }\r
+        }\r
 \r
-      for(int var8 = 1; var8 < var7; ++var8) {\r
-        char var9 = var6[var8];\r
-        this.mAlarmManager.cancel(this.getPendingIntent(var10, var4, var5, var11, var9 - 47));\r
-      }\r
     }\r
 \r
-  }\r
-\r
-  private void cancelNoticeAlarm(ArrayList<NoticeContent> var1) {\r
-    Iterator var2 = var1.iterator();\r
-\r
-    while(var2.hasNext()) {\r
-      NoticeContent var3 = (NoticeContent)var2.next();\r
-      String var4 = var3.noticeTime;\r
-      String var9 = var3.noticeName;\r
-      String var5 = var3.noticeNumber;\r
-      String var6 = var3.noticeID;\r
-      String var7 = var3.noticeCategory;\r
-      String var8 = var3.noticeFrequency;\r
-      String var10 = var3.noticeContent;\r
-      this.mAlarmManager.cancel(this.getPendingIntent(var4, var9, var5, var6, var7, var8, var10));\r
-    }\r
+    private void cancelNoticeAlarm(ArrayList<NoticeContent> var1) {\r
+        Iterator var2 = var1.iterator();\r
+\r
+        while (var2.hasNext()) {\r
+            NoticeContent var3 = (NoticeContent) var2.next();\r
+            String var4 = var3.noticeTime;\r
+            String var9 = var3.noticeName;\r
+            String var5 = var3.noticeNumber;\r
+            String var6 = var3.noticeID;\r
+            String var7 = var3.noticeCategory;\r
+            String var8 = var3.noticeFrequency;\r
+            String var10 = var3.noticeContent;\r
+            this.mAlarmManager.cancel(this.getPendingIntent(var4, var9, var5, var6, var7, var8, var10));\r
+        }\r
 \r
-  }\r
-\r
-  private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, int var5) {\r
-    StringBuilder var6 = new StringBuilder("alarm:");\r
-    var6.append(var1);\r
-    var6.append(",");\r
-    var6.append(var2);\r
-    var6.append(",");\r
-    var6.append(var3);\r
-    var6.append(",");\r
-    var6.append(var4);\r
-    var6.append(",");\r
-    var6.append(var5);\r
-    var2 = var6.toString();\r
-    Intent var7 = new Intent(this.mContext, CoreService.class);\r
-    var7.setAction(ACTION_CARE_ALARM);\r
-    var7.setData(Uri.parse(var2));\r
-    return PendingIntent.getService(this.mContext, 0, var7, PendingIntent.FLAG_UPDATE_CURRENT);\r
-  }\r
-\r
-  private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, String var5, String var6, String var7) {\r
-    StringBuilder var8 = new StringBuilder("notice:");\r
-    var8.append(var1);\r
-    var8.append(",");\r
-    var8.append(var2);\r
-    var8.append(",");\r
-    var8.append(var3);\r
-    var8.append(",");\r
-    var8.append(var4);\r
-    var8.append(",");\r
-    var8.append(var5);\r
-    var8.append(",");\r
-    var8.append(var6);\r
-    var8.append(",");\r
-    var8.append(var7);\r
-    var1 = var8.toString();\r
-    Intent var9 = new Intent(this.mContext, CoreService.class);\r
-    var9.setAction("com.enqualcomm.support.ACTION_NOTICE_ALARM");\r
-    var9.setData(Uri.parse(var1));\r
-    return PendingIntent.getService(this.mContext, 0, var9, PendingIntent.FLAG_UPDATE_CURRENT);\r
-  }\r
-\r
-  private void getSilentListStartAndEndTime() {\r
-    Calendar var1 = Calendar.getInstance();\r
-    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
-    Silent var3;\r
-    for(Iterator var2 = this.silentList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
-      var3 = (Silent)var2.next();\r
-      var1.set(Calendar.SECOND, 0);\r
-      int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
-      int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-      var3.startTimeMillis = var1.getTimeInMillis();\r
-      var5 = Integer.parseInt(var3.end.substring(2, 4));\r
-      var4 = Integer.parseInt(var3.end.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var5);\r
-      var1.set(Calendar.MINUTE, var4);\r
     }\r
 \r
-  }\r
-\r
-  private void getStartAndEndSantioffTime() {\r
-    Calendar var1 = Calendar.getInstance();\r
-    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
-    Antioff var3;\r
-    for(Iterator var2 = this.sAntioffList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
-      var3 = (Antioff)var2.next();\r
-      var1.set(Calendar.SECOND, 0);\r
-      int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
-      int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-      var3.startTimeMillis = var1.getTimeInMillis();\r
-      var4 = Integer.parseInt(var3.end.substring(2, 4));\r
-      var5 = Integer.parseInt(var3.end.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
+    private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, int var5) {\r
+        StringBuilder var6 = new StringBuilder("alarm:");\r
+        var6.append(var1);\r
+        var6.append(",");\r
+        var6.append(var2);\r
+        var6.append(",");\r
+        var6.append(var3);\r
+        var6.append(",");\r
+        var6.append(var4);\r
+        var6.append(",");\r
+        var6.append(var5);\r
+        var2 = var6.toString();\r
+        Intent var7 = new Intent(this.mContext, CoreService.class);\r
+        var7.setAction(ACTION_CARE_ALARM);\r
+        var7.setData(Uri.parse(var2));\r
+        return PendingIntent.getService(this.mContext, 0, var7, PendingIntent.FLAG_UPDATE_CURRENT);\r
     }\r
 \r
-  }\r
-\r
-  private void getStartAndEndStheartRateTime() {\r
-    Calendar var1 = Calendar.getInstance();\r
-    this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
-\r
-    StheartRate var3;\r
-    for(Iterator var2 = this.stheartRateList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
-      var3 = (StheartRate)var2.next();\r
-      var1.set(Calendar.SECOND, 0);\r
-      int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
-      int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
-      var3.startTimeMillis = var1.getTimeInMillis();\r
-      var4 = Integer.parseInt(var3.end.substring(2, 4));\r
-      var5 = Integer.parseInt(var3.end.substring(5, 7));\r
-      var1.set(Calendar.HOUR_OF_DAY, var4);\r
-      var1.set(Calendar.MINUTE, var5);\r
+    private PendingIntent getPendingIntent(String var1, String var2, String var3, String var4, String var5, String var6, String var7) {\r
+        StringBuilder var8 = new StringBuilder("notice:");\r
+        var8.append(var1);\r
+        var8.append(",");\r
+        var8.append(var2);\r
+        var8.append(",");\r
+        var8.append(var3);\r
+        var8.append(",");\r
+        var8.append(var4);\r
+        var8.append(",");\r
+        var8.append(var5);\r
+        var8.append(",");\r
+        var8.append(var6);\r
+        var8.append(",");\r
+        var8.append(var7);\r
+        var1 = var8.toString();\r
+        Intent var9 = new Intent(this.mContext, CoreService.class);\r
+        var9.setAction("com.enqualcomm.support.ACTION_NOTICE_ALARM");\r
+        var9.setData(Uri.parse(var1));\r
+        return PendingIntent.getService(this.mContext, 0, var9, PendingIntent.FLAG_UPDATE_CURRENT);\r
     }\r
 \r
-  }\r
-\r
-  private void handSilence(Context var1, boolean var2) {\r
-    this.mValue_isSilence = var2;\r
-    if (this.isCalling) {\r
-      this.haveHandSilence = true;\r
-    } else {\r
-      this.haveHandSilence = false;\r
-      SharPreferenceUtil.setPrefBoolean(var1, "KEY_ISSILENCE", var2);\r
-      Intent var3 = new Intent();\r
-      var3.setAction("com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE");\r
-      var3.putExtra("KEY_ISSILENCE", var2);\r
-      var1.sendBroadcast(var3);\r
-      ComponentName var4 = new ComponentName(SERVICE_PKG_NAME, SERVICE_CLS_NAME);\r
-      Intent var5 = (new Intent("com.enqualcomm.support.ACTION_VIDEO_END_CALL")).setComponent(var4);\r
-      this.mRuntime.getContextProxy().context.startService(var5);\r
-    }\r
-  }\r
+    private void getSilentListStartAndEndTime() {\r
+        Calendar var1 = Calendar.getInstance();\r
+        this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
+\r
+        Silent var3;\r
+        for (Iterator var2 = this.silentList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
+            var3 = (Silent) var2.next();\r
+            var1.set(Calendar.SECOND, 0);\r
+            int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
+            int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
+            var1.set(Calendar.HOUR_OF_DAY, var4);\r
+            var1.set(Calendar.MINUTE, var5);\r
+            var3.startTimeMillis = var1.getTimeInMillis();\r
+            var5 = Integer.parseInt(var3.end.substring(2, 4));\r
+            var4 = Integer.parseInt(var3.end.substring(5, 7));\r
+            var1.set(Calendar.HOUR_OF_DAY, var5);\r
+            var1.set(Calendar.MINUTE, var4);\r
+        }\r
 \r
-  private void handleSilent(Runtime var1, boolean var2) {\r
-    int var3 = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);\r
-    if (var3 != this.mTodayWeek && (var3 != 1 || this.mTodayWeek != 8)) {\r
-      this.getSilentListStartAndEndTime();\r
-      this.queryNotice();\r
     }\r
 \r
-    boolean var4 = this.isSilentTime();\r
-    StringBuilder var5 = new StringBuilder();\r
-    var5.append("inSilent=");\r
-    var5.append(var4);\r
-    ICLogger.i(var5.toString());\r
-    if (!this.mInSilent && var4) {\r
-      this.onSilentStateChange(true);\r
-      this.handSilence(this.mContext, true);\r
-      this.mDbHelper.upDateStatus("ON");\r
-    } else if (this.mInSilent && !var4) {\r
-      this.onSilentStateChange(false);\r
-      this.mDbHelper.upDateStatus("OFF");\r
-      this.handSilence(this.mContext, false);\r
-    }\r
+    private void getStartAndEndSantioffTime() {\r
+        Calendar var1 = Calendar.getInstance();\r
+        this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
+\r
+        Antioff var3;\r
+        for (Iterator var2 = this.sAntioffList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
+            var3 = (Antioff) var2.next();\r
+            var1.set(Calendar.SECOND, 0);\r
+            int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
+            int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
+            var1.set(Calendar.HOUR_OF_DAY, var4);\r
+            var1.set(Calendar.MINUTE, var5);\r
+            var3.startTimeMillis = var1.getTimeInMillis();\r
+            var4 = Integer.parseInt(var3.end.substring(2, 4));\r
+            var5 = Integer.parseInt(var3.end.substring(5, 7));\r
+            var1.set(Calendar.HOUR_OF_DAY, var4);\r
+            var1.set(Calendar.MINUTE, var5);\r
+        }\r
 \r
-    this.mInSilent = var4;\r
-    this.getStartAndEndStheartRateTime();\r
-    this.isStheartRateTime(var2);\r
-  }\r
-\r
-  private boolean isIdle(Context context) {\r
-    int callstate = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getCallState();\r
-    boolean isidle;\r
-    if (CALL_STATE_RINGING != callstate && CALL_STATE_OFFHOOK != callstate) {\r
-      isidle = true;\r
-    } else {\r
-      isidle = false;\r
     }\r
 \r
-    return isidle && !this.mInSilent && !this.mRuntime.getBatteryLow();\r
-  }\r
+    private void getStartAndEndStheartRateTime() {\r
+        Calendar var1 = Calendar.getInstance();\r
+        this.mTodayWeek = var1.get(Calendar.DAY_OF_WEEK);\r
+\r
+        StheartRate var3;\r
+        for (Iterator var2 = this.stheartRateList.iterator(); var2.hasNext(); var3.endTimeMillis = var1.getTimeInMillis()) {\r
+            var3 = (StheartRate) var2.next();\r
+            var1.set(Calendar.SECOND, 0);\r
+            int var4 = Integer.parseInt(var3.start.substring(2, 4));\r
+            int var5 = Integer.parseInt(var3.start.substring(5, 7));\r
+            var1.set(Calendar.HOUR_OF_DAY, var4);\r
+            var1.set(Calendar.MINUTE, var5);\r
+            var3.startTimeMillis = var1.getTimeInMillis();\r
+            var4 = Integer.parseInt(var3.end.substring(2, 4));\r
+            var5 = Integer.parseInt(var3.end.substring(5, 7));\r
+            var1.set(Calendar.HOUR_OF_DAY, var4);\r
+            var1.set(Calendar.MINUTE, var5);\r
+        }\r
 \r
-  private boolean isAntioffTime(boolean var1) {\r
-    long var2 = System.currentTimeMillis();\r
-    ArrayList var4 = this.sAntioffList;\r
-    int var5 = this.mTodayWeek;\r
-    var1 = true;\r
-    if (var5 == 1) {\r
-      this.mTodayWeek += 7;\r
     }\r
 \r
-    Iterator var12 = var4.iterator();\r
-\r
-    while(true) {\r
-      if (!var12.hasNext()) {\r
-        var1 = false;\r
-        break;\r
-      }\r
-\r
-      Antioff var6 = (Antioff)var12.next();\r
-      String var7 = var6.week;\r
-      StringBuilder var8 = new StringBuilder();\r
-      var8.append(this.mTodayWeek - 1);\r
-      var8.append("");\r
-      if (var7.contains(var8.toString())) {\r
-        long var9 = var6.startTimeMillis - var2;\r
-        int var11;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var6.start.substring(2, 4));\r
-          var5 = Integer.parseInt(var6.start.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_START");\r
-          var8 = new StringBuilder();\r
-          var8.append("设置起始时间=hour");\r
-          var8.append(var11);\r
-          var8.append("minute+");\r
-          var8.append(var5);\r
-          ICLogger.i(var8.toString());\r
+    private void handSilence(Context var1, boolean var2) {\r
+        this.mValue_isSilence = var2;\r
+        if (this.isCalling) {\r
+            this.haveHandSilence = true;\r
+        } else {\r
+            this.haveHandSilence = false;\r
+            SharPreferenceUtil.setPrefBoolean(var1, "KEY_ISSILENCE", var2);\r
+            Intent var3 = new Intent();\r
+            var3.setAction("com.enqualcomm.support.ACTION_ISSILENCE2IMESSAGE");\r
+            var3.putExtra("KEY_ISSILENCE", var2);\r
+            var1.sendBroadcast(var3);\r
+            ComponentName var4 = new ComponentName(SERVICE_PKG_NAME, SERVICE_CLS_NAME);\r
+            Intent var5 = (new Intent("com.enqualcomm.support.ACTION_VIDEO_END_CALL")).setComponent(var4);\r
+            this.mRuntime.getContextProxy().context.startService(var5);\r
         }\r
+    }\r
 \r
-        var9 = var6.endTimeMillis - var2;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var6.end.substring(2, 4));\r
-          var5 = Integer.parseInt(var6.end.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_END");\r
-          var8 = new StringBuilder();\r
-          var8.append("设置结束时间=hour");\r
-          var8.append(var11);\r
-          var8.append("minute+");\r
-          var8.append(var5);\r
-          ICLogger.i(var8.toString());\r
+    private void handleSilent(Runtime var1, boolean var2) {\r
+        int var3 = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);\r
+        if (var3 != this.mTodayWeek && (var3 != 1 || this.mTodayWeek != 8)) {\r
+            this.getSilentListStartAndEndTime();\r
+            this.queryNotice();\r
         }\r
 \r
-        if (var6.startTimeMillis <= var2 && var6.endTimeMillis > var2) {\r
-          break;\r
+        boolean var4 = this.isSilentTime();\r
+        StringBuilder var5 = new StringBuilder();\r
+        var5.append("inSilent=");\r
+        var5.append(var4);\r
+        ICLogger.i(var5.toString());\r
+        if (!this.mInSilent && var4) {\r
+            this.onSilentStateChange(true);\r
+            this.handSilence(this.mContext, true);\r
+            this.mDbHelper.upDateStatus("ON");\r
+        } else if (this.mInSilent && !var4) {\r
+            this.onSilentStateChange(false);\r
+            this.mDbHelper.upDateStatus("OFF");\r
+            this.handSilence(this.mContext, false);\r
         }\r
-      }\r
-    }\r
 \r
-    this.mRuntime.setAntioffStatus(var1);\r
-    return var1;\r
-  }\r
-\r
-  private boolean isSilentTime() {\r
-    long var1 = System.currentTimeMillis();\r
-    ArrayList var3 = this.silentList;\r
-    int var4 = this.mTodayWeek;\r
-    boolean var5 = false; //默认不在silent时间段\r
-    if (var4 == 1) {\r
-      this.mTodayWeek += 7;\r
+        this.mInSilent = var4;\r
+        this.getStartAndEndStheartRateTime();\r
+        this.isStheartRateTime(var2);\r
     }\r
 \r
-    Iterator var6 = var3.iterator();\r
-\r
-    while(true) {\r
-      if (!var6.hasNext()) {\r
-        var5 = false;\r
-        break;\r
-      }\r
-\r
-      Silent var12 = (Silent)var6.next();\r
-      String var7 = var12.week;\r
-      StringBuilder var8 = new StringBuilder();\r
-      var8.append(this.mTodayWeek - 1);\r
-      var8.append("");\r
-      if (var7.contains(var8.toString())) {\r
-        long var9 = var12.startTimeMillis - var1;\r
-        int var11;\r
-        StringBuilder var13;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var12.start.substring(2, 4));\r
-          var4 = Integer.parseInt(var12.start.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_START");\r
-          var13 = new StringBuilder();\r
-          var13.append("设置起始时间=hour");\r
-          var13.append(var11);\r
-          var13.append("minute+");\r
-          var13.append(var4);\r
-          ICLogger.i(var13.toString());\r
+    private boolean isIdle(Context context) {\r
+        int callstate = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getCallState();\r
+        boolean isidle;\r
+        if (CALL_STATE_RINGING != callstate && CALL_STATE_OFFHOOK != callstate) {\r
+            isidle = true;\r
+        } else {\r
+            isidle = false;\r
         }\r
 \r
-        var9 = var12.endTimeMillis - var1;\r
-        if (var9 < (long)(CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
-          var11 = Integer.parseInt(var12.end.substring(2, 4));\r
-          var4 = Integer.parseInt(var12.end.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_END");\r
-          var13 = new StringBuilder();\r
-          var13.append("设置结束时间=hour");\r
-          var13.append(var11);\r
-          var13.append("minute+");\r
-          var13.append(var4);\r
-          ICLogger.i(var13.toString());\r
-        }\r
+        return isidle && !this.mInSilent && !this.mRuntime.getBatteryLow();\r
+    }\r
 \r
-        if (var12.startTimeMillis <= var1 && var12.endTimeMillis > var1) {\r
-          break;\r
+    private boolean isAntioffTime(boolean var1) {\r
+        long var2 = System.currentTimeMillis();\r
+        ArrayList var4 = this.sAntioffList;\r
+        int var5 = this.mTodayWeek;\r
+        var1 = true;\r
+        if (var5 == 1) {\r
+            this.mTodayWeek += 7;\r
         }\r
-      }\r
-    }\r
 \r
-    return var5;\r
-  }\r
+        Iterator var12 = var4.iterator();\r
 \r
-  private boolean isStheartRateTime(boolean var1) {\r
-    long var2 = System.currentTimeMillis();\r
-    ArrayList var4 = this.stheartRateList;\r
-    if (this.mTodayWeek == 1) {\r
-      this.mTodayWeek += 7;\r
-    }\r
+        while (true) {\r
+            if (!var12.hasNext()) {\r
+                var1 = false;\r
+                break;\r
+            }\r
 \r
-    Iterator var12 = var4.iterator();\r
-\r
-    while(true) {\r
-      if (var12.hasNext()) {\r
-        StheartRate var5 = (StheartRate)var12.next();\r
-        String var6 = var5.week;\r
-        StringBuilder var7 = new StringBuilder();\r
-        var7.append(this.mTodayWeek - 1);\r
-        var7.append("");\r
-        if (!var6.contains(var7.toString())) {\r
-          continue;\r
+            Antioff var6 = (Antioff) var12.next();\r
+            String var7 = var6.week;\r
+            StringBuilder var8 = new StringBuilder();\r
+            var8.append(this.mTodayWeek - 1);\r
+            var8.append("");\r
+            if (var7.contains(var8.toString())) {\r
+                long var9 = var6.startTimeMillis - var2;\r
+                int var11;\r
+                if (var9 < (long) (CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
+                    var11 = Integer.parseInt(var6.start.substring(2, 4));\r
+                    var5 = Integer.parseInt(var6.start.substring(5, 7));\r
+                    AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_START");\r
+                    var8 = new StringBuilder();\r
+                    var8.append("设置起始时间=hour");\r
+                    var8.append(var11);\r
+                    var8.append("minute+");\r
+                    var8.append(var5);\r
+                    ICLogger.i(var8.toString());\r
+                }\r
+\r
+                var9 = var6.endTimeMillis - var2;\r
+                if (var9 < (long) (CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
+                    var11 = Integer.parseInt(var6.end.substring(2, 4));\r
+                    var5 = Integer.parseInt(var6.end.substring(5, 7));\r
+                    AlarmHelper.setTimeAlarm(this.mContext, var11, var5, "com.enqualcomm.support.OTHER_ALARM_END");\r
+                    var8 = new StringBuilder();\r
+                    var8.append("设置结束时间=hour");\r
+                    var8.append(var11);\r
+                    var8.append("minute+");\r
+                    var8.append(var5);\r
+                    ICLogger.i(var8.toString());\r
+                }\r
+\r
+                if (var6.startTimeMillis <= var2 && var6.endTimeMillis > var2) {\r
+                    break;\r
+                }\r
+            }\r
         }\r
 \r
-        long var8 = var5.startTimeMillis - var2;\r
-        int var10;\r
-        int var11;\r
-        if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
-          var10 = Integer.parseInt(var5.start.substring(2, 4));\r
-          var11 = Integer.parseInt(var5.start.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START");\r
+        this.mRuntime.setAntioffStatus(var1);\r
+        return var1;\r
+    }\r
+\r
+    private boolean isSilentTime() {\r
+        long var1 = System.currentTimeMillis();\r
+        ArrayList var3 = this.silentList;\r
+        int var4 = this.mTodayWeek;\r
+        boolean var5 = false; //默认不在silent时间段\r
+        if (var4 == 1) {\r
+            this.mTodayWeek += 7;\r
         }\r
 \r
-        var8 = var5.endTimeMillis - var2;\r
-        if (var8 < (long)(CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
-          var10 = Integer.parseInt(var5.end.substring(2, 4));\r
-          var11 = Integer.parseInt(var5.end.substring(5, 7));\r
-          AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END");\r
+        Iterator var6 = var3.iterator();\r
+\r
+        while (true) {\r
+            if (!var6.hasNext()) {\r
+                var5 = false;\r
+                break;\r
+            }\r
+\r
+            Silent var12 = (Silent) var6.next();\r
+            String var7 = var12.week;\r
+            StringBuilder var8 = new StringBuilder();\r
+            var8.append(this.mTodayWeek - 1);\r
+            var8.append("");\r
+            if (var7.contains(var8.toString())) {\r
+                long var9 = var12.startTimeMillis - var1;\r
+                int var11;\r
+                StringBuilder var13;\r
+                if (var9 < (long) (CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
+                    var11 = Integer.parseInt(var12.start.substring(2, 4));\r
+                    var4 = Integer.parseInt(var12.start.substring(5, 7));\r
+                    AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_START");\r
+                    var13 = new StringBuilder();\r
+                    var13.append("设置起始时间=hour");\r
+                    var13.append(var11);\r
+                    var13.append("minute+");\r
+                    var13.append(var4);\r
+                    ICLogger.i(var13.toString());\r
+                }\r
+\r
+                var9 = var12.endTimeMillis - var1;\r
+                if (var9 < (long) (CoreService.alarmCycle * 60 * 1000) && var9 > 0L) {\r
+                    var11 = Integer.parseInt(var12.end.substring(2, 4));\r
+                    var4 = Integer.parseInt(var12.end.substring(5, 7));\r
+                    AlarmHelper.setTimeAlarm(this.mContext, var11, var4, "com.enqualcomm.support.OTHER_ALARM_END");\r
+                    var13 = new StringBuilder();\r
+                    var13.append("设置结束时间=hour");\r
+                    var13.append(var11);\r
+                    var13.append("minute+");\r
+                    var13.append(var4);\r
+                    ICLogger.i(var13.toString());\r
+                }\r
+\r
+                if (var12.startTimeMillis <= var1 && var12.endTimeMillis > var1) {\r
+                    break;\r
+                }\r
+            }\r
         }\r
 \r
-        if (var5.startTimeMillis > var2 || var5.endTimeMillis <= var2) {\r
-          continue;\r
+        return var5;\r
+    }\r
+\r
+    private boolean isStheartRateTime(boolean var1) {\r
+        long var2 = System.currentTimeMillis();\r
+        ArrayList var4 = this.stheartRateList;\r
+        if (this.mTodayWeek == 1) {\r
+            this.mTodayWeek += 7;\r
         }\r
 \r
-        this.mInterval = var5.interval;\r
-        if (!var1) {\r
+        Iterator var12 = var4.iterator();\r
+\r
+        while (true) {\r
+            if (var12.hasNext()) {\r
+                StheartRate var5 = (StheartRate) var12.next();\r
+                String var6 = var5.week;\r
+                StringBuilder var7 = new StringBuilder();\r
+                var7.append(this.mTodayWeek - 1);\r
+                var7.append("");\r
+                if (!var6.contains(var7.toString())) {\r
+                    continue;\r
+                }\r
+\r
+                long var8 = var5.startTimeMillis - var2;\r
+                int var10;\r
+                int var11;\r
+                if (var8 < (long) (CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
+                    var10 = Integer.parseInt(var5.start.substring(2, 4));\r
+                    var11 = Integer.parseInt(var5.start.substring(5, 7));\r
+                    AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START");\r
+                }\r
+\r
+                var8 = var5.endTimeMillis - var2;\r
+                if (var8 < (long) (CoreService.alarmCycle * 60 * 1000) && var8 > 0L) {\r
+                    var10 = Integer.parseInt(var5.end.substring(2, 4));\r
+                    var11 = Integer.parseInt(var5.end.substring(5, 7));\r
+                    AlarmHelper.setTimeAlarm(this.mContext, var10, var11, "com.enqualcomm.support.OTHER_HEARTRATE_ALARM_END");\r
+                }\r
+\r
+                if (var5.startTimeMillis > var2 || var5.endTimeMillis <= var2) {\r
+                    continue;\r
+                }\r
+\r
+                this.mInterval = var5.interval;\r
+                if (!var1) {\r
 //          AlarmHelper.setRealTimeAlarm(this.mContext, Integer.parseInt(this.mInterval), ACTION_HEATR_RATE_START);\r
 //          this.mRuntime.getContextProxy().sendStheartRateBroadcast(ACTION_HEATR_RATE_START, 0);\r
-        }\r
+                }\r
 \r
-        var1 = true;\r
-        break;\r
-      }\r
+                var1 = true;\r
+                break;\r
+            }\r
 \r
-      var1 = false;\r
-      break;\r
+            var1 = false;\r
+            break;\r
+        }\r
+\r
+        return var1;\r
     }\r
 \r
-    return var1;\r
-  }\r
+    private void onSilentStateChange(boolean var1) {\r
+        if (this.alarms != null) {\r
+            if (var1) {\r
+                this.cancelAlarm(this.alarms);\r
+            } else {\r
+                this.setNewAlarm(this.alarms);\r
+            }\r
+        }\r
 \r
-  private void onSilentStateChange(boolean var1) {\r
-    if (this.alarms != null) {\r
-      if (var1) {\r
-        this.cancelAlarm(this.alarms);\r
-      } else {\r
-        this.setNewAlarm(this.alarms);\r
-      }\r
-    }\r
+        if (this.voiceNotice != null) {\r
+            if (var1) {\r
+                this.cancelNoticeAlarm(this.voiceNotice);\r
+            } else {\r
+                this.setNewNoticeAlarm(this.voiceNotice);\r
+            }\r
+        }\r
 \r
-    if (this.voiceNotice != null) {\r
-      if (var1) {\r
-        this.cancelNoticeAlarm(this.voiceNotice);\r
-      } else {\r
-        this.setNewNoticeAlarm(this.voiceNotice);\r
-      }\r
     }\r
 \r
-  }\r
+    private ArrayList<Alarm> queryAlarm() {\r
+        ArrayList var1 = this.mDbHelper.queryAlarm();\r
+        if (!this.mInSilent) {\r
+            if (this.alarms != null) {\r
+                this.cancelAlarm(this.alarms);\r
+            }\r
 \r
-  private ArrayList<Alarm> queryAlarm() {\r
-    ArrayList var1 = this.mDbHelper.queryAlarm();\r
-    if (!this.mInSilent) {\r
-      if (this.alarms != null) {\r
-        this.cancelAlarm(this.alarms);\r
-      }\r
+            this.setNewAlarm(var1);\r
+        }\r
 \r
-      this.setNewAlarm(var1);\r
+        return var1;\r
     }\r
 \r
-    return var1;\r
-  }\r
+    private ArrayList<Antioff> queryAntioff() {\r
+        return this.mDbHelper.queryAntioff(true);\r
+    }\r
 \r
-  private ArrayList<Antioff> queryAntioff() {\r
-    return this.mDbHelper.queryAntioff(true);\r
-  }\r
+    private ArrayList<NoticeContent> queryNotice() {\r
+        String var1 = TimeUtil.getSystemTime4();\r
+        ArrayList var2 = this.mDbHelper.queryNotice(var1);\r
+        if (!this.mInSilent) {\r
+            if (this.voiceNotice != null) {\r
+                this.cancelNoticeAlarm(this.voiceNotice);\r
+            }\r
 \r
-  private ArrayList<NoticeContent> queryNotice() {\r
-    String var1 = TimeUtil.getSystemTime4();\r
-    ArrayList var2 = this.mDbHelper.queryNotice(var1);\r
-    if (!this.mInSilent) {\r
-      if (this.voiceNotice != null) {\r
-        this.cancelNoticeAlarm(this.voiceNotice);\r
-      }\r
+            this.setNewNoticeAlarm(var2);\r
+        }\r
 \r
-      this.setNewNoticeAlarm(var2);\r
+        return var2;\r
     }\r
 \r
-    return var2;\r
-  }\r
-\r
-  private ArrayList<Silent> querySilent() {\r
-    return this.mDbHelper.querySilence(true);\r
-  }\r
-\r
-  private ArrayList<StheartRate> queryStheartRate() {\r
-    return this.mDbHelper.queryStheartRate(true);\r
-  }\r
-\r
-  private void setNewAlarm(ArrayList<Alarm> alarmArrayList) {\r
-    Calendar calendar = Calendar.getInstance();\r
-    calendar.set(Calendar.SECOND, 0);\r
-    long currentTime = System.currentTimeMillis();\r
-    Iterator itAlarm = alarmArrayList.iterator();\r
-\r
-\r
-    while (itAlarm.hasNext()){\r
-      Alarm alarm = (Alarm)itAlarm.next();\r
-      if ("ON".equals(alarm.status)) {\r
-        int hour = Integer.parseInt(alarm.time.substring(2, 4));\r
-        int minute = Integer.parseInt(alarm.time.substring(5, 7));\r
-        calendar.set(Calendar.HOUR_OF_DAY, hour);\r
-        calendar.set(Calendar.MINUTE, minute);\r
-\r
-        char[] weeklist = alarm.week.toCharArray();\r
-        int weeklistlen = weeklist.length;\r
-        ICLogger.i("repeat = "+alarm.week+", list size = "+weeklistlen);\r
-        if (weeklistlen>1) {\r
-          //如果week大于0 则证明有循环,没有循环就证明只是一次的闹铃。\r
-          for (int i = 1; i < weeklistlen; i++) {\r
-\r
-            long tmpTimeInMillis;\r
-            int dayofweek = weeklist[i] - 47;\r
-            calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
-            tmpTimeInMillis = calendar.getTimeInMillis();\r
-            if (tmpTimeInMillis <= currentTime) {\r
-              tmpTimeInMillis += ONE_WEEK;\r
-            }\r
-              Date date = new Date(tmpTimeInMillis);\r
-              ICLogger.i("set date "+date.toLocaleString());\r
-            PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, dayofweek);\r
-            AlarmHelper.setAlarm(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
-          }\r
-        }else{\r
-          //只是一次的闹铃\r
-          long tmpTimeInMillis;\r
+    private ArrayList<Silent> querySilent() {\r
+        return this.mDbHelper.querySilence(true);\r
+    }\r
+\r
+    private ArrayList<StheartRate> queryStheartRate() {\r
+        return this.mDbHelper.queryStheartRate(true);\r
+    }\r
+\r
+    private void setNewAlarm(ArrayList<Alarm> alarmArrayList) {\r
+        Calendar calendar = Calendar.getInstance();\r
+        calendar.set(Calendar.SECOND, 0);\r
+        long currentTime = System.currentTimeMillis();\r
+        Iterator itAlarm = alarmArrayList.iterator();\r
+\r
+\r
+        while (itAlarm.hasNext()) {\r
+            Alarm alarm = (Alarm) itAlarm.next();\r
+            if ("ON".equals(alarm.status)) {\r
+                int hour = Integer.parseInt(alarm.time.substring(2, 4));\r
+                int minute = Integer.parseInt(alarm.time.substring(5, 7));\r
+                calendar.set(Calendar.HOUR_OF_DAY, hour);\r
+                calendar.set(Calendar.MINUTE, minute);\r
+\r
+                char[] weeklist = alarm.week.toCharArray();\r
+                int weeklistlen = weeklist.length;\r
+                ICLogger.i("repeat = " + alarm.week + ", list size = " + weeklistlen);\r
+                if (weeklistlen > 1) {\r
+                    //如果week大于0 则证明有循环,没有循环就证明只是一次的闹铃。\r
+                    for (int i = 1; i < weeklistlen; i++) {\r
+\r
+                        long tmpTimeInMillis;\r
+                        int dayofweek = weeklist[i] - 47;\r
+                        calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
+                        tmpTimeInMillis = calendar.getTimeInMillis();\r
+                        if (tmpTimeInMillis <= currentTime) {\r
+                            tmpTimeInMillis += ONE_WEEK;\r
+                        }\r
+                        Date date = new Date(tmpTimeInMillis);\r
+                        ICLogger.i("set date " + date.toLocaleString());\r
+                        PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, dayofweek);\r
+                        AlarmHelper.setAlarm(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
+                    }\r
+                } else {\r
+                    //只是一次的闹铃\r
+                    long tmpTimeInMillis;\r
 //          int dayofweek = weeklist[i] - 47;\r
 //          calendar.set(Calendar.DAY_OF_WEEK, dayofweek);\r
 //          tmpTimeInMillis = calendar.getTimeInMillis();\r
 \r
-            Date date = new Date(System.currentTimeMillis());\r
-            ICLogger.i("date "+date.toLocaleString());\r
-            Calendar c = Calendar.getInstance();\r
-            c.setTime(date);\r
-            int wek = c.get(Calendar.DAY_OF_WEEK);\r
-            calendar.set(Calendar.DAY_OF_WEEK, wek);\r
-            tmpTimeInMillis = calendar.getTimeInMillis();\r
-            if (tmpTimeInMillis <= currentTime) {\r
-              tmpTimeInMillis += ONE_DAY;\r
-            }\r
-          date = new Date(tmpTimeInMillis);\r
-            c = Calendar.getInstance();\r
-          c.setTime(date);\r
-          wek = c.get(Calendar.DAY_OF_WEEK);\r
-\r
-            ICLogger.i("set date "+date.toLocaleString());\r
+                    Date date = new Date(System.currentTimeMillis());\r
+                    ICLogger.i("date " + date.toLocaleString());\r
+                    Calendar c = Calendar.getInstance();\r
+                    c.setTime(date);\r
+                    int wek = c.get(Calendar.DAY_OF_WEEK);\r
+                    calendar.set(Calendar.DAY_OF_WEEK, wek);\r
+                    tmpTimeInMillis = calendar.getTimeInMillis();\r
+                    if (tmpTimeInMillis <= currentTime) {\r
+                        tmpTimeInMillis += ONE_DAY;\r
+                    }\r
+                    date = new Date(tmpTimeInMillis);\r
+                    c = Calendar.getInstance();\r
+                    c.setTime(date);\r
+                    wek = c.get(Calendar.DAY_OF_WEEK);\r
+\r
+                    ICLogger.i("set date " + date.toLocaleString());\r
+\r
+                    PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, wek);\r
+                    AlarmHelper.setAlarmOnce(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
+                }\r
 \r
-            PendingIntent pendingIntent = this.getPendingIntent(alarm.time, alarm.week, alarm.ring, alarm.name, wek);\r
-          AlarmHelper.setAlarmOnce(this.mAlarmManager, tmpTimeInMillis, pendingIntent);\r
+            }\r
         }\r
-\r
-      }\r
     }\r
-  }\r
-\r
-  private void setNewNoticeAlarm(ArrayList<NoticeContent> var1) {\r
-    Iterator var19 = var1.iterator();\r
-\r
-    while(var19.hasNext()) {\r
-      NoticeContent var2 = (NoticeContent)var19.next();\r
-      String var3 = var2.noticeTime;\r
-      String var4 = var2.noticeName;\r
-      String var5 = var2.noticeNumber;\r
-      String var6 = var2.noticeID;\r
-      String var7 = var2.noticeCategory;\r
-      String var8 = var2.noticeFrequency;\r
-      String var9 = var2.noticeContent;\r
-      Calendar var10 = Calendar.getInstance();\r
-      long var11 = System.currentTimeMillis();\r
-      var10.set(Calendar.SECOND, 0);\r
-      if (var3 != null) {\r
-        String var13 = var3.substring(0, 4);\r
-        String var20 = var3.substring(4, 6);\r
-        String var14 = var3.substring(6, 8);\r
-        String var15 = var3.substring(8, 10);\r
-        String var16 = var3.substring(10, 12);\r
-        var10.set(Calendar.YEAR, Integer.parseInt(var13));\r
-        var10.set(Calendar.MONTH, Integer.parseInt(var20) - 1);\r
-        var10.set(Calendar.DATE, Integer.parseInt(var14));\r
-        var10.set(Calendar.HOUR_OF_DAY, Integer.parseInt(var15));\r
-        var10.set(Calendar.MINUTE, Integer.parseInt(var16));\r
-        long var17 = var10.getTimeInMillis();\r
-        if (var17 >= var11) {\r
-          PendingIntent var21 = this.getPendingIntent(var3, var4, var5, var6, var7, var8, var9);\r
-          AlarmHelper.setAlarm(this.mAlarmManager, var17, var21);\r
+\r
+    private void setNewNoticeAlarm(ArrayList<NoticeContent> var1) {\r
+        Iterator var19 = var1.iterator();\r
+\r
+        while (var19.hasNext()) {\r
+            NoticeContent var2 = (NoticeContent) var19.next();\r
+            String var3 = var2.noticeTime;\r
+            String var4 = var2.noticeName;\r
+            String var5 = var2.noticeNumber;\r
+            String var6 = var2.noticeID;\r
+            String var7 = var2.noticeCategory;\r
+            String var8 = var2.noticeFrequency;\r
+            String var9 = var2.noticeContent;\r
+            Calendar var10 = Calendar.getInstance();\r
+            long var11 = System.currentTimeMillis();\r
+            var10.set(Calendar.SECOND, 0);\r
+            if (var3 != null) {\r
+                String var13 = var3.substring(0, 4);\r
+                String var20 = var3.substring(4, 6);\r
+                String var14 = var3.substring(6, 8);\r
+                String var15 = var3.substring(8, 10);\r
+                String var16 = var3.substring(10, 12);\r
+                var10.set(Calendar.YEAR, Integer.parseInt(var13));\r
+                var10.set(Calendar.MONTH, Integer.parseInt(var20) - 1);\r
+                var10.set(Calendar.DATE, Integer.parseInt(var14));\r
+                var10.set(Calendar.HOUR_OF_DAY, Integer.parseInt(var15));\r
+                var10.set(Calendar.MINUTE, Integer.parseInt(var16));\r
+                long var17 = var10.getTimeInMillis();\r
+                if (var17 >= var11) {\r
+                    PendingIntent var21 = this.getPendingIntent(var3, var4, var5, var6, var7, var8, var9);\r
+                    AlarmHelper.setAlarm(this.mAlarmManager, var17, var21);\r
+                }\r
+            }\r
         }\r
-      }\r
+\r
     }\r
 \r
-  }\r
-\r
-  public void onAlarmClock(Connection var1, Runtime var2) {\r
-    this.handleSilent(var2, true);\r
-  }\r
-\r
-  public void onAttach(Connection var1, Runtime var2) {\r
-    this.mRuntime = var2;\r
-    this.mConnection = var1;\r
-    this.mContext = var2.getContextProxy().context;\r
-    this.mAlarmManager = (AlarmManager)this.mContext.getSystemService(Context.ALARM_SERVICE);\r
-    this.mDbHelper = var2.getDbHelper();\r
-    this.silentList = this.querySilent();\r
-    this.getSilentListStartAndEndTime();\r
-    this.mInSilent = this.isSilentTime();\r
-    DBHelper var3 = this.mDbHelper;\r
-    String var4;\r
-    if (this.mInSilent) {\r
-      var4 = "ON";\r
-    } else {\r
-      var4 = "OFF";\r
+    public void onAlarmClock(Connection var1, Runtime var2) {\r
+        this.handleSilent(var2, true);\r
     }\r
 \r
-    var3.upDateorInsertDeviceStatus(var4);\r
-    this.handSilence(this.mContext, this.mInSilent);\r
-    this.stheartRateList = this.queryStheartRate();\r
-    this.getStartAndEndStheartRateTime();\r
-    this.mIsStheartRate = this.isStheartRateTime(false);\r
-    this.alarms = this.queryAlarm();\r
-    this.voiceNotice = this.queryNotice();\r
-    var2.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);\r
-    this.mAlramReceiver = new SilentManager.AlramReceiver();\r
-    IntentFilter var5 = new IntentFilter();\r
-    var5.addAction("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE");\r
-    var5.addAction("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE");\r
-    var5.addAction("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE");\r
-    var5.addAction("com.eqc.heartrate.action.RESULT");\r
-    this.mContext.registerReceiver(this.mAlramReceiver, var5);\r
-    var2.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);\r
-  }\r
-\r
-  public void onDetach(Connection var1, Runtime var2) {\r
-    var2.getContextProxy().context.getContentResolver().unregisterContentObserver(this.mContentObserver);\r
-    this.mContext.unregisterReceiver(this.mAlramReceiver);\r
-  }\r
-\r
-  @Override\r
-  public boolean onUserRequest(Intent var1, Connection var2, Runtime var3) {\r
-    String action = var1.getAction();\r
-    if (ACTION_CARE_ALARM.equals(action)) {\r
-      String alarmTime = var1.getDataString();  //alarm:ST00.43,W,CON,闹铃,2\r
-      String currentTime = TimeUtil.getSystemTime();\r
-      alarmTime.substring(6).split("\\.");\r
-      int alarmTime_minutes = Integer.parseInt(alarmTime.substring(6).split("\\.")[1].substring(0, 2));\r
-      int alarmTime_hour = Integer.parseInt(alarmTime.substring(6).split("\\.")[0].substring(2));\r
-      String[] currentTimeArray = currentTime.split(";")[1].split(":");\r
-      int currentTime_hour = Integer.parseInt(currentTimeArray[0]);\r
-      int currentTime_minutes = Integer.parseInt(currentTimeArray[1]);\r
-      ICLogger.i("alarm time["+alarmTime_hour+":"+alarmTime_minutes+"], current time["+currentTime_hour+":"+currentTime_minutes+"]");\r
-      if (alarmTime_hour != currentTime_hour || alarmTime_minutes != currentTime_minutes) {\r
-        return false;\r
-      }\r
-\r
-      if (this.isIdle(this.mContext)) {\r
-        try {\r
-          Intent intent = new Intent("com.enqualcomm.icare.ALARM", Uri.parse(alarmTime));\r
-            intent.putExtra("closeAlarm", 0);\r
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
-          this.mContext.startActivity(intent);\r
-        } catch (Exception var9) {\r
-          var9.printStackTrace();\r
+    public void onAttach(Connection var1, Runtime var2) {\r
+        this.mRuntime = var2;\r
+        this.mConnection = var1;\r
+        this.mContext = var2.getContextProxy().context;\r
+        this.mAlarmManager = (AlarmManager) this.mContext.getSystemService(Context.ALARM_SERVICE);\r
+        this.mDbHelper = var2.getDbHelper();\r
+        this.silentList = this.querySilent();\r
+        this.getSilentListStartAndEndTime();\r
+        this.mInSilent = this.isSilentTime();\r
+        DBHelper var3 = this.mDbHelper;\r
+        String var4;\r
+        if (this.mInSilent) {\r
+            var4 = "ON";\r
+        } else {\r
+            var4 = "OFF";\r
         }\r
-      }\r
-    } else if ("com.enqualcomm.support.ACTION_NOTICE_ALARM".equals(action)) {\r
-        String alarmTime = var1.getDataString();\r
-      if (this.isIdle(this.mContext)) {\r
-        try {\r
-          var1 = new Intent("com.enqualcomm.icare.NOTICE", Uri.parse(alarmTime));\r
-          var1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
-          this.mContext.startActivity(var1);\r
-        } catch (Exception var8) {\r
-          var8.printStackTrace();\r
-        }\r
-      }\r
-    } else {\r
-      ICLogger.i("静默闹钟来了");\r
-      boolean var4;\r
-      if (!"com.eqc.heartrate.action.SILENT_START".equals(action) && !"com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START".equals(action)) {\r
-        var4 = false;\r
-      } else {\r
-        var4 = true;\r
-      }\r
-\r
-      this.handleSilent(var3, var4 ^ true);\r
+\r
+        var3.upDateorInsertDeviceStatus(var4);\r
+        this.handSilence(this.mContext, this.mInSilent);\r
+        this.stheartRateList = this.queryStheartRate();\r
+        this.getStartAndEndStheartRateTime();\r
+        this.mIsStheartRate = this.isStheartRateTime(false);\r
+        this.alarms = this.queryAlarm();\r
+        this.voiceNotice = this.queryNotice();\r
+        var2.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver);\r
+        this.mAlramReceiver = new SilentManager.AlramReceiver();\r
+        IntentFilter var5 = new IntentFilter();\r
+        var5.addAction("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE");\r
+        var5.addAction("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE");\r
+        var5.addAction("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE");\r
+        var5.addAction("com.eqc.heartrate.action.RESULT");\r
+        this.mContext.registerReceiver(this.mAlramReceiver, var5);\r
+        var2.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32);\r
     }\r
 \r
-    return false;\r
-  }\r
+    public void onDetach(Connection var1, Runtime var2) {\r
+        var2.getContextProxy().context.getContentResolver().unregisterContentObserver(this.mContentObserver);\r
+        this.mContext.unregisterReceiver(this.mAlramReceiver);\r
+    }\r
 \r
-  @Override\r
-  public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {\r
-    return false;\r
-  }\r
+    @Override\r
+    public boolean onUserRequest(Intent var1, Connection var2, Runtime var3) {\r
+        String action = var1.getAction();\r
+        if (ACTION_CARE_ALARM.equals(action)) {\r
+            String alarmTime = var1.getDataString();  //alarm:ST00.43,W,CON,闹铃,2\r
+            String currentTime = TimeUtil.getSystemTime();\r
+            alarmTime.substring(6).split("\\.");\r
+            int alarmTime_minutes = Integer.parseInt(alarmTime.substring(6).split("\\.")[1].substring(0, 2));\r
+            int alarmTime_hour = Integer.parseInt(alarmTime.substring(6).split("\\.")[0].substring(2));\r
+            String[] currentTimeArray = currentTime.split(";")[1].split(":");\r
+            int currentTime_hour = Integer.parseInt(currentTimeArray[0]);\r
+            int currentTime_minutes = Integer.parseInt(currentTimeArray[1]);\r
+            ICLogger.i("alarm time[" + alarmTime_hour + ":" + alarmTime_minutes + "], current time[" + currentTime_hour + ":" + currentTime_minutes + "]");\r
+            if (alarmTime_hour != currentTime_hour || alarmTime_minutes != currentTime_minutes) {\r
+                return false;\r
+            }\r
+\r
+            if (this.isIdle(this.mContext)) {\r
+                try {\r
+                    Intent intent = new Intent("com.enqualcomm.icare.ALARM", Uri.parse(alarmTime));\r
+                    intent.putExtra("closeAlarm", 0);\r
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
+                    this.mContext.startActivity(intent);\r
+                } catch (Exception var9) {\r
+                    var9.printStackTrace();\r
+                }\r
+            }\r
+        } else if ("com.enqualcomm.support.ACTION_NOTICE_ALARM".equals(action)) {\r
+            String alarmTime = var1.getDataString();\r
+            if (this.isIdle(this.mContext)) {\r
+                try {\r
+                    var1 = new Intent("com.enqualcomm.icare.NOTICE", Uri.parse(alarmTime));\r
+                    var1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\r
+                    this.mContext.startActivity(var1);\r
+                } catch (Exception var8) {\r
+                    var8.printStackTrace();\r
+                }\r
+            }\r
+        } else {\r
+            ICLogger.i("静默闹钟来了");\r
+            boolean var4;\r
+            if (!"com.eqc.heartrate.action.SILENT_START".equals(action) && !"com.enqualcomm.support.OTHER_HEARTRATE_ALARM_START".equals(action)) {\r
+                var4 = false;\r
+            } else {\r
+                var4 = true;\r
+            }\r
 \r
-  class AlramReceiver extends BroadcastReceiver {\r
-    AlramReceiver() {\r
+            this.handleSilent(var3, var4 ^ true);\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    @Override\r
+    public boolean onUserRequest(Message paramMessage, Connection paramConnection, Runtime paramRuntime) {\r
+        return false;\r
     }\r
 \r
-    public void onReceive(Context var1, Intent var2) {\r
-      String var6 = var2.getAction();\r
-      StringBuilder var3 = new StringBuilder();\r
-      var3.append("action = ");\r
-      var3.append(var6);\r
-      ICLogger.i(var3.toString());\r
-      if ("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.voiceNotice = SilentManager.this.queryNotice();\r
-      } else if ("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.alarms = SilentManager.this.queryAlarm();\r
-      } else if ("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.stheartRateList = SilentManager.this.queryStheartRate();\r
-        SilentManager.this.getStartAndEndStheartRateTime();\r
-        SilentManager.this.isStheartRateTime(false);\r
-      } else if ("com.eqc.heartrate.action.RESULT".equals(var6)) {\r
-        var6 = var2.getStringExtra("time");\r
-        int var4 = var2.getIntExtra("value", 0);\r
-        int var5 = var2.getIntExtra("type", 0);\r
-        StringBuilder var7 = new StringBuilder();\r
-        var7.append("(");\r
-        var7.append(var6);\r
-        var7.append("@");\r
-        var7.append(var4);\r
-        var7.append("@");\r
-        var7.append(var5);\r
-        var7.append(")");\r
-        var6 = var7.toString();\r
+    class AlramReceiver extends BroadcastReceiver {\r
+        AlramReceiver() {\r
+        }\r
+\r
+        public void onReceive(Context var1, Intent var2) {\r
+            String var6 = var2.getAction();\r
+            StringBuilder var3 = new StringBuilder();\r
+            var3.append("action = ");\r
+            var3.append(var6);\r
+            ICLogger.i(var3.toString());\r
+            if ("com.enqualcomm.support.ACTION_NOTICE_ALARM_CHANGE".equals(var6)) {\r
+                SilentManager.this.voiceNotice = SilentManager.this.queryNotice();\r
+            } else if ("com.enqualcomm.support.ACTION_ALARM_ALARM_CHANGE".equals(var6)) {\r
+                SilentManager.this.alarms = SilentManager.this.queryAlarm();\r
+            } else if ("com.enqualcomm.support.STHEART_RATE_ALARM_CHANGE".equals(var6)) {\r
+                SilentManager.this.stheartRateList = SilentManager.this.queryStheartRate();\r
+                SilentManager.this.getStartAndEndStheartRateTime();\r
+                SilentManager.this.isStheartRateTime(false);\r
+            } else if ("com.eqc.heartrate.action.RESULT".equals(var6)) {\r
+                var6 = var2.getStringExtra("time");\r
+                int var4 = var2.getIntExtra("value", 0);\r
+                int var5 = var2.getIntExtra("type", 0);\r
+                StringBuilder var7 = new StringBuilder();\r
+                var7.append("(");\r
+                var7.append(var6);\r
+                var7.append("@");\r
+                var7.append(var4);\r
+                var7.append("@");\r
+                var7.append(var5);\r
+                var7.append(")");\r
+                var6 = var7.toString();\r
 //        SilentManager.this.mConnection.send(API.H60(SilentManager.this.mRuntime, var6));\r
-      } else if ("com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE".equals(var6)) {\r
-        SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();\r
-        SilentManager.this.getStartAndEndSantioffTime();\r
-        SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);\r
-      }\r
+            } else if ("com.enqualcomm.support.ACTION_ANTIOFF_ALARM_CHANGE".equals(var6)) {\r
+                SilentManager.this.sAntioffList = SilentManager.this.queryAntioff();\r
+                SilentManager.this.getStartAndEndSantioffTime();\r
+                SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false);\r
+            }\r
 \r
+        }\r
     }\r
-  }\r
 }
\ No newline at end of file
index 9fc3ac6..8d3b4e2 100644 (file)
@@ -1,58 +1,33 @@
 package com.enqualcomm.support.utils;\r
 \r
-import android.app.Notification;\r
 import android.app.NotificationManager;\r
 import android.content.BroadcastReceiver;\r
 import android.content.ComponentName;\r
 import android.content.Context;\r
 import android.content.DialogInterface;\r
 import android.content.Intent;\r
-import android.media.RingtoneManager;\r
-import android.net.Uri;\r
 import android.os.Handler;\r
-import android.os.Messenger;\r
 import android.os.PowerManager;\r
 import android.os.Vibrator;\r
-import android.support.v4.app.NotificationCompat;\r
-import android.view.Gravity;\r
-import android.view.MotionEvent;\r
-import android.view.View;\r
 import android.view.WindowManager;\r
 \r
-\r
 import com.enqualcomm.support.Config;\r
 import com.enqualcomm.support.Constants;\r
 import com.enqualcomm.support.CoreService;\r
-import com.enqualcomm.support.LocationClient;\r
 import com.enqualcomm.support.R;\r
-import com.enqualcomm.support.bean.NotificationParam;\r
+import com.enqualcomm.support.bean.Contact;\r
 import com.enqualcomm.support.bean.Runtime;\r
 import com.enqualcomm.support.bean.VoiceContent;\r
-import com.enqualcomm.support.service.Deliver;\r
-import com.ic.jni.ICJniUtils;\r
-import com.enqualcomm.support.bean.Contact;\r
 import com.enqualcomm.support.service.AudioService;\r
-import com.enqualcomm.support.service.HeartRateManager;\r
+import com.enqualcomm.support.service.Deliver;\r
 import com.ic.protocols.protocolAPIHelper;\r
 \r
-import java.util.concurrent.TimeUnit;\r
-\r
-import rx.Observable;\r
-import rx.Subscriber;\r
-import rx.functions.Action1;\r
-import rx.schedulers.Schedulers;\r
-\r
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;\r
-import static android.media.RingtoneManager.TYPE_NOTIFICATION;\r
 import static android.os.PowerManager.ACQUIRE_CAUSES_WAKEUP;\r
 import static android.os.PowerManager.SCREEN_DIM_WAKE_LOCK;\r
-import static com.enqualcomm.support.Constants.ACTION_CLOSE_UNREAD_MSG;\r
-import static com.enqualcomm.support.Constants.ACTION_HEATR_RATE_START;\r
 import static com.enqualcomm.support.Constants.ACTION_MESSAGE_SENT;\r
 import static com.enqualcomm.support.Constants.ACTION_PLAYTIME;\r
 import static com.enqualcomm.support.Constants.ACTION_REMOTE_CAMERA;\r
-import static com.enqualcomm.support.Constants.ACTION_SEND_EMEGENCY_LOCATION_START;\r
-import static com.enqualcomm.support.Constants.ACTION_SEND_SOS_MSG;\r
 import static com.enqualcomm.support.Constants.ACTION_SET_SIT_RANGE;\r
 import static com.enqualcomm.support.Constants.ACTION_SHUTDOWN;\r
 import static com.enqualcomm.support.Constants.ACTION_TEMP_RESULT;\r
@@ -63,7 +38,6 @@ import static com.enqualcomm.support.Constants.KEY_MESSAGE_URL;
 import static com.enqualcomm.support.Constants.KEY_TEMP_BODY;\r
 import static com.enqualcomm.support.Constants.KEY_TEMP_WRIST;\r
 import static com.enqualcomm.support.Constants.RESUME_ACTION;\r
-\r
 import static com.enqualcomm.support.bean.Content.CONTACT_CATEGORY_GROUP;\r
 \r
 \r
@@ -358,13 +332,12 @@ public class ProcessReceiver extends BroadcastReceiver {
                 SharPreferenceUtil.getPrefBoolean(paramContext, "key_is_resume", false);\r
                 isSilence = SharPreferenceUtil.getPrefBoolean(paramContext, "KEY_ISSILENCE", false);\r
                 if (sms != null && !isSilence) {\r
-                    if (!DeviceInfoUtil.isTopActivity(paramContext)) {\r
-                        this.initMyDialog(paramContext, null, 3, sms);\r
-                        this.playNotificationVoice(paramContext);\r
-                        VibrateUtil.getInstance(paramContext).VibrateOn(true);\r
-                    }\r
-\r
-                    this.screenOn(paramContext);\r
+                    //if (!DeviceInfoUtil.isTopActivity(paramContext)) {\r
+                        //his.initMyDialog(paramContext, null, 3, sms);\r
+                        //this.playNotificationVoice(paramContext);\r
+                        //VibrateUtil.getInstance(paramContext).VibrateOn(true);\r
+                    //}\r
+                    //this.screenOn(paramContext);\r
                 }\r
             } else if (paramIntent.hasExtra("pushtxt")) {\r
                 String sms = paramIntent.getStringExtra("pushtxt");\r
index 8f4c96a..84997fe 100644 (file)
@@ -9,46 +9,42 @@ import android.os.IBinder;
 import android.os.Message;\r
 import android.util.Log;\r
 \r
-import java.io.IOException;\r
-\r
 import se.wetcat.qatja.MQTTConstants;\r
-import se.wetcat.qatja.MQTTException;\r
 import se.wetcat.qatja.android.MQTTConnectionConstants;\r
 import se.wetcat.qatja.android.QatjaService;\r
-import se.wetcat.qatja.messages.MQTTMessage;\r
 import se.wetcat.qatja.messages.MQTTPublish;\r
 \r
 public class protocol_mqtt_client {\r
 \r
-    private String TAG=protocol_mqtt_client.class.getSimpleName();\r
+    private String TAG = protocol_mqtt_client.class.getSimpleName();\r
     private Handler mHandler = new Handler(new MqttCallback());\r
-    QatjaService mClient=null;\r
+    QatjaService mClient = null;\r
     private Context mContext;\r
     private boolean isBound = false;\r
     private boolean isBinding = false;\r
 \r
     private class MqttCallback implements Handler.Callback {\r
         @Override\r
-        public boolean handleMessage(Message msg)\r
-             {\r
+        public boolean handleMessage(Message msg) {\r
 \r
-                switch (msg.what) {\r
-                    case MQTTConnectionConstants.STATE_CHANGE:\r
-                        handleStateChange(msg);\r
+            switch (msg.what) {\r
+                case MQTTConnectionConstants.STATE_CHANGE:\r
+                    handleStateChange(msg);\r
+                    break;\r
+                case 3:\r
+                    handleReceivedMessage(msg);\r
                     break;\r
-                    case 3:\r
-                        handleReceivedMessage(msg);\r
-                        break;\r
-                    }\r
-                 return true;\r
             }\r
+            return true;\r
+        }\r
 \r
     }\r
 \r
-    public protocol_mqtt_client(Context context ) {\r
+    public protocol_mqtt_client(Context context) {\r
 \r
-        mContext=context;\r
+        mContext = context;\r
     }\r
+\r
     private void handleStateChange(Message msg) {\r
         Log.e(TAG, MQTTConnectionConstants.resolveStateName(msg.arg1));\r
 \r
@@ -67,22 +63,22 @@ public class protocol_mqtt_client {
                 break;\r
             default:\r
                 Log.e(TAG, "Unhandled MQTT state change");\r
-            break;\r
+                break;\r
         }\r
     }\r
 \r
     private void handleReceivedMessage(Message msg) {\r
-        MQTTPublish publish    = (MQTTPublish)msg.obj;\r
+        MQTTPublish publish = (MQTTPublish) msg.obj;\r
 \r
 //        if (isDebug()) {\r
-            Log.d(TAG, "handleReceivedMessage(${publish.topicName})"+publish.getTopicName()+" data "+new String(publish.getPayload()));\r
+        Log.d(TAG, "handleReceivedMessage(${publish.topicName})" + publish.getTopicName() + " data " + new String(publish.getPayload()));\r
 //        }\r
     }\r
 \r
     private ServiceConnection mConnection = new ServiceConnection() {\r
         @Override\r
         public void onServiceConnected(ComponentName componentName, IBinder iBinder) {\r
-            mClient = ((QatjaService.QatjaBinder)iBinder).getService();\r
+            mClient = ((QatjaService.QatjaBinder) iBinder).getService();\r
 \r
             isBound = true;\r
             isBinding = false;\r
@@ -98,7 +94,7 @@ public class protocol_mqtt_client {
     };\r
 \r
 \r
-   public void Resume() {\r
+    public void Resume() {\r
         attemptBindService();\r
     }\r
 \r
@@ -110,7 +106,7 @@ public class protocol_mqtt_client {
 \r
             isBinding = false;\r
             isBound = false;\r
-        } catch ( IllegalArgumentException ex) {\r
+        } catch (IllegalArgumentException ex) {\r
             Log.e(TAG, "Couldn't unbind the service, this is probably fine considering the state changes in the app... can probably ignore this.", ex);\r
         }\r
 \r
@@ -118,14 +114,14 @@ public class protocol_mqtt_client {
     }\r
 \r
     public void attemptSubscribeToTopic(String topic) {\r
-        Log.d(TAG, "attemptSubscribeToTopic($topic)"+topic);\r
+        Log.d(TAG, "attemptSubscribeToTopic($topic)" + topic);\r
 \r
 \r
-            try {\r
-                mClient.subscribe(topic, MQTTConstants.AT_MOST_ONCE);\r
-            } catch (Exception ex) {\r
-                Log.e(TAG, ex.getMessage());\r
-            }\r
+        try {\r
+            mClient.subscribe(topic, MQTTConstants.AT_MOST_ONCE);\r
+        } catch (Exception ex) {\r
+            Log.e(TAG, ex.getMessage());\r
+        }\r
 \r
     }\r
 \r
@@ -143,7 +139,7 @@ public class protocol_mqtt_client {
 \r
     private void attemptBindService() {\r
 //        if (isDebug()) {\r
-            Log.d(TAG, "attemptBindService()  [isBound: $isBound, isBinding: $isBinding]");\r
+        Log.d(TAG, "attemptBindService()  [isBound: $isBound, isBinding: $isBinding]");\r
 //        }\r
         if (!isBound && !isBinding) {\r
             isBinding = true;\r
@@ -154,16 +150,15 @@ public class protocol_mqtt_client {
 \r
     }\r
 \r
-    public void attemptConnectMqtt(String host,String identifier, int cycle_inSeconds) {\r
+    public void attemptConnectMqtt(String host, String identifier, int cycle_inSeconds) {\r
         Log.d(TAG, "attemptConnectMqtt($host, $identifier)");\r
 \r
-        if (!(MQTTConnectionConstants.STATE_CONNECTING== mClient.getState() || MQTTConnectionConstants.STATE_CONNECTED == mClient.getState()))\r
-        {\r
+        if (!(MQTTConnectionConstants.STATE_CONNECTING == mClient.getState() || MQTTConnectionConstants.STATE_CONNECTED == mClient.getState())) {\r
             try {\r
                 mClient.setHost(host);\r
                 mClient.setPort(1883);\r
                 mClient.setIdentifier(identifier);\r
-                mClient.setKeepAlive(cycle_inSeconds*1000);\r
+                mClient.setKeepAlive(cycle_inSeconds * 1000);\r
                 mClient.setCleanSession(true);\r
 \r
                 mClient.connect();\r
@@ -174,18 +169,19 @@ public class protocol_mqtt_client {
     }\r
 \r
     void onMqttConnected() {\r
-        Log.i(TAG,"onMqttConnected");\r
+        Log.i(TAG, "onMqttConnected");\r
         attemptSubscribeToTopic("WBG100/v1/1/+");\r
 \r
     }\r
+\r
     void onMqttDisconnected() {\r
-        Log.i(TAG,"onMqttDisconnected");\r
+        Log.i(TAG, "onMqttDisconnected");\r
 \r
     }\r
 \r
 \r
-    public void sendMessage(String topic,String data){\r
+    public void sendMessage(String topic, String data) {\r
 \r
-       mClient.publish(topic,data);\r
+        mClient.publish(topic, data);\r
     }\r
 }\r
index d6aa41d..2e94622 100644 (file)
@@ -99,389 +99,389 @@ import static se.wetcat.qatja.android.MQTTConnectionConstants.STATE_NONE;
  */
 public class QatjaService extends Service {
 
-  private static final boolean DEBUG = true;
-
-  private static final String TAG = QatjaService.class.getSimpleName();
-
-  /**
-   * Current state of the connection
-   */
-  private volatile int mState = STATE_NONE;
-
-  /**
-   * How long to wait before a reconnect attempt is made
-   */
-  private long mReconnectDelay = 5000;
-
-  /**
-   * Thread to handle setup of connections
-   */
-  private ConnectThread mConnectThread;
-
-  /**
-   * Thread to handle communication when connection is established.
-   */
-  private ConnectedThread mConnectedThread;
-
-  /**
-   * Keepalive timer
-   */
-  private int KEEP_ALIVE_TIMER = 3000;
-
-  /**
-   * Handler used to queue PINGRESP messages, will be automatically queued when sending a message,
-   * or when connecting.
-   */
-  private Handler mKeepaliveHandler;
-
-  /**
-   *
-   */
-  private Handler mHandler = null;
-
-  /**
-   * The local binder object
-   */
-  private final QatjaBinder mBinder = new QatjaBinder();
-
-  /**
-   * The default is the localhost (emulator link to
-   */
-  private String host = "47.106.237.76";
-
-  /**
-   * The default is no SSL, turning this on before connect will enforce an SSL connection attempt.
-   */
-  private SSLSocketFactory socketFactory = null;
-
-  private int port = 1883;
-
-  /*
-    For some reason used in interop test suites... only reason it's included here.
-   */
-  private String protocolName = null;
-
-  /**
-   * Unique identifier for this client
-   */
-  private String clientIdentifier;
-
-  /*
-   * TODO: These should be removed from here in future release, no reason to store them here, right?
-   */
-  private String mUsername, mPassword;
-
-  private boolean cleanSession = true;
-
-  private boolean willFlag;
-  private String willTopic;
-  private String willMessage;
-  private HashSet<String> subscribedTopics;
-
-  // PING VARIABLES
-  private volatile long lastPingResp = 0L;
-  private volatile long lastSentMessage = 0L;
-
-  private MQTTIdentifierHelper mMqttIdentifierHelper;
-
-  private boolean doAutomaticReconnect = false;
-  private Handler reconnectHandler = new Handler();
-  private Runnable recoonectRunnable = new Runnable() {
-    @Override
-    public void run() {
-      if (mState != STATE_CONNECTING && mState != STATE_CONNECTED) {
-        connect();
-      }
+    private static final boolean DEBUG = true;
+
+    private static final String TAG = QatjaService.class.getSimpleName();
+
+    /**
+     * Current state of the connection
+     */
+    private volatile int mState = STATE_NONE;
+
+    /**
+     * How long to wait before a reconnect attempt is made
+     */
+    private long mReconnectDelay = 5000;
+
+    /**
+     * Thread to handle setup of connections
+     */
+    private ConnectThread mConnectThread;
+
+    /**
+     * Thread to handle communication when connection is established.
+     */
+    private ConnectedThread mConnectedThread;
+
+    /**
+     * Keepalive timer
+     */
+    private int KEEP_ALIVE_TIMER = 3000;
+
+    /**
+     * Handler used to queue PINGRESP messages, will be automatically queued when sending a message,
+     * or when connecting.
+     */
+    private Handler mKeepaliveHandler;
+
+    /**
+     *
+     */
+    private Handler mHandler = null;
+
+    /**
+     * The local binder object
+     */
+    private final QatjaBinder mBinder = new QatjaBinder();
+
+    /**
+     * The default is the localhost (emulator link to
+     */
+    private String host = "47.106.237.76";
+
+    /**
+     * The default is no SSL, turning this on before connect will enforce an SSL connection attempt.
+     */
+    private SSLSocketFactory socketFactory = null;
+
+    private int port = 1883;
+
+    /*
+      For some reason used in interop test suites... only reason it's included here.
+     */
+    private String protocolName = null;
+
+    /**
+     * Unique identifier for this client
+     */
+    private String clientIdentifier;
+
+    /*
+     * TODO: These should be removed from here in future release, no reason to store them here, right?
+     */
+    private String mUsername, mPassword;
+
+    private boolean cleanSession = true;
+
+    private boolean willFlag;
+    private String willTopic;
+    private String willMessage;
+    private HashSet<String> subscribedTopics;
+
+    // PING VARIABLES
+    private volatile long lastPingResp = 0L;
+    private volatile long lastSentMessage = 0L;
+
+    private MQTTIdentifierHelper mMqttIdentifierHelper;
+
+    private boolean doAutomaticReconnect = false;
+    private Handler reconnectHandler = new Handler();
+    private Runnable recoonectRunnable = new Runnable() {
+        @Override
+        public void run() {
+            if (mState != STATE_CONNECTING && mState != STATE_CONNECTED) {
+                connect();
+            }
+        }
+    };
+
+    private StateListener mStateListener = null;
+
+    public interface StateListener {
+        void onStateChanged(int newState);
+    }
+
+    public void setStateListener(StateListener stateListener) {
+        mStateListener = stateListener;
+
+        if (mStateListener != null) {
+            mStateListener.onStateChanged(mState);
+        }
     }
-  };
 
-  private StateListener mStateListener = null;
+    @Override
+    public void onCreate() {
+        super.onCreate();
 
-  public interface StateListener {
-    void onStateChanged(int newState);
-  }
+        if (DEBUG)
+            Log.d(TAG, "onCreate");
 
-  public void setStateListener(StateListener stateListener) {
-    mStateListener = stateListener;
+        subscribedTopics = new HashSet<>();
+
+        mMqttIdentifierHelper = new MQTTIdentifierHelper();
 
-    if (mStateListener != null) {
-      mStateListener.onStateChanged(mState);
     }
-  }
 
-  @Override
-  public void onCreate() {
-    super.onCreate();
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (DEBUG)
+            Log.d(TAG, "onStartCommand");
 
-    if (DEBUG)
-      Log.d(TAG, "onCreate");
+        // Start a sticky service, the system will try to recreate this service if killed.
 
-    subscribedTopics = new HashSet<>();
+        return START_STICKY;
+    }
 
-    mMqttIdentifierHelper = new MQTTIdentifierHelper();
+    @Override
+    public void onDestroy() {
+        cleanUp();
 
-  }
+        setState(STATE_NONE);
 
-  @Override
-  public int onStartCommand(Intent intent, int flags, int startId) {
-    if (DEBUG)
-      Log.d(TAG, "onStartCommand");
+        if (DEBUG)
+            Log.d(TAG, "onDestroy");
 
-    // Start a sticky service, the system will try to recreate this service if killed.
+        super.onDestroy();
+    }
 
-    return START_STICKY;
-  }
+    @Override
+    public IBinder onBind(Intent intent) {
+        if (DEBUG)
+            Log.d(TAG, "onBind");
 
-  @Override
-  public void onDestroy() {
-    cleanUp();
+        return mBinder;
+    }
 
-    setState(STATE_NONE);
+    /**
+     * @author andreas
+     */
+    public class QatjaBinder extends Binder {
+        public QatjaService getService() {
+            return QatjaService.this;
+        }
+    }
 
-    if (DEBUG)
-      Log.d(TAG, "onDestroy");
+    /**
+     * Set Handler that receives all service state messages and mqtt messages
+     *
+     * @param handler The listener
+     */
+    public void setHandler(Handler handler) {
+        mHandler = handler;
+    }
 
-    super.onDestroy();
-  }
+    /**
+     * Send a CONNECT message to the server.
+     */
+    private void connect(String clientIdentifier) {
 
-  @Override
-  public IBinder onBind(Intent intent) {
-    if (DEBUG)
-      Log.d(TAG, "onBind");
+        MQTTConnect connect;
+        if (!TextUtils.isEmpty(mUsername) && !TextUtils.isEmpty(mPassword)) {
+            connect = MQTTConnect.newInstance(clientIdentifier, mUsername, mPassword);
+        } else {
+            connect = MQTTConnect.newInstance(clientIdentifier);
+        }
 
-    return mBinder;
-  }
+        connect.setCleanSession(cleanSession);
+        connect.setKeepAlive(60);
+        connect.setWillFlag(willFlag);
+        if (willFlag) {
+            connect.setWillTopic(willTopic);
+            connect.setWillMessage(willMessage);
+        }
+
+        if (protocolName != null)
+            connect.setProtocolName(protocolName);
 
-  /**
-   * @author andreas
-   */
-  public class QatjaBinder extends Binder {
-    public QatjaService getService() {
-      return QatjaService.this;
+        sendMessage(connect, false);
     }
-  }
-
-  /**
-   * Set Handler that receives all service state messages and mqtt messages
-   *
-   * @param handler The listener
-   */
-  public void setHandler(Handler handler) {
-    mHandler = handler;
-  }
-
-  /**
-   * Send a CONNECT message to the server.
-   */
-  private void connect(String clientIdentifier) {
-
-    MQTTConnect connect;
-    if (!TextUtils.isEmpty(mUsername) && !TextUtils.isEmpty(mPassword)) {
-      connect = MQTTConnect.newInstance(clientIdentifier, mUsername, mPassword);
-    } else {
-      connect = MQTTConnect.newInstance(clientIdentifier);
+
+    /**
+     * Publish a message (String) to a specified topic.
+     *
+     * @param topic   Topic to publish to
+     * @param message Message to publish
+     */
+    public void publish(String topic, String message) {
+        publish(topic, message.getBytes());
     }
 
-    connect.setCleanSession(cleanSession);
-    connect.setKeepAlive(60);
-    connect.setWillFlag(willFlag);
-    if (willFlag) {
-      connect.setWillTopic(willTopic);
-      connect.setWillMessage(willMessage);
+    /**
+     * Publish a payload (byte[]) to a specified topic.
+     *
+     * @param topic   Topic to publish to
+     * @param payload Message to publish
+     */
+    public void publish(String topic, byte[] payload) {
+        publish(topic, payload, AT_MOST_ONCE);
     }
 
-    if (protocolName != null)
-      connect.setProtocolName(protocolName);
-
-    sendMessage(connect, false);
-  }
-
-  /**
-   * Publish a message (String) to a specified topic.
-   *
-   * @param topic   Topic to publish to
-   * @param message Message to publish
-   */
-  public void publish(String topic, String message) {
-    publish(topic, message.getBytes());
-  }
-
-  /**
-   * Publish a payload (byte[]) to a specified topic.
-   *
-   * @param topic   Topic to publish to
-   * @param payload Message to publish
-   */
-  public void publish(String topic, byte[] payload) {
-    publish(topic, payload, AT_MOST_ONCE);
-  }
-
-  /**
-   * Publish a message to a specified topic.
-   *
-   * @param topic   Topic to publish to
-   * @param message Message to publish
-   * @param qos     Quality of service to publish as
-   */
-  public void publish(String topic, String message, byte qos) {
-    publish(topic, message.getBytes(), qos);
-  }
-
-  /**
-   * Publish a message (byte[]) to a specified topic.
-   *
-   * @param topic   the topic
-   * @param payload the message
-   * @param qos     the desired quality of service
-   */
-  public void publish(String topic, byte[] payload, byte qos) {
-    MQTTPublish publish = MQTTPublish.newInstance(topic, payload, qos, mMqttIdentifierHelper.getIdentifier());
-    sendMessage(publish);
-  }
-
-  /**
-   * Publish a retained message to a specified topic.
-   *
-   * @param topic   the topic
-   * @param message the message
-   * @param qos     the desired quality of service
-   */
-  public void publishRetain(String topic, String message, byte qos) {
-    publishRetain(topic, message.getBytes(), qos);
-  }
-
-  /**
-   * Publish a retained message to a specified topic.
-   *
-   * @param topic   the topic
-   * @param payload the message to publish
-   * @param qos     the desired quality of service
-   */
-  public void publishRetain(String topic, byte[] payload, byte qos) {
-    MQTTPublish publish = MQTTPublish.newInstance(topic, payload, qos);
-    publish.setRetain(true);
-    sendMessage(publish);
-  }
-
-  /**
-   * Subscribe to a topic with Quality of Service (QoS) level
-   * {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE}
-   *
-   * @param topic Topic to subscribe to
-   */
-  public void subscribe(String topic) {
-    String[] topics = {topic};
-    subscribe(topics);
-  }
-
-  /**
-   * Subscribe to multiple topics with quality of service
-   * {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE}
-   *
-   * @param topics Topics to subscribe to
-   */
-  public void subscribe(String[] topics) {
-    byte[] qoss = new byte[topics.length];
-    for (int i = 0; i < qoss.length; i++)
-      qoss[i] = AT_MOST_ONCE;
-    subscribe(topics, qoss);
-  }
-
-  /**
-   * Subscribe to a topic
-   *
-   * @param topic Topic to subscribe to
-   * @param qos   Quality of service, can be {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE},
-   *              {@link se.wetcat.qatja.MQTTConstants#AT_LEAST_ONCE}, or
-   *              {@link se.wetcat.qatja.MQTTConstants#EXACTLY_ONCE}.
-   */
-  public void subscribe(String topic, byte qos) {
-    String[] topics = {topic};
-    byte[] qoss = {qos};
-    subscribe(topics, qoss);
-  }
-
-  /**
-   * Subscribe to multiple topics
-   *
-   * @param topics Topic to subscribe to
-   * @param qoss   Quality of service, can be {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE},
-   *               {@link se.wetcat.qatja.MQTTConstants#AT_LEAST_ONCE}, or
-   *               {@link se.wetcat.qatja.MQTTConstants#EXACTLY_ONCE}.
-   */
-  public void subscribe(String[] topics, byte[] qoss) {
-    // Ensure the subscribedTopics isn't null
-    if (subscribedTopics == null)
-      subscribedTopics = new HashSet<>();
-
-    for(int i = 0; i < topics.length; i++) {
-      HashSet<String> newTopics = new HashSet<>();
-
-      if(!subscribedTopics.contains(topics[i])) {
-        newTopics.add(topics[i]);
-      }
-      topics = newTopics.toArray(new String[0]);
+    /**
+     * Publish a message to a specified topic.
+     *
+     * @param topic   Topic to publish to
+     * @param message Message to publish
+     * @param qos     Quality of service to publish as
+     */
+    public void publish(String topic, String message, byte qos) {
+        publish(topic, message.getBytes(), qos);
     }
 
-    if(topics.length == 0) {
-      return;
+    /**
+     * Publish a message (byte[]) to a specified topic.
+     *
+     * @param topic   the topic
+     * @param payload the message
+     * @param qos     the desired quality of service
+     */
+    public void publish(String topic, byte[] payload, byte qos) {
+        MQTTPublish publish = MQTTPublish.newInstance(topic, payload, qos, mMqttIdentifierHelper.getIdentifier());
+        sendMessage(publish);
     }
 
-    int id = mMqttIdentifierHelper.getIdentifier();
-
-    MQTTSubscribe subscribe = MQTTSubscribe.newInstance(topics, qoss, id);
-    sendMessage(subscribe);
-
-    subscribedTopics.addAll(Arrays.asList(topics));
-
-    mMqttIdentifierHelper.addSentPackage(subscribe);
-  }
-
-  // public synchronized void start() {
-  // if (DEBUG)
-  // Log.d(TAG, "start");
-  //
-  // // Cancel any thread attempting to make a connection
-  // if (mConnectThread != null) {
-  // mConnectThread.cancel();
-  // mConnectThread = null;
-  // }
-  //
-  // // Cancel any thread currently running a connection
-  // if (mConnectedThread != null) {
-  // mConnectedThread.cancel();
-  // mConnectedThread = null;
-  // }
-  //
-  // setState(STATE_NONE);
-  //
-  // // if (host != null)
-  // // connect(host, port);
-  // }
-
-  public synchronized void sendMessage(MQTTMessage msg) {
-    sendMessage(msg, true);
-  }
-
-  public synchronized void sendMessage(MQTTMessage msg, boolean mustBeConnected) {
-    if (DEBUG)
-      Log.d(TAG, "Sending message: " + MQTTHelper.decodePackageName(msg));
-
-    if (mustBeConnected) {
-      if (getState() == STATE_CONNECTED) {
-        new WriterTask().execute(msg);
-      } else {
-        if (DEBUG)
-          Log.d(TAG, "Need to be connected to send " + MQTTHelper.decodePackageName(msg));
+    /**
+     * Publish a retained message to a specified topic.
+     *
+     * @param topic   the topic
+     * @param message the message
+     * @param qos     the desired quality of service
+     */
+    public void publishRetain(String topic, String message, byte qos) {
+        publishRetain(topic, message.getBytes(), qos);
+    }
 
-        // If we lost the connection, and reconnect is set, let's try to reconnect now!
-        if (doAutomaticReconnect)
-          reconnect();
-      }
-    } else {
-      new WriterTask().execute(msg);
+    /**
+     * Publish a retained message to a specified topic.
+     *
+     * @param topic   the topic
+     * @param payload the message to publish
+     * @param qos     the desired quality of service
+     */
+    public void publishRetain(String topic, byte[] payload, byte qos) {
+        MQTTPublish publish = MQTTPublish.newInstance(topic, payload, qos);
+        publish.setRetain(true);
+        sendMessage(publish);
     }
 
+    /**
+     * Subscribe to a topic with Quality of Service (QoS) level
+     * {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE}
+     *
+     * @param topic Topic to subscribe to
+     */
+    public void subscribe(String topic) {
+        String[] topics = {topic};
+        subscribe(topics);
+    }
+
+    /**
+     * Subscribe to multiple topics with quality of service
+     * {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE}
+     *
+     * @param topics Topics to subscribe to
+     */
+    public void subscribe(String[] topics) {
+        byte[] qoss = new byte[topics.length];
+        for (int i = 0; i < qoss.length; i++)
+            qoss[i] = AT_MOST_ONCE;
+        subscribe(topics, qoss);
+    }
+
+    /**
+     * Subscribe to a topic
+     *
+     * @param topic Topic to subscribe to
+     * @param qos   Quality of service, can be {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE},
+     *              {@link se.wetcat.qatja.MQTTConstants#AT_LEAST_ONCE}, or
+     *              {@link se.wetcat.qatja.MQTTConstants#EXACTLY_ONCE}.
+     */
+    public void subscribe(String topic, byte qos) {
+        String[] topics = {topic};
+        byte[] qoss = {qos};
+        subscribe(topics, qoss);
+    }
+
+    /**
+     * Subscribe to multiple topics
+     *
+     * @param topics Topic to subscribe to
+     * @param qoss   Quality of service, can be {@link se.wetcat.qatja.MQTTConstants#AT_MOST_ONCE},
+     *               {@link se.wetcat.qatja.MQTTConstants#AT_LEAST_ONCE}, or
+     *               {@link se.wetcat.qatja.MQTTConstants#EXACTLY_ONCE}.
+     */
+    public void subscribe(String[] topics, byte[] qoss) {
+        // Ensure the subscribedTopics isn't null
+        if (subscribedTopics == null)
+            subscribedTopics = new HashSet<>();
+
+        for (int i = 0; i < topics.length; i++) {
+            HashSet<String> newTopics = new HashSet<>();
+
+            if (!subscribedTopics.contains(topics[i])) {
+                newTopics.add(topics[i]);
+            }
+            topics = newTopics.toArray(new String[0]);
+        }
+
+        if (topics.length == 0) {
+            return;
+        }
+
+        int id = mMqttIdentifierHelper.getIdentifier();
+
+        MQTTSubscribe subscribe = MQTTSubscribe.newInstance(topics, qoss, id);
+        sendMessage(subscribe);
+
+        subscribedTopics.addAll(Arrays.asList(topics));
+
+        mMqttIdentifierHelper.addSentPackage(subscribe);
+    }
+
+    // public synchronized void start() {
+    // if (DEBUG)
+    // Log.d(TAG, "start");
+    //
+    // // Cancel any thread attempting to make a connection
+    // if (mConnectThread != null) {
+    // mConnectThread.cancel();
+    // mConnectThread = null;
+    // }
+    //
+    // // Cancel any thread currently running a connection
+    // if (mConnectedThread != null) {
+    // mConnectedThread.cancel();
+    // mConnectedThread = null;
+    // }
+    //
+    // setState(STATE_NONE);
+    //
+    // // if (host != null)
+    // // connect(host, port);
+    // }
+
+    public synchronized void sendMessage(MQTTMessage msg) {
+        sendMessage(msg, true);
+    }
+
+    public synchronized void sendMessage(MQTTMessage msg, boolean mustBeConnected) {
+        if (DEBUG)
+            Log.d(TAG, "Sending message: " + MQTTHelper.decodePackageName(msg));
+
+        if (mustBeConnected) {
+            if (getState() == STATE_CONNECTED) {
+                new WriterTask().execute(msg);
+            } else {
+                if (DEBUG)
+                    Log.d(TAG, "Need to be connected to send " + MQTTHelper.decodePackageName(msg));
+
+                // If we lost the connection, and reconnect is set, let's try to reconnect now!
+                if (doAutomaticReconnect)
+                    reconnect();
+            }
+        } else {
+            new WriterTask().execute(msg);
+        }
+
 
 //    if (mustBeConnected) {
 //      if (getState() == STATE_CONNECTED) {
@@ -513,761 +513,767 @@ public class QatjaService extends Service {
 //        Log.e(TAG, "FAiled to send message " + MQTTHelper.decodePackageName(msg.getType()), e);
 //      }
 //    }
-  }
-
-  public String[] getSubscribedTopics() {
-    if(subscribedTopics == null) {
-      return new String[]{};
     }
-    return subscribedTopics.toArray(new String[0]);
-  }
-
-  public void setSSLSocketFactory(SSLSocketFactory socketFactory) {
-    this.socketFactory = socketFactory;
-  }
-
-  /**
-   * Set MQTT broker host, can be either a domain name or an ip address
-   *
-   * @param host the host
-   */
-  public void setHost(String host) {
-    this.host = host;
-  }
-
-  /**
-   * Set MQTT broker port
-   *
-   * @param port
-   */
-  public void setPort(int port) {
-    this.port = port;
-  }
-
-  /**
-   * Set client identifier
-   *
-   * @param clientIdentifier the identifier
-   */
-  public void setIdentifier(String clientIdentifier) {
-    this.clientIdentifier = clientIdentifier;
-  }
-
-  public void setUsername(String username) { this.mUsername = username; }
-
-  public void setPassword(String password) { this.mPassword = password; }
-
-  public void setProtocolName(String protocolName) {
-    this.protocolName = protocolName;
-  }
-
-  /**
-   * Set clean session
-   *
-   * @param clean_session
-   */
-  public void setCleanSession(boolean clean_session) {
-    this.cleanSession = clean_session;
-  }
-
-  /**
-   * Set will
-   *
-   * @param topic   the will topic
-   * @param message the will message
-   */
-  public void setWill(String topic, String message) {
-    if (topic == null || message == null) {
-      willFlag = false;
-    } else {
-      willTopic = topic;
-      willMessage = message;
-      willFlag = true;
-    }
-  }
-
-  /**
-   * Set automatic reconnect
-   *
-   * @param reconnect
-   */
-  public void setReconnect(boolean reconnect) {
-    doAutomaticReconnect = reconnect;
-  }
-
-  public void setReconnectDelay(long millis) {
-    mReconnectDelay = millis;
-  }
-
-  /**
-   * Attempt to reconnect after {@link #mReconnectDelay} milliseconds
-   */
-  public void reconnect() {
-    reconnectHandler.postDelayed(recoonectRunnable, mReconnectDelay);
-  }
-
-  /**
-   * Attempt to reconnect after delay
-   *
-   * @param milliseconds the delay
-   */
-  public void reconnect(long milliseconds) {
-    reconnectHandler.postDelayed(recoonectRunnable, milliseconds);
-  }
-
-  /**
-   * This runnable will take care of sending a ping request, it will be automatically cancelled and
-   * rescheduled if another message was sent to the broker (as defined in MQTT spec 3.1.1 we're not
-   * required to send ping as long as another message has been sent within the specified period.
-   */
-  private Runnable mPingSender = new Runnable() {
-    @Override
-    public void run() {
-      sendMessage(MQTTPingreq.newInstance());
 
-      // Make sure to auto-queue the runnable again when the message has been sent.
-      mKeepaliveHandler.postDelayed(mPingSender, KEEP_ALIVE_TIMER);
+    public String[] getSubscribedTopics() {
+        if (subscribedTopics == null) {
+            return new String[]{};
+        }
+        return subscribedTopics.toArray(new String[0]);
     }
-  };
-
-  /**
-   * Start a connection attempt
-   */
-  public synchronized void connect() {
-    if (DEBUG)
-      Log.d(TAG, "connect to: " + host);
-
-    cleanUp();
 
-    // Start the thread to connect with the given device
-    try {
-        mConnectThread = new ConnectThread(host, port);
-        mConnectThread.start();
+    public void setSSLSocketFactory(SSLSocketFactory socketFactory) {
+        this.socketFactory = socketFactory;
+    }
 
-        setState(STATE_CONNECTING);
-    } catch (Exception e) {
-        Log.e(TAG, e.getMessage(), e);
+    /**
+     * Set MQTT broker host, can be either a domain name or an ip address
+     *
+     * @param host the host
+     */
+    public void setHost(String host) {
+        this.host = host;
+    }
 
-        setState(STATE_CONNECTION_FAILED);
+    /**
+     * Set MQTT broker port
+     *
+     * @param port
+     */
+    public void setPort(int port) {
+        this.port = port;
     }
-  }
-
-  public synchronized void connect(boolean newSocket) {
-    if (DEBUG)
-      Log.d(TAG, "connect to: " + host);
-    if (newSocket) {
-      // Cancel any future ping requests
-      if (mKeepaliveHandler != null) {
-        mKeepaliveHandler.removeCallbacks(mPingSender);
-        mKeepaliveHandler = null;
-      }
-
-      // Cancel any thread attempting to make a connection
-      if (getState() == STATE_CONNECTING) {
-        if (mConnectThread != null) {
-          mConnectThread.cancel();
-          mConnectThread = null;
-        }
-      }
 
-      // Cancel any thread currently running a connection
-      if (mConnectedThread != null) {
-        mConnectedThread.cancel();
-        mConnectedThread = null;
-      }
+    /**
+     * Set client identifier
+     *
+     * @param clientIdentifier the identifier
+     */
+    public void setIdentifier(String clientIdentifier) {
+        this.clientIdentifier = clientIdentifier;
+    }
 
-      if(subscribedTopics != null) {
-        subscribedTopics.clear();
-      }
+    public void setUsername(String username) {
+        this.mUsername = username;
+    }
 
-      // Start the thread to connect with the given device
-      try {
-          mConnectThread = new ConnectThread(host, port);
-          mConnectThread.start();
+    public void setPassword(String password) {
+        this.mPassword = password;
+    }
 
-          setState(STATE_CONNECTING);
-      } catch (Exception e) {
-          Log.e(TAG, e.getMessage(), e);
+    public void setProtocolName(String protocolName) {
+        this.protocolName = protocolName;
+    }
 
-          setState(STATE_CONNECTION_FAILED);
-      }
-    } else {
-      setState(STATE_CONNECTING);
+    /**
+     * Set clean session
+     *
+     * @param clean_session
+     */
+    public void setCleanSession(boolean clean_session) {
+        this.cleanSession = clean_session;
+    }
 
-      connect(clientIdentifier);
+    /**
+     * Set will
+     *
+     * @param topic   the will topic
+     * @param message the will message
+     */
+    public void setWill(String topic, String message) {
+        if (topic == null || message == null) {
+            willFlag = false;
+        } else {
+            willTopic = topic;
+            willMessage = message;
+            willFlag = true;
+        }
     }
-  }
-
-  /**
-   * Service connected
-   *
-   * @param socket the connected socket
-   */
-  private synchronized void connected(Socket socket) {
-    if (DEBUG)
-      Log.d(TAG, "connected, Socket Type:");
-
-    // Cancel any future ping requests
-    if (mKeepaliveHandler != null) {
-      mKeepaliveHandler.removeCallbacks(mPingSender);
-      mKeepaliveHandler = null;
+
+    /**
+     * Set automatic reconnect
+     *
+     * @param reconnect
+     */
+    public void setReconnect(boolean reconnect) {
+        doAutomaticReconnect = reconnect;
     }
 
-    // Cancel the thread that completed the connection
-    if (mConnectThread != null) {
-      mConnectThread.cancel();
-      mConnectThread = null;
+    public void setReconnectDelay(long millis) {
+        mReconnectDelay = millis;
     }
 
-    // Cancel any thread currently running a connection
-    if (mConnectedThread != null) {
-      mConnectedThread.cancel();
-      mConnectedThread = null;
+    /**
+     * Attempt to reconnect after {@link #mReconnectDelay} milliseconds
+     */
+    public void reconnect() {
+        reconnectHandler.postDelayed(recoonectRunnable, mReconnectDelay);
     }
 
-    if(subscribedTopics != null) {
-      subscribedTopics.clear();
+    /**
+     * Attempt to reconnect after delay
+     *
+     * @param milliseconds the delay
+     */
+    public void reconnect(long milliseconds) {
+        reconnectHandler.postDelayed(recoonectRunnable, milliseconds);
     }
 
-    // Start the thread to manage the connection and perform transmissions
-    mConnectedThread = new ConnectedThread(socket);
-    mConnectedThread.start();
+    /**
+     * This runnable will take care of sending a ping request, it will be automatically cancelled and
+     * rescheduled if another message was sent to the broker (as defined in MQTT spec 3.1.1 we're not
+     * required to send ping as long as another message has been sent within the specified period.
+     */
+    private Runnable mPingSender = new Runnable() {
+        @Override
+        public void run() {
+            sendMessage(MQTTPingreq.newInstance());
 
-    // Start the PINGREQ handler
-    mKeepaliveHandler = new Handler(getMainLooper());
-    mKeepaliveHandler.postDelayed(mPingSender, KEEP_ALIVE_TIMER);
+            // Make sure to auto-queue the runnable again when the message has been sent.
+            mKeepaliveHandler.postDelayed(mPingSender, KEEP_ALIVE_TIMER);
+        }
+    };
 
-    Log.d(TAG, "Sending connect message");
+    /**
+     * Start a connection attempt
+     */
+    public synchronized void connect() {
+        if (DEBUG)
+            Log.d(TAG, "connect to: " + host);
 
-    // Send the connect message
-    connect(clientIdentifier);
+        cleanUp();
 
-    // setState(STATE_CONNECTED);
-  }
+        // Start the thread to connect with the given device
+        try {
+            mConnectThread = new ConnectThread(host, port);
+            mConnectThread.start();
 
-  /**
-   * Indicate that the connection attempt failed and notify the UI Activity.
-   */
-  private void connectionFailed(Exception e) {
-    if (DEBUG)
-      Log.d(TAG, "connectionFailed", e);
+            setState(STATE_CONNECTING);
+        } catch (Exception e) {
+            Log.e(TAG, e.getMessage(), e);
 
-    if(subscribedTopics != null) {
-      subscribedTopics.clear();
+            setState(STATE_CONNECTION_FAILED);
+        }
     }
 
-    if (doAutomaticReconnect)
-      reconnect();
-
-    setState(STATE_CONNECTION_FAILED);
-  }
+    public synchronized void connect(boolean newSocket) {
+        if (DEBUG)
+            Log.d(TAG, "connect to: " + host);
+        if (newSocket) {
+            // Cancel any future ping requests
+            if (mKeepaliveHandler != null) {
+                mKeepaliveHandler.removeCallbacks(mPingSender);
+                mKeepaliveHandler = null;
+            }
 
-  /**
-   * Indicate that the connection was lost and notify the UI Activity.
-   */
-  private void connectionLost() {
-    if (DEBUG)
-      Log.d(TAG, "connectionLost");
+            // Cancel any thread attempting to make a connection
+            if (getState() == STATE_CONNECTING) {
+                if (mConnectThread != null) {
+                    mConnectThread.cancel();
+                    mConnectThread = null;
+                }
+            }
 
-    cleanUp();
+            // Cancel any thread currently running a connection
+            if (mConnectedThread != null) {
+                mConnectedThread.cancel();
+                mConnectedThread = null;
+            }
 
-    setState(STATE_NONE);
+            if (subscribedTopics != null) {
+                subscribedTopics.clear();
+            }
 
-    if (doAutomaticReconnect)
-      reconnect();
-  }
+            // Start the thread to connect with the given device
+            try {
+                mConnectThread = new ConnectThread(host, port);
+                mConnectThread.start();
 
-  /**
-   * Disconnect the MQTT service
-   */
-  public void disconnect() {
-    if (mState == STATE_CONNECTED) {
-      sendMessage(MQTTDisconnect.newInstance());
-    }
-  }
-
-  /**
-   * Clean up the connection handling.
-   */
-  private void cleanUp() {
-    if (DEBUG) {
-      Log.d(TAG, "cleanUp()");
-    }
+                setState(STATE_CONNECTING);
+            } catch (Exception e) {
+                Log.e(TAG, e.getMessage(), e);
 
-    // Cancel any future ping requests
-    try {
-      if (mKeepaliveHandler != null) {
-        mKeepaliveHandler.removeCallbacks(mPingSender);
-        mKeepaliveHandler = null;
-      }
-    } catch (Exception e) {
-      Log.e(TAG, e.getMessage(), e);
-    }
+                setState(STATE_CONNECTION_FAILED);
+            }
+        } else {
+            setState(STATE_CONNECTING);
 
-    // Cancel the thread that completed the connection
-    if (mConnectThread != null) {
-      mConnectThread.cancel();
-      mConnectThread = null;
+            connect(clientIdentifier);
+        }
     }
 
-    // Cancel any thread currently running a connection
-    if (mConnectedThread != null) {
-      mConnectedThread.cancel();
-      mConnectedThread = null;
-    }
+    /**
+     * Service connected
+     *
+     * @param socket the connected socket
+     */
+    private synchronized void connected(Socket socket) {
+        if (DEBUG)
+            Log.d(TAG, "connected, Socket Type:");
 
-    try {
-      if (subscribedTopics != null) {
-        subscribedTopics.clear();
-      }
-    } catch (Exception e) {
-      Log.e(TAG, e.getMessage(), e);
-    }
-  }
+        // Cancel any future ping requests
+        if (mKeepaliveHandler != null) {
+            mKeepaliveHandler.removeCallbacks(mPingSender);
+            mKeepaliveHandler = null;
+        }
 
-  /**
-   * Set the connection state
-   *
-   * @param state the state
-   */
-  private synchronized void setState(int state) {
-    if (DEBUG)
-      Log.d(TAG, "setState() " + mState + " -> " + state);
+        // Cancel the thread that completed the connection
+        if (mConnectThread != null) {
+            mConnectThread.cancel();
+            mConnectThread = null;
+        }
 
-    if (mState != state) {
-      mState = state;
+        // Cancel any thread currently running a connection
+        if (mConnectedThread != null) {
+            mConnectedThread.cancel();
+            mConnectedThread = null;
+        }
 
-      if (mHandler != null) {
-        if (mStateListener != null) {
-          mStateListener.onStateChanged(state);
+        if (subscribedTopics != null) {
+            subscribedTopics.clear();
         }
 
-        // Give the new state to the Handler so the UI Activity can
-        // update
-        mHandler.obtainMessage(STATE_CHANGE, state, -1).sendToTarget();
-      }
+        // Start the thread to manage the connection and perform transmissions
+        mConnectedThread = new ConnectedThread(socket);
+        mConnectedThread.start();
+
+        // Start the PINGREQ handler
+        mKeepaliveHandler = new Handler(getMainLooper());
+        mKeepaliveHandler.postDelayed(mPingSender, KEEP_ALIVE_TIMER);
+
+        Log.d(TAG, "Sending connect message");
+
+        // Send the connect message
+        connect(clientIdentifier);
+
+        // setState(STATE_CONNECTED);
     }
-  }
-
-  /**
-   * Get the connection state
-   *
-   * @return the state
-   */
-  public synchronized int getState() {
-    return mState;
-  }
-
-  /**
-   * Set keep alive timer in milliseconds
-   *
-   * @param milliseconds the time
-   */
-  public void setKeepAlive(int milliseconds) {
-    KEEP_ALIVE_TIMER = milliseconds;
-  }
-
-  /**
-   * Make sure to resend packages that haven't been successfully sent.
-   */
-  private synchronized void resendPackages() {
-    for (MQTTMessage msg : mMqttIdentifierHelper.getSentPackages().values()) {
-      if (msg instanceof MQTTPublish) {
-        ((MQTTPublish) msg).setDup();
-      }
-      sendMessage(msg);
+
+    /**
+     * Indicate that the connection attempt failed and notify the UI Activity.
+     */
+    private void connectionFailed(Exception e) {
+        if (DEBUG)
+            Log.d(TAG, "connectionFailed", e);
+
+        if (subscribedTopics != null) {
+            subscribedTopics.clear();
+        }
+
+        if (doAutomaticReconnect)
+            reconnect();
+
+        setState(STATE_CONNECTION_FAILED);
     }
 
-    for (MQTTMessage msg : mMqttIdentifierHelper.getReceivedPackages().values()) {
-      if (msg instanceof MQTTPublish) {
-        ((MQTTPublish) msg).setDup();
-      }
-      sendMessage(msg);
+    /**
+     * Indicate that the connection was lost and notify the UI Activity.
+     */
+    private void connectionLost() {
+        if (DEBUG)
+            Log.d(TAG, "connectionLost");
+
+        cleanUp();
+
+        setState(STATE_NONE);
+
+        if (doAutomaticReconnect)
+            reconnect();
     }
-  }
-  private synchronized void handlePubmesage(MQTTPuback msg) {
-
-    Log.d(TAG, "Success handlePubmesage to " + new String(msg.getPayload()));
-  }
-  /**
-   * Manages subscription messages
-   *
-   * @param msg the message to handle
-   */
-  private synchronized void handleSubscriptions(MQTTMessage msg) {
-    if (msg instanceof MQTTSuback) {
-      MQTTSuback suback = (MQTTSuback) msg;
-
-      MQTTSubscribe subscribe = (MQTTSubscribe) mMqttIdentifierHelper.getSentPackages().get(suback.getPackageIdentifier());
-
-      String[] topicFilters = subscribe.getTopicFilters();
-      byte[] qoss = suback.getPayload();
-      for (int i = 0; i < qoss.length; i++) {
-        switch (qoss[i]) {
-          case SUBSCRIBE_SUCCESS_AT_MOST_ONCE:
-          case SUBSCRIBE_SUCCESS_AT_LEAST_ONCE:
-          case SUBSCRIBE_SUCCESS_EXACTLY_ONCE:
-            Log.d(TAG, "Success subscribing to " + topicFilters[i]);
-            break;
-
-          case SUBSCRIBE_FAILURE:
-            Log.d(TAG, "Failed subscribing to " + topicFilters[i]);
-            break;
+
+    /**
+     * Disconnect the MQTT service
+     */
+    public void disconnect() {
+        if (mState == STATE_CONNECTED) {
+            sendMessage(MQTTDisconnect.newInstance());
         }
-      }
-    } else if (msg instanceof MQTTUnsuback) {
-      MQTTUnsuback unsuback = (MQTTUnsuback) msg;
-
-      MQTTUnsubscribe unsubscribe = (MQTTUnsubscribe) mMqttIdentifierHelper.getSentPackages().get(unsuback.getPackageIdentifier());
-      String[] topicFilters = unsubscribe.getTopicFilters();
-      for (int i = 0; i < topicFilters.length; i++) {
-        Log.d(TAG, "Success unsubscribing to " + topicFilters[i]);
-      }
     }
 
-    mHandler.obtainMessage(msg.getType(), -1, -1, msg).sendToTarget();
-  }
+    /**
+     * Clean up the connection handling.
+     */
+    private void cleanUp() {
+        if (DEBUG) {
+            Log.d(TAG, "cleanUp()");
+        }
+
+        // Cancel any future ping requests
+        try {
+            if (mKeepaliveHandler != null) {
+                mKeepaliveHandler.removeCallbacks(mPingSender);
+                mKeepaliveHandler = null;
+            }
+        } catch (Exception e) {
+            Log.e(TAG, e.getMessage(), e);
+        }
+
+        // Cancel the thread that completed the connection
+        if (mConnectThread != null) {
+            mConnectThread.cancel();
+            mConnectThread = null;
+        }
 
-  private class ConnectThread extends Thread {
-    private static final String TAG = "ConnectThread";
+        // Cancel any thread currently running a connection
+        if (mConnectedThread != null) {
+            mConnectedThread.cancel();
+            mConnectedThread = null;
+        }
 
-    private final Socket mmSocket;
+        try {
+            if (subscribedTopics != null) {
+                subscribedTopics.clear();
+            }
+        } catch (Exception e) {
+            Log.e(TAG, e.getMessage(), e);
+        }
+    }
 
     /**
-     * Timeout of connection attempts (ms)
+     * Set the connection state
+     *
+     * @param state the state
      */
-    private int timeout = 3000;
+    private synchronized void setState(int state) {
+        if (DEBUG)
+            Log.d(TAG, "setState() " + mState + " -> " + state);
 
-    private InetSocketAddress remoteAddr;
+        if (mState != state) {
+            mState = state;
 
-    ConnectThread(String host, int port) throws IOException {
-      if (DEBUG)
-        Log.d(TAG, "CREATE mConnectThread ");
+            if (mHandler != null) {
+                if (mStateListener != null) {
+                    mStateListener.onStateChanged(state);
+                }
 
-      if (socketFactory != null) {
-          mmSocket = socketFactory.createSocket();
-      } else {
-          mmSocket = new Socket();
-      }
+                // Give the new state to the Handler so the UI Activity can
+                // update
+                mHandler.obtainMessage(STATE_CHANGE, state, -1).sendToTarget();
+            }
+        }
     }
 
-    public void run() {
-      if (DEBUG)
-        Log.d(TAG, "BEGIN mConnectThread");
+    /**
+     * Get the connection state
+     *
+     * @return the state
+     */
+    public synchronized int getState() {
+        return mState;
+    }
 
-      setName("ConnectThread");
+    /**
+     * Set keep alive timer in milliseconds
+     *
+     * @param milliseconds the time
+     */
+    public void setKeepAlive(int milliseconds) {
+        KEEP_ALIVE_TIMER = milliseconds;
+    }
 
-      remoteAddr = new InetSocketAddress(host, port);
+    /**
+     * Make sure to resend packages that haven't been successfully sent.
+     */
+    private synchronized void resendPackages() {
+        for (MQTTMessage msg : mMqttIdentifierHelper.getSentPackages().values()) {
+            if (msg instanceof MQTTPublish) {
+                ((MQTTPublish) msg).setDup();
+            }
+            sendMessage(msg);
+        }
 
-      // Make a connection to the Socket
-      try {
-        // This is a blocking call and will only return on a successful connection or an exception
-        mmSocket.connect(remoteAddr, timeout);
-      } catch (IOException e) {
-        // Close the socket
-        try {
-          mmSocket.close();
-        } catch (IOException e2) {
-          Log.e(TAG,
-              "unable to close() socket during connection failure",
-              e2);
+        for (MQTTMessage msg : mMqttIdentifierHelper.getReceivedPackages().values()) {
+            if (msg instanceof MQTTPublish) {
+                ((MQTTPublish) msg).setDup();
+            }
+            sendMessage(msg);
         }
-        connectionFailed(e);
-        return;
-      }
+    }
 
-      // Reset the ConnectThread because we're done
-      synchronized (this) {
-        mConnectThread = null;
-      }
+    private synchronized void handlePubmesage(MQTTPuback msg) {
 
-      // Start the connected thread
-      connected(mmSocket);
+        Log.d(TAG, "Success handlePubmesage to " + new String(msg.getPayload()));
     }
 
-    public void cancel() {
-      try {
-        mmSocket.close();
-      } catch (IOException e) {
-        Log.e(TAG, "close() of connect socket failed", e);
-      }
-    }
-  }
-
-  /**
-   * This thread runs during a connection with a remote device. It handles all incoming and outgoing
-   * transmissions.
-   */
-  private class ConnectedThread extends Thread {
-    private final Socket mmSocket;
-    private final InputStream mmInStream;
-    private final OutputStream mmOutStream;
-
-    public ConnectedThread(Socket socket) {
-      if (DEBUG)
-        Log.d(TAG, "CREATE mConnectedThread");
-
-      mmSocket = socket;
-      InputStream tmpIn = null;
-      OutputStream tmpOut = null;
-
-      // Get the Socket input and output streams
-      try {
-        tmpIn = socket.getInputStream();
-        tmpOut = socket.getOutputStream();
-      } catch (IOException e) {
-        Log.e(TAG, "temp sockets not created", e);
-      }
-
-      mmInStream = tmpIn;
-      mmOutStream = tmpOut;
-
-      if (DEBUG)
-        Log.d(TAG, "BEGIN mConnectedThread");
+    /**
+     * Manages subscription messages
+     *
+     * @param msg the message to handle
+     */
+    private synchronized void handleSubscriptions(MQTTMessage msg) {
+        if (msg instanceof MQTTSuback) {
+            MQTTSuback suback = (MQTTSuback) msg;
+
+            MQTTSubscribe subscribe = (MQTTSubscribe) mMqttIdentifierHelper.getSentPackages().get(suback.getPackageIdentifier());
+
+            String[] topicFilters = subscribe.getTopicFilters();
+            byte[] qoss = suback.getPayload();
+            for (int i = 0; i < qoss.length; i++) {
+                switch (qoss[i]) {
+                    case SUBSCRIBE_SUCCESS_AT_MOST_ONCE:
+                    case SUBSCRIBE_SUCCESS_AT_LEAST_ONCE:
+                    case SUBSCRIBE_SUCCESS_EXACTLY_ONCE:
+                        Log.d(TAG, "Success subscribing to " + topicFilters[i]);
+                        break;
+
+                    case SUBSCRIBE_FAILURE:
+                        Log.d(TAG, "Failed subscribing to " + topicFilters[i]);
+                        break;
+                }
+            }
+        } else if (msg instanceof MQTTUnsuback) {
+            MQTTUnsuback unsuback = (MQTTUnsuback) msg;
+
+            MQTTUnsubscribe unsubscribe = (MQTTUnsubscribe) mMqttIdentifierHelper.getSentPackages().get(unsuback.getPackageIdentifier());
+            String[] topicFilters = unsubscribe.getTopicFilters();
+            for (int i = 0; i < topicFilters.length; i++) {
+                Log.d(TAG, "Success unsubscribing to " + topicFilters[i]);
+            }
+        }
+
+        mHandler.obtainMessage(msg.getType(), -1, -1, msg).sendToTarget();
     }
 
-    public void run() {
-      int len;
-      byte[] buffer = new byte[16384];
+    private class ConnectThread extends Thread {
+        private static final String TAG = "ConnectThread";
 
-      // Keep listening to the InputStream while connected
-      while (!isInterrupted()) {
-        try {
-          // Read from the InputStream
-          len = mmInStream.read(buffer);
-
-          if (mHandler != null)
-
-            if (len > 0) {
-              byte type = MQTTHelper.decodeType(buffer);
-
-              if (DEBUG)
-                Log.d(TAG, "Received " + MQTTHelper.decodePackageName(type));
-
-              // Handle automatic responses here
-              switch (type) {
-                case CONNECT:
-                  // Client should never receive CONNECT message
-                  break;
-
-                case CONNACK:
-                  MQTTConnack connack = MQTTConnack.fromBuffer(buffer);
-
-                  switch (connack.getReturnCode()) {
-                    case CONNECTION_ACCEPTED:
-                      if (DEBUG)
-                        Log.d(TAG, "Connected");
-                      setState(STATE_CONNECTED);
-                      break;
-
-                    case CONNECTION_REFUSED_VERSION:
-                      if (DEBUG)
-                        Log.d(TAG, "Failed to connect, unaccebtable protocol version");
-                      setState(STATE_CONNECTION_FAILED);
-                      break;
-
-                    case CONNECTION_REFUSED_IDENTIFIER:
-                      if (DEBUG)
-                        Log.d(TAG, "Failed to connect, identifier rejected");
-                      setState(STATE_CONNECTION_FAILED);
-                      break;
-
-                    case CONNECTION_REFUSED_SERVER:
-                      if (DEBUG)
-                        Log.d(TAG, "Failed to connect, server unavailable");
-                      setState(STATE_CONNECTION_FAILED);
-                      break;
-
-                    case CONNECTION_REFUSED_USER:
-                      if (DEBUG)
-                        Log.d(TAG, "Failed to connect, bad username or password");
-                      setState(STATE_CONNECTION_FAILED);
-                      break;
-
-                    case CONNECTION_REFUSED_AUTH:
-                      if (DEBUG)
-                        Log.d(TAG, "Failed to connect, not authorized");
-                      setState(STATE_CONNECTION_FAILED);
-                      break;
-                  }
-                  break;
-
-                case PUBLISH:
-                  MQTTPublish publish = MQTTPublish.fromBuffer(buffer);
-                  switch (publish.getQoS()) {
-                    case AT_MOST_ONCE:
-                      // Do nothing
-                      break;
-
-                    case AT_LEAST_ONCE:
-                      // Send PUBACK
-                      MQTTPuback puback_ = MQTTPuback.newInstance(publish.getPackageIdentifier());
-                      sendMessage(puback_);
-                      break;
-
-                    case EXACTLY_ONCE:
-                      // Send PUBREC and store message
-                      MQTTPubrec pubrec_ = MQTTPubrec.newInstance(publish.getPackageIdentifier());
-                      mMqttIdentifierHelper.addReceivedPackage(pubrec_);
-                      sendMessage(pubrec_);
-
-                      mMqttIdentifierHelper.addSentPackage(pubrec_);
-                      break;
-                  }
-                  mHandler.obtainMessage(PUBLISH, mState, -1, publish).sendToTarget();
-                  break;
-
-                case PUBACK:
-                  MQTTPuback puback = MQTTPuback.fromBuffer(buffer);
-                  mMqttIdentifierHelper.removeSentPackage(puback);
-                  handlePubmesage(puback);
-                  break;
-
-                case PUBREC:
-                  MQTTPubrec pubrec = MQTTPubrec.fromBuffer(buffer);
-                  int packageIdentifier = pubrec.getPackageIdentifier();
-                  mMqttIdentifierHelper.removeSentPackage(pubrec);
-
-                  MQTTPubrel pubrel_ = MQTTPubrel.newInstance(packageIdentifier);
-                  sendMessage(pubrel_);
-                  break;
-
-                case PUBREL:
-                  MQTTPubrel pubrel = MQTTPubrel.fromBuffer(buffer);
-                  mMqttIdentifierHelper.removeReceivedPackage(pubrel);
-
-                  MQTTPubcomp pubcomp_ = MQTTPubcomp.newInstance(pubrel.getPackageIdentifier());
-                  sendMessage(pubcomp_);
-                  break;
-
-                case PUBCOMP:
-                  MQTTPubcomp pubcomp = MQTTPubcomp.fromBuffer(buffer);
-                  mMqttIdentifierHelper.removeReceivedPackage(pubcomp);
-                  break;
-
-                case SUBSCRIBE:
-                  // Client doesn't receive this message
-                  break;
-
-                case SUBACK:
-                  MQTTSuback suback = MQTTSuback.fromBuffer(buffer);
-                  handleSubscriptions(suback);
-                  break;
-
-                case UNSUBSCRIBE:
-                  // Client doesn't receive this message
-                  break;
-
-                case UNSUBACK:
-                  MQTTUnsuback unsuback = MQTTUnsuback.fromBuffer(buffer);
-                  handleSubscriptions(unsuback);
-                  mMqttIdentifierHelper.removeSentPackage(unsuback);
-                  break;
-
-                case PINGREQ:
-                  // Client doesn't receive this message
-                  break;
-
-                case PINGRESP:
-                  lastPingResp = System.currentTimeMillis();
-                  break;
-
-                case DISCONNECT:
-                  // Client doesn't receive this message
-                  break;
-              }
+        private final Socket mmSocket;
+
+        /**
+         * Timeout of connection attempts (ms)
+         */
+        private int timeout = 3000;
+
+        private InetSocketAddress remoteAddr;
+
+        ConnectThread(String host, int port) throws IOException {
+            if (DEBUG)
+                Log.d(TAG, "CREATE mConnectThread ");
+
+            if (socketFactory != null) {
+                mmSocket = socketFactory.createSocket();
+            } else {
+                mmSocket = new Socket();
             }
+        }
 
-        } catch (IOException e) {
-          if (DEBUG)
-            Log.e(TAG, "disconnected (this is fine, expected almost)", e);
+        public void run() {
+            if (DEBUG)
+                Log.d(TAG, "BEGIN mConnectThread");
+
+            setName("ConnectThread");
+
+            remoteAddr = new InetSocketAddress(host, port);
+
+            // Make a connection to the Socket
+            try {
+                // This is a blocking call and will only return on a successful connection or an exception
+                mmSocket.connect(remoteAddr, timeout);
+            } catch (IOException e) {
+                // Close the socket
+                try {
+                    mmSocket.close();
+                } catch (IOException e2) {
+                    Log.e(TAG,
+                            "unable to close() socket during connection failure",
+                            e2);
+                }
+                connectionFailed(e);
+                return;
+            }
 
-          connectionLost();
+            // Reset the ConnectThread because we're done
+            synchronized (this) {
+                mConnectThread = null;
+            }
 
-          break;
+            // Start the connected thread
+            connected(mmSocket);
+        }
+
+        public void cancel() {
+            try {
+                mmSocket.close();
+            } catch (IOException e) {
+                Log.e(TAG, "close() of connect socket failed", e);
+            }
         }
-      }
     }
 
     /**
-     * Write to the connected OutStream.
-     *
-     * @param buffer The bytes to write
+     * This thread runs during a connection with a remote device. It handles all incoming and outgoing
+     * transmissions.
      */
-    public synchronized void write(byte[] buffer) {
-      try {
-        mmOutStream.write(buffer);
-      } catch (IOException e) {
-        Log.e(TAG, "Exception during write", e);
-
-        // Just notify the client that the connection was lost!
-        connectionLost();
-      }
-    }
+    private class ConnectedThread extends Thread {
+        private final Socket mmSocket;
+        private final InputStream mmInStream;
+        private final OutputStream mmOutStream;
+
+        public ConnectedThread(Socket socket) {
+            if (DEBUG)
+                Log.d(TAG, "CREATE mConnectedThread");
+
+            mmSocket = socket;
+            InputStream tmpIn = null;
+            OutputStream tmpOut = null;
+
+            // Get the Socket input and output streams
+            try {
+                tmpIn = socket.getInputStream();
+                tmpOut = socket.getOutputStream();
+            } catch (IOException e) {
+                Log.e(TAG, "temp sockets not created", e);
+            }
 
-    void cancel() {
-      new DisconnectTask().execute(mmInStream, mmOutStream, mmSocket);
-    }
-  }
+            mmInStream = tmpIn;
+            mmOutStream = tmpOut;
 
-  private static class DisconnectTask extends AsyncTask<Closeable, Void, Void> {
-    @Override
-    protected Void doInBackground(Closeable... closeables) {
-      if (DEBUG) {
-        Log.d(TAG, "[DisconnectTask] Closing streams and socket.");
-      }
+            if (DEBUG)
+                Log.d(TAG, "BEGIN mConnectedThread");
+        }
 
-      for (Closeable closeable : closeables) {
-        try {
-          closeable.close();
-        } catch (IOException e) {
-          Log.e(TAG, e.getMessage(), e);
+        public void run() {
+            int len;
+            byte[] buffer = new byte[16384];
+
+            // Keep listening to the InputStream while connected
+            while (!isInterrupted()) {
+                try {
+                    // Read from the InputStream
+                    len = mmInStream.read(buffer);
+
+                    if (mHandler != null)
+
+                        if (len > 0) {
+                            byte type = MQTTHelper.decodeType(buffer);
+
+                            if (DEBUG)
+                                Log.d(TAG, "Received " + MQTTHelper.decodePackageName(type));
+
+                            // Handle automatic responses here
+                            switch (type) {
+                                case CONNECT:
+                                    // Client should never receive CONNECT message
+                                    break;
+
+                                case CONNACK:
+                                    MQTTConnack connack = MQTTConnack.fromBuffer(buffer);
+
+                                    switch (connack.getReturnCode()) {
+                                        case CONNECTION_ACCEPTED:
+                                            if (DEBUG)
+                                                Log.d(TAG, "Connected");
+                                            setState(STATE_CONNECTED);
+                                            break;
+
+                                        case CONNECTION_REFUSED_VERSION:
+                                            if (DEBUG)
+                                                Log.d(TAG, "Failed to connect, unaccebtable protocol version");
+                                            setState(STATE_CONNECTION_FAILED);
+                                            break;
+
+                                        case CONNECTION_REFUSED_IDENTIFIER:
+                                            if (DEBUG)
+                                                Log.d(TAG, "Failed to connect, identifier rejected");
+                                            setState(STATE_CONNECTION_FAILED);
+                                            break;
+
+                                        case CONNECTION_REFUSED_SERVER:
+                                            if (DEBUG)
+                                                Log.d(TAG, "Failed to connect, server unavailable");
+                                            setState(STATE_CONNECTION_FAILED);
+                                            break;
+
+                                        case CONNECTION_REFUSED_USER:
+                                            if (DEBUG)
+                                                Log.d(TAG, "Failed to connect, bad username or password");
+                                            setState(STATE_CONNECTION_FAILED);
+                                            break;
+
+                                        case CONNECTION_REFUSED_AUTH:
+                                            if (DEBUG)
+                                                Log.d(TAG, "Failed to connect, not authorized");
+                                            setState(STATE_CONNECTION_FAILED);
+                                            break;
+                                    }
+                                    break;
+
+                                case PUBLISH:
+                                    MQTTPublish publish = MQTTPublish.fromBuffer(buffer);
+                                    switch (publish.getQoS()) {
+                                        case AT_MOST_ONCE:
+                                            // Do nothing
+                                            break;
+
+                                        case AT_LEAST_ONCE:
+                                            // Send PUBACK
+                                            MQTTPuback puback_ = MQTTPuback.newInstance(publish.getPackageIdentifier());
+                                            sendMessage(puback_);
+                                            break;
+
+                                        case EXACTLY_ONCE:
+                                            // Send PUBREC and store message
+                                            MQTTPubrec pubrec_ = MQTTPubrec.newInstance(publish.getPackageIdentifier());
+                                            mMqttIdentifierHelper.addReceivedPackage(pubrec_);
+                                            sendMessage(pubrec_);
+
+                                            mMqttIdentifierHelper.addSentPackage(pubrec_);
+                                            break;
+                                    }
+                                    mHandler.obtainMessage(PUBLISH, mState, -1, publish).sendToTarget();
+                                    break;
+
+                                case PUBACK:
+                                    MQTTPuback puback = MQTTPuback.fromBuffer(buffer);
+                                    mMqttIdentifierHelper.removeSentPackage(puback);
+                                    handlePubmesage(puback);
+                                    break;
+
+                                case PUBREC:
+                                    MQTTPubrec pubrec = MQTTPubrec.fromBuffer(buffer);
+                                    int packageIdentifier = pubrec.getPackageIdentifier();
+                                    mMqttIdentifierHelper.removeSentPackage(pubrec);
+
+                                    MQTTPubrel pubrel_ = MQTTPubrel.newInstance(packageIdentifier);
+                                    sendMessage(pubrel_);
+                                    break;
+
+                                case PUBREL:
+                                    MQTTPubrel pubrel = MQTTPubrel.fromBuffer(buffer);
+                                    mMqttIdentifierHelper.removeReceivedPackage(pubrel);
+
+                                    MQTTPubcomp pubcomp_ = MQTTPubcomp.newInstance(pubrel.getPackageIdentifier());
+                                    sendMessage(pubcomp_);
+                                    break;
+
+                                case PUBCOMP:
+                                    MQTTPubcomp pubcomp = MQTTPubcomp.fromBuffer(buffer);
+                                    mMqttIdentifierHelper.removeReceivedPackage(pubcomp);
+                                    break;
+
+                                case SUBSCRIBE:
+                                    // Client doesn't receive this message
+                                    break;
+
+                                case SUBACK:
+                                    MQTTSuback suback = MQTTSuback.fromBuffer(buffer);
+                                    handleSubscriptions(suback);
+                                    break;
+
+                                case UNSUBSCRIBE:
+                                    // Client doesn't receive this message
+                                    break;
+
+                                case UNSUBACK:
+                                    MQTTUnsuback unsuback = MQTTUnsuback.fromBuffer(buffer);
+                                    handleSubscriptions(unsuback);
+                                    mMqttIdentifierHelper.removeSentPackage(unsuback);
+                                    break;
+
+                                case PINGREQ:
+                                    // Client doesn't receive this message
+                                    break;
+
+                                case PINGRESP:
+                                    lastPingResp = System.currentTimeMillis();
+                                    break;
+
+                                case DISCONNECT:
+                                    // Client doesn't receive this message
+                                    break;
+                            }
+                        }
+
+                } catch (IOException e) {
+                    if (DEBUG)
+                        Log.e(TAG, "disconnected (this is fine, expected almost)", e);
+
+                    connectionLost();
+
+                    break;
+                }
+            }
         }
-      }
 
-      return null;
+        /**
+         * Write to the connected OutStream.
+         *
+         * @param buffer The bytes to write
+         */
+        public synchronized void write(byte[] buffer) {
+            try {
+                mmOutStream.write(buffer);
+            } catch (IOException e) {
+                Log.e(TAG, "Exception during write", e);
+
+                // Just notify the client that the connection was lost!
+                connectionLost();
+            }
+        }
+
+        void cancel() {
+            new DisconnectTask().execute(mmInStream, mmOutStream, mmSocket);
+        }
     }
-  }
 
-  private class WriterTask extends AsyncTask<MQTTMessage, Void, MQTTMessage> {
+    private static class DisconnectTask extends AsyncTask<Closeable, Void, Void> {
+        @Override
+        protected Void doInBackground(Closeable... closeables) {
+            if (DEBUG) {
+                Log.d(TAG, "[DisconnectTask] Closing streams and socket.");
+            }
 
-    @Override
-    protected MQTTMessage doInBackground(MQTTMessage... params) {
-      if (params.length == 0)
-        return null;
-
-      try {
-        mConnectedThread.write(params[0].get());
-        return params[0];
-      } catch (MQTTException e) {
-        e.printStackTrace();
-      } catch (IOException e) {
-        e.printStackTrace();
-      } catch (NullPointerException e) {
-        e.printStackTrace();
-      }
-
-      return null;
+            for (Closeable closeable : closeables) {
+                try {
+                    closeable.close();
+                } catch (IOException e) {
+                    Log.e(TAG, e.getMessage(), e);
+                }
+            }
+
+            return null;
+        }
     }
 
-    @Override
-    protected void onPostExecute(MQTTMessage sent) {
-      super.onPostExecute(sent);
+    private class WriterTask extends AsyncTask<MQTTMessage, Void, MQTTMessage> {
+
+        @Override
+        protected MQTTMessage doInBackground(MQTTMessage... params) {
+            if (params.length == 0)
+                return null;
+
+            try {
+                mConnectedThread.write(params[0].get());
+                return params[0];
+            } catch (MQTTException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            } catch (NullPointerException e) {
+                e.printStackTrace();
+            }
 
-      if (!isCancelled()) {
-        if (sent != null) {
-          lastSentMessage = System.currentTimeMillis();
+            return null;
+        }
 
-          try {
-            if (mKeepaliveHandler != null) {
-              mKeepaliveHandler.removeCallbacks(mPingSender);
-              mKeepaliveHandler.postDelayed(mPingSender, KEEP_ALIVE_TIMER);
+        @Override
+        protected void onPostExecute(MQTTMessage sent) {
+            super.onPostExecute(sent);
+
+            if (!isCancelled()) {
+                if (sent != null) {
+                    lastSentMessage = System.currentTimeMillis();
+
+                    try {
+                        if (mKeepaliveHandler != null) {
+                            mKeepaliveHandler.removeCallbacks(mPingSender);
+                            mKeepaliveHandler.postDelayed(mPingSender, KEEP_ALIVE_TIMER);
+                        }
+                    } catch (Exception ex) {
+                        Log.e(TAG, ex.getMessage(), ex);
+                    }
+                }
             }
-          } catch (Exception ex) {
-            Log.e(TAG, ex.getMessage(), ex);
-          }
         }
-      }
     }
-  }
 }
index 35c1632..04a726e 100644 (file)
@@ -1,2 +1,2 @@
-#Sat Sep 05 16:21:32 CST 2020\r
-VERSION_CODE=516\r
+#Thu Dec 10 14:55:18 CST 2020\r
+VERSION_CODE=517\r