diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11cd89e --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.gradle/2.10/tasks/** +app/build/generated/** +app/build/intermediates/** +build/** +.idea/misc.xml +.idea/workspace.xml +.idea/libraries/pinyin4j_2_5_0.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..3de6aa8 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +holysongs-android \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..508b3d9 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/animated_vector_drawable_24_1_1.xml b/.idea/libraries/animated_vector_drawable_24_1_1.xml new file mode 100644 index 0000000..9af8a29 --- /dev/null +++ b/.idea/libraries/animated_vector_drawable_24_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/appcompat_v7_24_1_1.xml b/.idea/libraries/appcompat_v7_24_1_1.xml new file mode 100644 index 0000000..a29ceb3 --- /dev/null +++ b/.idea/libraries/appcompat_v7_24_1_1.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/design_24_1_1.xml b/.idea/libraries/design_24_1_1.xml new file mode 100644 index 0000000..6f3adaa --- /dev/null +++ b/.idea/libraries/design_24_1_1.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/firebase_analytics_9_2_0.xml b/.idea/libraries/firebase_analytics_9_2_0.xml new file mode 100644 index 0000000..1247e7a --- /dev/null +++ b/.idea/libraries/firebase_analytics_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/firebase_analytics_impl_9_2_0.xml b/.idea/libraries/firebase_analytics_impl_9_2_0.xml new file mode 100644 index 0000000..6e0d7e2 --- /dev/null +++ b/.idea/libraries/firebase_analytics_impl_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/firebase_common_9_2_0.xml b/.idea/libraries/firebase_common_9_2_0.xml new file mode 100644 index 0000000..317d346 --- /dev/null +++ b/.idea/libraries/firebase_common_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/firebase_core_9_2_0.xml b/.idea/libraries/firebase_core_9_2_0.xml new file mode 100644 index 0000000..05cfb03 --- /dev/null +++ b/.idea/libraries/firebase_core_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/firebase_iid_9_2_0.xml b/.idea/libraries/firebase_iid_9_2_0.xml new file mode 100644 index 0000000..03078b0 --- /dev/null +++ b/.idea/libraries/firebase_iid_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/org_apache_http_legacy.xml b/.idea/libraries/org_apache_http_legacy.xml new file mode 100644 index 0000000..8a24684 --- /dev/null +++ b/.idea/libraries/org_apache_http_legacy.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/play_services_analytics_9_2_0.xml b/.idea/libraries/play_services_analytics_9_2_0.xml new file mode 100644 index 0000000..c6e4b62 --- /dev/null +++ b/.idea/libraries/play_services_analytics_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/play_services_analytics_impl_9_2_0.xml b/.idea/libraries/play_services_analytics_impl_9_2_0.xml new file mode 100644 index 0000000..cf0ceda --- /dev/null +++ b/.idea/libraries/play_services_analytics_impl_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/play_services_base_9_2_0.xml b/.idea/libraries/play_services_base_9_2_0.xml new file mode 100644 index 0000000..8ec9e71 --- /dev/null +++ b/.idea/libraries/play_services_base_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/play_services_basement_9_2_0.xml b/.idea/libraries/play_services_basement_9_2_0.xml new file mode 100644 index 0000000..0aec068 --- /dev/null +++ b/.idea/libraries/play_services_basement_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/play_services_tasks_9_2_0.xml b/.idea/libraries/play_services_tasks_9_2_0.xml new file mode 100644 index 0000000..e7d0a1b --- /dev/null +++ b/.idea/libraries/play_services_tasks_9_2_0.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/quickblox_android_sdk_chat_2_2_6.xml b/.idea/libraries/quickblox_android_sdk_chat_2_2_6.xml new file mode 100644 index 0000000..8572d57 --- /dev/null +++ b/.idea/libraries/quickblox_android_sdk_chat_2_2_6.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/quickblox_android_sdk_core_2_2_6.xml b/.idea/libraries/quickblox_android_sdk_core_2_2_6.xml new file mode 100644 index 0000000..42ac33e --- /dev/null +++ b/.idea/libraries/quickblox_android_sdk_core_2_2_6.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/quickblox_android_sdk_messages_2_2_6.xml b/.idea/libraries/quickblox_android_sdk_messages_2_2_6.xml new file mode 100644 index 0000000..a6b70fb --- /dev/null +++ b/.idea/libraries/quickblox_android_sdk_messages_2_2_6.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/recyclerview_v7_24_1_1.xml b/.idea/libraries/recyclerview_v7_24_1_1.xml new file mode 100644 index 0000000..f38c199 --- /dev/null +++ b/.idea/libraries/recyclerview_v7_24_1_1.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/support_annotations_24_1_1.xml b/.idea/libraries/support_annotations_24_1_1.xml new file mode 100644 index 0000000..53f4232 --- /dev/null +++ b/.idea/libraries/support_annotations_24_1_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/support_v4_24_1_1.xml b/.idea/libraries/support_v4_24_1_1.xml new file mode 100644 index 0000000..e3d1574 --- /dev/null +++ b/.idea/libraries/support_v4_24_1_1.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/support_vector_drawable_24_1_1.xml b/.idea/libraries/support_vector_drawable_24_1_1.xml new file mode 100644 index 0000000..9a7fe3d --- /dev/null +++ b/.idea/libraries/support_vector_drawable_24_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..bbe1787 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..2dcd119 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 24 + buildToolsVersion "24.0.1" + + defaultConfig { + applicationId "com.goodtrendltd.HolySongs" + minSdkVersion 14 + targetSdkVersion 24 + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } +} + +dependencies { + + compile 'com.android.support:design:24.1.1' + compile 'com.google.android.gms:play-services-analytics:9.2.0' + compile files('libs/org.apache.http.legacy.jar') + compile files('libs/pinyin4j-2.5.0.jar') + compile files('libs/quickblox-android-sdk-core-2.2.6.jar') + compile files('libs/quickblox-android-sdk-messages-2.2.6.jar') + compile files('libs/quickblox-android-sdk-chat-2.2.6.jar') +} + +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..33110ff --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,38 @@ +{ + "project_info": { + "project_number": "892329193685", + "project_id": "firebase-holysongs" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:892329193685:android:a985addaee847fa7", + "android_client_info": { + "package_name": "com.goodtrendltd.HolySongs" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCTTKiU9Nv57_lFUL5rTCa0hnAmQoGAhEc" + } + ], + "services": { + "analytics_service": { + "status": 2, + "analytics_property": { + "tracking_id": "UA-66336761-5" + } + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 1 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/libs/org.apache.http.legacy.jar b/app/libs/org.apache.http.legacy.jar new file mode 100644 index 0000000..5b89fbd Binary files /dev/null and b/app/libs/org.apache.http.legacy.jar differ diff --git a/app/libs/pinyin4j-2.5.0.jar b/app/libs/pinyin4j-2.5.0.jar new file mode 100644 index 0000000..e8ede13 Binary files /dev/null and b/app/libs/pinyin4j-2.5.0.jar differ diff --git a/app/libs/quickblox-android-sdk-chat-2.2.6.jar b/app/libs/quickblox-android-sdk-chat-2.2.6.jar new file mode 100644 index 0000000..34c1f5b Binary files /dev/null and b/app/libs/quickblox-android-sdk-chat-2.2.6.jar differ diff --git a/app/libs/quickblox-android-sdk-core-2.2.6.jar b/app/libs/quickblox-android-sdk-core-2.2.6.jar new file mode 100644 index 0000000..a42f478 Binary files /dev/null and b/app/libs/quickblox-android-sdk-core-2.2.6.jar differ diff --git a/app/libs/quickblox-android-sdk-messages-2.2.6.jar b/app/libs/quickblox-android-sdk-messages-2.2.6.jar new file mode 100644 index 0000000..ba58ab9 Binary files /dev/null and b/app/libs/quickblox-android-sdk-messages-2.2.6.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6a0b97b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/songs.xml b/app/src/main/assets/songs.xml new file mode 100644 index 0000000..61dc1a0 --- /dev/null +++ b/app/src/main/assets/songs.xml @@ -0,0 +1,6123 @@ + + + 云上太阳 + + 无论是住在美丽的高山,或是躺卧在阴暗的幽谷, + 当你抬起头,你将会发现,主已为你我而预备。 + 云上太阳它总不改变,虽然小雨洒在脸上, + 云上太阳它总不改变,阿哈……它不改变。 + + + + 奇异恩典 + + 奇异恩典,何等甘甜,我罪已得赦免; + 前我失丧,今被寻回,瞎眼今得看见。 + 如此恩典,使我敬畏,使我心的安慰; + 初信之时,即蒙恩惠,真是何等宝贵。 + 许多危险,试炼网罗,我已安然经过, + 靠主恩典,安全不怕,更引导我归家。 + 将来喜年,圣徒欢聚,恩光爱谊千年, + 喜乐颂赞,在父座前,深望那日快现。 + + + + 寻找 + + 我曾经像一只小小飞鸟,飞跃在这蓝天海上, + 我无时无刻彷徨无助,找不到可以倾诉。 + 我曾经像一只小小飞鸟,穿梭在这城市之中, + 我正在寻找那慈爱双手,那就是主耶稣。 + 主啊,我要回到你身旁,我要回到你身旁, + 那慈爱双手正等着我,来拥抱我。 + 主啊我要回到你身旁,我要回到你身旁, + 那慈爱双手来拥抱我,那就是主耶稣。 + + + + 爱的真谛 + + 爱是恒久忍耐,又有恩慈,爱是不嫉妒; + 爱是不自夸、不张狂,不作害羞的事, + 不求自己的益处,不轻易发怒, + 不计算人家的恶,不喜欢不义只喜欢真理。 + 凡事包容,凡事相信,凡事盼望, + 凡事忍耐,凡事要忍耐,爱是永不止息。 + + + + 全然向你 + + 赞美的旋律响起,我的心全然向你, + 当圣灵的恩膏满溢,我的灵不再封闭, + 赞美的清泉如春雨沐浴,我心中的喜乐川流不息。 + 赞美的音符如雪花飘逸,心中的暖流冉冉升起。 + 我要开口向你赞美称谢, + 永永远远赞美不停,永永远远称谢不已。 + 我要欣然向你献上自己, + 一生一世献上自己,一生一世脚步不离。 + + + + 当圣灵在我的心 + + 当圣灵在我的心 我要歌颂主,像当年的大卫王(2遍) + 我要唱,我要唱,像当年的大卫王(2遍) + 2. 拍拍手 3. 来跳舞 4. 赞美主 + + + + 主我愿单属你 + + 我的主,我心爱你,我的主,我渴慕你, + 愿你爱来吸引我,使我心单单爱你。 + 哦 耶稣,我需要你,炼净我,完全属你, + 愿你爱来摸着我,使我心全然属你。 + + + + 信靠耶和华 + + 信靠主耶和华的人好像锡鞍山, + 永不动摇、永不动摇,哈利路亚。 + 众山围绕耶路撒冷主也围绕你, + 直到永远、直到永远,哈利路亚。 + 主耶和华善待义人平安归给他, + 荣耀归主、荣耀归主,哈利路亚。 + + + + 和散那 + + 和散那、和散那,和散那归于至高 神, + 和散那、和散那,和散那归于至高 神, + 我们齐声赞美,你至圣尊名, + 权柄尊荣归主我神,和散那归于至高神, + 荣耀、荣耀,愿荣耀归万王之王, + 荣耀、荣耀,愿荣耀归万王之王, + 我们齐声赞美,你至圣尊名, + 权柄尊荣归主我神,愿荣耀归万王之王。 + + + + 耶和华,是爱 + + 耶和华是爱,让我安歇青草溪水边, + 神令我省察心中的幽暗共度每一天。 + 耶和华是爱,在困境中他保守引领, + 神为我摆设丰盛的恩典,再危难也不改变。 + 在世间主恩与共,他的爱常在我身边, + 神为我施恩惠、保守勉励共同度此生。 + 耶和华是爱,让我安歇青草溪水边, + 无限满足快乐涌自心田,再危难也不改变。 + + + + 耶和华,你是我的神 + + 耶和华你是我的神,我要时时称颂你的名, + 你是我的盾牌,是我的荣耀,又是叫我抬起头的神。 + 纵然仇敌围绕攻击我,在你怀中必不怕遭害, + 你是我的 神,我所依靠的,你同在使我全然得胜。 + + + + 神是爱 + + 神是爱,打开你的心高声扬。 + 神是爱,把他告诉各地方。 + 他创造天空和那深海洋。他创造飞鸟和那蜜蜂忙。 + 他造一切为你和我,因 神是爱! + 神是爱,空气中我能体会,恩典中我能体会, + 随时我都能体会,从最深的海洋到那最高高的山。 + 万物都告诉我,神是爱! + + + + 把冷漠变成爱 + + 你的眼 是否被太多美丽的事物迷惑, + 你的心 是否被太多纷杂的世俗绑锁, + 分些关怀 给角落中受伤的灵魂, + 分些爱 给那些不起眼的面孔。 + 以基督的心为心,以他的眼看世界, + 你身边的人需要你我把冷漠变成爱。 + 以基督的心为心,以他的眼看世界, + 这世界需要你我把冷漠变成爱。 + + + + 我需要有你在我生命中 + + 哦主,求你保守我的心我的意念, + 使我能够遵行你旨意,我愿将你话语深藏在我心, + 做路上的光,成为我脚前的灯。 + 哦主,求你坚固我信心我的力量, + 使我得以勇敢向前行,因我知道有时我仍会软弱, + 求你带领我,使我不会再退缩 + 我需要有你在我生命中,好让我一生能学你的样式, + 使我能成为你所喜悦的儿女, + 使我的生命能够彰显你荣耀。 + + + + 爱 我愿意 + + 十字架上的光芒,温柔又慈祥, + 带着主爱的力量,向着我照亮, + 我的心不再隐藏,完全的摆上, + 愿主爱来浇灌我,在爱中得自由释放。 + 我愿意降服,我愿意降服, + 在你爱的怀抱中,我愿意降服。 + 你是我的主,你是我的主, + 永远在你怀抱中,你是我…你是我的主。 + + + + 宣教的中国 + + 有一种爱像那夏虫永长鸣,春蚕吐丝吐不尽。 + 有一个声音催促,我要勇敢前行, + 圣灵在前引导我的心。 + 迈开步伐向耶路撒冷,风霜雪雨,意志更坚定, + 我要传扬,传扬主的名,誓要得胜在神的国度里。 + 我带着使命向前走,要唤醒沉睡的中国, + 纵然流血的时候,我也永远不回头。 + 我带着异像向前走,要看到宣教的中国, + 将福音传遍世界每个角落。 + + + + 万王之王 万主之主 + + 万王之王,万主之主,荣耀 哈利路亚*2 + 耶稣 平安的王 荣耀 哈利路亚*2 + + + + 我的神,我要敬拜你 + + 我的神我要敬拜你,我的心深深地爱你 + 在你的座前,我思想你恩典,我的心赞美敬拜你。 + 你是我心灵的满足,你是我唯一的喜乐, + 在你的座前,我思想你恩典,我的神我要敬拜你。 + + + + 主你是我最知心的朋友 + + 主你是我最知心的朋友,主你是我最亲爱的伴侣。 + 我的心在天天追想着你,渴望见到你的面。 + 在我人生的每一个台阶,在我人生的每一个小站, + 你的手总是在挽拉着我,把我带在你身边。 + 告诉我当走的路,没有滑向死亡线, + 你爱何等的长阔高深,我心发出惊叹, + 有了主还要什么,我心与主心相连, + 我已起誓要跟随主,永不改变。 + + + + 你的恩典 + + 你的恩典每天够我用,纵有困难也不会逃避, + 有你与我一起,我还惧怕什么, + 赐我勇气去改变自己。 + 啊 啊 耶稣 耶稣 耶稣, + 奉献一生皆因最爱是你, + 为了你,我愿将一切抛弃,耶稣 为要得着你, + (尾声)我已决定,我一生最爱是你。 + + + + 除你以外 + + 除你以外,在天上我还能有谁, + 除你以外,在地上我别无眷恋, + 除你以外,有谁能擦干我眼泪, + 除你以外,有谁能带给我安慰, + 虽然我的肉体和我的心肠,渐渐地衰退, + 但是神是我心里的力量,是我的福分直到永远。 + + + + 我的心,你要称颂耶和华 + + 我的心,你要称颂耶和华,不可忘记他的恩惠。 + 他赦免你一切过犯罪孽,医治你疾病复原。 + 我的心,你要称颂耶和华,不可忘记他的恩惠。 + 他以仁爱慈悲为你冠冕,为受屈的人伸冤 + 天离地有何等的高,他的慈爱也何等的深, + 东离西有多么的远,他使我的过犯也离我多远。 + 耶和华有怜悯的爱,且有丰盛无尽的恩典, + 从亘古直到永远,耶和华,他是我的神。 + + + + 你若快乐 + + 你若快乐,你就拍拍手(2遍) + 你若快乐你知道,生命自然会流露, + 你若快乐你就拍拍手。 + *跺跺脚 *拍拍头 *转个圈 *哈哈笑 + + + + 耶稣你是宝贵 + + 耶稣你是宝贵,你对我真宝贵, + 你流宝血洗净我,你爱使我自由, + 我只想天天来赞美你,我只想要彰显你的名。 + 主啊我爱你 我要更爱你。 + 我只想一生来侍奉你,我只想要荣耀你的名。 + 主啊我爱你 我要更爱你。 + + + + 有一双手 + + 曾有一双手让盲者复明,生命见光,焕然一新。 + 他奇妙的手曾抚慰着我领我走向光明。 + 奇妙的恩典让我又得着美好的新生命。 + 我永远歌颂,我永远赞美,你那奇妙的双手, + 哦 主 你那奇妙的双手,哦 主 你那慈爱的双手。* + + + + 全新的你 + + 你说阴天代表你的心情,雨天更是你对生命的反应, + 你说每天生活一样平静,对于未来没有一点信心, + 亲爱朋友你是否曾经,曾经观看满天的星星, + 期待有人能够了解你心,能够爱你赐你力量更新。 + *耶稣能够将一切都更新,耶稣能够体会你的心情。 + 耶稣能够改变你的曾经,耶稣爱你,耶稣疼你, + 耶稣能够造一个全新的你!* + + + + 有一位神 + + 有一位神,有权能创造宇宙万物, + 也有温柔双手安慰受伤灵魂。 + 1 有一位神,有权柄审判一切罪恶, + 也有慈悲体贴人的软弱, + 2 有一位神,他坐在荣耀的宝座, + 却死在十架挽救人堕落, + 有一位神,我们的神,唯一的神,名叫耶和华, + 有权威荣光,有恩典慈爱,是昔在今在永在的神! + + + + 赐我自由 + + 赐我自由的灵阿求你来,来到我的里面,来到我的生活。 + 赶走生活中的愁烦,驱走我心中的不安。 + 你的灵阿,在哪里,哪里就有自由, + 世界虽有劳苦重担,求你灵来赐我自由。 + + + + 耶稣会释放你 + + 我们在此站立在主前,有人软弱,有人刚强, + 让我们一起向主来歌唱,接受完全的爱。 + 我们在此站立在主前,无论流泪或是喜乐, + 有一个地方有慈爱和力量,我们到他里面。 + 哦就是耶稣!耶稣!他会释放我! + 哦就是耶稣,耶稣!使我得胜利! + + + + 不一样的天空 + + 亲爱的朋友,你可曾知道, + 有一片天空,有着不一样的笑容; + 亲爱的朋友,你可曾知道, + 有一道彩虹,写着那永恒的约定。 + 不一样的天空,不一样的笑容, + 不再有劳苦愁烦,不再有罪孽牵绊, + 不一样的天空,不一样的彩虹, + 充满着生命的应许, + 将无限的爱从十字架洒落。 + + + + 进入主的同在 + + 亲爱的朋友,你可曾知道, + 有一片天空,有着不一样的笑容; + 亲爱的朋友,你可曾知道, + 有一道彩虹,写着那永恒的约定。 + 不一样的天空,不一样的笑容, + 不再有劳苦愁烦,不再有罪孽牵绊, + 不一样的天空,不一样的彩虹, + 充满着生命的应许, + 将无限的爱从十字架洒落。 + + + + 我一生要赞美你 + + 高唱主我爱你,高举我双手来赞美你, + 我的心充满欢喜,我要歌唱来颂扬你, + 高唱哈利路亚,我的心充满欢欣, + 高唱主我爱你,我一生要赞美你。 + + + + 我以祷告来到你跟前 + + 我以祷告来到你跟前,我要寻求你。 + 我要站在破口之中,在那里我寻求你。1 to * + 主我是软弱及无助,你却是我的力量, + 以你亲切的手引导我,那就是我的得胜。2 to * + *每一次我祷告,我摇动你的手, + 祷告做的事,我的手不能做。 + 每一次我祷告,大山被挪移, + 道路被铺平,使列国归向你。* + + + + 深触我心 + + 耶稣诚然担当,我们的忧患,背负我们痛苦; + 耶稣为我们的过犯受害,为我们的罪孽压伤; + 因你受的刑罚我们得平安, + 因你受的鞭伤我们得医治,完全得医治。 + 感谢耶稣,我的救主,我得平安,我得医治, + 我的耶稣,爱我的主,你的恩典深触我心。 + + + + 我对你的爱永不变 + + 你开了我的耳我的眼,我的嘴将称颂你到永远; + 你的意念高过我的思想,如同天高过地。 + 全地都要来赞美你,我跪拜你面前称颂你, + 山虽动摇,地虽改变,我对你的爱永不变。 + + + + 世上的水 + 你辞别了家乡千万里,今要往哪里去, + 你度过了风浪一重重,力量还剩几许; + 当灯下无人独自处,你可曾问自己, + 难道说人生匆匆过,换心酸泪满腮。 + 耶稣基督,耶稣基督,你可知道他能他肯他正带你路, + 这世上的水喝了还要渴,人若喝了还要再渴。 + 主要赐你喜乐活江河,一直流流到永生。 + (The end)一直流流到永生。 + + + + 分别为圣 + 阿爸天父 我主,感谢你救赎我, + 我堕落时,你伸出双手,照我本相接纳我; + 阿爸天父 我主,感谢你拣选我, + 我愿一生来传扬你名,我对你爱永不改变。 + 喔~主,喔~主,喔~主,你是我最心爱的, + 我永不回头,永远不回头,即使我软弱。 + 喔~主,喔~主,喔~主,我愿献上我的一生, + 求你使用我,求你使用我,我愿被分别为圣。 + + + + 生命的执着 + + 你是我心中,我心中唯一的诗歌, + 我要向你尽情的歌唱,向你献上最真诚的爱。 + 你是我心中我心中唯一的切慕, + 我要一生紧紧地跟随,让你牵我走天路。 + 主啊,唯你知我的软弱,你知我最深的意念, + 无论在何时,无论在何处,你亲手领我前行, + 除你以外,在天我还能有谁, + 除你以外,在地也无所爱, + 哦我心渴望,我灵切慕,在你荣耀同在中。 + 哦主!哦主你是我生命唯一的执著。 + + + + 从太阳出来之地 + + 从太阳出来之地,直到日落处的那边, + 主的名当赞美的。(2遍) + 赞美主名,神的儿女要赞美,赞美主的圣名, + 赞美主圣名,从今时直到永远,赞美主的圣名。 + + + + 主啊 我到你面前 + + 主啊,我到你面前,献上我的今天, + 我的身体,我的一切,献上当作活祭。 + 主啊,我到你面前,献上我的今天, + 求你更新,求你洁净,我的心思意念。 + 我与你同钉十架,如今不是我活着, + 因我知道你是深爱我,我只为你而活, + 主啊,我到你面前,献上我的今天, + 愿我一生,蒙你悦纳,成为你的喜悦。 + + + + 你爱永不变 + + 你流出宝血,洗净我污秽,将我的生命赎回, + 为了我的罪,牺牲永不悔,显明你及大恩惠, + 我深深体会,你爱的宝贵,献上自己永追随, + 或伤心或气馁,或生离或死别, + 愿刚强壮胆永远不后退。 + * 哦~你爱永不变,从今直到永远, + 深深浇灌我心田,或天旋或地转, + 经沧海历桑田,都不能叫我与你爱隔绝。 + + + + 生命的河 + + 生命的河,喜乐的河,缓缓流进我的心窝。 + 我要唱那一首歌,唱一首天上的歌, + 头上的雾云心里的忧伤,全都消没!!! + + + + 轻轻听 + + 轻轻听,我要轻轻听,我要侧耳听我主声音; + 轻轻听,他在轻轻听,我的牧人认得我声音。 + * 你是大牧者,生命的主宰,我一生只听随主声音; + 你是大牧者,生命的主宰,我的牧人认得我声音。 + + + + 让赞美飞扬 + + 在这美丽的时刻,我们相聚在一起, + 神的爱拥抱着我们,神的灵充满这地。 + 当称谢进入他的门,当赞美进入他的院。 + 击鼓跳舞扬声欢呼,凡有气息都要赞美他。 + * 让赞美从四处响起,让音符在空中飞舞, + 让我们的心向神敞开,让赞美从四处响起, + 让音符在空中飞舞,让我们的心向神敞开。 + + + + 因你与我同行 + + 因你与我同行,我就不会孤寂,欢笑时你同喜,忧伤时你共泣.;因你是我力量,我就不会绝望, + 困乏软弱中有你慈恩我就得刚强。 + * 经风暴过黑夜,度阡陌越洋海,有你手牵引我,我就勇往向前,愿我所行路径,原我所历机遇, + 处处留下有你同在的恩典痕迹。 + + + + 主 我要遇见祢 + + 来到主前,谦卑跪下倾吐我心意, + 我心中伤痛,我眼泪流主必不轻看, + 人生道路如此坎坷,有许多无奈, + 我来到主前叩门寻找,恳求主开路。 + (副)主我要遇见祢,主我心渴慕祢, + 主我只要有祢,生命窄路与我同过, + 主让我遇见祢,主让我得着祢, + 主我要祢自己,主祢自己,我主。 + + + + 如鹿切慕溪 + + 神啊,我的心切慕你如鹿切慕溪水, + 惟有你是我心所爱,我渴慕来敬拜你。 + 你是我的力量盾牌,我灵单单降服于你, + 惟有你是我心所爱,我渴慕来敬拜你。 + 48 我们有伟大奇妙神 C + 我们有伟大奇妙神,他创造天地和万物, + 我们有伟大奇妙神,他使瞎眼看见,瘸腿能行走。 + * 在他没有难成的事,在他没有难成的事。 + 噢,全能的上帝,在你没有难成的事, + 在你没有难成的事,在你没有难成的事。 + + + + 我们有伟大奇妙神 + + 我们有伟大奇妙神,他创造天地和万物, + 我们有伟大奇妙神,他使瞎眼看见,瘸腿能行走。 + * 在他没有难成的事,在他没有难成的事。 + 噢,全能的上帝,在你没有难成的事, + 在你没有难成的事,在你没有难成的事。 + + + + 我在这里赞美 + + 我在这里赞美,我在那里赞美, + 我在任何地方都是要赞美, + 我在这里赞美,我在那里赞美, + 我在任何地方都是要赞美,啦…… *祷告 *感谢 *敬拜 + + + + 野地的花 + + 野地的花,穿着美丽的衣裳, + 天空的鸟儿从来不为生活忙。 + 慈爱的天父,天天都看顾。 + 他更爱世上人,为他们预备永生的路。 + 一切需要,天父都已知道, + 若心中烦恼,让他为你除掉。 + 慈爱的天父,天天都看顾。 + 他是全能的主,信靠他的人真是有福。 + + + + 耶稣爱你 + + 这世界有个千年不变道理,那就是耶稣爱你, + 在世上没有任何的逼迫患难, + 能使我们与神的爱隔绝。 + 你是否愿意同为神的儿女,一生让耶稣爱你, + 在世上没有任何的困苦愁烦, + 能使我们与神的爱隔绝。 + + + + 耶稣你名真甘甜 + + 耶稣啊耶稣,你名真甘甜,哈利路亚; + 耶稣啊耶稣,你是我所爱。 + 提到你我就不再伤心, + 噢,提到你我就歌唱欢喜, + 提到你我就荣主圣名,耶稣~~,你是我所爱。 + + + + 愿意爱你 + + ※求你给我,爱你的心,永远坚定,永远不移, + 让我爱你,不再是我的嘴唇话语而已(※二次)。 + 让我真正献上自己,热心事奉只因爱你, + 愿你喜悦我的生命,问心无愧说我爱你, + 主啊,我愿献上自己,愿意事奉只因爱你, + 愿你喜悦我的生命,愿这一生单单爱你。 + + + + 以色列的圣者 + + 以色列的圣者,为我牺牲自己, + 神羔羊,你是弥赛亚,耶稣和平之君。 + 我要跪下来敬拜你主啊!因为你是万王之王。 + 我要跪下来敬拜你我神!宝贵耶稣,和平之君。 + + + + 赞美之泉 + + 从天父而来的爱和恩典,把我们冰冷的心溶解, + 让我们献出每个音符,把它化为赞美之泉, + 让我们张开口,举起手,向永生之主称谢, + 使赞美之泉流入,每个人的心间。 + + + + 起来荣耀 + + 起来荣耀 *3 我主耶稣, + 让我们荣耀 *4 荣耀主耶稣, + 让我们荣耀 *3 荣耀主。 + 祢是大君王,胜过黑暗死亡, + 洗净心灵忧伤,带来喜悦平安, + 祢是全能神,掌管世上万有, + 除去罪恶捆绑,赐给我新的生命。 + + + + 来高声唱 + + ※来高声唱,来高声唱,让我们来赞美尊崇大君王(※二次)。 + 惟有他配得赞美,因祂是主,昔在今在快来君王。 + 万膝要跪拜,万口都要承认, + 祂是主耶稣,祂是主耶稣,祂是主耶稣基督。 + + + + 一切歌颂赞美 + + 一切歌颂赞美,都归我主我的神, + 你是配得歌颂与赞美。 + 我们高声呼喊,高举耶稣圣名,哈利路亚, + ※赞美主,哈利路亚, + 赞美主,哈利路亚,哈利路亚(※二次) + + + + 耶和华是我牧者 + + 耶和华是我牧者,我必不至缺乏, + 使我躺卧青草地,在安歇的水边。 + 他使我灵魂苏醒,引我走正义路, + 我虽过死荫幽谷,也必不怕遭害。 + 1. 在我敌人面前,为我摆设筵席, + 你用油膏我的头,使我福杯满溢。 + 一生一世有恩惠,有慈爱跟随我, + 我要住在你殿中,直到永永远远。 + 2. 嘿嘿呦,嘿嘿呦,主你与我同在, + 你的杖和你的竿,时时都安慰我。 + 嘿嘿呦,嘿嘿呦,有慈爱跟随我, + 我要住在你殿中,直到永永远远。 + + + + 我们成为一家人 + + 我们成为一家人,因着耶稣因着耶稣,成为神儿女, + 我们成为一家人,因着耶稣因着耶稣,成为神国的子民。 + (副)因着耶稣得洁净,因着耶稣入光明, + 因着耶稣同享复活的生命。 + 同享生命的喜悦,同在主爱中连结, + 因着耶稣同受丰盛的产业。 + + + + 你是唯一 + + 世界有你(我)会更美好,没有人能像你(我), + 神的眼中你(我)是宝贝,在这世界你(我)就是唯一。 + ※ 哦 你(我)是如此如此特别,在上帝的眼中, + 没有人能取代你(我) (※二次) + + + + 我在这 + + ※我在这,是因祢恩典,我在这,是因祢慈爱, + 主耶稣,我如此感恩,都因祢丰盛恩典(※二次)。 + (副) 感谢耶稣、耶稣、耶稣,感谢耶稣, + 只因着祢恩典,使我能为祢活,我赞美祢直到永远。 + + + + 我相信 + + 1. 我相信,你的应许,我相信,你的爱, + 我相信,你的真实,我相信,~~~你。 + 2. 我相信,你的恩典,我相信,你能力, + 我相信,你智慧完全,我相信,~~~你。 + 3. 我相信,你的救赎,我相信,你的犠牲, + 我相信,你流出宝血,我相信,你复活。 + (副) 所以我来为要爱你,所以我来为要敬拜你。 + 你在我身,作为可畏,我一生敬畏你。 + + + + 把我领到你宝血里 + + 耶稣求你进入我的心,用你大能的宝血遮盖我; + 开启我心灵,得着我生命, + 在你宝血里我就得洁净; + 耶稣求你进入我的心,用你大能的宝血释放我, + 进入你同在,领受你大爱, + 在你宝血里我献上敬拜。 + 领我到你宝血里,所有罪恶必得赦免, + 更新我生命在你爱的宝血里面; + 领我到你宝血里面,领受丰盛奇妙恩典, + 更新我生命在你爱的宝血里面。 + + + + 深深爱你 + + 我生命中最渴望的一件事, + 切慕你,单单寻求你, + 用我全心全意,用我全力爱你, + 敬拜你让你荣耀充满全地。 + 深深爱你,耶稣;深深爱你,耶稣。 + 我爱你超越生命中一切。 + 深深爱你,耶稣;深深爱,你耶稣。 + 哦,我爱你,耶稣。 + + + + 如果你想知道 + + 如果你想知道,爱在哪里?爱就在你我的周围。 + 如果你想知道,爱在哪里? + 爱就在每个人的笑脸上。 + 爱在哪里?爱在哪里?爱就在神的爱子里。 + 爱从何来?爱从何来?爱就是从神而来。 + + + + 他是配得 + + 同来看主耶稣的荣美,同来知道他奇妙恩惠, + 同来看他多么眷顾你,定睛他面上的大慈爱。 + 同来摸他手上的钉痕,发现他真是奇妙良友, + 同来站在血红十架上,同证那永恒不渝的爱。 + 他是配得,配得被赞美, + 他是配得,配得被赞扬, + 他是荣耀他真是奇妙,他是我所有一切。 + + + + 握手 + + 踏上十字架的道路,我的心绝不会后悔, + 纵然道路曲折难行,我的脚步不会后退。 + 岁月流过不能再追,春去秋来落叶纷飞, + 我要因耶和华敬畏,等候他的必不至羞愧。 + 向软弱挥挥手,向刚强握手, + 向悲伤挥挥手,向喜乐握手。 + 走在十字架的道路,我的脚踪何等佳美, + 有时失望悄悄落泪,耶稣是我力量安慰。 + 往事飞过只能回味,千山万水有主伴随, + 我要向耶和华赞美,扬声歌唱与主同饮杯。 + 向世界挥挥手,向十架握手, + 往前走不回头,往前走莫停留。 + + + + 让爱走动 + + 走过伤心,走过泪水,让每一颗心,再次飞起来。 + 用你的心,伸出你手,让每个灵魂,再次活过来。 + 让爱走动,让你的爱化成希望的种子, + 随风扬起,编制美丽的梦。 + 让爱走动,让你的爱化成温暖的拥抱, + 绽放阳光,编制神所造的梦。 + + + + 主的恩典乃是一生之久 + + 圣灵啊,求你来,我软弱,你明白, + 我无言,你叹息,亲自为我代求。 + 你监察,我的心,使我走在属神旨意, + 你医治,我的灵,使我生命再绚丽。 + 啊~啊~,我心不住赞美,啊~啊~我灵不住称谢, + 一宿虽有哭泣,早晨必欢呼, + 主的恩典乃是一生之久。*2 + + + + 牺牲的爱 + + 在十字架上,你为我舍命,受鞭伤,使我得医治。 + 所有的罪恶,你为我担当,受刑罚,使我得平安。 + 何等牺牲的爱,圣洁圣子成为赎罪祭, + 何等能力胜死亡权势,今我属你永活的真神。 + 在这个时刻,我心只有你,我的主,我唯一的爱。 + + + + 愿为主闪亮 + + 我只是浩瀚沙海中的一粒沙,渺小且缺乏, + 而主耶稣接纳我深深地疼爱我, + 领我入主爱之家。 + 他温柔慈爱,融解了我所有地忧伤, + 他奇妙双手,细数过我每一根头发。 + 我如此不配,而主慈爱呼唤不曾停下, + 我一生一世愿为主闪亮。 + + + + 主赐福如春雨 + + 你赐的福如春雨,我在其中欢欣赞美你, + 你赐的生命是泉源,在我心中更新不穷, + 让我们张开赞美的口,举起敬拜的手, + 主将赐福在我们之中。 + 让我们献上献上,将赞美尊荣,全都向主献上, + 而主将赐下赐下,主的恩典,将如春雨降下。 + + + + 阿爸父 + + 阿爸父,哦,阿爸父,我的心向你呼求! + 恳求你来洁净我,使我灵得自由。 + 我的心渴慕见到你的荣面,让你爱将我怀绕, + 阿爸父,哦,阿爸父,在你脚前我等候。 + + + + 差遣我 + + 主告诉我,如何献上我的生命, + 带希望入人群中。 + 主告诉我,如何付出我的关怀., + 将温暖带入世界。 + 我看到灵魂中的忧伤, + 孤独中人的心在角落颤抖。 + 差遣我,差遣我,我愿付出我所有, + 差遣我到需要你的人群中, + 充满我,充满我,用你爱来充满我, + 再一次紧握他们的手。 + + + + 主我敬拜你 + + 主我敬拜你,敞开在你的面前, + 主我敬拜你,俯伏在你宝座前敬拜你。 + 天军向你屈膝,众天使围绕你座前。 + 主我双手举起,屈膝你宝座前敬拜你。 + + + + 光明之子 + + 你的汗,你的泪,你的血, + 洗净了我沉重的罪孽。 + 引我走出世界的黑暗,圣洁公义从此相伴。 + 光明之子,从此是我的名字, + 那用你宝血重价赎回的名字, + 光明之子,主所喜悦的名字, + 背起十架将主光带入人群里。 + + + + 荣耀都归你 + + 哈利路亚,荣耀归宝座羔羊, + 哈利路亚,荣耀都归你,荣耀都归你真神。 + 我一生都要来敬拜你,哈利路亚,我的手我的口, + 我全心我全人,都要敬拜你。 + + + + 让我 + + 你用重价救赎我,使我脱离罪恶河, + 叫我这不配的人凭信得救, + 你赐圣灵帮助我,使我胜过老旧我, + 祈求恩主领我,迈向属灵高峰。 + 让我赞美并非美词,让我敬拜并非方式, + 让我服事非靠双手,而祷告非仅用口, + 让我爱人不要虚假,让我待人由心而发, + 让我学习顺服,以圣洁为装饰。 + + + + 是祭司是器皿 + + 活在世界,有许多软弱, + 争战不断,迷失在彷徨中。 + 忘记被拣选,火热渐渐冷却, + 求你亲自降临,点燃复兴。(反复1次) + *是祭司,有祷告的权柄, + 代求和献祭,宣告呼求能力。 + 是器皿,受膏后要有使命, + 恳求洁净,听主说我要用你, + 听主声音对你说,我要用你。(耶稣说你)to*, + (尾声)你是否跟主回应说,我愿意。 + + + + 一生爱你 + + 亲爱的宝贵耶稣,你爱何等地甘甜; + 我的心深深被你吸引,爱你是我的喜乐 + 一生爱你,一生敬拜你;一生爱你,一生荣耀你; + 一生奉献,一生不回头;一生爱你,跟随你。 + + + + 献上自己为祭 + + 献上自己为祭,完全降服于你, + 灵火熊熊来焚烧,恩膏厚厚湿衣襟。 + 迈开征战步伐,高举基督旌旗, + 你看我们为华冠,以我们为精兵。 + 让我们重建大卫倒塌的帐幕, + 我们起来堵住其中的破口, + 重修毁坏的祭坛,释放被掳的灵魂, + 愿你荣耀的国度降临。 + + + + 荣耀羔羊 + + 荣耀啊,荣耀羔羊,配得一切赞美尊崇敬拜。 + 荣耀啊,荣耀羔羊,至圣至洁荣光充满全地。 + 万物俯伏跪拜,万口宣扬, + 昔在今在永在全能主宰。 + 颂赞、能力、爱戴,归宝座羔羊, + 全地唱、全地唱,哈利路亚。 + + + + Hi-Ne-Ni + + 耶和华我的主啊! + 求你使我放下心中,放下心中所爱。 + 耶和华我的主啊! + 求你使我打碎心中,心中偶像。 + 直到我在敬拜中献上自己为祭, + 无怨无悔永不回头, + 直到我在祭坛那里得着命定, + 无怨无悔永不回头。 + HI-NE-NI,HI-NE-NI,烧我、差我,我在这里, + HI-NE-NI,HI-NE-NI,烧我、差我,HI-NE-NI。 + 为这世界黑暗的角落我在这里, + 为那不曾被安慰的灵魂。 + 我在这里,HI-NE-NI,我在这里,HI-NE-NI。 + + + + 你是荣耀的君王 + + 你是荣耀的君王,你是和平之主, + 你是天地万有主宰,惟有你圣洁公义。 + 天使都向你跪下,敬拜尊崇你。 + 因为在你有永生之道,你是主耶稣基督。 + 和散那归于大卫的之孙,和散那归于万王之王, + 愿荣耀归于至高神,耶稣是弥赛亚。 + + + + 我全心颂赞 + + 当我抬头见你,当我侧耳聆听你声音, + 我全心赞美,我传扬你奇妙作为*2 + 我全心颂赞,你的荣美,我全人颂赞,你的作为, + 每日每夜我不停赞美,哈利路亚哈利路亚,阿们……。 + + + + 亲近你 + + 亲近你,心要亲近你;亲近你,心要贴近你。 + 亲爱主,在你荣光中;不住亲近你;不住敬拜你。 + 亲近你,在干旱之地;亲近你,聆听你声音。 + 主我愿贴近你的心,顺服你旨意,讨主你欢欣。 + 你的爱,使我灵苏醒,使我灵欢欣,我起舞敬拜你。 + + + + 耶稣基督是主 + + 1.2.4. 因为他是万王之王,因为他是万主之主, + 唯有他从死里复活,我要敬拜他。*2 to# + 3. 高唱荣耀哈利路亚,欢呼荣耀哈利路亚, + 他是我的主我的王,我要敬拜他。To ~ + # 万膝要跪拜,万口要承认,耶稣基督他是主。 + 万膝要跪拜,万口要承认,耶稣基督他是主。To 3 + ~ 哈利路亚,哈利路亚,耶稣基督他是主。 + 哈利路亚,哈利路亚,耶稣基督他是主。To 4 + + + + 平安七月夜 + + 夜星在天上闪闪烁,月娘光光照溪边, + 大树下,风微微,听到树蝉在吟诗, + 上帝赏赐的平安冥。 + 耶和华是我的安慰,依靠他拢免惊什么。 + 虽遇到风台天,他给我心有平静, + 将平安放在我的内心。 + 我过死荫山谷也不惊灾害, + 他会和我在伫地,用话来安慰我。 + 有恩典和慈爱和我相作伴,有平安跟我一世人。 + + + + 主,恳求你 + + 主,求你察看我,试验我,熬炼我的肺腑心肠。 + 主,求你转向我,怜恤我,因为我是孤独困苦。 + 主,求你赦免我,看顾我,因为我的罪极重大。 + 主,求你保护我,搭救我,因为我永远投靠你。 + 主恳求你引到我,教训我,你是拯救我的神。 + 主恳求你医治我,保守我,我终日等候仰望你。 + + + + 心仰望耶稣 + + 既然有这么多的见证人,像云彩围绕着我们, + 就应该放下各样重担,脱下缠类我们的罪。 + 既然有这么多的见证人,像云彩围绕着我们, + 以忍耐的心向前奔跑,那摆在我们前面的路程。 + 让我们专心、专心仰望耶稣,那信心的创始完成者, + 以合一的心并存忍耐,奔跑我们前面的路程。 + 让我们专心、专心仰望耶稣,旷野中的安慰引领者, + 以喜乐的心并存盼望,奔跑我们前面的路程。 + + + + 我的救赎者活着 + + 我知道我的救赎者活着,祂是永活的主, + 当我在深谷迷失时,祂领我走正义路。 + 我知道我的救赎者活着,祂是永活得主, + 当我在旷野孤独时,祂伴我作我的灯。 + 我知道我的救赎着永远活着,我的心不再忧虑, + 我要在每一个日夜中,领受祂的丰盛慈爱。 + 我知道我的救赎者永远活着,我灵不再沉睡, + 当号角响起的那一天,我将见祂荣光之面。 + + + + 我们一起祷告吧 + + 我们一起祷告吧,来到主跟前,屈膝跪拜; + 祂是赐福的主,我们向着天,举起双手, + 求你打开天上门,将丰沛的恩雨, + 滋润充满整个大地; + 终于看到主降临,应许的圣灵,浇灌在我们的身上。 + + + + 爱、喜乐、生命 + + 时空不能隔绝他的爱,因他爱我直到万代。 + 世界不能阻挡他的爱,因他爱我永不更改。 + 他的爱胜过死亡阴霾,他的爱驱走忧愁悲哀。 + 让主爱浇灌我们的心,喜乐泉源涌自心地。 + 忧愁不再我们有喜乐的生命, + 让主爱充满我们的心, + 生命火花扬自心底, + 泪水不再我们有永恒的生命。 + + + + 追逐 + + 2007莫斯科福音夏令营主题曲 + 曾经追求事业成功,曾经梦想自由天堂, + 曾经寻找爱的港湾,却在罪中迷失了方向。 + 亲爱的主把我召唤,宝血洗净我不再彷徨, + 赐我生命引领方向,从此主爱与我相伴。 + *追逐十架的天堂,跨越生命的约旦, + 进入主爱的迦南,享受生命平安!TO* + + + + 你是我生命的亮光 + + 耶稣是我生命的亮光,照亮我的前方。 + 虽有暴风雨把我挡,注目我的亮光。 + 祂(你)使我生命重新得力,使我抬头高昂; + 祂(你)使我如鹰展翅上腾,飞跃在高岗上。 + + + + 主我跟你走 + + 主你跟我走,往普天下走 , + 天涯海角紧紧抓住我 。 + 主我跟你走 ,往普天下走 , + 死荫幽谷紧紧跟你走 。 + 因你是,万王之王,万主之主 , + 有你跟着我 我还怕什么, + 因你已 战胜死亡,得胜君王, + 这信心的路 我永不回头。 + 开启我的眼,信心的双眼, + 看那天使天军在身边。 + 塑造我的心,谦卑地聆听, + 你的话语深植在我心。 + + + + 生命在于你 + + 生命,在于你,主!力量,在于你,主! + 盼望在于你,在于你。 + 我要以生命来赞美你,我要尽全力来赞美你, + 全心赞美你,全力赞美你,我的盼望在于你, + + + + 天上我有个家 + + 我知道地上的财富都是短暂,可是我拥有一件永恒的礼物。 + 我知道天上有一个美丽的天堂,告诉你,我天上有个家。 + 小鸟自由地在飞翔,像表演一样发出悦耳的声音。 + 花儿每天穿上美丽的衣裳,告诉你,是多么的美丽。 + 在天上我有个家,让我们一起奔向这个家。 + 用我的爱,用我的心,来一起建立这个家。 + + + + 全然为你 + + 我的眼光和心思,单单注视你,喔!耶稣。 + 随着你心律动,甜蜜的灵来充满我。 + 放下为自己抓住的,放手交给你,我的主。 + 我愿使你欢喜,对你的爱不断涌流。 + 我生命气息全然为你,如同香膏倾倒, + 无悔地付出,只愿你心得满足。 + 我生命气息全然为你,如同香膏倾倒, + 全心来献上,最深刻真挚的爱。 + + + + 每当我瞻仰你 + + 每当我瞻仰你至圣荣面,每当我在爱中仰望你。 + 在你荣耀光中,所有一切都失去光彩。 + 何等喜乐当我进入你心意, + 我全心成为你爱的宝座, + 在你荣耀光中,所有一切都失去光彩。 + 我敬拜你,我敬拜你,我一生活着为要敬拜你。 + 我敬拜你,我敬拜你,我一生活着为要敬拜你。 + + + + 宝贵十架 + + 主耶稣我感谢祢,祢的身体为我而舍, + 带我出黑暗进入光明国度,使我再次能看见。 + 主耶稣我感谢祢,祢的宝血为我而流, + 宝贵十架上医治恩典涌流,使我完全得自由。 + 宝贵十架的大能赐我生命, + 主耶稣我俯伏敬拜祢, + 宝贵十架的救恩,是祢所立的约, + 祢的爱永远不会改变。 + + + + 耶稣耶稣 + + 耶稣,哦~耶稣,圣洁的救赎主; + 耶稣,耶稣,丰富赏赐者。 + 耶稣,哦~耶稣,至高的得胜者; + 耶稣,耶稣,全能的之主。 + 让凡有气息都说,圣哉,圣哉,圣哉。 + 你是昔在永在的全能主永不改变; + 让凡有气息都说,圣哉,圣哉,圣哉。 + 唯有你是佩得一切荣耀、尊贵和颂赞。 + + + + 靠着耶稣得胜 + + 在你爱里我要宣告,我软弱得改变, + 在你爱里我要宣告,你是王。 + 在你爱里我要宣告,我不再罪中打转, + 是你带领着我得胜。 + 靠着耶稣得胜,靠着耶稣得胜, + 终此生要靠着主爱去得胜。 + 靠着耶稣得胜,靠着耶稣得胜, + 不必惧怕挫败,深知主恩更广阔, + 是你带领着我得胜。 + + + + 心的回归 + + 伊甸的美景早已一去不回, + 受伤的白鸽难以展翅高飞, + 园中的鲜花早以凋谢枯萎, + 哭泣的心灵何时能以安慰, + 髑髅的山顶无辜羔羊替罪, + 永恒的救赎成就奇妙宏伟, + 黑暗的大地再见黎明光辉, + 疲惫的心灵终又重蒙恩惠。 + 将你的心归回,让你的灵高飞, + 耶稣爱你,他在等你,他是你生命中唯一宝贵。 + 将你的心归回,让你的灵高飞, + 耶稣爱你,他在等你,他是你生命中的永远依归。 + + + + 这一生最美的祝福 + + 在无数的黑夜里,我用星星画出你, + 你的恩典如晨星,让我真实的见到你; + 在我的歌声里,我用音符赞美你, + 你的美好是我今生颂扬的。 + 这一生最美的祝福,就是能认识主耶稣, + 这一生最美的祝福, 就是能信靠主耶稣。 + 走在高山深谷,他会伴我同行, + 我知道,这是最美的祝福 。 + + + + 展开清晨的翅膀 + + 主耶和华你已经鉴察了我。我坐下我起来你都已晓得。 + 我行路,我躺卧,你都细察,你也深知我一切所行。 + 我舌头上的话,你没有一句不知道。 + 你在我前後环绕着我,按手在我身上。 + 这样的奇妙,是我不能测透, + 你的至高你的尊贵,是我永远不能所及。 + 我可以往哪里去躲避你的灵? + 我可以往哪里去逃可躲避你的面? + 我若展开清晨的翅膀飞到地极, + 就在那里,你的双手也必引导我。 + + + + 安静 + + 1- 藏我在,翅膀荫下;遮盖我,在你大能手中。 + 2- 我灵安静,在基督里;你大能,使我安然信靠。 + 副歌:当大海翻腾波涛汹涌,我与你展翅暴风上空; + 父你仍作王在洪水中,我要安静知你是神。 + + + + 花尽一生来爱你 + + 你使我感动到流泪,又使我心甜到发笑; + 想着你暖流涌上心头,再次心醉你神圣荣耀。 + 这一生不再追求别的,但以认识你为至宝; + 让这爱在我灵魂燃烧,得着你也被你得着。 + 花尽一生来爱你,花尽一生来爱你 + 愿我一生不知别的,但知基督并他钉十架; + 花尽一生来爱你,花尽一生来爱你, + 我愿花尽一生来爱你,花尽一生来爱你! + + + + 天堂在我心 + + 谁说,沉睡已久的花蕾,不能绽放一季缤纷; + 谁说,寒冬之后的大地,不能展现一片青翠; + 谁说,曾经受伤的翅膀,不能再度自由地飞。 + 我要抬起头,张开双臂,拥抱神所赐的世界。 + i want to be free 自由地飞, + 在爱中无惧怕,在爱中无伤悲; + i want to be free 不再流泪, + because i believe that heaven is here + 我有天堂在我的心。 + + + + 耶稣耶稣 + + 我们敬拜的,和平之君;我们称颂的,明亮的晨星; + 我们等候的,再来的王,我们仰望的,公义的太阳。 + 耶稣!耶稣!永生神的儿子,耶稣!耶稣!我的救赎主, + 耶稣!耶稣!世界的光,耶稣!耶稣!我心所盼望。 + + + + 常常喜乐 + + 常常喜乐,向主高歌,不论环境如何, + 高山或低谷,主都看顾,相信就能蒙福; + 常常祷告,耐心等候,主做事有定时, + 流泪撒种必欢呼收割,相信就有喜乐; + 下垂的手再一次举起来,封闭的心再一次敞开, + 抛开一切忧虑,放下一切重担,来到主的面前我喜乐满怀, + 冰冷的心被主爱来温暖,干渴的灵被主爱充满, + 主是我的力量,主是我的高台, + 死阴幽谷一路有耶稣陪伴,他永不离开。 + + + + 求主充满我 + + 主 我来寻求你的面,求你充满我,来充满我; + 主 我渴慕你的同在,求你洁净我,来充满我; + 耶稣耶稣,耶稣耶稣,你的宝血洗净我; + 耶稣耶稣,耶稣耶稣,你以恩典为我冠冕。 + + + + 彩虹下的约定 + + 我空虚的心灵,终于不再流泪; + 期待着雨后,缤纷的彩虹,诉说你我的约定; + 我不安的脚步,终于可以停歇, + 主你已为我,摆设了生命的盛宴。 + 与你有约,是永恒的约,彩虹为证,千古不变。 + 我要高歌,为生命喜悦,万物都歌颂你的慈爱; + 大地诉说你的恩典! + + + + 认识你真好 + + 如同朝露中的小草,蓝天中的小鸟; + 我整颗心被幸福围绕,哦 我慈爱的天父, + 认识你真好,你赐的福分别处找不着 + 你使我抛开一切烦恼,喜乐充满在心头燃烧; + 认识你真好,认识你真好,今生今世我不再寻找。 + 哦主啊,认识你真好,认识你真好, + 只愿分分秒秒在你慈爱的怀抱。 + + + + 爱的色彩 + + 这个世界是什么颜色,每个人都看不太清楚; + 放眼望去是黑白没有色彩,因为世人都太孤独; + 有了爱,世界就不一样,所有的影像有了颜色; + 就像蝴蝶充满活力,找到美丽嫣红的玫瑰; + 相信爱,我们心中充满快乐, + 因为爱,我们相聚在一起; + 让我们手牵手、心连心,犹如奔向彩虹世界里。 + + + + 给我清洁的心 + + 求你按你的慈爱怜恤我, + 按你的慈悲涂抹我的过犯, + 我知道我的罪恶在我面前, + 我的罪恶也常在你的眼前, + 神啊 求你不要离我而去, + 再次对我显现你的荣面。 + 不要 不要 掩面不顾我,求你听我的祷告。 + 神啊,求你为我造清洁的心, + 使我里面重新有正直的灵, + 不要丢弃我,使我离开你的面, + 不要收回你的圣灵。 + + + + 在主爱中 + + 清晨朝阳,天空照耀,仿佛对我微微笑, + 阵阵微风,徐徐吹送,逍遥自在白云飘; + 鸟语花香,绿草如茵,青春时光多美好, + 尽情欢唱,尽情欢笑,烦恼全都不见了。 + 在基督里,享受主爱,自由奔放乐开怀, + 世上没有任何事物,能隔绝神的爱; + 在基督里,享受主爱,自由奔放乐开怀, + 我要赞美,我要歌颂,造物主的奇妙爱。 + + + + 眼光 + + 不管天有多黑,星星还在夜里闪亮, + 不管夜有多长,黎明早已在那头盼望, + 不管山有多高,信心的歌把它踏在脚下 , + 不管路有多远,心中有爱仍然可以走到云端。 + *谁能跨过艰难,谁能飞跃沮丧, + 谁能看见前面,有梦可想, + 上帝的心看见希望,你的心里要有眼光。1 to * + 2 to噢,你的心里要有眼光。 + + + + 让神儿子的爱围绕你 + + 1. 让神的儿子以祂圣灵和祂爱来围绕你, + 让祂充满你心,使你灵满足。 + 让祂担负你一切挂虑,赏赐平安的圣灵, + 降临在你生命中,使你完全。 + 副:耶稣,主耶稣,求充满我们; +   耶稣,主耶稣,求充满我们。 + 2. 哦!扬声欢呼歌唱赞美,让你心充满喜乐, + 举起双手甘愿顺服祂的名, + 将你的忧伤破碎心灵,痛苦岁月交给祂, + 你将靠着祂的名,进入永生。 + 副:耶稣,主耶稣,求充满我们; +   耶稣,主耶稣,求充满我们。 + + + + 主祷文 + + 我们在天上的父,愿人都尊你的名为圣, + 愿你的国降临,愿你的旨意行在地上,如同行在天上。 + 我们日用的饮食,今日赐给我们, + 免我们所欠的债,如同我们免了人的债,哈利路亚。 + 不叫我们遇见试探,救我们脱离凶恶, + 因为国度、权柄和荣耀,全是你的,直到永远。 + 我要一生一世寻求,在主殿中瞻仰荣美, + 因为国度、权柄和荣耀,全是你的,直到永远。 + + + + 紧紧抓住你 + + 我无助的时候,你给我力量, + 我害怕的时候,你紧紧抱住我, + 当我觉得我不行,你告诉我可以, + 你就是那最爱我的主。 + 我紧紧抓住你,我永远不放手, + 我看到你独生子,为我钉死在十架上。 + 我紧紧抓住你,我永远不放手, + 是你医治了我,是你从来没离开过我。 + end - 我已看到我的未来,充满信心和盼望。 + + + + 改变我,改变世界 + + 许多次 我就象是那浮云,不知要往哪里去, + 而如今 我可以停止追寻,是你的爱填满我心, + 引领我与你同行。 + 耶稣我恳求你,来改变我的生命, + 使我在患难之中,喜乐与刚强, + 耶稣我恳求你,使用我来改变这个世界, + 赐我信心与勇气,迈向这新的世纪 + 愿你荣耀的国度,早日降临。 + + + + 耶稣基督是主 + + 因为祂是万王之王,因为祂是万主之主, + 唯有祂从死里复活 我要敬拜祂 (2X) + 万膝要跪拜,万口要承认,耶稣基督祂是主, + 万膝要跪拜,万口要承认,耶稣基督祂是主。 + 高唱荣耀哈利路亚,欢呼荣耀哈利路亚, + 祂是我的主,我的王,我要敬拜祂, + 哈利路亚,哈利路亚,耶稣基督祂是主, + 哈利路亚,哈利路亚,耶稣基督祂是主。 + The end - 耶稣基督祂是主(多次) + + + + 你是配 + + 你是配 唯你是配,配得权柄丰富,配得智慧能力; + 你是配 唯你是配,配得尊贵荣耀和赞美 (2X) + 因为你曾被杀,用自己的血,从各族各方各国各民, + 买了人来,叫他们归于神,作祭司,在地上执掌王权。 + + + + 主啊,我们自卑 + + 主啊!我们自卑,祷告,寻求你面, + 转离一切恶行,专心寻求你。 + 求你从天上垂听,此处所献的祷祈, + 主啊!赦免我们的罪,医治这地。 + 睁眼看,侧耳听,我们痛悔的心灵, + 主啊!赦免我们的罪,医治这地。 + + + + + + 荣耀归于真神 + + 荣耀归于真神 祂成就大事 + 为爱世人甚至赐下独生子 + 献上祂生命为人赎罪受害 + 永生门已大开 人人可进来 + + 荣耀归于真神 祂成就大事 + 藉圣子耶稣我们得大欢喜 + 至圣至尊荣我主耶稣基督 + 将来得见主面 何等大恩福 + + 赞美主 赞美主 全地听主声音 + 赞美主 赞美主 万民快乐高兴 + 请来 藉主耶稣进入父家中 + 荣耀归主 祂已成就大事工 + + + + 还愿 + + 我拿甚么报答耶和华所赐给我的一切厚恩 + 我拿甚么报答耶和华所赐给我的一切厚恩 + 我要举起救恩的杯 + 称扬耶和华的名 + 我要在祂众民面前还我所许的愿 + 我要举起救恩的杯 + 称扬耶和华的名 + 我要在祂众民面前向还我所许的愿 + + + + 祝福 + + 愿耶和华赐福给你 + 愿耶和华永远保护你 + 愿耶和华祂的脸光照你 + 愿耶和华赐你平安 + + 愿在主里相会再相会 + 愿在主里相会再相会 + 愿主的爱永远在你心怀 + 愿神永远赐福给你 + + 愿耶和华赐福给你 + 愿耶和华永远保护你 + 愿耶和华祂的脸光照你 + 愿耶和华赐你平安   + + + + 寻羊 + + 齐心倾出爱心 + 凭着信宣告福音 + 将基督传遍海角天涯 + 配得起伟大救恩 + + 耶稣谦卑降生 + 除罪困委托重任 + 使初生灵性得到栽培 + 添祝福教会见主荫 + + 携手去觅遍失落幼羊 + 同去关心要让幼羊得供养 + 愿以圣经说话作粮 + 共去走天国方向 + 豁此生齐努力作天将 + + 齐将携手去觅遍失落幼羊 + 同去关心要让幼羊得供养 + 愿以圣经说话作粮 + 共去走天国方向 + 豁此生齐努力作天将 + 愿以爱心去助幼羊 + 尽我生坚守方向 + 同步往 齐向上 作天将  + + + + 谁造 + + 谁造绿草蝶扑花间起舞 + 万鸟空中飞翔 + 令我不胜赞好 + + 谁造大海漫遍天空色彩布 + 耀眼发光星辰 + 问你可否知道 + + 谁造麦子藏着生机于土里 + 又会再生出来 + 令我真想知道 + + 谁造天空海阔 + 造了细小朝露 + 谁造美妙乐章 + 能让我赞美创造美好 + + + + 穿我耳 + + 穿我耳我主我神 + 使我永远属于您 + 我只求单事奉您 + 主我愿随您因您 + + 您已为我付重价 + 以您血拯救赎我 + 我要永远事奉您 + 不再属己只属您 + + + + 敬拜主 + + 敬拜主 敬拜尊贵的主 + 荣耀能力一切赞美都归于祂 + 敬拜主 敬拜权柄的主 + 从祂宝座能力流出流到万民 + + 来高举一同高举主耶稣圣名 + 来彰显基督耶稣君王荣耀 + 敬拜主 敬拜尊贵的主 + 祂曾舍命今得荣耀万王之王 + + + + 全能神 + + 全能神 全能神 + 万主之主至高神 + 因你名字的能力 + 你永远都不改变 + + 全能神 全能神 + 我深爱你全能神 + 我要赞美高举你全能神  + + + + 只有您 + + 年月是悲喜都过去 + 问路途上有几多相聚 + 风沙里实很累 + 奔跑过人就想睡 + 只有您会明我弱躯 + 谁料信心一天破碎 + 问是谁为我跌倒洒泪 + 身心我虽很累 + 走到您处可安睡 + 让我永远安躺这接纳里 + + 年月像风景倒退去 + 在路途共您片刻欢聚 + 关心里再不累 + 安慰里人就不惧 + 知道您我同有弱躯 + 人遇绝境一切破碎 + 问是谁为我痛苦洒泪 + 挣扎里虽很累 + 想到有您不畏惧 + 前面奋斗多艰苦再面对 + + 长途中纵使您难永伴随 + 歧途中分忧友情愿记取 + 但愿两心里 + 爱主不减退 + 朝着主的心意共您追 + 难料信心一天破碎 + 又是谁为我跌倒洒泪 + 身心我虽很累 + 走到您处可安睡 + 临到绝境一切破碎 + 又是谁为我痛苦洒泪 + 挣扎里虽很累 + 想到有您不畏惧 + 前面奋斗多艰苦再面对  + + + + 亲爱主 + + 亲爱主 牵我手 + 坚立我 领我走 + 我路途 布满雾 看不透 + 你引路 过黑夜 + 纵遇危难同渡过 + 皆因你 紧握我 拖带我 + + 亲爱主 牵我手 + 帮助我 去困忧 + 我软弱 我困倦 我伤透 + 我挫败 纵淌泪 + 试问谁能明白我 + 深相信 此刻你 拥抱我  + + + + 主自己 + + 前所要是福祉 今所要是主 + 前所要是感觉 今要主话语 + 前所要是恩赐 今要恩赐者 + 前我寻求医治 今要主自己 + + 前自己力苦试 今惟主是靠 + 前要一半救恩 今要全得救 + 前用手坚持主 今主手牵我 + 前常漂流无定 今锚已抛妥 + + 前我忙碌打算 今则靠祈祷 + 前我时常挂虑 今有主看顾 + 前随我之所欲 今则听主语 + 前不住的求讨 今则赞美主 + + 前藉自己做工 今靠主工作 + 前我欲利用主 今让主用我 + 前欲得人称赞 今求主欢喜 + 前为自己劳碌 今为主而活 + + 前惟盼望属主 今知主属我 + 前我灯将熄灭 今照耀辉煌 + 前所等的是死 今候主再临 + 我心一切盼望 安妥在幔内 + + 永远高举耶稣 赞美主不息 + 一切在耶稣里 因祂是我一切 + + + + 感谢神 + + 感谢神 赐我救赎主 + 感谢神 丰富预备 + 感谢神 过去的同在 + 感谢神 主在我旁 + 感谢神 赐温暖春天 + 感谢神 凄凉秋景 + 感谢神 抹干我眼泪 + 感谢神 赐我安宁 + + 感谢神 祷告蒙应允 + 感谢神 未蒙垂听 + 感谢神 我曾经风暴 + 感谢神 丰富供应 + 感谢神 赐我苦与乐 + 在绝望里得安慰 + 感谢神 赐无限恩典 + 感谢神 无比慈爱 + + 感谢神 赐路旁玫瑰 + 感谢神 玫瑰有刺 + 感谢神 赐家庭温暖 + 感谢神 有福盼望 + 感谢神 赐喜乐忧愁 + 感谢神 属天平安 + 感谢神 赐明天盼望 + 感谢神 直到永远  + + + + 主的圣名 + + 主的圣名 高于世上 + 谁可跟主我的主去相比 + 高呼心中的创造主 + + 颂赞主(心中主) 颂赞主(心中主) + 曾用你血赐予我救赎厚恩 + 我的心爱你 + 一生永爱你 + + + + 我服事您 + + 我服事您 + 因我深爱您 + 您将生命赐给我 + 前我失丧 今被您寻见 + 您将生命赐给我 + + 忧伤 破碎心灵 + 为此您被钉死加略山上 + 您爱 是我所渴慕 + 您将生命赐给我 + + + + 圣灵之歌 + + 噢让那主耶稣拥抱你 + 用圣灵和祂的爱来满足你心和充满你的灵 + 让祂背负你所有重担 + 像鸽子主的灵 + 降临在你生命使你得完全 + + 来用欢欣同唱这新歌 + 因你心充满喜乐甜蜜举起双手降服主的名 + 你将心里所有的眼泪 + 并痛苦都交给神 + 祂会使你一生与耶稣同行 + + 耶稣 啊耶稣 来充满我心 + 耶稣 啊耶稣 来充满我心  + + + + 时常快乐 + + 我里面外面上面下面时常都快乐 + 我里面外面上面下面时常都快乐 + 主耶稣在我心 祂洗去我罪污 + 我里面外面上面下面时常都快乐 + + + + 我歌颂你 + + 我歌颂你 尊贵的主 + 藉你恩典 把我救赎 + 你救赎我 代价极重 + 我与天使向你歌颂 + + 我歌颂你 纵泪满襟 + 忧伤来临 仍觉欢心 + 因我回想 救主恩典 + 使我唱歌快乐无边 + + 我歌颂你 直到离世 + 不论在家 海洋陆地 + 或经死亡 进入永生 + 永永远远 我歌颂你 + + 我歌颂你 尊贵的救主 + 用我口舌向你讴歌 + 我歌颂你 永远歌颂你 + 因你喜乐 已充满我 + + + + 全地宣告 + + + + + + 全地宣告 + + 全地宣告 荣耀复活救世主 + 无与伦比 救世主耶稣荣美 + 祂是永永远远 在宝座上羔羊 + 欢欣跪拜我主 只想敬拜祂名 + + 我要宣告 荣耀复活救世主 + 被杀羔羊 世人得与神和好 + 你是永永远远 在宝座上羔羊  + 欢欣跪拜我主 只想敬拜你名  + + + + 不再陌生 + + 祇要用爱心 献每一分 + 世间充满快乐人 + 原是与你 共同进退 + 彼此增添温暖感 + + 祇要在我心 从来不分 + 贫贱贵族过路人 + 惟愿世界 热情满载 + 无限祝福心里印 + + 轻轻一声亲切慰问 + 谈谈愿望近况将来 + 不需要介意 交出这份爱 + 同行没法再陌生 + + 祇要待你真 谣言不侵 + 彼此开心笑面迎 + 随着节奏 尽情去唱 + 无限祝福温暖 歌声中播送  + + + + 就在这天 + + 赞美我主 赞美我主 + 为我预备 为我预备 + 就在这天 就在这天 + 我心中快慰 我心中快慰 + + 今天今天感激主恩赐 + 一起分享当中的欢笑 + 就在这天 就在这天 + 感激主恩赐   + + + + 您真伟大 + + 主阿我神 我每逢举目观看 + 您手所造 一切奇妙大工 + 看见星宿 又听到隆隆雷声 + 您的大工 遍满了宇宙中 + + 当我想到 神竟愿差祂儿子 + 降世舍命 我几乎不领会 + 主在十架 甘愿背我的重担 + 流血舍身 为要赦免我罪 + + 当主再来 欢呼声响彻天空 + 何等喜乐 主接我回天家 + 我要跪下 谦恭的崇拜敬奉 + 并要颂扬 神阿真伟大 + + 我灵高唱 赞美救主我神 + 您真伟大 何等伟大 + 我灵高唱 赞美救主我神 + 您真伟大 何等伟大 + + + + 爱里合一(灵里合一) + + 圣灵里我们合为一 + 在主爱里合为一 + 让我们的灵与圣灵相通 + 在主爱里合为一 + + 让我们齐声歌唱 + 让我们分享主 + 我们要同心将福音传扬 + 在主爱里合为一 + + + + 罗腾树下 + + 你曾奉献你身 + 心说一生为我而活 + 但你现在怎么景况仍令我失望 + 你明白我意旨么 + 你知我的心意何在 + 但你依然软弱沮丧 + 仍旧跌倒失落 + 躺卧在罗腾树下 + 究竟你做甚么 + 莫非不能儆醒一时 + 还要走的道路甚长 + 起来 起来你再要住何烈山上 + + + + 全为耶稣 + + 全为耶稣 立己爱人 + 扶苗护幼 珍贵成就 + 同渡明天 悉心看顾 + 祈求用我 将爱尽透 + + 回望神州 万亿国魂 + 谁人愿意 心献华夏 + 寒日梅花 风霜不怕 + 传扬十架 真爱渡化 + + 人人全发挥 尽我生为神 + 让浅根深化 绝对不会言罢 + 人神同奋战 灵命作引荐 + 全面蜕变为热爱祂 + 全为耶稣 尽献于祂 + 全力付上 发挥生命 未晚 + + + + 与神同行 + + 在我心灵里听见温柔慈声呼唤 + 是父神对我说话慈声 + 嘱咐我转离罪恶 完全顺服听从 + 走上那喜乐得胜路程 + + 世界上一切享乐渐渐变为虚空 + 属世一切引诱已远离 + 今我要为主而活 向着高处而行 + 由圣灵一路带领管理 + + 那日在天家一切重担都已卸下 + 主呼唤我名 我要感恩 + 吩咐我跟从 赐我冠冕 天上美家 + 我要快乐颂扬赞美祂 + + 与神同行 我要远离世界 + 与神同行 在祂得着一切 + 我已决定遵行父神旨意 + 与神同行 走那生命窄路 + + + + 如鹿的心 + + 如鹿的心 恳切渴想溪水 + 比我心只想紧靠主 + 独有您可配得此刻的赞美 + 衷心敬拜 + + 我要一心紧紧靠您 + 主的心今天我渴慕 + 独有您可配得此刻的赞美 + 衷心敬拜 + + + + 神必与共 + + 满心欢欣 满心安慰 + 在心深处 神必与共 + 心欢欣 满心安慰 + 是主看顾 昼夜同行 + + + + 教会一家 + + 愿爱护胜兄弟 大众又似身体 + 没有手脚不行 没有口 沉默无声 + 共畅聚胜姊妹 大众又似屋宇 + 没有砖瓦不行 没有窗 谁住这里 + + 愿爱护众兄弟 大众或有差距 + 没有偏见分歧 愿挽手 齐步同心 + 愿献奉我生命 在教会作肢体 + 没有私见骄横 尽我生 荣耀基督 + + 恩赐须运用 要多方建立信徒 + 彼此用爱心 分享主里各样恩典  + + + + 欢笑快乐 + + 神令我今天欢笑心中起舞 + 高歌莫停 欢恩满怀 + 神令我今天不再伤心失意 + 皆因是神的爱 + + 我满有快乐 满脸带笑容 + 因祂天天都保守看顾O-MY-LORD + 我确有快乐 盼你也快来 + 分享这欢笑齐齐来颂赞 + + + + 以马内利 + + 以马内利 以马内利 + 祂名称为 以马内利 + 神同在 彰显荣光 + 祂名称为 以马内利 + + + + 天父我爱你 + + 天父我爱你 + 赞美你 我敬拜你 + 在全地都要荣耀你名 + + 荣耀你的名 荣耀你的名 + 在全地都要荣耀你名  + + + + 亲爱的圣灵 + + 亲爱的圣灵 再次触摸我 + 您大能充满我 满足我需要 + 只有您可医治我 可一生都坚固我 + 亲爱的圣灵 再次触摸我 + + + + 陶造我生命 + + 神愿你来陶造我 + 使我在灵里果子更多 + 奇妙圣灵请将心窝洁净 + 剔出污秽愿能成圣 + + 恩主我求能像你 + 心内柔和与谦卑 + 凭热爱热诚感染万千生命 + 彰显万千美善灵性 + + + + 主应允祷告 + + 我信主应允祷告  + 赞美主 赞美主 + 主应许十分可靠 + 赞美主 赞美主 + + 有耶稣为我中保 + 主答应迟早必到 + 且超过所想所祷 + 赞美主 赞美主 + + + + 主爱必坚固 + + 神爱滔滔活水来匆匆涌流 + 神爱无限 怜悯没变迁 + + 永远都不会动摇 + 始终不转变 + 恩主的信实似高天 + 深恩广阔万里 + + + + 主爱永难忘 + + 主的爱无尽多 我一生都有 + 名和利并争斗 愿望能决意抛弃 + 在我主家内 共同作肢体 + 朋友间愿相爱永无愁 + + 惟愿大家肩并肩 + 手挽手不退后 + 同互勉 要奋斗 用爱心宽恕 + 效法主相敬重 勤劳作主工 + 灵内共长进乐悠悠 + + + + 荆棘的冠冕 + + 谁用荆棘编冠冕无情地戴祂头上 + 谁曾亲手打祂的头吐唾沬迎祂脸上 + 是我主披戴羞辱给戏弄不躲避 + 是我主默然地牺牲甘心承受痛楚 + + 谁曾使祂肩担苦架缓缓地向死前行 + 谁用钉子把祂钉牢挂架上流出血汗 + 是我主披戴羞辱遭杀害不躲避 + 是我主默然地牺牲甘心承受痛楚 + + 谁在今天将那冠冕无情地戴祂头上 + 谁在今天把祂钉牢挂架上流出血汗 + 谁在今天将那冠冕无情地戴祂头上 + + + + 耶稣,我爱您 + + 耶稣我爱您 + 我跪拜您面前 + 赞美和敬拜 我们的王 + 哈利路亚 哈利路亚 + 哈利路亚 哈利路 + + + + 元首在前面 + + 我的主宰 一起往前行 + 与祂精兵 一起往前行 + 不怕艰辛 前路已带着荣耀 + + 共唱凯歌 必夸胜万事 + 颂赞恩主 必夸胜万事 + 不畏攻击 原是有您在前面 + + 元首主基督必引导 + 同心紧守主的脚步 + 仇敌全败退 主军必远征 + 作主精兵 高举旌旗 + 全然背起军装 + 跟主领迈步 + 将信心踏向应许的那方 + + + + 求引领我心 + + 求引领我心 愿尽我心敬拜永活神 + 求引领我心 愿为您倾出心中爱慕 + + 求引领我心 明白主恩 + 跟主爱深深结合 + 冲开心捆绑 一心爱着您  + + + + + 祂名叫耶稣 + + 祂名叫耶稣 耶稣 + 再没有眼泪 + 祂医治忧伤破碎心 + 打开固锁的心门 + 祂的大能救赎你直到永远 + + + + 全地齐赞颂 + + 赞美天父我多爱你 + 高举主的圣名于这世上 + 愿你百姓说出天父你作为 + 常用赞美建筑上帝的国 + + 全地齐赞颂你大能 + 过去现在未来 真光照耀 + 全地齐赞颂你大能 + 过去现在未来 + 真光照耀 + 全地齐赞颂你大能 + 照遍永恒万世 + + + + 有福的确据 + + 有福的确据 耶稣属我 + 何等的荣耀向我显明 + 被救主赎回为神后嗣 + 罪全得洗净圣灵再生 + + 完全顺服主 满心欢喜 + 天堂的荣耀显在心里 + 彷佛有天使由天降临 + 报明主慈爱并主爱怜 + + 完全献与主 万事安宁 + 荣耀的圣灵充满我心 + 时刻仰望主儆醒等候 + 不住的祈祷到主再临 + + 这是我信息 或讲或唱 + 赞美我救主心里快畅 + 常谈主慈爱 并颂主恩 + 赞美我救主昼夜不分 + + + + 来荣耀颂赞 + + 高声赞颂父神深恩 +  高声赞颂父神深恩 + 愿荣耀归于我恩主 +  来荣耀颂赞 + 颂赞归天父 颂赞归于我神 + 哈利路亚 + 高声赞颂父神深恩 + + + + 主,改造我心 + + 主改造我心 使我心变真 + 主改造我心 但愿能像你 + + 你是那陶像 我是泥土 + 重新塑造我 这是我祈求 + + + + 当扬声欢呼 + + 当向耶和华扬声欢呼 + 因祂是配得受赞美 + 用心灵歌唱 齐来拍手 + 敬拜那永活全能神 + + 赞美 赞美 祂是配得受赞美 + 哈利路亚 敬拜那永活全能神 + + + + 教会的赞美 + + 我们同声赞美来将祂颂扬 + 我们蒙神恩同往圣山上 + 见证祂的作为 无论大或小 + 掌权的基督是我们君王 + 教会的生活 实际又丰富 + 罪与世界都日渐地消逝 + 我们今跳跃 尽情地欢唱 + 我们今跳跃 尽情地欢唱 + + 赞祂与神同等原坐在天上 + 竟成为人子为我们受创 + 赞祂从死复活 宝座上为王 + 复活的丰富我们能尽尝 + 赞祂何丰富 充满了一切 + 我们竟成祂丰富的彰显 + 哦 哈利路亚 丰富的彰显 + 哦 哈利路亚 丰富的彰显 + + + + 求主复兴教会 + + 求主复兴教会 + 就在这些年间 + 我今站在守望楼上 + 望主即速显现 + + + + 神啊,颂赞归你 + + 神啊,颂赞归你 + 颂声遍响宇宙 + 上主我心称赞 + 颂赞归予恩主 + + 曾流血为我赎罪 + 愿负起我的过犯 + 上主我心称赞 + 我的心赞美你 + + + + 你信实何广大 + + 你信实何广大 哦神我的父 + 在你没有丝毫转动影儿 + 你不改变你怜爱也无减少 + 像你以往一样 直到永远 + + 暑夏和严寒冬 春风和秋收 + 日月众星辰在天上运行 + 联合全宇宙共同多方见证 + 述说你的信实 怜悯慈爱 + + 你赦免我罪愆 赐我永平安 + 你的光容亲自安慰导引 + 日日加力更赐我光明盼望 + 所有你的恩爱 尽都属我 + + 你信实何广大 你信实何广大 + 每早晨赐下新丰富恩惠 + 我一切需用 你全早已预备 + 主啊 你的信实何等广大 + + + + 颂赞哈利路亚 + + 心中歌唱 荣耀颂赞主名 + 双手拍和 从来主不变迁 + 此刻充满 求上主居心内 + 开口赞颂 让灵歌轻飘送 + + 颂赞哈利路亚 哈利路亚 + 崇拜感恩归我主 + 颂赞哈利路亚 哈利路亚 + 崇拜感恩永属您 + + + + 祂名高于一切 + + 在万名之中 祂高于一切 + 救主基督圣名 在万名上 + 在万名之中 祂高于一切 + 救主基督圣名 掌管宇宙 + + 奇妙藏祂手中 天海给祂引领 + 在祂得享和平 满有能力 + 在万名之中 祂高于一切 + 救主基督圣名 掌管宇宙 + + + + 没有你,那有我 + + 从来未试过 将一生交托 为你真正活过 + 从来未尽用我恩赐 深你恩有许多 + 回头望过去一生的经过 唯有你的火 + 光照路途每一步 去冲破障碍又破浪 + + 如若没有你 今天不知道 怎么可有我 + 如若是独自去闯 不知风雨怎去可挡 + 祈望用我有一切的恩赐 为你去作光 + 不理路途是艰巨 全为你去苦干 + + 让我手能为人 送予永活盼望 + 让我口传万民 赞美远达四方 + 让我心全为神 每昼每夜去宣讲 + 将一生交给主努力干 + + + + 靠着耶稣圣名 + + 靠着耶稣圣名 靠着耶稣圣名 + 我们必能得胜 + 靠着耶稣圣名 靠着耶稣圣名 + 我们必能得胜 + + 谁能诉尽神的作为 + 谁能诉尽祂的爱 + 靠着耶稣宝贵圣名 我们必能得胜 + + + + 赞美祂,赞美祂 + + 赞美 赞美 耶稣可称颂的救主 + 全地颂扬 将主妙爱传明 + 赞美 赞美 光明中天使长欢呼 + 权柄 荣耀 都归与主圣名 + 如同牧人 耶稣保护祂小羊 + 在祂膀臂 终日怀抱抚养 + + 赞美 赞美 耶稣可称颂的救主 + 为我众罪 受苦流血死亡 + 是我 盘石 是永远救恩的盼望 + 赞美 赞美 耶稣被钉君王 + 高声赞美 为我担当众忧伤 + 无比大爱 奇妙深厚坚强 + + 赞美 赞美 述说祂无比的大爱 + 赞美 赞美 欢呼直到万代 + + + + 基督,万有之主宰 + + 基督万有之主宰 + 尊贵之君 荣耀救主 + 神是道路 是世间真光 + 生命主宰 祂是爱 + + + + 只有您-永恒的主 + + 谁知心痛苦 谁解心里忧 + 谁可于这刻伴我身边诉 + 只有您 永恒的主 + 每一刻等待 静听心声 + 谁牺牲富足 谁舍尊降卑 + 谁于漆黑中让每点光照遍 + 只有您 永恒的主 + 带出光辉 令我温暖 + + 人海中常失落 每天感到压迫苦困 + 还愿您每天也记念 + 求恩主启迪 使我能知道 + 您是永恒 您是盼望 常在我心 + + 容许我靠近您 永远没挂虑 + 容许我爱慕您 因您是我力量 + 明天纵有幻变 求您引导 + 愿此生全为您走过 + 能使我满足只有您 + + + + 我知谁管着明天 + + 我不知明天的道路 + 每一天只为主活 + 我不借明天的太阳 + 因明天或许阴暗 + 我不要为将来忧虑 + 因我信主的应许 + 我今天要与主同行 + 因祂知前面如何 + + 每一步越走越光明 + 像攀登黄金阶梯 + 每重担越挑越轻省 + 每朵云披上银衣 + 在那里阳光常普照 + 在那里没有眼泪 + 在美丽彩虹的尽头 + 众山岭与天相连 + + 我不知明天的道路 + 或遭遇生活苦楚 + 但那位养活麻雀者 + 祂必然也看顾我 + 祂是我旅途的良伴 + 或经过水火之灾 + 但救主必与我同在 + 祂宝血把我遮盖 + + 有许多未来的事情 + 我现在不能识透 + 但我知谁管着明天 + 我也知谁牵我手 + + + + 主的名多么珍贵 + + 主的名是多么的珍贵 + 主的名胜地上万金 + 主的名是我内心所渴求 + 谁与您相比 珍贵是您  + + + + 荣耀归于耶和华 + + 我的心要感谢 + 万口也欢欣歌唱 + 列国皆欢呼 + 感激我主的恩惠 + + 我的心要感谢 + 万口也欢欣歌唱 + 大爱比天高 + 信实达万代 从不转动 + + 荣耀归于耶和华 + 超出那高天 + 全能主宰 将真光充满地球 + + 荣耀归于耶和华 + 超出那高天 + 全能主宰 将真光充满万世 + + 全能主宰 愿我主尊贵远超高天 + 遍达地上每一角 + + + + 耶和华为我预备 + + 耶和华是我供应者 + 祂必赐满满的厚恩(为我所需) + 耶和华是我供应者 + 祂必赐满满的厚恩 + + 主必天天供给我需要 + 按照神荣耀里丰富恩典 + 差遣万千天使保守引导 + 掌管一生一世从没有变迁 + 耶和华预备一切厚恩 + + + + 尽心尽性赞美祂 + + 我要尽心尽性来敬拜我主 + 我要用诗歌来赞美祂 + 我要尽心尽性来敬拜我主 + 我要天天赞美祂 + + 因我的神是伟大的神 + 祂配受极大赞美 + 因我的神是伟大的神 + 我要尽力来赞美祂 + + + + 劳苦担重担的人 + + 凡劳苦担重担的人 + 担重担的人 可以到我这里来 + 凡劳苦担重担的人 + 担重担的人 可以到我这里来 + + 我就使你得享安息 + 我就使你们得安息 + 凡劳苦担重担的人 + 担重担的人 可以到我这里来 + 可以到我这里来 + + + + 我要向高山举目 + + 我要向高山举目,我的帮助从何来 + 我的帮助从造天地的耶和华而来 + 我要向高山举目,我的帮助从何来 + 我的帮助从造天地的耶和华而来 + 哈利路亚,哈利路亚,哈利路亚,哈利路 + 哈利路亚,哈利路亚,哈利路亚,哈利路 + + 我要向高山举目,我的帮助从何来 + 我的帮助从造天地的耶和华而来 + 我要向高山举目,我的帮助从何来 + 我的帮助从造天地的耶和华而来 + 哈利路亚,哈利路亚,哈利路亚,哈利路 + 哈利路亚,哈利路亚,哈利路亚,哈利路 + + 我要向高山举目,我的帮助从何来 + 我的帮助从造天地的耶和华而来 + 我要向高山举目,我的帮助从何来 + 我的帮助从造天地的耶和华而来 + 哈利路亚,哈利路亚,哈利路亚,哈利路 + 哈利路亚,哈利路亚,哈利路亚,哈利路 + 我的帮助从造天地的耶和华而来 + + + + 我只想去赞美您 + + 我只想去赞美您 + 举起双手说我爱您 + 您是我的一切  + 要尊崇您圣名在至高处 + 我只想去赞美您 + 举起双手说我爱您 + 您是我的一切 + 要尊崇您圣名在至高处 + 要尊崇您圣名 + 我要尊崇您圣名 + 我要尊崇您圣名 + 在至高处 + + + + 愿那灵火复兴我 + + 愿那复兴我的灵火 + 重新再来一次复兴我 + + 起初的信心何处失落 + 我愿悔改重新再得着 + 在明媚的春光里 + 在幸福的生活中 + 我们陶醉 我们欢乐 + 早把主恩典忘记 + 愿那复兴我的灵火 + 重新再来一次复兴我 + + 起初的希望何处失落 + 我愿悔改重新再得着 + 在稳妥的事业里 + 在迷人的笑声中 + 我们游戏 我们沉迷 + 早把主恩典忘记 + 愿那复兴我的灵火 + 重新再来一次复兴我 + + 起初的爱心何处失落 + 我愿悔改重新再得着 + 在艰苦的岁月里 + 在百般的试炼中 + 我们祷告 我们儆醒 + 毋把主恩典忘记 + 愿那复兴我的灵火 + 重新再来一次复兴我 + + 起初的信望爱何处失落 + 我愿悔改现在就得着 + + + + 众人涌进主的国度 + + 众人涌进主的国度 十架少人负 + 众人争夺主的赏赐 世界有谁辞 + 人虽无心走主道路 仍想主祝福 + 人虽无心走主道路 仍想主祝福 + + 众人都慕得主荣耀 羞辱少人要 + 众人都爱同主掌权 损失有谁愿 + 几乎无人因主缘故 看万事如土 + 几乎无人因主缘故 看万事如土 + + 众人都想同主高贵 卑贱却都畏 + 当主凡事为他预备 他就大赞美 + 当主稍为求他一点 就立发怨言 + 当主稍为求他一点 就立发怨言 + + 但那诚实爱主的人 祸福都不问 + 就是他们宝贵心血 也愿为主舍 + 求主给我这样心志 赤忠忘生死 + 求主给我这样心志 赤忠忘生死 + + + + 耶稣是我的知心友 + + 耶稣是我的知心友 祂知道我深透 + 细心带领我向天路走 祂牵扶着我手 + 我向祂倾诉我忧与愁 我信祂必去困忧 + 永记祂因我将宝血流 我灵得拯救 + 耶稣是我的知心友 明我祈求或苦与忧 + 神到处将我施恩救 慈爱永远伴我走 + + 在这世界道路多歧途 谁明白我主恩高 + 曾为我要被死煎与熬 神奇恩我仰慕 + 我向祂低首向祂渴求 + 要带福音往远处走 愿我一生一世跟主脚步 + 完成主使命 + 愿这福音恩光遍地球 为人所接受 + + + + 十字架的道路要牺牲 + + 十字架的道路要牺牲 要将一切献与神 + 要放一切在死的祭坛上面 火才在这里颢现 + + 当我们唱诗祷告时候 何等愿说献所有 + 但是前面有更重的十孛架 有更艰难的生活 + + 你要变节或忠心到死 让一切完全损失 + 直等到永活主的丰盛生命 天天充满在你灵 + + 我们的得失并不要紧 神的旨意当留心 + 我们若将万事都看如粪土 主才不会受拦阻 + + 这是十架道路 你愿否走这路 + 你曾否背十架为你主 + 你这奉献一切给神的人  + 你对神是否全贞 + + + + 我要建立一群大子民 + + 我要建立一群大能子民 + 一群充满赞美的子民 + 他们要靠我灵来往此地 + 并要荣耀我宝贵的名 + + 主啊 兴起 建立教会  + 使我们靠您坚固 + 成为合一 您的肢体  + 在您爱子的国度 + + + + 万国啊,你们都当赞美耶和华 + + 万国啊,你们都当赞美耶和华 + 万民哪,你们都当颂赞祂 + 因为祂向我们大施慈爱 + 耶和华的诚实存到永远 + 你们要赞美耶和华 + + + + 圣灵我们真欢迎您 + + 圣灵我们真欢迎您 + 圣灵我们真欢迎您 + 求您圣火焚烧我们 + 如今我们放下世上所爱 + 举双手深深渴慕您 + 亲爱圣灵 我们欢迎 + 亲爱圣灵 欢迎您来 + + 圣灵我们真欢迎您 + 圣灵我们真欢迎您 + 愿您奇妙同在颢明 + 将您心意教导您的儿女 + 顺从您跟从您引导 + 亲爱圣灵 我们欢迎 + 亲爱圣灵 欢迎您来 + + 圣灵我们真欢迎您 + 圣灵我们真欢迎您 + 愿您旨意今日成全 + 在我身上完成新的工作 + 降服您毫无保留 + 亲爱圣灵 我们欢迎 + 亲爱圣灵 欢迎您来 + + + + 三一神 + + 三一神 我要深爱您 + 您就是我生命的根源 + 逆或流 您会牵我手 + 我必定会永远忠于您 + + 每一天我必会思念您 + 要伸出手来紧握您的手 + 我要敞开我的心门 + 让您来观看 + 因您就是我生命的密友 + + + + 当我感觉到 + + 当我感觉到您手触摸我的生命 + 您使我唱出这首歌 + 主啊我爱您 + 在我灵深处 我给您唱出这首歌 + 您是我王 您是我神 + 主啊我爱您 + + + + 合而为一 + + 凡事谦虚温柔忍耐 + 用爱心相宽容 + 凡事谦虚温柔忍耐 + 用和平彼此联络 + + 竭力保守圣灵所赐 + 合而为一的心 + 竭力保守圣灵所赐 + 合而为一的心 + + + + 大奋兴 + + 神啊愿您浇灌从前所应许的圣灵 + 让您婢仆子女传您话语好信息 + 重新复得异象 能明白主心里所思 + 如今信心高升 同跟诸天宣告天国渐临近 + + 求使万国领受从前主应许的圣灵 + 愿主显出光辉 列邦对主敬畏 + 尘世被您震撼 能力彰显的一刻 + 穷苍现正等待 神您属天之国今正渐临近 + + 主快要兴起归祂的百姓 + 我信这国度快经祂所赐奋兴 + 主快要兴起归祂的百姓 + 寻找祂的就必见主救恩的彰显 + + + + 主您的慈爱 + + 主您的慈爱 比生命更好 + 主您的慈爱 比生命更好 + 我要用嘴唇来赞美您 + 因您的慈爱比生命更好 + + 我要奉您名 来举起我手 + 我要奉您名 来举起我手 + 我要用嘴唇来赞美您 + 因您的慈爱比生命更好 + + + + 在幔子里 + + 在幔子里 我今来到 + 站在圣所里 我要瞻仰您面 + 见到您极美丽 + 没有可与您比我敬拜您 + 哦主在幔子里 + + + + 面对世界 + + 必将真理告诸世上 + 然后世上人才逐渐领悟 + 逃避世情 难望有成 不可以否认 + 必将真爱施于世上 + 然后世上人能彼此分享 + 神为世人 流尽血汗 不可祇靠讲 + 谁愿去 谁人愿去 将真理体现 + 谁愿意 谁人便要 经世界考验 + 必须使世间可领会  + 然后福音方有实在意义 + 能面对神 能面对人 此刻要实行 + + 想当初奋兴的教会 + 常视世上人为服务对象 + 盐在世上 才是有用 古今也一样 + 将真心献给主以后 + 仍旧要为别人尽责任 + 谁若爱神 谁便要能 分享主爱心 + 谁愿去 谁人愿去 将真爱体现 + 谁愿意 谁人便要 经世界考验 + 必须使世间可领会  + 然后福音方有实在意义 + 能面对神 能面对人 一起去实行 + + + + 感谢耶稣 + + 感谢耶稣 因您爱极深 + 感谢耶稣 您恩典广大 + 扬声歌颂主您圣名 + 赞美又赞美不停 + 您是我的一切 + 您是我主 + + + + + 将心给我 + + 假若我有无限智慧 + 我甘弃主脚下 + 假若我有财物满贯 + 我交给主手中 + + + 我愿这生献呈为您 + 愿明白您心意 + 不用献我财物智慧 + 将心给我 + + + + 人算什么 + + 耶和华我们的主 + 您的名在地何美 + 您将荣耀彰显于天 + 将荣耀彰显于天 观看您所造的天 + 所摆设月亮星宿 + 观看您指头所造的天 + 所设的月亮星宿 + 便说人算什么 + + 您竟顾念他 他算什么 + 他比天使微小一点 + 您赐他荣耀冠冕 + + 耶和华我们的主 + 您的名在地何美 + 您将荣耀彰显于天 + 将荣耀彰显于天 观看您所造的天 + 所摆设月亮星宿 + 观看您指头所造的天 + 所设的月亮星宿 + 环顾宇宙万物何广阔 + 试问人算什么 + + + + 我敬拜您 + + 当我转眼仰望您的圣洁 + 看见您面上荣美慈容 + 当我世俗的忧虑在您面光中得消散 + + 当我伸出手来触摸您心 + 您的喜乐涌进我心灵 + 当我世俗的忧虑在您面光中得消散 + + 我敬拜您 我敬拜您 + 我生命之意 是要敬拜您 + 我敬拜您 我敬拜您 + 我生命之意 是要敬拜您 + + + + 环绕 + + 你问我帮助从何而来 + 从造天地万物主而来 + 众山怎样环绕耶路撒冷 + 神照样环绕祂百姓 + + 环绕 环绕 像众山环绕祂百姓 + 环绕 环绕 从今时直到永远 + + + + 为主歌唱 + + 为主歌唱 颂赞声响四方 + 高举主爱 齐来献上这歌 + + 让我赞美您唱歌向您颂扬 + 唱一生主救恩 + 我赞美您唱歌向您颂扬 + 同来共和唱 + + + + 单一的主 + + 神造出这天地一切 + 在世间显出祂尊荣 + 神造出这天地一切 + 在世间显出祂大能 + + 那里会有阻挡祂的苦困(不会不会) + 怎可使祂心里也觉困难(不会不会) + 奇妙主多么伟大 + 万物也声称主的力量 + 心中赞美 满有创造权能 + 矜夸诸天单一的主 + + + + 像天空的鸽子 + + 神造出这天地一切 + 在世间显出祂尊荣 + 神造出这天地一切 + 在世间显出祂大能 + + 那里会有阻挡祂的苦困(不会不会) + 怎可使祂心里也觉困难(不会不会) + 奇妙主多么伟大 + 万物也声称主的力量 + 心中赞美 满有创造权能 + 矜夸诸天单一的主 + + + + 像天空的鸽子 + + 哦主耶稣为您自己的荣耀 + 我在这里求您差遗 + 我愿您使我成为福音的使者 + 传十字架永恒不变的爱 + 为传扬您天国和平的佳音 + 使我成为传福音的鸽子 + 向那些忧伤困苦的人们 + 传主喜乐平安的信息 + + + + 主爱大能 + + 在您慈恩里 愿让我更新改变 + 今将心献上 到达神宝座 + 但我确知道 现在我终可夸胜 + 心中的一切软弱 全凭主爱大能 + + 抱紧我 您爱常在我身边 + 愿使我 紧紧去靠近您 + 我展翅如鹰一般的高飞 + 因深知祂爱我 听我每次祈求 + 扶持我向前行 + + + + 感谢主 + + 感谢主 因您每一天的看顾 + 给我恩典何等丰富 使我心稳固 + 感谢主 因您每一天的引导 + 给我信心奔走天路 使我心爱慕 + + 亲爱救主让我亲近您 + 让圣灵掌管我生 + 让您的慈爱吸引我来跟随您 + 亲爱救主让我亲近您 + 将荣耀归与您名 + 让我的一生交托在主您手里 + + + + 我们是您的百姓 + + 我们属于您 都是您的百姓 + 我们正呼求您 宣扬您的圣名 + 在这黑暗的世代 您召我们发光 + 当我们寻求您面 主啊显您大能 + + 建立您教会 来医治这地 愿您国度降临 + 建立您教会 来医治这地 愿您旨意成全 + + + + 圣哉圣洁的羔羊 + + 圣哉圣洁的羔羊 祂是那自有永有的神 + 我的救赎主活着 有一天我必能像祂 + + 啊荣耀哈利路亚 我要赞美祂圣名 + 从捆绑中得释放 使我得以自由 + + + + 主,我心寻求您 + + 主 我心寻求您  + 因只有您能够满足我心 + 跪下 寻见您面  + 当我的心亲近您 + 将我爱献给您 + 将我心献给您 + 将生命献给您 + + + + 祂为我们的过犯受害 + + 那知道祂为我们的过犯受害 + 为我们的罪孽压伤 + 因祂受的刑罚 我们得平安 + 因祂受的鞭伤得医治 + + 因为我要将水浇灌口渴的人 + 将河浇灌干旱之地 + 我要将我的灵浇灌您的后裔 + 将我福浇灌您的子孙 + + + + 主占据心中 + + 今天得享主赐义袍保守荫庇 + 主的恩惠在心中 在心中 + 今天靠我主的宝血抹去过错 + 基督会进入我心 入我心 + 多么欢欣得知天父爱我救我 + 将主基督来赠我作礼物 + 当祂望着今天的我 + 恩主占据心中 再没自我 + + + + 活着,活着 + + 活着 活着 + 永永远远活着 + 我主耶稣 + 活着 活着 + 直到永远 + 活着 活着 + 永永远远活着 + 我主耶稣 + + 活着 唱哈利路亚 + 唱哈利路亚 我主耶稣 + 活着 直到永远 + 唱哈利路亚 唱哈利路亚  + 我主耶稣 活着 + + + + 我的神啊!您作王! + + 我的神 我要歌唱我的主 + 我要欢呼 因您是创造诸天的真神 + 我的神 我要歌唱我的主 + 我要欢呼 因您以公义审判这全地 + 我高歌 因您当受大赞美 + 我宣扬 宣扬您奇妙作为 + 主作王 我要歌唱 + 主作王 我要歌唱 + 在列邦 我要宣告主作王 + + + + 靠主前航 + + 耶和华是我的主我的王 + 有了祂内心充满盼望 + 就算漫天风暴 海边翻起千尺浪 + 不畏缩随目标向前航 + + 耶和华是我的主我的王 + 有了祂内心不会彷徨 + 就算遇到挫败 斗志依样激昂 + 紧靠祂朝目标向前航 + + + + 全赖您爱在心中 + + 沿路遇到挫败失意 恳请您安慰 + 如同遇上恶浪 主啊您导航 + 沿途常困恼痛苦悲伤 请亲手牵引 + 风雨内抹掉迷惘上路途 + + 遇到的试炼 全赖您爱在心中 + 渡过的路途 全赖您爱牵紧我手 + 长长夜里我困乏 得到主亲手引牵 + 紧握我手 指引路向 + + 遇到的困惑 全赖您爱在心中 + 暴雨打脸上 云雾里您牵紧我手 + 红红泪眼挂脸上 主分担种种痛楚 + 此刻痛苦 帮我渡过 + + + + 主,您本为大 + + 主 您本为大 + 当受极大赞美 + 在我们神至圣城中 + 愿全地都喜乐 + + 主 在您里面我们己有权柄 + 能战胜黑暗众仇敌 + 今向您来敬拜 + + 主 我们高举您至圣尊名 + 主 我们何等感谢 + 因您为我成就大事 + 主 我们信靠无比大爱 + 主 惟有您是永远上帝 + 您圣名在天地之上 + + + + 一无挂虑 + + 应当一无挂虑 抛开心头的担 + 凡事借着祷告 尽诉心意 神在听 + 应当一无挂虑 主的恩慈不变 + 危难亦在看顾 长路伴我走过 + + 应当一无挂虑 心中恳求之际 + 神在默默应允 为我指引 前路里 + 应当一无挂虑 即使所求不见 + 仍末绝望沮丧 前路定有旨意 + + 上帝的祝福恩待 纵是疑难仍必越过 + 仰望神 今天不再惊怕 + 面对前途迷离不定 仰赖祈求信心渡过 + 靠着神 每日面对挑战 + + + + 在我心只想您 + + 在我心只想您 常在我思想意念全是您话 + 没法抛开舍弃 昼夜藏在内心念记 + 诚心愿意遵守主说话 愿紧记服从真理 + + 神话是永恒 赐给我生命 + 心中只爱慕您 心中只爱慕您 + + + + 耶稣只有您配得受荣耀 + + 耶稣只有您配得受荣耀 + 只有您配得受我赞美 + 只有您配得受我的尊崇和仰慕 + 因您是那至高王之王 + + 赞美您的圣名 + 赞美您奇妙的名 + 我要敬拜您主 直到永永远远 + 用赞美高举您名 + 我用赞美高举您名 + + + + 神是我们的神 + + 听啊以色列 神是我们的神 + 听啊以色列 主是独一的主 + + 你要尽心 你要尽性  + 你要尽意 你要尽力 + 你要爱你主你神 + 要爱主你的真神 + + + + 赞美主耶稣齐欢呼 + + 赞美主耶稣齐欢呼 + 赞美主耶稣齐欢呼 + 赞美主耶稣齐欢呼 + 赞美主耶稣齐欢呼 + + 祂复活了 祂复活了 + 直活到永永远远 + 祂复活了 祂复活了 + 齐来向祂欢呼 + 因祂已战胜了死亡 + + + + 主耶稣您慈爱的真光 + + 主耶稣您慈爱的真光 + 要照亮于黑暗世界 + 耶稣您是世上的真光 + 您的真理使我们得着自由 + 照亮我们 照亮世间 + + 耶稣是光 父神荣光要充满全地 + 求您灵火 燃点我们心 + + 恩典怜悯 如江河涌溢流到万邦 + 耶稣真道 如光照亮全地 + + + + 您是荣耀的君王 + + 您是荣耀的君王 您是和平之子 + 您是天地万有主宰 惟有您圣洁公义 + 天使都向您跪下 敬拜尊崇您 + 因为在您有永生之道 您是主耶稣基督 + + 和撒那归于戴维的子孙 + 和撒那归于万王之王 + 愿荣耀归于至高神  + 耶稣是弥赛亚 + + + + 您宝血 + + 您宝血使我洁净 您宝血使我重生 + 因代替了我 成全那救赎的献祭 + 洁净我 比雪更白 雪更白 + 我耶稣 神宝贵的献祭 + + + + 祂是平安 + + 祂是平安 所有围着祂已拆毁 + 祂是平安 祂是平安 + 将忧虑交托祂 祂必看顾你 + 祂是平安 祂是平安 + + + + 主!我高举你的名 + + 尽献心中的赞美 让我高举主您圣名 + 是您牺牲拯救我 在这生中居我心里 + + 您从天上降世间 指引我路 + 在世间被钉十架 我罪得赎 + 从十架到坟茔 从坟茔升回天 + 主我高举您的名 + + + + 倚靠耶和华 + + 若非耶和华建造房屋 + 建造的人就枉然劳力 + 若非耶和华看守城池 + 看守的人就枉然儆醒 + + 我行若非神所悦 一切将拆毁 + 我做若非神祝福 一切都将枉然 + 我所需要持守的 只是一颗心 + 一颗完全相信的 坚定倚靠的心 + + + + 献上活祭 + + 我心切切渴慕您主 我要紧紧跟随您 + 您恩典与慈爱永无止息 您信实直到永远 + 我王我的神 因您奇妙圣名 献上我的赞美 + + 我心深深向您敬拜 我灵渴慕您荣光 + 我完全相信您宝贵应许 我在您怀中安息 + 我要向世人歌唱您的恩典 直到我见您面 + + 耶稣 主耶稣 求用我一生 + 耶稣 主耶稣 求用我一生 + + + + 那在我里面的 + + 因那在我里面的 比那在世界的更大 + 因那在我里面的 比那在世界的更大 + + 因此我扬声欢呼歌唱 圣灵住在我心 + 永活真神基督已得胜 我们靠祂一同得胜 + + 死亡阴间罪恶的权势 粉碎在祂脚前 + 荣耀尊贵的君王耶稣 超乎万名之上的名 + + + + 在耶稣里 + + 在耶稣里 我们是好朋友 + 在耶稣里 我们是好朋友 + + 在耶稣里 我们是好朋友 + 从今时一直到永久 + 在耶稣里 我们是好朋友 + + + + 同颂庆主恩典 + + 同颂庆主恩典 救主深恩今已彰显 + 赐与新生的爱 全属我们 + 王啊我要高歌 您赐深恩使我要高歌 + 欢呼歌声全献给您 高声欢庆颂赞 + + 同来共 Celebrate  Celebrate + 欢呼都归您 欢呼都归于我的主 + 同来共 Celebrate  Celebrate + 欢呼都归您 欢呼都归于我上帝 + + + + 圣灵请您来 + + 圣灵请您来 以此作居所 + 我们同心唱 求您与我们同在 + 圣灵请您来 光照我的面 + 以您恩爱充满我 圣灵请您来 + + + + 欢欣 + + 欢欣 心里感谢神 歌唱归于圣父 + 赞颂 您赐下慈爱 独生的爱子 + 欢欣 心里感谢神 歌唱归于圣父 + 赞颂 您赐下慈爱 独生的爱子 + 今天 心中刚强无惧怕 + 主的丰盛满一生 皆因主手曾为我显深恩 + 今天 心中刚强无惧怕 + 主的丰盛满一生 皆因主手曾为我显深恩 + 赞美 + + + + 惟有您 + + 惟有您 惟有您 惟有您是我所爱 + 惟有您 哦主我王 我愿更认识您 + + 我全心 我全人 都向您深深敬拜 + 圣洁 圣洁 尊贵尊贵之主 + 我爱您耶稣 + + + + 以赞美为祭 + + 我们来到神的家 以赞美为祭献给祂 + 我们来到神的家 以赞美为祭献给祂 + + 我们以感恩为祭 因您配得尊贵和荣耀 + 我们以感恩为祭 因您是万王之王 + + + + 我以祷告来到您跟前 + + 我以祷告来到您跟前 我要寻求您 + 我要站在破口之中 在那里我寻求您 + + 主我是软弱及无助 您却是我的力量 + 以您亲切的手引导我 那就是我的得胜 + + 每一次我祷告 我摇动您的手 + 祷告做的事 我的手不能做 + 每一次我祷告 大山被挪移 + 道路被铺平 使列国归向您 + + + + 主啊您创造我 + + 主啊您创造我 用您爱充满我 + 舍生命从死里救赎我 + 主啊您创造我 用您爱充满我 + 舍生命从死里救赎我 + + 我要赞美您 敬拜和仰慕您 + 我要赞美您 宣扬您的名 + 我要赞美您 敬拜和仰慕您 + 我要赞美 赞美主 + + + + 神的灵兴起我 + + 我能够看见 您的圣洁 + 在这地寻找到您 + 我张开双手 来接受您爱 + 在脸上见您彰显 + + 神您的灵兴起我 + 神您的灵兴起我 + 再充满我用您爱  + 用您的灵 + + + + 兴起以色列的子民 + + 兴起以色列的子民 向创造主高声赞美 + 来跳舞欢呼歌颂 欢呼歌颂 欢呼歌颂 噢以色列 + + 兴起以色列的子民 向创造主高声赞美 + 来跳舞欢呼歌颂 欢呼歌颂 欢呼歌颂 噢以色列 + + 神是我的光 祂是我救恩的盘石 + 我还怕谁 我要信靠祂 + + 哦以色列 + + + + 万国都要来赞美主 + + 万国都要来赞美主 万民都要来赞美主 + 敬拜耶和华唱诗来向祂欢呼 + 赞美耶和华万民都快乐欢呼 + + 敬拜赞美耶和华 凡有气息都要赞美祂 + 敬拜耶和华 赞美耶和华 + 我们活着是为要敬拜赞美祂 + 我们活着是为要敬拜赞美祂 + + + + 您的恩典够我用 + + 您的恩典每天够我用 + 纵有困难也不会逃避 + 有你与我一起 我还惧怕甚么 + 赐我勇气去改变自己 + + 噢 耶稣 耶稣 + 奉献一生 皆因最爱是您 + 为了您 愿将一切抛弃 + 耶稣 为要得着您 + + + + 来啊!我们要向神歌唱 + + 来啊 我们要向神歌唱 + 来啊 我们要向神歌唱 + 向拯救我们的盘石欢呼 + 我们要来感谢祂 用诗歌向祂欢呼 + + + + 我要敬拜 + + 我要敬拜 我永活的真神 + 唱出赞美 颂赞声 + 您创造了诸天 并建立了大地 + + 我要敬拜 因为您荣耀彰显于天 + 我要赞美 您的信实遍达全地 + 您是我神 我只敬拜您 + + + + + 扬声欢呼赞美 + + 扬声欢呼赞美 称颂我的王 + 高声颂扬欢唱 哈利路亚 + 来到主宝座前 尊崇赞美祂 + 我们欢呼喜乐 来到神的面前 + 您是创造主 您施行拯救 + 您已救赎我 您是主 最大医生 + 您是丰厚盛之主 您是我的牧者 + 引领我 耶稣我君王 我赞美您 + + + + 主啊!您的温柔 + + 主啊 您的温柔  + 溶掉我所有苦涩 + 主啊 我接受您爱 + 主啊 您的慈爱 + 改变我所有丑恶 + 主啊 我接受您爱 + 主啊 我接受您爱 + 主啊 我接受您爱 + + + + 天地赞美 + + 地与海奏出歌韵 + 盘石唱赞美歌声 + 风雨电也歌颂 云雾同颂吹送 + 全地奏响声势无比 + + 颂赞声永不衰竭 + 全地要敬拜事奉 + 高唱万有之上 荣耀无限之处 + 全属我主尊贵耶稣所有 + + 让赞美如风天空海阔飞 + 让赞美浪花般海中溅起 + 高唱万有之上 荣耀无限之处 + 全属我主尊贵耶稣所有 + + + + 让我仰望您 + + 齐声颂赞 神真美好  + 全因您手所施之工 使我欣慰 + 全我属您 凡我这生盼望 + 我交于您手中 + 一生宣认 我爱主不变 + 我要永远将我爱慕献给您 + 一生宣认 我爱主不变 + 我要永远将我爱慕奉与您 + + + + 您是弥赛亚 + + 颂赞主 颂赞主 高声欢唱  + 让我举起手来宣称主圣名  + 颂赞主基督 甘牺牲前来救罪人  + 您是弥赛亚 我主我上帝  + + 神大能今彰显恩典  + 丰富深厚天天都可见  + 愿意谦卑屈膝俯伏您面前  + 颂赞主基督 甘牺牲舍己救万民  + 您是弥赛亚 我主我上帝  + + + + 求主赐复兴之火 + + 求主赐复兴之火 + 求主赐圣灵火焰 + 燃烧教会 能得无穷力量 + 在这黑暗世代 能作您光辉 + 熔解冷漠 重点爱您的心 + 盼主赐下复兴之火 + + + + 相知 + + 恳求上帝祝福你 盼主的爱常在你里头 + 虽疲累也为你代求 你我的好战友 + + 明白我困乏 体恤我软弱 + 与你分忧 从没有怨尤 + 同踏上窄路 走到尽头 与你一起奋斗 + + + + 您是王 + + 神您极伟大 万有都归您  + 主宰一切 您是王  + 尊贵主 我景仰  + 屈膝您前 让我颂赞您 + + + + 大祭司 + + 大祭司打开 幔子的阻隔 + 今进主的圣殿 屈膝敬拜 + 颂赞天国君 为救赎灵魂 + 一次将心献奉 舍己献祭 + + 赞美您成就 完美圣洁活祭 + 恩典永存赦罪大能力 + + + + 祂是主 + + 祂是主 祂是主  + 祂是胜过死亡又复活的主 + 万膝当跪拜 万口当承认  + 耶稣基督是主 + + + + 我已被赎回 + + 我已被赎回 借着羔羊的血 + 我已被赎回 借着羔羊的血 + 我已被赎回 借着羔羊的血 + 圣灵充满在我心 + 我罪全被赦免 + 藉羔羊的血 + + + + 您许可 + + 挫折有您许可 要让祝福漫过 + 至死痛楚 要将生命加多 + 您破碎我一切 却换上更多恩惠 + 荣耀路径必有泪涕 + + 谁肯放弃自救 才将救恩识透 + 葡萄被压才得释放 酿出新酒 + 人生到了绝处 才知道爱的深处 + 才能盛载神恩丰满倾注  + + + + 全心敬拜 + + 全心敬拜 全心歌唱 高呼您全能  + 全心敬拜 全心歌唱 和平在您的手中  + 崇敬感恩 来自我的心底  + 全心敬拜 全心歌唱 专一爱着您 + + + + 神恩 + + 神恩像无限星海 主爱烙印于心土 + 困乏垂怜加添安慰 解开众罪捆锁 + 神恩像无尽碧海 主爱永记于心内 + 软弱全然我坚壮 送给眷佑指引 + + 耶稣无限爱在身旁 令我心中铭感 + 为爱悬十架基督救赎恩情 使我不禁凝泪 + 神恩像明媚朝阳 温暖我这心冰硬 + 有若黎明初升光线 送走昨夜黑暗 + 有若黎明初升光线 送走昨夜黑暗 + + + + 侍立赞美 + + 万有都不可与您相比拟 您真高超奇妙 + 耶稣亮丽远超于言辞 更非俗世所知 + 不可计算是您不止的爱 主的智慧没法可测透 + 万有都不可与您相比拟 君尊也永远属您 + + 全能主今我侍立向您 全心惊叹侍立赞美 + 颂扬声归于配得的您 尽献倾慕向您 + + + + 同心聚集 + + 同心聚集且一起高声唱 + 愿彼此谦卑一起崇拜祂 + 齐来献上赞美与歌唱 + 彼此相爱 愿聚集在此一同高声唱 + + + + 我心尊主为大 + + 我心尊主为大 我心尊主为大 + 我灵以我神 以我的主为乐 + 我心尊主为大 我心尊敬您 + + + + 主爱同在 + + 来同颂 颂主爱 + 爱歌传偏万里长 + 满是荣光 遍达穹苍 + 来同颂 颂主爱 + 爱心燃遍万里长 + 赞颂同声 万民和应 + 山呼海应天军天使开口唱颂赞歌 + 高声宣告您是神万代神活在我心 + + + + 赞颂父权能 + + 欢欣敬拜 全为父您大有权能  + 凭着您藉爱子救我灵魂赐新生  + 诸天敬拜 全然述说父您大能  + 来吧 宇宙众星讴歌高唱您深恩  + + 愿父您的天国福音 冲破黑暗 恩光永相近  + 众子靠赖救主 一起高唱上帝恩  + 愿荣耀充满天空 充满心中 全凭您权能  + 成就永活救恩 您是大能神  + 您是大能神 您是大能神 + 您是大能神 赞颂父权能 + + + + 敬拜上帝 + + 来敬拜上帝 来赞美上帝 + 荣耀至尊彰显于世间 + 来敬拜颂赞 全圣洁上帝 + 完备救恩千载到万世 + + 万口赞奇妙 称颂您 + 创造大能遍宇宙穹苍 + + 来敬拜上帝 齐献上活祭 + 传颂我主恩典到万世 + + + + 献身坛上 + + 神啊 我全心降服 + 无畏窄路献身坛上 + 怜悯我这生 此际求神用我 + 倚靠着圣灵每刻导引 + + + + 主啊!来用你的爱充满我们 + + 主啊 来用你的爱充满我们 + 主啊 来用你的爱充满我们 + 因我们的心如器皿 + 带到活水江河前 + 主啊 来用你的爱充满我们 + + + + 别放弃 + + 用信心 不必灰心 不必放弃 + 毋惧怕 抛开心中顾虑 + 用信心 安心交托 心中永记 + 救主基督深爱你 + + + + 您让我生命改变 + + 您恩典丰富极深厚 每天保守 + 每一刻供应是足够 夜深和白昼 + 颂赞您 让我生命改变 每刻在引牵 + 颂赞您 万世千载不变 身心皆奉献 + + 您施恩普世像天雨 倾福于世间 + 细心的把我在看顾 关心无间 + 颂赞您 让我生命改变 爱心日倍添 + 愿靠您 面对新的挑战 身心皆奉献 + + + + 永约的神 + + 信是我这生寻着您的应允 + 是永生的源头方向 令我生命更新 + 心愿意一生顺服您的指引 + 伴我一生同行 冲破危难困忧 + + 神已立约 倾出祂恩惠 并祝福我一世 + 神已立约 显彰祂的爱 并宽恕我一切 + 和您立约 愿跟主方向 愿遵守您管教 + 齐颂赞主 永活全能 信实无穷 + 千载百世 不变更 + + + + 祂等待你 + + 知不知此际耶稣 正到你面前在等 + 祂想此际能与你 同渡着这刻 + 可否将心里门开启 邀请祂进入心中 + 祂可将心里愁困 全然变做安慰 + + + + 陶造我一生 + + 因祂牺牲告别痛悲 令我惊叹爱是多完美 + 耶稣谦卑 权柄抛弃 遭逼迫鞭打替我死 + 因祂首先献尽真爱 令我愿去爱且去被爱 + 离开罪捆绑 我灵得到释放 从此基督爱内安躺 + + 陶造我一生 为我开出路与指引 + 祈求神今天倒空我 能摆脱怯懦 + 我愿委身一世为您歌 + 陶造我一生 旧我消失别了黑暗 + 有日软弱 盼望您能 提醒我当天因您振奋 + + + + 主必应允 + + 神您本良善信实 神您乐意饶恕我罪  + 在您有无限量的爱 凡求告您的必会得您怜悯  + 神您本良善信实 神您乐意饶恕我罪  + 在您有无限量的爱 凡求告您的必会得您怜悯  + + 求主现听我呼求 垂听我恳切的祷告  + 无论现我遇是何境况 每当我向您祈求  + 神啊 您必应允  + + 求主现听我呼求 垂听我恳切的祷告  + 无论现我遇是何境 我定会向您祈求  + 神您必会应允 + + + + 颂赞您Hallelujah + + 感激基督带领 恩典赐予我未停 + 日日服事主 我心欢喜 + 让赞美声跨千里 要唱唱唱莫停 + Hallelujah + 颂赞您Hallelujah + 称赞您Hallelujah + Hallelujah + + + + 神坐着为王 + + 神啊我要一心称谢您 + 神啊我要高举您圣名 + 我要因您欢喜快乐 + 至高的主啊 您荣耀使我心歌颂您 + + 驱黑暗留住美 + 借着神重拾爱 + 齐心祷告以真诚 + 藉主夸胜 + + 要颂扬神是爱 要颂扬神是美  + 燃点真爱发光茫  + 宣告我主坐着为王  + + 就算翻起千般骇浪  + 主必会为我掌舵  + 每日随时乘风破浪  + 乐道主的凯歌  + + 要颂扬神是爱 要颂扬神是美  + 燃点真爱发光茫  + 宣告我主坐着为王 + + + + 静候恩主 + + 静候恩主 万念敞开 + 神独您照我心深处 + 像阵清风 透我心窝 + 除掉往昔的损我 + + 主请您进入 我心里面 + 解开我扰困 彰显您大能 + 更新我里面 赐我美善 + 藏在我的心不变 + + + + 因主的名 + + 造物主 今高唱您名字 + 和平之君得胜者 + 地上古今的君王 + 也折服于您面前 + + 造物主 今高唱您名字 + 全能之主安慰者 + 全凭主恩典怜悯 + 令我满心温暖 + + 全因主的圣名 + 劳苦可得安静 + 行走于孤单困惑里面有主倾听 + 全因主的圣名 + 愁心可得欢乐 + 祈祷的必得胜 + 我以性命来做证 + + + + 不可能的您 + + 在人不能 在您凡事都能 + 在人不能 在您凡事都可以 + 皆因您 超过世人能预计 + 皆因您 原是全能的真神 + + 不可能的您 有着不可能的大能 + 用不可能的心思 管理着地球 + 不可能的您 有着不可能的恩典 + 用不可能的祷告 成就不可猜想的一切 + + + + 当亲近神 + + 当亲近神 祂也必亲近你 + 当亲近神 祂也必亲近你 + 举起双手歌唱 赞美祂的作为 + 打开心门向祂赞美 来赞美祂 + 当亲近神 祂也必亲近你 + 当亲近神 祂也必亲近你 + + + + 全因为您 + + 常言道 人生像演戏 + 回看 这生精彩因有着您 + 人在世永恒何在 或如流星闪耀掠过 + 是您令我人生找到靠依 + + 死荫幽谷中您伴我过渡 + 欢欣里 风光里 您共我同在 + 当身处孤单伤痛 来拥我入怀 + 您是我神 是我奇妙救恩 + + 全因为您 令我一生都佳美 + 您令我生命从空虚化做传奇 + 无论我壮如红日 或如黄昏般渐渐老 + 是您令我如鹰般高飞 + + 全因为您 令我一生都佳美 + 您令我生命从空虚化做传奇 + 唯独您 是我拯救 我总不至死 + 直到永远 从心底赞美 + 唯独您 是我拯救 我总不至死 + 直到永远 从心底赞美 + + + + + 我的一生 + + 昔日 玩笑不懂事 + 带点土气 这傻孩子 + 沉默好学爱心真挚 + 从不会伤心失意 + 怕束缚 独爱一身粗布衣 + + 长大 越觉不懂事 + 天真洒脱 太像孩子 + 仍旧好学爱得真挚 + 如今懂伤心失意 + 要冲破自我 小子要展翅 + + 今日 述说多惊异 + 主的看顾 靠近孩子 + 让我决定爱主真挚 + 由衷感激祂心意 + 要一世奉献 倾出我恩赐 + + 旧事旧人随岁数迁移 + 欢笑可记两三事 + 怀念最深 数那恶梦痛伤事 + 辛酸苦涩尝过无限次 + 今我述说太容易 + 追想从前 一切全赖有主您扶持 + 一切全赖有主爱 + 现实纵然残酷求立志 + 风雨让我当闲事 + 因您同行 给我无限壮志 + 愿这生更合您意 + + + + 我的心寻觅您 + + 我的心寻觅您 我的心亲近触摸您 + 灵得苏醒 深尝大爱 + 灵恩涌现 情义心中载 + + 主我深深感到 您的拯救 + 释放解决心里罪恶捆绑 + 给予更新改变 与复兴的能力 + 全意献上心底爱情 + 全意献上爱的拥抱 + 全意献上衷心赞祷 + + + + 来!高声唱 + + 来高声唱 来高声唱 + 让我们来赞美尊崇大君王 + 来高声唱 来高声唱 + 让我们来赞美尊崇大君王 + + 惟有祂配得赞美 因祂是主 + 昔在今在快来君王 + 万膝要跪拜 万口都要承认 + 祂是耶稣 祂是耶稣 + 祂是主耶稣基督 + + + + 我要赞美耶和华 + + 祂居在我心里 祂活在我心里 + 愿更能认识您 求接纳我祷告 + 祂赐下独生子救赎人 + 祂的恩典让我称义 + 用尽我一生来感谢您 + 凡有气息都赞美祂 + + 我要赞美耶和华 我要赞美耶和华 + 在圣殿赞美祂 在圣殿赞美祂  + 祂创造穹苍 显大作为 + 祂的伟大没法测度 + 用尽我心来称谢您 + 凡有气息都赞美祂 + + 赞美 赞美 赞美耶和华 + 敬拜我主 举起双手 + 哈利路亚 赞美耶和华 + + + + 有谁能像您 + + 有谁能像您 耶稣只有您能感动我心 + 永永远远再难寻找得到耶稣 有谁能像您 + 您深恩似江河水涌流 医治从您而来 + 苦痛者在您怀里得安息 有谁能像您 + + + + 您的爱 + + 谁能似您为我可牺牲一切 为我安排 + 这美好生命光辉 在十架显明 + 恩惠与真情 能让我安宁 + 指引我路程 天父愿您知道 + 我的生命全凭您得胜 + + 是您的爱 令我心灵得欢乐 + 共那信心去面对将来 + 人生虽然充满阻碍 前路您会为我开 + 是您的爱 令我心灵得欢乐 + 共那信心去面对将来 + 如今我但愿我的生命里 + 时刻充满着您的爱 + + + + 是你爱 + + 是你爱令我一生充满愉快 + 是你爱使我一生有和谐 + 历遍过苦痛的争扎 在计算摆上多少价 + 未担心命途多险窄 天天都去倚靠 + + 突破这闷困空间灰暗地带 + 是你爱使我开闯新境界 + 未会怕风雨的争扎 没计较摆上多少价 + 未担心命途多险窄 冲开一切害怕 + + 冲开那彷徨地带 开启那无穷限界 + 是你爱使我心胆壮 冲开捆锁未彷徨 + 解开那胡涂面罩 找真理完全地带 + 是你爱使我一生心情愉快 + + + + 我心你心敬拜心 + + 我心 你的心 飞天际 唱歌称赞父神 + 我心 你的心 敞开了 向恩主的敬拜 + 我心 你的心 飞天际 唱歌称赞父神 + 我心 你的心 敞开了 向恩主的敬拜 + + + + 让我走到您面前 + + 在这刻恩主请您 以亮光照我路程 + 求引领我 带我到 神您圣洁居所 + 让我走到您面前 您是我喜爱的神 + 神您爱我 我爱您 求您用我一生 + + 愿敬拜 愿颂赞 美妙琴声天天献上 + 惟愿您 接受这份爱 + 愿敬拜 愿颂赞 美妙琴声天天献上 + 求您接受这活祭 + + + + 清心敬拜 + + 柔和我声 专心敬拜歌颂您 + 静待朝见主 一心渴见您的美 + + 清心敬拜献歌声 心向往到我主的山岭 + 倾心赞美吐心声 呼吸您赐福的空气 + + + + 全世界都赞美 + + 高声地喝采 我高唱因为父神同在 + 掌管我一生 在我的心中不变改 + + 一起共挽手 以歌声歌颂父神成就 + 扭转我一生 为我修补心窝缺口 + 赞颂您 敬奉您 要让赞美达远地 + + 全球民族高声赞扬 万有都归与您 + 高声唱 让世界都赞美 + 全世界都赞美您 让世界都赞美 + 人类全部连起 + 全球民族高声赞扬 万有都归与您 + 高声唱 让世界都赞美 + 全世界都赞美您 让世界都赞美 + 人类全部连起 + + + + 祂诚然担当我的忧患 + + 祂诚然担当我的忧患 背负我的痛楚 + 我过犯 罪愆 全归到祂身里 + 耶稣 为我牺牲 + + 祂完全的恩典使我释放 您是我主耶稣 + 我如羊 前路 迷失了方向 + 耶稣 为我指引 + + + + 诗篇一二一 + + 我要向高山举目 我的帮助从何而来 + 我的帮助从造天地的耶和华而来 + 他必不你的脚摇动 保护你的必不打盹 + 保护以色列的也不打盹 也不睡觉 + + 保护你的是耶和华 耶和华在你右边荫庇你 + 白日太阳必不伤你 夜间月亮必不害你 + 耶和华要保护你 免受一切的灾害 + 他要保护你的性命 你出你入 + 耶和华要保护你 从今时直到永远 + + + + 我敬奉您 + + 万物尽是主的旨意 被造尽善在您手 + 慕义尽力高举主您 活着尽在主眷佑 + 赞美您我歌唱 赞美您尊贵名字 + 敬拜您我歌唱 敬拜您一生一世 + 我敬奉您 每事为王 + 我敬奉您 贯彻我一生 + 我敬奉您 每日为王 + 我敬奉您 愿荣美属您 + + + + 您是神 + + 您创造诸天 您创造深海  + 您创造星月太阳  + 您创造深渊 您创造山川  + 您创造广大宇宙  + + 您创造我 是我主宰  + 以您慈爱环绕我  + 天要述说 地要歌颂  + 我心敬畏您是神  + + + + 一身冲劲 + + 年青应该起劲 行动莫停 + 唯求能默默用尽每一天 + 年青一身冲劲 从未为利为名 + 完全为尽力事奉作贡献 + + 年青增加识见 求学莫停 + 唯求能事事学习看得清 + 能将所知所见 全力互助互传 + 无论成或败亦愿再奋战 + + 耶稣的爱 给我真美善 + 要以实行来呈现 + 人生于世 应趁青春壮健 + 用爱意与热诚 去实践 + + + + 颂唱不息 + + 万物共舞欢呼 同颂唱主的真善美  + 万物颂唱欢呼 神独配赞颂永不息  + HALLE LUJAH 万物唱不息  + HALLE LUJAH 欢声不止息  + HALLE LUJAH 永不息 唱遍宇宙永不息   + + + + 祂知道,祂看到 + + 活着在困恼的风暴  + 祂知道 祂看到 + 受现实世界的激动  + 祂知道 祂看到 + + 求能逃脱思潮的汹涌 + 拚了我心不停向主祷告 + 孤单漆黑遮蔽我现在 + 段段道路踏上方看到 + + 求能寻到心灵的丰足 + 教我信心坚强向主祷告 + 踏着步伐没停留控诉 + 凭信 凭心 前进 + 因祂知道 + + + + 全心赞美 + + 用嘴唇来赞美您 用我口来歌颂您 + 我双眼渴望看见您 向我彰显 + 愿我耳聆听您声音 我双手领受您大爱 + 我的全心 完全降服于您 + 凡那在我里面的 赞美您圣名 + 凡那在我里面的 赞美您圣名 + + + + 渴望您的灵 + + 心中渴望您的灵 此刻降临在我心灵 + 恩主恳求您帮助 心中恶愿你洗清 + 心中渴望您的灵 一再点燃渐冷心灵 + 甘心将我这生命献呈 + + 心中渴望您的灵 安慰软弱乱紊心灵 + 纷扰里让我安静 主的说话再细听 + 心中渴望您的灵 火中点燃渐冷心灵 + 委身再踏上天路旅程 + + + + 基督作主统治 + + 我要靠近天父我主 我的心渴想恩主 + 奔走这世界竞赛 主拥抱伴我此生 + 基督作主统治在我心 + 你劝慰我 圣灵我主 你能力今加添更新 + 主真理乃我信靠 彰显你荣耀恩典 + 基督作主统治在我心 + + 噢我极渴想恩主你更多 + 振奋在我心 得知真理更深 + 噢圣灵我主 倾注每颗心 + 主恩赐我更新 满你爱让你的触摸 + 医治痊愈引领 今得见主统治在我心 + + + + 同来赞美 + + 同来赞美齐共唱 哈利路亚 + 唱出生命的歌 + 同来赞美齐共唱 哈利路亚 + 唱出生命的歌 + 怀着满信念 一生不改变 + 靠恩主引导每天 + 前路满盼望 欢欣将心献 + 愿恩主每日记念 + + 同来赞美齐共跳 哈利路亚 + 跳出生命的舞 + 同来赞美齐共跳 哈利路亚 + 跳出生命的舞 + 怀着满信念 一生不改变 + 靠恩主引导每天 + 前路满盼望 欢欣将心献 + 愿恩主每日记念 + + + + 诚心敬拜 + + 全心欢欣 屈膝敬拜 颂赞您永活神 + 诚心欢欣 屈膝敬拜 赞美您万世君 + 无所不知真理运行 智慧遍布穹苍 + 难料踪迹 不可测透 却舍身救赎我 + 颂赞祂 永生神 倾出一生舍己为救恩 + 颂赞祂 至高神 基督恩典一生永护荫 + + + + 一首赞美的诗歌 + + 让那赞美的声音 在这空间响遍  + 让那敬拜的心声 永不休止  + 让我心中所有意念 此刻都交主的手里  + 心中只想献奉我深深敬拜  + 人活着原是要歌颂赞扬创造我的主  + 您是配得荣耀  + 人活着原是要将荣耀归您  + 一首赞美的诗歌  + 愿带我到宝座前敬拜  + + + + 心灵的回响 + + 天空里散聚云片片  + 无奈月明星不闪 + 莫流泪悲欢合离是难免  + 祈求上主每一刻能抹泪面 + + 世途里恩怨恨爱定会现  + 心灵中多少困倦与挂牵 + 向前去不怕浪里多风险 + 热诚共创真美善 + + 愿主爱 常记念 + 求恩主引导每一天 + 愿真爱 传世上 + 永生福共享百万 + + + + 耶稣配得至圣尊荣 + + 耶稣您配得至圣尊荣 耶稣当受最高赞美  + 愿全地响应诸天唱和 来尊崇主圣名超乎万名  + 让我们屈膝府伏敬拜祂 因祂圣名万膝要跪拜  + 让万口承认 祂是主耶稣 全能神 今我荣耀您  + + 但愿尊贵 颂赞和权能 都归于您 都归于您  + 愿尊贵颂赞和权能 都归于您 都归于您  + 主耶稣 永活真神儿子 + + + + 向至高者赞美 + + 同心皆向至高者赞美 颂赞主圣洁 诚实 无伪正直  + 同心皆向至高者赞美 颂赞主圣洁 诚实 无伪正直  + + 耶稣是生命道路 最美善又完全 作世上盘石  + 耶稣是生命道路 最美善又完全 主恩光照万世 + + + + 我要歌颂您圣名 + + 我要歌颂您圣名 + 哦主 歌颂您圣名 + 哦主 因为您圣名至高配得赞美 + 我要歌颂您圣名 + 哦主 歌颂您圣名 + 哦主 因为您圣名至高配得赞美 + (我要荣耀您圣名) + + + + 你是蒙拣选 + + 你是蒙拣选 被父神重用 + 是有圣洁 君尊的祭司 + 戴属灵军装 扩建天国度 + 全赖圣灵导引领人见基督 + 欢欣跪拜 高歌颂赞 + 哈利路亚 哈利路亚 + 感恩颂唱 甘心奉献 + 荣归基督 同得享天父称赞 + + + + 无所不在的神 + + 我往那里去躲避你的灵 + 我往那里逃避你的面 + 我若升到天上你在那里 + 我若在阴间下榻你也在那里 + 我若展开清晨的翅膀 + 飞到海极居住 + 就是在那里的手必引导我 + 你的右手也必扶持我 + 我若说黑暗必定遮蔽我 + 我周围的亮光必成为黑夜 + 黑暗也不能遮蔽我 使你不见 + 黑夜却如白昼发亮 + 黑暗和光明在你看都是一样 + + + + 您是我神 + + 请开我眼 打开我心 + 明白您有多深爱我 + 请释放我 去我缠累 + 能让我再有力荣耀您 + 请改变我 谦卑我心 + 明白我有多么需要您 + 心紧靠您进您怀内 + 容让我永贴近随着您 + + 您为我钉身受死 + 抹去我的污秽 + 您是我神 是我王我心欣慰 + 我为您张开我口 + 向世界高声唱 + 竭力赞扬愿永传您大爱 + 我为您举起两手 + 永远高举您 + 赞颂我神 颂我王 我心所爱 + 我为您倾出我心 + 撇弃世间贪爱 + 放下软弱愿献呈作活祭 + + 我为您鼓起我掌 + 向世界宣称你 + 您是我神 是我王我心称赞 + 我为您张开我口 + 向世界高声唱 + 竭力赞扬愿永传您大爱 + 我为您举起两手 + 永远高举您 + 赞颂我神 颂我王 我心所爱 + 我为您倾出我心 + 撇弃世间贪爱 + 放下软弱愿献呈作活祭 + + 您是我神 是我王到永远 + 永颂我神竭力赞扬敬拜您 + + + + 轻轻听 + + 轻轻细心听 轻轻细心听您声 + 轻轻细心听 轻轻细心听您声 + 细细听 轻轻细细听 + 倾听您说话儿共对应 + 细细说 轻轻细细说 + 因知道我牧人在细听 + 上帝您是我独一生命光 + 羊属您必清楚听您声 + 牧养引导我 轻声教导我 + 一生听您话儿共对应 + + + + 主给我子女名份 + + 耶和华是创造天与海 + 迄立渡万世代 + 耶和华是我王不变改 + 早晚顾念同在 + + 罪里捆绑可得释放 + 痛悔有依傍 + 冤屈可得伸诉 + 眼目明亮见曙光 + Hallelujah我称颂 + 您爱我比海深 + Hallelujah赞基督救恩 + 主给我子女名份 + + 耶和华是创造天与海 + 迄立渡万世代 + 耶和华是我王不变改 + 早晚顾念同在 + + 遇上祸患可得拯救 + 欠缺可得眷佑 + 孤寡可得安慰 + 破蹩提步远处走 + Hallelujah我称颂 + 您爱我比海深 + Hallelujah赞基督救恩 + 主给我荣耀救恩 + + + + 吶喊,高声唱 + + 是我主 为我死 甘舍身的爱付出  + 叫我颂扬 一生歌唱 主不可测透的厚爱  + 是我心 护阴所 一生的保障能力  + 倾出一切 专一于您 献赞颂献出欣赏  + + 世界万众也吶喊高声唱  + 处处和应四海诸山拍掌  + 我要跪拜仰望您伟大 永远高唱来荣耀主  + 我要述说您为我的牺牲  + 愿永爱慕您 我此生不变改  + 那有及您 信实爱有谁能代替 + + + + 颂赞主 + + 颂赞主因祂的爱超出那高天 + 颂赞主因祂的爱比海更深 + 我的心中欢喜雀跃 + 我快跑到主座前 + 让我献上每句歌声与颂赞 + + 颂赞主因祂的爱超出那高天 + 颂赞祂的爱比海更深 + 我的心中欢喜雀跃 + 我快跑到主座前 + 让我献上每句歌声与颂赞 + + 心中欢喜 在这刻进到您殿 + 要见您真光发现 + 我要献上唇上佳美献祭 + 这歌声彰显您大爱 + + + + 被您吸引 + + 今我被恩主您吸引 + 我已确知属于您 + 我知您的爱 从未对我舍弃 + 主您每一句甜美话 + 藏在我心成您爱标记 + 让我这一生 每一刻吸引主您 + + 使我这一生也吸引 + 成您住所我身心 + 唯愿您圣灵 从我内里彰显 + 显出您光辉您的爱 + 让这世界借着我知道 + 您的爱广大 您圣灵今要作新事 + + 感激您 您的爱 已把我妥隐藏  + 纵使我百般不配 我也被您抱拥  + 您触摸 您真实 使我灵里满足  + 我全心渴想主您 感动我  + + + + 若然没有您 + + 若然没有您 朝晖将不可得再现  + 若然没有您 清风也不可再吹  + 若然没有您 世界将充斥了恶事  + 若然没有您 世界再不可有爱  + + 若是没有神 这世界会消失盼望  + 若是没有神大爱 又怎可走过伤心苦痛的岁月  + 若然没有您 这生将找不到意义  + 若然没有您 根本也不可有我 + + + + 主爱有多少 + + 主爱有多少 主恩有多深  + 祂甘愿舍命 为救人灵魂  + 主爱有多少 主恩有多深  + 每当我思想 我心感恩  + + 天地有多么高 两极有多么远  + 救主的慈爱 也有多大  + 永恒有多么长 无限有多么广  + 救主的恩典 也有多深  + + + + 我欢喜因我属主耶稣 + + 我欢喜因我属主耶稣 我欢喜因我属主耶稣  + 我欢喜因我属主耶稣 哈利路亚赞美主  + + 赞美主(阿门) 赞美主(阿门) 赞美主(阿门)  + 赞美主(阿门) 赞美主(阿门) 赞美主(阿门) + 哈利路亚赞美主  + + + + 当称颂主 + + 来赞美主 每个神的仆人  + 夜间站在 神的殿中  + 当向圣所 举起双手  + 来赞美主 来赞美主  + + + + 您的话 + + 我将您的话语 深藏在我心  + 免得我得罪您 免得我远离  + 哦主啊 与我亲近  + 我爱您声音 作我脚前的灯  + 作我路上的光  + + 天地将要过去 您的话却长存 + 天地将毁坏 您的话却常新  + + + + 谁主明天 + + 动荡变迁 世事难料 彷徨里失去目标  + 生老病危 苦罪是谜 人生消失似烟  + 祸患困扰 天灾难料 谁定向为我指示  + 唯独救主 可指引步方向 陪伴我寻觅那新一天  + + 明天告别时 幻变世界会终结  + 唯独你永活永生永不改变  + 耶稣你是盼望 是你主宰今天 明日掌管于你手里  + + + + 爸爸,天上爸爸 + + 孩子 亲爱孩子  + 让您父拥您入怀  + 孩子 亲爱孩子  + 让您父抹您苦痛 + 替您医伤您治好了  + 去您痛悲您获释放  + 抹您泪水再觅欢笑  + 领您安息再现生趣  + 孩子 亲爱孩子 父是多么的爱您  + + 爸爸 天上爸爸  + 让孩儿靠近您旁  + 爸爸 天上爸爸  + 让孩儿向您倾诉  + 告诉您知我受伤了  + 告诉您知我甚悲痛  + 告诉您知我泪不禁  + 告诉您知我没希盼  + 爸爸  天上爸爸 愿您听我倾诉  + + + + 在天上的爸爸 + + 在天上的爸爸 愿人人都尊您名为圣  + 在天上的爸爸 愿您国度降临  + 日用的饮食 今日赐给我 赦免我的罪  + 因我也赦免那亏久我 不要叫我  + 遇见试探 求救我脱离那恶者  + + 哈利路亚 哈利路亚 国度  + 权柄 荣耀全是您的  + 赞美 哈利路亚 国度  + 权柄 荣耀全是您的赞美 + + + + 耶稣愿您为王 + + 耶稣,愿您为王  + 我们宣扬您是王  + + 站立在我们当中  + 我们用赞美高举您  + + 我们的敬拜作您居所 + 我们的敬拜作您居所 + 我们的敬拜作您居所 + 主耶稣来住您的居所 + + + + 亲近您 + + 亲近您 当亲近您请您在我心中  + 亲近您 当亲近您请您用您的手承托着我  + 让我以后随着您尽情的亲您  + 唯愿您 完全充满我  + + + + 耶稣是一位奇妙救主 + + 耶稣是一位奇妙救主 祂会带你经过  + 耶稣是一位奇妙救主 祂会带你经过  + 耶稣是一位奇妙救主 祂会带你经过  + 直到战争完毕真理获得大胜  + 我主会带你经过 我的亲爱弟兄  + 当世界被焚 你需要耶稣做您的救主  + 要将您隐藏在万古盘石中  + 在万古盘石中把你隐藏 + + + + 奋力勇闯 + + 奋力无惧前往 毋惧畏莫灰心沮丧  + 同行主应许引领道路 神荣光一生普照前方  + 奋力无惧前往 毋惧畏忧戚已解免愁怀  + 神愿意分忧每刻都看顾 是您力量 恒久坚固保障  + + 尽向主倾诉 细说恐惧 让眼泪沬干主安慰尽享 + 痛苦我主亲身经过 明白我常被困扰找方向  + + 尽力量无惧前往 毋惧畏冲开困厄苦不再  + 同行主应许引领道路 神荣光一生普照前方  + 要刚强无惧前往 毋惧畏冲开困忧苦不再 + 神在您生命每刻愿同往 是您力量恒久坚固保障  + 尽掌握一切永远守护 万事靠主恩 今生奋力闯  + 倍添信心恩主必看顾 神是爱能力满心自由乐享  + + 要刚强无惧前往 神伴您奔走每刻愿同往 + 是您力量恒久坚固保障 + 神定要同行伴我闯(同闯) + + + + 刚强壮胆 + + 刚强壮胆不要畏惧 神现与我们同在  + 刚强壮胆不要畏惧 神现与我们同在  + + 神应许不变更 耶稣站此地当中  + 神已同在 未计何地 全世界都属我的主  + 神已同在 未怕仇敌 神已践踏仇敌 + + + + 主是我力量 + + 是您的力量坚固方向 艰苦里寻获去向  + 上帝的力量赐我取向 命途不须怕漫长  + 在困境惊慌 心态彷徨 隐居您处避风波  + 静处得安息 振作释放 在神恩典心胆壮  + 历世何时没有变 地壳山岭曾摇动; + 浪涛腾动 浪水翻波 未怕失落可冲破  + 喂哦 喂哦 喂哦 喂哦 + 喂哦 喂哦 喂哦 喂哦 + + + + 齐贺主爱 + + 就让这刻一起庆贺 + 赞美救主深恩伟大 + 神曾为我临尘世 + 舍弃性命全没悔恨 + 若是这天心有烦愁 + 就让救主舒去困倦 + 求能共您同赞美祂 + 不死的爱永远要传扬 + + 昨天祂舍身的爱赐我新生 + 这天祂看顾爱怜伴着我走 + 明日有着昐望能共享祂尊贵 + 神为我抹掉一切泪痕 + + + + 分享主爱 + + 让我们分享主恩爱 + 让主爱充满生命 + 愿主爱渗透众教会 + 使我们心灵复兴 + 求主更新心灵意念 + 使我们真切相爱 + 让我们分享主恩爱诚实相爱 + + + + 愿您崇高 + + 让我们分享主恩爱 + 让主爱充满生命 + 愿主爱渗透众教会 + 使我们心灵复兴 + 求主更新心灵意念 + 使我们真切相爱 + 让我们分享主恩爱诚实相爱 + + + + 愿您崇高 + + 我要在万民中称谢您 + 我要在列邦中歌颂您 + 您的慈爱高于诸天 + 您的信实直达穹苍 + 您的慈爱高于诸天 + 您的信实直达穹苍 + + 哈利路亚哈利路亚 + 您的慈爱高于诸天 + 哈利路亚哈利路亚 + 您的信实直达穹苍 + + + + 荣耀归我主 + + 全地颂赞高唱 HOLY + 来荣耀我主基督 + 让每颗心也欢笑 + 基督被高举永远得胜 + + 我举双手敬拜父 + 我今高声去赞颂 + 唯愿站我主宝座前来传扬祂 + + 荣耀荣耀都归于我主 + 荣耀荣耀都归于我主 + + + + 永在您旁 + + 我的双手扬起 侍立(跪在)我主跟前 + 我要听主慈声 也看见主荣美 + 我的双手扬起 侍立(跪在)我主跟前 + 我要听主慈声 也看见主荣美 + + 我要安居您怀内 一世饱享主您的爱 + 我要张口饮主您活水 + 满足皆因您同在 您脸己光照我的脸 + 这刻渴望永在您旁 + + + + 您是我神II + + 我一生甘心居于您里面 + 唯有您永远也不改变 + 容让我心热切呼唤救主千百遍 + 直到那日再见您的面 + + 您是我神 您是我王 您最清知道我心 + 您是我神 您是我王 我要天天紧靠着您 + 愿将真心奉献 如云彩飘到您面前 + 现将更新的我呈献给您 + + + + 我要宣告 + + 我要宣告 赞颂筑起主宝座 + 我要建主宝座 噢~~ + 赞颂声高 渴望主登上宝座 + 让我心做您居所 + + 您的居所中 我找到欢欣盼望倚靠 + 我要安稳于 我永久保障坚固盘石 + 主您永远赐 我随时所需那活水 + 主您永远作 我随时所需那帮助 + 故我高声告 我要高声来告 + 高声宣告 高声宣告 + 我要宣告 + + + + 愿主为王 + + 赞美 高声欢呼 + 主基督是我王 + 乐声中 拥戴主我王 + 赞美高举您是我主 + + 献上赞颂迎着宝座 + 敬拜筑起您宝座 + 敬拜筑起您宝座 + 愿主登基愿主为王 + + + + 愿事奉耶和华我神 + + 愿事奉耶和华我神 撇下世上所有 + 愿事奉耶和华我神 撇下世上所有 + + 回应主的爱 十架大爱倾出宝血 + 耶稣我尽爱牺牲(不竭) + 愿献生命活祭事奉我主 + + 愿事奉耶和华我神 撇下世上所有 + 愿事奉耶和华我神 我乐意付上一切 + + + + 从没有放弃 + + 从没有放弃 您给我的异象 + 从没有放弃 您给我的理想 + 当我遇到阻难 您必坚固我 + 主啊求您给我 有毅力面对 + + 让我胜过世间一切困难 + 助我冲开心中的忧因 + 让我的心紧紧靠着神 + 持守心中的呼召 + + + + 信仰颂 + + 我们信圣父永生神 创造天与地的主 + 我们信圣子主基督 降人间救世之主 + 藉童女主诞生世上 担罪愆被钉身亡 + 祂从死复活得胜利 升天掌权在父身旁 + + 统治天与地 耶稣基督 + 统治天与地 耶稣基督 + 祂是天地主 耶稣基督 + 祂是天地主 颂基督 + 名远超万名 名远超万名 + + 我们信主差祂圣灵 赐教会能力恩惠 + 亲见证主话语真理 差信众往普天下 + 基督必显荣光再临 亲审判万世的人 + 聚主前万膝必屈拜 众口承认颂祂尊名 + + 统治天与地 耶稣基督 + 统治天与地 耶稣基督 + 祂是天地主 耶稣基督 + 祂是天地主 颂基督 + 名远超万名 名远超万名 名远超万名 + + + + 天堂在我心 + + 谁说 沉睡已久的花蕾 不能绽于一季缤纷 + 谁说 寒冬之后的大地 不能展现一片青翠 + 谁说 曾经受伤的翅膀 不能再度自由地飞 + 我要抬起头 张开双臂 拥抱神所赐的世界 + + I want to be free 自由地飞 + 在爱中无惧怕 在爱中无伤悲 + I want to be free 不再流泪 + Because I believe that heaven is here + 我有天堂在我的心 + + + + 是您最重要 + + 是您重要 在我的心中最重要 重要是您 + 全地其上 全赖您一一创造 + 是您亲手铺设宇宙繁星 + 于我您给我是到底的拯救 + + 颂赞 跪拜 颂赞永归我主 + 颂赞 跪拜 让我心归我王 + 于天地里再找不到比您好 + 在我生命里 再找不到一个相比更重要 + 神是我一生中最深刻最重要 + + 是您重要 在我的一家最重要 重要是您 + 危险困逼 凭借您一一过渡 + 是您恩手使这家温馨倍添 + 于我这家也属您终生归您 + + 颂赞 跪拜 颂赞永归我主 + 颂赞 跪拜 让我家归我王 + 甘心乐意传颂基督的救恩 + 让这家奉献 荣耀都归于您皆因您是爱 + 神是我一家中最深刻最重要 + + + + 齐声颂赞 + + 齐声颂赞 神真美好 + 全因您手所施之工使我欣慰 + 全我属您 凡我这生盼望 + 我交于您手中 + + 一生宣认 我爱主不变 + 我要永远将我爱慕献给您 + 一生宣认 我爱主不变 + 我要永远将我爱慕奉与您 + + + + 我们在天上的父神 + + 我们在天上的父神 + 愿您名超乎全地 + 但愿我们的赞美作您国度 + 愿您子民宣扬您大作为 + + 举起双手赞美全能神 + 是昔在今在永在的 + 举起双手赞美全能神 + 直到永永远远 + + + + 我献上生命 + + 我献上生命 我将一生给您 + 我来敬拜来尊崇赞美您的圣名 + 我献上生命 我将我心给您 + 我要举起双手去宣扬您就是主 + + 我要看见您 来求告您名 + 好像小孩呼求祂父亲 + 我要看见您 来求告您名 + 我要兴起 要兴起 + + + + 因您爱 + + 感谢您 因您爱 您愿意这刻临在 + 吸引我 靠近我 使我藏身于主爱 + 纵我眼目未见主荣光 纵我软弱未唱赞歌 + 您那有力坚刚的翅膀也为我张开 因您爱 + + 因着您 伟大爱 您愿意这刻临在 + 吸引我 靠近我 使我藏身于主爱 + 我深仰望未见主荣光 纵我软弱未唱赞歌 + 因我相信恩心的双臂永为我伸出 因您爱 + + 注视您 的眼光 我望见主的爱火 + 纵是我 不配得 您却为我倾出一切 + 主您眼内流露您慈悲 您双手呈现您恩典 + 我真感谢 主施恩宝座是为我兴建 因您爱 + + 因您永远可靠 啊主我的盘石 您圣灵又充满我作爱的保证 + 我呼喊阿爸圣父 高呼您爱奇妙 主使我永久渴慕 永远也饥渴 + 主您爱 + + + + 恩主的爱 + + 恩主的爱 永久不会变改 + 深恩广阔 浩瀚超出这穹苍 + 主施恩惠 施公正未曾变样 + 并以智慧掌管照顾这苍生 因你是主 + + 这么宝贵 厚爱深恩充满我心 + 休息安竭 在你庇荫翅膀中 + 一生享有 恩主丰富供应供给 + 在你光中必得看见主真光 因你是主 + + + + 主您是配得 + + 为十架而感恩 为赎价全心致谢 + 您已负上我羞耻 与我过犯 其哉主爱恩典 + 为您爱而感恩 为您钉痕手感谢 + 您血已使我圣洁 今我知道 您赦免您也悦纳 + 我主真配得 坐于宝座 + 快拥戴羔羊我主作王直到永远 + 被高举是您 上帝子我主 + 您天之骄子舍命爱我 + 主您是配得 永配受称赞 + + + + 面对抉择 + + 环境诸多变迁 谁可以看见 明天的发展和际遇 + 人智慧有限 难作选择 前路一片茫茫如没路牌 + + 人心思可变更 谁可以看透 人心中的构思和计划 + 人你我互谋 难作审断 前路一片茫茫如没路牌 + + 面对抉择面临困惑 心底里几番冲动 + 人去亦难留更难 常退避没有用 + 今天我有主耶稣的足印 给我作指引 + 面对艰难我誓要跟从 原因主智慧无限 + 实在我不配为我作选择 原因我已属上主所有 + + + + 我是个快乐人 + + 我是个快乐人 要作快乐事 + 日日敬拜主 喜乐溢洋洋 + 不断地歌唱 用力的拍掌 + 天天敬拜主 我要开心的赞美主 + + 赞美主 我要开心的赞美主 + 敬拜主 我要尽心的敬拜主 + 多谢主 我要开口多谢主 + 多谢我主 多谢我主 给我一个快乐心 + 多谢我主 多谢我主 我是个快乐人 + + + + 我的心啊,我的灵啊 + + 我的心啊 我的灵啊  + 你要以喜乐的心来赞美主名 + 我的心啊 我的灵啊  + 你要以喜乐来赞美主 + + + + 您是我喜乐的泉源 + + 您是我喜乐的泉源 耶稣 生命得以完全 + 今我要高声呼喊 耶稣 因您喜乐河流全掩盖我 + 我要歌唱您善美直到永远 为要宣告您至伟大不改变 + 您是恩主 您是我喜乐泉源 + + 扬声叫喊 忘我跳跃呼喊 一切喜乐全因有您 + 我要放高声呼喊 我要跳舞来颂赞 颂赞崇拜主 + 您是我喜乐的泉源 耶稣 生命得以完全 + 今我要高声呼喊 耶稣 因您喜乐河流全掩盖我 + 我要居于您殿宇直到永远(从今到永远)在您居处过一天胜在世万年 + 您是恩主 您是我喜乐泉源 + + + + 主信实无变 + + 慈爱主信实无变 在每天清晨 主爱已彰显 + 慈爱主信实无变 没有分阴晴 主爱励勉 + + 慈爱主信实无变 日影西斜 主爱更温暖 + 慈爱主信实无变 没有分冬暖 主爱复眷 + + 爱慕到达主跟前 渴慕救主引牵 + 困苦 压逼 忧心 挂念 神爱眷必不停断 + 神爱眷终不改变 + + + + 将心献上 + + 主 我将心献上 全奉献决心踏上前 + 抛开一切挂牵 尽献给您不改变 + + + + 我只想去高举主名字 + + 我只想去高举主名字 如旗号让这地得看见 + 这世界必因真理晓得 唯靠主得进天国 + + 我要高举 我要高举 我要高举 高举主基督 + 我要高举 我要高举 我要高举 高举主基督 + + 每一次我迈步向前 都闯进主的应许地 + 我祷告乃有力兵器 将一切坚固营垒 摧毁 摧毁 摧毁 + + + + 你爱我比这些更深么 + + 微风轻奏水面 黎明破晓 + 湖中挣扎整夜 没有收获 + 你爱我比这些更深么 + + 晨光初照海岸 微微暖火 + 耶稣经已准备 岸上有早饭 + 你爱我比这些更深么 + + 人海颠沛转动 寻求富足 + 财宝声势争夺 乱我心懹 + 你爱我比这些更深么 + + + + 在您恩光中 + + 在痛苦中挣扎神在身边 + 在困境中失脚神愿伸手引牵 + 孤单掩盖我 仍旧信主看顾励勉 + 是您应许不变迁 因主必细听 祷告到达神前 + 在您恩光中愿听主慈声 + 在您恩手中让我复平静 + 恩典中罪恶主抹清 + 心中的意念请您用慈爱和应 + + + + 不变以马内利 + + 以马内利 神同在不会终止 + 以马内利 无惧世事改变几多 + 祂必与你一起 与我一起走每一天 + 相信在这一刻 以后每一刻也没改变 + 以马内利 就算漆黑铺天际 + 深深相信是神仍必与共 + 以马内利 以马内利 教我心仍然相信 + 以马内利 以马内利 定会念记 + + + + 诸天颂赞 + + 耶稣 我救主 您至圣有谁能比 + 一生一世我要颂扬 您不可思议的厚爱 + 慰解者 护荫者 作我力量避难所 + 我的全人一息尚存不会停止敬拜您 + 诸天颂赞向上主呼喊 因祂配得能力尊贵颂赞 + 高山下拜与大海呼啸 在您圣名的响声中 + 欢欣颂赞因见主的作为 我爱慕您我此生不变改 + 因您对我的应许有何能代替 + + + + 我的一切 + + 我天父我所仰慕 远超世上一切我所向往 我渴想您 + 我爱慕您我的救赎主 一切所有我都归与您 我献所有给您 + 您的天使在敬仰您 您的子女向您敬拜 + 您是恩主我的一切 我要献出生命与您 + 我的恩主乃我所爱 永远也稳居我心底 + + + + 无论那一处 + + 无论那一处 神为我除去无数路障 + 纵高山幽谷极深处 至汪海滔滔不见天 + 祂都引牵不变 + 无论那一处 唯愿众人荣耀敬奉你 + 我一生奔走为主你 要一生兴起传颂你 + 尊崇你 我跟从你 + + 神厚爱 神厚爱 神厚爱 + 从心底使我更新 又更新 又更新 + 神大能存在永远 存永远 存永远 + 能使一生更精采 又精采 我今天已找得盼望 + 一生奔走为主你 要一生兴起传颂你 + 尊崇你 我跟从你 + + + + 荣光普照 + + 荣光普照全地 神恩丰富完备 + 荣光照耀驱走晦暗 将心灵再点起 + 求兴起我灵命 燃起心底平静 + 荣光引路感恩赞美 愿生命更像您 + + + + 以色列的圣者 + + 以色列的圣者 为我牺牲自己 + 神羔羊 你是弥赛亚 耶稣和平之君 + 我要跪拜要敬拜你主啊 因为你是万王之王 + 我要跪拜要敬拜你我神 宝贵耶稣和平之君 + + + + 深信主爱 + + 于您身边 如今我觐见恩主 我渴想您触模 + 将您恩典荣光照耀我 使我明白您更多 + 两眼只想看见您荣面 耳?只爱听见您恩言 + 因您救赎厚恩 圣灵厚厚浇灌 使我铭感您爱颂您恩 + 高举我手去颂扬 高唱您爱的深长 + 天高海深 不足比较 主您永作我保障 + 因此我深深相信 主爱对我永不尽 + 即使年月变迁 恩主从来未变 + 主您膀臂亦会为着我伸展百千遍 + + + + 我将颂赞给您 + + 让我以手以口发出颂赞声 传扬您永活名字 + 来高举祂恩手所造 心中哼赞歌 + 让我细思细想您不绝救恩 寻求您话语微妙 + 神竟将祂恩典涌流 谁像您给我宝贵 + 神啊 我将心里颂赞留给我最爱的您 + 来看您的爱胜一切 昼夜绵绵未变改 + 神啊 我将一切奉上 全因您彻底的爱 + 投进 您丰富的一切 颂赞归于永恒的您 + + + + 极力尽力赞美主 + + 赞美赞美您哈利路亚 极力尽力尽为您歌颂 + 我要赞美您哈利路亚来同声 + 主的恩典常常伴我们 日日夜夜就是我保护 + 我要赞美您哈利路亚在心灵 + 美妙赞颂声天与海同应 歌唱主大恩 齐颂赞主 + 你共我同声 心与心同应 称赞主用心灵 + + + + 是为了我罪 + + 1. 在十架上被人冷眼嘲笑 汗血淌滴下救主被钉死 +  主宰基督为人背上苦担 系挂那木头的应是我 +  是为了我罪祂舍尊贵 是为了我罪祂牺牲一切 +  在十架上恩主彰显祂的爱 罪债于一身祂拯救万世 + 2. 复活盼望罪人今得新生 信祂的必可承受永生 +  复活盼望罪人变改身心 并赐我圣灵祂一世护荫 +  被罪恶枷锁今得释放 被罪恶枷锁今可得冲破 +  复活盼望是让主居于心里 愿一生跟主祂一世导引 + + + + 爱再不是传说 + + 传说中 神是爱 大爱比天高 + 跨越未来让我深心感到 + 祂降生 凭着爱 叫唤我归家 + 仇恨与内疚 流泪与罪债 神愿替我独个承担 + 爱 再不是传说 是已经发生 也藏在我心坎 + 爱 再不是传说 在十架山 为我死救赎我 + 神是爱 让我可以爱 + + + + 主爱不变 + + 神在昨日到今天到永久不变 永远伴在我身边同行 + 每天每夜存着不死的爱 在看顾在拖带每一天 + 唯愿你共我信心与爱心不变 靠赖着是我主的恩惠 + 勇敢 坚刚 存着不死的信 是相信主爱不变 + + + + 在主前静默 + + 静默在至圣的主跟前 主今亲临同在 + 这是神圣之地 主圣洁无瑕疪 + 你当尊祂为圣 向祂屈膝敬拜 + 肃静在至圣的主跟前 主今亲临同在 + + 静默在荣耀的主跟前 主光辉今环绕 + 荣耀至尊君王 主威荣谁能瞻 + 主以光辉为冕 圣火不熄常燃 + 肃静在至圣的主跟前 主光辉今环绕 + + 静默在全能的主跟前 主施大能权柄 + 主来洁净医治 来祝福赐宏恩 + 以信心瞻望主 万事祂皆能成 + 肃静在至圣的主跟前 主施大能权柄 + + + + 诗篇130篇1-4节 + + 耶和华我从深处 从深处向你求告 + 愿你听我的声音 愿你侧耳 + 侧耳听我恳求 听我恳求的声音 + 你若究察罪孽 谁能站住 + 但在你有赦免之恩 要叫人敬畏你 我等候耶和华 + 我心等候 我也仰望 + 但在你有赦免之恩 要叫人敬畏你 我等候耶和华 + 我心等候 我也仰望 + + + + 你使我满足 + + 我心必永久颂赞主 + 每刻信赖倚靠主 + 我主常使我心无惧怕 你使我立足主你基石 + 现稳固是我心 故我要说我主 + 是你于我心是至宝 世间与在天也如是 + 是你使我满足 故我要说我主 + + 是我保障 力气 我福份 我的释放 + 我盾牌 我高台 我所需要每刻帮助靠倚(是我保障) + + + + + 保护我 + + 您永远藏身在我心 保守我同经岁月 + 您恩手呵护我 引领我行走您义路 + 我要瞻仰主 我灵也等候 + 全倾心中爱向您歌颂 为述说主您信实 + 能栖居您永不朽臂膀 您每刻亲拖带 保护我 + 哈利路亚 哈利路亚 哈利路亚 哈利路亚 + + + + 恳求主 + + 恳求主请您看我双手 一切我所有 甘心为您用 + 恳求主请您看我的心 塑造练净我 将我分别为圣 + 我们要奔向您的祭坛 得着您的火焰  + 站在破口中抢救那失丧的灵魂 + 求主赐我怜悯的心为这迷失的人群  + 我们要改变世界带来盼望在这地 + 我响应您呼召 建立无墙的教会  + 让您荣耀彰显 赐下救恩给万民 给万民 + + + + 君尊义仆 + + 1. 贫穷婴孩天上来 进到世间 掩祂光荣 +  不求供奉 却服侍 为救众生 舍祂性命 + 2. 在园中挣扎流泪 选择担当众生重罪 +  拒己心意 遵父旨 慈爱的心痛?破碎 + 3. 请看祂手上钉痕 那手曾铺满天星宿 +  却以伤痕证主爱 曾任铁钉扎伤刺透 + 4. 效法恩主服侍人 决定一生以祂为王 +  顾念他人的需求 如事奉祂 学祂榜样 + 副: 谦卑上主 君尊义仆召我们跟从祂脚踪 +   身心所有 每日献作活的祭 谦恭敬拜君尊义仆 + + + + 真爱 + + 当我想到耶稣独自 + 背着十架行向这辛酸之路 + 讥讽嘲笑旁人在耻笑责骂 + 祂却决心为我受尽痛苦 + + 天也昏暗疲倦且软弱 + 鲜血在渗祂却甘心坚持 + 原是主真爱情愿舍弃性命 + 忍受痛苦在十架上为我死 + + 在我心不懂去思不懂去想事实是这般 + 为何您对我深爱我始终未明了 + 难道我只得半知只得半解事实是这般 + 原来世界最美的爱是您牺牲不变的爱 + + 愿我心懂得去思懂得去想事实是这般 + 能明白您对我深爱您甘牺牲一切 + 唯愿我甘将我心甘将这生尽力为您倾 + 来偿您那对我的爱愿我一生深爱着您 + + + + 我是主的羊 + + 主领我到青草地安歇在溪水旁 + 黄昏时主与我一路同行 + 牧场上主的羊都得饱足心快畅 + 我是主的羊 + + 青草地(死荫幽谷) 溪水旁(高山峻岭) + 黄昏时(黄昏时) 有主与我同行 + 黑暗夜(死荫幽谷) 路崎岖(高山峻岭) + 每一步(每一步) 跟随主行 + + + + 耶和华以勒 + + 耶和华以勒 我的供应 + 在恩典里我永不缺乏 + 耶和华我父 我的倚靠 + 在主手里 我永得保障 + + 让我心称颂恩主 祂有无限丰富 + 赐予我美好人生 + 让我口歌颂恩主 祂有无尽的爱 + 带领我永不缺欠 + + + + 有呼吸者 + + 在祂圣所今要赞美 在祂显权能穹苍赞颂 + 普世要赞颂 颂赞因祂可畏权能 + 颂赞祂至圣名字伟大 同歌唱赞颂 + + 在日出之处听见 欢呼声响起 + 于东方飘西方 自南唤北方 + + 有呼吸者要向祂 向祂永远歌唱 + 我里面一切也都颂赞主 颂赞主 颂赞主 + + + + 容我宁静 + + 晨曦之中我寻求神话语 + 每分一刻感激主多爱宠 + 日光之中 人流离在多变世俗里 + 啊 圣灵求您引导我祷 + + 容我宁静 听候在您的跟前 + 一心一意 愿寻求您的旨意 + 藏您怀内 看万事变得空虚光辉不再 + 愿我此刻知您是神 愿我得享安息在您手里 + + + + 渴想您 + + 神啊 我天天渴想您 期望每天深深想您 + 纵使身心经过干旱地 我心仍然 期望每天想您 + 神啊 我祷告您应允 诚实爱心必得应允 + 无惧敞开心中的挂虑 永不徒然 神定会必应允 + 神啊 您拖带我走过 顽劣处境安心经过 + 路过深谷幽暗干旱地 您必同行 陪伴我轻走过 + 神啊 您必使我得胜 顺服您心终必得胜 + 怀着圣洁虚心的脚步 靠主昂然 齐踏上必得胜 + 神啊 您本意爱宽恕 无限爱心必得宽恕 + 十架至伟宝血洗我罪 悔改回头 仍获爱心宽恕 + 神啊 您千载永不变 唯独您永远不改变 + 尘俗过去消散不再现 美境无常 唯独您不改变 + + + + 主在圣殿中 + + 主在圣殿中 主在圣殿中 + 普天下的人 在主面前 都应当肃静 + 肃静 肃静 应当肃静 阿门 + + + + 爱的印记(改) + + 于太初创始 远在天国度 + 父就在这刻 爱为我彰显 + 观看所作的 一切皆美善 + 尽合父意思 引导我一生 + 神造我并赐生命和尊贵 + 神为我牺牲世事不可媲美 + 完全奉献心中的赞颂 + 因为您 求用我一生为您尽献 + I love you I trust in you + 将心中爱放在您心里 + 求属我心印记 + + + + 复兴的火 + + 复兴的火焰正燃烧 让我们响起胜利的号角 + 传扬耶稣基督的真道 一起迈向合一的宣教 + 在主前同心的祷告 让我们忠于十架的呼召 + 以赞美在宝座前围绕 让复兴的火在我里面燃烧 + + 复兴的火 圣灵的火 在我心中点燃 + 复兴的火 圣灵的火 把我烧在主祭坛 + + + + 耶和华尼西 + + 高举神是我的旌旗 面对世间冲击 + 坚守神是我的真理 来为基督争战 + 耶和华尼西 耶和华尼西我上帝 + + + + 燃烧赤子心 + + 神御赐生机 无限生气 丰富盛载恩典力量 + 神属性盖我本性 得胜亦有余 + 神御赐使命 神仆呼应 一起盛载艰苦任命 + 团队誓奋斗不息 坚决齐共往 + 凝聚赤子心 燃烧 燃尽一生给主用 + 熔尽你共我的真诚 破千关 + 凝聚教会心 燃烧 燃尽一生给主用 + 熔尽你共我的恩情 拼搏为主 + + + + 神圣婴孩 + + 多安宁 神圣婴孩 马槽安稳 草柔软 + 看东方 轻抹光影 圣诞清晨终显现 + 小圣婴 因您诞生 荒野牧人弃群羊 + 欢笑 眼泪皆一样 却无罪恶 无玷污 + 祂带来何等恩赐 成就天父心所愿 + 小身躯隐约揭示上帝应许皆实现 + 小圣婴 你生世上 亲尝我们乐与苦 + 欢笑 眼泪皆一样 却无罪恶无玷污 + 祂远离荣耀家园 寻找祂失丧民众 + 尝苦杯死亡灾难 躺卧孤寂幽墓中 + 小圣婴 因您圣名 黑暗权势尽倾覆 + 阴间 罪权皆屈服 您是主基督耶稣 + 多安宁 神圣婴孩 马槽安稳 草柔软 + 看东方 轻抹光影 圣诞清晨终显现 + + + + 我是你所造 + + 是你创造我的肺腑 在母腹中你已覆庇我 + 我的受造奇妙可畏 你的作为我心深知道 + 我在暗中受造被联络 未成形的体质你已看见 + 我的日子是你所定 尚未度一日已写在你的册上 + + 你的意念向我何等宝贵 恩典比海沙更多 + 求你鉴察我 试炼我 引导我走永生的道路 + + + + 你是圣洁 + + 你是圣洁 圣洁 无人与你相比 + 你是圣洁 圣洁 荣耀归予我主 + + 我要高歌赞颂你圣名 奉上我爱予你 + 于主光中愿洁净我心灵 更新我灵像你 + + + + 以清洁的心我赞美你 + + 以清洁的心我赞美你 + 以清洁的心我尊崇你 + 以我里面正直的灵 我要高举你的名 + 我要高举你的名 我要高举你的名 + 心中充满着对你的爱 我要歌颂你的名 + + + + 寻求你的面 + + 神啊求你按你的慈爱怜恤 按你丰盛的慈悲涂抹过犯 + 求你将我的罪孽洗除净尽 洁除我的罪 + 我向你犯罪惟独得罪了你 你责备我的时候显为公义 + 你判断我的时候显为正直 求主赦免 + 你所喜爱的 (是内里的诚实) + 你在我隐密处 (必使我得智慧) + 今我谦卑祷告 寻求你的面 + 转离我恶行 (求你从天垂听) + 赦免我们的罪 (医治我们的地) + 今我谦卑祷告 寻求你的面 + + + + 主我给您我心 + + 主啊 我只渴求 崇敬主您 + 我要尽我心敬拜恩主 + 于我内里一切 也都歌唱 + 我所盼所思在于您 + 主我给您我心 灵都归给您 为恩主您而活 + 我这生里每天 存留的每口气 求显主您美意 + + + + 让我们来登 + + 让我们来登 让我们来登 + 让我们来登 登耶和华的山 + 那里有主就有自由 那里有主就有喜乐 + 祂要教导祂的话语 指示祂的路 + 那里有主就有能力 那里有主就有慈爱 + 这些祝福都是你的 你只需要来 + 让我们来登 让我们来登 + 让我们来登 登耶和华的山 + + + + 我们欢迎您来到 + + 耶稣愿您降临 停留在我心中 + 唯您被我欢迎来居住我心 + 这心作您家您可顺意 于我身上作一切您爱的事 + 亲爱耶稣来 来接受我爱 + 让我们再说您是我们的一切 + 亲爱耶稣来 接受我们的倾诉 + 我们欢迎您来到 + + + + + + 恩典之路 + + 你是我的主.引我走正义路. + 高山或低谷.都是你在保护. + 万人中唯独.你爱我认识我. + 永远不变的应许.这一生都是祝福. + 一步又一步.这是恩典之路. + 你爱.你手.将我紧紧抓住. + 一步又一步.这是盼望之路. + 你爱.你手.牵引我走这人生路. + + + + 满有能力 + + 我的盼望.就在耶稣基督里. + 在你里面满有平安.生命泉源. + 就在耶稣基督里.有主在我里面活着. + 我宣告在我里面的. + 比世上一切更有能力. + 我不属这世界.我高举耶稣的名. + 我宣告在我里面有. + 活水涌流满有能力. + 有耶稣在我里面活着.我勇敢站立. + 有主在我里面.没有惧怕.能战胜仇敌. + 有主在我里面.没有惧怕.还得胜有余 + + + + 如鹰展翅上腾 + + 祂已听见我的呼求,祂也明白我的渴望, + 放下重担,脱去一切缠累,恢复神造我的荣美形象, + 永在的神,创造万物的主, 祂的智慧无法测度, + 疲乏的祂赐能力,软弱的祂加力量,等候耶和华必从新得力, + + 如鹰展翅上腾,翱翔在神的国度里, + 飞越所有艰难和风暴, 单单注视你荣耀宝座, + 如鹰展翅上腾, 翱翔在神的国度里, + 领受圣灵恩膏和大能, 活出美好自由的风采。 + + + + 神羔羊配得 + + 感谢你的十字架 感谢你付上代价 + 担当我罪和羞愧 使我完全 + 赐下奇妙恩典 感谢你无比大爱 + 感谢你钉痕双手 宝血洗净我污秽 + 使我了解 你完全包容赦免 + 神羔羊配得 坐在宝座上 头戴着尊贵冠冕 你做王到永远 + 来尊崇赞美 耶稣神儿子 从天降下被钉十架 + 神羔羊配得 神羔羊配得 + + + + 最珍贵的角落 + + 谢谢你灿烂笑容,照亮我的天空 + 谢谢你分享心情,把我放在你心中 + 夜里有时为寒冷,你我生根同暖土 + 友情是最亮的星,我的生命从此美丽 + 当你被花朵包围尽情欢欣 + 我带春风使你舞其中 + 当你正走在坎坷路,我会伴你在左右 + 一起向蓝天欢呼,向白云招手 + 我们要一起笑一起哭 + 千万人中有个人懂我 + 你有最珍贵的角落 + + 谢谢你灿烂笑容,照亮我的天空 + 谢谢你分享心情,把我放在你心中 + 夜里有时为寒冷,你我生根同暖土 + 友情是最亮的星,我的生命从此美丽 + 当你被花朵包围尽情欢欣 + 我带春风使你舞其中 + 当你正走在坎坷路,我会伴你在左右 + 一起向蓝天欢呼,向白云招手 + 我们要一起笑一起哭 + 千万人中有个人懂我 + 你有最珍贵的角落 + 当你被花朵包围尽情欢欣 + 我带春风使你舞其中 + 当你正走在坎坷路,我会伴你在左右 + 一起向蓝天欢呼,向白云招手 + 我们要一起笑一起哭 + 千万人中有个人懂我 + 你有最珍贵的角落 + 千万人中有个人懂我 + 你有最珍贵的角落 + + + + 耶和华祝福满满 + + 田中的白鹭鸶 无欠缺什么 + 山顶的百合花 春天现香味 + 总是全能的上帝 每日赏赐真福气 + 使地上发芽结实 显出爱疼的根据 + + 耶和华祝福满满 就像海边土沙 + 恩典慈爱直到万世代 + 我要举手敬拜他 用欢喜的歌声 + 赞美称颂他名永无息 + + + + 脚步 + + 祢的脚步带着我的脚步 + 一步一步都有祝福 + 每个脚步我要紧紧跟随 + 走在蒙福的道路 + 求给我更多的勇气 + 给我更多的信心 + 让我勇敢踏出跟随祢的脚步 + 跟祢行在水面上 + 跟祢走在旷野地 + 曲曲折折我也不在乎 + 我只要更多信靠祢 + 只要更多顺服祢 + 凡是出于祢的我就默然不语 + 就算经过黑暗谷 + 就算遇到暴风雨 + 在祢手中都将变成祝福 + + + + 爱可以再更多一点点 + + 我可以拥有全世界却没有爱 + 我可以明白所有事却还是空白 + 我可以用信心移山却还是孤单 + 这世界没有了爱 一切仍是黑白 + 不要埋藏在心里 把爱说出来 + 不要默默在一旁 把爱活出来 + 喔爱 可以在更多一点点 + 不怕被伤害 把灵魂锁起来 + 爱 可以在更多一点点 + 从天父来的爱 把惧怕挪开 + 发现幸福在转角与你相遇 + 一瞬间 这世界变的好美 + + + + 丰盛的应许 + + 你仰脸保守你所爱的你护庇永远不离弃 + 你将我从淤泥里捧起放我在你的手心 + 我凭着信心领取你丰盛的应许 + 世界也不能夺去神美好的旨意 + 我凭着信心领取你恩典永不止息 + 看见美好应许成就荣耀全都归于你 + 我等候主我相信你爱我永不放弃 + 世界也不能夺去神美好的旨意 + 我等候主我相信你旨意高过我的 + 看见美好应许成就我全心全意敬拜你 + + + + 何等恩典 + + 以真诚的心.降服在你面前. + 开我心眼使我看见. + 以感恩的心.领受生命活水. + 从你而来的温柔谦卑. + 何等恩典.你竟然在乎我. + 何等恩典.你宝血为我流. + 何等恩典.你以尊贵荣耀为我冠冕. + 我的嘴必充满赞美. + 你已挪去我所有枷锁. + 你已挪去我所有重担. + 你已挪去我所有伤悲. + 你的名配得所有颂赞 + + + + 空谷的回音 + + 我是空谷的回音 四处寻找我的心 + 问遍溪水和山川 我心依然无处寻 + 哦我曾经多旁徨 四周一无安息土 + 笑声留不住欢乐 眼泪带不走痛苦 + 我说生命不希奇 一声叹息归尘土 + 放弃一切的追求 任凭潮水带我走 + 哦我曾经多旁皇 四周一无安息土 + 笑声留不住欢乐 眼泪带不走痛苦 + 有人曾经告诉我 耶稣正在寻找我 + 他爱能够保护我 他手能够医治我 + 哦我心中多快乐 我又见到那太阳 + 我心紧紧跟随他 我唇还要赞美他 + 朋友你今在那里 四处奔跑何时已 + 如果你还愿意听 让我在来告诉你 + 耶稣基督救赎主 他曾满足心无数 + 向他倾诉向他哭 他必使你得饱足 + + + + 神迹 - 芥菜种音乐 + + 感谢你所赐新生命,因你爱使我们聚集。 + 若不因为你我怎能在这里。被赎的生命交托于你。 + + 感谢你教导的真理,提醒我天天要舍己。 + 让你在我生命中来管理,我心有神走过的痕迹。 + + 哦~神啊我要跟随你!赐我们全然向你的心, + 没有人事物能与你相比,帮助我走的更坚定。 + + 哦~神啊,我要事奉你,用我被改变的生命, + 在每一日中彰显你神迹,使人看见,将荣耀归你, + + + + 相信有爱,就有奇迹 + + 黑夜将过去 未来不再迟疑 + 牵起我的手 祢给我勇气 + 曙光渐显明 点亮前方路 + 我展翅高飞 祢给我信心 + 只要相信 相信就有奇迹 + 挥动信心的翅膀 随着梦想起飞 + 相信有爱 就有奇迹 + 不轻言放弃 只要打开眼睛 + 手牵手一起 就不孤寂 + 相信有爱 就有奇迹 + 虽然逆着风 祢给我勇气 + 飞往那佳美之地 + + 信じれば 奇迹はおこる + あきらめず 目を开いて + つないだ手 离さずに + + 只要相信相信就有奇迹 + 挥动信心的翅膀 随着梦想起飞 + + + + 主你是我力量 + + 我的诗歌 我的拯救 + 祢是我患难中随时的帮助 + 众山怎样围绕耶路撒冷 + 祢必围绕我到永远 + 主祢是我力量 主祢是我高台 + 坚固磐石 我信靠祢必不动摇 + 主祢是我力量 主祢是避难所 + 我的盼望只在乎祢 + + 我的诗歌 我的拯救 + 祢是我患难中随时的帮助 + 众山怎样围绕耶路撒冷 + 祢必围绕我到永远 + 主祢是我力量 主祢是我高台 + 坚固磐石 我信靠祢必不动摇 + 主祢是我力量 主祢是避难所 + 我的盼望只在乎祢 + + 主祢是我力量 主祢是我高台 + 坚固磐石 我信靠祢必不动摇 + 主祢是我力量 主祢是避难所 + 我的盼望只在乎祢 + + 我的盼望只在乎祢 + 我的盼望只在乎祢 + 主祢是我力量 主祢是我高台 + 坚固磐石 我信靠祢必不动摇 + 主祢是我力量 主祢是避难所 + 我的盼望只在乎祢 + + 主祢是我力量 主祢是我高台 + 坚固磐石 我信靠祢必不动摇 + 主祢是我力量 主祢是避难所 + 我的盼望只在乎祢 + + 我的盼望只在乎祢 + 我的盼望只在乎祢 + 我的盼望只在乎祢 + + + + 坐在宝座上圣洁羔羊 + + 坐在宝座上圣洁羔羊 + 我们俯伏敬拜你 + 昔在今在以后永在 + 唯有你是全能真神 + 坐在宝座上尊贵羔羊 + 我们俯伏敬拜你 + 颂赞尊贵荣耀权能 + 都归给你直到永远 + 万王之王 万主之主 + 唯有你配得敬拜和尊崇 + 万王之王 万主之主 + 我们高举你圣名直到永远 + + + + 你的爱 + + 你创造宇宙万物,统管一切所有, + 但你却关心我的需要,了解我的感受。 + + 你手铺陈天上云彩,打造永恒国度, + 但这双手却甘心为我,忍受彻骨钉伤苦痛。 + + 你公义审判万民,圣洁光照全地; + 但你却一再施恩典,一再施怜悯, + 给我机会回转向你。 + + 你的爱如此温柔,超乎我心所想。 + 这样大有能力的主,竟捧我在手掌心上。 + + 你的爱如此深切,我知我无以报答, + 但愿倒空我的生命,学习你谦卑的样式, + 背起我自己的十字架。 + + + + 我一生 + + 我在主面前拍拍手 + 在主前跳跳舞 + 在主面前唱一首欢乐的歌 + 耶稣爱我我知道 + 耶稣爱我不改变 + 耶稣爱我,哈利路亚 + 我在主面前拍拍手 + 在主前跳跳舞 + 在主面前唱一首欢乐的歌 + 耶稣爱我我知道 + 耶稣爱我不改变 + 耶稣爱我,哈利路亚 + 我一生要赞美主 + 我一生要事奉主 + 我一生要来彰显主荣美 + 我一生要为主而活 + 我一生要高举主 + 我一生要跟随主 + 我一生要来彰显主荣美 + 我一生要为主而活 + + 我要赞美主,赞美主 + 我要全心全意来赞美主 + 我要赞美主,赞美主 + 我要一生一世来赞美主 + 我要赞美主,赞美主 + 我要全心全意来赞美主 + 我要赞美主,赞美主 + 我要一生一世来赞美主 + 我一生要赞美主 + 我一生要事奉主 + 我一生要来彰显主荣美 + 我一生要为主而活 + 我一生要高举主 + 我一生要跟随主 + 我一生要来彰显主荣美 + 我一生要为主而活 + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/AboutActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/AboutActivity.java new file mode 100644 index 0000000..b2c4665 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/AboutActivity.java @@ -0,0 +1,35 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.util.Linkify; +import android.widget.TextView; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-6 + * Time: 下午10:33 + */ +public class AboutActivity extends Activity { + private SharedPreferences sharedPreferences; + + private String ABOUT_CONTENT = "\n我们是位于马里兰州Germantown的德国镇基督教会,欢迎大家光临。http://www.cccgermantown.org/ " + + "\n\n 本app为方便团契或其他聚会时大家敬拜之用,至少可以省去打印的麻烦:-) " + + "\n\n任何意见,请反馈至: vcfvct@gmail.com \n感谢Katie的鼓励和添加歌曲^_^。"; + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sharedPreferences = getSharedPreferences(getString(R.string.app_pref), MODE_PRIVATE); + if (sharedPreferences.getBoolean(getString(R.string.night_mode_pref_key), true)) { + setTheme(android.R.style.Theme_Holo); + } else { + setTheme(android.R.style.Theme_Holo_Light); + } + TextView textView = new TextView(this); + textView.setLineSpacing(10, 1); + textView.setAutoLinkMask(Linkify.ALL); + textView.setText(ABOUT_CONTENT); + setContentView(textView); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/ChatActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/ChatActivity.java new file mode 100644 index 0000000..9224d40 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/ChatActivity.java @@ -0,0 +1,940 @@ +package com.goodtrendltd.HolySongs; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.support.v4.content.LocalBroadcastManager; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.ActionBar; +import android.support.v7.app.NotificationCompat; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import org.jivesoftware.smack.ConnectionListener; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; + +import com.goodtrendltd.HolySongs.bus.BibleSetting; +import com.goodtrendltd.HolySongs.bus.GlobalMediaStar; +import com.goodtrendltd.HolySongs.bus.UserMag; +import com.goodtrendltd.HolySongs.chat.ApplicationSessionStateCallback; +import com.goodtrendltd.HolySongs.chat.BaseChatActivity; +import com.goodtrendltd.HolySongs.chat.Chat; +import com.goodtrendltd.HolySongs.chat.ChatAdapter; +import com.goodtrendltd.HolySongs.chat.ChatMessage; +import com.goodtrendltd.HolySongs.chat.ChatService; +import com.goodtrendltd.HolySongs.chat.ChatService.UserTask; +import com.goodtrendltd.HolySongs.chat.ChatUser; +import com.goodtrendltd.HolySongs.chat.HttpClientUtil; +import com.goodtrendltd.HolySongs.entities.ChatThreadScheduler; +import com.goodtrendltd.HolySongs.entities.NavigationCategory; +import com.goodtrendltd.HolySongs.helpers.CommonMethod; +import com.quickblox.chat.model.QBDialog; +import com.quickblox.core.request.QBRequestGetBuilder; + + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; + +public class ChatActivity extends BaseChatActivity implements ApplicationSessionStateCallback, SwipeRefreshLayout.OnRefreshListener { + + private static final String TAG = "ChatActivity"; + + public static final String EXTRA_DIALOG = "dialog"; + private final String PROPERTY_SAVE_TO_HISTORY = "save_to_history"; + public static final String CHAT_INFO_DATE = "chat_info_date"; + + private EditText messageEditText; + private ListView messagesContainer; + private Button sendButton; + private ProgressBar progressBar; + private ChatAdapter adapter; + private SwipeRefreshLayout swipeLayout; + + private Chat chat; + private QBDialog dialog; + private RelativeLayout container; + private String userkey = ""; + private Boolean finishedLoading = false; + private String token = null; //app push token + private Boolean fromGospel = false; + private ArrayList messageList = new ArrayList(); + private ArrayList idList = new ArrayList<>(); + private Integer mId=0; + private Integer SERVER_CONNECT_ATTEMPTS = 3;//number of attempts to get chat history + private Integer retry = SERVER_CONNECT_ATTEMPTS; + private AlertDialog errorDialog = null; + AlertDialog.Builder errorDialogBuilder = null; + private ChatActivity content; + private static ChatUser chatUser = null; + private LinearLayout errorView = null; + int updateTries = 0; + private int lastTask = 0; + private int LOAD_MESSAGES = 1; + private int REGISTER = 2; + private int UPDATE_USER = 3; + public static String CATEGORY = "category"; + public static String FORM_MESSAGE = "form message"; + private int category = -1; + private String formMessage = "", name = ""; + public static String NAME = "name"; + Dialog decisionDialog; + ChatMessage infoMessage = null; + Boolean registerSuccess = false; + static int TRIES_MAX = 3; + + public static void start(Context context, Bundle bundle) { + Intent intent = new Intent(context, ChatActivity.class); + intent.putExtras(bundle); + context.startActivity(intent); + } + + protected void initToolbar() { + ActionBar actionbar = getSupportActionBar(); + if (actionbar != null) { + actionbar.setDisplayShowTitleEnabled(false); + actionbar.setDisplayShowHomeEnabled(true); + actionbar.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_chat); + content = this; + Bundle extras = getIntent().getExtras(); + if(extras != null){ + if (extras.getInt("fromGospel", 0) != 0) { + fromGospel = true; + } + category = extras.getInt(CATEGORY, -1); + formMessage = extras.getString(FORM_MESSAGE); + name = extras.getString(NAME); + } + + Log.v(TAG,"onCreate fromGospel: "+fromGospel + " --"); + initViews(); + initToolbar(); + // Init chat if the session is active + if (isSessionActive()) { + initChat(); + } + + ChatService.getInstance().addConnectionListener(chatConnectionListener); + + new Thread(new Runnable() { + @Override + public void run() + { + GlobalMediaStar.recordOpenChat(content); + } + }).start(); + } + + @Override + public void onResume() { + super.onResume(); + lastTask=0; + ChatThreadScheduler.getInstance().rescheduleCheckMessages(ChatThreadScheduler.SHORT_PERIOD); + Log.v(TAG, "onResume"); + // Register mMessageReceiver to receive messages. + LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, + new IntentFilter(ChatService.NEW_MESSAGES)); + // Clear all notifications + NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + nMgr.cancelAll(); + } + + @Override + public void onPause() { + Log.v(TAG, "onPause()"); + // Unregister since the activity is not visible + ChatThreadScheduler.getInstance().rescheduleCheckMessages(ChatThreadScheduler.LONG_PERIOD); + LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); + super.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + Log.v(TAG, "onStop()"); + ChatThreadScheduler.getInstance().rescheduleCheckMessages(ChatThreadScheduler.LONG_PERIOD); + + } + + //begin of menu related + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu items for use in the action bar + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.chat_menu, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + case R.id.findchurch: + showChurchForm(); + return true; + case R.id.gospel: + showGospelActivity(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onStart() { + super.onStart(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + Log.v(TAG, "onDestroy()"); + ChatThreadScheduler.getInstance().rescheduleCheckMessages(ChatThreadScheduler.LONG_PERIOD); + ChatService.getInstance().removeConnectionListener(chatConnectionListener); + } + + @Override + public void onBackPressed() { + Log.v(TAG, "onBackPressed"); + if (chat!=null) { + try { + chat.release(); + } catch (XMPPException e) { + Log.e(TAG, "failed to release chat", e); + } + } + super.onBackPressed(); + if (decisionDialog!=null) { + decisionDialog.dismiss(); + } + if(fromGospel){ + Intent intent = new Intent(); + if(CommonMethod.isNetworkAvailable(content)==true) + { + intent.putExtra("page",NavigationCategory.Home); + } + else + { + intent.putExtra("page", NavigationCategory.Library); + } + intent.setClass(ChatActivity.this, MainActivity.class); + ChatActivity.this.startActivity(intent); + ChatActivity.this.finish(); + } + else + { + finish(); + } + } + + private void initViews() { + messagesContainer = (ListView) findViewById(R.id.messagesContainer); + messagesContainer.setOverScrollMode(View.OVER_SCROLL_NEVER); + messageEditText = (EditText) findViewById(R.id.messageEdit); + progressBar = (ProgressBar) findViewById(R.id.progressBar); + errorView = (LinearLayout) findViewById(R.id.error_view); + swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); + swipeLayout.setOnRefreshListener(this); + swipeLayout.setRefreshing(false); + //加载颜色是循环播放的,只要没有完成刷新就会一直循环,color1>color2>color3>color4 + swipeLayout.setColorSchemeResources( + android.R.color.holo_green_light, + android.R.color.holo_orange_light, android.R.color.holo_red_light); + + Intent intent = getIntent(); + dialog = (QBDialog) intent.getSerializableExtra(EXTRA_DIALOG); + container = (RelativeLayout) findViewById(R.id.container); + chatUser = ChatUser.getInstance(); + + adapter = new ChatAdapter(ChatActivity.this, messageList); + messagesContainer.setAdapter(adapter); +// LinearLayout pickCategoryButton = (LinearLayout)findViewById(R.id.linear_chat_category); +// pickCategoryButton.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// Intent intent = new Intent(); +// intent.setClass(ChatActivity.this, ChatPreActivity.class); +// ChatActivity.this.startActivity(intent); +// } +// }); + + // Send button + // + sendButton = (Button) findViewById(R.id.chatSendButton); + sendButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String messageText = messageEditText.getText().toString(); + if (TextUtils.isEmpty(messageText)) { + return; + } + sendChatMessage(messageText); + + } + }); + errorView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (lastTask == LOAD_MESSAGES) { + onPreparing(); + loadPastMessages(); + } + else if (lastTask == REGISTER) { + onPreparing(); + register(chatUser); + } + else if (lastTask == UPDATE_USER){ + onPreparing(); + updateUser(chatUser); + } + } + }); + + onPreparing(); + + } + + private void showChurchForm() { + Intent intent = new Intent(); + intent.setClass(ChatActivity.this, ChatFormActivity.class); + intent.putExtra(ChatFormActivity.CATEGORY, ChatPreActivity.CHURCH); + ChatActivity.this.startActivity(intent); + } + + private void showGospelActivity() { + Intent intent = new Intent(this, GospelActivity.class); + intent.putExtra("origin","main"); + startActivity(intent); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) + { + if (keyCode == KeyEvent.KEYCODE_BACK ) + { + Log.v(TAG,fromGospel + " --"); + if(fromGospel){ + Intent intent = new Intent(); + if(CommonMethod.isNetworkAvailable(content)) + { + intent.putExtra("page",NavigationCategory.Home); + }else + { + intent.putExtra("page", NavigationCategory.Library); + } + intent.setClass(ChatActivity.this, MainActivity.class); + ChatActivity.this.startActivity(intent); + ChatActivity.this.finish(); + } + else + { + finish(); + } + } + return super.onKeyDown(keyCode, event); + } + + private void showKeyboard() { + ((InputMethodManager) messageEditText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(messageEditText, InputMethodManager.SHOW_IMPLICIT); + } + + private void hideKeyboard() { + //TODO: Make this actually work + ((InputMethodManager) messageEditText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(messageEditText.getWindowToken(), 0); + } + + + private void sendChatMessage(String messageText) { + sendChatMessage(messageText, true); + } + + private void sendChatMessage(String messageText, Boolean visible) { + UserMag.recordChatFirstMessage(ChatActivity.this); + final ChatMessage chatMessage = new ChatMessage(); + chatMessage.setBody(messageText); + //chatMessage.setProperty(PROPERTY_SAVE_TO_HISTORY, "1"); + chatMessage.setDate(Calendar.getInstance().getTime()); + chatMessage.setDirection("in"); + chatMessage.setSendingInProgress(true); + + try { + if (visible) { + showMessage(chatMessage); + final Integer msgIndex = messageList.indexOf(chatMessage); + ChatService.sendMessage(chatMessage.getBody(), new ChatService.MessageTask() { + @Override + protected void onSuccessfulSend(int id) { + messageList.get(msgIndex).setSendingInProgress(false); + adapter.notifyDataSetChanged(); + } + }); + } + else { + Log.d(TAG,"form message: "+chatMessage.getBody()); + ChatService.sendMessage(chatMessage.getBody(), new ChatService.MessageTask() { + @Override + protected void onSuccessfulSend(int id) { + UserMag.addFormMessageId(getBaseContext(), id); + chatUser.addFormMessageId(id); + Log.d("chat-form", "set form message id: "+id); + } + }); + } + } catch (Exception e) { + Log.e(TAG, "failed to send a message", e); + } + messageEditText.setText(""); + } + + public void setContentBottomPadding(int padding) { + container.setPadding(0, 0, 0, padding); + } + + private void initChat() { + token = ChatService.getToken(this); + + // Restore preferences + userkey = ChatUser.getInstance().getKey(); + + if (userkey.isEmpty()) { //need to register + Log.d("chat-activity-token", "token being used: " + token); + if (fromGospel) { + showDecisionDialog(true); + } + else + { + //pick a category + switch (category) { + case -1: + ShowChatCategory(); + break; + case ChatPreActivity.FAITH: + showNameDialog(); + break; + default: //already picked a category + chatUser.setUsername(name); + chatUser.setFormMessage(formMessage); + register(chatUser); + swipeLayout.setEnabled(false); + break; + } + } + } + else { // has a userkey + if (fromGospel) { + showDecisionDialog(false); + } + loadChatHistory(); + + //send category message + if (category!=-1 && category!=ChatPreActivity.FAITH) { + chatUser.setFormMessage(formMessage); + sendChatMessage(chatUser.getFormMessage(), false); + } + Log.d("ChatActivity", "ChatUser key being used: " + userkey); + Log.d("ChatActivity-token", "token being used: " + token); + + } + } + + private void register(ChatUser user) { + final ChatUser finalUser = user; + if (registerSuccess){ + Log.v("chat-activity", "register already succeeded!"); + //catch called twice + return; + } + showAlert(getString(R.string.registering)); + ChatService.register(token, new UserTask() { + @Override + protected void onSuccess() { + registerSuccess = true; + updateUser(finalUser); //after registering, update with user info from dialog + if (!finalUser.getFormMessage().isEmpty()) { + sendChatMessage(finalUser.getFormMessage(),false); + } + onLoadFinish(); + showInfoMessage(); + } + + @Override + protected void onFailure() { + if (!ChatActivity.this.isFinishing()) { + showAlert("Unable to register"); + onNetworkFailure(REGISTER); + } + } + }); + } + + private void onNetworkFailure(int task) { + //showErrorsAlert("网络失败"); + lastTask = task; + progressBar.setVisibility(View.GONE); + errorView.setVisibility(View.VISIBLE); + finishedLoading = false; + if (errorDialog != null) { + errorDialog.dismiss(); + } + sendButton.setEnabled(false); + } + + private void onPreparing() { + progressBar.setVisibility(View.VISIBLE); + errorView.setVisibility(View.GONE); + finishedLoading = false; + sendButton.setEnabled(false); + } + + private void onLoadFinish() { + if (ChatActivity.this.isSessionActive()) { + Log.v(TAG, "onLoadFinish()"); + progressBar.setVisibility(View.GONE); + sendButton.setEnabled(true); + if (errorDialog != null) { + errorDialog.dismiss(); + } + finishedLoading = true; + chatUser.emptyInbox(); +// navBar.setNotificationBubble(); + } + } + + private void updateUser(final ChatUser user) { + ChatService.updateUser(user.getUsername(), user.getDecision(), new UserTask() { + @Override + protected void onSuccess() { + Log.v(TAG, "updateUser() successful"); + } + + @Override + protected void onFailure() { + if (!ChatActivity.this.isFinishing()) { +// onNetworkFailure(UPDATE_USER); + if (updateTries < TRIES_MAX) { + updateTries++; + updateUser(user); + //TODO: Deal with this from return and still unupdated + } + } + } + }); + } + + + @Override + public void onRefresh() { + Log.d(TAG, "Loading Messages"); + ChatService.loadMoreMessages(adapter.getCount(), new ChatService.MessageTask() { + @Override + protected void onSuccessfulReceive(HttpClientUtil.ResponseObject msgResponse) { + ArrayList messages = msgResponse.getMessages(); + Integer i; + for (i = messages.size() - 1; i >= 0; i--) { + messageList.add(0, messages.get(i)); + idList.add(messages.get(i).getId()); + } + adapter.notifyDataSetChanged(); + swipeLayout.setRefreshing(false); + if (msgResponse.getPageNext() == 0) { + swipeLayout.setEnabled(false); + messagesContainer.setOverScrollMode(View.OVER_SCROLL_ALWAYS); + } + } + }); + } + + private void loadChatHistory() { + QBRequestGetBuilder customObjectRequestBuilder = new QBRequestGetBuilder(); + customObjectRequestBuilder.setPagesLimit(100); + customObjectRequestBuilder.sortDesc("date_sent"); + swipeLayout.setEnabled(false); + hideKeyboard(); + loadPastMessages(); + } + + private void loadPastMessages() { + getMessages(false, 10); + } + + private void getMessages(final Boolean onlyNew, int count) { + ChatService.getMessages(onlyNew, count, 1, new ChatService.MessageTask() { + @Override + protected void onSuccessfulReceive(HttpClientUtil.ResponseObject msgResponse) { + onLoadFinish(); + if (msgResponse.getPageNext() > 0) { + swipeLayout.setEnabled(true); + } else { + swipeLayout.setEnabled(false); + showInfoMessage(); + } + ArrayList messages = msgResponse.getMessages(); + showMessages(messages, onlyNew); + progressBar.setVisibility(View.GONE); + finishedLoading = true; + retry = SERVER_CONNECT_ATTEMPTS; //reset attempts + } + + @Override + protected void onFailure() { + if (retry > 0) { + retry--; + if (errorDialog == null) { + showAlert("Could not connect to server. Retrying..."); + } + loadPastMessages(); + } else { + onNetworkFailure(LOAD_MESSAGES); + } + Log.e(TAG, "Error Receiving Messages"); + } + }); + } + + private void showAlert(final String string) { + final Handler handler = new Handler(); + if (errorDialog == null) { + errorDialogBuilder = new AlertDialog.Builder(ChatActivity.this); + errorDialogBuilder.setCancelable(true); + errorDialog = errorDialogBuilder.create(); + } + handler.postDelayed(new Runnable() { + @Override + public void run() { + if (!finishedLoading && isSessionActive()) { + errorDialog.setMessage(string); + errorDialog.setCanceledOnTouchOutside(true); + if (ChatActivity.this.isSessionActive()) { + errorDialog.show(); + } + } + } + }, 3); + Log.e("ChatActivity-register", "chat alert: " + string); + } + + // handler for received Intents for the "new messages" event + private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // Extract data included in the Intent + int count = intent.getIntExtra(ChatService.COUNT, 0); + Log.d("chat-receiver", "Got number of messages: " + count); + getMessages(true, count); + chatUser.emptyInbox(); + } + }; + + public void showMessages(ArrayList messages, Boolean onlyNew) { + for (ChatMessage msg : messages) { + // Either show all, or only new incoming messages + if (!msg.isOutgoing() || !onlyNew) { + Log.v("chat-receiver", "adding id:"+msg.getId()); + if (!msg.isRead()) { chatUser.markAsRead(msg.getId()); } + showMessage(msg); + Log.v("chat-receiver", "readbox now: " + chatUser.getReadList()); + + } + } + if (!chatUser.getReadList().isEmpty()) { + ChatService.markAsRead(chatUser.getReadList(), new ChatService.MessageTask() { + @Override + protected void onSuccessfulMark() { + adapter.notifyDataSetChanged(); + chatUser.emptyReadList(); + } + }); + } + } + + public void showMessage(ChatMessage message) { + if (adapter==null) { + adapter = new ChatAdapter(this,messageList); + } + if (!idList.contains(message.getId())) { + messageList.add(message); + idList.add(message.getId()); + runOnUiThread(new Runnable() { + @Override + public void run() { + adapter.notifyDataSetChanged(); + scrollDown(); + } + }); + } + } + + public void showInfoMessage() { + if (infoMessage==null) { + String storedDate = BibleSetting.SysConfigQuery(this, CHAT_INFO_DATE); + + Log.v(TAG, "showInfoMessage infoMessage==null"); + infoMessage = new ChatMessage(); + if (category==ChatPreActivity.CHURCH) { + infoMessage.setBody(getResources().getString(R.string.chat_welcome_message_church)); + } else { + infoMessage.setBody(getResources().getString(R.string.chat_welcome_message)); + } + infoMessage.setDirection("out"); + if (storedDate==null || storedDate.isEmpty()) { + infoMessage.setDate(Calendar.getInstance().getTime()); + BibleSetting.SysConfigUpdate(this, CHAT_INFO_DATE, infoMessage.getUTCDate()); + } else { + try { + infoMessage.setDateFromString(storedDate); + } catch (ParseException e) { + infoMessage.setDate(Calendar.getInstance().getTime()); + e.printStackTrace(); + } + } + infoMessage.setId(-12); + } + if (!messageList.contains(infoMessage)) { + Log.v(TAG, "showInfoMessage !messageList.contains(infoMessage) "); + messageList.add(0,infoMessage); + idList.add(infoMessage.getId()); + if (adapter==null) { + Log.v(TAG, "showInfoMessage adding to adapter "); + adapter = new ChatAdapter(this, messageList); + messagesContainer.setAdapter(adapter); + + } + adapter.notifyDataSetChanged(); + } + } + + private void scrollDown() { + messagesContainer.setSelection(messagesContainer.getCount() - 1); + } + + + ConnectionListener chatConnectionListener = new ConnectionListener() { + @Override + public void connected(XMPPConnection connection) { + Log.i(TAG, "connected"); + } + + @Override + public void authenticated(XMPPConnection connection) { + Log.i(TAG, "authenticated"); + } + + @Override + public void connectionClosed() { + Log.i(TAG, "connectionClosed"); + } + + @Override + public void connectionClosedOnError(final Exception e) { + Log.i(TAG, "connectionClosedOnError: " + e.getLocalizedMessage()); + } + + @Override + public void reconnectingIn(final int seconds) { + if (seconds % 5 == 0) { + Log.i(TAG, "reconnectingIn: " + seconds); + } + } + + @Override + public void reconnectionSuccessful() { + Log.i(TAG, "reconnectionSuccessful"); + } + + @Override + public void reconnectionFailed(final Exception error) { + Log.i(TAG, "reconnectionFailed: " + error.getLocalizedMessage()); + } + }; + + @Override + public void onStartSessionRecreation() { + + } + + @Override + public void onFinishSessionRecreation(final boolean success) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (success) { + initChat(); + } + } + }); + } + + protected void ShowChatCategory() + { + Intent intent = new Intent(); + intent.setClass(ChatActivity.this, ChatPreActivity.class); + UserMag.clearNewNotification(); + this.startActivity(intent); + this.finish(); + } + + protected void showNameDialog() { + chatUser.setDecision(ChatUser.NONE); + finishedLoading=false; + AlertDialog.Builder builder = new AlertDialog.Builder(ChatActivity.this); + LayoutInflater inflater = ChatActivity.this.getLayoutInflater(); + View dialogView = inflater.inflate(R.layout.dialog_chat_name, null); + final EditText nameEditText = (EditText) dialogView.findViewById(R.id.nameTextView); + builder.setView(dialogView) + .setPositiveButton(R.string.submit, null) + .setNegativeButton(R.string.skip, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + swipeLayout.setEnabled(false); + register(chatUser); + } + }); + final AlertDialog dialog = builder.create(); + + dialog.setCanceledOnTouchOutside(false); + dialog.setOnShowListener(new DialogInterface.OnShowListener() { + + @Override + public void onShow(DialogInterface mdialog) { + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + // get name + String name = nameEditText.getText().toString(); + if (name.isEmpty()) { + nameEditText.setError(getResources().getString(R.string.name_prompt_error)); + return; + } + chatUser.setUsername(name); + register(chatUser); + dialog.dismiss(); + swipeLayout.setEnabled(false); + } + }); + } + }); + dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + // Prevent dialog close on back press button + if (keyCode == KeyEvent.KEYCODE_BACK) { + onBackPressed(); + } + return keyCode == KeyEvent.KEYCODE_BACK; + } + }); + dialog.show(); + } + + protected ChatUser showDecisionDialog(final Boolean needsRegister) { + final ChatUser user = ChatUser.getInstance(); + decisionDialog = new Dialog(this); + decisionDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + decisionDialog.setContentView(R.layout.dialog_chat_introduction); + decisionDialog.setCanceledOnTouchOutside(false); + decisionDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + // Prevent dialog close on back press button + if (keyCode == KeyEvent.KEYCODE_BACK) { + onBackPressed(); + } + return keyCode == KeyEvent.KEYCODE_BACK; + } + }); + + final EditText nameEditText = (EditText) decisionDialog.findViewById(R.id.nameTextView); + final TextView nameTitle = (TextView) decisionDialog.findViewById(R.id.introduction_title); + if (!needsRegister) { + nameEditText.setVisibility(View.GONE); + nameTitle.setVisibility(View.GONE); + } + final RadioGroup decisionGroup = (RadioGroup) decisionDialog.findViewById(R.id.buttons_select_decision); + Button button = (Button) decisionDialog.findViewById(R.id.button_submit); + button.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + // get name + String name = nameEditText.getText().toString(); + if (!name.isEmpty()) { + chatUser.setUsername(name); + } + + // get selected radio button from radioGroup + int selectedId = decisionGroup.getCheckedRadioButtonId(); + + //Toast.makeText(getApplicationContext(), "SelectedId: "+selectedId, Toast.LENGTH_SHORT).show(); + // find the radiobutton by returned id + if (selectedId != -1) { + switch (selectedId) { + case R.id.radioButton1: + chatUser.setDecision(ChatUser.PRAYED); + break; + case R.id.radioButton2: + chatUser.setDecision(ChatUser.RECOMMITTED); + break; + case R.id.radioButton3: + chatUser.setDecision(ChatUser.GROW); + break; + } + decisionDialog.dismiss(); + swipeLayout.setEnabled(false); + if (needsRegister) { + register(chatUser); + } else { + updateUser(chatUser); + } + } else { + Toast.makeText(getApplicationContext(), R.string.decision_error, Toast.LENGTH_SHORT).show(); + } + } + }); + + decisionDialog.show(); + + return user; + } +} + diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/ChatFormActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/ChatFormActivity.java new file mode 100644 index 0000000..a0501cc --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/ChatFormActivity.java @@ -0,0 +1,146 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.goodtrendltd.HolySongs.bus.GlobalMediaStar; +import com.goodtrendltd.HolySongs.helpers.CommonMethod; + +public class ChatFormActivity extends AppCompatActivity { + + public static String CATEGORY = "category"; + Activity context; + + EditText txt_name; + EditText txt_phone; + EditText txt_address; + Button btn_submit; + private int categoryId=1; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.chat_form); + context = this; + initUI(); + initToolbar(); + } + + @Override + public void onStart() { + super.onStart(); + } + + @Override + public void onStop() { + super.onStop(); + } + public void initUI() { + + txt_name = (EditText) findViewById(R.id.txt_name); + txt_phone = (EditText) findViewById(R.id.txt_phone); + txt_address = (EditText) findViewById(R.id.txt_address); + + btn_submit = (Button) findViewById(R.id.btn_submit); + btn_submit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!checkInfo()) { + return; + } + String message = makeMessage(); + //TODO: write to prefs? + //start chat + Intent intent = new Intent(); + intent.setClass(ChatFormActivity.this, ChatActivity.class); + intent.putExtra(ChatActivity.CATEGORY, ChatPreActivity.CHURCH); + intent.putExtra(ChatActivity.FORM_MESSAGE, message); + intent.putExtra(ChatActivity.NAME, txt_name.getText().toString()); + Log.d("chat-form", ChatActivity.CATEGORY + ": " + categoryId); + Log.d("chat-form", ChatActivity.FORM_MESSAGE + ": " + message); + Log.d("chat-form", ChatActivity.NAME+": "+txt_name.getText().toString()); + ChatFormActivity.this.startActivity(intent); + ChatFormActivity.this.finish(); + } + }); + + } + + protected void initToolbar() { + ActionBar actionbar = getSupportActionBar(); + if (actionbar != null) { + actionbar.setDisplayShowTitleEnabled(false); + actionbar.setDisplayShowHomeEnabled(true); + actionbar.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private Boolean checkInfo() { + boolean check = true; + if (txt_name.getText().toString().isEmpty()) { + txt_name.setError(getResources().getString(R.string.name_prompt)); + check = false; + } + if (txt_phone.getText().toString().isEmpty()) { + txt_phone.setError(getResources().getString(R.string.error_phone)); + check = false; + } + if (txt_address.getText().toString().isEmpty()) { + txt_address.setError(getResources().getString(R.string.error_address)); + check = false; + } + return check; + } + + private String makeMessage() { + String msg = ""; + //[加入教会]:姓名:xxx;手机号码:13730211;地址:xxxxxx + msg="[加入教会]:姓名:"+txt_name.getText()+";手机号码:"+txt_phone.getText()+";地址:"+txt_address.getText(); + if(CommonMethod.isNetworkAvailable(context)) + { + new Thread(new Runnable() { + @Override + public void run() { + GlobalMediaStar.recordChatMsg(context + , txt_name.getText().toString() + , txt_phone.getText().toString() + , txt_address.getText().toString() + , categoryId + "" + ); + } + }).start(); + } + return msg; + } + + @Override + public void onBackPressed() { +// Intent intent = new Intent(); +// intent.setClass(ChatFormActivity.this, ChatPreActivity.class); +// ChatFormActivity.this.startActivity(intent); +// ChatFormActivity.this.finish(); + super.onBackPressed(); + } +} + diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/ChatPreActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/ChatPreActivity.java new file mode 100644 index 0000000..44f8cd2 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/ChatPreActivity.java @@ -0,0 +1,111 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.PorterDuff; +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.goodtrendltd.HolySongs.entities.ChatCategory; +import com.goodtrendltd.HolySongs.helpers.CommonMethod; + +import java.util.ArrayList; + + +public class ChatPreActivity extends AppCompatActivity { + + static final int FAITH = 2;//信仰辅导 + static final int CHURCH = 3;//信仰辅导 + + Activity context; + Toolbar toolbar; + + ArrayList list = null; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.chat_pre); + context = this; + initViews(); + initToolbar(); +// PushAgent.getInstance(context).onAppStart(); +// SyncUserhandler.postAtTime(runSyncUser, 1000 * 60 * 2); + } + + @Override + public void onStart() { + super.onStart(); + } + + @Override + public void onStop() { + super.onStop(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + protected void initToolbar() { + ActionBar actionbar = getSupportActionBar(); + if (actionbar != null) { + actionbar.setDisplayShowTitleEnabled(false); + actionbar.setDisplayShowHomeEnabled(true); + actionbar.setDisplayHomeAsUpEnabled(true); + } + } + + + public void initViews(){ + View chatNowView = findViewById(R.id.chat_now_view); + View findChurchView = findViewById(R.id.find_church_view); + View skipTextView = findViewById(R.id.skip_text_view); + + View.OnClickListener clickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(); + int id = v.getId(); + if (v.getClass()==ImageView.class) { + ImageView view = (ImageView) v; + view.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY); + } + if (id==R.id.chat_now_view || id==R.id.skip_text_view) { + intent.setClass(ChatPreActivity.this, ChatActivity.class); + intent.putExtra(ChatActivity.CATEGORY, FAITH); + ChatPreActivity.this.startActivity(intent); + } + else { + intent.setClass(ChatPreActivity.this, ChatFormActivity.class); + intent.putExtra(ChatFormActivity.CATEGORY, CHURCH); + ChatPreActivity.this.startActivity(intent); + } + finish(); + } + }; + + chatNowView.setOnClickListener(clickListener); + findChurchView.setOnClickListener(clickListener); + skipTextView.setOnClickListener(clickListener); + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + } +} + diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/CustomApplication.java b/app/src/main/java/com/goodtrendltd/HolySongs/CustomApplication.java new file mode 100644 index 0000000..2457cbf --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/CustomApplication.java @@ -0,0 +1,107 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Application; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.goodtrendltd.HolySongs.bus.GlobalMediaStar; +import com.goodtrendltd.HolySongs.chat.ChatService; +import com.goodtrendltd.HolySongs.entities.ChatThreadScheduler; +import com.goodtrendltd.HolySongs.helpers.CommonMethod; +import com.google.android.gms.analytics.GoogleAnalytics; +import com.google.android.gms.analytics.Tracker; +import java.util.concurrent.ScheduledThreadPoolExecutor; + +public class CustomApplication extends Application +{ + public static CustomApplication instance = null; + private static final String VALUE = "Harvey"; + static Context context; + final Handler SyncDataHandler = new Handler(); + private static ScheduledThreadPoolExecutor exec; + public static String FLURRY_API_KEY = "4H89NXRH68DJ7ZZ5Y52R"; + + // for Google Analytics + public static GoogleAnalytics analytics; + public Tracker tracker = null; + + public CustomApplication() { + // Exists only to defeat instantiation. + instance = this; + } + + @Override + public void onCreate() + { + super.onCreate(); + } + + public static CustomApplication getInstance() { + if(instance == null) { + instance = new CustomApplication(); + } + return instance; + } + + synchronized public Tracker getDefaultTracker() { + if (tracker == null) { + GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); + // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG + tracker = analytics.newTracker(R.xml.global_tracker); + } + return tracker; + } + + public void scheduleMessageRetrieve() { + + ChatService.initIfNeed(this); + ChatService.initChatService(this); + ChatService.getInstance(); + ChatThreadScheduler.getInstance().scheduleCheckMessages(); + } + + public void AppSyncData(){ + + try { + Class.forName("android.os.AsyncTask"); + } + catch(Throwable ignore) { + // ignored + } + context = getBaseContext(); + scheduleMessageRetrieve(); + } + + + /** + * Service for sending data about usage + */ + class AnalyticsService extends Service { + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + + return START_STICKY; + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + } + + public static Context getContext() + { + if (instance==null) { + Log.w("bible-application", "WARNING: Tried to get custom application context, which was null"); + instance = getInstance(); + } + return instance; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/DisplayLyricActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/DisplayLyricActivity.java new file mode 100644 index 0000000..cc2ff1b --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/DisplayLyricActivity.java @@ -0,0 +1,144 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.provider.Settings; +import android.text.method.ScrollingMovementMethod; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.ShareActionProvider; +import android.widget.TextView; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-5 + * Time: 下午10:13 + */ +public class DisplayLyricActivity extends Activity { + public static String SEARCH_TARGET = "com.goodtrendltd.searchTarget"; + + private ShareActionProvider mShareActionProvider; + private String songName; + private String lyric; + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + SharedPreferences sharedPreferences = getSharedPreferences(getString(R.string.app_pref), MODE_PRIVATE); + if (sharedPreferences.getBoolean(getString(R.string.night_mode_pref_key), true)) { + setTheme(R.style.MyHoloTheme); + } else { + setTheme(R.style.MyHoloLightTheme); + } + setContentView(R.layout.lyric_view); + + Intent intent = getIntent(); + lyric = intent.getStringExtra(MainActivity.LYRIC); + songName = intent.getStringExtra(MainActivity.SONG_NAME); + + // Create the text view + TextView lyricTextView = (TextView) findViewById(R.id.lyricContent); + lyricTextView.setMovementMethod(new ScrollingMovementMethod()); + lyricTextView.setTextSize(sharedPreferences.getInt(getString(R.string.font_size_pref_key), 20)); + lyricTextView.setText(lyric); + lyricTextView.setLineSpacing(20, 1.0f); + + TextView titleTextView = (TextView) findViewById(R.id.title); + titleTextView.setText(songName); + titleTextView.setTextSize(25); + titleTextView.setTextColor(Color.parseColor("#00BFFF")); + + } + + //begin of menu related + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu items for use in the action bar + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.lyricview_actions, menu); + // Locate MenuItem with ShareActionProvider + MenuItem item = menu.findItem(R.id.menu_item_share); + // Fetch and store ShareActionProvider + mShareActionProvider = (ShareActionProvider) item.getActionProvider(); + + Intent i = new Intent(Intent.ACTION_SEND); + i.setType("text/plain"); + i.putExtra(Intent.EXTRA_SUBJECT, songName); + i.putExtra(Intent.EXTRA_TEXT, lyric); + + mShareActionProvider.setShareIntent(i); + + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle presses on the action bar items + switch (item.getItemId()) { + case R.id.youtube: + openSearch(getString(R.string.youtube)); + return true; + case R.id.youku: + openSearch(getString(R.string.youku)); + return true; + case R.id.tudou: + openSearch(getString(R.string.tudou)); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void openSearch(final String target) { + ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo.State wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); + if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) { + navigateToSearch(target); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.alert_title); + builder.setMessage(R.string.alert_message); + builder.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // 如果没有网络连接,则进入网络设置界面 + navigateToSearch(target); + } + }); + builder.setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + builder.create(); + builder.show(); + } + } + + private void navigateToSearch(String target){ + Intent intent = new Intent(this, VideoSearch.class); + intent.putExtra(SEARCH_TARGET, target); + intent.putExtra(MainActivity.SONG_NAME, songName); + startActivity(intent); + } + + // Call to update the share intent + private void setShareIntent(Intent shareIntent) { + if (mShareActionProvider != null) { + mShareActionProvider.setShareIntent(shareIntent); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/GospelActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/GospelActivity.java new file mode 100644 index 0000000..18c4dd6 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/GospelActivity.java @@ -0,0 +1,235 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.goodtrendltd.HolySongs.bus.BibleSetting; +import com.goodtrendltd.HolySongs.bus.GlobalMediaStar; +import com.goodtrendltd.HolySongs.helpers.CommonMethod; + +import java.util.ArrayList; + +/** + * Created by Julia on 5/3/2016. + */ +public class GospelActivity extends AppCompatActivity { + + Activity context; + ViewPager viewPager; + ArrayList viewList; + String TAG = "GospelActivity"; + String origin = ""; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Log.v("init-trace",CommonMethod.GetCurrentMillisecondDate() + " BibleInitSlider 01 "); + context = this; + + if (BibleSetting.getNightMode(this)) { + setTheme(R.style.DarkAppTheme); + } else { + setTheme(R.style.BaseAppTheme); + } + // Press Bible - Install + + Log.v("init-trace",CommonMethod.GetCurrentMillisecondDate() + " BibleInitSlider 02 "); + Log.d("bible-init", " -- firstLoad -- "); + + context = this; + + setContentView(R.layout.activity_bible_init_slider); + viewPager = (ViewPager)findViewById(R.id.viewPager); + viewList = new ArrayList(); + + InitButton(); + + LayoutInflater inflater = (LayoutInflater)context.getSystemService + (Context.LAYOUT_INFLATER_SERVICE); + + View view = inflater.inflate(R.layout.activity_bible_init_knowgod, null); + SetFontTypeFace(view,R.id.txt_one); + SetFontTypeFace(view,R.id.txt_two); + SetFontTypeFace(view,R.id.txt_three); + SetFontTypeFace(view,R.id.txt_four); + SetFontTypeFace(view,R.id.txt_five); + SetFontTypeFace(view,R.id.txt_six); + SetFontTypeFace(view,R.id.txt_seven); + SetFontTypeFace(view, R.id.txt_eight); + + Button btnYes = (Button)view.findViewById(R.id.btn_yes); + Button btnReadBible = (Button)view.findViewById(R.id.btn_read_bible); + + Bundle extras = getIntent().getExtras(); + if (extras!=null) { + origin = extras.getString("origin", " "); + if (origin.equals("main")) { + btnReadBible.setText(R.string.done); + } else { + btnReadBible.setText(R.string.skip); + initToolbar(); + } + } + + btnReadBible.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onBackPressed(); + } + }); + + btnYes.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new Thread(new Runnable(){ + @Override + public void run() + { + GlobalMediaStar.decision(context); + } + }).start(); + + Intent intent = new Intent(GospelActivity.this, ChatActivity.class); + intent.putExtra("fromGospel",1); + startActivity(intent); + GospelActivity.this.finish(); + } + }); + + viewList.add(view); + viewPager.setAdapter(new GuidePageAdapter()); + viewPager.setOnPageChangeListener(new GuidePageChangeListener()); + + Log.v(TAG," -- recordGospel -- "); + if(CommonMethod.isNetworkAvailable(context)) + { + new Thread(new Runnable() { + @Override + public void run() { + GlobalMediaStar.recordGospel(context); + } + }).start(); + } + } + + @Override + public void onStart() { + super.onStart(); + } + + @Override + public void onStop() { + super.onStop(); + } + + protected void initToolbar() { + ActionBar actionbar = getSupportActionBar(); + if (actionbar != null) { + actionbar.setDisplayShowTitleEnabled(false); + actionbar.setDisplayShowHomeEnabled(true); + actionbar.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + // 指引页面数据适配器 + private class GuidePageAdapter extends PagerAdapter { + + @Override + public int getCount() { + return viewList.size(); + } + + @Override + public boolean isViewFromObject(View arg0, Object arg1) { + return arg0 == arg1; + } + + @Override + public int getItemPosition(Object object) { + return super.getItemPosition(object); + } + + @Override + public void destroyItem(View arg0, int arg1, Object arg2) { + ((ViewPager) arg0).removeView(viewList.get(arg1)); + } + + @Override + public Object instantiateItem(View arg0, int arg1) { + ((ViewPager) arg0).addView(viewList.get(arg1)); + return viewList.get(arg1); + } + + + } + + // 指引页面更改事件监听器 + private class GuidePageChangeListener implements ViewPager.OnPageChangeListener { + + @Override + public void onPageScrollStateChanged(int arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void onPageScrolled(int arg0, float arg1, int arg2) { + // TODO Auto-generated method stub + + } + + @Override + public void onPageSelected(int arg0) { + //遍历数组让当前选中图片下的小圆点设置颜色 + } + } + + private void InitButton(){ + + findViewById(R.id.btn_silder_one).setVisibility(View.GONE); + findViewById(R.id.btn_silder_two).setVisibility(View.GONE); + findViewById(R.id.btn_silder_three).setVisibility(View.GONE); + } + + private void SetFontTypeFace(View view,int id){ + TextView txtview = (TextView)view.findViewById(id); +// if (txtview.getTypeface()==null) { +// txtview.setTypeface(BibleSetting.getDefaultFont(this)); +// return; +// } +// //TODO: Null pointer!!! +// if (txtview.getTypeface().isBold()) { +// txtview.setTypeface(BibleSetting.getDefaultFont(this, Typeface.BOLD)); +// } +// else if (txtview.getTypeface().isItalic()) { +// txtview.setTypeface(BibleSetting.getDefaultFont(this, Typeface.ITALIC)); +// } +// else { +// txtview.setTypeface(BibleSetting.getDefaultFont(this)); +// } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/HTML5WebView.java b/app/src/main/java/com/goodtrendltd/HolySongs/HTML5WebView.java new file mode 100644 index 0000000..e860bc7 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/HTML5WebView.java @@ -0,0 +1,207 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.webkit.GeolocationPermissions; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; + +public class HTML5WebView extends WebView { + + private Context mContext; + private MyWebChromeClient mWebChromeClient; + private View mCustomView; + private FrameLayout mCustomViewContainer; + private WebChromeClient.CustomViewCallback mCustomViewCallback; + + private FrameLayout mContentView; + private FrameLayout mBrowserFrameLayout; + private FrameLayout mLayout; + + private ProgressDialog pd; + + static final String LOGTAG = "HTML5WebView"; + + private void init(Context context) { + mContext = context; + Activity a = (Activity) mContext; + + mLayout = new FrameLayout(context); + + mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(a).inflate(R.layout.video_html5_screen, null); + mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.main_content); + mCustomViewContainer = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.fullscreen_custom_content); + + mLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS); + + mWebChromeClient = new MyWebChromeClient(); + setWebChromeClient(mWebChromeClient); + + setWebViewClient(new MyWebViewClient()); + + // Configure the webview + WebSettings s = getSettings(); + s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); +// s.setUseWideViewPort(true); +// s.setLoadWithOverviewMode(true); + s.setSavePassword(true); + s.setSaveFormData(true); + s.setJavaScriptEnabled(true); + + // enable navigator.geolocation +// s.setGeolocationEnabled(true); +// s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/"); + + // enable Web Storage: localStorage, sessionStorage + s.setDomStorageEnabled(true); + + mContentView.addView(this); + } + + public HTML5WebView(Context context) { + super(context); + init(context); + } + + public HTML5WebView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public HTML5WebView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context); + } + + public FrameLayout getLayout() { + return mLayout; + } + + public boolean inCustomView() { + return (mCustomView != null); + } + + public void hideCustomView() { + mWebChromeClient.onHideCustomView(); + } + + private class MyWebChromeClient extends WebChromeClient { + private Bitmap mDefaultVideoPoster; + private View mVideoProgressView; + + @Override + public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) + { + //Log.i(LOGTAG, "here in on ShowCustomView"); + HTML5WebView.this.setVisibility(View.GONE); + + // if a view already exists then immediately terminate the new one + if (mCustomView != null) { + callback.onCustomViewHidden(); + return; + } + + mCustomViewContainer.addView(view); + mCustomView = view; + mCustomViewCallback = callback; + mCustomViewContainer.setVisibility(View.VISIBLE); + } + + @Override + public void onHideCustomView() { + + if (mCustomView == null) + return; + + // Hide the custom view. + mCustomView.setVisibility(View.GONE); + + // Remove the custom view from its container. + mCustomViewContainer.removeView(mCustomView); + mCustomView = null; + mCustomViewContainer.setVisibility(View.GONE); + mCustomViewCallback.onCustomViewHidden(); + + HTML5WebView.this.setVisibility(View.VISIBLE); + + //Log.i(LOGTAG, "set it to webVew"); + } + + @Override + public Bitmap getDefaultVideoPoster() { + //Log.i(LOGTAG, "here in on getDefaultVideoPoster"); + if (mDefaultVideoPoster == null) { + mDefaultVideoPoster = BitmapFactory.decodeResource( + getResources(), R.drawable.default_video_poster); + } + return mDefaultVideoPoster; + } + + @Override + public View getVideoLoadingProgressView() { + //Log.i(LOGTAG, "here in on getVideoLoadingPregressView"); + + if (mVideoProgressView == null) { + LayoutInflater inflater = LayoutInflater.from(mContext); + mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null); + } + return mVideoProgressView; + } + + @Override + public void onReceivedTitle(WebView view, String title) { + ((Activity) mContext).setTitle(title); + } + + @Override + public void onProgressChanged(WebView view, int newProgress) { + ((Activity) mContext).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100); + } + + @Override + public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { + callback.invoke(origin, true, false); + } + } + + private class MyWebViewClient extends WebViewClient { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.i(LOGTAG, "shouldOverrideUrlLoading: "+url); + // don't override URL so that stuff within iframe can work properly + // view.loadUrl(url); + return false; + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + if (pd == null || !pd.isShowing()) { + pd = ProgressDialog.show(mContext, "", mContext.getString(R.string.loading_video), true); + pd.setCancelable(true); + } + } + + @Override + public void onPageFinished(WebView view, String url) { + if (pd.isShowing()) { + pd.dismiss(); + } + } + } + + static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = + new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/MainActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/MainActivity.java new file mode 100644 index 0000000..2687f79 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/MainActivity.java @@ -0,0 +1,314 @@ +package com.goodtrendltd.HolySongs; + +import android.app.ListActivity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.PixelFormat; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.support.design.widget.FloatingActionButton; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.view.*; +import android.view.WindowManager.LayoutParams; +import android.widget.*; + +import com.goodtrendltd.HolySongs.bus.BibleSetting; +import com.goodtrendltd.HolySongs.bus.GlobalMediaStar; +import com.goodtrendltd.HolySongs.helpers.ChineseCharComp; +import com.goodtrendltd.HolySongs.helpers.CommonMethod; +import com.goodtrendltd.HolySongs.helpers.HanziHelper; +import com.goodtrendltd.HolySongs.helpers.XMLParser; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import java.io.*; +import java.util.*; + +public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener { + + + public final static String LYRIC = "com.goodtrendltd.LYRIC"; + public final static String SONG_NAME = "com.goodtrendltd.SONG_NAME"; + + private Map songLyricMap = new HashMap(); + + private RemoveWindow mRemoveWindow = new RemoveWindow(); + Handler mHandler = new Handler(); + private WindowManager mWindowManager; + private TextView mDialogText; + private boolean mShowing; + private boolean mReady; + private char mPrevLetter = Character.MIN_VALUE; + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + int firstLoad = BibleSetting.getFirstStart(this); + if(firstLoad!=0) + { + Intent i = new Intent(); + i.setClass(this,GospelActivity.class); + i.putExtra("origin","first"); + recordInstall(); + startActivity(i); + } + if (BibleSetting.getNightMode(this)) { + setTheme(R.style.DarkAppTheme); + } else { + setTheme(R.style.BaseAppTheme); + } + setContentView(R.layout.main); + + initApplication(); + recordRun(); + XMLParser parser = new XMLParser(); + String myData = getXml("songs.xml"); + setDataFromXML(parser, myData); + final List titleList = new ArrayList(songLyricMap.keySet()); + Collections.sort(titleList, new ChineseCharComp()); + + ListView listView = getListView(); + listView.setTextFilterEnabled(true); + listView.setAdapter(new SongTitleAdapter(getApplicationContext(), titleList)); + Sidebar sb = (Sidebar) findViewById(R.id.side_bar); + sb.bindListView(getListView()); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + String songName = titleList.get(position); + navigateToLyric(songName); + } + }); + setupIndicator(); + + if (getActionBar()!=null) { + getActionBar().setTitle(R.string.app_name); + } + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab_find_church); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent i = new Intent(); + i.setClass(MainActivity.this, ChatActivity.class); + startActivity(i); + } + }); + } + + private void initApplication() { + CustomApplication application = (CustomApplication)getApplication(); + application.AppSyncData(); + } + + private void recordInstall() { + + if(CommonMethod.isNetworkAvailable(this)) + { + new Thread(new Runnable() { + @Override + public void run() { + GlobalMediaStar.recordInstall(MainActivity.this); + } + }).start(); + } + } + + private void recordRun() { + + if (CommonMethod.isNetworkAvailable(this)) { + new Thread(new Runnable() { + @Override + public void run() { + GlobalMediaStar.recordRun(MainActivity.this); + } + }).start(); + } + } + + private void navigateToLyric(String songName) { + String lyric = songLyricMap.get(songName); + Intent intent = new Intent(this, DisplayLyricActivity.class); + intent.putExtra(LYRIC, lyric); + intent.putExtra(SONG_NAME, songName); + startActivity(intent); + } + + private String getXml(String path) { + + String xmlString = null; + try { + InputStream is = getAssets().open(path); + int length = is.available(); + byte[] data = new byte[length]; + is.read(data); + xmlString = new String(data); + } catch (IOException e1) { + e1.printStackTrace(); + } + + return xmlString == null ? null : xmlString.replaceAll(" ", ""); + } + + private void setDataFromXML(XMLParser parser, String xml) { + Document doc = parser.getDomElement(xml); + NodeList nl = doc.getElementsByTagName("song"); + // looping through all item nodes + for (int i = 0; i < nl.getLength(); i++) { + // creating new HashMap + Element e = (Element) nl.item(i); + // adding each child node to HashMap key => value + String name = parser.getValue(e, "name"); + String lyric = parser.getValue(e, "lyric"); + songLyricMap.put(name, lyric); + } + + } + + private void setupIndicator() { + mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); + getListView().setOnScrollListener(this); + LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + mDialogText = (TextView) inflate.inflate(R.layout.list_position, null); + mDialogText.setVisibility(View.INVISIBLE); + + mHandler.post(new Runnable() { + + public void run() { + mReady = true; + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_APPLICATION, + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + mWindowManager.addView(mDialogText, lp); + } + }); + } + + private void removeWindow() { + if (mShowing) { + mShowing = false; + mDialogText.setVisibility(View.INVISIBLE); + } + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (mReady) { + char firstLetter = (HanziHelper.words2Pinyin((String) getListView().getItemAtPosition(firstVisibleItem))).charAt(0); + if (!mShowing && firstLetter != mPrevLetter) { + mShowing = true; + mDialogText.setVisibility(View.VISIBLE); + } + mDialogText.setText(((Character) firstLetter).toString().toUpperCase()); + mHandler.removeCallbacks(mRemoveWindow); + mHandler.postDelayed(mRemoveWindow, 2000); + mPrevLetter = firstLetter; + } + } + + private final class RemoveWindow implements Runnable { + public void run() { + removeWindow(); + } + } + + @Override + protected void onResume() { + super.onResume(); + mReady = true; + } + + + @Override + protected void onPause() { + super.onPause(); + removeWindow(); + mReady = false; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mWindowManager.removeView(mDialogText); + mReady = false; + } + + + //begin of menu related + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu items for use in the action bar + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.main_activity_actions, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle presses on the action bar items + switch (item.getItemId()) { + case R.id.about: + openAbout(); + return true; + case R.id.settings: + openSettings(); + return true; + case R.id.sharing: + openSharing(); + return true; + case R.id.gospel: + openGospel(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void openSharing() { + try { + Intent i = new Intent(Intent.ACTION_SEND); + i.setType("text/plain"); + i.putExtra(Intent.EXTRA_SUBJECT, "敬拜赞美诗"); + StringBuilder stringBuffer = new StringBuilder(); + stringBuffer.append("\n敬拜赞美诗App安装地址: \n\n "); + stringBuffer.append(" 安卓:").append(getString(R.string.app_url_android)).append(" \n\n"); + stringBuffer.append(" 苹果:").append(getString(R.string.app_url_ios)).append(" \n\n"); + i.putExtra(Intent.EXTRA_TEXT, stringBuffer.toString()); + startActivity(Intent.createChooser(i, "选择用于分享的app")); + } catch (Exception e) { //e.toString(); + } + } + + private void openSettings() { + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + } + + private void openAbout() { + Intent intent = new Intent(this, AboutActivity.class); + startActivity(intent); + } + + private void openGospel() { + Intent intent = new Intent(this, GospelActivity.class); + intent.putExtra("origin","main"); + startActivity(intent); + } + + private ListView getListView() { + return (ListView) findViewById(R.id.list); + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/SettingsActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/SettingsActivity.java new file mode 100644 index 0000000..d2a95e5 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/SettingsActivity.java @@ -0,0 +1,117 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.widget.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-26 + * Time: 下午4:52 + */ +public class SettingsActivity extends Activity { + private SharedPreferences sharedPreferences; + private List fontSizes; + Spinner fontSizeSpinner; + Switch nightModeSwitch; + private boolean isNightModeToggled = false; + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + sharedPreferences = getSharedPreferences(getString(R.string.app_pref), MODE_PRIVATE); + if (sharedPreferences.getBoolean(getString(R.string.night_mode_pref_key), true)) { + setTheme(android.R.style.Theme_Holo); + } else { + setTheme(android.R.style.Theme_Holo_Light); + } + setContentView(R.layout.settings_view); + + //start of font size spinner + fontSizes = new ArrayList(); + fontSizes.add(getString(R.string.font_size_prompt) + sharedPreferences.getInt(getString(R.string.font_size_pref_key), 20)); + Resources res = getResources(); + fontSizes.addAll(Arrays.asList(res.getStringArray(R.array.font_size_array))); + + fontSizeSpinner = (Spinner) findViewById(R.id.fontSizeSpinner); + ArrayAdapter dataAdapter = new ArrayAdapter(this, + android.R.layout.simple_spinner_item, fontSizes); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + fontSizeSpinner.setAdapter(dataAdapter); + + fontSizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position > 0) { + String sizeString = parent.getItemAtPosition(position).toString(); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putInt(getString(R.string.font_size_pref_key), Integer.parseInt(sizeString)); + editor.commit(); + fontSizes.set(0, getString(R.string.font_size_prompt) + sharedPreferences.getInt(getString(R.string.font_size_pref_key), 20)); + fontSizeSpinner.setSelection(0); + Toast.makeText(parent.getContext(), "歌词字体已设置为 : " + sizeString, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + //end of font size spinner + + //start of theme switch + nightModeSwitch = (Switch) findViewById(R.id.nightModeSwitch); + nightModeSwitch.setChecked(sharedPreferences.getBoolean(getString(R.string.night_mode_pref_key), true)); + + } + + /** + * Called when the user clicks the resume default font size button + */ + public void resumeDefaultSize(View view) { + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putInt(getString(R.string.font_size_pref_key), 20); + editor.commit(); + fontSizes.set(0, getString(R.string.font_size_prompt) + 20); + //have to use notifyDataSetChanged() to refresh the spinner since here we did not change selection(still position 0) in spinner. + BaseAdapter adapter = (BaseAdapter) fontSizeSpinner.getAdapter(); + adapter.notifyDataSetChanged(); + Toast.makeText(getBaseContext(), "歌词字体已恢复为 : 20", Toast.LENGTH_SHORT).show(); + } + + /** + * Called when the night mode switch clicked + */ + public void onNightModeSwitch(View view) { + boolean on = ((Switch) view).isChecked(); + SharedPreferences.Editor editor = sharedPreferences.edit(); + if (on) { + editor.putBoolean(getString(R.string.night_mode_pref_key), true); + } else { + editor.putBoolean(getString(R.string.night_mode_pref_key), false); + } + editor.commit(); + isNightModeToggled = !isNightModeToggled; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && isNightModeToggled) { + Intent a = new Intent(this,MainActivity.class); + a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(a); + return true; + } + return super.onKeyDown(keyCode, event); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/Sidebar.java b/app/src/main/java/com/goodtrendltd/HolySongs/Sidebar.java new file mode 100644 index 0000000..58f944a --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/Sidebar.java @@ -0,0 +1,101 @@ +package com.goodtrendltd.HolySongs; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Point; +import android.util.AttributeSet; +import android.view.Display; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.widget.ListView; +import android.widget.SectionIndexer; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-5 + * Time: 下午11:12 + */ +public class Sidebar extends View { + public static String[] ALPHABET_ARRAY = new String[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", "Y", "Z" }; + + private SectionIndexer sectionIndexter; + private ListView list; + private int itemHeight = 22; + + public Sidebar(Context context) { + super(context); + init(); + } + + public Sidebar(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public Sidebar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + setBackgroundColor(0x44FFFFFF); + //get height by different screen resolution + WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); + Display display = wm.getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + int height = size.y; + itemHeight = height/36; + } + + public void bindListView(ListView list) { + this.list = list; + sectionIndexter = (SectionIndexer) list.getAdapter(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + int i = (int) event.getY(); + int idx = i / itemHeight; + if (idx >= ALPHABET_ARRAY.length) { + idx = ALPHABET_ARRAY.length - 1; + } else if (idx < 0) { + idx = 0; + } + switch(event.getAction()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + setBackgroundColor(0x8844FFFF); + if (sectionIndexter == null) { + sectionIndexter = (SectionIndexer) list.getAdapter(); + } + int position = sectionIndexter.getPositionForSection(idx); + if (position == -1) { + return true; + } + list.setSelection(position); + break; + case MotionEvent.ACTION_UP: + setBackgroundColor(0x44FFFFFF); + break; + } + return true; + } + + protected void onDraw(Canvas canvas) { + Paint paint = new Paint(); + paint.setColor(0xFF111111); + paint.setTextSize(25); + paint.setTextAlign(Paint.Align.CENTER); + float widthCenter = getMeasuredWidth() / 2; + for (int i = 0, length = ALPHABET_ARRAY.length; i < length; i++) { + canvas.drawText(ALPHABET_ARRAY[i], widthCenter, itemHeight + (i * itemHeight), paint); + } + super.onDraw(canvas); + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/SongTitleAdapter.java b/app/src/main/java/com/goodtrendltd/HolySongs/SongTitleAdapter.java new file mode 100644 index 0000000..bd43f31 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/SongTitleAdapter.java @@ -0,0 +1,202 @@ +package com.goodtrendltd.HolySongs; + +import java.util.List; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.preference.PreferenceManager; +import android.util.SparseIntArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.SectionIndexer; +import android.widget.TextView; + +import com.goodtrendltd.HolySongs.bus.BibleSetting; +import com.goodtrendltd.HolySongs.helpers.HanziHelper; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-6 + * Time: 上午10:00 + */ +public class SongTitleAdapter extends ArrayAdapter implements SectionIndexer { + private SparseIntArray alphaMap; + private List items; + private Context context; + Boolean nightMode = true; + + public SongTitleAdapter(Context context, List items) { + super(context, R.layout.song_item, items); + this.alphaMap = new SparseIntArray(Sidebar.ALPHABET_ARRAY.length); + this.items = items; + this.context = context; + nightMode = BibleSetting.getNightMode(context); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder; + if (convertView == null) { + viewHolder = new ViewHolder(); + convertView = LayoutInflater.from(context).inflate(R.layout.song_item, null); + viewHolder.name = (TextView) convertView.findViewById(R.id.name); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + String p = items.get(position); + viewHolder.name.setText(p); + if (!nightMode) { + viewHolder.name.setTextColor(Color.parseColor("#000000")); +// convertView.setBackgroundColor(Color.parseColor("#FFFFFF")); + } +// else { +// viewHolder.name.setTextColor(Color.parseColor("#FFFFFF")); +// convertView.setBackgroundColor(Color.parseColor("#000000")); +// } + return convertView; + } + + private class ViewHolder { + + public TextView name; + + } + + @Override + public int getPositionForSection(int section) { + // Check bounds + if (section <= 0) { + return 0; + } + if (section >= Sidebar.ALPHABET_ARRAY.length) { + section = Sidebar.ALPHABET_ARRAY.length - 1; + } + String targetLetter = Sidebar.ALPHABET_ARRAY[section]; + int key = targetLetter.charAt(0); + int start = 0; + int end = items.size(); + int pos; + //if pos already exists + if ((pos = alphaMap.get(key, Integer.MIN_VALUE)) != Integer.MIN_VALUE) { + return pos; + } else { + //FIXME haven't considered non-alphabet characters + //estimate the start and end search position, + //if couldn't find the right end position, then search its next letter's position until find it or reach the end. + //if couldn't find the right start position, then search its prev letter's position until fint it or reach the start. + end = getApproximateEndPosOfLetter(items, section); + start = getApproximateStartPosOfLetter(items, section - 1); + } + while (start < end) { + pos = (start + end) / 2; + String curLetter = Character.toString(HanziHelper.words2Pinyin(items.get(pos)).charAt(0)); + int result = curLetter.compareToIgnoreCase(targetLetter); + if (result < 0) { + start = pos + 1; + } else if (result > 0) { + end = pos - 1; + } else if (result == 0) { + while (Character.toString(HanziHelper.words2Pinyin(items.get(pos)).charAt(0)) + .compareToIgnoreCase(targetLetter) == 0) { + if (pos >= 1) { + pos--; + } else if (pos == 0) { + alphaMap.put(key, pos); + return pos; + } + } + break; + } + } + pos++; + alphaMap.put(key, pos); + return pos; + } + + @Override + public int getSectionForPosition(int position) { + String sourceLetter = HanziHelper.words2Pinyin(items.get(position)); + for (int i = 0, alphabetLength = Sidebar.ALPHABET_ARRAY.length; + i < alphabetLength; i++) { + String targetLetter = Sidebar.ALPHABET_ARRAY[i]; + if (sourceLetter.compareTo(targetLetter) == 0) { + return i; + } + } + return 0; + } + + @Override + public Object[] getSections() { + return Sidebar.ALPHABET_ARRAY; + } + + private int getApproximateStartPosOfLetter(List source, int section) { + int result = -1; + ; + while (section >= 0) { + result = getFirstAppearanceOfLetter(source, Sidebar.ALPHABET_ARRAY[section]); + if (result != -1) { + while (Sidebar.ALPHABET_ARRAY[section].equals( + Character.toString(HanziHelper.words2Pinyin(source.get(result)).charAt(0)))) { + if (result < source.size() - 1) { + result++; + } else { + return result; + } + } + return --result; + } else { + section--; + } + } + return result; + } + + private int getApproximateEndPosOfLetter(List source, int section) { + int result = -1; + ; + while (section < Sidebar.ALPHABET_ARRAY.length) { + result = getFirstAppearanceOfLetter(source, Sidebar.ALPHABET_ARRAY[section]); + if (result != -1) { + while (Sidebar.ALPHABET_ARRAY[section].equals( + Character.toString(HanziHelper.words2Pinyin(source.get(result)).charAt(0)))) { + if (result >= 1) { + result--; + } else { + return result; + } + } + return ++result; + } else { + section++; + } + } + return result; + } + + private int getFirstAppearanceOfLetter(List source, String targetLetter) { + int appearance = -1; + int tmpStart = 0; + int tmpEnd = source.size(); + while (tmpStart < tmpEnd) { + int tmpPos = (tmpStart + tmpEnd) / 2; + String curLetter = Character.toString(HanziHelper.words2Pinyin(source.get(tmpPos)).charAt(0)); + int result = curLetter.compareToIgnoreCase(targetLetter); + if (result < 0) { + tmpStart = tmpPos + 1; + } else if (result > 0) { + tmpEnd = tmpPos - 1; + } else if (result == 0) { + appearance = tmpPos; + break; + } + } + return appearance; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/VideoSearch.java b/app/src/main/java/com/goodtrendltd/HolySongs/VideoSearch.java new file mode 100644 index 0000000..23b797c --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/VideoSearch.java @@ -0,0 +1,86 @@ +package com.goodtrendltd.HolySongs; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-11-3 + * Time: 上午8:40 + */ +public class VideoSearch extends Activity { + private String target; + private String songName; + private HTML5WebView webView; + private ProgressDialog pd; + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + target = intent.getStringExtra(DisplayLyricActivity.SEARCH_TARGET); + songName = intent.getStringExtra(MainActivity.SONG_NAME); + + webView = new HTML5WebView(this); + + if (savedInstanceState != null) { + webView.restoreState(savedInstanceState); + } else { + webView.loadUrl(getSearchUrl()); + } + setContentView(webView.getLayout()); + } + + private String getSearchUrl() { + String url = ""; + if (getString(R.string.youtube).equals(target)) { + url = getString(R.string.youtube_url) + songName; + } else if (getString(R.string.youku).equals(target)) { + url = getString(R.string.youku_url) + songName; + } else if (getString(R.string.tudou).equals(target)) { + url = getString(R.string.tudou_url) + songName; + } + return url; + } + + //override this to make sure video stops playing after use hit back button. + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { + webView.goBack(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public void onPause() { + webView.stopLoading(); + webView.setVisibility(View.GONE); + webView.destroy(); + super.onPause(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + webView.saveState(outState); + } + + @Override + public void onStop() { + super.onStop(); + webView.stopLoading(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/bus/BibleSetting.java b/app/src/main/java/com/goodtrendltd/HolySongs/bus/BibleSetting.java new file mode 100644 index 0000000..47012e8 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/bus/BibleSetting.java @@ -0,0 +1,282 @@ +package com.goodtrendltd.HolySongs.bus; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Typeface; +import android.provider.Settings; +import android.support.v4.app.NotificationManagerCompat; +import android.util.Log; + +import com.goodtrendltd.HolySongs.CustomApplication; +import com.goodtrendltd.HolySongs.R; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Hashtable; +import java.util.Locale; +import java.util.UUID; + +public class BibleSetting +{ + + private static final String LANGUAGE = "bibleLanguage"; + public static final String SETTINGS_PREF = "com.pressbible.view"; + static Typeface fontTypeFace=null; + static Typeface biblefontTypeFace=null; + static Typeface boldFace=null; + static Typeface italicFace=null; + static Typeface yaHeiTypeFace=null; + static Typeface asapItalicTF=null, asapRegularTF=null, asapBoldTF=null; +// static DatabaseSetting db = new DatabaseSetting(); + + private static Hashtable fontCache = new Hashtable(); + + public static String SysConfigQuery(Context context, String key) + { + SharedPreferences read = context.getSharedPreferences(key, Activity.MODE_WORLD_READABLE); + //步骤2:获取文件中的值 + String val = read.getString(key, ""); + return val; + + } + + public static void SysConfigUpdate(Context context, final String key, final String value){ + SharedPreferences.Editor editor = context.getSharedPreferences(key, Activity.MODE_WORLD_WRITEABLE).edit(); + //步骤2-2:将获取过来的值放入文件 + editor.putString(key, value); + //步骤3:提交 + editor.commit(); + } + + //获得 第一次启动 + public static int getFirstStart(Context context){ + String lastDate = SysConfigQuery(context, "getFirstStart"); + int isFirst = 0; + if(lastDate.equals("")){ + isFirst = 0; + } + else + { + //first install ever + isFirst = Integer.parseInt(lastDate); + } + + int code = getPackageVersionCode(context); + if(code!=isFirst){ + isFirst = 1; + UserMag.setNewNotification(); + SysConfigUpdate(context, "getFirstStart",String.valueOf(code)); + } + else + { + isFirst = 0; + } + + return isFirst; + } + + //获得 第一次启动 + public static int getLocalNotificationCode(Context context){ +// String localnotification = DatabaseSetting.SysConfigQuery("locallocalnotificationorder"); +// int order = 10001; +// if(localnotification.equals("")){ +// order = 10001; +// } +// else +// { +// //first install ever +// order = Integer.parseInt(localnotification); +// if(order >= 10016){ +// order = 10001; +// } +// else +// { +// order = order + 1; +// } +// } +// db.SysConfigUpdate("locallocalnotificationorder",order+""); +// return order; + return 1; + } + + public static String getBibleLanguage(Context context) { + return SysConfigQuery(context, BibleSetting.LANGUAGE); + } + + public static Boolean getPushPreference(Context context) { + return NotificationManagerCompat.from(context).areNotificationsEnabled(); + } + + //获取 版本信息 + public static int getAppVersion(Context context){ + String appversion = SysConfigQuery(context, "appversion"); + if(appversion.equals("")){ + appversion = "0"; + } + return Integer.parseInt(appversion); + } + + //设置 版本信息 + public static void setAppVersion(Context context,String version){ + SysConfigUpdate(context, "appversion",version); + } + + public static Boolean getNightMode(Context context) { + SharedPreferences sharedPreferences = context.getSharedPreferences(context.getString(R.string.app_pref), Context.MODE_PRIVATE); + return sharedPreferences.getBoolean(context.getString(R.string.night_mode_pref_key), true); + } + + public static String getChatAPIKey(Context context) { + return "1mjl1Qryo9zkx8XQsYBxF8sTDj6nGtaBEGaYueC2FTKW3lRhJ05VBraq9B6BWrN"; + } + + public static String getGMOEventAPIKey(Context context) { + return "nSNXrKQpZthbHxFuREVTSAqljFUcDipZ1ZFdnpHiXMLKK08giVpcKyPD5agbZUg"; + } + + public static String getAppName(Context context) { + if (getLocalLanguage(context)== LocalLanguage.SIMPLIFIED_CHINESE || + getLocalLanguage(context)==LocalLanguage.TRADITIONAL_CHINESE) { + return "Video Bible"; + } else { + return "Press Bible"; + } + } + + public static String getDeviceIDHash() { + Context context = CustomApplication.getContext(); + if (context==null) return ""; + String anonymousIDKey = "anonymous-id"; + + //Get from local + SharedPreferences prefs = context.getSharedPreferences(SETTINGS_PREF, Context.MODE_PRIVATE); + if (prefs.contains(anonymousIDKey)) { + return prefs.getString(anonymousIDKey, ""); + } + + //Else, make new id + String androidID = Settings.Secure.getString(context.getContentResolver(), + Settings.Secure.ANDROID_ID); + + if (androidID==null || androidID.isEmpty()) { + androidID = UUID.randomUUID().toString(); + } + + MessageDigest md = null; + try { + md = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + Log.e("setting","getDeviceIDHash: "+e); + } + + try { + md.update(androidID.getBytes("UTF-8")); // Change this to "UTF-16" if needed + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + Log.e("setting","getDeviceIDHash: "+e); + } + byte[] digest = md.digest(); + + //Write to local + String hashID = String.format("%064x", new java.math.BigInteger(1, digest)); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(anonymousIDKey,hashID).apply(); + + return hashID; + } + + public static void SetChatCategory(Context context,String chatCategory){ + + SharedPreferences sharedPreferences = context.getSharedPreferences(SETTINGS_PREF, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString("chatcategory", chatCategory); + editor.commit(); + } + + //安装后,首次加载设置 + public static void FirstLoadSetting(Context context){ +// Log.d("bible-setting", "BibleSetting firstLoadSetting()"); +// int verseCode = ActivityHelper.getPackageVersionCode(context); +// String code = SysConfigQuery(context, "verseCode"); +// Boolean isNeedDelete = false; +// if(code.equals("")==true ) +// { +// isNeedDelete = true; +// }else if(Integer.parseInt(code) 0 && responseContent.equals("-1") == false) { + JSONObject jsonObject; + jsonObject = new JSONObject(responseContent); + visitorId = jsonObject.get("id").toString(); + + SharedPreferences.Editor editor = context.getSharedPreferences(KEY, Activity.MODE_WORLD_WRITEABLE).edit(); + //步骤2-2:将获取过来的值放入文件 + editor.putString(KEY, visitorId); + //步骤3:提交 + editor.commit(); + } + } catch (Exception e) { + Log.v("globalmediastar"," record eventType exception: " + e.toString()); + } finally { + // 关闭连接,释放资源 + httpClient.getConnectionManager().shutdown(); + } + } + Log.v("globalmediastar",visitorId + " -- visitorId "); + return visitorId; + } + + public static String STAR_URL = "https://xinxiwang.me/events"; +// public static String STAR_URL = "https://stats.globalmediaoutreach.com/api/v2/events/app"; + + public static void decision(Activity context) + { + postInfo(context,"decision"); + } + + public static void recordRun(Activity context) + { + postInfo(context,"open"); + } + + public static void recordGospel(Activity context) + { + postInfo(context,"gospel"); + } + + public static void recordInstall(Activity context) + { + postInfo(context,"install"); + //star_baidu + //star_360 + //star_xiaomi + //star_qq + //postInfo(context,"star_qq"); + } + + public static void recordOpenChat(Activity context){ + + CustomApplication application = (CustomApplication)context.getApplication(); + Tracker mTracker = application.getDefaultTracker(); + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("open-chat") + .setLabel("open-chat") + .setValue(System.currentTimeMillis()) + .build()); + Log.v("globalmediastar"," -- chat open-chat -- "); + } + + public static void recordFirstChat(Activity context) + { + CustomApplication application = (CustomApplication)context.getApplication(); + Tracker mTracker = application.getDefaultTracker(); + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("first-chat") + .setLabel("first-chat") + .setValue(System.currentTimeMillis()) + .build()); + Log.v("globalmediastar"," -- chat first-chat -- "); + } + + public static void recordChatMsg(Activity context,String name,String phone,String address,String categoryId){ + + Map createMap = new HashMap(); + createMap.put("phone",phone); + createMap.put("category_id",categoryId); + createMap.put("name",name); + createMap.put("app_name","jdt"); + createMap.put("address",address); + + String charset = "utf-8"; + String url = "http://www.jdtapps.me/api/chat/enter"; + + Log.v("globalmediastar"," -- chat msg 01 -- " + name + " - " + phone + " - " + address + " - " + categoryId); + try + { +// httpPost = new HttpPost(url); +// +// //设置参数 +// List list = new ArrayList(); +// Iterator iterator = createMap.entrySet().iterator(); +// while(iterator.hasNext()){ +// Map.Entry elem = (Map.Entry) iterator.next(); +// list.add(new BasicNameValuePair(elem.getKey(),elem.getValue())); +// } +// if(list.size() > 0){ +// UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,charset); +// httpPost.setEntity(entity); +// } +// HttpResponse response = httpClient.execute(httpPost); +// if(response != null){ +// HttpEntity resEntity = response.getEntity(); +// if(resEntity != null){ +// +// } +// } + + + HttpClient client = new DefaultHttpClient(); + HttpPost httpPost = new HttpPost(url); + +// createMap.put("phone",phone); +// createMap.put("category_id",categoryId); +// createMap.put("name",name); +// createMap.put("app_name","jdt"); +// createMap.put("address",address); + + List params = new ArrayList(); + params.add(new BasicNameValuePair("phone", phone)); + params.add(new BasicNameValuePair("category_id", categoryId)); + params.add(new BasicNameValuePair("name", name)); + params.add(new BasicNameValuePair("app_name", "bible")); + params.add(new BasicNameValuePair("address", address)); + httpPost.setEntity(new UrlEncodedFormEntity(params, "utf-8")); + + HttpResponse response = client.execute(httpPost); + if (200 == response.getStatusLine().getStatusCode()) + { + //response.getEntity().getContent(); + } + + Log.v("globalmediastar"," -- chat msg 02 -- "); + } + catch(Exception ex){ + ex.printStackTrace(); + Log.v("globalmediastar"," -- chat msg 03 -- "+ex.toString()); + } + } + + static void postInfo(Activity context,String eventType){ + + CustomApplication application = (CustomApplication)context.getApplication(); + Tracker mTracker = application.getDefaultTracker(); + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction(eventType) + .setLabel(eventType) + .setValue(System.currentTimeMillis()) + .build()); + + Log.v("globalmediastar"," post star - "+eventType); + String rooturl = STAR_URL; + DefaultHttpClient httpClient = null; + String responseContent = null; + try { + + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + + SSLSocketFactory sf = newSslSocketFactory(context); + + HttpParams params = new BasicHttpParams(); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); + + SchemeRegistry registry = new SchemeRegistry(); + registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + registry.register(new Scheme("https", sf, 443)); + + ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); + + httpClient = new DefaultHttpClient(ccm, params); + + HttpPost httpPost = new HttpPost(rooturl); +// CLog.v("recordRun url: " + rooturl); + List formParams = new ArrayList(); //构建POST请求的表单参数 + formParams.add(new BasicNameValuePair("key", BibleSetting.getGMOEventAPIKey(context))); + formParams.add(new BasicNameValuePair("appName", BibleSetting.getAppName(context))); + formParams.add(new BasicNameValuePair("visitorId", getVisitorId(context))); + formParams.add(new BasicNameValuePair("eventType", eventType)); + formParams.add(new BasicNameValuePair("language", context.getResources().getConfiguration().locale.getLanguage())); + formParams.add(new BasicNameValuePair("deviceType", "Android")); + formParams.add(new BasicNameValuePair("timestamp", "" + getTimeStamp())); + httpPost.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8")); + + HttpResponse response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); // 获取响应实体 +// CLog.v("recordRun params: "+System.currentTimeMillis()+" language: "+context.getResources().getConfiguration().locale.getLanguage()); + if (entity != null) { + responseContent = EntityUtils.toString(entity, "UTF-8"); +// Log.v("recordRun response: ",responseContent); +// CLog.v( " record : " +eventType+ " -- "+responseContent); + } + Log.v("globalmediastar", " record : " +eventType+ " -- "+responseContent + " -- "+getTimeStamp()); +// CLog.v("recordRun response: "+System.currentTimeMillis()+" language: "+context.getResources().getConfiguration().locale.getLanguage()); + } + catch (Exception e) + { +// CLog.v("recordRun Exception: "+e.toString()); +// CLog.v("recordRun response: "+responseContent); + Log.v("globalmediastar"," record eventType exception: " + e.toString()); + } + finally { + // 关闭连接,释放资源 + httpClient.getConnectionManager().shutdown(); + } + } + + public static void postChapter(int bookId,int chapterId) { + PrintWriter out = null; + BufferedReader in = null; + String result = ""; + try { + String url = "http://godlife.com/api/v1.0/bible/languages/en/versions/CEV/books/"+ getShortenedBookNameByBookId(String.valueOf(bookId)) +"/chapters/"+chapterId; + url = url + "?key="+BibleSetting.getChatAPIKey(CustomApplication.getContext()); + + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + // 获取URLConnection对象对应的输出流 + out = new PrintWriter(conn.getOutputStream()); + // 发送请求参数 + // flush输出流的缓冲 + out.flush(); + // 定义BufferedReader输入流来读取URL的响应 + in = new BufferedReader( + new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) { + result += line; + } + Log.v("globalmediastar"," -- pass -- "+result); + } catch (Exception e) { + Log.v("globalmediastar","发送 POST 请求出现异常!"+e); + e.printStackTrace(); + } + //使用finally块来关闭输出流、输入流 + finally{ + try{ + if(out!=null){ + out.close(); + } + if(in!=null){ + in.close(); + } + } + catch(IOException ex){ + ex.printStackTrace(); + } + } + } + + static SSLSocketFactory newSslSocketFactory(Context context) { + try { + // Get an instance of the Bouncy Castle KeyStore format + // Get the raw resource, which contains the keystore with + // your trusted certificates (root and any intermediate certs) + InputStream in; + //TODO: testing + Log.d("HttpClientUtil", "using harvestinitiative server"); + KeyStore trusted = KeyStore.getInstance("BKS"); + in = context.getResources().openRawResource(R.raw.gmochatssl); + try { + // Initialize the keystore with the provided trusted certificates + // Also provide the password of the keystore + trusted.load(in, "gmochat".toCharArray()); + } finally { + in.close(); + } + // Pass the keystore to the SSLSocketFactory. The factory is responsible + // for the verification of the server certificate. + SSLSocketFactory sf = new SSLSocketFactory(trusted); + // Hostname verification from certificate + // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 + sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + return sf; + + } catch (Exception e) { + throw new AssertionError(e); + } + } + + + static String urlEncode(String sUrl) + { + StringBuffer urlOK = new StringBuffer(); + for(int i=0; i': urlOK.append("%3E"); break; + case '/': urlOK.append("%2F"); break; + case ' ': urlOK.append("%20"); break; + case ':': urlOK.append("%3A"); break; + case '-': urlOK.append("%2D"); break; + default: urlOK.append(ch); break; + } + } + return urlOK.toString(); + + } + + static String getShortenedBookNameByBookId(String bookId){ + String[][] bookInfo = new String[66][3]; + bookInfo[0][0] = "Gen"; bookInfo[0][1] = "Genesis"; bookInfo[0][2] = "1"; + bookInfo[1][0] = "Exod"; bookInfo[1][1] = "Exodus"; bookInfo[1][2] = "2"; + bookInfo[2][0] = "Lev"; bookInfo[2][1] = "Leviticus"; bookInfo[2][2] = "3"; + bookInfo[3][0] = "Num"; bookInfo[3][1] = "Numbers"; bookInfo[3][2] = "4"; + bookInfo[4][0] = "Deut"; bookInfo[4][1] = "Deuteronomy"; bookInfo[4][2] = "5"; + bookInfo[5][0] = "Josh"; bookInfo[5][1] = "Joshua"; bookInfo[5][2] = "6"; + bookInfo[6][0] = "Judg"; bookInfo[6][1] = "Judges"; bookInfo[6][2] = "7"; + bookInfo[7][0] = "Ruth"; bookInfo[7][1] = "Ruth"; bookInfo[7][2] = "8"; + bookInfo[8][0] = "1Sam"; bookInfo[8][1] = "1 Samuel"; bookInfo[8][2] = "9"; + bookInfo[9][0] = "2Sam"; bookInfo[9][1] = "2 Samuel"; bookInfo[9][2] = "10"; + bookInfo[10][0] = "1Kgs"; bookInfo[10][1] = "1 Kings"; bookInfo[10][2] = "11"; + bookInfo[11][0] = "2Kgs"; bookInfo[11][1] = "2 Kings"; bookInfo[11][2] = "12"; + bookInfo[12][0] = "1Chr"; bookInfo[12][1] = "1 Chronicles"; bookInfo[12][2] = "13"; + bookInfo[13][0] = "2Chr"; bookInfo[13][1] = "2 Chronicles"; bookInfo[13][2] = "14"; + bookInfo[14][0] = "Ezra"; bookInfo[14][1] = "Ezra"; bookInfo[14][2] = "15"; + bookInfo[15][0] = "Neh"; bookInfo[15][1] = "Nehemiah"; bookInfo[15][2] = "16"; + bookInfo[16][0] = "Esth"; bookInfo[16][1] = "Esther"; bookInfo[16][2] = "17"; + bookInfo[17][0] = "Job"; bookInfo[17][1] = "Job"; bookInfo[17][2] = "18"; + bookInfo[18][0] = "Ps"; bookInfo[18][1] = "Psalms"; bookInfo[18][2] = "19"; + bookInfo[19][0] = "Prov"; bookInfo[19][1] = "Proverbs"; bookInfo[19][2] = "20"; + bookInfo[20][0] = "Eccl"; bookInfo[20][1] = "Ecclesiastes"; bookInfo[20][2] = "21"; + bookInfo[21][0] = "Song"; bookInfo[21][1] = "Song of Songs"; bookInfo[21][2] = "22"; + bookInfo[22][0] = "Isa"; bookInfo[22][1] = "Isaiah"; bookInfo[22][2] = "23"; + bookInfo[23][0] = "Jer"; bookInfo[23][1] = "Jeremiah"; bookInfo[23][2] = "24"; + bookInfo[24][0] = "Lam"; bookInfo[24][1] = "Lamentations"; bookInfo[24][2] = "25"; + bookInfo[25][0] = "Ezek"; bookInfo[25][1] = "Ezekiel"; bookInfo[25][2] = "26"; + bookInfo[26][0] = "Dan"; bookInfo[26][1] = "Daniel"; bookInfo[26][2] = "27"; + bookInfo[27][0] = "Hos"; bookInfo[27][1] = "Hosea"; bookInfo[27][2] = "28"; + bookInfo[28][0] = "Joel"; bookInfo[28][1] = "Joel"; bookInfo[28][2] = "29"; + bookInfo[29][0] = "Amos"; bookInfo[29][1] = "Amos"; bookInfo[29][2] = "30"; + bookInfo[30][0] = "Obad"; bookInfo[30][1] = "Obadiah"; bookInfo[30][2] = "31"; + bookInfo[31][0] = "Jonah"; bookInfo[31][1] = "Jonah"; bookInfo[31][2] = "32"; + bookInfo[32][0] = "Mic"; bookInfo[32][1] = "Micah"; bookInfo[32][2] = "33"; + bookInfo[33][0] = "Nah"; bookInfo[33][1] = "Nahum"; bookInfo[33][2] = "34"; + bookInfo[34][0] = "Hab"; bookInfo[34][1] = "Habakkuk"; bookInfo[34][2] = "35"; + bookInfo[35][0] = "Zeph"; bookInfo[35][1] = "Zephaniah"; bookInfo[35][2] = "36"; + bookInfo[36][0] = "Hag"; bookInfo[36][1] = "Haggai"; bookInfo[36][2] = "37"; + bookInfo[37][0] = "Zech"; bookInfo[37][1] = "Zechariah"; bookInfo[37][2] = "38"; + bookInfo[38][0] = "Mal"; bookInfo[38][1] = "Malachi"; bookInfo[38][2] = "39"; + bookInfo[39][0] = "Matt"; bookInfo[39][1] = "Matthew"; bookInfo[39][2] = "40"; + bookInfo[40][0] = "Mark"; bookInfo[40][1] = "Mark"; bookInfo[40][2] = "41"; + bookInfo[41][0] = "Luke"; bookInfo[41][1] = "Luke"; bookInfo[41][2] = "42"; + bookInfo[42][0] = "John"; bookInfo[42][1] = "John"; bookInfo[42][2] = "43"; + bookInfo[43][0] = "Acts"; bookInfo[43][1] = "Acts"; bookInfo[43][2] = "44"; + bookInfo[44][0] = "Rom"; bookInfo[44][1] = "Romans"; bookInfo[44][2] = "45"; + bookInfo[45][0] = "1Cor"; bookInfo[45][1] = "1 Corinthians"; bookInfo[45][2] = "46"; + bookInfo[46][0] = "2Cor"; bookInfo[46][1] = "2 Corinthians"; bookInfo[46][2] = "47"; + bookInfo[47][0] = "Gal"; bookInfo[47][1] = "Galatians"; bookInfo[47][2] = "48"; + bookInfo[48][0] = "Eph"; bookInfo[48][1] = "Ephesians"; bookInfo[48][2] = "49"; + bookInfo[49][0] = "Phil"; bookInfo[49][1] = "Philippians"; bookInfo[49][2] = "50"; + bookInfo[50][0] = "Col"; bookInfo[50][1] = "Colossians"; bookInfo[50][2] = "51"; + bookInfo[51][0] = "1Thess"; bookInfo[51][1] = "1 Thessalonians"; bookInfo[51][2] = "52"; + bookInfo[52][0] = "2Thess"; bookInfo[52][1] = "2 Thessalonians"; bookInfo[52][2] = "53"; + bookInfo[53][0] = "1Tim"; bookInfo[53][1] = "1 Timothy"; bookInfo[53][2] = "54"; + bookInfo[54][0] = "2Tim"; bookInfo[54][1] = "2 Timothy"; bookInfo[54][2] = "55"; + bookInfo[55][0] = "Titus"; bookInfo[55][1] = "Titus"; bookInfo[55][2] = "56"; + bookInfo[56][0] = "Phlm"; bookInfo[56][1] = "Philemon"; bookInfo[56][2] = "57"; + bookInfo[57][0] = "Heb"; bookInfo[57][1] = "Hebrews"; bookInfo[57][2] = "58"; + bookInfo[58][0] = "Jas"; bookInfo[58][1] = "James"; bookInfo[58][2] = "59"; + bookInfo[59][0] = "1Pet"; bookInfo[59][1] = "1 Peter"; bookInfo[59][2] = "60"; + bookInfo[60][0] = "2Pet"; bookInfo[60][1] = "2 Peter"; bookInfo[60][2] = "61"; + bookInfo[61][0] = "1John"; bookInfo[61][1] = "1 John"; bookInfo[61][2] = "62"; + bookInfo[62][0] = "2John"; bookInfo[62][1] = "2 John"; bookInfo[62][2] = "63"; + bookInfo[63][0] = "3John"; bookInfo[63][1] = "3 John"; bookInfo[63][2] = "64"; + bookInfo[64][0] = "Jude"; bookInfo[64][1] = "Jude"; bookInfo[64][2] = "65"; + bookInfo[65][0] = "Rev"; bookInfo[65][1] = "Revelation"; bookInfo[65][2] = "66"; + + + for(int i = 0;i<66;i++){ + if(bookInfo[i][2].equals(bookId)==true){ + return bookInfo[i][0]; + } + } + + return ""; + } + + static String getTimeStamp() { + Calendar calendar = Calendar.getInstance(); + java.util.Date now = calendar.getTime(); + String longTimestamp = Long.toString(now.getTime()); + String timestamp = longTimestamp.substring(0, 10); +// Utils.Log("timestamp " + timestamp); + //Utils.Log(" Mllis " + System.currentTimeMillis()); + return timestamp; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/bus/LocalLanguage.java b/app/src/main/java/com/goodtrendltd/HolySongs/bus/LocalLanguage.java new file mode 100644 index 0000000..35c2df8 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/bus/LocalLanguage.java @@ -0,0 +1,16 @@ +package com.goodtrendltd.HolySongs.bus; + +/** + * Created by vincent on 15/8/13. + */ +public enum LocalLanguage { + + //简体中文 + TRADITIONAL_CHINESE, + + //繁体中文 + SIMPLIFIED_CHINESE, + + //英文 + ENGLISH +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/bus/UserMag.java b/app/src/main/java/com/goodtrendltd/HolySongs/bus/UserMag.java new file mode 100644 index 0000000..53ddf73 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/bus/UserMag.java @@ -0,0 +1,141 @@ +package com.goodtrendltd.HolySongs.bus; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import com.goodtrendltd.HolySongs.CustomApplication; +import com.goodtrendltd.HolySongs.chat.ChatUser; + +import org.json.JSONArray; +import org.json.JSONException; + +import java.util.ArrayList; + +/** + * Created by vincent on 15/6/25. + */ +public class UserMag { + public static String FORM_MESSAGE_ID_ARRAY = "form_message_id_array"; + public static String PREFS_FILE_NAME = "com.pressbible.view"; + + public static String CHAT_BUBBLE = "chat_bubble"; + + private UserMag() { + + } + + public static Boolean recordChatFirstMessage(Activity context) { + SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE_NAME, Context.MODE_PRIVATE); + if(prefs.contains("sentFirstMessage")) { + return false; + } + else { + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("sentFirstMessage", true); + editor.apply(); + GlobalMediaStar.recordFirstChat(context); + return true; + } + } + + + public static void addFormMessageId(Context context, int id){ + JSONArray array = new JSONArray(); + try { + array = loadJSONArray(context, FORM_MESSAGE_ID_ARRAY); + } catch (JSONException e) { + e.printStackTrace(); + Log.d("chat-user","form message array error: "+e); + } + //add new value + array.put(id); + saveJSONArray(context, FORM_MESSAGE_ID_ARRAY, array); + } + + public static ArrayList getFormMessageIds(){ + Context context = CustomApplication.getContext(); + ArrayList listdata = new ArrayList(); + JSONArray jArray = new JSONArray(); + try { + jArray = loadJSONArray(context, FORM_MESSAGE_ID_ARRAY); + } catch (JSONException e) { + e.printStackTrace(); + Log.d("chat-user","form message array error: "+e); + } + if (jArray != null) { + for (int i=0;i writing \"false\" to CHAT_BUBBLE"); + SharedPreferences.Editor editor = userinfo.edit(); + editor.putBoolean(CHAT_BUBBLE, false).apply(); + } + + public static void setNewNotification() { + Context context = CustomApplication.getContext(); + Log.d("chat-usermag","setNewNotification() -> writing \"true\" to CHAT_BUBBLE"); + SharedPreferences userinfo = context.getSharedPreferences(PREFS_FILE_NAME, 0); + SharedPreferences.Editor editor = userinfo.edit(); + editor.putBoolean(CHAT_BUBBLE, true).apply(); + } + + public static void saveJSONArray(Context c, String key, JSONArray array) { + SharedPreferences settings = c.getSharedPreferences(PREFS_FILE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(key, array.toString()); + editor.apply(); + } + + public static JSONArray loadJSONArray(Context c, String key) throws JSONException { + SharedPreferences settings = c.getSharedPreferences(PREFS_FILE_NAME, Context.MODE_PRIVATE); + return new JSONArray(settings.getString(key, "[]")); + } + +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/ApplicationSessionStateCallback.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ApplicationSessionStateCallback.java new file mode 100644 index 0000000..44e0a28 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ApplicationSessionStateCallback.java @@ -0,0 +1,9 @@ +package com.goodtrendltd.HolySongs.chat; + +/** + * Created by igorkhomenko on 4/29/15. + */ +public interface ApplicationSessionStateCallback { + void onStartSessionRecreation(); + void onFinishSessionRecreation(boolean success); +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/BaseChatActivity.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/BaseChatActivity.java new file mode 100644 index 0000000..c4790aa --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/BaseChatActivity.java @@ -0,0 +1,141 @@ +package com.goodtrendltd.HolySongs.chat; + +import android.app.ProgressDialog; +import android.os.Bundle; +import android.os.Handler; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; + +import com.quickblox.users.model.QBUser; + +/** + * Created by igorkhomenko on 4/29/15. + */ +public class BaseChatActivity extends AppCompatActivity implements ApplicationSessionStateCallback { + private static final String TAG = BaseChatActivity.class.getSimpleName(); + + private static final String USER_LOGIN_KEY = "USER_LOGIN_KEY"; + private static final String USER_PASSWORD_KEY = "USER_PASSWORD_KEY"; + + private boolean sessionActive = false; + private boolean needToRecreateSession = false; + + private ProgressDialog progressDialog; + private final Handler handler = new Handler(); + + public boolean isSessionActive() { + return sessionActive; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // 'initialised' will be true if it's the 1st start of the app or if the app's process was killed by OS(or user) + // + boolean initialised = ChatService.initIfNeed(this); + if(initialised && savedInstanceState != null){ + needToRecreateSession = true; + }else{ + sessionActive = true; + } + } + + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + + if(needToRecreateSession){ + needToRecreateSession = false; + + Log.d(TAG, "Need to restore chat connection"); + /* + QBUser user = new QBUser(); + user.setLogin(savedInstanceState.getString(USER_LOGIN_KEY)); + user.setPassword(savedInstanceState.getString(USER_PASSWORD_KEY)); + + savedInstanceState.remove(USER_LOGIN_KEY); + savedInstanceState.remove(USER_PASSWORD_KEY); + + recreateSession(user);*/ + } + } + + private void recreateSession(final QBUser user){ + sessionActive = false; + this.onStartSessionRecreation(); + + showProgressDialog(); + + // Restoring Chat session + // + /* + ChatService.getInstance().login(user, new QBEntityCallbackImpl() { + @Override + public void onSuccess() { + Log.d(TAG, "Chat login onSuccess"); + + progressDialog.dismiss(); + progressDialog = null; + + sessionActive = true; + BaseChatActivity.this.onFinishSessionRecreation(true); + } + + @Override + public void onError(List errors) { + + Log.d(TAG, "Chat login onError: " + errors); + + Toast toast = Toast.makeText(getApplicationContext(), + "Error in the recreate session request, trying again in 3 seconds.. Check you internet connection.", Toast.LENGTH_SHORT); + toast.show(); + + // try again + handler.postDelayed(new Runnable() { + @Override + public void run() { + recreateSession(user); + } + }, 3000); + + BaseChatActivity.this.onFinishSessionRecreation(false); + } + });*/ + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + /*QBUser currentUser = ChatService.getInstance().getCurrentUser(); + if(currentUser != null) { + outState.putString(USER_LOGIN_KEY, currentUser.getLogin()); + outState.putString(USER_PASSWORD_KEY, currentUser.getPassword()); + }*/ + + // Always call the superclass so it can save the view hierarchy state + super.onSaveInstanceState(outState); + } + + private void showProgressDialog(){ + if(progressDialog == null) { + progressDialog = new ProgressDialog(BaseChatActivity.this); + progressDialog.setTitle("Loading"); + progressDialog.setMessage("Restoring chat session..."); + progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER); + } + progressDialog.show(); + } + + + // + // ApplicationSessionStateCallback + // + + @Override + public void onStartSessionRecreation() { + } + + @Override + public void onFinishSessionRecreation(boolean success) { + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/Chat.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/Chat.java new file mode 100644 index 0000000..a9d0403 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/Chat.java @@ -0,0 +1,10 @@ +package com.goodtrendltd.HolySongs.chat; + +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; + +public interface Chat { + void sendMessage(ChatMessage message) throws XMPPException, SmackException.NotConnectedException; + + void release() throws XMPPException; +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatAdapter.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatAdapter.java new file mode 100644 index 0000000..0a7b51c --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatAdapter.java @@ -0,0 +1,177 @@ +package com.goodtrendltd.HolySongs.chat; + +import android.app.Activity; +import android.content.Context; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.util.Calendar; +import java.util.List; +import com.goodtrendltd.HolySongs.R; + +public class ChatAdapter extends BaseAdapter { + + private final List chatMessages; + private Activity context; + private Calendar calendar = Calendar.getInstance(); + + private enum ChatItemType { + Message, + Sticker + } + + public ChatAdapter(Activity context, List chatMessages) { + this.context = context; + this.chatMessages = chatMessages; + } + + @Override + public int getCount() { + if (chatMessages != null) { + return chatMessages.size(); + } else { + return 0; + } + } + + @Override + public ChatMessage getItem(int position) { + if (chatMessages != null) { + return chatMessages.get(position); + } else { + return null; + } + } + + @Override + public int getViewTypeCount() { + return ChatItemType.values().length; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + ChatMessage chatMessage = getItem(position); + LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + if (convertView == null) { + convertView = vi.inflate(R.layout.list_item_message, parent, false); + holder = createViewHolder(convertView); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + boolean isOutgoing = chatMessage.isOutgoing(); + if(chatMessage.getBody().indexOf("]:姓名:")>0){ + convertView.setVisibility(View.GONE); + } + else + { + convertView.setVisibility(View.VISIBLE); + } + setAlignment(holder, isOutgoing); + if (holder.txtMessage != null) { + holder.txtMessage.setText(chatMessage.getBody()); + } + holder.txtInfo.setText(getTimeText(chatMessage)); + if (chatMessage.isSendingInProgress()) { + holder.msgProgressBar.setVisibility(View.VISIBLE); + } + else { + holder.msgProgressBar.setVisibility(View.GONE); + } + return convertView; + } + + public void add(ChatMessage message) { + chatMessages.add(message); + } + + public void add(List messages) { + chatMessages.addAll(messages); + } + + private void setAlignment(ViewHolder holder, boolean isOutgoing) { + if (!isOutgoing) { + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.messageHolder.getLayoutParams(); + layoutParams.gravity = Gravity.LEFT; + holder.messageHolder.setLayoutParams(layoutParams); + + RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); + lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); + lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); + holder.content.setLayoutParams(lp); + + layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); + layoutParams.gravity = Gravity.LEFT; + holder.txtInfo.setLayoutParams(layoutParams); + if (holder.txtMessage != null) { + holder.contentWithBG.setBackgroundResource(R.drawable.incoming_message); + layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); + layoutParams.gravity = Gravity.LEFT; + holder.txtMessage.setLayoutParams(layoutParams); + } else { + holder.contentWithBG.setBackgroundResource(android.R.color.transparent); + } + } else { + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.messageHolder.getLayoutParams(); + layoutParams.gravity = Gravity.RIGHT; + holder.messageHolder.setLayoutParams(layoutParams); + + RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); + lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0); + lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + holder.content.setLayoutParams(lp); + + layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); + layoutParams.gravity = Gravity.RIGHT; + holder.txtInfo.setLayoutParams(layoutParams); + + if (holder.txtMessage != null) { + holder.contentWithBG.setBackgroundResource(R.drawable.outgoing_message_green); + layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); + layoutParams.gravity = Gravity.RIGHT; + holder.txtMessage.setLayoutParams(layoutParams); + } else { + holder.contentWithBG.setBackgroundResource(android.R.color.transparent); + } + } + } + + private ViewHolder createViewHolder(View v) { + ViewHolder holder = new ViewHolder(); + holder.txtMessage = (TextView) v.findViewById(R.id.txtMessage); + holder.content = (LinearLayout) v.findViewById(R.id.content); + holder.contentWithBG = (LinearLayout) v.findViewById(R.id.contentWithBackground); + holder.messageHolder = (LinearLayout) v.findViewById(R.id.messageHolder); + holder.txtInfo = (TextView) v.findViewById(R.id.txtInfo); + holder.msgProgressBar = (ProgressBar) v.findViewById(R.id.message_progressBar); + return holder; + } + + private String getTimeText(ChatMessage message) { + return message.getPrettyDate(context); + } + + private static class ViewHolder { + public TextView txtMessage; + public TextView txtInfo; + public LinearLayout content; + public LinearLayout contentWithBG; + public LinearLayout messageHolder; + public ProgressBar msgProgressBar; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatMessage.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatMessage.java new file mode 100644 index 0000000..4e16bf1 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatMessage.java @@ -0,0 +1,91 @@ +package com.goodtrendltd.HolySongs.chat; + +import android.content.Context; +import android.text.format.DateUtils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +/** + * Created by Julia on 9/22/2015. + */ +public class ChatMessage { + private Integer id; + private Date date; + private String body; + private boolean readFlag; + private boolean saveToHistory = false; + private String direction; + private boolean sendingInProgress = false; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss", Locale.getDefault()); + DateFormat df = DateFormat.getDateTimeInstance(); +// fromDate = sdf.format(fromDateTime); + + public ChatMessage() { + } + public Integer getId() {return this.id;} + public void setId(Integer id) {this.id = id;} + public String getBody() {return this.body;} + public void setBody(String body) { + this.body = body; + } + public void setReadFlag(Boolean flag) { this.readFlag=flag; } + public Boolean isRead() {return this.readFlag; } + public void setDirection(String direction) { this.direction = direction; } + public void setDate(Date date) { + //Date is stored as date object + this.date=date; + } + public void setDateFromString(String utcdate) throws ParseException { + //From string, ex. 2015-09-22 07:11:49 + //to Date object + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + this.date = sdf.parse(utcdate); + } + public Date getDate() { + return this.date; + } + public String getUTCDate() { + //In UTC time zone: yyyy-MM-dd 1970-01-01 + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + return sdf.format(this.date); + } + public String getPrettyDate(Context ctxt) { + //Date to String, ex. Dec 31, 1969 4:00:00 PM + String prettyDate = ""; + // prettyDate = df.format(prettyDate); + if(DateUtils.isToday(this.date.getTime())) { //today + prettyDate = DateUtils.formatDateTime(ctxt,this.date.getTime(), DateUtils.FORMAT_SHOW_TIME); + } + else { //relative format in days up to 3 days ago, otherwise standard format + prettyDate = DateUtils.getRelativeDateTimeString(ctxt,this.date.getTime(), DateUtils.DAY_IN_MILLIS,3* DateUtils.DAY_IN_MILLIS, DateUtils.FORMAT_SHOW_WEEKDAY).toString(); + } + return prettyDate; + } + + public boolean isOutgoing(){ + if (this.direction.equals("in")) { + //"in" means that the message is sent in to the OM's + //For our purposes, "in" means received messages + return true; + } + else { + //"out" means message is sent from the OM's + //In this code, "out" means sent messages from app + return false; + } + } + + public boolean isSendingInProgress() { + return this.sendingInProgress; + } + public void setSendingInProgress(Boolean status) { + this.sendingInProgress = status; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatService.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatService.java new file mode 100644 index 0000000..844b850 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatService.java @@ -0,0 +1,639 @@ +package com.goodtrendltd.HolySongs.chat; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.provider.Settings.Secure; +import android.support.v4.content.LocalBroadcastManager; +import android.support.v7.app.NotificationCompat; +import android.util.Log; + +import com.goodtrendltd.HolySongs.ChatActivity; +import com.goodtrendltd.HolySongs.CustomApplication; +import com.goodtrendltd.HolySongs.R; +import com.goodtrendltd.HolySongs.bus.BibleSetting; +import com.goodtrendltd.HolySongs.bus.LocalLanguage; +import com.goodtrendltd.HolySongs.bus.UserMag; + +import com.quickblox.auth.QBAuth; +import com.quickblox.auth.model.QBSession; +import com.quickblox.chat.QBChatService; +import com.quickblox.core.QBEntityCallback; +import com.quickblox.core.QBEntityCallbackImpl; +import com.quickblox.users.model.QBUser; + +import org.jivesoftware.smack.ConnectionListener; +import org.jivesoftware.smack.XMPPConnection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ChatService { + + static final String SENDER_ID="868640157488"; + + private static final String TAG = ChatService.class.getSimpleName(); + + static final int AUTO_PRESENCE_INTERVAL_IN_SECONDS = 30; + static final int REGISTER_TASK = 1; + static final int UPDATE_TASK = 2; + static final int GETMESSAGES_TASK = 3; + static final int MARKASREAD_TASK = 4; + static final int SENDMESSAGE_TASK = 5; + public static final String COUNT = "count"; + public static final String MSG_CONTENT = "content"; + public static final String NEW_MESSAGES = "new-message"; + + private static ChatService instance; + private static Context context; + private static ChatUser chatUser = ChatUser.getInstance(); + private static int mId =0; + + public static void initChatService(Context context) { + ChatService.context = context; + } + + public static synchronized ChatService getInstance() { + if(instance == null) { + instance = new ChatService(); + } + return instance; + } + + public static boolean initIfNeed(Context ctx) { + if (!QBChatService.isInitialized()) { + QBChatService.setDebugEnabled(true); + QBChatService.init(ctx); + Log.d(TAG, "Initialise QBChatService"); + + return true; + } + + return false; + } + + private QBChatService chatService; + + private ChatService() { + chatService = QBChatService.getInstance(); + chatService.addConnectionListener(chatConnectionListener); + } + + public void addConnectionListener(ConnectionListener listener){ + chatService.addConnectionListener(listener); + } + + public void removeConnectionListener(ConnectionListener listener){ + chatService.removeConnectionListener(listener); + } + + public static Integer register(String push_token, UserTask usertask){ + + Integer code; + try + { + Log.v("ChatService-post-https", "Executing register task..."); + Map params = new HashMap(); + Map task = new HashMap(); + + params.put("app_key", BibleSetting.getChatAPIKey(CustomApplication.getContext())); + Log.v("ChatService-post-https", "Executing register task 1..."); + params.put("platform", "android"); + params.put("push_token", push_token); + Log.v("ChatService-post-https", "Executing register task 2..."); + task.put("task", ChatService.REGISTER_TASK); + + Log.v("ChatService-post-https", "Still registering......"); + usertask.execute(params, task); + + //HttpsUtil.post("https://commchannels.globalmediaoutreach.com/api/app/users", key, values); + code=0; + } + catch(Exception ex){ + code=1; + System.out.println(" \t " + ex.getMessage()); + Log.d("ChatService-register:", "register failed, exception: " + ex+" "+ex.getMessage()); + } + + // Create REST API session + // + return code; + } + + public static void updateUser(String username, String decision, UserTask userTask) { + //write updated user info to shared preferences + String userkey = UserMag.getUserKey(); + SharedPreferences userinfo = context.getSharedPreferences(UserMag.PREFS_FILE_NAME, 0); + SharedPreferences.Editor editor = userinfo.edit(); + editor.putString(ChatUser.USER_NAME_PREF, username); + editor.putString(ChatUser.USER_DECISION_PREF, decision); + editor.apply(); + + try { + Log.d("ChatService-post-https", "Executing updateUser task..."); + Map params = new HashMap(); + Map task = new HashMap(); + + params.put("user_key", userkey); + params.put("name", username); + params.put("decision", decision); + task.put("task", ChatService.UPDATE_TASK); + + userTask.execute(params, task); + } + catch (Exception e) { + Log.e("ChatService-updateUser", e.toString()); + } + } + + public static void markAsRead(ArrayList ids, MessageTask messageTask){ + //write updated user info to shared preferences + String userkey = UserMag.getUserKey(); + //TODO: {"success":false,"errorType":"InvalidParameter","code":452,"message":"\u0027ids\u0027 should be an array of integers"} + try { + Log.d("ChatService-put-https", "Executing markAsRead..."); + Map params = new HashMap(); + Map task = new HashMap(); + + params.put("user_key", userkey); + for (Integer i : ids) { + params.put("ids[]", i.toString()); + } + Log.d("ChatService-post-https", "ids being marked: " + ids.toString()); + task.put("task", ChatService.MARKASREAD_TASK); + + messageTask.execute(params, task); + + } + catch (Exception e) { + Log.e("ChatService-markAsRead", e.toString()); + } + } + + public static void loadMoreMessages(Integer msgCount, MessageTask messageTask) { + Integer minPageSize = 5; + Integer pageSize = (msgCount % minPageSize) + minPageSize; + Integer pageNumber = (msgCount/pageSize) + 1; + Log.d("ChatServie-messages", "loading pageSize:"+pageSize); + Log.d("ChatServie-messages", "loading pageNumber:" + pageNumber); + getMessages(false, pageSize, pageNumber, messageTask); + } + + public static Integer getMessages(Boolean onlyNew, Integer count, Integer page, MessageTask messageTask) { + String fromDate=""; + String toDate=""; + + if (count<1 || count>1000) { + count=50; + Log.d("ChatService-messages", "Message count must be between 1 and 1000. Count set to 50."); + } + if (page<1) { + page=1; + Log.d("ChatService-messages", "Page count must be greater than 1. Page count set to 1."); + } + + String userkey = UserMag.getUserKey(); + + try { + Log.d("ChatService-messages", "Executing getMessages task..."); + Map params = new HashMap(); + Map task = new HashMap(); + + params.put("user_key", userkey); +// params.put("from_date", fromDate); +// params.put("to_date", toDate); + params.put("only_new", onlyNew.toString()); + params.put("count", count.toString()); + params.put("page", page.toString()); + task.put("task", ChatService.GETMESSAGES_TASK); + + Log.d("ChatService-messages", "user_key:" + userkey); + messageTask.execute(params, task); + } + catch (Exception e) { + Log.e("ChatService-messages", e.toString()); + return 1; + } + return 0; + } + + public static class CheckMessages implements Runnable { + @Override + public void run() { + + Log.v("chat", "CheckMessages!"); + + if (UserMag.getUserKey()=="") { + return; + } + + //check for new messages + ChatService.getMessages(Boolean.TRUE, 30, 1, new MessageTask() { + @Override + protected void onSuccessfulReceive(HttpClientUtil.ResponseObject msgResponse) { + int count = 0; + ArrayList messages = msgResponse.getMessages(); + + for (ChatMessage msg : messages) { + if (!msg.isOutgoing()) { + if (chatUser.addToInbox(msg)) { + makeNotification(msg); + }; + count++; + } + } + + if (count > 0) { + Log.v("chat", "making notification. Count: " + count); + sendNotification(count, messages); + } + } + }); + } + + // Send an Intent with an action named "my-event". + private void sendNotification(int count, ArrayList messages) { + Intent intent = new Intent(ChatService.NEW_MESSAGES); + // add data + intent.putExtra(ChatService.COUNT, count); + LocalBroadcastManager.getInstance(ChatService.context).sendBroadcast(intent); + } + } + + private static void makeNotification(ChatMessage message) { + String text = message.getBody(); + long when = message.getDate().getTime(); + Intent notificationIntent = new Intent(context, ChatActivity.class); + PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); + mId=mId+1; + Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + //Detailed version + Notification notification = new NotificationCompat.Builder(context) + .setContentTitle(context.getString(R.string.chat_notification_title)) + .setContentText(text) + .setWhen(when) + .setSmallIcon(R.drawable.icon) + .setAutoCancel(true) + .addAction(android.R.drawable.ic_menu_view, "View details", contentIntent) + .setContentIntent(contentIntent) + .setPriority(Notification.PRIORITY_DEFAULT) + .setSound(alarmSound).build(); + + NotificationManager mNotificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + // mId allows you to update the notification later on. + mNotificationManager.notify(mId, notification); + } + + public static Integer sendMessage(String message, MessageTask messageTask) { + String userkey = UserMag.getUserKey(); + String language=""; + + if(BibleSetting.getLocalLanguage(context)== LocalLanguage.SIMPLIFIED_CHINESE + || BibleSetting.getLocalLanguage(context)== LocalLanguage.TRADITIONAL_CHINESE ) + language="zh"; + else + language="en"; + + try { + Map params = new HashMap(); + Map task = new HashMap(); + + Log.d("ChatService-messages", "send message: " + message); + params.put("user_key", userkey); + params.put("message", message); + params.put("language", language); + task.put("task", ChatService.SENDMESSAGE_TASK); + + messageTask.execute(params, task); + } + catch (Exception e) { + Log.e("ChatService-messages", e.toString()); + return 1; + } + return 0; + } + + public static String getToken(Context context){ + String android_id=null; + try { + /*InstanceID instanceID = InstanceID + .getInstance(context);*/ + + android_id = Secure.getString(context.getContentResolver(), + Secure.ANDROID_ID); + Log.d("token", "android_id retrieved: " + android_id); + } catch (Exception ex) { + //e.printStackTrace(); + Log.d("token", "android_id could not be retrieved: " + ex); + } + return android_id; + } + + public void login(final QBUser user, final QBEntityCallback callback){ + + // Create REST API session + // + + QBAuth.createSession(user, new QBEntityCallbackImpl() { + @Override + public void onSuccess(QBSession session, Bundle args) { + + user.setId(session.getUserId()); + + // login to Chat + // + loginToChat(user, new QBEntityCallbackImpl() { + + @Override + public void onSuccess() { + callback.onSuccess(); + } + + @Override + public void onError(List errors) { + callback.onError(errors); + } + }); + } + + @Override + public void onError(List errors) { + callback.onError(errors); + } + }); + } + + private void loginToChat(final QBUser user, final QBEntityCallback callback){ + } + + + public static class UserTask extends AsyncTask { + String content=null; + static Integer task=0; + + @Override + protected String doInBackground(Map... params) { + UserTask.task = ((Integer) params[1].get("task")); + Log.v("ChatService-UserTask", "task number: " + task); + + try + { + Log.v("ChatService-UserTask", "/user task started"); + if (context==null) { + context = CustomApplication.getContext(); + } + if (context!=null) { + // Instantiate the custom HttpClient + HttpClientUtil client = new HttpClientUtil(); + client.setContext(context); + // Execute the Post call and obtain the response + if (task==ChatService.REGISTER_TASK) { + content = client.sendHttpsRequestByPost("/users", params[0]); + } + else if (task==ChatService.UPDATE_TASK) { + content = client.sendHttpsRequestByPut("/users", params[0]); + } + else { + Log.e("ChatService-UserTask", "Task not set."); + } + } + else { + Log.e("ChatService-UserTask", "ERROR: context is null"); + } + } + catch(Exception ex){ + Log.d("ChatService-UserTask", "usertask failed, exception: " + ex); + content=null; + } + catch(Error e) { + Log.e("ChatService-UserTask", "usertask failed, exception: " + e); + content=null; + } + return content; + } + + protected void onProgressUpdate(String... content){ + } + + protected void onPostExecute(String result){ + super.onPostExecute(result); + Log.d("ChatService-UserTask", "UserTask response received ----- " + content); + Boolean success=false; + if (content!=null) { + success = HttpClientUtil.parseSuccessResponse(content); + } + if (!success) { + onFailure(); + } + else { //Task successful, process content + switch (task) { + case ChatService.REGISTER_TASK: + String userkey; + userkey = HttpClientUtil.parseRegisterResponse(content); + + //write userkey to sharedpreferences for storage + UserMag.recordUserKey(userkey); + ChatUser.getInstance().setKey(userkey); + + Log.d("ChatService-UserTask", "ChatUser key parsed:" + userkey); + onSuccess(); + break; + case ChatService.UPDATE_TASK: + //write updated values to SharedPreferences + Log.d("ChatService-UserTask", "Update successful"); + onSuccess(); + break; + default: + //oops + Log.d("ChatService-UserTask", "Post task not set! Task number: "+task); + } + } + } + + protected void onSuccess() { + + } + protected void onFailure() { + + } + + } + + public static class MessageTask extends AsyncTask { + String content=null; + Integer task=0; + + @Override + protected String doInBackground(Map... params) { + task = ((Integer) params[1].get("task")); + Log.d("ChatService-messages", "task number: " + task); + + try + { + Log.d("ChatService-messages", "message task started"); + + if (context==null) { + context = CustomApplication.getContext(); + } + if (context!=null) { + // Instantiate the custom HttpClient + HttpClientUtil client = new HttpClientUtil(); + HttpClientUtil.setContext(context); + // Execute the Post call and obtain the response + if (task==ChatService.GETMESSAGES_TASK) { + Log.d("ChatService-messages", "getting messages"); + content = client.sendHttpsRequestByGet("/messages", params[0]); + } + else if (task==ChatService.MARKASREAD_TASK) { + Log.d("ChatService-messages", "marking as read"); + content = client.sendHttpsRequestByPut("/messages", params[0]); + } + else if (task==ChatService.SENDMESSAGE_TASK) { + Log.d("ChatService-messages", "sending message"); + content = client.sendHttpsRequestByPost("/messages", params[0]); + } + else { + Log.e("ChatService-messages", "Task not set correctly."); + } + } + else { + Log.e("ChatService-messages", "ERROR: context is null"); + } + + } + catch(Exception ex){ + Log.d("ChatService-messages", "messagetask failed, exception: " + ex); + } + catch(Error e) { + Log.e("ChatService-messages", "messagetask failed, exception: " + e); + } + return content; + } + + protected void onProgressUpdate(String... content){ + } + + protected void onPostExecute(String result){ + super.onPostExecute(result); + Log.d("ChatService-messages", "Message Task response received ----- " + content); + + //Finished task, process content + if (content!=null) { + HttpClientUtil.ResponseObject msgResponse = HttpClientUtil.parseMessageResponse(content); + //HttpClientUtil.ResponseObject msgResponse = HttpClientUtil.makeDummyMessages(2); + switch (task) { + case ChatService.GETMESSAGES_TASK: + //get Paging + if (msgResponse.isSuccessful()){ + Log.d("ChatService-messages", "Message Count:" + msgResponse.getMessageCount()); + Log.d("ChatService-messages", "Page Next:" + msgResponse.getPageNext()); + Log.d("ChatService-messages", "Page Previous: " + msgResponse.getPagePrev()); + Log.d("ChatService-messages", "success: " + msgResponse.isSuccessful()); + onSuccessfulReceive(msgResponse); + } + else { + Log.e("ChatService-messages", "failed receiving messages"); + onFailure(); + } + break; + case ChatService.MARKASREAD_TASK: + //Mark messages as read + if (msgResponse.isSuccessful()) { + onSuccessfulMark(); + Log.d("ChatService-messages", "Message marked as read"); + } + else { + Log.e("ChatService-messages", "MarkAsRead failed."); + } + break; + case ChatService.SENDMESSAGE_TASK: + //Message has been sent + Log.d("ChatService-message", "Message sent."); + if (msgResponse.isSuccessful()) { + onSuccessfulSend(msgResponse.getId()); + } + else { + Log.e("ChatService-messages", "failed sending message"); + onFailure(); + } + break; + default: + //oops + Log.d("ChatService-messages", "Post task not set!"); + Log.d("ChatService-messages", "Task number: " + task); + onFailure(); + } + } + else { + //HttpClientUtil.ResponseObject msgResponse = HttpClientUtil.makeDummyMessages(10); + //onSuccessfulReceive(msgResponse); + onFailure(); + } + } + + protected void onSuccessfulReceive(HttpClientUtil.ResponseObject msgResponse) { + Log.d("ChatService-http", "Messages Received successfully."); + } + protected void onSuccessfulSend(int id) { + Log.d("ChatService-http", "Message Sent successfully."); + } + protected void onSuccessfulMark() { + Log.d("ChatService-http", "Message Marked successfully."); + } + protected void onFailure() { + Log.e("ChatService-http", "message method failed."); + } + + } + + ConnectionListener chatConnectionListener = new ConnectionListener() { + @Override + public void connected(XMPPConnection connection) { + Log.i(TAG, "connected"); + } + + @Override + public void authenticated(XMPPConnection connection) { + Log.i(TAG, "authenticated"); + } + + @Override + public void connectionClosed() { + Log.i(TAG, "connectionClosed"); + } + + @Override + public void connectionClosedOnError(final Exception e) { + Log.i(TAG, "connectionClosedOnError: " + e.getLocalizedMessage()); + } + + @Override + public void reconnectingIn(final int seconds) { + if(seconds % 5 == 0) { + Log.i(TAG, "reconnectingIn: " + seconds); + } + } + + @Override + public void reconnectionSuccessful() { + Log.i(TAG, "reconnectionSuccessful"); + } + + @Override + public void reconnectionFailed(final Exception error) { + Log.i(TAG, "reconnectionFailed: " + error.getLocalizedMessage()); + } + }; +} + diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatUser.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatUser.java new file mode 100644 index 0000000..e345482 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/ChatUser.java @@ -0,0 +1,146 @@ +package com.goodtrendltd.HolySongs.chat; + +import android.util.Log; + +import com.goodtrendltd.HolySongs.bus.UserMag; + +import java.util.ArrayList; + +/** + * Created by Julia on 9/14/2015. + */ +public class ChatUser { + public static final String INFO_FILE_NAME = "userinfo.xml"; + public static final String USER_KEY_PREF = "userkey"; + public static final String USER_NAME_PREF = "username"; + public static final String USER_DECISION_PREF = "decision"; + public static final String USER_KEY_STORED = ""; + // public static final String USER_KEY_STORED = "fe488618456ecbf14f661f7d3cfa4469b5cf02e0edc662f4489f3d53f08cadd398074e" + +// "139404553007c647f14e6e798155ac8b8c7d22112be8879e32a0af2008"; + //public static final String USER_KEY_STORED = "a4863c60927960800da8d227b6440cf43b41c187af608ddfa"+ + // "6903d4c144c11df4879e14c2747b31675501de04f0e818fde7d94ba2f664390e2abe48f3f9cc639"; + public final ArrayList inbox = new ArrayList<>(); + public final ArrayList readList = new ArrayList<>(); + + private static ChatUser instance = null; + private ChatUser() { + // Exists only to defeat instantiation. + } + public static ChatUser getInstance() { + if(instance == null) { + instance = new ChatUser(); + instance.loadPrefs(); + } + return instance; + } + public void loadPrefs() { + this.key = UserMag.getUserKey(); + this.username = UserMag.getUsername(); + this.formMessageIds = UserMag.getFormMessageIds(); + Log.v("chat-user", "preferences loaded - username: " + username + " formMessageIds: " + formMessageIds.toString()); + } + + private String key; + public String username = ""; + private String decision="none"; + private String formMessage=""; + private Boolean firstTime = true; + private ArrayList formMessageIds= null; + public static String PRAYED = "prayed"; + public static String RECOMMITTED = "recommitted"; + public static String GROW = "grow"; + public static String NONE = "none"; + + public void setKey(String key) { + this.key = key; + } + public void setUsername(String username) { + this.username = username; + } + public void setDecision(String decision) { + this.decision = decision; + } + + public String getKey() { + return this.key; + } + public String getUsername() { + return this.username; + } + public String getDecision() { + return this.decision; + } + + public int getUnreadCount() { + Log.d("bible-chat-user", "getUnreadCount()"); + if (UserMag.getChatBubble()) { + Log.d("bible-chat-user", "UserMag.getChatBubble()"); + return 1; + } + else if (this.inbox==null) { + Log.d("bible-chat-user", "this.inbox==null"); + return 0; + } + else { + Log.d("bible-chat-user", "this.inbox.size()="+this.inbox.size()); + return this.inbox.size(); + } + } + + public Boolean markAsRead(int id) { + if (!this.readList.contains(id)) { + this.readList.add(id); + return true; + } else { + return false; + } + } + + public Boolean addToInbox(ChatMessage msg) { + if (!this.inbox.contains(msg.getId()) && !this.readList.contains(msg.getId())) { + this.inbox.add(msg.getId()); + return true; + } else { + return false; + } + } + + public void emptyInbox() { + if (this.inbox.size()>0) { + for (int msgID:this.inbox ) { + if (!this.readList.contains(msgID)) { + this.readList.add(msgID); + } + } + this.inbox.clear(); + } + } + + public void removeFromReadList(ArrayList ids) { + for (int id : ids) { + if (readList.contains(id)) { + this.readList.remove(this.readList.indexOf(id)); + } + } + } + + public void emptyReadList() { + this.readList.clear(); + } + + public ArrayList getReadList() { + return this.readList; + } + public void setFormMessage(String msg) { + this.formMessage = msg; + } + public String getFormMessage() { + return this.formMessage; + } + public void addFormMessageId(int id){ + this.formMessageIds.add(id); + } + public ArrayList getFormMessageIds(){ + return this.formMessageIds; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/chat/HttpClientUtil.java b/app/src/main/java/com/goodtrendltd/HolySongs/chat/HttpClientUtil.java new file mode 100644 index 0000000..67d5b4d --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/chat/HttpClientUtil.java @@ -0,0 +1,445 @@ +package com.goodtrendltd.HolySongs.chat; + +/** + * Created by jliston on 9/9/15. + */ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +import android.content.Context; +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.goodtrendltd.HolySongs.R; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.InputStream; +import java.security.KeyStore; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Random; + +public class HttpClientUtil { + + private static Context context; + private static String rooturl; + + public static void setContext(Context context) { + HttpClientUtil.context = context; + } + + + private SSLSocketFactory newSslSocketFactory() { + try { + // Get an instance of the Bouncy Castle KeyStore format + // Get the raw resource, which contains the keystore with + // your trusted certificates (root and any intermediate certs) + InputStream in; + KeyStore trusted = KeyStore.getInstance("BKS"); + in = context.getResources().openRawResource(R.raw.gmochatssl); + try { + // Initialize the keystore with the provided trusted certificates + // Also provide the password of the keystore + trusted.load(in, "gmochat".toCharArray()); + } finally { + in.close(); + } + // Pass the keystore to the SSLSocketFactory. The factory is responsible + // for the verification of the server certificate. + SSLSocketFactory sf = new SSLSocketFactory(trusted); + // Hostname verification from certificate + // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 + sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + return sf; + + } catch (Exception e) { + throw new AssertionError(e); + } + } + public HttpClient getNewHttpClient() { + try { + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + + SSLSocketFactory sf = newSslSocketFactory(); + //set rooturl + if (inChina()){ + rooturl = "https://xinxiwang.me"; + } + else { + rooturl = "https://commchannels.globalmediaoutreach.com/api/app"; + } + HttpParams params = new BasicHttpParams(); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); + + SchemeRegistry registry = new SchemeRegistry(); + registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + registry.register(new Scheme("https", sf, 443)); + + ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); + + return new DefaultHttpClient(ccm, params); + } catch (Exception e) { + return new DefaultHttpClient(); + } + } + + public String sendHttpsRequestByPost(String url, Map params) { + String responseContent = null; + HttpClient httpClient = getNewHttpClient(); + + try { + Log.d("HttpClientUtil-https", "sendHttpsRequestByPost in progress..."); + Log.d("HttpClientUtil", "url: "+rooturl+url); + + HttpPost httpPost = new HttpPost(rooturl+url); + List formParams = new ArrayList(); // 构建POST请求的表单参数 + for (Map.Entry entry : params.entrySet()) { + formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + httpPost.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8")); + HttpResponse response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); // 获取响应实体 + if (entity != null) { + responseContent = EntityUtils.toString(entity, "UTF-8"); + } + } catch (Exception e) { + Log.e("HttpClientUtil-https", e.toString()); + } + finally { + // 关闭连接,释放资源 + httpClient.getConnectionManager().shutdown(); + } + return responseContent; + } + + public String sendHttpsRequestByPut(String url, Map params) { + String responseContent = null; + HttpClient httpClient = getNewHttpClient(); + + try { + Log.d("HttpClientUtil-https", "sendHttpsRequestByPut in progress..."); + Log.d("HttpClientUtil", "url: "+rooturl+url); + + HttpPut httpPut = new HttpPut(rooturl+url); + List formParams = new ArrayList(); // 构建PUT请求的表单参数 + for (Map.Entry entry : params.entrySet()) { + formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + httpPut.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8")); + HttpResponse response = httpClient.execute(httpPut); + HttpEntity entity = response.getEntity(); // 获取响应实体 + if (entity != null) { + responseContent = EntityUtils.toString(entity, "UTF-8"); + } + } catch (Exception e) { + Log.e("HttpClientUtil-https", e.toString()); + } + finally { + // 关闭连接,释放资源 + httpClient.getConnectionManager().shutdown(); + } + return responseContent; + } + + public String sendHttpsRequestByGet(String url, Map params) { + String responseContent = null; + HttpClient httpClient = getNewHttpClient(); + + try { + Log.d("HttpClientUtil-https", "sendHttpsRequestByGet in progress..."); + Log.d("HttpClientUtil", "url: "+rooturl+url); + + List formParams = new ArrayList(); // 构建POST请求的表单参数 + for (Map.Entry entry : params.entrySet()) { + formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + String paramsString = URLEncodedUtils.format(formParams, "UTF-8"); + HttpGet httpGet = new HttpGet(rooturl+url+"?"+paramsString); + HttpResponse response = httpClient.execute(httpGet); + HttpEntity entity = response.getEntity(); // 获取响应实体 + if (entity != null) { + responseContent = EntityUtils.toString(entity, "UTF-8"); + } + } catch (Exception e) { + Log.e("HttpClientUtil-https", e.toString()); + } + finally { + // 关闭连接,释放资源 + httpClient.getConnectionManager().shutdown(); + } + return responseContent; + } + /** + * Get ISO 3166-1 alpha-2 country code for this device (or null if not available) + * @return country code or null + */ + public static Boolean inChina() { + try { + final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (tm==null) { + return true; //if don't have this system service, always get the china network + } + final String simCountry = tm.getSimCountryIso().toLowerCase(Locale.US); + final String networkCountry = tm.getNetworkCountryIso().toLowerCase(Locale.US); + Log.d("HttpClientUtil", "networkCountry: "+networkCountry); + Log.d("HttpClientUtil", "simCountry: "+simCountry); + + if (networkCountry.equals("cn") || networkCountry.equals("")) { // Network country code is available + return true; + } + else if (simCountry.equals("cn") || simCountry.equals("")) { // SIM country code is available + return true; + } + } + catch (Exception e) { + Log.e("HttpClientUtil-https", e.toString()); + } + return false; + } + + public static String parseRegisterResponse(String response) { + String key = ""; + try { + JSONObject jObject = new JSONObject(response); + + key = jObject.optString("user_key").toString(); + } catch (JSONException e) { + Log.e("https-json", e.toString()); + } + return key; + } + + public static Boolean parseSuccessResponse(String response) { + try { + JSONObject jObject = new JSONObject(response); + if (jObject.getString("success").equals("true")) { + return true; + } else { + return false; + } + } catch (JSONException e) { + Log.e("https-json", e.toString()); + return false; + } + } + + public static ResponseObject parseMessageResponse(String response) { + ResponseObject responseObject = new ResponseObject(); + ArrayList msgArray = new ArrayList(); + Integer pageNext = null; + Integer pagePrev = null; + Boolean success = false; + Integer sentId = -1; + + JSONObject jObject = null; + try { + jObject = new JSONObject(response); + try { + + JSONArray jmsgArray = jObject.getJSONArray("messages"); + + for (int i = 0; i < jmsgArray.length(); i++) { + try { + ChatMessage message = new ChatMessage(); + JSONObject jmessage = jmsgArray.getJSONObject(i); + // Pulling items from the array + Integer id = jmessage.getInt("id"); + message.setId(id); + message.setBody(jmessage.getString("message")); + message.setDateFromString(jmessage.getString("date")); + message.setReadFlag(jmessage.getBoolean("read")); + message.setDirection(jmessage.getString("direction")); + + msgArray.add(0,message); + + } catch (JSONException e) { + Log.e("https-json", e.toString()); + } catch (ParseException e) { + e.printStackTrace(); + Log.e("https-json", "Error parsing date: " + e.toString()); + } + } + } catch (JSONException e) { + Log.e("https-json", e.toString()); + } + try { + JSONObject jpageObject = jObject.getJSONObject("paging"); + if (jpageObject.getString("next") == "null") { + pageNext = 0; + } else { + pageNext = jpageObject.getInt("next"); + } + if (jpageObject.getString("previous") == "null") { + pagePrev = 0; + } else { + pagePrev = jpageObject.getInt("prev"); + } + } catch (JSONException e) { + Log.e("https-json", e.toString()); + } + try { + if (jObject.getString("success").equals("true")) { + success = true; + Log.d("https-json", "successfully got jo"); + } else { + success = false; + } + if (jObject.has("id")) { + if (jObject.getString("id") == "null") { + sentId = -1; + } else { + sentId = jObject.getInt("id"); + } + Log.d("https-json", "has id: "+sentId); + } + } catch (JSONException e) { + Log.e("https-json", e.toString()); + } + } + catch (JSONException e) { //catch object creation + e.printStackTrace(); + Log.e("https-json", "Could not create json object. " + e.toString()); + } + responseObject.setMessages(msgArray); + responseObject.setPageNext(pageNext); + responseObject.setPagePrev(pagePrev); + responseObject.setSuccess(success); + responseObject.setId(sentId); + + return responseObject; + } + + public static ResponseObject makeDummyMessages(Integer count) { + ResponseObject responseObject = new ResponseObject(); + ArrayList msgArray = new ArrayList(); + Random rand = new Random(); + + ChatMessage message = new ChatMessage(); + // Make message + message.setId(100); + message.setBody("Hi, I have a question about praying."); + message.setDate(new Date(System.currentTimeMillis() - 10600000)); + message.setReadFlag(true); + message.setDirection("in"); + msgArray.add(message); + + // Make message + ChatMessage message1 = new ChatMessage(); + message1.setId(101); + message1.setBody("Hello, my name is Matt, thank you for your message. Jesus teaches us how to pray in Matthew 6. " + + "What specifically would you like to know about praying?"); + message1.setDate(new Date(System.currentTimeMillis() - 3500000)); + message1.setReadFlag(true); + message1.setDirection("out"); + msgArray.add(message1); + + // Make message + ChatMessage message2 = new ChatMessage(); + message2.setId(102); + message2.setBody("" + + "If God already knows the future, why do I need to pray for things " + + "if he already knows what's going to happen? Will I change his mind?"); + message2.setDate(new Date(System.currentTimeMillis()-1500000)); + message2.setReadFlag(true); + message2.setDirection("in"); + msgArray.add(message2); + + // Make message + ChatMessage message3 = new ChatMessage(); + message3.setId(102); + message3.setBody("" + + "Thanks for your insightful question. Well, it's true that God has a plan for " + + "each of us and knows what our future holds, but that doesn't mean we shouldn't be " + + "having conversation with him! Prayer is having a conversation with God, and it has much more " + + "purpose than just asking for things to happen, although that is one reason why we pray. In 1 John 5:14-15, God " + + "promises that when we ask for things that are in accordance with his will, he will give us what we ask for. Other reasons " + + "to pray are to ask for guidance on making decisions, to thank and praise God for good things he has done,"); + message3.setDate(new Date(System.currentTimeMillis())); + message3.setReadFlag(true); + message3.setDirection("out"); + msgArray.add(message3); + + Log.d("HttpClientUtil","making dummy messages"); + + responseObject.setMessages(msgArray); + responseObject.setPageNext(1); + responseObject.setPagePrev(0); + responseObject.setSuccess(true); + + return responseObject; + } + + public static class ResponseObject { + ArrayList messages = new ArrayList(); + Integer pageNext = 0; + Integer pagePrev = 0; + Boolean success; + Integer id = -1; + + public void setMessages(ArrayList messages) { + this.messages= messages; + } + public void setPageNext(Integer pageNext) { + this.pageNext = pageNext; + } + public void setPagePrev(Integer pagePrev) { + this.pagePrev = pagePrev; + } + public void setSuccess(Boolean success) { + this.success = success; + } + public void setId(Integer id) {this.id = id;} + public Integer getId() {return this.id;} + + public Boolean isSuccessful() { + return this.success; + } + public Integer getPageNext() { + return this.pageNext; + } + public Integer getPagePrev() { + return this.pagePrev; + } + public ArrayList getMessages() { + return messages; + } + public Integer getMessageCount() { + return this.messages.size(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/entities/ChatCategory.java b/app/src/main/java/com/goodtrendltd/HolySongs/entities/ChatCategory.java new file mode 100644 index 0000000..be8d8b0 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/entities/ChatCategory.java @@ -0,0 +1,24 @@ +package com.goodtrendltd.HolySongs.entities; + +import java.io.Serializable; + +/** + * Created by vincent on 16/3/23. + */ +public class ChatCategory implements Serializable +{ + public String id; + public int status; + public String info; + public String title; + + public int getId() { + int intId = -1; + try { + intId = Integer.parseInt(id); + } catch(NumberFormatException nfe) { + System.out.println("Could not parse " + nfe); + } + return intId; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/entities/ChatThreadScheduler.java b/app/src/main/java/com/goodtrendltd/HolySongs/entities/ChatThreadScheduler.java new file mode 100644 index 0000000..e1fea26 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/entities/ChatThreadScheduler.java @@ -0,0 +1,58 @@ +package com.goodtrendltd.HolySongs.entities; + +import android.util.Log; + + +import com.goodtrendltd.HolySongs.chat.ChatService; + +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * Created by Julia on 2/2/2016. + */ +public class ChatThreadScheduler { + private static ChatThreadScheduler instance; + private static ScheduledThreadPoolExecutor exec = null; + private static Object o = null; + public ChatService.CheckMessages checkMessageTask = new ChatService.CheckMessages(); + public static int LONG_PERIOD = 300; //period to check messages, in seconds. + public static int SHORT_PERIOD = 30; + + private ChatThreadScheduler() { + } + + public static synchronized ChatThreadScheduler getInstance() { + if(instance == null) { + instance = new ChatThreadScheduler(); + } + return instance; + } + + public void scheduleCheckMessages() { + if (exec==null && o == null) { + o = 1; + Log.v("chat-exec", "Scheduled"); + long period = LONG_PERIOD; // the period between successive executions + exec = new ScheduledThreadPoolExecutor(1); + exec.scheduleAtFixedRate(checkMessageTask, 0, period, TimeUnit.SECONDS); + } + else { + Log.v("chat-exec", "exec.getActiveCount() = " + exec.getActiveCount()); + Log.v("chat", "exec.getQueue() = " + exec.getQueue()); + } + } + + public void rescheduleCheckMessages(long periodInSeconds) { + if(exec==null){ + scheduleCheckMessages(); + } + exec.shutdownNow(); + Log.v("chat-exec", "exec.getActiveCount() = " + exec.getActiveCount()); + Log.v("chat-exec", "exec.getQueue() = " + exec.getQueue()); + Log.v("chat-exec", "rescheduled"); + ScheduledThreadPoolExecutor newExec = new ScheduledThreadPoolExecutor(1); + newExec.scheduleAtFixedRate(checkMessageTask, 0, periodInSeconds, TimeUnit.SECONDS); + exec = newExec; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/entities/NavigationCategory.java b/app/src/main/java/com/goodtrendltd/HolySongs/entities/NavigationCategory.java new file mode 100755 index 0000000..378dcfd --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/entities/NavigationCategory.java @@ -0,0 +1,29 @@ +package com.goodtrendltd.HolySongs.entities; + +//导航分类 +public class NavigationCategory +{ + //首页 + public static String Home = "1"; + + //见证 + public static String Witness = "102"; + + //图书馆 + public static String Library = "101"; + + //职场 + public static String WorkPlace = "103"; + + //婚姻 + public static String Marriage = "104"; + + //孩子 + public static String Children = "105"; + + //孩子 + public static String Other = "106"; + + //短文 + public static String Article = "107"; +} \ No newline at end of file diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/helpers/ChineseCharComp.java b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/ChineseCharComp.java new file mode 100644 index 0000000..f52a09a --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/ChineseCharComp.java @@ -0,0 +1,23 @@ +package com.goodtrendltd.HolySongs.helpers; + +import java.text.Collator; +import java.util.Comparator; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-5 + * Time: 下午10:51 + */ +public class ChineseCharComp implements Comparator { + @Override + public int compare(String lhs, String rhs) { + Collator myCollator = Collator.getInstance(java.util.Locale.CHINA); + if (myCollator.compare(lhs, rhs) < 0) + return -1; + else if (myCollator.compare(lhs, rhs) > 0) + return 1; + else + return 0; + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/helpers/CommonMethod.java b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/CommonMethod.java new file mode 100644 index 0000000..c430da8 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/CommonMethod.java @@ -0,0 +1,167 @@ +package com.goodtrendltd.HolySongs.helpers; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.ContentResolver; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Environment; +import android.provider.Settings; +import android.text.ClipboardManager; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by vincent on 15/5/27. + */ +public class CommonMethod { + + public static String defaultBookDirectory() { + return cardDirectory() + "/videobible"; + } + + public static String cardDirectory() { + if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + return Environment.getExternalStorageDirectory().getPath(); + } + + final List dirNames = new LinkedList(); + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader("/proc/self/mounts")); + String line; + while ((line = reader.readLine()) != null) { + final String[] parts = line.split("\\s+"); + if (parts.length >= 4 && + parts[2].toLowerCase().indexOf("fat") >= 0 && + parts[3].indexOf("rw") >= 0) { + final File fsDir = new File(parts[1]); + if (fsDir.isDirectory() && fsDir.canWrite()) { + dirNames.add(fsDir.getPath()); + } + } + } + } + catch (Throwable e) { + + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + + } + } + } + + for (String dir : dirNames) { + if (dir.toLowerCase().indexOf("media") > 0) { + return dir; + } + } + if (dirNames.size() > 0) { + return dirNames.get(0); + } + + return Environment.getExternalStorageDirectory().getPath(); + } + + //获取当前时间 + public static String GetCurrentDate(){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + long time=System.currentTimeMillis(); + String s = sdf.format(new Date(time)); + return s; + } + + + //获取当前时间 + public static String GetCurrentMillisecondDate(){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS"); + long time=System.currentTimeMillis(); + String s = sdf.format(new Date(time)); + return s; + } + + + //短日期格式 + public static String ConvertShortDate(Date date){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String s = sdf.format(date); + return s; + } + + //拷贝功能 + public static void Copy(Context context,String content) { + ClipboardManager cmb = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE); + cmb.setText(content.trim()); + } + + //从毫秒转换成指定时间显示 + public static String GetFormatedDateTime(String pattern, long dateTime) { + SimpleDateFormat sDateFormat = new SimpleDateFormat(pattern); + return sDateFormat.format(new Date(dateTime + 0)); + } + + //从毫秒转换成指定时间显示 + public static String GetFormatedDateTime(String pattern, Date date) { + SimpleDateFormat sDateFormat = new SimpleDateFormat(pattern); + return sDateFormat.format(date); + } + + //检测网络是否可用 + public static boolean isNetworkAvailable(Context con) { + ConnectivityManager cm = (ConnectivityManager) + con.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + // if no network is available networkInfo will be null + // otherwise check if we are connected + if (networkInfo != null && networkInfo.isConnected()) { + return true; + } + return false; + } + + //获取本地语言 + public static String getLocallanguage(Context context){ + return context.getResources().getConfiguration().locale.getLanguage(); + } + + //获取屏幕亮度 + public static int GetScreenBrightness(Activity activity) { + int value = 0; + ContentResolver cr = activity.getContentResolver(); + try { + value = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS); + } catch (Settings.SettingNotFoundException e) { + + } + return value; + } + + /** * 根据手机的分辨率从dp 的单位 转成为px(像素) */ + public static int Dip2px(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + /** * 根据手机的分辨率从px(像素) 的单位 转成为dp */ + public static int Px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/helpers/HanziHelper.java b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/HanziHelper.java new file mode 100644 index 0000000..6055642 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/HanziHelper.java @@ -0,0 +1,47 @@ +package com.goodtrendltd.HolySongs.helpers; + +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-6 + * Time: 上午9:26 + */ +public class HanziHelper { + private static HanyuPinyinOutputFormat format= new HanyuPinyinOutputFormat(); + + static { + format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); + format.setCaseType(HanyuPinyinCaseType.LOWERCASE); + } + + public static String char2Pinyin(char c) { + String[] pinyin = null; + try { + pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format); + } catch(BadHanyuPinyinOutputFormatCombination e) { + e.printStackTrace(); + } + if(pinyin == null) { + return Character.toString(c); + } else { + return pinyin[0]; + } + } + + public static String words2Pinyin(String words) { + StringBuilder sb = new StringBuilder(); + char[] chars = words.toCharArray(); + for(int i = 0, length = chars.length; i < length; i++) { + sb.append(char2Pinyin(chars[i])); + } + return sb.toString(); + } +} diff --git a/app/src/main/java/com/goodtrendltd/HolySongs/helpers/XMLParser.java b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/XMLParser.java new file mode 100644 index 0000000..a0d6e68 --- /dev/null +++ b/app/src/main/java/com/goodtrendltd/HolySongs/helpers/XMLParser.java @@ -0,0 +1,68 @@ +package com.goodtrendltd.HolySongs.helpers; + +import android.util.Log; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.StringReader; + +/** + * Created with IntelliJ IDEA. + * User: LeOn + * Date: 13-10-6 + * Time: 下午6:14 + */ +public class XMLParser { + + public Document getDomElement(String xml){ + Document doc = null; + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + try { + + DocumentBuilder db = dbf.newDocumentBuilder(); + + InputSource is = new InputSource(); + is.setCharacterStream(new StringReader(xml)); + doc = db.parse(is); + + } catch (ParserConfigurationException e) { + Log.e("Error: ", e.getMessage()); + return null; + } catch (SAXException e) { + Log.e("Error: ", e.getMessage()); + return null; + } catch (IOException e) { + Log.e("Error: ", e.getMessage()); + return null; + } + // return DOM + return doc; + } + + public String getValue(Element item, String str) { + NodeList n = item.getElementsByTagName(str); + return this.getElementValue(n.item(0)); + } + + public final String getElementValue( Node elem ) { + Node child; + if( elem != null){ + if (elem.hasChildNodes()){ + for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){ + if( child.getNodeType() == Node.TEXT_NODE ){ + return child.getNodeValue(); + } + } + } + } + return ""; + } +} diff --git a/app/src/main/res/drawable-hdpi/icon.png b/app/src/main/res/drawable-hdpi/icon.png new file mode 100644 index 0000000..c8913ee Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon.png differ diff --git a/app/src/main/res/drawable-hdpi/pic_church.jpeg b/app/src/main/res/drawable-hdpi/pic_church.jpeg new file mode 100644 index 0000000..31fbe90 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/pic_church.jpeg differ diff --git a/app/src/main/res/drawable-hdpi/video_icon.png b/app/src/main/res/drawable-hdpi/video_icon.png new file mode 100644 index 0000000..822d920 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/video_icon.png differ diff --git a/app/src/main/res/drawable-ldpi/icon.png b/app/src/main/res/drawable-ldpi/icon.png new file mode 100644 index 0000000..ef17d2c Binary files /dev/null and b/app/src/main/res/drawable-ldpi/icon.png differ diff --git a/app/src/main/res/drawable-ldpi/pic_church.jpeg b/app/src/main/res/drawable-ldpi/pic_church.jpeg new file mode 100644 index 0000000..27ffdd6 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/pic_church.jpeg differ diff --git a/app/src/main/res/drawable-ldpi/video_icon.png b/app/src/main/res/drawable-ldpi/video_icon.png new file mode 100644 index 0000000..22cb1a6 Binary files /dev/null and b/app/src/main/res/drawable-ldpi/video_icon.png differ diff --git a/app/src/main/res/drawable-mdpi/icon.png b/app/src/main/res/drawable-mdpi/icon.png new file mode 100644 index 0000000..971ee65 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/icon.png differ diff --git a/app/src/main/res/drawable-mdpi/pic_church.jpeg b/app/src/main/res/drawable-mdpi/pic_church.jpeg new file mode 100644 index 0000000..04a85ad Binary files /dev/null and b/app/src/main/res/drawable-mdpi/pic_church.jpeg differ diff --git a/app/src/main/res/drawable-mdpi/video_icon.png b/app/src/main/res/drawable-mdpi/video_icon.png new file mode 100644 index 0000000..57b987f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/video_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/default_video_poster.png b/app/src/main/res/drawable-xhdpi/default_video_poster.png new file mode 100644 index 0000000..f457f23 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/default_video_poster.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon.png b/app/src/main/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000..e5bded2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/pic_church.jpeg b/app/src/main/res/drawable-xhdpi/pic_church.jpeg new file mode 100644 index 0000000..12d35a2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/pic_church.jpeg differ diff --git a/app/src/main/res/drawable-xhdpi/video_icon.png b/app/src/main/res/drawable-xhdpi/video_icon.png new file mode 100644 index 0000000..457b170 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/video_icon.png differ diff --git a/app/src/main/res/drawable-xxhdpi/pic_church.jpeg b/app/src/main/res/drawable-xxhdpi/pic_church.jpeg new file mode 100644 index 0000000..12d35a2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/pic_church.jpeg differ diff --git a/app/src/main/res/drawable-xxhdpi/style_button_fillet_green.xml b/app/src/main/res/drawable-xxhdpi/style_button_fillet_green.xml new file mode 100644 index 0000000..62afb23 --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/style_button_fillet_green.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/pic_church.jpeg b/app/src/main/res/drawable-xxxhdpi/pic_church.jpeg new file mode 100644 index 0000000..1e39f4e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/pic_church.jpeg differ diff --git a/app/src/main/res/drawable/button_background_green.xml b/app/src/main/res/drawable/button_background_green.xml new file mode 100644 index 0000000..a9aeff6 --- /dev/null +++ b/app/src/main/res/drawable/button_background_green.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home_church.xml b/app/src/main/res/drawable/ic_home_church.xml new file mode 100644 index 0000000..5fb51c1 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_church.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_video_library.xml b/app/src/main/res/drawable/ic_video_library.xml new file mode 100644 index 0000000..677eea8 --- /dev/null +++ b/app/src/main/res/drawable/ic_video_library.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_error.xml b/app/src/main/res/drawable/ic_warning_error.xml new file mode 100644 index 0000000..2c10c4d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_error.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/incoming_message.9.png b/app/src/main/res/drawable/incoming_message.9.png new file mode 100644 index 0000000..2d8b603 Binary files /dev/null and b/app/src/main/res/drawable/incoming_message.9.png differ diff --git a/app/src/main/res/drawable/incoming_message_bg.9.png b/app/src/main/res/drawable/incoming_message_bg.9.png new file mode 100644 index 0000000..4b8a7a0 Binary files /dev/null and b/app/src/main/res/drawable/incoming_message_bg.9.png differ diff --git a/app/src/main/res/drawable/outgoing_message_bg.9.png b/app/src/main/res/drawable/outgoing_message_bg.9.png new file mode 100644 index 0000000..08c6f09 Binary files /dev/null and b/app/src/main/res/drawable/outgoing_message_bg.9.png differ diff --git a/app/src/main/res/drawable/outgoing_message_green.9.png b/app/src/main/res/drawable/outgoing_message_green.9.png new file mode 100644 index 0000000..7666aa1 Binary files /dev/null and b/app/src/main/res/drawable/outgoing_message_green.9.png differ diff --git a/app/src/main/res/drawable/pic_chat.jpeg b/app/src/main/res/drawable/pic_chat.jpeg new file mode 100644 index 0000000..b8d4c93 Binary files /dev/null and b/app/src/main/res/drawable/pic_chat.jpeg differ diff --git a/app/src/main/res/layout/activity_bible_init_knowgod.xml b/app/src/main/res/layout/activity_bible_init_knowgod.xml new file mode 100644 index 0000000..e2a8021 --- /dev/null +++ b/app/src/main/res/layout/activity_bible_init_knowgod.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml new file mode 100644 index 0000000..a3b9af2 --- /dev/null +++ b/app/src/main/res/layout/activity_chat.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + +