From c9c32b0e93167d52c48a778acb6cf9d582ebbc2c Mon Sep 17 00:00:00 2001 From: liuyongkui Date: Mon, 26 Sep 2016 15:44:21 +0800 Subject: [PATCH 01/24] upate thredpool name --- .../tamic/statInterface/statsdk/service/TcHandleThreadPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java index 96ec4ac..abd1004 100644 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java +++ b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java @@ -16,7 +16,7 @@ public class TcHandleThreadPool { private final static int MAX_POOL_SIZE = 6; private final static int KEEP_ALIVE_TIME = 4; private final Executor mExecutor; - private final static String THREAD_NAME ="paf-stat-thread-pool"; + private final static String THREAD_NAME ="tamic-stat-thread-pool"; public TcHandleThreadPool() { ThreadFactory factory = new PriorityThreadFactory(THREAD_NAME, android.os.Process.THREAD_PRIORITY_BACKGROUND); From 566ed037cb7d9189fc66f8b58ab3f664bab6a425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Mon, 26 Sep 2016 17:54:44 +0800 Subject: [PATCH 02/24] Update README.md --- README.md | 71 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a22ecdd..f7f57b1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ 自定义统计SDK, 完全放弃第三方平台,让app拥有自主的数据统计功能 >支持页面统计 >自定义事件统计 ->APP启动退出统计,不同渠道统计 +>APP启动退出统计,crsah日志统计 @@ -84,12 +84,12 @@ APP常规数据统计 设置上报策略的代码示例如下: - // 设置策略模式 第一个是策略模式 ,第二是是时间(单位/分) + + // 设置策略模式 第一个是策略模式 ,第二是是时间(单位/分) TcStatInterface.setUploadPolicy(TcStatInterface.UploadPolicy.UPLOAD_POLICY_INTERVA, 3); - - + API说明 @@ -99,7 +99,8 @@ API说明 请具体看demo 注释 5. 集成步骤 -4.1 依赖项目 + +5.1 依赖项目 gradle中配置依赖module, 将项目增加为自己的子模块 @@ -109,26 +110,70 @@ API说明 compile project(':StatInterface') } - 4.2 配置Settings.gradle + 5.2 配置Settings.gradle include ':app' ,':StatInterface' - 4.3 加入权限 + 5.3 加入权限 + 见2.1的说明。 - 4.4 初始化 + 5.4 初始化 + + Application的onCreate(): + + // assets + String fileName = "stat_id.json"; + + String url = "http://www.baidu.com"; + // init statSdk + TcStatInterface.initialize(this, appId, "you app chanel", fileName); + // set upload url + TcStatInterface.setUrl(url); + 见2.3说明 具体见demo - 4.5 其他 + 5.5 其他 + 如果你还在用Eclispe,直接用源码或者依赖jar - TcStatSdk_1.0.jar + + TcStatSdk_2.0.jar + + 5.6 调用 + + + + findViewById(R.id.id_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TcStatInterface.onEvent("main", "onlick", "send data"); + //发送数据 + TcStatInterface.reportData(); + + } + + }); + + findViewById(R.id.id_button2).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + // 测试 + TcStatInterface.onEventParameter("onclick", "open next"); + + Intent intent = new Intent(MainActivity.this, SecondActivity.class); + startActivity(intent); + + } + + }); 注意 -- - 目前服务端代码需要你自我实现,数据结结构按客户端数据Modle实现即可。 + 目前服务端代码需要你自我实现,数据结结构按客户端数据Model实现即可。 -> 作者:Tamic : http://www.jianshu.com/p/cd83e81b78aa -> 统计数据存储前期:Zhangliang +> 作者:Tamic : http://www.jianshu.com/p/cd83e81b78aa +> crash日志:NULL From 7bd308b301fdd395a9679a0308294fec5bc1c611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Tue, 8 Nov 2016 16:09:24 +0800 Subject: [PATCH 03/24] Update README.md --- README.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f7f57b1..ce40305 100644 --- a/README.md +++ b/README.md @@ -102,17 +102,24 @@ API说明 5.1 依赖项目 - gradle中配置依赖module, 将项目增加为自己的子模块 - - - dependencies { - compile project(':StatInterface') - } + **Gradle:** + +root: - 5.2 配置Settings.gradle + repositories { + maven { url "https://jitpack.io" } + jcenter() + } + +Module: + + dependencies { + ..... + compile 'com.tamic:StatInterface:2.0' + + } - include ':app' ,':StatInterface' 5.3 加入权限 From e29751445dbc9ebbdb41175d04999dd55f70ea61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Tue, 8 Nov 2016 16:09:56 +0800 Subject: [PATCH 04/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ce40305..109644c 100644 --- a/README.md +++ b/README.md @@ -183,4 +183,4 @@ Module: > 作者:Tamic : http://www.jianshu.com/p/cd83e81b78aa -> crash日志:NULL +> crash日志:jianglei0716 From d5f6f8f9d80c85fbabbaa83cdd3c1daade71cd0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Tue, 8 Nov 2016 16:59:43 +0800 Subject: [PATCH 05/24] Update build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a6a933d..3b00a85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,5 +22,5 @@ release { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile project(':StatInterface') + compile 'com.tamic:StatInterface:2.0' } From 6b45a470cfb2c026213490a30058681dd7066972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Tue, 8 Nov 2016 17:00:03 +0800 Subject: [PATCH 06/24] Update settings.gradle --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index a85f5f3..e7b4def 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' ,':StatInterface' +include ':app' From ab7fafcaff3c5af5167a34fe822196de41ae4ed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Wed, 23 Nov 2016 14:22:43 +0800 Subject: [PATCH 07/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 109644c..28a3180 100644 --- a/README.md +++ b/README.md @@ -183,4 +183,4 @@ Module: > 作者:Tamic : http://www.jianshu.com/p/cd83e81b78aa -> crash日志:jianglei0716 +> crash日志:@jianglei0716 From 641376f9e0bad1f50cc095f91de90b0df35af68f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Wed, 23 Nov 2016 14:27:50 +0800 Subject: [PATCH 08/24] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 28a3180..00ecceb 100644 --- a/README.md +++ b/README.md @@ -177,10 +177,12 @@ Module: 注意 -- - 目前服务端代码需要你自我实现,数据结结构按客户端数据Model实现即可。 + 目前服务端代码需要你自我实现,数据结结构按客户端数据Model实现即可。收到数据落地到数据库,需要查看的即可查看,如果有可视化界面,那么更好不过。 -> 作者:Tamic : http://www.jianshu.com/p/cd83e81b78aa -> crash日志:@jianglei0716 +> 作者: +> [@Tamic](https://github.com/Jianglei0716) : http://www.jianshu.com/p/cd83e81b78aa + +>crash:[@jianglei0716](https://github.com/Jianglei0716) From 342aa78fed7b08b88da96c5c6fa1fd4c3512a6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Thu, 2 Mar 2017 20:17:55 +0800 Subject: [PATCH 09/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 00ecceb..b304c40 100644 --- a/README.md +++ b/README.md @@ -177,12 +177,12 @@ Module: 注意 -- - 目前服务端代码需要你自我实现,数据结结构按客户端数据Model实现即可。收到数据落地到数据库,需要查看的即可查看,如果有可视化界面,那么更好不过。 + 目前服务端代码需要你自我实现,数据结结构按客户端数据Model实现即可。收到数据落地到数据库,需要查看的时候即可查看,如果后端有可视化界面,那么更好不过。 > 作者: -> [@Tamic](https://github.com/Jianglei0716) : http://www.jianshu.com/p/cd83e81b78aa +>  FramWork [@Tamic](https://github.com/Jianglei0716) : http://www.jianshu.com/p/cd83e81b78aa >crash:[@jianglei0716](https://github.com/Jianglei0716) From 4e9d56b03677a0b19744bc4d57009652a25f77d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 16:39:07 +0800 Subject: [PATCH 10/24] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b304c40..5338dd1 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Module: dependencies { ..... - compile 'com.tamic:StatInterface:2.0' +       compile 'com.tamic:StatInterface:2.1' } @@ -165,7 +165,11 @@ Module: public void onClick(View v) { // 测试 - TcStatInterface.onEventParameter("onclick", "open next"); + HashMap map = new HashMap(); + map.put("id1", "xxx"); + map.put("id2", "yyyy"); + + TcStatInterface.onEvent("main", map); Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); From d503a3e23960b6e5e2addf469cff28d934d2932a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 16:41:00 +0800 Subject: [PATCH 11/24] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5338dd1..723ec1c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# TcStatInterface +# Sky Monitoring 天眼 #Android StaticFrameWork 自定义统计SDK, 完全放弃第三方平台,让app拥有自主的数据统计功能 ->支持页面统计 + +>支持Activity统计 >自定义事件统计 ->APP启动退出统计,crsah日志统计 +>APP启动退出唤醒自动统计 +>crsah日志统计 From 91eeaabbb3cd704378554fe3ce72229a09255ddd Mon Sep 17 00:00:00 2001 From: liuyongkui Date: Fri, 10 Mar 2017 16:55:11 +0800 Subject: [PATCH 12/24] =?UTF-8?q?delete=20=E6=9C=AC=E5=9C=B0=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StatInterface/build.gradle | 26 -- .../statsdk/test/BuildConfig.java | 13 - .../statInterface/statsdk/BuildConfig.java | 13 - .../statInterface/statsdk/BuildConfig.java | 13 - .../com/tamic/statInterface/statsdk/R.java | 13 - .../tamic/statInterface/statsdk/test/R.java | 16 - .../com/tamic/statInterface/statsdk/R.java | 16 - .../com/tamic/statInterface/statsdk/R.java | 16 - .../bundles/debug/AndroidManifest.xml | 32 -- .../build/intermediates/bundles/debug/R.txt | 1 - .../bundles/debug/aapt/AndroidManifest.xml | 32 -- .../intermediates/bundles/debug/classes.jar | Bin 94960 -> 0 bytes .../bundles/debug/res/values/values.xml | 6 - .../bundles/release/AndroidManifest.xml | 32 -- .../build/intermediates/bundles/release/R.txt | 1 - .../bundles/release/aapt/AndroidManifest.xml | 32 -- .../intermediates/bundles/release/classes.jar | Bin 83190 -> 0 bytes .../bundles/release/res/values/values.xml | 6 - .../androidTest/debug/AndroidManifest.xml | 39 -- .../tmp/manifestMerger7085977054703475003.xml | 16 - .../res/androidTest/debug/values/values.xml | 6 - .../build/tmp/packageDebugJar/MANIFEST.MF | 2 - .../build/tmp/packageReleaseJar/MANIFEST.MF | 2 - StatInterface/src/main/AndroidManifest.xml | 28 -- .../statsdk/constants/NetConfig.java | 40 -- .../statsdk/constants/StaticsConfig.java | 46 -- .../statsdk/core/IUpLoadlistener.java | 18 - .../statsdk/core/StaticsListener.java | 11 - .../statsdk/core/TcHeadrHandle.java | 216 --------- .../statsdk/core/TcIntentManager.java | 219 --------- .../statsdk/core/TcNetEngine.java | 189 -------- .../statsdk/core/TcObserverPresenter.java | 398 ----------------- .../statsdk/core/TcStatInterface.java | 234 ---------- .../statInterface/statsdk/core/TcStatSdk.java | 126 ------ .../statsdk/core/TcStatiPollMgr.java | 121 ----- .../statsdk/core/TcStaticsManager.java | 36 -- .../statsdk/core/TcStaticsManagerImpl.java | 315 ------------- .../statsdk/core/TcUpLoadManager.java | 167 ------- .../statsdk/core/TcUploadCoreReceiver.java | 41 -- .../statInterface/statsdk/db/Customer.java | 88 ---- .../statInterface/statsdk/db/CustomerDao.java | 119 ----- .../statInterface/statsdk/db/DaoMaster.java | 73 --- .../statInterface/statsdk/db/DaoSession.java | 61 --- .../statInterface/statsdk/db/TcNote.java | 69 --- .../statInterface/statsdk/db/TcNoteDao.java | 122 ----- .../statsdk/db/helper/DataConstruct.java | 159 ------- .../statsdk/db/helper/NoteDaoHelper.java | 48 -- .../statsdk/db/helper/StaticsAgent.java | 124 ------ .../statsdk/http/TcHttpClient.java | 53 --- .../statsdk/model/AppAction.java | 26 -- .../statsdk/model/AppActionList.java | 19 - .../statsdk/model/DataBlock.java | 37 -- .../statInterface/statsdk/model/Event.java | 73 --- .../statsdk/model/EventList.java | 19 - .../statsdk/model/KeyValueBean.java | 41 -- .../statInterface/statsdk/model/Page.java | 73 --- .../statInterface/statsdk/model/PageList.java | 19 - .../statsdk/model/ParamterList.java | 19 - .../statsdk/model/header/AppInfo.java | 74 ---- .../statsdk/model/header/DeviceInfo.java | 127 ------ .../statsdk/model/header/HeaderInfo.java | 46 -- .../statsdk/model/header/NetworkInfo.java | 65 --- .../statsdk/presenter/TcDeblockObserver.java | 109 ----- .../statsdk/presenter/TcNetworkObserver.java | 143 ------ .../statsdk/presenter/TcScreenObserver.java | 126 ------ .../statsdk/service/Platform.java | 65 --- .../service/PriorityThreadFactory.java | 31 -- .../statsdk/service/TcHandleThreadPool.java | 34 -- .../statsdk/sp/SharedPreferencesHelper.java | 203 --------- .../statInterface/statsdk/util/DateUtil.java | 35 -- .../statsdk/util/DeviceUtil.java | 133 ------ .../statInterface/statsdk/util/JsonUtil.java | 85 ---- .../statsdk/util/NetworkUtil.java | 187 -------- .../statInterface/statsdk/util/PollUtil.java | 66 --- .../statInterface/statsdk/util/StatLog.java | 417 ------------------ StatInterface/src/main/res/values/strings.xml | 3 - 76 files changed, 5729 deletions(-) delete mode 100644 StatInterface/build.gradle delete mode 100644 StatInterface/build/generated/source/buildConfig/androidTest/debug/com/tamic/statInterface/statsdk/test/BuildConfig.java delete mode 100644 StatInterface/build/generated/source/buildConfig/debug/com/tamic/statInterface/statsdk/BuildConfig.java delete mode 100644 StatInterface/build/generated/source/buildConfig/release/com/tamic/statInterface/statsdk/BuildConfig.java delete mode 100644 StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/R.java delete mode 100644 StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/test/R.java delete mode 100644 StatInterface/build/generated/source/r/debug/com/tamic/statInterface/statsdk/R.java delete mode 100644 StatInterface/build/generated/source/r/release/com/tamic/statInterface/statsdk/R.java delete mode 100644 StatInterface/build/intermediates/bundles/debug/AndroidManifest.xml delete mode 100644 StatInterface/build/intermediates/bundles/debug/R.txt delete mode 100644 StatInterface/build/intermediates/bundles/debug/aapt/AndroidManifest.xml delete mode 100644 StatInterface/build/intermediates/bundles/debug/classes.jar delete mode 100644 StatInterface/build/intermediates/bundles/debug/res/values/values.xml delete mode 100644 StatInterface/build/intermediates/bundles/release/AndroidManifest.xml delete mode 100644 StatInterface/build/intermediates/bundles/release/R.txt delete mode 100644 StatInterface/build/intermediates/bundles/release/aapt/AndroidManifest.xml delete mode 100644 StatInterface/build/intermediates/bundles/release/classes.jar delete mode 100644 StatInterface/build/intermediates/bundles/release/res/values/values.xml delete mode 100644 StatInterface/build/intermediates/manifests/androidTest/debug/AndroidManifest.xml delete mode 100644 StatInterface/build/intermediates/manifests/tmp/manifestMerger7085977054703475003.xml delete mode 100644 StatInterface/build/intermediates/res/androidTest/debug/values/values.xml delete mode 100644 StatInterface/build/tmp/packageDebugJar/MANIFEST.MF delete mode 100644 StatInterface/build/tmp/packageReleaseJar/MANIFEST.MF delete mode 100644 StatInterface/src/main/AndroidManifest.xml delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/NetConfig.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/StaticsConfig.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/IUpLoadlistener.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/StaticsListener.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcHeadrHandle.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcIntentManager.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcNetEngine.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcObserverPresenter.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatInterface.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatSdk.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatiPollMgr.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManager.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManagerImpl.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUpLoadManager.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUploadCoreReceiver.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/Customer.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/CustomerDao.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoMaster.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoSession.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNote.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNoteDao.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/DataConstruct.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/NoteDaoHelper.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/StaticsAgent.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/http/TcHttpClient.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppAction.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppActionList.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/DataBlock.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Event.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/EventList.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/KeyValueBean.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Page.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/PageList.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/ParamterList.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/AppInfo.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/DeviceInfo.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/HeaderInfo.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/NetworkInfo.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcDeblockObserver.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcNetworkObserver.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcScreenObserver.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/Platform.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/PriorityThreadFactory.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/sp/SharedPreferencesHelper.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DateUtil.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DeviceUtil.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/JsonUtil.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/NetworkUtil.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/PollUtil.java delete mode 100644 StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/StatLog.java delete mode 100644 StatInterface/src/main/res/values/strings.xml diff --git a/StatInterface/build.gradle b/StatInterface/build.gradle deleted file mode 100644 index 3f9a105..0000000 --- a/StatInterface/build.gradle +++ /dev/null @@ -1,26 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 23 - buildToolsVersion '23.0.2' - - defaultConfig { - minSdkVersion 14 - targetSdkVersion 23 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'de.greenrobot:greendao:2.1.0' - compile 'com.alibaba:fastjson:1.2.8+' - compile 'com.loopj.android:android-async-http:1.4.9' -} diff --git a/StatInterface/build/generated/source/buildConfig/androidTest/debug/com/tamic/statInterface/statsdk/test/BuildConfig.java b/StatInterface/build/generated/source/buildConfig/androidTest/debug/com/tamic/statInterface/statsdk/test/BuildConfig.java deleted file mode 100644 index 1af0a1d..0000000 --- a/StatInterface/build/generated/source/buildConfig/androidTest/debug/com/tamic/statInterface/statsdk/test/BuildConfig.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package com.tamic.statInterface.statsdk.test; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String APPLICATION_ID = "com.tamic.statInterface.statsdk.test"; - public static final String BUILD_TYPE = "debug"; - public static final String FLAVOR = ""; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = "1.0"; -} diff --git a/StatInterface/build/generated/source/buildConfig/debug/com/tamic/statInterface/statsdk/BuildConfig.java b/StatInterface/build/generated/source/buildConfig/debug/com/tamic/statInterface/statsdk/BuildConfig.java deleted file mode 100644 index b24282c..0000000 --- a/StatInterface/build/generated/source/buildConfig/debug/com/tamic/statInterface/statsdk/BuildConfig.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package com.tamic.statInterface.statsdk; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String APPLICATION_ID = "com.tamic.statInterface.statsdk"; - public static final String BUILD_TYPE = "debug"; - public static final String FLAVOR = ""; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = "1.0"; -} diff --git a/StatInterface/build/generated/source/buildConfig/release/com/tamic/statInterface/statsdk/BuildConfig.java b/StatInterface/build/generated/source/buildConfig/release/com/tamic/statInterface/statsdk/BuildConfig.java deleted file mode 100644 index b73fd18..0000000 --- a/StatInterface/build/generated/source/buildConfig/release/com/tamic/statInterface/statsdk/BuildConfig.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package com.tamic.statInterface.statsdk; - -public final class BuildConfig { - public static final boolean DEBUG = false; - public static final String APPLICATION_ID = "com.tamic.statInterface.statsdk"; - public static final String BUILD_TYPE = "release"; - public static final String FLAVOR = ""; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = "1.0"; -} diff --git a/StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/R.java b/StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/R.java deleted file mode 100644 index 8d38c7e..0000000 --- a/StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/R.java +++ /dev/null @@ -1,13 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ -package com.tamic.statInterface.statsdk; - -public final class R { - public static final class string { - public static final int app_name = 0x7f020000; - } -} diff --git a/StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/test/R.java b/StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/test/R.java deleted file mode 100644 index 6c60325..0000000 --- a/StatInterface/build/generated/source/r/androidTest/debug/com/tamic/statInterface/statsdk/test/R.java +++ /dev/null @@ -1,16 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package com.tamic.statInterface.statsdk.test; - -public final class R { - public static final class attr { - } - public static final class string { - public static final int app_name=0x7f020000; - } -} diff --git a/StatInterface/build/generated/source/r/debug/com/tamic/statInterface/statsdk/R.java b/StatInterface/build/generated/source/r/debug/com/tamic/statInterface/statsdk/R.java deleted file mode 100644 index 02c3ca0..0000000 --- a/StatInterface/build/generated/source/r/debug/com/tamic/statInterface/statsdk/R.java +++ /dev/null @@ -1,16 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package com.tamic.statInterface.statsdk; - -public final class R { - public static final class attr { - } - public static final class string { - public static int app_name=0x7f020000; - } -} diff --git a/StatInterface/build/generated/source/r/release/com/tamic/statInterface/statsdk/R.java b/StatInterface/build/generated/source/r/release/com/tamic/statInterface/statsdk/R.java deleted file mode 100644 index 02c3ca0..0000000 --- a/StatInterface/build/generated/source/r/release/com/tamic/statInterface/statsdk/R.java +++ /dev/null @@ -1,16 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package com.tamic.statInterface.statsdk; - -public final class R { - public static final class attr { - } - public static final class string { - public static int app_name=0x7f020000; - } -} diff --git a/StatInterface/build/intermediates/bundles/debug/AndroidManifest.xml b/StatInterface/build/intermediates/bundles/debug/AndroidManifest.xml deleted file mode 100644 index 27561f8..0000000 --- a/StatInterface/build/intermediates/bundles/debug/AndroidManifest.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/StatInterface/build/intermediates/bundles/debug/R.txt b/StatInterface/build/intermediates/bundles/debug/R.txt deleted file mode 100644 index a80644b..0000000 --- a/StatInterface/build/intermediates/bundles/debug/R.txt +++ /dev/null @@ -1 +0,0 @@ -int string app_name 0x7f020000 diff --git a/StatInterface/build/intermediates/bundles/debug/aapt/AndroidManifest.xml b/StatInterface/build/intermediates/bundles/debug/aapt/AndroidManifest.xml deleted file mode 100644 index 27561f8..0000000 --- a/StatInterface/build/intermediates/bundles/debug/aapt/AndroidManifest.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/StatInterface/build/intermediates/bundles/debug/classes.jar b/StatInterface/build/intermediates/bundles/debug/classes.jar deleted file mode 100644 index b8651683ebc2f990608a5220944f4e433ff02323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94960 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 diff --git a/StatInterface/build/intermediates/bundles/debug/res/values/values.xml b/StatInterface/build/intermediates/bundles/debug/res/values/values.xml deleted file mode 100644 index 7f658ad..0000000 --- a/StatInterface/build/intermediates/bundles/debug/res/values/values.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - statLibrary - \ No newline at end of file diff --git a/StatInterface/build/intermediates/bundles/release/AndroidManifest.xml b/StatInterface/build/intermediates/bundles/release/AndroidManifest.xml deleted file mode 100644 index 15eb723..0000000 --- a/StatInterface/build/intermediates/bundles/release/AndroidManifest.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/StatInterface/build/intermediates/bundles/release/R.txt b/StatInterface/build/intermediates/bundles/release/R.txt deleted file mode 100644 index a80644b..0000000 --- a/StatInterface/build/intermediates/bundles/release/R.txt +++ /dev/null @@ -1 +0,0 @@ -int string app_name 0x7f020000 diff --git a/StatInterface/build/intermediates/bundles/release/aapt/AndroidManifest.xml b/StatInterface/build/intermediates/bundles/release/aapt/AndroidManifest.xml deleted file mode 100644 index 15eb723..0000000 --- a/StatInterface/build/intermediates/bundles/release/aapt/AndroidManifest.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/StatInterface/build/intermediates/bundles/release/classes.jar b/StatInterface/build/intermediates/bundles/release/classes.jar deleted file mode 100644 index 37040273494e8e61f67f82d633afd912f3c64c03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83190 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

}&tw{V%T=cB%w!9`ZZ~jij3+x=YZgC6zzfc$ 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

&8^9J{VmpcBd#D&36uUsYzT*DkZqblv~ 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 - - - - statLibrary - \ No newline at end of file diff --git a/StatInterface/build/intermediates/manifests/androidTest/debug/AndroidManifest.xml b/StatInterface/build/intermediates/manifests/androidTest/debug/AndroidManifest.xml deleted file mode 100644 index 97289eb..0000000 --- a/StatInterface/build/intermediates/manifests/androidTest/debug/AndroidManifest.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/StatInterface/build/intermediates/manifests/tmp/manifestMerger7085977054703475003.xml b/StatInterface/build/intermediates/manifests/tmp/manifestMerger7085977054703475003.xml deleted file mode 100644 index 0c748ad..0000000 --- a/StatInterface/build/intermediates/manifests/tmp/manifestMerger7085977054703475003.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - diff --git a/StatInterface/build/intermediates/res/androidTest/debug/values/values.xml b/StatInterface/build/intermediates/res/androidTest/debug/values/values.xml deleted file mode 100644 index 7730988..0000000 --- a/StatInterface/build/intermediates/res/androidTest/debug/values/values.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - statLibrary - \ No newline at end of file diff --git a/StatInterface/build/tmp/packageDebugJar/MANIFEST.MF b/StatInterface/build/tmp/packageDebugJar/MANIFEST.MF deleted file mode 100644 index 59499bc..0000000 --- a/StatInterface/build/tmp/packageDebugJar/MANIFEST.MF +++ /dev/null @@ -1,2 +0,0 @@ -Manifest-Version: 1.0 - diff --git a/StatInterface/build/tmp/packageReleaseJar/MANIFEST.MF b/StatInterface/build/tmp/packageReleaseJar/MANIFEST.MF deleted file mode 100644 index 59499bc..0000000 --- a/StatInterface/build/tmp/packageReleaseJar/MANIFEST.MF +++ /dev/null @@ -1,2 +0,0 @@ -Manifest-Version: 1.0 - diff --git a/StatInterface/src/main/AndroidManifest.xml b/StatInterface/src/main/AndroidManifest.xml deleted file mode 100644 index 4238b43..0000000 --- a/StatInterface/src/main/AndroidManifest.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/NetConfig.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/NetConfig.java deleted file mode 100644 index e724a85..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/NetConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tamic.statInterface.statsdk.constants; - -/** - * Created by Tc on 2016-03-25. - */ -public class NetConfig { - - /** - * constructor - */ - private NetConfig() { - - } - - /** - * You Url - */ - public static String ONLINE_URL ="http://www.baidu.com"; - - /** - * 数据上报Debug Url - */ - public static final String URL ="http://www.baidu.com"; - - /** - * 请求超时时间 - */ - public static final int TIME_OUT = 1000 * 50 * 1; - - /** 重新请求时间 */ - public static final int RETRY_TIMES = 3; - - /** HEADERS_KEY */ - public static final String HEADERS_KEY = "data_head"; - - /** key*/ - public static final String PARAMS_KEY = "data_body"; - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/StaticsConfig.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/StaticsConfig.java deleted file mode 100644 index e22199f..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/constants/StaticsConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tamic.statInterface.statsdk.constants; - -import de.greenrobot.dao.Property; - -/** - * StaticsConfig - * Created by Tamic on 2016-03-30. - */ -public class StaticsConfig { - - /** - * constructor - */ - private StaticsConfig() { - - } - - public static final String SDK_TABLE_NAME = "TcStats_NOTE"; - - public final static String APPACTION_INFO = "pageInfo"; - public final static String PAGE_INFO = "appActionInfo"; - public final static String ENVENT_INFO = "enventInfo"; - public final static String CRASH_INFO = "crashInfo"; - - /**1*/ - public static final int APP_ID_HF = 100; - /**1*/ - public static final int APP_ID_AAZ = 200; - /**1)*/ - public static final int APP_ID_HFT = 300; - /***/ - public static final int APP_ID_HGJ = 400; - /***/ - public static final int APP_ID_HSH = 500; - - /* 1分钟,5分钟,10分钟,20分钟,30分钟发送 - - - /** 统计sdk版本号 */ - public static final int SDK_VERSION_CODE = 2; - - /** 统计sdk版本名称 */ - public static final String SDK_VERSION_NAME = "1.0.3"; - /** 是否是debug版本 */ - public static boolean DEBUG = true; -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/IUpLoadlistener.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/IUpLoadlistener.java deleted file mode 100644 index 04653fc..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/IUpLoadlistener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -/** - * 上报状态接口 - * Created by LIUYONGKUI726 on 2016-03-25. - */ -public interface IUpLoadlistener { - - void onStart(); - - void onUpLoad(); - - void onSucess(); - - void onFailure(); - - void onCancell(); -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/StaticsListener.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/StaticsListener.java deleted file mode 100644 index c45f5f3..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/StaticsListener.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import java.util.HashMap; - -/** - * Created by ZHANGLIANG098 on 2016-04-12. - */ -public interface StaticsListener { - - HashMap getStatIdMaps(); -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcHeadrHandle.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcHeadrHandle.java deleted file mode 100644 index 39dac9f..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcHeadrHandle.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.location.Location; -import android.location.LocationManager; -import android.provider.Settings; -import android.telephony.TelephonyManager; -import android.text.TextUtils; - -import com.tamic.statInterface.statsdk.model.header.AppInfo; -import com.tamic.statInterface.statsdk.model.header.DeviceInfo; -import com.tamic.statInterface.statsdk.model.header.HeaderInfo; -import com.tamic.statInterface.statsdk.model.header.NetworkInfo; -import com.tamic.statInterface.statsdk.util.DeviceUtil; -import com.tamic.statInterface.statsdk.util.NetworkUtil; - -import java.util.List; -import java.util.Locale; - -/** - * 头部句柄 初始化Header信息 - * Created by LIUYONGKUI726 on 2016-04-05. - */ -public class TcHeadrHandle { - - private static AppInfo appinfo; - - private static DeviceInfo deviceinfo; - - private static NetworkInfo networkinfo; - - private static TelephonyManager mTelephonyMgr; - - private static HeaderInfo headerInfo; - - private static boolean isInit ; - - private static int appId; - - private static String mChannel; - - - protected static boolean initHeader(Context context, int AppId, String channel) { - - - if (headerInfo == null) { - appId = AppId; - mChannel= channel; - networkinfo = new NetworkInfo(); - headerInfo = new HeaderInfo(getAppInfo(context), getDeviceInfo(context), getNetWorkInfo(context)); - isInit = true; - } - - return isInit; - - } - - public static boolean isInit() { - return isInit; - } - - - protected static HeaderInfo getHeader(Context context) { - - - if (headerInfo == null) { - return new HeaderInfo(getAppInfo(context), getDeviceInfo(context), getNetWorkInfo(context)); - } - - return headerInfo; - - } - - /** get AppInfo - * @param context - */ - private static AppInfo getAppInfo(Context context) { - - if (appinfo != null) { - return appinfo; - } - - appinfo = new AppInfo(); - PackageManager manager = context.getPackageManager(); - PackageInfo info = null; - String appLabel = ""; - - try { - info = manager.getPackageInfo(context.getPackageName(), 0); - appinfo.setApp_id(String.valueOf(appId)); - - if (info != null) { - appinfo.setApp_version(info.versionName); - } - appinfo.setApp_id(String.valueOf(appId)); - appinfo.setChannel(mChannel); - appinfo.setSdk_version(DeviceUtil.getSdkCode()); - appinfo.setSdk_verson_name(DeviceUtil.getSdkName()); - - return appinfo; - }catch (PackageManager.NameNotFoundException e1) { - e1.printStackTrace(); - return null; - } - } - - /** get Device Info - * @param context - */ - private static DeviceInfo getDeviceInfo(Context context) { - - if (deviceinfo != null) { - return deviceinfo; - } - deviceinfo = new DeviceInfo(); - - // 设备ID, - - mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - if (mTelephonyMgr != null) { - - deviceinfo.setDevice_id(mTelephonyMgr.getDeviceId()); - // android Imei - deviceinfo.setImei(mTelephonyMgr.getDeviceId()); - } - - // AndroidId - try { - String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); - deviceinfo.setAndroid_id(androidId); - if (TextUtils.isEmpty(deviceinfo.getImei())) { - deviceinfo.setImei(androidId); - } - } catch (Exception e) { - // do nothing. not use the data - } - - deviceinfo.setMac(DeviceUtil.getMacAddress(context)); - - deviceinfo.setModel(android.os.Build.MODEL); - - deviceinfo.setOs("Android"); - - deviceinfo.setOs_version(android.os.Build.VERSION.RELEASE); - - // UniqueId - String openId = deviceinfo.getDevice_id(); - if (openId == null || openId.trim().length() == 0) { - openId = deviceinfo.getAndroid_id(); - } - if (openId == null || openId.trim().length() == 0) { - openId = deviceinfo.getMac(); - } - - deviceinfo.setOpenudid(openId); - deviceinfo.setResolution(DeviceUtil.getScreenWidth(context) + "*" + DeviceUtil.getScreenHeight(context)); - deviceinfo.setDensity(String.valueOf(DeviceUtil.getScreenDensity(context))); - deviceinfo.setLocale(Locale.getDefault().getLanguage()); - - return deviceinfo; - - } - - /** get NetWork Info - * @param context - */ - protected static NetworkInfo getNetWorkInfo(Context context) { - - if (networkinfo == null) { - - networkinfo = new NetworkInfo(); - } - networkinfo.setIp_addr(NetworkUtil.getLocalIpAddress()); - - networkinfo.setWifi_ind(NetworkUtil.isWifi(context)); - - if(mTelephonyMgr.getSimState() == TelephonyManager.SIM_STATE_READY) { - networkinfo.setCarrier(mTelephonyMgr.getSimOperatorName()); - } - - Location location = getLocation(context); - if(location != null){ - networkinfo.setLatitude(String.valueOf(location.getLatitude())); - networkinfo.setLongitude(String.valueOf(location.getLongitude())); - } - - return networkinfo; - } - - /** - * 获取Location - * @param context - * @return - */ - private static Location getLocation(Context context) { - //获取地理位置管理器 - LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); - - List providers = locationManager.getProviders(true); - String locationProvider; - if (providers.contains(LocationManager.GPS_PROVIDER)) { - //如果是GPS - locationProvider = LocationManager.GPS_PROVIDER; - } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) { - //如果是Network - locationProvider = LocationManager.NETWORK_PROVIDER; - } else { - - locationProvider = LocationManager.GPS_PROVIDER;; - } - return locationManager.getLastKnownLocation(locationProvider); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcIntentManager.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcIntentManager.java deleted file mode 100644 index c4b0272..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcIntentManager.java +++ /dev/null @@ -1,219 +0,0 @@ - -package com.tamic.statInterface.statsdk.core; - -import android.content.Intent; -import android.net.ConnectivityManager; -import android.text.TextUtils; - - -import java.util.Set; - - -/** - * Intent Manager - * Created by Tamic on 2016-04-15. - * @author Tamic - */ -public final class TcIntentManager { - /** is normal start*/ - private boolean mNotMainIntent; - /** instance */ - private static TcIntentManager sInstance; - - /** - * @return instance - */ - public static synchronized TcIntentManager getInstance() { - if (sInstance == null) { - sInstance = new TcIntentManager(); - } - return sInstance; - } - - /** - * private constructor - */ - private TcIntentManager() { - - } - - /** - * @return true表示不是通过程序icon进入程序 - */ - public boolean isNotMainIntent() { - return mNotMainIntent; - } - - /** - * 设置是否是通过程序icon进入程序 - * @param aFlag true表示不是通过程序icon进入程序 - */ - public void setNotMainIntent(boolean aFlag) { - mNotMainIntent = aFlag; - } - - /** - * isActionValidate - * @param aIntent intent - * @return action Validate - */ - public static boolean isActionValidate(final Intent aIntent) { - return ((aIntent != null) && (!TextUtils.isEmpty(aIntent.getAction()))); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_MAIN - */ - public boolean isMainIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_MAIN); - } - - /** - * @param aIntent intent - * @return intent类型是否是view - */ - public boolean isViewIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_VIEW); - } - - /** - * @param aIntent intent - * @return intent类型是否是search - */ - public boolean isSearchIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_SEARCH); - } - - /** - * @param aIntent intent - * @return intent类型是否是web search - */ - public boolean isWebSearchIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_WEB_SEARCH); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_DATE_CHANGED - */ - public boolean isDateChangedIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_DATE_CHANGED); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_USER_PRESENT - */ - public boolean isUserPresentIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_USER_PRESENT); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_SCREEN_ON - */ - public boolean isScreenOnIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_SCREEN_ON); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_SCREEN_OFF - */ - public boolean isScreenOffIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_SCREEN_OFF); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_DEVICE_STORAGE_LOW - */ - public boolean isDeviceStorageLowIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_DEVICE_STORAGE_LOW); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_CLOSE_SYSTEM_DIALOGS - */ - public boolean isCloseSystemDialogsIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_BATTERY_CHANGED - */ - public boolean isBatteryChangedIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_BATTERY_CHANGED); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_HEADSET_PLUG - */ - public boolean isHeadsetPlugIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_HEADSET_PLUG); - } - - /** - * @param aIntent intent - * @return intent类型是否是ACTION_BOOT_COMPLETED - */ - public boolean isBootCompletedIntent(final Intent aIntent) { - return isActionAs(aIntent, Intent.ACTION_BOOT_COMPLETED); - } - - /** - * @param aIntent intent - * @return intent类型是否是CONNECTIVITY_ACTION - */ - public boolean isConnectivityIntent(final Intent aIntent) { - return isActionAs(aIntent, ConnectivityManager.CONNECTIVITY_ACTION); - } - - /** - * @param aIntent intent - * @param aAction action - * @return intent的action类型是否是给定的action - */ - private boolean isActionAs(final Intent aIntent, final String aAction) { - final String action = getAction(aIntent); - return ((action != null) && (aAction != null) && (action.equals(aAction))); - } - - /** - * 从intent获取action - * @param aIntent intent - * @return action - */ - private static String getAction(final Intent aIntent) { - if (aIntent == null) { - return null; - } - return aIntent.getAction(); - } - - /** - * @param aIntent intent - * @param aCategory category - * @return 是否包含指定category类型 - */ - private static boolean isCategoryAs(final Intent aIntent, final String aCategory) { - final Set categories = getCategories(aIntent); - return ((categories != null) && (aCategory != null) && (categories.contains(aCategory))); - } - - /** - * @param aIntent intent - * @return categories - */ - private static Set getCategories(final Intent aIntent) { - if (aIntent == null) { - return null; - } - return aIntent.getCategories(); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcNetEngine.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcNetEngine.java deleted file mode 100644 index 4fb72ac..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcNetEngine.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; -import android.os.Looper; - -import com.loopj.android.http.AsyncHttpResponseHandler; -import com.loopj.android.http.RequestParams; -import com.tamic.statInterface.statsdk.constants.NetConfig; -import com.tamic.statInterface.statsdk.constants.StaticsConfig; -import com.tamic.statInterface.statsdk.http.TcHttpClient; -import com.tamic.statInterface.statsdk.util.JsonUtil; -import com.tamic.statInterface.statsdk.util.StatLog; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Set; - -import cz.msebera.android.httpclient.Header; -import cz.msebera.android.httpclient.HeaderElement; -import cz.msebera.android.httpclient.HttpStatus; -import cz.msebera.android.httpclient.ParseException; - -/** - * Created by LIUYONGKUI726 on 2016-04-18. - */ -public class TcNetEngine { - - - private Context context; - - private TcHttpClient mHttpClient; - - private String mKey; - - /** 重试次数 */ - protected int mRetrytimes = NetConfig.RETRY_TIMES; - - public static final String TAG = "TamicStat::TaNetEngine"; - - /** 是否支持断点 */ - protected boolean mCanContinue; - - private String mHostUrl = NetConfig.ONLINE_URL; - - private PaJsonHttpResponseHandler mTaskHandler; - - private IUpLoadlistener mUpLoadlistener; - - private HashMap headers; - - private RequestParams requestParams; - - Header[] reqHeaders; - - Header header; - - public TcNetEngine(Context context, IUpLoadlistener upLoadlistener) { - - this(context, null, upLoadlistener); - - } - - public TcNetEngine(Context context, TcHttpClient httpClient, IUpLoadlistener upLoadlistener) { - this.context = context; - mHttpClient = httpClient; - mCanContinue = true; - mTaskHandler = new PaJsonHttpResponseHandler(true); - mUpLoadlistener = upLoadlistener; - init (); - - - } - - private void init() { - - if (StaticsConfig.DEBUG) { - mHostUrl = NetConfig.URL; - } - headers = new HashMap(); - requestParams = new RequestParams(); - } - - public TcHttpClient getHttpClient() { - return mHttpClient; - } - - public void setHttpClient(TcHttpClient mHttpClient) { - this.mHttpClient = mHttpClient; - } - - public String start(final String... strings) { - - - - String str = JsonUtil.toJSONString(TcHeadrHandle.getHeader(context)); - - StatLog.d(TAG, "head:" + str); - if (headers.size() >= 0) { - headers.clear(); - } - headers.put(NetConfig.HEADERS_KEY, URLEncoder.encode(str)); - //headers.put("Accept", "application/json"); - - requestParams.remove(NetConfig.PARAMS_KEY); - - requestParams.put(NetConfig.PARAMS_KEY, strings[0]); - - StatLog.d(TAG, "body:" + strings[0]); - - if (headers != null && headers.size() > 0) { - reqHeaders = new Header[headers.size()]; - Set keys = headers.keySet(); - int index = 0; - for (final String mykey : keys) { - header = new Header() { - @Override - public String getName() { - return mykey; - } - - @Override - public String getValue() { - return headers.get(mykey); - } - - @Override - public HeaderElement[] getElements() throws ParseException { - return new HeaderElement[0]; - } - }; - reqHeaders[index++] = header; - } - - } - - - TcHttpClient.post(context, mHostUrl, reqHeaders, requestParams, "application/json", mTaskHandler ); - return null; - } - - void cancel() { - - TcHttpClient.cancle(mKey, true); - } - - private class PaJsonHttpResponseHandler extends AsyncHttpResponseHandler { - - public PaJsonHttpResponseHandler() { - } - - public PaJsonHttpResponseHandler(Looper looper) { - super(looper); - } - - public PaJsonHttpResponseHandler(boolean usePoolThread) { - super(usePoolThread); - } - - @Override - public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { - - if (mUpLoadlistener != null) { - mUpLoadlistener.onSucess(); - } - - for (Header tmp : headers) { - StatLog.d(TAG, tmp.getName() + ":" + tmp.getValue()); - } - - StatLog.d(TAG, "response code: " + statusCode); - if (statusCode == HttpStatus.SC_OK) { - StatLog.d(TAG, "onSuccess"); - mCanContinue = false; - } else if (statusCode == HttpStatus.SC_PARTIAL_CONTENT) { - mCanContinue = true; - } - } - - @Override - public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { - if (mUpLoadlistener != null) { - mUpLoadlistener.onFailure(); - } - cancel(); - } - - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcObserverPresenter.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcObserverPresenter.java deleted file mode 100644 index f3aa6fa..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcObserverPresenter.java +++ /dev/null @@ -1,398 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.app.ActivityManager; -import android.content.Context; -import android.text.TextUtils; -import android.util.Log; - - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; -import com.tamic.statInterface.statsdk.db.helper.DataConstruct; -import com.tamic.statInterface.statsdk.presenter.TcDeblockObserver; -import com.tamic.statInterface.statsdk.presenter.TcNetworkObserver; -import com.tamic.statInterface.statsdk.presenter.TcScreenObserver; -import com.tamic.statInterface.statsdk.util.StatLog; - -import java.util.List; - -/** - * ObserverPresenter - * Created by Tamic on 2016-04-14. - */ -public class TcObserverPresenter implements TcNetworkObserver.INetworkListener, TcScreenObserver.IScreenListener, - TcDeblockObserver.IKeyguardListener { - - /** NetworkObserver */ - private TcNetworkObserver mNetworkObserver; - /** ScreenObserver */ - private TcScreenObserver mScreenObserver; - /** DeblockObserver */ - private TcDeblockObserver mKeyguardObserver; - /** isForeground */ - private boolean isForeground; - /** isInit */ - private boolean isInit; - /** PackageName */ - private String mPackageName; - /** isTopTask */ - private boolean isTopTask; - /** isScreenOff */ - private boolean isScreenOff; - /** isScreenLocked */ - private boolean isScreenLocked; - /** APP_STATUS_FOREGROUND */ - public static final char APP_STATUS_FOREGROUND = '0'; - /** APP_STATUS_BACKGROUND */ - public static final char APP_STATUS_BACKGROUND = '1'; - /** TAG */ - private static final String LOG_TAG = "TamicStat::ObserverPresenter"; - - private ScheduleListener scheduleListener; - - - public TcObserverPresenter(ScheduleListener listener) { - scheduleListener = listener; - } - - public void init(Context context ) { - if (!isInit) { - mPackageName = context.getPackageName(); - isTopTask = true; - isScreenOff = false; - isScreenLocked = false; - isForeground = true; - registerObserver(context); - isInit = true; - } - } - - /** - * app is Foreground - * - * @return 如果在前台则返回true,否则返回false - */ - public boolean isForeground() { - return isForeground; - } - - /** - * getApp Status - * - * @return 前后为“0”,后台为“1” - */ - public char getAppStatus() { - if (isForeground) { - return APP_STATUS_FOREGROUND; - } else { - return APP_STATUS_BACKGROUND; - } - } - - - /** - * OnStart - * - * @param aContext - * Context - */ - public void onStart(Context aContext) { - if (!isTopTask) { - Log.d(LOG_TAG, "onStart,false-->onForegroundChanged"); - isTopTask = true; - onForegroundChanged(aContext, true); - } - } - - /** - * OnPause - * - * @param aContext - * Context - */ - public void onPause(Context aContext) { - Log.d(LOG_TAG, "onPause"); - if (isTopTask) { - ActivityManager.RunningTaskInfo taskInfo = getRunningTaskInfo(aContext); - if (taskInfo != null && taskInfo.topActivity != null) { - String packageName = taskInfo.topActivity.getPackageName(); - if (!TextUtils.isEmpty(packageName)) { - if (!packageName.equals(mPackageName)) { - isTopTask = false; - StatLog.d(LOG_TAG, "onPause --> onForegroundChanged(false)"); - onForegroundChanged(aContext, false); - } - } - } - } - } - - /** - * OnStop - * - * @param aContext - * Context - */ - public void onStop(Context aContext) { - StatLog.d(LOG_TAG, "onStop"); - if (isTopTask) { - ActivityManager.RunningTaskInfo taskInfo = getRunningTaskInfo(aContext); - if (taskInfo != null && taskInfo.topActivity != null) { - String packageName = taskInfo.topActivity.getPackageName(); - if (!TextUtils.isEmpty(packageName)) { - if (!packageName.equals(mPackageName)) { - isTopTask = false; - StatLog.d(LOG_TAG, "onStop --> onForegroundChanged(false)"); - onForegroundChanged(aContext, false); - } - } - } - } - } - - - /** - * registerObserver - * @param aContext - * Context - */ - private void registerObserver(Context aContext) { - - if (mScreenObserver == null) { - mScreenObserver = new TcScreenObserver(aContext, this); - } - mScreenObserver.start(); - - if (mNetworkObserver == null) { - mNetworkObserver = new TcNetworkObserver(aContext, this); - } - mNetworkObserver.start(); - - if (mKeyguardObserver == null) { - mKeyguardObserver = new TcDeblockObserver(aContext, this); - } - mKeyguardObserver.start(); - } - - /** - * unregisterObserver - */ - private void unregisterObserver() { - - if (mScreenObserver != null) { - mScreenObserver.stop(); - } - - if (mKeyguardObserver != null) { - mKeyguardObserver.stop(); - } - - if (mNetworkObserver != null) { - mNetworkObserver.stop(); - } - - } - - - /** - * Destroy - */ - public void destroy() { - unregisterObserver(); - mScreenObserver = null; - mKeyguardObserver = null; - mNetworkObserver = null; - //mDateObserver = null; - isInit = false; - } - - /** - * 获取正在运行的TaskInfo - * - * @param aContext - * Context - * @return RunningTaskInfo - */ - private ActivityManager.RunningTaskInfo getRunningTaskInfo(Context aContext) { - ActivityManager manager = (ActivityManager) aContext.getSystemService(Context.ACTIVITY_SERVICE); - List taskList = manager.getRunningTasks(1); - if (taskList == null || taskList.isEmpty()) { - return null; - } else { - return taskList.get(0); - } - } - - /** - * 判断当前是否锁屏 - * - * @param aContext - * Context - * @return true locked, false otherwise - */ - private boolean isScreenLocked(Context aContext) { - android.app.KeyguardManager km = (android.app.KeyguardManager) aContext - .getSystemService(Context.KEYGUARD_SERVICE); - return km.inKeyguardRestrictedInputMode(); - } - - - /** - * 前后台转换 - * - * @param aContext - * Context - * @param aIsForeground - * 如果在前台则为true,否则为false - */ - private synchronized void onForegroundChanged(Context aContext, boolean aIsForeground) { - // 更新前后台状态 - isForeground = aIsForeground; - //前后台变换时访问report - reportData(aContext); - //记录前后台切换 - if (aIsForeground) { - if (StaticsConfig.DEBUG) { - Log.d(LOG_TAG, "onForeground true"); - } - // app唤醒 - DataConstruct.storeAppAction("3"); - //切前台时开始计时 - scheduleStart(); - - } else { - //切后台 - if (StaticsConfig.DEBUG) { - Log.d(LOG_TAG, "onForeground false"); - } - //切后台时数据上传 - TcStatSdk.getInstance(aContext).send(); - // 切后台停止计时 - scheduleStop(); - - } - } - - private void reportData(Context context) { - - TcStatSdk.getInstance(context).send(); - } - - private void scheduleStart() { - if (scheduleListener != null) { - scheduleListener.onStart(); - } - - } - - private void scheduleStop() { - if (scheduleListener != null) { - scheduleListener.onStop(); - } - - } - - private void scheduleReStart() { - if (scheduleListener != null) { - scheduleListener.onReStart(); - } - - } - - @Override - public void onNetworkConnected(Context aContext) { - StatLog.d(LOG_TAG, "onNetworkConnected"); - // 同步网络信息 - TcHeadrHandle.getHeader(aContext).setNetworkinfo(TcHeadrHandle.getNetWorkInfo(aContext)); - if (isForeground) { - StatLog.d(LOG_TAG, "onNetworkConnected send data"); - reportData(aContext); - scheduleReStart(); - } else { - scheduleStop(); - } - - } - - @Override - public void onNetworkUnConnected(Context aContext) { - StatLog.d(LOG_TAG, "onNetworkUnConnected"); - scheduleStop(); - - } - - @Override - public void onScreenOn(Context aContext) { - - StatLog.d(LOG_TAG, "onScreenOn"); - //Toast.makeText(aContext, "屏幕亮起", Toast.LENGTH_SHORT).show(); - if (isTopTask) { - if (isScreenOff) { - isScreenOff = false; - - if (isScreenLocked(aContext)) { //如果锁屏,则不作处理 - isScreenLocked = true; - } else { - StatLog.d(LOG_TAG, "onScreenOn-->onForegroundChanged(true)"); - isScreenLocked = false; - onForegroundChanged(aContext, true); - } - } - } - - } - - @Override - public void onScreenOff(Context aContext) { - - //屏幕关闭时,如果还在前台,屏幕之前打开,则肯定切换至后台 - StatLog.d(LOG_TAG, "onScreenOff"); - if (isTopTask) { - if (!isScreenOff) { - isScreenOff = true; - if (!isScreenLocked) { - StatLog.d(LOG_TAG, "onScreenOff-->onForegroundChanged(false)"); - onForegroundChanged(aContext, false); - } - } - } - - } - - @Override - public void onKeyguardGone(Context aContext) { - StatLog.d(LOG_TAG, "onKeyGuardGone"); - if (isTopTask) { - StatLog.d(LOG_TAG, "onKeyGuardGone foreground"); - //如果在前台,屏幕锁屏,则屏幕已打开 - if (isScreenLocked) { - isScreenLocked = false; - onForegroundChanged(aContext, true); - } - } - } - - /** - * IKeyguardListener - */ - public interface ScheduleListener { - - - /** 开始 - * - */ - void onStart(); - - /** - * - */ - void onStop(); - - - /** - * 结束 - */ - void onReStart(); - } - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatInterface.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatInterface.java deleted file mode 100644 index 74c936e..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatInterface.java +++ /dev/null @@ -1,234 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; - -import com.tamic.statInterface.statsdk.constants.NetConfig; - - -/** - * StatInterface - * Created by tamic on 2016-04-06. - */ -public final class TcStatInterface { - - /**实时发送*/ - protected static final int UPLOAD_POLICY_REALTIME = 0; - /**只在wifi下*/ - protected static final int UPLOAD_POLICY_WIFI_ONLY = 2; - /**批量上报 达到一定次数*/ - protected static final int UPLOAD_POLICY_BATCH = 3; - /**时间间隔*/ - protected static final int UPLOAD_POLICY_INTERVAL = 4; - /**开发者debug模式 调用就可以发送*/ - protected static final int UPLOAD_POLICY_DEVELOPMENT = 5; - /**每次启动 发送上次产生的数据*/ - protected static final int UPLOAD_POLICY_WHILE_INITIALIZE = 6; - - /** - * 上报策略模式 - */ - public enum UploadPolicy { - /**实时发送*/ - UPLOAD_POLICY_REALTIME, - /**只在wifi下*/ - UPLOAD_POLICY_WIFI_ONLY, - /**批量上报 达到一定次数*/ - UPLOAD_POLICY_BATCH, - /**时间间隔*/ - UPLOAD_POLICY_INTERVA, - /**开发者debug模式 调用就可以发送*/ - UPLOAD_POLICY_DEVELOPMENT, - /**每次启动 发送上次产生的数据*/ - UPLOAD_POLICY_WHILE_INITIALIZE - } - - /**实时发送*/ - public static final int UPLOAD_INTERVAL_REALTIME = 0; - /**1分钟*/ - public static final int UPLOAD_TIME_ONE = 1; - /**5分钟*/ - public static final int UPLOAD_TIME_THREAD = 3; - /**10分钟*/ - public static final int UPLOAD_TIME_TEN = 10; - /**20分钟*/ - public static final int UPLOAD_TIME_TWENTY = 20; - /**30分钟发送*/ - public static final int UPLOAD_TIME_THIRTY = 30; - /** - * 上报策略 - */ - protected static UploadPolicy uploadPolicy; - - private static int intervalRealtime = UPLOAD_TIME_THREAD; - - private static Context context; - /** - * private constructor - */ - private TcStatInterface() { - - } - - /** - * initialize - * @param aContext - * @param appId - * @param channel - */ - public static void initialize(Context aContext, int appId, String channel, String fileName) { - - context = aContext; - - TcStatSdk.getInstance(aContext).init(appId, channel, fileName); - - } - - /** - * 设置策略模式 - * @param policy - * 策略模式(实时模式下间隔时间无效) - * 目前默认为UPLOAD_POLICY_INTERVA模式 - * @param time - * 时间间隔(1 5 10 20 30分钟) - */ - public static void setUploadPolicy(UploadPolicy policy, int time) { - - if (policy == null) { - uploadPolicy = UploadPolicy.UPLOAD_POLICY_INTERVA; - return; - } - - if (time > 0 || time <= 60) { - intervalRealtime = time; - } - uploadPolicy = policy; - - } - - /** - * getIntervalRealtime - * @return intervalRealtime - */ - public static int getIntervalRealtime() { - return intervalRealtime; - } - - public static void setIntervalRealtime(int intervalRealtime) { - TcStatInterface.intervalRealtime = intervalRealtime; - } - - /** setUrl - * @param url - */ - public static void setUrl(String url) { - NetConfig.ONLINE_URL = url; - } - - /** - * record Page Start - * */ - public static void recordPageStart(Context context) { - - TcStatSdk.getInstance(context).recordPageStart(context); - - } - /** - * record Page End - */ - public static void recordPageEnd() { - - TcStatSdk.getInstance(context).recordPageEnd(); - - } - - /** - * record App Start - */ - public static void recordAppStart() { - - TcStatSdk.getInstance(context).recordAppStart(); - - - } - - /** - * 关闭APP - */ - public static void recordAppEnd() { - - TcStatSdk.getInstance(context).recordAppEnd(); - - - TcStatSdk.getInstance(context).release(); - } - - /** - * 上报数据 - * 非Debug模式无法直接调用,请先设置为UPLOAD_POLICY_DEVELOPMENT - */ - protected static void report() { - - - TcStatSdk.getInstance(context).send(); - - } - - /** - * 上报数据 - * 非Debug模式无法直接调用,请先设置为UPLOAD_POLICY_DEVELOPMENT - */ - public static void reportData() { - - - if (uploadPolicy != UploadPolicy.UPLOAD_POLICY_DEVELOPMENT) { - - throw new RuntimeException("call reportData(), you must will UploadPolicy set : UPLOAD_POLICY_DEVELOPMENT!"); - } - - report(); - - } - - - /** - * 加入page参数 - * @param k 业务名字 - * @param v 对应值 - */ - public static void onPageParameter(String k,String v) { - - TcStatSdk.getInstance(context).setPageParameter(k, v); - - } - - /** - * 初始化Event - */ - public static void initEvent(String eventName) { - - TcStatSdk.getInstance(context).initEvent(eventName); - - } - - - /** - * 加入自定义envent - * @param k 业务名字 - * @param v 对应值 - */ - public static void onEventParameter(String k,String v) { - - TcStatSdk.getInstance(context).setEventParameter(k, v); - - } - - /** - * onEvent - */ - public static void onEvent(String eventName, String k,String v) { - initEvent(eventName); - onEventParameter(k, v); - - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatSdk.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatSdk.java deleted file mode 100644 index eccb900..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatSdk.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; - - -/** - * StatSdk - * Created by Tamic on 2016-04-05. - */ -public class TcStatSdk { - - /** context */ - private Context mContext; - /** Instance */ - private static TcStatSdk sInstance; - - private static final String TAG = "TcStaInterface::StatSdk"; - - private TcStaticsManager staticsManager; - - /** - * getInstance - * - * @param aContext - * context - * @return 返回 TcStaticsManager - */ - protected static synchronized TcStatSdk getInstance(Context aContext) { - if (sInstance == null) { - sInstance = new TcStatSdk(aContext, new TcStaticsManagerImpl(aContext)); - } - return sInstance; - } - - /** - * constructor - * - * @param aContext - * context - */ - private TcStatSdk(Context aContext, TcStaticsManager aStaticsManager) { - mContext = aContext; - staticsManager = aStaticsManager; - - } - - protected void init(int appId, String channel, String fileName) { - - staticsManager.onInit(appId, channel, fileName); - - } - - protected void send() { - - staticsManager.onSend(); - } - - protected void store() { - - staticsManager.onStore(); - - } - - protected void upLoad() { - - staticsManager.onSend(); - } - - /** - * release - */ - protected void release() { - - staticsManager.onRelease(); - - } - - protected void recordPageEnd() { - - staticsManager.onRrecordPageEnd(); - - } - - protected void recordAppStart() { - - staticsManager.onRecordAppStart(); - - } - - protected void recordAppEnd() { - - staticsManager.onRrecordAppEnd(); - - } - - protected void recordPageStart(Context context) { - - staticsManager.onRecordPageStart(context); - - } - - protected void setPageParameter(String k, String v) { - - staticsManager.onPageParameter(k, v); - - } - - protected void initEvent(String envntName) { - - staticsManager.onInitEvent(envntName); - - } - - protected void setEventParameter(String k, String v) { - - staticsManager.onEventParameter(k, v); - - } - - protected void initPage(String pageId, String referPageId) { - - staticsManager.onInitPage(pageId, referPageId); - - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatiPollMgr.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatiPollMgr.java deleted file mode 100644 index 99d7096..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStatiPollMgr.java +++ /dev/null @@ -1,121 +0,0 @@ - -package com.tamic.statInterface.statsdk.core; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.text.format.DateUtils; -import android.text.format.Time; - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; - -/** - * - * StatiPollMgr - * Created by Tamic on 2016-04-19. - */ -public class TcStatiPollMgr { - - /** DEBUG mode */ - private static final boolean DEBUG = StaticsConfig.DEBUG; - /** Log TAG */ - private static final String LOG_TAG = TcStatiPollMgr.class.getSimpleName(); - /** MSG_TIMEOUT */ - private static final int MSG_TIMEOUT = 1; - private TcStaticsManagerImpl staticsManagerImpl; - /** 心跳周期 */ - private long mCardiacCycle; - /** DefaultCycle */ - private long mDefaultCycle; - - /** - * Constructor - */ - public TcStatiPollMgr(TcStaticsManagerImpl staticsManager) { - staticsManagerImpl = staticsManager; - } - - /** - * start - * - * @param aCardiacCycle - * 心跳周期 - */ - public void start(long aCardiacCycle) { - mDefaultCycle = aCardiacCycle; - mCardiacCycle = aCardiacCycle; - checkDateChanging(); - stop(); - loop(); - } - - /** - * stop - */ - public void stop() { - sPrivateHandler.get().removeMessages(MSG_TIMEOUT); - } - - /** - * loop - */ - private void loop() { - Message msg = sPrivateHandler.get().obtainMessage(MSG_TIMEOUT, this); - sPrivateHandler.get().sendMessageDelayed(msg, mCardiacCycle); - } - - /** - * onTimeOut msg - */ - public void onTimeOut() { - staticsManagerImpl.onScheduleTimeOut(); - } - - /** - * checkDateChanging - */ - private void checkDateChanging() { - Time time = new Time(); - time.setToNow(); - int hour = time.hour; //24小时制 - int minute = time.minute; - if (hour == 23) { //SUPPRESS CHECKSTYLE - int cycle = 61 - minute; // SUPPRESS CHECKSTYLE 12:01访问 - long timeSchedule = cycle * DateUtils.MINUTE_IN_MILLIS; - if (timeSchedule < mCardiacCycle) { - mCardiacCycle = timeSchedule; - } - } else { - if (mCardiacCycle != mDefaultCycle) { - mCardiacCycle = mDefaultCycle; - } - } - } - - /** - * Handler - */ - private static final ThreadLocal sPrivateHandler = new ThreadLocal() { - @Override - protected Handler initialValue() { - return new Handler(Looper.getMainLooper()) { - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_TIMEOUT: - TcStatiPollMgr schedule = (TcStatiPollMgr) msg.obj; - if (schedule != null) { - schedule.onTimeOut(); - schedule.checkDateChanging(); - schedule.loop(); - } - break; - default: - break; - } - } - }; - } - }; -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManager.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManager.java deleted file mode 100644 index f042c33..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; - -/** - * Created by Tamic on 2016-04-05. - * StaticsManager - */ -public interface TcStaticsManager { - - boolean onInit(int appId, String channel, String fileName); - - void onSend(); - - void onStore(); - - void onRelease(); - - void onRecordAppStart(); - - void onRrecordPageEnd(); - - void onRecordPageStart(Context context); - - void onRrecordAppEnd(); - - void onInitPage(String... strings); - - void onPageParameter(String... strings); - - void onInitEvent(String eventName); - - void onEventParameter(String... strings); - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManagerImpl.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManagerImpl.java deleted file mode 100644 index 090a950..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcStaticsManagerImpl.java +++ /dev/null @@ -1,315 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; -import android.text.TextUtils; - -import com.alibaba.fastjson.JSON; -import com.tamic.statInterface.statsdk.constants.StaticsConfig; -import com.tamic.statInterface.statsdk.db.helper.DataConstruct; -import com.tamic.statInterface.statsdk.db.helper.StaticsAgent; -import com.tamic.statInterface.statsdk.model.DataBlock; -import com.tamic.statInterface.statsdk.service.Platform; -import com.tamic.statInterface.statsdk.util.JsonUtil; -import com.tamic.statInterface.statsdk.util.NetworkUtil; -import com.tamic.statInterface.statsdk.util.StatLog; - -import java.io.InputStream; -import java.util.HashMap; - -import cz.msebera.android.httpclient.util.EncodingUtils; - -import static com.tamic.statInterface.statsdk.core.TcNetEngine.TAG; - - -/** - * StaticsManagerImpl core - * Created by LIUYONGKUI726 on 2016-03-24. - */ -public class TcStaticsManagerImpl implements TcStaticsManager, TcObserverPresenter.ScheduleListener { - /** context */ - private Context mContext; - /** sInstance */ - private static TcStaticsManager sInstance; - - private static TcObserverPresenter paObserverPresenter; - - private StaticsListener eventInterface; - - private TcStatiPollMgr statiPollMgr; - - HashMap pageIdMaps = new HashMap(); - /** Log TAG */ - private static final String LOG_TAG = TcStatiPollMgr.class.getSimpleName(); - - public TcStaticsManagerImpl(Context mContext) { - this.mContext = mContext; - } - - @Override - public boolean onInit(int appId, String channel, String fileName) { - - // init ObserverPresenter - paObserverPresenter = new TcObserverPresenter(this); - - // init StaticsAgent - StaticsAgent.init(mContext); - - // load pageIdMaps - pageIdMaps = getStatIdMaps(fileName); - - // init StatiPoll - statiPollMgr = new TcStatiPollMgr(this); - // init Header - return initHeader(appId, channel); - } - - @Override - public void onSend() { - // report data to server - Platform.get().execute(new Runnable() { - @Override - public void run() { - DataBlock dataBlock = StaticsAgent.getDataBlock(); - - if (dataBlock.getApp_action().isEmpty() && - dataBlock.getEvent().isEmpty() && - dataBlock.getPage().isEmpty()) { - return; - } - StatLog.d(TAG, "TcStatfacr >> report is Start"); - TcUpLoadManager.getInstance(mContext).report(JsonUtil.toJSONString(dataBlock)); - } - }); - - } - - @Override - public void onStore() { - DataConstruct.storeEvent(); - DataConstruct.storePage(); - } - - @Override - public void onRelease() { - if (paObserverPresenter != null) { - paObserverPresenter.destroy(); - } - - stopSchedule(); - - } - - @Override - public void onRecordAppStart() { - //send - onSend(); - // store appAction - DataConstruct.storeAppAction("1"); - } - - @Override - public void onRrecordPageEnd() { - DataConstruct.storeEvent(); - DataConstruct.storePage(); - if (paObserverPresenter != null) { - paObserverPresenter.onStop(mContext); - } - stopSchedule(); - } - - @Override - public void onRecordPageStart(Context context) { - - if (context == null) { - return; - } - - //开始计时 - startSchedule(); - - - String pageId = checkValidId(context.getClass().getSimpleName()); - if (pageId == null) { - pageId = context.getClass().getSimpleName(); - } - - // init page - onInitPage(pageId, null); - - if (paObserverPresenter != null) { - paObserverPresenter.init(mContext); - } - - if (paObserverPresenter != null) { - paObserverPresenter.onStart(mContext); - } - } - - - @Override - public void onRrecordAppEnd() { - - //recard APP exit - DataConstruct.storeAppAction("2"); - - onSend(); - - onRelease(); - } - - @Override - public void onInitPage(String... strings) { - - DataConstruct.initPage(mContext, eventInterface, strings[0], strings[1]); - - } - - @Override - public void onPageParameter(String... strings) { - - DataConstruct.initPageParameter(strings[0], strings[1]); - - } - - - @Override - public void onInitEvent(String eventName) { - - DataConstruct.initEvent(eventInterface, eventName); - } - - @Override - public void onEventParameter(String... strings) { - - DataConstruct.onEvent(strings[0], strings[1]); - - } - - /** - * init header - */ - private boolean initHeader(int appId, String channel) { - - - if (!TcHeadrHandle.isInit()) { - return TcHeadrHandle.initHeader(mContext, appId, channel); - } - - return false; - - } - - /** - * onScheduleTimeOut - */ - void onScheduleTimeOut() { - - StatLog.d(LOG_TAG, "onScheduleTimeOut is sendData"); - - onSend(); - } - - /** - * startSchedule - */ - public void startSchedule() { - // if debug time is 5 min - if (StaticsConfig.DEBUG && - TcStatInterface.uploadPolicy == TcStatInterface.UploadPolicy.UPLOAD_POLICY_DEVELOPMENT) { - statiPollMgr.start(5* 1000); - StatLog.d(LOG_TAG, "Schedule is start"); - } else { - if (NetworkUtil.isWifi(mContext)) { - statiPollMgr.start(TcStatInterface.getIntervalRealtime() * 60 *1000); - } else { - statiPollMgr.start(TcStatInterface.UPLOAD_TIME_THIRTY * 60 *1000); - } - - } - } - - /** checkValidId - * @param name activitiyname - * @return pageId - */ - private String checkValidId(String name) { - if (TextUtils.isEmpty(name)) { - return null; - } - if (name.length() <= 0) { - return null; - } - - return getPageId(name); - } - - - /** getPageId - * @param clazz - * @return - */ - private String getPageId(String clazz) { - if (mContext == null) { - return null; - } - return pageIdMaps.get(clazz); - } - - /** - * stop Schedule - */ - public void stopSchedule() { - - StatLog.d(LOG_TAG, "stopSchedule()"); - - statiPollMgr.stop(); - } - - @Override - public void onStart() { - StatLog.d(LOG_TAG, "startSchedule"); - - startSchedule(); - - } - - @Override - public void onStop() { - - stopSchedule(); - } - - @Override - public void onReStart() { - // stopSchedule - stopSchedule(); - // startSchedule - startSchedule(); - } - - - public HashMap getStatIdMaps(String jsonName) { - - - HashMap map = null; - if (getFromAsset(jsonName) != null) { - map = (HashMap) JSON.parseObject(getFromAsset("stat_id.json"), HashMap.class); - } - return map; - } - - public String getFromAsset(String fileName){ - String result=""; - try{ - InputStream in = mContext.getResources().getAssets().open(fileName); - int length = in.available(); - byte [] buffer = new byte[length]; - in.read(buffer); - result = EncodingUtils.getString(buffer, "UTF-8"); - } - catch(Exception e){ - e.printStackTrace(); - } - return result; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUpLoadManager.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUpLoadManager.java deleted file mode 100644 index 5e7e1d3..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUpLoadManager.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.Context; -import android.text.TextUtils; - - -import com.tamic.statInterface.statsdk.constants.NetConfig; -import com.tamic.statInterface.statsdk.db.helper.StaticsAgent; -import com.tamic.statInterface.statsdk.http.TcHttpClient; -import com.tamic.statInterface.statsdk.service.Platform; -import com.tamic.statInterface.statsdk.util.JsonUtil; -import com.tamic.statInterface.statsdk.util.NetworkUtil; -import com.tamic.statInterface.statsdk.util.StatLog; - -import java.util.concurrent.atomic.AtomicReference; - -/** - * Stat UpLoadManager - * Created by Tamic on 2016-03-24. - */ -public class TcUpLoadManager implements IUpLoadlistener { - - - /** - * context - */ - private Context mContext; - /** - * http client - */ - private TcHttpClient mHttpClient; - /** - * UpLoadManager - */ - private static TcUpLoadManager sInstance; - - private Boolean isRunning = false; - - private AtomicReference atomic; - - private TcNetEngine netEngine; - /** - * Log TAG - */ - private static final String TAG = TcNetEngine.class.getSimpleName(); - - /** - * getInstance - * - * @param aContext context - * @return UpLoadManager - */ - public static synchronized TcUpLoadManager getInstance(Context aContext) { - if (sInstance == null) { - sInstance = new TcUpLoadManager(aContext); - } - return sInstance; - } - - /** - * constructor - * - * @param aContext context - */ - private TcUpLoadManager(Context aContext) { - mContext = aContext; - init(); - } - - /** - * init - */ - private void init() { - mHttpClient = getHttpclient(); - atomic = new AtomicReference<>(); - netEngine = new TcNetEngine(mContext, this); - } - - - /** - * report - */ - public void report(String jsonString) { - - if (!NetworkUtil.isNetworkAvailable(mContext)) { - return; - } - - if (TextUtils.isEmpty(jsonString)) { - return; - } - //netEngine.setHttpClient(getHttpclient()); - atomic.set(netEngine); - atomic.getAndSet(netEngine).start(jsonString); - } - - /** - * cancle - */ - public void cancle() { - - if (atomic.get() != null) { - atomic.get().cancel(); - - } - - } - - - /** - * get http client - * - * @return http client - */ - public TcHttpClient getHttpclient() { - if (mHttpClient == null) { - // HttpClient - mHttpClient = new TcHttpClient(); - mHttpClient.setTimeOut(NetConfig.TIME_OUT); - } - return mHttpClient; - - } - - - @Override - public void onStart() { - - isRunning = true; - } - - @Override - public void onUpLoad() { - - isRunning = true; - } - - @Override - public void onSucess() { - - isRunning = false; - // delete data - StatLog.d(TAG, "DELETE :StaticsAgent.deleteTable()"); - // delete data - Platform.get().execute(new Runnable() { - @Override - public void run() { - StaticsAgent.deleteData(); - StatLog.d(TAG, "delete after :>>>>>>" + JsonUtil.toJSONString(StaticsAgent.getDataBlock())); - } - }); - - } - - @Override - public void onFailure() { - - isRunning = false; - - } - - @Override - public void onCancell() { - - isRunning = false; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUploadCoreReceiver.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUploadCoreReceiver.java deleted file mode 100644 index 15c4bf0..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/core/TcUploadCoreReceiver.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tamic.statInterface.statsdk.core; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.text.TextUtils; -import android.util.Log; -import android.widget.Toast; - -/** - * - * 轮询广播 - * Created by LIUYONGKUI726 on 2016-04-12. - */ -public class TcUploadCoreReceiver extends BroadcastReceiver { - - public static final String REPORT_ACTION = "action.com.pinganfang.base.send_report"; - - private static final String TAG = "TcUploadCoreReceiver"; - - @Override - public void onReceive(Context context, Intent intent) { - Log.d(TAG, "pollSever is started"); - - if (context == null || intent ==null ) { - return; - } - - if (TextUtils.equals(intent.getAction(), REPORT_ACTION)) { - - - Toast.makeText(context, "send statData", Toast.LENGTH_LONG).show(); - - //发送数据 -// TcStatSdk.getInstance(context).send(JsonUtil.toJSONString(StaticsAgent.getDataBlock())); - } - - - - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/Customer.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/Customer.java deleted file mode 100644 index f58019e..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/Customer.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.tamic.statInterface.statsdk.db; - -import java.util.List; - -import de.greenrobot.dao.DaoException; - -// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. - -/** - * Entity mapped to table "CUSTOMER". - */ -public class Customer { - - private Long id; - /** Not-null value. */ - private String name; - - /** Used to resolve relations */ - private transient DaoSession daoSession; - - /** Used for active entity operations. */ - private transient CustomerDao myDao; - - public Customer() { - } - - public Customer(Long id) { - this.id = id; - } - - public Customer(Long id, String name) { - this.id = id; - this.name = name; - } - - /** called by internal mechanisms, do not call yourself. */ - public void __setDaoSession(DaoSession daoSession) { - this.daoSession = daoSession; - myDao = daoSession != null ? daoSession.getCustomerDao() : null; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - /** Not-null value. */ - public String getName() { - return name; - } - - /** Not-null value; ensure this value is available before it is saved to the database. */ - public void setName(String name) { - this.name = name; - } - - - - - - /** Convenient call for {@link AbstractDao#delete(Object)}. Entity must attached to an entity context. */ - public void delete() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.delete(this); - } - - /** Convenient call for {@link AbstractDao#update(Object)}. Entity must attached to an entity context. */ - public void update() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.update(this); - } - - /** Convenient call for {@link AbstractDao#refresh(Object)}. Entity must attached to an entity context. */ - public void refresh() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.refresh(this); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/CustomerDao.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/CustomerDao.java deleted file mode 100644 index 45c6d5b..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/CustomerDao.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.tamic.statInterface.statsdk.db; - -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteStatement; - -import de.greenrobot.dao.AbstractDao; -import de.greenrobot.dao.Property; -import de.greenrobot.dao.internal.DaoConfig; - -// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. - -/** - * DAO for table "CUSTOMER". -*/ -public class CustomerDao extends AbstractDao { - - public static final String TABLENAME = "CUSTOMER"; - - /** - * Properties of entity Customer.
- * Can be used for QueryBuilder and for referencing column names. - */ - public static class Properties { - public final static Property Id = new Property(0, Long.class, "id", true, "_id"); - public final static Property Name = new Property(1, String.class, "name", false, "NAME"); - }; - - private DaoSession daoSession; - - - public CustomerDao(DaoConfig config) { - super(config); - } - - public CustomerDao(DaoConfig config, DaoSession daoSession) { - super(config, daoSession); - this.daoSession = daoSession; - } - - /** Creates the underlying database table. */ - public static void createTable(SQLiteDatabase db, boolean ifNotExists) { - String constraint = ifNotExists? "IF NOT EXISTS ": ""; - db.execSQL("CREATE TABLE " + constraint + "\"CUSTOMER\" (" + // - "\"_id\" INTEGER PRIMARY KEY ," + // 0: id - "\"NAME\" TEXT NOT NULL );"); // 1: name - } - - /** Drops the underlying database table. */ - public static void dropTable(SQLiteDatabase db, boolean ifExists) { - String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"CUSTOMER\""; - db.execSQL(sql); - } - - /** @inheritdoc */ - @Override - protected void bindValues(SQLiteStatement stmt, Customer entity) { - stmt.clearBindings(); - - Long id = entity.getId(); - if (id != null) { - stmt.bindLong(1, id); - } - stmt.bindString(2, entity.getName()); - } - - @Override - protected void attachEntity(Customer entity) { - super.attachEntity(entity); - entity.__setDaoSession(daoSession); - } - - /** @inheritdoc */ - @Override - public Long readKey(Cursor cursor, int offset) { - return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); - } - - /** @inheritdoc */ - @Override - public Customer readEntity(Cursor cursor, int offset) { - Customer entity = new Customer( // - cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id - cursor.getString(offset + 1) // name - ); - return entity; - } - - /** @inheritdoc */ - @Override - public void readEntity(Cursor cursor, Customer entity, int offset) { - entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); - entity.setName(cursor.getString(offset + 1)); - } - - /** @inheritdoc */ - @Override - protected Long updateKeyAfterInsert(Customer entity, long rowId) { - entity.setId(rowId); - return rowId; - } - - /** @inheritdoc */ - @Override - public Long getKey(Customer entity) { - if(entity != null) { - return entity.getId(); - } else { - return null; - } - } - - /** @inheritdoc */ - @Override - protected boolean isEntityUpdateable() { - return true; - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoMaster.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoMaster.java deleted file mode 100644 index 87d76e8..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoMaster.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.tamic.statInterface.statsdk.db; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteDatabase.CursorFactory; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import de.greenrobot.dao.AbstractDaoMaster; -import de.greenrobot.dao.identityscope.IdentityScopeType; - -// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. - -/** - * Master of DAO (schema version 1000): knows all DAOs. -*/ -public class DaoMaster extends AbstractDaoMaster { - public static final int SCHEMA_VERSION = 1000; - - /** Creates underlying database table using DAOs. */ - public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) { - TcNoteDao.createTable(db, ifNotExists); - CustomerDao.createTable(db, ifNotExists); - } - - /** Drops underlying database table using DAOs. */ - public static void dropAllTables(SQLiteDatabase db, boolean ifExists) { - TcNoteDao.dropTable(db, ifExists); - CustomerDao.dropTable(db, ifExists); - } - - public static abstract class OpenHelper extends SQLiteOpenHelper { - - public OpenHelper(Context context, String name, CursorFactory factory) { - super(context, name, factory, SCHEMA_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); - createAllTables(db, false); - } - } - - /** WARNING: Drops all table on Upgrade! Use only during development. */ - public static class DevOpenHelper extends OpenHelper { - public DevOpenHelper(Context context, String name, CursorFactory factory) { - super(context, name, factory); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); - dropAllTables(db, true); - onCreate(db); - } - } - - public DaoMaster(SQLiteDatabase db) { - super(db, SCHEMA_VERSION); - registerDaoClass(TcNoteDao.class); - registerDaoClass(CustomerDao.class); - } - - public DaoSession newSession() { - return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); - } - - public DaoSession newSession(IdentityScopeType type) { - return new DaoSession(db, type, daoConfigMap); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoSession.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoSession.java deleted file mode 100644 index b236acf..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/DaoSession.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.tamic.statInterface.statsdk .db; - -import android.database.sqlite.SQLiteDatabase; - -import java.util.Map; - -import de.greenrobot.dao.AbstractDao; -import de.greenrobot.dao.AbstractDaoSession; -import de.greenrobot.dao.identityscope.IdentityScopeType; -import de.greenrobot.dao.internal.DaoConfig; - -// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. - -/** - * {@inheritDoc} - * - * @see AbstractDaoSession - */ -public class DaoSession extends AbstractDaoSession { - - private final DaoConfig paNoteDaoConfig ; - private final DaoConfig customerDaoConfig; - - private final TcNoteDao paNoteDao ; - private final CustomerDao customerDao; - - - public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map>, DaoConfig> - daoConfigMap) { - super(db); - paNoteDaoConfig = daoConfigMap.get(TcNoteDao.class).clone(); - paNoteDaoConfig.initIdentityScope(type); - - - customerDaoConfig = daoConfigMap.get(CustomerDao.class).clone(); - customerDaoConfig.initIdentityScope(type); - - - paNoteDao = new TcNoteDao(paNoteDaoConfig,this); - customerDao = new CustomerDao(customerDaoConfig, this); - - registerDao(TcNote.class,paNoteDao); - registerDao(Customer.class, customerDao); - } - - public void clear() { - paNoteDaoConfig.getIdentityScope().clear(); - customerDaoConfig.getIdentityScope().clear(); - } - - - - public TcNoteDao getPaNoteDao(){ - return paNoteDao ; - } - - public CustomerDao getCustomerDao() { - return customerDao; - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNote.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNote.java deleted file mode 100644 index fdb4e3a..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNote.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.tamic.statInterface.statsdk.db; - -// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. -/** - * Entity mapped to table "Stact_NOTE". - */ -public class TcNote { - - private Long id; - /** Not-null value. */ - private String firstcloumn; - /** Not-null value. */ - private String secondcloumn; - /** Not-null value. */ - private String thirdcloumn; - - public TcNote() { - } - - public TcNote(Long id) { - this.id = id; - } - - public TcNote(Long id, String firstcloumn, String secondcloumn, String thirdcloumn) { - this.id = id; - this.firstcloumn = firstcloumn; - this.secondcloumn = secondcloumn; - this.thirdcloumn = thirdcloumn; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - /** Not-null value. */ - public String getFirstcloumn() { - return firstcloumn; - } - - /** Not-null value; ensure this value is available before it is saved to the database. */ - public void setFirstcloumn(String firstcloumn) { - this.firstcloumn = firstcloumn; - } - - /** Not-null value. */ - public String getSecondcloumn() { - return secondcloumn; - } - - /** Not-null value; ensure this value is available before it is saved to the database. */ - public void setSecondcloumn(String secondcloumn) { - this.secondcloumn = secondcloumn; - } - - /** Not-null value. */ - public String getThirdcloumn() { - return thirdcloumn; - } - - /** Not-null value; ensure this value is available before it is saved to the database. */ - public void setThirdcloumn(String thirdcloumn) { - this.thirdcloumn = thirdcloumn; - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNoteDao.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNoteDao.java deleted file mode 100644 index 815b190..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/TcNoteDao.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.tamic.statInterface.statsdk.db; - -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteStatement; - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; - -import de.greenrobot.dao.AbstractDao; -import de.greenrobot.dao.Property; -import de.greenrobot.dao.internal.DaoConfig; - -// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. - -/** - * DAO for table "PA_NOTE". -*/ -public class TcNoteDao extends AbstractDao { - - public static final String TABLENAME = StaticsConfig.SDK_TABLE_NAME; - - - /** - * Properties of entity TcNote.
- * Can be used for QueryBuilder and for referencing column names. - */ - public static class Properties { - public final static Property Id = new Property(0, Long.class, "id", true, "_id"); - public final static Property appActionInfo = new Property(1, String.class, StaticsConfig.APPACTION_INFO, false, "FIRSTCLOUMN"); - public final static Property pageInfo = new Property(2, String.class, StaticsConfig.PAGE_INFO, false, "SECONDCLOUMN"); - public final static Property enventInfo = new Property(3, String.class, StaticsConfig.ENVENT_INFO, false, "THIRDCLOUMN"); - } - - public TcNoteDao(DaoConfig config) { - super(config); - } - - public TcNoteDao(DaoConfig config, DaoSession daoSession) { - super(config, daoSession); - } - - /** Creates the underlying database table. */ - public static void createTable(SQLiteDatabase db, boolean ifNotExists) { - String constraint = ifNotExists? "IF NOT EXISTS ": ""; - db.execSQL("CREATE TABLE " + constraint + TABLENAME + "(" + // - "\"_id\" INTEGER PRIMARY KEY ," + // 0: id - "\"FIRSTCLOUMN\" TEXT NOT NULL ," + // 1: firstcloumn - "\"SECONDCLOUMN\" TEXT NOT NULL ," + // 2: secondcloumn - "\"THIRDCLOUMN\" TEXT NOT NULL );"); // 3: thirdcloumn - } - - /** Drops the underlying database table. */ - public static void dropTable(SQLiteDatabase db, boolean ifExists) { - String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + TABLENAME; - db.execSQL(sql); - } - - /** @inheritdoc */ - @Override - protected void bindValues(SQLiteStatement stmt, TcNote entity) { - stmt.clearBindings(); - - Long id = entity.getId(); - if (id != null) { - stmt.bindLong(1, id); - } - stmt.bindString(2, entity.getFirstcloumn()); - stmt.bindString(3, entity.getSecondcloumn()); - stmt.bindString(4, entity.getThirdcloumn()); - } - - /** @inheritdoc */ - @Override - public Long readKey(Cursor cursor, int offset) { - return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); - } - - /** @inheritdoc */ - @Override - public TcNote readEntity(Cursor cursor, int offset) { - TcNote entity = new TcNote( // - cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id - cursor.getString(offset + 1), // firstcloumn - cursor.getString(offset + 2), // secondcloumn - cursor.getString(offset + 3) // thirdcloumn - ); - return entity; - } - - /** @inheritdoc */ - @Override - public void readEntity(Cursor cursor, TcNote entity, int offset) { - entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); - entity.setFirstcloumn(cursor.getString(offset + 1)); - entity.setSecondcloumn(cursor.getString(offset + 2)); - entity.setThirdcloumn(cursor.getString(offset + 3)); - } - - /** @inheritdoc */ - @Override - protected Long updateKeyAfterInsert(TcNote entity, long rowId) { - entity.setId(rowId); - return rowId; - } - - /** @inheritdoc */ - @Override - public Long getKey(TcNote entity) { - if(entity != null) { - return entity.getId(); - } else { - return null; - } - } - - /** @inheritdoc */ - @Override - protected boolean isEntityUpdateable() { - return true; - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/DataConstruct.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/DataConstruct.java deleted file mode 100644 index 845bc8f..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/DataConstruct.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.tamic.statInterface.statsdk.db.helper; - -import android.app.Activity; -import android.content.Context; -import android.text.TextUtils; - -import com.tamic.statInterface.statsdk.core.StaticsListener; -import com.tamic.statInterface.statsdk.model.AppAction; -import com.tamic.statInterface.statsdk.model.Event; -import com.tamic.statInterface.statsdk.model.KeyValueBean; -import com.tamic.statInterface.statsdk.model.Page; -import com.tamic.statInterface.statsdk.sp.SharedPreferencesHelper; -import com.tamic.statInterface.statsdk.util.DateUtil; - -import java.util.ArrayList; - -/** - * DataConstruct - * Created by tamic on 2016-04-11. - */ -public class DataConstruct { - - private static Event event = null; - private static ArrayList parameter = new ArrayList<>() ; - - private static Page page = null ; - private static ArrayList pageParameter = new ArrayList<>() ; - - private static AppAction appAction = null ; - - private static StaticsListener staticsListener; - - private static String pageId; - - private static String referPageId; - - private static String REFERPAGE_ID = "referPage_Id"; - - private DataConstruct() { - } - - - - /** - * initEvent - * @param eventInterface - * @param event_name - */ - public static void initEvent(StaticsListener eventInterface, String event_name){ - event = new Event(); - event.setPage_id(pageId); - event.setReferer_page_id(referPageId); - event.setEvent_name(event_name); - event.setAction_time(DateUtil.getDateString(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); - } - - /** - * onEvent - * @param businessName - * @param businessValue - */ - public static void onEvent(String businessName,String businessValue){ - parameter.add(new KeyValueBean(businessName, businessValue)); - if(event == null){ - throw new RuntimeException("you must call initEvent before onEvent!"); - } - event.setParameter(parameter); - } - - /** - * storeEvent - * Activity destory call - */ - public static void storeEvent(){ - if(event == null){ - return; - } - StaticsAgent.storeObject(event); - } - - - /** - * initPage - * @param eventInterface - */ - public static void initPage(Context context, StaticsListener eventInterface, String page_Id, String referPage_Id){ - staticsListener = eventInterface; - pageId = page_Id; - recardPageId(context, page_Id); - if (TextUtils.isEmpty(referPage_Id)){ - referPageId = getReferPageId(context); - } else { - referPageId = referPage_Id; - } - page = new Page(); - page.setPage_start_time(DateUtil.getDateString(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); - page.setReferer_page_id(referPageId); - page.setPage_id(pageId); - } - - - public static void initPageParameter(String name,String value){ - pageParameter.add(new KeyValueBean(name, value)); - page.setParameter(pageParameter); - } - - - /** - * storePage - */ - public static void storePage(){ - if(page == null){ - throw new RuntimeException("you must init before storePage"); - } - page.setPage_end_time(DateUtil.getDateString(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); - StaticsAgent.storeObject(page); - } - - - /** - * storeAppAction - * @param type 1 app打开 2app关闭 3唤醒 - */ - public static void storeAppAction(String type){ - appAction = new AppAction(); - appAction.setAction_time(DateUtil.getDateString(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); - appAction.setApp_action_type(type); - StaticsAgent.storeObject(appAction); - } - - - /** - * deleteData - */ - public static void deleteData(){ - StaticsAgent.deleteData(); - } - - /** - * recardPageId - * @param context - * @param page_Id - */ - private static void recardPageId (Context context, String page_Id) { - SharedPreferencesHelper.getInstance(context).putString(REFERPAGE_ID, page_Id); - } - - /** - * get ReferPageId - * @param context - * @return - */ - private static String getReferPageId (Context context) { - return SharedPreferencesHelper.getInstance(context).getString(REFERPAGE_ID); - } - - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/NoteDaoHelper.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/NoteDaoHelper.java deleted file mode 100644 index 01d3f48..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/NoteDaoHelper.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tamic.statInterface.statsdk.db.helper; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; - -import com.tamic.statInterface.statsdk.db.DaoMaster; -import com.tamic.statInterface.statsdk.db.DaoSession; -import com.tamic.statInterface.statsdk.db.TcNoteDao; - -/** - * Created by Tamic on 2016-03-16. - */ -public class NoteDaoHelper { - private SQLiteDatabase db; - private DaoMaster daoMaster; - private DaoSession daoSession; - private TcNoteDao paNoteDao ; - - public TcNoteDao getPaNoteDao(Context context){ - if(paNoteDao == null){ - paNoteDao = getDaoSession(context).getPaNoteDao(); - } - return paNoteDao ; - } - - - - - private DaoMaster getDaoMaster(Context context){ - if(daoMaster == null){ - DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "tamic-db", null); - db = helper.getWritableDatabase(); - daoMaster = new DaoMaster(db); - } - return daoMaster ; - } - - private DaoSession getDaoSession(Context context){ - if(daoSession == null){ - daoSession = getDaoMaster(context).newSession(); - } - return daoSession ; - } - - - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/StaticsAgent.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/StaticsAgent.java deleted file mode 100644 index f199999..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/db/helper/StaticsAgent.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.tamic.statInterface.statsdk.db.helper; - -import android.content.Context; -import android.text.TextUtils; - -import com.alibaba.fastjson.JSONObject; -import com.tamic.statInterface.statsdk.db.TcNote; -import com.tamic.statInterface.statsdk.db.TcNoteDao; -import com.tamic.statInterface.statsdk.model.AppAction; -import com.tamic.statInterface.statsdk.model.DataBlock; -import com.tamic.statInterface.statsdk.model.Event; -import com.tamic.statInterface.statsdk.model.Page; -import com.tamic.statInterface.statsdk.util.JsonUtil; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Tamic on 2016-03-17. - */ -public class StaticsAgent { - private static NoteDaoHelper helper; - private static TcNoteDao noteDao; - private static TcNote note; - - /** - * @param context - */ - public static void init(Context context) { - helper = new NoteDaoHelper(); - noteDao = helper.getPaNoteDao(context); - } - - /** - * 存储appAction相关信息 - * - * @param appAction - */ - public static void storeAppAction(String appAction) { - if (TextUtils.isEmpty(appAction)) - throw new NullPointerException("appAction is null"); - storeData(appAction, "", ""); - } - - /** - * storePage - * - * @param pageString - */ - public static void storePage(String pageString) { - if (TextUtils.isEmpty(pageString)) - throw new NullPointerException("pageString is null"); - storeData("", pageString, ""); - } - - /** - * storeEvent - * - * @param eventString - */ - public static void storeEvent(String eventString) { - if (TextUtils.isEmpty(eventString)) - throw new NullPointerException("eventString is null"); - storeData("", "", eventString); - } - - public static DataBlock getDataBlock() { - DataBlock dataBlock = new DataBlock(); - List list = noteDao.loadAll(); - AppAction appAction = new AppAction(); - Page page = new Page(); - Event event = new Event(); - List actionList = new ArrayList(); - List pageList = new ArrayList(); - List eventList = new ArrayList(); - for (int i = 0; i < list.size(); i++) { - if (!TextUtils.isEmpty(list.get(i).getFirstcloumn())) { - appAction = JsonUtil.parseObject(list.get(i).getFirstcloumn(), AppAction.class); - actionList.add(appAction); - } - if (!TextUtils.isEmpty(list.get(i).getSecondcloumn())) { - page = JsonUtil.parseObject(list.get(i).getSecondcloumn(), Page.class); - pageList.add(page); - } - if (!TextUtils.isEmpty(list.get(i).getThirdcloumn())) { - event = JsonUtil.parseObject(list.get(i).getThirdcloumn(), Event.class); - eventList.add(event); - } - } - dataBlock.setApp_action(actionList); - dataBlock.setPage(pageList); - dataBlock.setEvent(eventList); - return dataBlock; - } - - - public static void storeData(String appActionInfo, String pageInfo, String eventInfo) { - note = new TcNote(null, appActionInfo, pageInfo, eventInfo); - if (null != helper) { - noteDao.insert(note); - } - } - - /** - * storeObject - * - * @param o - */ - public static void storeObject(Object o) { - if (o instanceof Event) { - storeEvent(JSONObject.toJSONString(o)); - } else if (o instanceof AppAction) { - storeAppAction(JSONObject.toJSONString(o)); - } else if (o instanceof Page) { - storePage(JSONObject.toJSONString(o)); - } - } - - public static void deleteData() { - noteDao.deleteAll(); - } - -} - diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/http/TcHttpClient.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/http/TcHttpClient.java deleted file mode 100644 index dacd28b..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/http/TcHttpClient.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tamic.statInterface.statsdk.http; - -import android.content.Context; - -import com.loopj.android.http.*; - -import cz.msebera.android.httpclient.Header; - -/** - * Created by LIUYONGKUI726 on 2016-05-26. - */ -public class TcHttpClient { - - private static final String BASE_URL = ""; - - private static AsyncHttpClient client = new AsyncHttpClient(); - - public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { - client.get(getAbsoluteUrl(url), params, responseHandler); - } - - public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { - client.post(getAbsoluteUrl(url), params, responseHandler); - } - - private static String getAbsoluteUrl(String relativeUrl) { - return BASE_URL + relativeUrl; - } - - public static void get(Context context,String url, Header[] headers, RequestParams params, AsyncHttpResponseHandler responseHandler) { - client.get(context,getAbsoluteUrl(url),headers, params, responseHandler); - } - - public static void post(Context context,String url, Header[] headers, RequestParams params, String contentType, - AsyncHttpResponseHandler responseHandler) { - client.post(context, getAbsoluteUrl(url), headers, params, contentType, responseHandler); - } - - public static void cancle(String tag, boolean isRunning) { - client.cancelRequestsByTAG(tag, isRunning); - } - - public static void cancleAll(boolean isRunning) { - client.cancelAllRequests(isRunning); - } - - /**setTimeOut - * @param time 秒数 - */ - public static void setTimeOut(int time) { - client.setTimeout(time); - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppAction.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppAction.java deleted file mode 100644 index af3241a..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppAction.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -/** - - * Created by Tamic 2016-03-24. - */ -public class AppAction { - private String action_time ; - private String app_action_type ; - - public String getAction_time() { - return action_time; - } - - public void setAction_time(String action_time) { - this.action_time = action_time; - } - - public String getApp_action_type() { - return app_action_type; - } - - public void setApp_action_type(String app_action_type) { - this.app_action_type = app_action_type; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppActionList.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppActionList.java deleted file mode 100644 index e1bc724..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/AppActionList.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * AppAction - * Created by Tamic on 2016-03-24. - */ -public class AppActionList { - private List list ; - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/DataBlock.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/DataBlock.java deleted file mode 100644 index a0eca2e..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/DataBlock.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * 上传数据对象bean - * Created by ZHANGLIANG098 on 2016-03-24. - */ -public class DataBlock { - private List app_action ; - private List page ; - private List event ; - - public List getApp_action() { - return app_action; - } - - public void setApp_action(List app_action) { - this.app_action = app_action; - } - - public List getPage() { - return page; - } - - public void setPage(List page) { - this.page = page; - } - - public List getEvent() { - return event; - } - - public void setEvent(List event) { - this.event = event; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Event.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Event.java deleted file mode 100644 index 1f868ff..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Event.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * 对应的event事件 - * Created by ZHANGLIANG098 on 2016-03-24. - */ -public class Event { - private String page_id ; - private String referer_page_id ; - private String uid ; - private String city_id ; - private String event_name ; - private String action_time ; - private List parameter ; - - public String getPage_id() { - return page_id; - } - - public void setPage_id(String page_id) { - this.page_id = page_id; - } - - public String getReferer_page_id() { - return referer_page_id; - } - - public void setReferer_page_id(String referer_page_id) { - this.referer_page_id = referer_page_id; - } - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } - - public String getCity_id() { - return city_id; - } - - public void setCity_id(String city_id) { - this.city_id = city_id; - } - - public String getEvent_name() { - return event_name; - } - - public void setEvent_name(String event_name) { - this.event_name = event_name; - } - - public String getAction_time() { - return action_time; - } - - public void setAction_time(String action_time) { - this.action_time = action_time; - } - - public List getParameter() { - return parameter; - } - - public void setParameter(List parameter) { - this.parameter = parameter; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/EventList.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/EventList.java deleted file mode 100644 index 8e8890a..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/EventList.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * 对应的event事件集合 - * Created by ZHANGLIANG098 on 2016-03-24. - */ -public class EventList { - private List list ; - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/KeyValueBean.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/KeyValueBean.java deleted file mode 100644 index 49a8075..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/KeyValueBean.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -/** - *业务对应的key-value - * Created by ZHANGLIANG098 on 2016-03-24. - */ -public class KeyValueBean { - private String name; - private String value; - - public KeyValueBean(){} - - public KeyValueBean(String name,String value){ - this.name = name ; - this.value = value ; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "KeyValueBean{" + - "name='" + name + '\'' + - ", value='" + value + '\'' + - '}'; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Page.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Page.java deleted file mode 100644 index b106d37..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/Page.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * Page - * Created by Tamic on 2016-03-24. - */ -public class Page { - private String page_id; - private String referer_page_id ; - private String page_start_time ; - private String page_end_time ; - private String city_id ; - private String uid ; - private List parameter ; - - public String getPage_id() { - return page_id; - } - - public void setPage_id(String page_id) { - this.page_id = page_id; - } - - public String getReferer_page_id() { - return referer_page_id; - } - - public void setReferer_page_id(String referer_page_id) { - this.referer_page_id = referer_page_id; - } - - public String getPage_start_time() { - return page_start_time; - } - - public void setPage_start_time(String page_start_time) { - this.page_start_time = page_start_time; - } - - public String getPage_end_time() { - return page_end_time; - } - - public void setPage_end_time(String page_end_time) { - this.page_end_time = page_end_time; - } - - public String getCity_id() { - return city_id; - } - - public void setCity_id(String city_id) { - this.city_id = city_id; - } - - public List getParameter() { - return parameter; - } - - public void setParameter(List parameter) { - this.parameter = parameter; - } - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/PageList.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/PageList.java deleted file mode 100644 index 722caf4..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/PageList.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * 页面数据统计集合 - * Created by ZHANGLIANG098 on 2016-03-24. - */ -public class PageList { - private List list ; - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/ParamterList.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/ParamterList.java deleted file mode 100644 index 9b89b85..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/ParamterList.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tamic.statInterface.statsdk.model; - -import java.util.List; - -/** - * 业务对应的key-value集合 - * Created by ZHANGLIANG098 on 2016-03-24. - */ -public class ParamterList { - private List list ; - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/AppInfo.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/AppInfo.java deleted file mode 100644 index 1a05635..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/AppInfo.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.tamic.statInterface.statsdk.model.header; - -/** - * Created by Tamic on 2016-03-24. - * AppInfo - */ -public class AppInfo { - - /** - * App ID - */ - private String app_id; - - /** - * App版本 - */ - private String app_version; - - /** - * 统计sdk版本号 - */ - private int sdk_version_code; - - private String sdk_verson_name; - - /** - * app channel - */ - private String channel; - - public AppInfo() { - } - - public String getApp_id() { - return app_id; - } - - public void setApp_id(String app_id) { - this.app_id = app_id; - } - - public String getApp_version() { - return app_version; - } - - public void setApp_version(String app_version) { - this.app_version = app_version; - } - - public int getSdk_version() { - return sdk_version_code; - } - - public void setSdk_version(int sdk_version) { - this.sdk_version_code = sdk_version; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - public String getSdk_verson_name() { - return sdk_verson_name; - } - - public void setSdk_verson_name(String sdk_verson_name) { - this.sdk_verson_name = sdk_verson_name; - } - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/DeviceInfo.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/DeviceInfo.java deleted file mode 100644 index 0f11bec..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/DeviceInfo.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.tamic.statInterface.statsdk.model.header; - -/** - * Created by Tamic on 2016-03-24. - */ -public class DeviceInfo { - private String device_id; - private String idfa; - private String idfv; - private String openudid; - private String imei; - private String android_id; - private String mac; - private String locale; - private String os = "Android"; - private String os_version; - private String resolution; - private String density; - private String model; - - - public String getDevice_id() { - return device_id; - } - - public void setDevice_id(String device_id) { - this.device_id = device_id; - } - - public String getIdfv() { - return idfv; - } - - public void setIdfv(String idfv) { - this.idfv = idfv; - } - - public String getIdfa() { - return idfa; - } - - public void setIdfa(String idfa) { - this.idfa = idfa; - } - - public String getOpenudid() { - return openudid; - } - - public void setOpenudid(String openudid) { - this.openudid = openudid; - } - - public String getImei() { - return imei; - } - - public void setImei(String imei) { - this.imei = imei; - } - - public String getAndroid_id() { - return android_id; - } - - public void setAndroid_id(String android_id) { - this.android_id = android_id; - } - - public String getMac() { - return mac; - } - - public void setMac(String mac) { - this.mac = mac; - } - - public String getLocale() { - return locale; - } - - public void setLocale(String locale) { - this.locale = locale; - } - - public String getOs() { - return os; - } - - public void setOs(String os) { - this.os = os; - } - - public String getOs_version() { - return os_version; - } - - public void setOs_version(String os_version) { - this.os_version = os_version; - } - - public String getResolution() { - return resolution; - } - - public void setResolution(String resolution) { - this.resolution = resolution; - } - - public String getDensity() { - return density; - } - - public void setDensity(String density) { - this.density = density; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/HeaderInfo.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/HeaderInfo.java deleted file mode 100644 index a36977e..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/HeaderInfo.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tamic.statInterface.statsdk.model.header; - -/** - * Created by Tamic on 2016-04-06. - */ -public class HeaderInfo { - - private AppInfo appinfo; - - private DeviceInfo deviceinfo; - - private NetworkInfo networkinfo; - - public HeaderInfo() { - } - - public HeaderInfo(AppInfo appinfo, DeviceInfo deviceinfo, NetworkInfo networkinfo) { - this.appinfo = appinfo; - this.deviceinfo = deviceinfo; - this.networkinfo = networkinfo; - } - - public AppInfo getAppinfo() { - return appinfo; - } - - public void setAppinfo(AppInfo appinfo) { - this.appinfo = appinfo; - } - - public DeviceInfo getDeviceinfo() { - return deviceinfo; - } - - public void setDeviceinfo(DeviceInfo deviceinfo) { - this.deviceinfo = deviceinfo; - } - - public NetworkInfo getNetworkinfo() { - return networkinfo; - } - - public void setNetworkinfo(NetworkInfo networkinfo) { - this.networkinfo = networkinfo; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/NetworkInfo.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/NetworkInfo.java deleted file mode 100644 index d790961..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/model/header/NetworkInfo.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.tamic.statInterface.statsdk.model.header; - -/** - * NetworkInfo - * Created by Tamic on 2016-03-24. - */ -public class NetworkInfo { - - //operator - private String carrier; - //is wifi - private Boolean wifi_ind; - //IP - private String ip_addr; - //latitude - private String latitude; - //longitude - private String longitude; - - - public NetworkInfo() { - } - - public String getCarrier() { - return carrier; - } - - public void setCarrier(String carrier) { - this.carrier = carrier; - } - - public String getLongitude() { - return longitude; - } - - public void setLongitude(String longitude) { - this.longitude = longitude; - } - - public String getIp_addr() { - return ip_addr; - } - - public void setIp_addr(String ip_addr) { - this.ip_addr = ip_addr; - } - - public Boolean getWifi_ind() { - return wifi_ind; - } - - public void setWifi_ind(Boolean wifi_ind) { - this.wifi_ind = wifi_ind; - } - - public String getLatitude() { - return latitude; - } - - public void setLatitude(String latitude) { - this.latitude = latitude; - } - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcDeblockObserver.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcDeblockObserver.java deleted file mode 100644 index 276a0cd..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcDeblockObserver.java +++ /dev/null @@ -1,109 +0,0 @@ - -package com.tamic.statInterface.statsdk.presenter; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; -import com.tamic.statInterface.statsdk.core.TcIntentManager; -import com.tamic.statInterface.statsdk.util.StatLog; - -/** - * DeblockObserver - * Created by Tamic on 2016-04-15. - */ -public class TcDeblockObserver extends BroadcastReceiver { - - /** DEBUG mode */ - private static final boolean DEBUG = StaticsConfig.DEBUG; - /** StatLog TAG */ - private static final String StatLog_TAG = TcDeblockObserver.class.getSimpleName(); - /** Context */ - private Context mContext; - /** IKeyguardListener */ - private IKeyguardListener mListener; - - /** - * Constructor - * - * @param aContext - * Context - * @param aListener - * IScreenListener - */ - public TcDeblockObserver(Context aContext, IKeyguardListener aListener) { - mContext = aContext; - mListener = aListener; - } - - /** - * start Listener - */ - public void start() { - try { - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_PRESENT); - mContext.registerReceiver(this, filter); - - if (!isScreenLocked(mContext)) { - if (mListener != null) { - mListener.onKeyguardGone(mContext); - } - } - } catch (Exception e) { - if (DEBUG) { - StatLog.w(StatLog_TAG, "start Exception", e); - } - } - } - - /** - * stop Listener - */ - public void stop() { - try { - mContext.unregisterReceiver(this); - } catch (Exception e) { - if (DEBUG) { - StatLog.w(StatLog_TAG, "stop Exception", e); - } - } - } - - /** - * is Screen Locked - * - * @param aContext Context - * @return true if screen locked, false otherwise - */ - public boolean isScreenLocked(Context aContext) { - android.app.KeyguardManager km = (android.app.KeyguardManager) aContext - .getSystemService(Context.KEYGUARD_SERVICE); - return km.inKeyguardRestrictedInputMode(); - } - - @Override - public void onReceive(Context aContext, Intent aIntent) { - if (TcIntentManager.getInstance().isUserPresentIntent(aIntent)) { - if (mListener != null) { - mListener.onKeyguardGone(aContext); - } - } - } - - /** - * IKeyguardListener - */ - public interface IKeyguardListener { - - /** - * unlock - * - * @param aContext - * Context - */ - void onKeyguardGone(Context aContext); - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcNetworkObserver.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcNetworkObserver.java deleted file mode 100644 index f90e864..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcNetworkObserver.java +++ /dev/null @@ -1,143 +0,0 @@ - -package com.tamic.statInterface.statsdk.presenter; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.text.TextUtils; -import android.util.Log; - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; - -/** - * NetworkObserver - * Created by Tamic. - */ -public class TcNetworkObserver extends BroadcastReceiver { - - /** Debug mode */ - private static final boolean DEBUG = StaticsConfig.DEBUG; - /** LOG Tag */ - private static final String LOG_TAG = TcNetworkObserver.class.getSimpleName(); - /** Context */ - private Context mContext; - /** NetworkListener */ - private INetworkListener mListener; - /** IsNetworkAvailable */ - private boolean mIsNetworkAvailable; - /** Is Registered */ - private boolean isRegistered; - - /** - * Constructor - * - * @param aContext - * Context - * @param aListener - * INetworkListener - */ - public TcNetworkObserver(Context aContext, INetworkListener aListener) { - mContext = aContext; - mListener = aListener; - mIsNetworkAvailable = false; - isRegistered = false; - } - - /** - * start, onResume call - */ - public void start() { - - if (isRegistered) { - - return; - } - try { - mContext.registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); - - isRegistered = true; - } catch (Exception e) { - isRegistered = false; - if (DEBUG) { - Log.e(LOG_TAG, "Start Exception", e); - } - } - } - - /** - * stop, onPause call - */ - public void stop() { - - if (!isRegistered) { - - return; - } - try { - mContext.unregisterReceiver(this); - isRegistered = false; - } catch (Exception e) { - if (DEBUG) { - Log.e(LOG_TAG, "Stop Exception", e); - } - isRegistered = true; - } - } - - /** - * Indicates whether network connectivity is possible. - * - * @param aContext - * Context - * - * @return true if the network is available, false otherwise - */ - public boolean isNetworkAvailable(Context aContext) { - ConnectivityManager cm = (ConnectivityManager) aContext - .getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo info = cm.getActiveNetworkInfo(); - return (info != null && info.isAvailable()); - } - - @Override - public void onReceive(Context aContext, Intent aIntent) { - - if (TextUtils.equals(aIntent.getAction(), ConnectivityManager.CONNECTIVITY_ACTION)) { - - boolean isAvailable = isNetworkAvailable(aContext); - if (isAvailable) { - if (!mIsNetworkAvailable && mListener != null) { - mListener.onNetworkConnected(aContext); - } - } else { - if (mListener != null) { - mListener.onNetworkUnConnected(aContext); - } - } - mIsNetworkAvailable = isAvailable; - - } - } - - /** - * INetworkListener - */ - public interface INetworkListener { - /** - * Connected( - * - * @param aContext - * Context - */ - void onNetworkConnected(Context aContext); - - - /** UnConnected - * @param aContext - */ - void onNetworkUnConnected(Context aContext); - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcScreenObserver.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcScreenObserver.java deleted file mode 100644 index 747ec0e..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/presenter/TcScreenObserver.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Filename: TcScreenObserver.java - * Description: - * Copyright: Baidu MIC Copyright(c)2011 - * @author: CoCoMo - * @version: 1.0 - * Create at: 2013-1-6 下午1:55:30 - * - * Modification History: - * Date Author Version Description - * ------------------------------------------------------------------ - * 2013-1-6 CoCoMo 1.0 1.0 Version - */ -package com.tamic.statInterface.statsdk.presenter; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.PowerManager; -import android.util.Log; - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; -import com.tamic.statInterface.statsdk.core.TcIntentManager; - -/** - * ScreenObserver - * Created by Tamic. on 2016-04-15. - */ -public class TcScreenObserver extends BroadcastReceiver { - - /** DEBUG mode */ - private static final boolean DEBUG = StaticsConfig.DEBUG; - /** Log TAG */ - private static final String LOG_TAG = TcScreenObserver.class.getSimpleName(); - - /** Context */ - private Context mContext; - /** ScreenObserver */ - private IScreenListener mListener; - - /** - * Constructor - * - * @param aContext - * Context - * @param aListener - * IScreenListener - */ - public TcScreenObserver(Context aContext, IScreenListener aListener) { - mContext = aContext; - mListener = aListener; - } - - - public void start() { - try { - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_ON); - filter.addAction(Intent.ACTION_SCREEN_OFF); - mContext.registerReceiver(this, filter); - - if (isScreenOn(mContext)) { - if (mListener != null) { - mListener.onScreenOn(mContext); - } - } else { - if (mListener != null) { - mListener.onScreenOff(mContext); - } - } - } catch (Exception e) { - if (DEBUG) { - Log.w(LOG_TAG, "start Exception", e); - } - } - } - - - public void stop() { - try { - mContext.unregisterReceiver(this); - } catch (Exception e) { - if (DEBUG) { - Log.w(LOG_TAG, "stop Exception", e); - } - } - } - - /** - * isScreenOn - * - * @param aContext - * Context - */ - public boolean isScreenOn(Context aContext) { - PowerManager pm = (PowerManager) aContext.getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); - } - - @Override - public void onReceive(Context aContext, Intent aIntent) { - if (TcIntentManager.getInstance().isScreenOnIntent(aIntent)) { - if (mListener != null) { - mListener.onScreenOn(aContext); - } - } else if (TcIntentManager.getInstance().isScreenOffIntent(aIntent)) { - if (mListener != null) { - mListener.onScreenOff(aContext); - } - } - } - - /** - * IScreenListener - */ - public interface IScreenListener { - - - void onScreenOn(Context aContext); - - - void onScreenOff(Context aContext); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/Platform.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/Platform.java deleted file mode 100644 index c09acaa..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/Platform.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 Square, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.tamic.statInterface.statsdk.service; - -import android.os.Build; -import android.util.Log; - -import com.tamic.statInterface.statsdk.core.TcNetEngine; - -import java.util.concurrent.Executor; - -/** - * Created by Tamic on 2016-09-21. - * {@link # https://github.com/NeglectedByBoss} - */ -public class Platform { - private static final Platform PLATFORM = findPlatform(); - - public static Platform get() { - Log.v("TcStatInterfacePlatform", PLATFORM.getClass().toString()); - return PLATFORM; - } - - private static Platform findPlatform() { - try { - Class.forName("android.os.Build"); - if (Build.VERSION.SDK_INT != 0) { - return new Android(); - } - } catch (ClassNotFoundException ignored) { - } - return new Platform(); - } - - public Executor defaultCallbackExecutor() { - return new TcHandleThreadPool().getExecutor(); - } - - public Object execute(Runnable runnable) { - defaultCallbackExecutor().execute(runnable); - return null; - } - - static class Android extends Platform { - @Override - public Executor defaultCallbackExecutor() { - return new TcHandleThreadPool().getExecutor(); - } - - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/PriorityThreadFactory.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/PriorityThreadFactory.java deleted file mode 100644 index fdfa843..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/PriorityThreadFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tamic.statInterface.statsdk.service; - -import android.os.Process; - -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Created by Tamic on 2016-09-20. - */ -public class PriorityThreadFactory implements ThreadFactory { - - private final String mName; - private final int mPriority; - private final AtomicInteger mNumber = new AtomicInteger(); - - public PriorityThreadFactory(String name, int priority) { - mName = name; - mPriority = priority; - } - @Override - public Thread newThread(Runnable r) { - return new Thread(r, mName +"-"+mNumber.getAndIncrement()){ - @Override - public void run() { - Process.setThreadPriority(mPriority); - super.run(); - } - }; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java deleted file mode 100644 index abd1004..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/service/TcHandleThreadPool.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tamic.statInterface.statsdk.service; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Created by Tamic on 2016-09-22. - */ -public class TcHandleThreadPool { - - private final static int POOL_SIZE = 4; - private final static int MAX_POOL_SIZE = 6; - private final static int KEEP_ALIVE_TIME = 4; - private final Executor mExecutor; - private final static String THREAD_NAME ="tamic-stat-thread-pool"; - public TcHandleThreadPool() { - - ThreadFactory factory = new PriorityThreadFactory(THREAD_NAME, android.os.Process.THREAD_PRIORITY_BACKGROUND); - BlockingQueue workQueue = new LinkedBlockingDeque(); - mExecutor = new ThreadPoolExecutor(POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, factory); - } - - public void execute(Runnable command){ - mExecutor.execute(command); - } - - public Executor getExecutor() { - return mExecutor; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/sp/SharedPreferencesHelper.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/sp/SharedPreferencesHelper.java deleted file mode 100644 index 0ae0600..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/sp/SharedPreferencesHelper.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.tamic.statInterface.statsdk.sp; - -import android.content.Context; -import android.content.SharedPreferences; - - -import com.tamic.statInterface.statsdk.util.JsonUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -/** - * Created by Tamic on 2016-03-24. - */ -public class SharedPreferencesHelper { - private static SharedPreferencesHelper sInstance; - private static SharedPreferences sSettings; - - - public static synchronized SharedPreferencesHelper getInstance(Context outContext) { - if (sInstance == null) { - sInstance = new SharedPreferencesHelper(outContext); - } - return sInstance; - } - - private SharedPreferencesHelper(Context outContext) { - String OUT_APP_PACKAGENAME = outContext.getPackageName(); - sSettings = outContext.getSharedPreferences(OUT_APP_PACKAGENAME, 0); - } - - - public void putString(String key, String value) { - synchronized (sSettings) { - sSettings.edit().putString(key, value).commit(); - } - } - - - public String getString(String key) { - synchronized (sSettings) { - return sSettings.getString(key, ""); - } - } - - - public String getString(String key, String defValue) { - synchronized (sSettings) { - return sSettings.getString(key, defValue); - } - } - - public Double getDouble(String key) { - String retStr = getString(key, null); - Double ret = null; - try { - ret = Double.parseDouble(retStr); - } catch (Exception e) { - } - return ret; - } - - public void putBoolean(String key, boolean bool) { - synchronized (sSettings) { - sSettings.edit().putBoolean(key, bool).commit(); - } - } - - public void putInteger(String key, int integer) { - synchronized (sSettings) { - sSettings.edit().putInt(key, integer).commit(); - } - } - - public void putLong(String key, long lon) { - synchronized (sSettings) { - sSettings.edit().putLong(key, lon).commit(); - } - } - - public Boolean getBoolean(String key, boolean defValue) { - synchronized (sSettings) { - return sSettings.getBoolean(key, defValue); - } - - } - - public int getInteger(String key, int defValue) { - synchronized (sSettings) { - return sSettings.getInt(key, defValue); - } - } - - public long getLong(String key, long defValue) { - synchronized (sSettings) { - return sSettings.getLong(key, defValue); - } - } - - - public void putHashMap(String key, HashMap map) { - JSONObject ret = new JSONObject(map); - synchronized (sSettings) { - sSettings.edit().putString(key, ret.toString()).commit(); - } - } - - public HashMap getHashMap(String key) { - return getHashMapByKey(key); - } - - public HashMap getHashMapByKey(String key) { - HashMap ret = new HashMap(); - - String mapStr = getString(key, "{}"); - JSONObject mapJson = null; - try { - mapJson = new JSONObject(mapStr); - } catch (Exception e) { - return ret; - } - - if (mapJson != null) { - @SuppressWarnings("unchecked") - Iterator it = mapJson.keys(); - while (it.hasNext()) { - String theKey = it.next(); - String theValue = mapJson.optString(theKey); - ret.put(theKey, theValue); - } - } - - return ret; - } - - public void putArrayList(String key, ArrayList list) { - JSONArray ret = new JSONArray(list); - putString(key, ret.toString()); - } - - public ArrayList getArrayList(String key) { - ArrayList ret = new ArrayList(); - - String listStr = getString(key, "{}"); - JSONArray listJson = null; - try { - listJson = new JSONArray(listStr); - } catch (Exception e) { - return ret; - } - - if (listJson != null) { - for (int i = 0; i < listJson.length(); i++) { - String temp = listJson.optString(i); - ret.add(temp); - } - } - - return ret; - } - - - public void removeByKey(String key) { - synchronized (sSettings) { - sSettings.edit().remove(key).commit(); - } - } - - public void putJsonArray(String key, JSONArray value) { - putString(key, value.toString()); - } - - public JSONArray getJsonArray(String key) { - JSONArray ret = null; - String jsonArrayStr = getString(key); - try { - ret = new JSONArray(jsonArrayStr); - } catch (JSONException e) { - ret = null; - } - return ret; - } - - public void putObject(String key, Object obj) { - String toSave = JsonUtil.toJSONString(obj); - putString(key, toSave); - } - - public T getObject(String key, Class cla) { - String temp = getString(key); - - if (temp == null || temp.trim().length() == 0) { - return null; - } - - return JsonUtil.parseObject(temp, cla); - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DateUtil.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DateUtil.java deleted file mode 100644 index 27ab3e4..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DateUtil.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tamic.statInterface.statsdk.util; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * DateUtil - * - */ -public class DateUtil { - - /** - * - * @return currentTimeMillis - */ - public static long getCurrentTime(){ - long time = System.currentTimeMillis(); - return time ; - } - - /** - * getDate - * yyyy-MM-dd HH:mm:ss - * - * @param - * @param format - * 如yyyy-MM-dd HH:mm:ss - * @return - */ - public static String getDateString(long milliseconds, String format) { - SimpleDateFormat sdf = new SimpleDateFormat(format); - return sdf.format(new Date(milliseconds)); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DeviceUtil.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DeviceUtil.java deleted file mode 100644 index d7ceb21..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/DeviceUtil.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.tamic.statInterface.statsdk.util; - -import android.app.Activity; -import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.net.wifi.WifiInfo; -import android.net.wifi.WifiManager; -import android.text.TextUtils; -import android.util.DisplayMetrics; -import android.view.WindowManager; - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; - - -/** - * DeviceUtil - * Created by Tamic. - */ -public class DeviceUtil { - - - /** - * getAppVersionName - */ - public static String getAppVersionName(Context context) { - String versionName = ""; - try { - // Get the package info - PackageManager pm = context.getPackageManager(); - PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); - versionName = pi.versionName; - if (TextUtils.isEmpty(versionName)) { - return ""; - } - } catch (Exception e) { - } - return versionName; - } - - /** - * getAppVersionCode - */ - public static int getAppVersionCode(Context context) { - int versionCode = 0; - try { - // Get the package info - PackageManager pm = context.getPackageManager(); - PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); - versionCode = pi.versionCode; - } catch (Exception e) { - } - return versionCode; - } - - /** - * getSdkCode - */ - public static int getSdkCode() { - - return StaticsConfig.SDK_VERSION_CODE; - } - - /** - * getSdkName - */ - public static String getSdkName() { - - return StaticsConfig.SDK_VERSION_NAME; - } - - /** - *getMacAddress - * - * @param context - * @return MAC - */ - public static String getMacAddress(Context context) { - WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - WifiInfo info = wifi.getConnectionInfo(); - return info != null ? info.getMacAddress() : ""; - } - - /** - * getScreenDisplay - * @param activity - * @return - */ - public static DisplayMetrics getScreenDisplay(Activity activity) - { - DisplayMetrics dm = new DisplayMetrics(); - activity.getWindowManager().getDefaultDisplay().getMetrics(dm); - return dm; - } - - /** - * getScreenWidth - * @param context - * @return - */ - public static int getScreenWidth(Context context) { - WindowManager wm = (WindowManager) context - .getSystemService(Context.WINDOW_SERVICE); - DisplayMetrics outMetrics = new DisplayMetrics(); - wm.getDefaultDisplay().getMetrics(outMetrics); - return outMetrics.widthPixels; - } - - /** - * getScreenHeight - * @param context - * @return - */ - public static int getScreenHeight(Context context) { - WindowManager wm = (WindowManager) context - .getSystemService(Context.WINDOW_SERVICE); - DisplayMetrics outMetrics = new DisplayMetrics(); - wm.getDefaultDisplay().getMetrics(outMetrics); - return outMetrics.heightPixels; - } - - /** - * etScreenDensity - * @param context - * @return - */ - public static float getScreenDensity(Context context) { - return context.getResources().getDisplayMetrics().density; - } - - - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/JsonUtil.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/JsonUtil.java deleted file mode 100644 index 575e0f8..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/JsonUtil.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.tamic.statInterface.statsdk.util; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.alibaba.fastjson.parser.Feature; - -import java.lang.reflect.Type; -import java.util.List; - -/** - * JsonUtil - * Created by Tamic - */ -public class JsonUtil { - - /**parseObject - * @param jsonStr - * @param entityClass - * @param - * @return - */ - public static T parseObject(String jsonStr, Class entityClass) { - T ret = null; - - try { - ret = JSON.parseObject(jsonStr, entityClass); - } catch (Exception e) { - e.printStackTrace(); - } - - return ret; - } - - public static T parseObject(String jsonStr, Type type) { - T obj = null; - try { - obj = JSON.parseObject(jsonStr, type, Feature.AutoCloseSource); - } catch (Exception e) { - e.printStackTrace(); - } - return obj; - } - - - public static T parseObject(String jsonStr, TypeReference tf) { - T obj = null; - try { - obj = JSON.parseObject(jsonStr, tf, Feature.AutoCloseSource); - } catch (Exception e) { - e.printStackTrace(); - } - return obj; - } - - /** - * parseList - * @param jsonStr - * @param entityClass - * @param - * @return - */ - public static List parseList(String jsonStr, Class entityClass) { - List ret = null; - - try { - ret = JSON.parseArray(jsonStr, entityClass); - } catch (Exception e) { - e.printStackTrace(); - } - - return ret; - } - - public static String toJSONString(Object obj) { - String ret = null; - - try { - ret = JSON.toJSONString(obj); - } catch (Exception e) { - e.printStackTrace(); - } - - return ret; - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/NetworkUtil.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/NetworkUtil.java deleted file mode 100644 index ba4d74f..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/NetworkUtil.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.tamic.statInterface.statsdk.util; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.telephony.TelephonyManager; - -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.URL; -import java.util.Enumeration; - -/** - * NetworkUtil - */ -public class NetworkUtil { - - public static int NET_CNNT_BAIDU_OK = 1; - public static int NET_CNNT_BAIDU_TIMEOUT = 2; - public static int NET_NOT_PREPARE = 3; - public static int NET_ERROR = 4; - private static int TIMEOUT = 3000; - - - /** - * isNetworkAvailable - * - * @param context - * @return - */ - public static boolean isNetworkAvailable(Context context) { - ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService( - Context.CONNECTIVITY_SERVICE); - if (null == manager) - return false; - NetworkInfo info = manager.getActiveNetworkInfo(); - if (null == info || !info.isAvailable()) - return false; - return true; - } - - /** - * getLocalIpAddress - * - * @return - */ - public static String getLocalIpAddress() { - String ret = ""; - try { - for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { - NetworkInterface intf = en.nextElement(); - for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { - InetAddress inetAddress = enumIpAddr.nextElement(); - if (!inetAddress.isLoopbackAddress()) { - ret = inetAddress.getHostAddress().toString(); - } - } - } - } catch (SocketException ex) { - ex.printStackTrace(); - } - return ret; - } - - /** - * getNetState - * - * @param context - * @return - */ - public static int getNetState(Context context) { - try { - ConnectivityManager connectivity = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - if (connectivity != null) { - NetworkInfo networkinfo = connectivity.getActiveNetworkInfo(); - if (networkinfo != null) { - if (networkinfo.isAvailable() && networkinfo.isConnected()) { - if (!connectionNetwork()) - return NET_CNNT_BAIDU_TIMEOUT; - else - return NET_CNNT_BAIDU_OK; - } else { - return NET_NOT_PREPARE; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return NET_ERROR; - } - - /** - * connectionNetwork - * - * @return - */ - static private boolean connectionNetwork() { - boolean result = false; - HttpURLConnection httpUrl = null; - try { - httpUrl = (HttpURLConnection) new URL("http://www.baidu.com") - .openConnection(); - httpUrl.setConnectTimeout(TIMEOUT); - httpUrl.connect(); - result = true; - } catch (IOException e) { - } finally { - if (null != httpUrl) { - httpUrl.disconnect(); - } - httpUrl = null; - } - return result; - } - - /** - * net is3G - * - * @param context - * @return boolean - */ - public static boolean is3G(Context context) { - ConnectivityManager connectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); - if (activeNetInfo != null - && activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) { - return true; - } - return false; - } - - /** - * net is Wifi - * - * @param context - * @return boolean - */ - public static boolean isWifi(Context context) { - ConnectivityManager connectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); - if (activeNetInfo != null - && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { - return true; - } - return false; - } - - /** - * Net is 2G - * - * @param context - * @return boolean - */ - public static boolean is2G(Context context) { - ConnectivityManager connectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); - if (activeNetInfo != null - && (activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE - || activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS || activeNetInfo - .getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA)) { - return true; - } - return false; - } - - /** - * is Wifi Enabled - */ - public static boolean isWifiEnabled(Context context) { - ConnectivityManager mgrConn = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - TelephonyManager mgrTel = (TelephonyManager) context - .getSystemService(Context.TELEPHONY_SERVICE); - return ((mgrConn.getActiveNetworkInfo() != null && mgrConn - .getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel - .getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS); - } - -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/PollUtil.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/PollUtil.java deleted file mode 100644 index b13f5a7..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/PollUtil.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.tamic.statInterface.statsdk.util; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.SystemClock; - -import com.tamic.statInterface.statsdk.core.TcUploadCoreReceiver; - - -/** - * PollUtil - * Created by Tamic. - */ -public class PollUtil { - - static TcUploadCoreReceiver receiver; - - - /**startPollingService - * @param context - * @param seconds - * @param cls - * @param action - */ - public static void startPollingService(Context context, int seconds, Class cls, String action) { - - - //获取AlarmManager系统服务 - AlarmManager manager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); - - //包装需要执行Service的Intent - Intent intent = new Intent(context, cls); - intent.setAction(action); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, - intent, PendingIntent.FLAG_UPDATE_CURRENT); - /* PendingIntent pendingIntent = PendingIntent.getService(context, 0, - intent, PendingIntent.FLAG_UPDATE_CURRENT);*/ - - long triggerAtTime = SystemClock.elapsedRealtime(); - - - manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, - seconds * 1000, pendingIntent); - } - - /** - * stopPollingService - * @param context - * @param cls - * @param action - */ - public static void stopPollingService(Context context, Class cls, String action) { - AlarmManager manager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); - Intent intent = new Intent(context, cls); - intent.setAction(action); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, - intent, PendingIntent.FLAG_UPDATE_CURRENT); - - manager.cancel(pendingIntent); - - } -} diff --git a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/StatLog.java b/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/StatLog.java deleted file mode 100644 index 43020ac..0000000 --- a/StatInterface/src/main/java/com/tamic/statInterface/statsdk/util/StatLog.java +++ /dev/null @@ -1,417 +0,0 @@ - -package com.tamic.statInterface.statsdk.util; - -import android.os.Environment; -import android.util.Log; - - -import com.tamic.statInterface.statsdk.constants.StaticsConfig; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -/** - * LOG工具类 - */ -public final class StatLog { - /** 调试总开关 */ - private static boolean sDebug = StaticsConfig.DEBUG; - /** Log TAG */ - public static final String LOG_TAG = "StatLog"; - /** DEBUG调试开关 */ - public static final boolean DEBUG_DEBUG = true; - /** E RROR调试开关 */ - public static final boolean DEBUG_ERROR = true; - /** performance调试开关 */ - public static final boolean DEBUG_PERFORMENCE = true; - /** INFO调试开关 */ - public static final boolean DEBUG_INFO = true; - /** VERBOSE调试开关 */ - public static final boolean DEBUG_VERBOSE = true; - /** WARN调试开关 */ - public static final boolean DEBUG_WARN = true; - /** EXCEPTION调试开关 */ - public static final boolean DEBUG_EXCEPT = true; - /** 输出Stream **/ - private static FileOutputStream mOutfilestream; - /*** logcat stream */ - private static FileOutputStream mLogcaOutfilestream; - /** 保存log开关 */ - private static boolean mIsLogToFile = false; - /** folder name */ - private static String mFolderName = Environment.getExternalStorageDirectory() + File.separator + "TaStatSdk" - + File.separator + "StatLog" + File.separator + "log" + File.separator; - /** log file name */ - private static String mLogFileName = mFolderName + "TamicStatStat_log.txt"; - /** 当前log */ - private static String mLogFileNameLogcat = mFolderName + "TamicStat_lasttime_log.txt"; - - /** - * LogLevel - */ - private enum LogLevel { - /** DEBUG Level */ - DEBUG, - /** ERROR Level */ - ERROR, - /** INFO Level */ - INFO, - /** VERBOSE Level */ - VERBOSE, - /** WARN Level */ - WARN - } - - /** - * Constructor - */ - private StatLog() { - } - - /** - * 设置debug开关 - * - * @param aDebug - * true打开,false关闭 - */ - public static void setDebug(boolean aDebug) { - sDebug = aDebug; - } - - /** - * @return is BuildConfig.DEBUG - */ - public static boolean isDebug(){ - return sDebug; - } - - public static void d(String aTag, String aMessage) { - if (sDebug && DEBUG_DEBUG) { - doLog(LogLevel.DEBUG, aTag, aMessage, null); - } - } - - - public static void d(String aMessage) { - if (sDebug && DEBUG_DEBUG) { - doLog(LogLevel.DEBUG, LOG_TAG, aMessage, null); - } - } - - - - public static void d(String aMessage, Throwable aThrow) { - if (sDebug && DEBUG_DEBUG) { - doLog(LogLevel.DEBUG, LOG_TAG, aMessage, aThrow); - } - } - - - public static void d(String aTag, String aMessage, Throwable aThrow) { - if (sDebug && DEBUG_DEBUG) { - doLog(LogLevel.DEBUG, aTag, aMessage, aThrow); - } - } - - public static void p(String aMessage) { - if (sDebug && DEBUG_PERFORMENCE) { - doLog(LogLevel.DEBUG, LOG_TAG, aMessage, null); - } - } - - - public static void p(String aTag, String aMessage) { - if (sDebug && DEBUG_PERFORMENCE) { - doLog(LogLevel.DEBUG, aTag, aMessage, null); - } - } - - - public static void e(String aTag, String aMessage) { - if (DEBUG_ERROR) { - doLog(LogLevel.ERROR, aTag, aMessage, null); - } - } - - - public static void e(String aMessage) { - if (DEBUG_ERROR) { - doLog(LogLevel.ERROR, LOG_TAG, aMessage, null); - } - } - - - public static void e(String aMessage, Throwable aThrow) { - if (DEBUG_ERROR) { - doLog(LogLevel.ERROR, LOG_TAG, aMessage, aThrow); - } - } - - - @SuppressWarnings("unused") - public static void i(String aTag, String aMessage) { - if (sDebug && DEBUG_INFO) { - doLog(LogLevel.INFO, aTag, aMessage, null); - } - } - - - @SuppressWarnings("unused") - public static void i(String aMessage) { - if (sDebug && DEBUG_INFO) { - doLog(LogLevel.INFO, LOG_TAG, aMessage, null); - } - } - - - @SuppressWarnings("unused") - public static void i(String aMessage, Throwable aThrow) { - if (sDebug && DEBUG_INFO) { - doLog(LogLevel.INFO, LOG_TAG, aMessage, aThrow); - } - } - - - @SuppressWarnings("unused") - public static void v(String aTAG, String aMessage) { - if (sDebug && DEBUG_VERBOSE) { - doLog(LogLevel.VERBOSE, aTAG, aMessage, null); - } - } - - - @SuppressWarnings("unused") - public static void v(String aMessage) { - if (sDebug && DEBUG_VERBOSE) { - doLog(LogLevel.VERBOSE, LOG_TAG, aMessage, null); - } - } - - - @SuppressWarnings("unused") - public static void v(String aMessage, Throwable aThrow) { - if (sDebug && DEBUG_VERBOSE) { - doLog(LogLevel.VERBOSE, LOG_TAG, aMessage, aThrow); - } - } - - - public static void w(String aMessage) { - if (sDebug && DEBUG_WARN) { - doLog(LogLevel.WARN, LOG_TAG, aMessage, null); - } - } - - - public static void w(String aTag, String aMessage) { - if (sDebug && DEBUG_WARN) { - doLog(LogLevel.WARN, aTag, aMessage, null); - } - } - - - public static void w(String aTag, String aMessage, Throwable aThrow) { - if (sDebug && DEBUG_WARN) { - doLog(LogLevel.WARN, aTag, aMessage, aThrow); - } - } - - public static void w(String aMessage, Throwable aThrow) { - if (sDebug && DEBUG_WARN) { - doLog(LogLevel.WARN, LOG_TAG, aMessage, aThrow); - } - } - - public static void printStackTrace(Exception aException) { - if (sDebug && DEBUG_EXCEPT) { - aException.printStackTrace(); - } - } - - private static void doLog(LogLevel aLevel, String aTag, String aMessage, Throwable aThrow) { - - if (aMessage == null) { - aMessage = ""; - } - - switch (aLevel) { - case DEBUG: - if (aThrow == null) { - Log.d(aTag, aMessage); - } else { - Log.d(aTag, aMessage, aThrow); - } - break; - case ERROR: - if (aThrow == null) { - Log.e(aTag, aMessage); - } else { - Log.e(aTag, aMessage, aThrow); - } - break; - case INFO: - if (aThrow == null) { - Log.i(aTag, aMessage); - } else { - Log.i(aTag, aMessage, aThrow); - } - break; - case VERBOSE: - if (aThrow == null) { - Log.v(aTag, aMessage); - } else { - Log.v(aTag, aMessage, aThrow); - } - break; - case WARN: - if (aThrow == null) { - Log.w(aTag, aMessage); - } else { - Log.w(aTag, aMessage, aThrow); - } - break; - default: - break; - } - - if (mIsLogToFile) { - flushToFile(aTag, aMessage); - } - - } - - - public static void dumpLogcat() { - - BufferedReader localBufferedReader = null; - try { - - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - return; - } - - File folder = new File(mFolderName); - - if (!folder.exists()) { - folder.mkdirs(); - // myFile.createNewFile(); - } - - if (null == mLogcaOutfilestream) { - mLogcaOutfilestream = new FileOutputStream(mLogFileNameLogcat); - } - - Process localProcess = Runtime.getRuntime().exec("logcat -v time -d"); - InputStream localInputStream = localProcess.getInputStream(); - InputStreamReader localInputStreamReader = new InputStreamReader(localInputStream); - localBufferedReader = new BufferedReader(localInputStreamReader); - - for (String str1 = localBufferedReader.readLine(); str1 != null; str1 = localBufferedReader - .readLine()) { - mLogcaOutfilestream.write(str1.getBytes("UTF-8")); - mLogcaOutfilestream.write("\n".getBytes()); - - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (localBufferedReader != null) { - localBufferedReader.close(); - } - if (mLogcaOutfilestream != null) { - mLogcaOutfilestream.close(); - mLogcaOutfilestream = null; - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - } - - - private static void flushToFile(String aTag, String aMessage) { - - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - return; - } - - try { - - File folder = new File(mFolderName); - - if (!folder.exists()) { - folder.mkdirs(); - // myFile.createNewFile(); - } - - if (null == mOutfilestream) { - mOutfilestream = new FileOutputStream(mLogFileName); - } - String output = aTag + " : " + aMessage; - mOutfilestream.write(output.getBytes("UTF-8")); - mOutfilestream.write("\n".getBytes()); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - public static void setWriteToFile(boolean bWritetoFile) { - mIsLogToFile = bWritetoFile; - } - - - public static void logException(String aTag, Exception aException) { - try { - if (null == aException) { - return; - } - - if (sDebug) { - aException.printStackTrace(); - } - - StatLog.d(aTag, "========================= Exception Happened !!================================"); - - StatLog.d(aTag, aException.getMessage()); - StackTraceElement[] stack = aException.getStackTrace(); - // if (null == stack) { //FindBugs - // return; - // } - for (int i = 0; i < stack.length; i++) { - StatLog.d(aTag, stack[i].toString()); - - } - - StatLog.d(aTag, "========================= Exception Ended !!================================"); - - } catch (Exception ex) { - ex.printStackTrace(); - } - - } - - - public static void printInvokeTrace(String aTag) { - StackTraceElement[] stackTrace = (new Throwable()).getStackTrace(); - for (int i = 1; i < stackTrace.length; i++) { - StatLog.d(aTag + ": " + stackTrace[i].toString()); - } - } - - - public static void printInvokeTrace(String aTag, int aMax) { - StackTraceElement[] stackTrace = (new Throwable()).getStackTrace(); - int n = Math.min(aMax, stackTrace.length); - for (int i = 1; i < n; i++) { - StatLog.d(aTag + ": " + stackTrace[i].toString()); - } - } - -} diff --git a/StatInterface/src/main/res/values/strings.xml b/StatInterface/src/main/res/values/strings.xml deleted file mode 100644 index efe4a3a..0000000 --- a/StatInterface/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - statLibrary - From 2a639922653349aa62d3e4c0057b35f5c67ca276 Mon Sep 17 00:00:00 2001 From: liuyongkui Date: Fri, 10 Mar 2017 16:55:33 +0800 Subject: [PATCH 13/24] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9v2.1=E7=9A=84?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/tamic/statsdkdemo/MainActivity.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tamic/statsdkdemo/MainActivity.java b/app/src/main/java/com/tamic/statsdkdemo/MainActivity.java index 36be676..6db90f4 100644 --- a/app/src/main/java/com/tamic/statsdkdemo/MainActivity.java +++ b/app/src/main/java/com/tamic/statsdkdemo/MainActivity.java @@ -6,6 +6,8 @@ import com.tamic.statInterface.statsdk.core.TcStatInterface; +import java.util.HashMap; + public class MainActivity extends BaseActivity { @@ -29,7 +31,11 @@ public void onClick(View v) { public void onClick(View v) { // test - TcStatInterface.onEventParameter("onclick", "open next"); + HashMap map = new HashMap(); + map.put("id1", "xxx"); + map.put("id2", "yyyy"); + + TcStatInterface.onEvent("open next", map); Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); From 376eaacfa93753ec7434d2c7f3d1f42a7ba994cf Mon Sep 17 00:00:00 2001 From: liuyongkui Date: Fri, 10 Mar 2017 16:56:05 +0800 Subject: [PATCH 14/24] =?UTF-8?q?=E4=BE=9D=E8=B5=96=E8=BF=9C=E7=A8=8Bmaven?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +-- settings.gradle | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a6a933d..613a549 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,7 @@ release { } } - dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile project(':StatInterface') + compile 'com.tamic:StatInterface:2.1' } diff --git a/settings.gradle b/settings.gradle index a85f5f3..e7b4def 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' ,':StatInterface' +include ':app' From f5970fd8e672167ae7a271360564b9c7b5cb68c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 17:18:29 +0800 Subject: [PATCH 15/24] Update README.md --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 723ec1c..f46bdf6 100644 --- a/README.md +++ b/README.md @@ -126,52 +126,71 @@ Module: 5.3 加入权限 见2.1的说明。 + 5.4 初始化 - Application的onCreate(): + Application的onCreate(): - // assets + // assets String fileName = "stat_id.json"; String url = "http://www.baidu.com"; + // init statSdk TcStatInterface.initialize(this, appId, "you app chanel", fileName); // set upload url TcStatInterface.setUrl(url); - 见2.3说明 具体见demo - - 5.5 其他 - - 如果你还在用Eclispe,直接用源码或者依赖jar - - TcStatSdk_2.0.jar - - 5.6 调用 +   见Wiki说明 参见demo + + 5.5 AppAction + 此统计包含是三个类型 + +1. App启动 + + + TcStatInterface.recordAppStart(); + +2. App退出 + + + TcStatInterface.recordAppEnd(); + +3. APP唤醒 + + 无需开发者上层使用,sdk会自动打点记录 + + + + + 5.6 事件统计 +   记录某个动作,并包含事件参数时, - findViewById(R.id.id_button).setOnClickListener(new View.OnClickListener() { + + findViewById(R.id.id_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TcStatInterface.onEvent("main", "onlick", "send data"); - //发送数据 + //reportData TcStatInterface.reportData(); } }); + findViewById(R.id.id_button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - // 测试 - HashMap map = new HashMap(); + // test + HashMap(); map.put("id1", "xxx"); map.put("id2", "yyyy"); - TcStatInterface.onEvent("main", map); + TcStatInterface.onEvent("openNext", map); Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); @@ -179,6 +198,29 @@ Module: } }); + + + +  5.7 Activity统计 + + +  统计activity启动时间,从哪个地方跳过来,业务开发者可以自己写一个base,让其他activity继承Base就行,就可完成自动搜集功能 +         + + public class BaseActivity extends Activity { + + @override + protected void onResume() { + super.onResume(); + //可以直接传this + PaStatInterface.recordPageStart(“ID”); + } + + protected void onPause() { + super.onPause(); + PaStatInterface.recordPageEnd(); + } + } 注意 -- From 97d69b45f3e99c831f5e5b35151fd5d584d2ba37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 17:23:00 +0800 Subject: [PATCH 16/24] Update README.md --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f46bdf6..b86b061 100644 --- a/README.md +++ b/README.md @@ -110,17 +110,16 @@ API说明 root: repositories { - maven { url "https://jitpack.io" } - jcenter() + maven { url "https://jitpack.io" } + jcenter() } Module: - dependencies { - ..... -       compile 'com.tamic:StatInterface:2.1' + dependencies { + compile 'com.tamic:StatInterface:2.1' - } + } 5.3 加入权限 @@ -150,12 +149,12 @@ Module: 1. App启动 - TcStatInterface.recordAppStart(); + TcStatInterface.recordAppStart(); 2. App退出 - TcStatInterface.recordAppEnd(); + TcStatInterface.recordAppEnd(); 3. APP唤醒 From a2780c57ca80f7b8a89cc75a342980833d672384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 17:27:52 +0800 Subject: [PATCH 17/24] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b86b061..cdcbb33 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ Module:   记录某个动作,并包含事件参数时, - + ``` findViewById(R.id.id_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -197,6 +197,7 @@ Module: } }); + ``` @@ -205,21 +206,23 @@ Module:  统计activity启动时间,从哪个地方跳过来,业务开发者可以自己写一个base,让其他activity继承Base就行,就可完成自动搜集功能         - + ``` public class BaseActivity extends Activity { @override protected void onResume() { super.onResume(); //可以直接传this - PaStatInterface.recordPageStart(“ID”); + TcStatInterface.recordPageStart(“ID”); } protected void onPause() { super.onPause(); - PaStatInterface.recordPageEnd(); + TcStatInterface.recordPageEnd(); } } + + ``` 注意 -- From 4cc9b2d6d7ca2e80ddb8127ed236ca067d197d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 17:33:08 +0800 Subject: [PATCH 18/24] Update README.md --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index cdcbb33..c9e402e 100644 --- a/README.md +++ b/README.md @@ -93,14 +93,15 @@ APP常规数据统计 - -API说明 +## API说明 -- 4.1. API细节 - 请具体看demo 注释 + + 请具体看demo 注释 + -5. 集成步骤 +## 集成步骤 5.1 依赖项目 @@ -122,11 +123,11 @@ Module: } - 5.3 加入权限 +5.3 加入权限 见2.1的说明。 - 5.4 初始化 +5.4 初始化 Application的onCreate(): @@ -142,7 +143,7 @@ Module:   见Wiki说明 参见demo - 5.5 AppAction +5.5 AppAction 此统计包含是三个类型 @@ -163,7 +164,7 @@ Module: - 5.6 事件统计 +5.6 事件统计   记录某个动作,并包含事件参数时, @@ -201,7 +202,7 @@ Module: -  5.7 Activity统计 +5.7 Activity统计  统计activity启动时间,从哪个地方跳过来,业务开发者可以自己写一个base,让其他activity继承Base就行,就可完成自动搜集功能 From 1ca28a7efe7e025f625f9bf824ba2e345b5e6ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Fri, 10 Mar 2017 17:49:47 +0800 Subject: [PATCH 19/24] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c9e402e..56e6d11 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ Module:   记录某个动作,并包含事件参数时, - ``` + findViewById(R.id.id_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -186,9 +186,9 @@ Module: public void onClick(View v) { // test - HashMap(); + HashMap map = new HashMap<>(); map.put("id1", "xxx"); - map.put("id2", "yyyy"); + map.put("id2", "yyy"); TcStatInterface.onEvent("openNext", map); @@ -198,7 +198,7 @@ Module: } }); - ``` + @@ -223,7 +223,7 @@ Module: } } - ``` + 注意 -- From a46c427257a2dfb663467cf96e849fbfc868ecc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Mon, 13 Mar 2017 19:28:05 +0800 Subject: [PATCH 20/24] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 56e6d11..d2fc88b 100644 --- a/README.md +++ b/README.md @@ -229,10 +229,10 @@ Module: -- 目前服务端代码需要你自我实现,数据结结构按客户端数据Model实现即可。收到数据落地到数据库,需要查看的时候即可查看,如果后端有可视化界面,那么更好不过。 - - - - + +  客户端:搜集,存储,上报。 +  服务端:接受数据,落地数据库,最后做大数据处理。 + > 作者: >  FramWork [@Tamic](https://github.com/Jianglei0716) : http://www.jianshu.com/p/cd83e81b78aa From 26a415d42a0dd2f088cebe339aeb8281727fa725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Mon, 13 Mar 2017 19:29:57 +0800 Subject: [PATCH 21/24] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index d2fc88b..709a088 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,17 @@ 自定义统计SDK, 完全放弃第三方平台,让app拥有自主的数据统计功能 >支持Activity统计 + >自定义事件统计 + >APP启动退出唤醒自动统计 + >crsah日志统计 + 客户端SDK功能概述 ------- 在使用统计服务前,开发者先要拿到本身APPID。其中AppId是客户端的身份标识,在客户端SDK初始化时使用。然后下载最新Library的SDK压缩包,其中包括了Android SDK和AndroidDemo。Android版SDK以Module形式提供, 你的APP只需要添加少量代码和配置,即可完成接入TcInterface统计服务。 From 1524c43f4b496e24133f5642b85de3a388c51866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Mon, 13 Mar 2017 19:31:03 +0800 Subject: [PATCH 22/24] Update README.md --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 709a088..58ea830 100644 --- a/README.md +++ b/README.md @@ -211,21 +211,21 @@ Module:  统计activity启动时间,从哪个地方跳过来,业务开发者可以自己写一个base,让其他activity继承Base就行,就可完成自动搜集功能         - ``` - public class BaseActivity extends Activity { - @override - protected void onResume() { - super.onResume(); - //可以直接传this - TcStatInterface.recordPageStart(“ID”); - } + public class BaseActivity extends Activity { + + @override + protected void onResume() { + super.onResume(); + //可以直接传this + TcStatInterface.recordPageStart(“ID”); + } - protected void onPause() { - super.onPause(); - TcStatInterface.recordPageEnd(); + protected void onPause() { + super.onPause(); + TcStatInterface.recordPageEnd(); + } } - } From db202cd15d1adf978a5b7a4b1e9507f61b993d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tamic=20=28=E7=A0=81=E5=B0=8F=E7=99=BD=29?= <719887916@qq.com> Date: Mon, 13 Mar 2017 19:37:33 +0800 Subject: [PATCH 23/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 58ea830..2d20b8b 100644 --- a/README.md +++ b/README.md @@ -22,13 +22,13 @@ SDK所有的接口都封装在TcStatInterface抽象类的静态方法中,主要功能接口请参考第3节API说明。应用在启动时,需要调用initialize方法来初始化统计服务,之后便可按照统计的业务需求,调用统计数据上报接口上报统计打点。 SDK提供了接口给开发者来设置向统计统计服务器上报统计数据的策略,开发者可以在任意时候调用修改策略。客户端SDK上报的数据包括默认事件统计、应用全局(AppAction)统计(用于统计app的唤醒、打开关闭频率、使用时长等)、页面访问统计(Page)和自定义事件统计(Event)。 -统计SDK提供app的崩溃日志收集功能(统计SDK2.0 将会新增)。功能开启后,对于app在使用过程中的崩溃,SDK将自动采集崩溃日志,并上传到统计后台;统计后台会根据app版本,对崩溃进行聚合、展示。开发者可以根据app实际情况情况,将该崩溃标记成已处理或者忽略状态。 +统计SDK提供app的崩溃日志收集功能(统计SDK2.0 将会新增)。功能开启后,对于app在使用过程中的崩溃,SDK将自动采集崩溃日志,并上传到统计后台;统计后台会根据app版本,对崩溃进行聚合、展示。 SDK使用配置 ---- -本节主要介绍使用好房统计SDK前的准备工作,开发者也可以参照SDK中的demo来配置。 +本节主要介绍使用统计SDK前的准备工作,开发者也可以参照SDK中的demo来配置。 2.1. 配置AndroidManifest.xml文件 SDK支持的最低安卓版本为2.2。 From fb6f32d100a3614e4b5cd28ce3c4fa8c3d4db60c Mon Sep 17 00:00:00 2001 From: liuyongkui Date: Wed, 21 Jun 2017 09:30:01 +0800 Subject: [PATCH 24/24] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tamic/statsdkdemo/imp/StaticsImpl.java | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 app/src/main/java/com/tamic/statsdkdemo/imp/StaticsImpl.java diff --git a/app/src/main/java/com/tamic/statsdkdemo/imp/StaticsImpl.java b/app/src/main/java/com/tamic/statsdkdemo/imp/StaticsImpl.java deleted file mode 100644 index 5ddf6a0..0000000 --- a/app/src/main/java/com/tamic/statsdkdemo/imp/StaticsImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tamic.statsdkdemo.imp; - -import android.content.Context; - -import com.alibaba.fastjson.JSON; -import com.tamic.statInterface.statsdk.core.StaticsListener; - -import java.io.InputStream; -import java.util.HashMap; - -import cz.msebera.android.httpclient.util.EncodingUtils; - -/** - * Created by Tmaic on 2016-04-13. - */ -public class StaticsImpl implements StaticsListener { - - - - String json; - - private Context context; - - - public StaticsImpl(Context context) { - this.context = context; - } - - @Override - public HashMap getStatIdMaps() { - - - HashMap map = null; - if (getFromAsset("stat_id.json") != null) { - map = (HashMap) JSON.parseObject(getFromAsset("stat_id.json"), HashMap.class); - } - return map; - } - - public String getFromAsset(String fileName){ - String result=""; - try{ - InputStream in = context.getResources().getAssets().open(fileName); - int length = in.available(); - byte [] buffer = new byte[length]; - in.read(buffer); - result = EncodingUtils.getString(buffer, "UTF-8"); - } - catch(Exception e){ - e.printStackTrace(); - } - return result; - } - -}