[Feature][R306BR][task-view-1592][voice] add call white and call black

Change-Id: Iac7e2571543525ce4a616f81e720cf521e06c83d
diff --git a/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_interface.h b/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_interface.h
index eae3e01..f2d53b7 100755
--- a/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_interface.h
+++ b/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_interface.h
@@ -405,6 +405,22 @@
 #define GOFORM_ADD_CALLBACK_NUMBERS "ADD_CALLBACK_NUMBERS"
 #define GOFORM_DELETE_CALLBACK_NUMBERS "DELETE_CALLBACK_NUMBERS"
 #define GOFORM_CLEAR_CALLBACK_NUMBERS "CLEAR_CALLBACK_NUMBERS"
+#define GOFORM_GET_CALLING_WHITE_NUMBERS "GET_CALLING_WHITE_NUMBERS"
+#define GOFORM_ADD_CALLING_WHITE_NUMBERS "ADD_CALLING_WHITE_NUMBERS"
+#define GOFORM_DELETE_CALLING_WHITE_NUMBERS "DELETE_CALLING_WHITE_NUMBERS"
+#define GOFORM_CLEAR_CALLING_WHITE_NUMBERS "CLEAR_CALLING_WHITE_NUMBERS"
+#define GOFORM_GET_CALLED_WHITE_NUMBERS "GET_CALLED_WHITE_NUMBERS"
+#define GOFORM_ADD_CALLED_WHITE_NUMBERS "ADD_CALLED_WHITE_NUMBERS"
+#define GOFORM_DELETE_CALLED_WHITE_NUMBERS "DELETE_CALLED_WHITE_NUMBERS"
+#define GOFORM_CLEAR_CALLED_WHITE_NUMBERS "CLEAR_CALLED_WHITE_NUMBERS"
+#define GOFORM_GET_CALLING_BLACK_NUMBERS "GET_CALLING_BLACK_NUMBERS"
+#define GOFORM_ADD_CALLING_BLACK_NUMBERS "ADD_CALLING_BLACK_NUMBERS"
+#define GOFORM_DELETE_CALLING_BLACK_NUMBERS "DELETE_CALLING_BLACK_NUMBERS"
+#define GOFORM_CLEAR_CALLING_BLACK_NUMBERS "CLEAR_CALLING_BLACK_NUMBERS"
+#define GOFORM_GET_CALLED_BLACK_NUMBERS "GET_CALLED_BLACK_NUMBERS"
+#define GOFORM_ADD_CALLED_BLACK_NUMBERS "ADD_CALLED_BLACK_NUMBERS"
+#define GOFORM_DELETE_CALLED_BLACK_NUMBERS "DELETE_CALLED_BLACK_NUMBERS"
+#define GOFORM_CLEAR_CALLED_BLACK_NUMBERS "CLEAR_CALLED_BLACK_NUMBERS"
 
 /****************************All the web pages' URL************************************/
 #define ZTE_WEB_PAGE_LOGIN_NAME   			"index.html"
@@ -1122,7 +1138,23 @@
 extern void zte_goform_clear_callback_numbers(webs_t wp);
 extern void zte_goform_voice_call_hide_setting(webs_t wp);
 extern void zte_goform_voice_white_list_setting(webs_t wp);
+extern void zte_goform_get_calling_white_numbers(webs_t wp);
+extern void zte_goform_add_calling_white_numbers(webs_t wp);
+extern void zte_goform_delete_calling_white_numbers(webs_t wp);
+extern void zte_goform_clear_calling_white_numbers(webs_t wp);
+extern void zte_goform_get_called_white_numbers(webs_t wp);
+extern void zte_goform_add_called_white_numbers(webs_t wp);
+extern void zte_goform_delete_called_white_numbers(webs_t wp);
+extern void zte_goform_clear_called_white_numbers(webs_t wp);
 extern void zte_goform_voice_black_list_setting(webs_t wp);
+extern void zte_goform_get_calling_black_numbers(webs_t wp);
+extern void zte_goform_add_calling_black_numbers(webs_t wp);
+extern void zte_goform_delete_calling_black_numbers(webs_t wp);
+extern void zte_goform_clear_calling_black_numbers(webs_t wp);
+extern void zte_goform_get_called_black_numbers(webs_t wp);
+extern void zte_goform_add_called_black_numbers(webs_t wp);
+extern void zte_goform_delete_called_black_numbers(webs_t wp);
+extern void zte_goform_clear_called_black_numbers(webs_t wp);
 extern void zte_goform_voice_call_forward_all_setting(webs_t wp);
 extern void zte_goform_voice_call_forward_no_answer_setting(webs_t wp);
 extern void zte_goform_voice_call_forward_out_reach_setting(webs_t wp);
diff --git a/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_util.c b/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_util.c
index 0514ba8..390e1be 100755
--- a/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_util.c
+++ b/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_util.c
@@ -129,6 +129,10 @@
 	{CMD_HTTPSHARE_AUTH_GET, zte_httpShare_auth_get},
 	{GOFORM_NETWORK_INFO, zte_goform_get_network_info},
 	{GOFORM_GET_CALLBACK_NUMBERS, zte_goform_get_callback_numbers},
+	{GOFORM_GET_CALLING_WHITE_NUMBERS, zte_goform_get_calling_white_numbers},
+	{GOFORM_GET_CALLED_WHITE_NUMBERS, zte_goform_get_called_white_numbers},
+	{GOFORM_GET_CALLING_BLACK_NUMBERS, zte_goform_get_calling_black_numbers},
+	{GOFORM_GET_CALLED_BLACK_NUMBERS, zte_goform_get_called_black_numbers},
 };
 
 
@@ -290,6 +294,18 @@
 	{GOFORM_ADD_CALLBACK_NUMBERS, zte_goform_add_callback_numbers},
 	{GOFORM_DELETE_CALLBACK_NUMBERS, zte_goform_delete_callback_numbers},
 	{GOFORM_CLEAR_CALLBACK_NUMBERS, zte_goform_clear_callback_numbers},
+	{GOFORM_ADD_CALLING_WHITE_NUMBERS, zte_goform_add_calling_white_numbers},
+	{GOFORM_DELETE_CALLING_WHITE_NUMBERS, zte_goform_delete_calling_white_numbers},
+	{GOFORM_CLEAR_CALLING_WHITE_NUMBERS, zte_goform_clear_calling_white_numbers},
+	{GOFORM_ADD_CALLED_WHITE_NUMBERS, zte_goform_add_called_white_numbers},
+	{GOFORM_DELETE_CALLED_WHITE_NUMBERS, zte_goform_delete_called_white_numbers},
+	{GOFORM_CLEAR_CALLED_WHITE_NUMBERS, zte_goform_clear_called_white_numbers},
+	{GOFORM_ADD_CALLING_BLACK_NUMBERS, zte_goform_add_calling_black_numbers},
+	{GOFORM_DELETE_CALLING_BLACK_NUMBERS, zte_goform_delete_calling_black_numbers},
+	{GOFORM_CLEAR_CALLING_BLACK_NUMBERS, zte_goform_clear_calling_black_numbers},
+	{GOFORM_ADD_CALLED_BLACK_NUMBERS, zte_goform_add_called_black_numbers},
+	{GOFORM_DELETE_CALLED_BLACK_NUMBERS, zte_goform_delete_called_black_numbers},
+	{GOFORM_CLEAR_CALLED_BLACK_NUMBERS, zte_goform_clear_called_black_numbers},
 };
 
 /*******************************************************************************
diff --git a/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_voice.c b/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_voice.c
index eac6582..46b89f3 100755
--- a/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_voice.c
+++ b/lynq/R306BR/ap/app/goahead/interface5.0/zte_web_voice.c
@@ -1,5 +1,67 @@
 #include "zte_web_interface.h"

 

+static int append_phone_number(const char *phone_number, char* filename)

+{

+    FILE *file = fopen(filename, "a");

+

+    if (file == NULL)

+    {

+        perror("Failed to open file");

+        return 0;

+    }

+

+    fprintf(file, "%s\n", phone_number);

+    fclose(file);

+    return 1;

+}

+

+static int delete_data_by_index(int index, char* filename)

+{

+    FILE *inputFile = fopen(filename, "r");

+    if (inputFile == NULL)

+	{

+        return 0;

+    }

+

+    FILE *tempFile = fopen("/cache/temp", "w");

+    if (tempFile == NULL)

+	{

+        return 0;

+    }

+

+    char line[100];

+    int currentLine = 1;

+    while (fgets(line, sizeof(line), inputFile) != NULL)

+	{

+        if (currentLine != index)

+		{

+            fputs(line, tempFile);

+        }

+        currentLine++;

+    }

+

+    fclose(inputFile);

+    fclose(tempFile);

+

+    remove(filename);

+    rename("/cache/temp", filename);

+

+    return 1;

+}

+

+static int clear_file(char* filename)

+{

+    FILE *file = fopen(filename, "w");

+

+    if (file == NULL)

+	{

+        return 0;

+    }

+

+    fclose(file);

+    return 1;

+}

+

 void zte_goform_voice_dial_time_setting(webs_t wp)

 {

     char *dial_times = NULL;

@@ -119,68 +181,6 @@
     return;

 }

 

-static int append_phone_number(const char *phone_number)

-{

-    FILE *file = fopen("/cache/call_back_list", "a");

-

-    if (file == NULL)

-    {

-        perror("Failed to open file");

-        return 0;

-    }

-

-    fprintf(file, "%s\n", phone_number);

-    fclose(file);

-    return 1;

-}

-

-static int delete_data_by_index(int index)

-{

-    FILE *inputFile = fopen("/cache/call_back_list", "r");

-    if (inputFile == NULL)

-	{

-        return 0;

-    }

-

-    FILE *tempFile = fopen("/cache/temp", "w");

-    if (tempFile == NULL)

-	{

-        return 0;

-    }

-

-    char line[100];

-    int currentLine = 1;

-    while (fgets(line, sizeof(line), inputFile) != NULL)

-	{

-        if (currentLine != index)

-		{

-            fputs(line, tempFile);

-        }

-        currentLine++;

-    }

-

-    fclose(inputFile);

-    fclose(tempFile);

-

-    remove("/cache/call_back_list");

-    rename("/cache/temp", "/cache/call_back_list");

-

-    return 1;

-}

-

-static int clear_file()

-{

-    FILE *file = fopen("/cache/call_back_list", "w");

-

-    if (file == NULL)

-	{

-        return 0;

-    }

-

-    fclose(file);

-    return 1;

-}

-

 void zte_goform_get_callback_numbers(webs_t wp)

 {

     char line[20] = {0};

@@ -227,7 +227,7 @@
 

     add_number = websGetVar(wp, T("addNumber"), T(""));

     printf("add_number = %s\n", add_number);

-    ret = append_phone_number(add_number);

+    ret = append_phone_number(add_number, "/cache/call_back_list");

 

     if(ret)

     {

@@ -250,7 +250,7 @@
     delete_index = websGetVar(wp, T("deleteIndex"), T(""));

     index = atoi(delete_index);

 

-    ret = delete_data_by_index(index);

+    ret = delete_data_by_index(index, "/cache/call_back_list");

 

     if(ret)

     {

@@ -268,7 +268,7 @@
 {

     int ret = 0;

 

-    ret = clear_file();

+    ret = clear_file("/cache/call_back_list");

 

     if(ret)

     {

@@ -314,28 +314,212 @@
     cfg_set("calling_white_enable", calling_white_enable);

     cfg_set("called_white_enable", called_white_enable);

 

-    if(0 == strcmp(calling_white_enable, "1"))

-    {

-

-    }

-    else

-    {

-        

-    }

-

-    if(0 == strcmp(called_white_enable, "1"))

-    {

-

-    }

-    else

-    {

-        

-    }

-

     zte_write_result_to_web(wp, SUCCESS);

     return;

 }

 

+void zte_goform_get_calling_white_numbers(webs_t wp)

+{

+    char line[20] = {0};

+    FILE *file;

+    int first_line = 1;

+

+    web_feedback_header(wp);

+

+    file = fopen("/cache/calling_white_list", "r");

+    if (!file) {

+        slog(MISC_PRINT, SLOG_ERR, "Failed to open calling_white_list\n");

+        (void)websWrite(wp, "{\"calling_white_list\":[]}");

+        return;

+    }

+

+    (void)websWrite(wp, "{\"calling_white_list\":[");

+    char *end = "]}";

+

+    while (fgets(line, sizeof(line), file)) {

+        size_t len = strlen(line);

+

+        if (len > 0 && line[len - 1] == '\n') {

+            line[len - 1] = '\0';

+        }

+

+        if (first_line) {

+            (void)websWrite(wp, "\"%s\"", line);

+            first_line = 0;

+        } else {

+            (void)websWrite(wp, ",\"%s\"", line);

+        }

+    }

+

+    (void)websWrite(wp, end);

+    fclose(file);

+

+    return;

+}

+

+void zte_goform_add_calling_white_numbers(webs_t wp)

+{

+    char* add_number = NULL;

+    int ret = 0;

+

+    add_number = websGetVar(wp, T("addNumber"), T(""));

+    printf("add_number = %s\n", add_number);

+    ret = append_phone_number(add_number, "/cache/calling_white_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_delete_calling_white_numbers(webs_t wp)

+{

+    char* delete_index = NULL;

+    int index = 0;

+    int ret = 0;

+

+    delete_index = websGetVar(wp, T("deleteIndex"), T(""));

+    index = atoi(delete_index);

+

+    ret = delete_data_by_index(index, "/cache/calling_white_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_clear_calling_white_numbers(webs_t wp)

+{

+    int ret = 0;

+

+    ret = clear_file("/cache/calling_white_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_get_called_white_numbers(webs_t wp)

+{

+    char line[20] = {0};

+    FILE *file;

+    int first_line = 1;

+

+    web_feedback_header(wp);

+

+    file = fopen("/cache/called_white_list", "r");

+    if (!file) {

+        slog(MISC_PRINT, SLOG_ERR, "Failed to open called_white_list\n");

+        (void)websWrite(wp, "{\"called_white_list\":[]}");

+        return;

+    }

+

+    (void)websWrite(wp, "{\"called_white_list\":[");

+    char *end = "]}";

+

+    while (fgets(line, sizeof(line), file)) {

+        size_t len = strlen(line);

+

+        if (len > 0 && line[len - 1] == '\n') {

+            line[len - 1] = '\0';

+        }

+

+        if (first_line) {

+            (void)websWrite(wp, "\"%s\"", line);

+            first_line = 0;

+        } else {

+            (void)websWrite(wp, ",\"%s\"", line);

+        }

+    }

+

+    (void)websWrite(wp, end);

+    fclose(file);

+

+    return;

+}

+

+void zte_goform_add_called_white_numbers(webs_t wp)

+{

+    char* add_number = NULL;

+    int ret = 0;

+

+    add_number = websGetVar(wp, T("addNumber"), T(""));

+    printf("add_number = %s\n", add_number);

+    ret = append_phone_number(add_number, "/cache/called_white_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_delete_called_white_numbers(webs_t wp)

+{

+    char* delete_index = NULL;

+    int index = 0;

+    int ret = 0;

+

+    delete_index = websGetVar(wp, T("deleteIndex"), T(""));

+    index = atoi(delete_index);

+

+    ret = delete_data_by_index(index, "/cache/called_white_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_clear_called_white_numbers(webs_t wp)

+{

+    int ret = 0;

+

+    ret = clear_file("/cache/called_white_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

 void zte_goform_voice_black_list_setting(webs_t wp)

 {

     char* calling_black_enable = NULL;

@@ -347,28 +531,212 @@
     cfg_set("calling_black_enable", calling_black_enable);

     cfg_set("called_black_enable", called_black_enable);

 

-    if(0 == strcmp(calling_black_enable, "1"))

-    {

-

-    }

-    else

-    {

-        

-    }

-

-    if(0 == strcmp(called_black_enable, "1"))

-    {

-

-    }

-    else

-    {

-        

-    }

-

     zte_write_result_to_web(wp, SUCCESS);

     return;

 }

 

+void zte_goform_get_calling_black_numbers(webs_t wp)

+{

+    char line[20] = {0};

+    FILE *file;

+    int first_line = 1;

+

+    web_feedback_header(wp);

+

+    file = fopen("/cache/calling_black_list", "r");

+    if (!file) {

+        slog(MISC_PRINT, SLOG_ERR, "Failed to open calling_black_list\n");

+        (void)websWrite(wp, "{\"calling_black_list\":[]}");

+        return;

+    }

+

+    (void)websWrite(wp, "{\"calling_black_list\":[");

+    char *end = "]}";

+

+    while (fgets(line, sizeof(line), file)) {

+        size_t len = strlen(line);

+

+        if (len > 0 && line[len - 1] == '\n') {

+            line[len - 1] = '\0';

+        }

+

+        if (first_line) {

+            (void)websWrite(wp, "\"%s\"", line);

+            first_line = 0;

+        } else {

+            (void)websWrite(wp, ",\"%s\"", line);

+        }

+    }

+

+    (void)websWrite(wp, end);

+    fclose(file);

+

+    return;

+}

+

+void zte_goform_add_calling_black_numbers(webs_t wp)

+{

+    char* add_number = NULL;

+    int ret = 0;

+

+    add_number = websGetVar(wp, T("addNumber"), T(""));

+    printf("add_number = %s\n", add_number);

+    ret = append_phone_number(add_number, "/cache/calling_black_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_delete_calling_black_numbers(webs_t wp)

+{

+    char* delete_index = NULL;

+    int index = 0;

+    int ret = 0;

+

+    delete_index = websGetVar(wp, T("deleteIndex"), T(""));

+    index = atoi(delete_index);

+

+    ret = delete_data_by_index(index, "/cache/calling_black_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_clear_calling_black_numbers(webs_t wp)

+{

+    int ret = 0;

+

+    ret = clear_file("/cache/calling_black_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_get_called_black_numbers(webs_t wp)

+{

+    char line[20] = {0};

+    FILE *file;

+    int first_line = 1;

+

+    web_feedback_header(wp);

+

+    file = fopen("/cache/called_black_list", "r");

+    if (!file) {

+        slog(MISC_PRINT, SLOG_ERR, "Failed to open called_black_list\n");

+        (void)websWrite(wp, "{\"called_black_list\":[]}");

+        return;

+    }

+

+    (void)websWrite(wp, "{\"called_black_list\":[");

+    char *end = "]}";

+

+    while (fgets(line, sizeof(line), file)) {

+        size_t len = strlen(line);

+

+        if (len > 0 && line[len - 1] == '\n') {

+            line[len - 1] = '\0';

+        }

+

+        if (first_line) {

+            (void)websWrite(wp, "\"%s\"", line);

+            first_line = 0;

+        } else {

+            (void)websWrite(wp, ",\"%s\"", line);

+        }

+    }

+

+    (void)websWrite(wp, end);

+    fclose(file);

+

+    return;

+}

+

+void zte_goform_add_called_black_numbers(webs_t wp)

+{

+    char* add_number = NULL;

+    int ret = 0;

+

+    add_number = websGetVar(wp, T("addNumber"), T(""));

+    printf("add_number = %s\n", add_number);

+    ret = append_phone_number(add_number, "/cache/called_black_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_delete_called_black_numbers(webs_t wp)

+{

+    char* delete_index = NULL;

+    int index = 0;

+    int ret = 0;

+

+    delete_index = websGetVar(wp, T("deleteIndex"), T(""));

+    index = atoi(delete_index);

+

+    ret = delete_data_by_index(index, "/cache/called_black_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

+void zte_goform_clear_called_black_numbers(webs_t wp)

+{

+    int ret = 0;

+

+    ret = clear_file("/cache/called_black_list");

+

+    if(ret)

+    {

+        zte_write_result_to_web(wp, SUCCESS);

+    }

+    else

+    {

+        zte_write_result_to_web(wp, FAILURE);

+    }

+

+    return;

+}

+

 void zte_goform_voice_call_forward_all_setting(webs_t wp)

 {

     char* call_forward_all_number = NULL;

diff --git a/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c b/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c
index be66ef3..71fb5d5 100755
--- a/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c
+++ b/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c
@@ -1023,6 +1023,85 @@
 	return;

 }

 

+static int check_phone_number_in_file(const char* phoneNumber, const char* filename)

+{

+    FILE* file = fopen(filename, "r");

+    if (file == NULL) {

+        return 0;

+    }

+

+    char buffer[20];

+    while (fgets(buffer, sizeof(buffer), file) != NULL) {

+        

+        char* newline = strchr(buffer, '\n');

+        if (newline) {

+            *newline = '\0';

+        }

+        

+        if (strcmp(buffer, phoneNumber) == 0) {

+            fclose(file);

+            return 1;

+        }

+    }

+    

+    fclose(file);

+    return 0;

+}

+

+static void at_dsci_call_white_proc(at_str)

+{

+	char calling_white_enable[4] = {0};

+	char called_white_enable[4] = {0};

+	char phone_number[20] = {0};

+

+	cfg_get_item("calling_white_enable", calling_white_enable, sizeof(calling_white_enable));

+	cfg_get_item("called_white_enable", called_white_enable, sizeof(called_white_enable));

+	extract_phone_number(at_str, phone_number, sizeof(phone_number));

+

+	if(0 == strcmp(calling_white_enable, "1") && strstr(at_str, ",0,2,0,0,"))

+	{

+		if(check_phone_number_in_file(phone_number, "/cache/calling_white_list") == 0)

+		{

+			ipc_send_message(MODULE_ID_CALL_CTRL_LOCAL, MODULE_ID_AT_CTL, MSG_CMD_CHUP_REQ, 0, NULL, 0);

+		}

+	}

+

+	if(0 == strcmp(called_white_enable, "1") && strstr(at_str, ",1,4,0,0,"))

+	{

+		if(check_phone_number_in_file(phone_number, "/cache/called_white_list") == 0)

+		{

+			ipc_send_message(MODULE_ID_CALL_CTRL_LOCAL, MODULE_ID_AT_CTL, MSG_CMD_CHUP_REQ, 0, NULL, 0);

+		}

+	}

+}

+

+static void at_dsci_call_balck_proc(char *at_str)

+{

+	char calling_black_enable[4] = {0};

+	char called_black_enable[4] = {0};

+	char phone_number[20] = {0};

+

+	cfg_get_item("calling_black_enable", calling_black_enable, sizeof(calling_black_enable));

+	cfg_get_item("called_black_enable", called_black_enable, sizeof(called_black_enable));

+	extract_phone_number(at_str, phone_number, sizeof(phone_number));

+

+	if(0 == strcmp(calling_black_enable, "1") && strstr(at_str, ",0,2,0,0,"))

+	{

+		if(check_phone_number_in_file(phone_number, "/cache/calling_black_list") == 1)

+		{

+			ipc_send_message(MODULE_ID_CALL_CTRL_LOCAL, MODULE_ID_AT_CTL, MSG_CMD_CHUP_REQ, 0, NULL, 0);

+		}

+	}

+

+	if(0 == strcmp(called_black_enable, "1") && strstr(at_str, ",1,4,0,0,"))

+	{

+		if(check_phone_number_in_file(phone_number, "/cache/called_black_list") == 1)

+		{

+			ipc_send_message(MODULE_ID_CALL_CTRL_LOCAL, MODULE_ID_AT_CTL, MSG_CMD_CHUP_REQ, 0, NULL, 0);

+		}

+	}

+}

+

 static void at_dsci_inform_proc(char* at_str)

 {

 	at_print(AT_ERR,"at_dsci_inform_proc at_str = %s\n", at_str);

@@ -1035,6 +1114,8 @@
 	if(strstr(at_str, ",0,2,0,0,") || strstr(at_str, ",1,4,0,0,"))

 	{

 		at_dsci_call_block_proc(at_str);

+		at_dsci_call_white_proc(at_str);

+		at_dsci_call_balck_proc(at_str);

 	}

 

 	return;

diff --git a/lynq/R306BR/ap/app/zte_comm/zte_mainctrl/zte_mainctrl.c b/lynq/R306BR/ap/app/zte_comm/zte_mainctrl/zte_mainctrl.c
index ed83c32..ae36e3c 100755
--- a/lynq/R306BR/ap/app/zte_comm/zte_mainctrl/zte_mainctrl.c
+++ b/lynq/R306BR/ap/app/zte_comm/zte_mainctrl/zte_mainctrl.c
@@ -947,6 +947,11 @@
 
 	slog(NET_PRINT, SLOG_NORMAL, "reset_msg_process start!!!\n");
 
+	system("rm -rf /cache/call_back_list");
+	system("rm -rf /cache/calling_white_list");
+	system("rm -rf /cache/called_white_list");
+	system("rm -rf /cache/calling_black_list");
+	system("rm -rf /cache/called_black_list");
 	//fotaÉý¼¶Ê±²»ÔÊÐí×ö»Ö¸´³ö³§ÉèÖÃ
 	cfg_get_item("fota_update_flag", fota_update_flag, sizeof(fota_update_flag));
 	if (atoi(fota_update_flag) == 1) {
diff --git a/lynq/R306BR/ap/app/zte_webui/i18n/Messages_en.properties b/lynq/R306BR/ap/app/zte_webui/i18n/Messages_en.properties
index d7650d0..4903111 100755
--- a/lynq/R306BR/ap/app/zte_webui/i18n/Messages_en.properties
+++ b/lynq/R306BR/ap/app/zte_webui/i18n/Messages_en.properties
@@ -1810,3 +1810,7 @@
 remove_number = Are you sure to remove this number?

 number_exists = This number already exists.

 max_numbers_reached = Exceeding the maximum number limit.

+add_calling_white_number_list = Add Number to Whitelist of Outgoing Calls

+calling_white_number_list = Whitelist of Outgoing Calls

+add_called_white_number_list = Add Number to Whitelist of Received Calls

+called_white_number_list = Whitelist of Received Calls

diff --git a/lynq/R306BR/ap/app/zte_webui/i18n/Messages_zh-cn.properties b/lynq/R306BR/ap/app/zte_webui/i18n/Messages_zh-cn.properties
index e2b715a..7648441 100755
--- a/lynq/R306BR/ap/app/zte_webui/i18n/Messages_zh-cn.properties
+++ b/lynq/R306BR/ap/app/zte_webui/i18n/Messages_zh-cn.properties
@@ -1813,4 +1813,8 @@
 add_callback_number_list = 添加回拨号码

 remove_number = 确定要删除所选号码吗?

 number_exists = 该号码已存在!

-max_numbers_reached = 超过最大号码限制!
\ No newline at end of file
+max_numbers_reached = 超过最大号码限制!

+add_calling_white_number_list = 添加主叫白名单号码

+calling_white_number_list = 主叫白名单号码列表

+add_called_white_number_list = 添加被叫白名单号码

+called_white_number_list = 被叫白名单号码列表

diff --git a/lynq/R306BR/ap/app/zte_webui/js/com.js b/lynq/R306BR/ap/app/zte_webui/js/com.js
index 60106b1..3c4ecc9 100755
--- a/lynq/R306BR/ap/app/zte_webui/js/com.js
+++ b/lynq/R306BR/ap/app/zte_webui/js/com.js
@@ -5943,6 +5943,270 @@
         }

     }

 

+    function getCallingWhiteNumbersInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "GET_CALLING_WHITE_NUMBERS"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var callingList = paramD.calling_white_list || [];

+            return {

+                callingList: callingList

+            };

+        }

+    }

+

+    function addCallingWhiteNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_CALLING_WHITE_NUMBERS";

+            valueReq.addNumber = values.addNumber;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function deleteCallingWhiteNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DELETE_CALLING_WHITE_NUMBERS";

+            valueReq.deleteIndex = values.deleteIndex;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function clearCallingWhiteNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CLEAR_CALLING_WHITE_NUMBERS";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function getCalledWhiteNumbersInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "GET_CALLED_WHITE_NUMBERS"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var calledList = paramD.called_white_list || [];

+            return {

+                calledList: calledList

+            };

+        }

+    }

+

+    function addCalledWhiteNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_CALLED_WHITE_NUMBERS";

+            valueReq.addNumber = values.addNumber;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function deleteCalledWhiteNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DELETE_CALLED_WHITE_NUMBERS";

+            valueReq.deleteIndex = values.deleteIndex;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function clearCalledWhiteNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CLEAR_CALLED_WHITE_NUMBERS";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function getCallingBlackNumbersInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "GET_CALLING_BLACK_NUMBERS"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var callingList = paramD.calling_black_list || [];

+            return {

+                callingList: callingList

+            };

+        }

+    }

+

+    function addCallingBlackNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_CALLING_BLACK_NUMBERS";

+            valueReq.addNumber = values.addNumber;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function deleteCallingBlackNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DELETE_CALLING_BLACK_NUMBERS";

+            valueReq.deleteIndex = values.deleteIndex;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function clearCallingBlackNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CLEAR_CALLING_BLACK_NUMBERS";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function getCalledBlackNumbersInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "GET_CALLED_BLACK_NUMBERS"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var calledList = paramD.called_black_list || [];

+            return {

+                calledList: calledList

+            };

+        }

+    }

+

+    function addCalledBlackNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_CALLED_BLACK_NUMBERS";

+            valueReq.addNumber = values.addNumber;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function deleteCalledBlackNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DELETE_CALLED_BLACK_NUMBERS";

+            valueReq.deleteIndex = values.deleteIndex;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function clearCalledBlackNumbers() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CLEAR_CALLED_BLACK_NUMBERS";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

     function reqSync(values, isPost) {

         return reqAJAX(values, null, null, false, isPost);

     }

@@ -6258,6 +6522,22 @@
         addCallbackNumbers: addCallbackNumbers,

         deleteCallbackNumbers: deleteCallbackNumbers,

         clearCallbackNumbers: clearCallbackNumbers,

+        getCallingWhiteNumbersInfo: getCallingWhiteNumbersInfo,

+        addCallingWhiteNumbers: addCallingWhiteNumbers,

+        deleteCallingWhiteNumbers: deleteCallingWhiteNumbers,

+        clearCallingWhiteNumbers: clearCallingWhiteNumbers,

+        getCalledWhiteNumbersInfo: getCalledWhiteNumbersInfo,

+        addCalledWhiteNumbers: addCalledWhiteNumbers,

+        deleteCalledWhiteNumbers: deleteCalledWhiteNumbers,

+        clearCalledWhiteNumbers: clearCalledWhiteNumbers,

+        getCallingBlackNumbersInfo: getCallingBlackNumbersInfo,

+        addCallingBlackNumbers: addCallingBlackNumbers,

+        deleteCallingBlackNumbers: deleteCallingBlackNumbers,

+        clearCallingBlackNumbers: clearCallingBlackNumbers,

+        getCalledBlackNumbersInfo: getCalledBlackNumbersInfo,

+        addCalledBlackNumbers: addCalledBlackNumbers,

+        deleteCalledBlackNumbers: deleteCalledBlackNumbers,

+        clearCalledBlackNumbers: clearCalledBlackNumbers,

     };

 });

 

diff --git a/lynq/R306BR/ap/app/zte_webui/js/voice.js b/lynq/R306BR/ap/app/zte_webui/js/voice.js
index 0ddbca2..fc72157 100755
--- a/lynq/R306BR/ap/app/zte_webui/js/voice.js
+++ b/lynq/R306BR/ap/app/zte_webui/js/voice.js
@@ -229,17 +229,6 @@
             target.callbackNumbers = ko.observableArray([]);

             getCallbackNumbers();

 

-            function getCallbackNumbers() {

-                service.getCallbackNumbersInfo({}, function (data) {

-                    var numbers = data.callbackList || [];

-                    numbers = numbers.map(function (number) {

-                        return number.trim();

-                    });

-                    target.callbackNumbers(numbers);

-                    console.log("Successfully loaded callback numbers:", numbers);

-                });

-            }

-

             target.callBackSet = function () {

                 showLoading();

                 var params = {};

@@ -257,6 +246,17 @@
                 });

             };

 

+            function getCallbackNumbers() {

+                service.getCallbackNumbersInfo({}, function (data) {

+                    var numbers = data.callbackList || [];

+                    numbers = numbers.map(function (number) {

+                        return number.trim();

+                    });

+                    target.callbackNumbers(numbers);

+                    console.log("Successfully loaded callback numbers:", numbers);

+                });

+            }

+

             target.addNumber = function() {

                 var newNumber = $("#newPhoneNumber").val().trim();

                 if (newNumber) {

@@ -377,6 +377,10 @@
 

             target.callingWhiteSetting = ko.observable(callWhiteInfo.callingWhiteSetting);

             target.calledWhiteSetting = ko.observable(callWhiteInfo.calledWhiteSetting);

+            target.callingWhiteNumbers = ko.observableArray([]);

+            target.calledWhiteNumbers = ko.observableArray([]);

+            getCallingWhiteNumbers();

+            getCalledWhiteNumbers();

 

             target.callWhiteSet = function () {

                 showLoading();

@@ -391,6 +395,156 @@
                     }

                 });

             };

+

+            function getCallingWhiteNumbers() {

+                service.getCallingWhiteNumbersInfo({}, function (data) {

+                    var numbers = data.callingList || [];

+                    numbers = numbers.map(function (number) {

+                        return number.trim();

+                    });

+                    target.callingWhiteNumbers(numbers);

+                    console.log("Successfully loaded calling white numbers:", numbers);

+                });

+            }

+

+            target.addCallingNumber = function() {

+                var newNumber = $("#newCallingNumber").val().trim();

+                if (newNumber) {

+                    var numberExists = false;

+                    for (var i = 0; i < target.callingWhiteNumbers().length; i++) {

+                        if (target.callingWhiteNumbers()[i] === newNumber) {

+                            numberExists = true;

+                            break;

+                        }

+                    }

+                    if (numberExists) {

+                        showAlert("number_exists");

+                        return;

+                    }

+

+                    if (target.callingWhiteNumbers().length >= 25) {

+                        showAlert("max_numbers_reached");

+                        return;

+                    }

+

+                    showLoading();

+                    var params = {};

+                    params.addNumber = newNumber;

+                    service.addCallingWhiteNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCallingWhiteNumbers();

+                            successOverlay();

+                        }

+                    });

+                }

+            };

+

+            target.removeCallingNumber = function(index) {

+                showConfirm("remove_number", function () {

+                    showLoading();

+                    var params = {};

+                    params.deleteIndex = index + 1;

+                    service.deleteCallingWhiteNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCallingWhiteNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

+

+            target.clearCallingNumbers = function() {

+                showConfirm("clear_numbers", function () {

+                    showLoading();

+                    service.clearCallingWhiteNumbers({}, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCallingWhiteNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

+

+            function getCalledWhiteNumbers() {

+                service.getCalledWhiteNumbersInfo({}, function (data) {

+                    var numbers = data.calledList || [];

+                    numbers = numbers.map(function (number) {

+                        return number.trim();

+                    });

+                    target.calledWhiteNumbers(numbers);

+                    console.log("Successfully loaded called white numbers:", numbers);

+                });

+            }

+

+            target.addCalledNumber = function() {

+                var newNumber = $("#newCalledNumber").val().trim();

+                if (newNumber) {

+                    var numberExists = false;

+                    for (var i = 0; i < target.calledWhiteNumbers().length; i++) {

+                        if (target.calledWhiteNumbers()[i] === newNumber) {

+                            numberExists = true;

+                            break;

+                        }

+                    }

+                    if (numberExists) {

+                        showAlert("number_exists");

+                        return;

+                    }

+

+                    if (target.calledWhiteNumbers().length >= 25) {

+                        showAlert("max_numbers_reached");

+                        return;

+                    }

+

+                    showLoading();

+                    var params = {};

+                    params.addNumber = newNumber;

+                    service.addCalledWhiteNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCalledWhiteNumbers();

+                            successOverlay();

+                        }

+                    });

+                }

+            };

+

+            target.removeCalledNumber = function(index) {

+                showConfirm("remove_number", function () {

+                    showLoading();

+                    var params = {};

+                    params.deleteIndex = index + 1;

+                    service.deleteCalledWhiteNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCalledWhiteNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

+

+            target.clearCalledNumbers = function() {

+                showConfirm("clear_numbers", function () {

+                    showLoading();

+                    service.clearCalledWhiteNumbers({}, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCalledWhiteNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

         }

 

         function initialize() {

@@ -414,6 +568,10 @@
 

             target.callingBlackSetting = ko.observable(callBlackInfo.callingBlackSetting);

             target.calledBlackSetting = ko.observable(callBlackInfo.calledBlackSetting);

+            target.callingBlackNumbers = ko.observableArray([]);

+            target.calledBlackNumbers = ko.observableArray([]);

+            getCallingBlackNumbers();

+            getCalledBlackNumbers();

 

             target.callBlackSet = function () {

                 showLoading();

@@ -428,6 +586,156 @@
                     }

                 });

             };

+

+            function getCallingBlackNumbers() {

+                service.getCallingBlackNumbersInfo({}, function (data) {

+                    var numbers = data.callingList || [];

+                    numbers = numbers.map(function (number) {

+                        return number.trim();

+                    });

+                    target.callingBlackNumbers(numbers);

+                    console.log("Successfully loaded calling white numbers:", numbers);

+                });

+            }

+

+            target.addCallingNumber = function() {

+                var newNumber = $("#newCallingNumber").val().trim();

+                if (newNumber) {

+                    var numberExists = false;

+                    for (var i = 0; i < target.callingBlackNumbers().length; i++) {

+                        if (target.callingBlackNumbers()[i] === newNumber) {

+                            numberExists = true;

+                            break;

+                        }

+                    }

+                    if (numberExists) {

+                        showAlert("number_exists");

+                        return;

+                    }

+

+                    if (target.callingBlackNumbers().length >= 25) {

+                        showAlert("max_numbers_reached");

+                        return;

+                    }

+

+                    showLoading();

+                    var params = {};

+                    params.addNumber = newNumber;

+                    service.addCallingBlackNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCallingBlackNumbers();

+                            successOverlay();

+                        }

+                    });

+                }

+            };

+

+            target.removeCallingNumber = function(index) {

+                showConfirm("remove_number", function () {

+                    showLoading();

+                    var params = {};

+                    params.deleteIndex = index + 1;

+                    service.deleteCallingBlackNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCallingBlackNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

+

+            target.clearCallingNumbers = function() {

+                showConfirm("clear_numbers", function () {

+                    showLoading();

+                    service.clearCallingBlackNumbers({}, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCallingBlackNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

+

+            function getCalledBlackNumbers() {

+                service.getCalledBlackNumbersInfo({}, function (data) {

+                    var numbers = data.calledList || [];

+                    numbers = numbers.map(function (number) {

+                        return number.trim();

+                    });

+                    target.calledBlackNumbers(numbers);

+                    console.log("Successfully loaded called white numbers:", numbers);

+                });

+            }

+

+            target.addCalledNumber = function() {

+                var newNumber = $("#newCalledNumber").val().trim();

+                if (newNumber) {

+                    var numberExists = false;

+                    for (var i = 0; i < target.calledBlackNumbers().length; i++) {

+                        if (target.calledBlackNumbers()[i] === newNumber) {

+                            numberExists = true;

+                            break;

+                        }

+                    }

+                    if (numberExists) {

+                        showAlert("number_exists");

+                        return;

+                    }

+

+                    if (target.calledBlackNumbers().length >= 25) {

+                        showAlert("max_numbers_reached");

+                        return;

+                    }

+

+                    showLoading();

+                    var params = {};

+                    params.addNumber = newNumber;

+                    service.addCalledBlackNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCalledBlackNumbers();

+                            successOverlay();

+                        }

+                    });

+                }

+            };

+

+            target.removeCalledNumber = function(index) {

+                showConfirm("remove_number", function () {

+                    showLoading();

+                    var params = {};

+                    params.deleteIndex = index + 1;

+                    service.deleteCalledBlackNumbers(params, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCalledBlackNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

+

+            target.clearCalledNumbers = function() {

+                showConfirm("clear_numbers", function () {

+                    showLoading();

+                    service.clearCalledBlackNumbers({}, function (result) {

+                        if (result.result != "success") {

+                            errorOverlay();

+                        } else {

+                            getCalledBlackNumbers();

+                            successOverlay();

+                        }

+                    });

+                });

+            };

         }

 

         function initialize() {

diff --git a/lynq/R306BR/ap/app/zte_webui/subpg/voice_blacklist.html b/lynq/R306BR/ap/app/zte_webui/subpg/voice_blacklist.html
index f7bc4a4..05d66a0 100755
--- a/lynq/R306BR/ap/app/zte_webui/subpg/voice_blacklist.html
+++ b/lynq/R306BR/ap/app/zte_webui/subpg/voice_blacklist.html
@@ -71,6 +71,83 @@
                     <div class="form-buttons">

                         <input data-bind="click:callBlackSet" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

                     </div>

+

+                    <h3 data-bind='visible: callingBlackSetting() == "1"' data-trans="add_calling_black_number_list" class="form-title"></h3>

+

+                    <div class="row form-group" data-bind='visible: callingBlackSetting() == "1"'>

+                        <label data-trans='add_number' for="newCallingNumber" class="col-xs-4 side-right"></label>

+                        <div class="col-xs-4">

+                            <input type="text" id="newCallingNumber" name = "newCallingNumber" class="required form-control">

+                        </div>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: callingBlackSetting() == "1"'>

+                        <input data-bind="click:addCallingNumber" data-trans="add" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+                    </div>

+

+                    <h3 data-bind='visible: callingBlackSetting() == "1"' data-trans="calling_black_number_list" class="form-title"></h3>

+

+                    <div data-bind='visible: callingBlackSetting() == "1"' class="callback-number-container" style="max-height: 160px; overflow-y: auto;">

+                        <table class="callback-numbers-table">

+                            <thead>

+                                <tr>

+                                    <th data-trans='station_number' style="width: 150px;"></th>

+                                    <th data-trans='phone_number' style="width: 300px;"></th>

+                                    <th data-trans='pc_action' style="width: 100px;"></th>

+                                </tr>

+                            </thead>

+                            <tbody data-bind="foreach: callingBlackNumbers">

+                                <tr>

+                                    <td data-bind="text: $index() + 1"></td>

+                                    <td><span data-bind="text: $data" class="phone-display"></span></td>

+                                    <td><button data-bind="click: function() { $parent.removeCallingNumber($index()) }">Delete</button></td>

+                                </tr>

+                            </tbody>

+                        </table>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: callingBlackSetting() == "1"'>

+                        <input data-bind="click:clearCallingNumbers" data-trans="clear" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>   

+                    </div>

+

+                    <h3 data-bind='visible: calledBlackSetting() == "1"' data-trans="add_called_black_number_list" class="form-title"></h3>

+

+                    <div class="row form-group" data-bind='visible: calledBlackSetting() == "1"'>

+                        <label data-trans='add_number' for="newCalledNumber" class="col-xs-4 side-right"></label>

+                        <div class="col-xs-4">

+                            <input type="text" id="newCalledNumber" name = "newCalledNumber" class="required form-control">

+                        </div>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: calledBlackSetting() == "1"'>

+                        <input data-bind="click:addCalledNumber" data-trans="add" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+                    </div>

+

+                    <h3 data-bind='visible: calledBlackSetting() == "1"' data-trans="called_black_number_list" class="form-title"></h3>

+

+                    <div data-bind='visible: calledBlackSetting() == "1"' class="callback-number-container" style="max-height: 160px; overflow-y: auto;">

+                        <table class="callback-numbers-table">

+                            <thead>

+                                <tr>

+                                    <th data-trans='station_number' style="width: 150px;"></th>

+                                    <th data-trans='phone_number' style="width: 300px;"></th>

+                                    <th data-trans='pc_action' style="width: 100px;"></th>

+                                </tr>

+                            </thead>

+                            <tbody data-bind="foreach: calledBlackNumbers">

+                                <tr>

+                                    <td data-bind="text: $index() + 1"></td>

+                                    <td><span data-bind="text: $data" class="phone-display"></span></td>

+                                    <td><button data-bind="click: function() { $parent.removeCalledNumber($index()) }">Delete</button></td>

+                                </tr>

+                            </tbody>

+                        </table>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: calledBlackSetting() == "1"'>

+                        <input data-bind="click:clearCalledNumbers" data-trans="clear" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>   

+                    </div>

+

                 </div>

             </form>

         </div>

diff --git a/lynq/R306BR/ap/app/zte_webui/subpg/voice_whitelist.html b/lynq/R306BR/ap/app/zte_webui/subpg/voice_whitelist.html
index d7f8420..bd7d469 100755
--- a/lynq/R306BR/ap/app/zte_webui/subpg/voice_whitelist.html
+++ b/lynq/R306BR/ap/app/zte_webui/subpg/voice_whitelist.html
@@ -71,6 +71,83 @@
                     <div class="form-buttons">

                         <input data-bind="click:callWhiteSet" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

                     </div>

+

+                    <h3 data-bind='visible: callingWhiteSetting() == "1"' data-trans="add_calling_white_number_list" class="form-title"></h3>

+

+                    <div class="row form-group" data-bind='visible: callingWhiteSetting() == "1"'>

+                        <label data-trans='add_number' for="newCallingNumber" class="col-xs-4 side-right"></label>

+                        <div class="col-xs-4">

+                            <input type="text" id="newCallingNumber" name = "newCallingNumber" class="required form-control">

+                        </div>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: callingWhiteSetting() == "1"'>

+                        <input data-bind="click:addCallingNumber" data-trans="add" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+                    </div>

+

+                    <h3 data-bind='visible: callingWhiteSetting() == "1"' data-trans="calling_white_number_list" class="form-title"></h3>

+

+                    <div data-bind='visible: callingWhiteSetting() == "1"' class="callback-number-container" style="max-height: 160px; overflow-y: auto;">

+                        <table class="callback-numbers-table">

+                            <thead>

+                                <tr>

+                                    <th data-trans='station_number' style="width: 150px;"></th>

+                                    <th data-trans='phone_number' style="width: 300px;"></th>

+                                    <th data-trans='pc_action' style="width: 100px;"></th>

+                                </tr>

+                            </thead>

+                            <tbody data-bind="foreach: callingWhiteNumbers">

+                                <tr>

+                                    <td data-bind="text: $index() + 1"></td>

+                                    <td><span data-bind="text: $data" class="phone-display"></span></td>

+                                    <td><button data-bind="click: function() { $parent.removeCallingNumber($index()) }">Delete</button></td>

+                                </tr>

+                            </tbody>

+                        </table>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: callingWhiteSetting() == "1"'>

+                        <input data-bind="click:clearCallingNumbers" data-trans="clear" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>   

+                    </div>

+

+                    <h3 data-bind='visible: calledWhiteSetting() == "1"' data-trans="add_called_white_number_list" class="form-title"></h3>

+

+                    <div class="row form-group" data-bind='visible: calledWhiteSetting() == "1"'>

+                        <label data-trans='add_number' for="newCalledNumber" class="col-xs-4 side-right"></label>

+                        <div class="col-xs-4">

+                            <input type="text" id="newCalledNumber" name = "newCalledNumber" class="required form-control">

+                        </div>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: calledWhiteSetting() == "1"'>

+                        <input data-bind="click:addCalledNumber" data-trans="add" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+                    </div>

+

+                    <h3 data-bind='visible: calledWhiteSetting() == "1"' data-trans="called_white_number_list" class="form-title"></h3>

+

+                    <div data-bind='visible: calledWhiteSetting() == "1"' class="callback-number-container" style="max-height: 160px; overflow-y: auto;">

+                        <table class="callback-numbers-table">

+                            <thead>

+                                <tr>

+                                    <th data-trans='station_number' style="width: 150px;"></th>

+                                    <th data-trans='phone_number' style="width: 300px;"></th>

+                                    <th data-trans='pc_action' style="width: 100px;"></th>

+                                </tr>

+                            </thead>

+                            <tbody data-bind="foreach: calledWhiteNumbers">

+                                <tr>

+                                    <td data-bind="text: $index() + 1"></td>

+                                    <td><span data-bind="text: $data" class="phone-display"></span></td>

+                                    <td><button data-bind="click: function() { $parent.removeCalledNumber($index()) }">Delete</button></td>

+                                </tr>

+                            </tbody>

+                        </table>

+                    </div>

+

+                    <div class="form-buttons" data-bind='visible: calledWhiteSetting() == "1"'>

+                        <input data-bind="click:clearCalledNumbers" data-trans="clear" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>   

+                    </div>

+

                 </div>

             </form>

         </div>