From 57de3dd4c7b2e0a7be1bcb4de49eb2046921b7ff Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期三, 26 七月 2017 17:47:04 +0800 Subject: [PATCH] --- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java | 18 ++++-- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/CompanyDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/BaseDownSync.java | 4 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/RegisterDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/AttendanceDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/EmployeeDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncDownThread.java | 35 ++--------- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PostDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PhoneCallDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DeviceDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDetailDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DepartmentDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DictionaryDownSync.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpThread.java | 43 ++------------ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/up/BaseSync.java | 2 16 files changed, 40 insertions(+), 84 deletions(-) diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java index d02dafa..15351cd 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java @@ -9,6 +9,7 @@ import cn.com.basic.face.discern.common.CommonVariables; import cn.com.basic.face.fragment.DeviceFragment; import cn.com.basic.face.service.sqlite.DeviceDao; +import cn.com.basic.face.service.sync.SyncDownThread; import cn.com.basic.face.util.AppApi; import org.xutils.http.RequestParams; @@ -20,12 +21,13 @@ import cn.com.basic.face.discern.common.BaseCommonCallBack; import cn.com.basic.face.discern.entity.Device; import cn.com.basic.face.util.SharedPreferencesUtils; -import cn.com.basic.face.service.sync.SyncUpAndDownThread; +import cn.com.basic.face.service.sync.SyncUpThread; public class DeviceMng { public static DeviceMng instance = new DeviceMng(); - private SyncUpAndDownThread syncUpAndDownThread = null; + private SyncUpThread syncUpThread = null; + private SyncDownThread syncDownThread = null; public static String authorationId = "101"; @@ -147,10 +149,14 @@ } }); synchronized (this) { - if (syncUpAndDownThread == null) { - syncUpAndDownThread = new SyncUpAndDownThread(); - syncUpAndDownThread.start(); - } + if (syncUpThread == null) { + syncUpThread = new SyncUpThread(); + syncUpThread.start(); + } + if (syncDownThread == null) { + syncDownThread = new SyncDownThread(); + syncDownThread.start(); + } } } else { Toast.makeText(BaseApplication.getInstance(), "鏁版嵁搴撲腑鎵句笉鍒拌璁惧", Toast.LENGTH_SHORT).show(); diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpAndDownThread.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncDownThread.java similarity index 69% rename from VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpAndDownThread.java rename to VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncDownThread.java index ffce1d9..4564764 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpAndDownThread.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncDownThread.java @@ -3,7 +3,6 @@ import java.util.Date; import cn.com.basic.face.base.BaseApplication; -import cn.com.basic.face.service.InternetAccessThread.InternetAccess; import cn.com.basic.face.service.sync.down.AttendanceDownSync; import cn.com.basic.face.service.sync.down.CompanyDownSync; import cn.com.basic.face.service.sync.down.DepartmentDownSync; @@ -24,32 +23,14 @@ import cn.com.basic.face.service.sync.up.OfflineSurveillanceUpSync; import cn.com.basic.face.service.sync.up.VisitorRegisterUpSync; -public class SyncUpAndDownThread extends Thread { +public class SyncDownThread extends Thread { - public boolean isThisTimeSyncComplete = false; + BaseSync firstDownSync; - BaseSync firstSync; - - public BaseSync buildSyncChain() { - - //up - firstSync = DictionaryUpSync.getInstance(); - DeviceUpSync deviceUpSync = DeviceUpSync.getInstance(); - CompanyUpSync companyUpSync = CompanyUpSync.getInstance(); - VisitorRegisterUpSync visitorRegisterUpSync = VisitorRegisterUpSync.getInstance(); - AttenderRegisterUpSync attenderRegisterUpSync = AttenderRegisterUpSync.getInstance(); - OfflineSurveillanceUpSync offlineSurveillanceUpSync = OfflineSurveillanceUpSync.getInstance(); - CheckInUpSync checkInUpSync = CheckInUpSync.getInstance(); - - firstSync.setNext(companyUpSync); - companyUpSync.setNext(deviceUpSync); - deviceUpSync.setNext(visitorRegisterUpSync); - visitorRegisterUpSync.setNext(attenderRegisterUpSync); - attenderRegisterUpSync.setNext(checkInUpSync); - checkInUpSync.setNext(offlineSurveillanceUpSync); + public void buildSyncChain() { // down - AttendanceDownSync attendanceDownSync = AttendanceDownSync.getInstance(); + firstDownSync = AttendanceDownSync.getInstance(); CompanyDownSync companyDownSync = CompanyDownSync.getInstance(); DepartmentDownSync departmentDownSync = DepartmentDownSync.getInstance(); DeviceDownSync deviceDownSync = DeviceDownSync.getInstance(); @@ -61,8 +42,7 @@ VisitDetailDownSync visitDetailDownSync = VisitDetailDownSync.getInstance(); VisitDownSync visitDownSync = VisitDownSync.getInstance(); - offlineSurveillanceUpSync.setNext(attendanceDownSync); - attendanceDownSync.setNext(companyDownSync); + firstDownSync.setNext(companyDownSync); companyDownSync.setNext(departmentDownSync); departmentDownSync.setNext(deviceDownSync); deviceDownSync.setNext(dictionaryDownSync); @@ -73,7 +53,6 @@ registerDownSync.setNext(visitDetailDownSync); visitDetailDownSync.setNext(visitDownSync); - return firstSync; } @@ -88,8 +67,8 @@ double minutes = (now.getTime() - lastTime.getTime())*1.0 / 1000 / 60; if (minutes >= 0.3) { if (BaseApplication.getInstance().networkAvailable()) { - firstSync.setAllSyncComplete(false); - firstSync.sync(); + firstDownSync.setAllSyncComplete(false); + firstDownSync.sync(); lastTime = now; } } else { diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpAndDownThread.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpThread.java similarity index 60% copy from VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpAndDownThread.java copy to VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpThread.java index ffce1d9..bb477b0 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpAndDownThread.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/SyncUpThread.java @@ -3,7 +3,6 @@ import java.util.Date; import cn.com.basic.face.base.BaseApplication; -import cn.com.basic.face.service.InternetAccessThread.InternetAccess; import cn.com.basic.face.service.sync.down.AttendanceDownSync; import cn.com.basic.face.service.sync.down.CompanyDownSync; import cn.com.basic.face.service.sync.down.DepartmentDownSync; @@ -24,16 +23,14 @@ import cn.com.basic.face.service.sync.up.OfflineSurveillanceUpSync; import cn.com.basic.face.service.sync.up.VisitorRegisterUpSync; -public class SyncUpAndDownThread extends Thread { +public class SyncUpThread extends Thread { - public boolean isThisTimeSyncComplete = false; + BaseSync firstUpSync; - BaseSync firstSync; - - public BaseSync buildSyncChain() { + public void buildSyncChain() { //up - firstSync = DictionaryUpSync.getInstance(); + firstUpSync = DictionaryUpSync.getInstance(); DeviceUpSync deviceUpSync = DeviceUpSync.getInstance(); CompanyUpSync companyUpSync = CompanyUpSync.getInstance(); VisitorRegisterUpSync visitorRegisterUpSync = VisitorRegisterUpSync.getInstance(); @@ -41,39 +38,13 @@ OfflineSurveillanceUpSync offlineSurveillanceUpSync = OfflineSurveillanceUpSync.getInstance(); CheckInUpSync checkInUpSync = CheckInUpSync.getInstance(); - firstSync.setNext(companyUpSync); + firstUpSync.setNext(companyUpSync); companyUpSync.setNext(deviceUpSync); deviceUpSync.setNext(visitorRegisterUpSync); visitorRegisterUpSync.setNext(attenderRegisterUpSync); attenderRegisterUpSync.setNext(checkInUpSync); checkInUpSync.setNext(offlineSurveillanceUpSync); - // down - AttendanceDownSync attendanceDownSync = AttendanceDownSync.getInstance(); - CompanyDownSync companyDownSync = CompanyDownSync.getInstance(); - DepartmentDownSync departmentDownSync = DepartmentDownSync.getInstance(); - DeviceDownSync deviceDownSync = DeviceDownSync.getInstance(); - DictionaryDownSync dictionaryDownSync = DictionaryDownSync.getInstance(); - EmployeeDownSync employeeDownSync = EmployeeDownSync.getInstance(); - PhoneCallDownSync phoneCallDownSync = PhoneCallDownSync.getInstance(); - PostDownSync postDownSync = PostDownSync.getInstance(); - RegisterDownSync registerDownSync = RegisterDownSync.getInstance(); - VisitDetailDownSync visitDetailDownSync = VisitDetailDownSync.getInstance(); - VisitDownSync visitDownSync = VisitDownSync.getInstance(); - - offlineSurveillanceUpSync.setNext(attendanceDownSync); - attendanceDownSync.setNext(companyDownSync); - companyDownSync.setNext(departmentDownSync); - departmentDownSync.setNext(deviceDownSync); - deviceDownSync.setNext(dictionaryDownSync); - dictionaryDownSync.setNext(employeeDownSync); - employeeDownSync.setNext(phoneCallDownSync); - phoneCallDownSync.setNext(postDownSync); - postDownSync.setNext(registerDownSync); - registerDownSync.setNext(visitDetailDownSync); - visitDetailDownSync.setNext(visitDownSync); - - return firstSync; } @@ -88,8 +59,8 @@ double minutes = (now.getTime() - lastTime.getTime())*1.0 / 1000 / 60; if (minutes >= 0.3) { if (BaseApplication.getInstance().networkAvailable()) { - firstSync.setAllSyncComplete(false); - firstSync.sync(); + firstUpSync.setAllSyncComplete(false); + firstUpSync.sync(); lastTime = now; } } else { diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/AttendanceDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/AttendanceDownSync.java index 73b8180..6ee7122 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/AttendanceDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/AttendanceDownSync.java @@ -19,7 +19,7 @@ RequestParams params = DataDownSyn.getParams("attendance"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"attendance"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/BaseDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/BaseDownSync.java index 7f13ac9..bd52c53 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/BaseDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/BaseDownSync.java @@ -20,14 +20,14 @@ } public void syncNext() { - System.out.println("sync."+this.getClass().getName()+" 姝e湪鍚屾"); + System.out.println("sync."+this.getClass().getName()+" 姝e湪鍚戜笅鍚屾"); setSyncComplete(true); if (getNext() != null) { getNext().sync(); } } - public void handleSynDate(ResultBean rb){ + public void handleSynDate(ResultBean rb,String tableName){ Long time=(Long)rb.getData(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String synTime = format.format(time); diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/CompanyDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/CompanyDownSync.java index e2e69f4..4aecd0a 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/CompanyDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/CompanyDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("company"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"company"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DepartmentDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DepartmentDownSync.java index 7625961..6e1cd45 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DepartmentDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DepartmentDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("department"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"department"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DeviceDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DeviceDownSync.java index fffd46f..5053277 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DeviceDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DeviceDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("device"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"device"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DictionaryDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DictionaryDownSync.java index 9ac7dfa..f80b6bc 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DictionaryDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/DictionaryDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("dictionary"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"dictionary"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/EmployeeDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/EmployeeDownSync.java index c82cec1..abb489a 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/EmployeeDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/EmployeeDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("employee"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"employee"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PhoneCallDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PhoneCallDownSync.java index 48b6e09..f05e50f 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PhoneCallDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PhoneCallDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("phone_call"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"phone_call"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PostDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PostDownSync.java index 3731a72..7ce2875 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PostDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/PostDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("post"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"post"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/RegisterDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/RegisterDownSync.java index a56cda1..73538cf 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/RegisterDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/RegisterDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("register"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"register"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDetailDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDetailDownSync.java index d905614..7cc78af 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDetailDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDetailDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("visit_detail"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"visit_detail"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDownSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDownSync.java index 994de84..a552332 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDownSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/down/VisitDownSync.java @@ -20,7 +20,7 @@ RequestParams params = DataDownSyn.getParams("visit"); x.http().post(params, new BaseCommonCallBack() { public void success() { - handleSynDate(resultBean); + handleSynDate(resultBean,"visit"); SqliteSqlUtil.insert(getExtraList(SqliteSqlBean.class)); syncNext(); } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/up/BaseSync.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/up/BaseSync.java index 3d206d8..3bc94f0 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/up/BaseSync.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/sync/up/BaseSync.java @@ -14,7 +14,7 @@ } public void sync() { - System.out.println("sync."+this.getClass().getName()+" 姝e湪鍚屾"); + System.out.println("sync."+this.getClass().getName()+" 姝e湪鍚戜笂鍚屾"); if (hasMore()) { syncComplete = false; doSync(); -- Gitblit v1.8.0