Secret mode improvements 23/86323/5
authorMaciej Skrzypkowski <m.skrzypkows@samsung.com>
Fri, 2 Sep 2016 14:35:16 +0000 (16:35 +0200)
committerDariusz Frankiewicz <d.frankiewic@samsung.com>
Tue, 6 Sep 2016 12:46:06 +0000 (05:46 -0700)
[Issue]    http://suprem.sec.samsung.net/jira/browse/TWF-1897
[Problem]  No "3.2.1 Secret mode initial view", no "3.2.4 Create
           password view", no support for passwords in database.
[Solution] Added secret mode initial view, create password view
           and database support.
[Verify]   Enable Secret mode, check if every view is working
           correctly and if database remembers what option was
           chosen.

Change-Id: I828a26891fad42d7205863dd9f5590d68c630085

12 files changed:
core/AbstractInterfaces/AbstractUIComponent.h
services/SimpleUI/SimpleUI.cpp
services/SimpleUI/SimpleUI.h
services/StorageService/SettingsStorage.cpp
services/StorageService/SettingsStorage.h
services/TabUI/CMakeLists.txt
services/TabUI/PasswordUI.cpp [new file with mode: 0644]
services/TabUI/PasswordUI.h [new file with mode: 0644]
services/TabUI/TabUI.cpp
services/TabUI/TabUI.h
services/TabUI/edc/PasswordUI.edc [new file with mode: 0644]
services/WebEngineService/WebEngineService.cpp

index 95469cffb696e32e8046093baa6c9091ca552ed6..dfe961cc0e4b4a987800b46325362d89236c9544 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef __ABSTRACT_UI_COMPONENT_H__
 #define __ABSTRACT_UI_COMPONENT_H__ 1
 
+#include <boost/signals2/signal.hpp>
+
 namespace tizen_browser
 {
 namespace interfaces
@@ -52,6 +54,11 @@ public:
  *        Deletes genlists and gengrids (due to elm_genlist_clear and elm_gengrid_clear isue)
  */
     virtual void hideUI() = 0;
+
+/**
+ * @brief Signal which has to be connected to view manager pop from stack function.
+ */
+    boost::signals2::signal<void ()> closeUI;
 };
 
 }//namespace interfaces
index 6f475d68e69bea62f57ae31777b3ac367bc10006..f35689ddb62bd2b55d65ab6eb4edadef34ca8aaa 100755 (executable)
@@ -349,6 +349,14 @@ void SimpleUI::connectUISignals()
     m_tabUI->changeEngineState.connect(boost::bind(&basic_webengine::AbstractWebEngine::changeState, m_webEngine.get()));
     m_tabUI->changeEngineState.connect(boost::bind(&SimpleUI::changeEngineState, this));
     m_tabUI->refetchTabUIData.connect(boost::bind(&SimpleUI::refetchTabUIData, this));
+    m_tabUI->checkIfParamExistsInDB.connect(boost::bind(&storage::SettingsStorage::isDBParamPresent, &m_storageService->getSettingsStorage(), _1));
+    m_tabUI->setDBBoolParamValue.connect(boost::bind(&storage::SettingsStorage::setSettingsBool, &m_storageService->getSettingsStorage(), _1, _2));
+    m_tabUI->setDBStringParamValue.connect(boost::bind(&storage::SettingsStorage::setSettingsString, &m_storageService->getSettingsStorage(), _1, _2));
+    m_tabUI->getDBBoolParamValue.connect(boost::bind(&storage::SettingsStorage::getSettingsBool, &m_storageService->getSettingsStorage(), _1, false));
+    m_tabUI->getDBStringParamValue.connect(boost::bind(&storage::SettingsStorage::getSettingsText, &m_storageService->getSettingsStorage(), _1, ""));
+    m_tabUI->showPasswordUI.connect(boost::bind(&SimpleUI::showPasswordUI, this));
+    m_tabUI->getPasswordUI().closeUI.connect(boost::bind(&SimpleUI::closeTopView, this));
+    m_tabUI->getPasswordUI().setDBStringParamValue.connect(boost::bind(&storage::SettingsStorage::setSettingsString, &m_storageService->getSettingsStorage(), _1, _2));
 
     M_ASSERT(m_historyUI.get());
     m_historyUI->clearHistoryClicked.connect(boost::bind(&SimpleUI::onClearHistoryAllClicked, this));
@@ -1300,7 +1308,6 @@ void SimpleUI::closeTabUI()
 }
 
 void SimpleUI::refetchTabUIData() {
-    m_tabUI->setState(m_webEngine->getState());
     std::vector<basic_webengine::TabContentPtr> tabsContents =
             m_webEngine->getTabContents();
     m_tabService->fillThumbs(tabsContents);
@@ -1818,6 +1825,18 @@ void SimpleUI::searchWebPage(std::string &text, int flags)
     m_webEngine->searchOnWebsite(text, flags);
 }
 
+void SimpleUI::showPasswordUI()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    m_viewManager.pushViewToStack(&(m_tabUI->getPasswordUI()));
+}
+
+void SimpleUI::closeTopView()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    m_viewManager.popTheStack();
+}
+
 void SimpleUI::addBookmark(BookmarkUpdate bookmark_update)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 9c037b585ba55b8062226dc1027bc5f611ee7b20..fa165e3de69910cafe26888f1ef92ea07963ed85 100644 (file)
@@ -317,6 +317,8 @@ private:
     void onBackPressed();
 
     void searchWebPage(std::string &text, int flags);
+    void showPasswordUI();
+    void closeTopView();
 
     std::string edjePath(const std::string &);
 
index e438581a99a958a00d89d6af70f16d0ff6166af9..9b44311271b527d54e14b31f0fe625d9ff5885f2 100644 (file)
@@ -194,17 +194,21 @@ void SettingsStorage::setParamString(basic_webengine::WebEngineSettings param, s
     setSettingsString(paramName,value);
 }
 
-bool SettingsStorage::isParamPresent(basic_webengine::WebEngineSettings param) const
+bool SettingsStorage::isDBParamPresent(const std::string& key) const
 {
-    const std::string& paramName = basic_webengine::PARAMS_NAMES.at(param);
     auto con = storage::DriverManager::getDatabase(DB_SETTINGS);
-
     storage::SQLQuery select(con->prepare(SQL_CHECK_IF_PARAM_EXISTS));
-    select.bindText(1, paramName);
+    select.bindText(1, key);
     select.exec();
     return select.hasNext();
 }
 
+bool SettingsStorage::isParamPresent(basic_webengine::WebEngineSettings param) const
+{
+    const std::string& paramName = basic_webengine::PARAMS_NAMES.at(param);
+    return isDBParamPresent(paramName);
+}
+
 bool SettingsStorage::getParamVal(basic_webengine::WebEngineSettings param) const
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -276,6 +280,16 @@ const std::string SettingsStorage::getSettingsText(const std::string & key, cons
     return defaultValue;
 }
 
+bool SettingsStorage::getSettingsBool(const std::string & key, const bool defaultValue) const
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    int value = getSettingsInt(key, -1);
+    if (value < 0)
+        return defaultValue;
+    else
+        return static_cast<bool>(value);
+}
+
 /**
  * @throws StorageException on error
  */
@@ -336,5 +350,14 @@ void SettingsStorage::setSettingsString(const std::string & key, std::string val
     setSettingsValue(key, field);
 }
 
+/**
+ * @throws StorageException on error
+ */
+void SettingsStorage::setSettingsBool(const std::string & key, bool value) const
+{
+    BROWSER_LOGD("[%s:%d:%d] ", __PRETTY_FUNCTION__, __LINE__, value);
+    setSettingsInt(key, static_cast<int>(value));
+}
+
 }
 }
index 64627980377399baeaa76a70d0c11f13366bd7ce..ea5df09834dd9ee37ca500479713ed078ac0c5aa 100644 (file)
@@ -36,8 +36,8 @@ public:
     void resetSettings();
     void setParam(basic_webengine::WebEngineSettings param, bool value) const;
     void setParamString(basic_webengine::WebEngineSettings param, std::string value) const;
-    bool isParamPresent(basic_webengine::WebEngineSettings param) const;
     bool getParamVal(basic_webengine::WebEngineSettings param) const;
+    bool isDBParamPresent(const std::string& key) const;
     /**
      * @throws StorageException on error
      */
@@ -57,6 +57,11 @@ public:
      */
     const std::string getSettingsText(const std::string & key, const std::string & defaultValue) const;
 
+    /**
+     * @throws StorageException on error
+     */
+    bool getSettingsBool(const std::string & key, const bool defaultValue) const;
+
     /**
      * @throws StorageException on error
      */
@@ -72,6 +77,11 @@ public:
      */
     void setSettingsString(const std::string & key, std::string value) const;
 
+    /**
+     * @throws StorageException on error
+     */
+    void setSettingsBool(const std::string & key, bool value) const;
+
     void init(bool testmode = false);
 
     void initWebEngineSettingsFromDB();
@@ -87,6 +97,8 @@ private:
      */
     void setSettingsValue(const std::string & key, storage::FieldPtr field) const;
 
+    bool isParamPresent(basic_webengine::WebEngineSettings param) const;
+
     bool m_dbSettingsInitialised;
     std::string DB_SETTINGS;
 
index c751789e9b1b89699781ae3149aaa23801b7d583..492a53f3a3f61ff2f98aa5e260b3286f085ff18b 100644 (file)
@@ -2,6 +2,7 @@ project(TabUI)
 
 set(TabUI_SRCS
     TabUI.cpp
+    PasswordUI.cpp
     )
 
 include(Coreheaders)
@@ -25,6 +26,7 @@ include(EDCCompile)
 if (${PROFILE} MATCHES "mobile")    # mobile profile
     set(edcFiles
         TabUI_mob.edc
+        PasswordUI.edc
         )
 else (${PROFILE} MATCHES "mobile")  # tv profile
     set(edcFiles
diff --git a/services/TabUI/PasswordUI.cpp b/services/TabUI/PasswordUI.cpp
new file mode 100644 (file)
index 0000000..015156f
--- /dev/null
@@ -0,0 +1,133 @@
+#include "BrowserAssert.h"
+#include "PasswordUI.h"
+#include "BrowserLogger.h"
+
+namespace tizen_browser{
+namespace base_ui{
+
+const std::string PasswordUI::PASSWORD_FIELD = "secret_password";
+
+PasswordUI::PasswordUI()
+    : m_parent(nullptr)
+    , m_content(nullptr)
+    , m_entry(nullptr)
+    , m_checkbox(nullptr)
+{
+    m_edjFilePath = EDJE_DIR;
+    m_edjFilePath.append("TabUI/PasswordUI.edj");
+}
+
+PasswordUI::~PasswordUI()
+{
+}
+
+void PasswordUI::showUI()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    M_ASSERT(m_naviframe->getLayout());
+    m_naviframe->show();
+}
+
+void PasswordUI::hideUI()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    M_ASSERT(m_naviframe->getLayout());
+    m_naviframe->hide();
+}
+
+void PasswordUI::init(Evas_Object* parent)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    M_ASSERT(parent);
+    m_parent = parent;
+}
+
+Evas_Object* PasswordUI::getContent()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    M_ASSERT(m_parent);
+    if (!m_naviframe)
+        createLayout();
+    return m_naviframe->getLayout();
+}
+
+void PasswordUI::createLayout()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    M_ASSERT(m_parent);
+    elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
+
+    m_naviframe = std::make_unique<NaviframeWrapper>(m_parent);
+
+    m_content = elm_layout_add(m_naviframe->getLayout());
+    evas_object_size_hint_weight_set(m_content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(m_content, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    evas_object_show(m_content);
+    elm_layout_file_set(m_content, m_edjFilePath.c_str(), "main_layout");
+
+    elm_layout_text_set(m_content, "instruction", "Your password must contain at "
+        "least 6 characters, including at least one letter.");
+
+    m_entry = elm_entry_add(m_content);
+    elm_entry_password_set(m_entry, EINA_TRUE);
+    evas_object_show(m_entry);
+    elm_layout_content_set(m_content, "password_field", m_entry);
+
+    m_checkbox = elm_check_add(m_content);
+    elm_check_state_set(m_checkbox, EINA_FALSE);
+    evas_object_smart_callback_add(m_checkbox, "changed", _show_password_state_changed, this);
+    evas_object_show(m_checkbox);
+    elm_layout_content_set(m_content, "show_password", m_checkbox);
+    elm_layout_text_set(m_content, "chb_label", "Show password");
+
+    m_naviframe->setContent(m_content);
+    m_naviframe->setTitle("Create password");
+    m_naviframe->addPrevButton(_close_clicked, this);
+    m_naviframe->setPrevButtonVisible(true);
+
+
+    m_naviframe->setVisibleBottomBar(true);
+    m_naviframe->addButtonToBottomBar("Cancel", _left_button_clicked, this);
+    m_naviframe->setEnableButtonInBottomBar(0, true);
+    m_naviframe->addButtonToBottomBar("Save", _right_button_clicked, this);
+    m_naviframe->setEnableButtonInBottomBar(1, true);
+
+
+}
+
+void PasswordUI::_close_clicked(void* data, Evas_Object*, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    auto self = static_cast<PasswordUI*>(data);
+    self->closeUI();
+}
+
+void PasswordUI::_right_button_clicked(void* data, Evas_Object*, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    auto self = static_cast<PasswordUI*>(data);
+    std::string hash = std::to_string(
+        static_cast<int>(
+            std::hash<std::string>()(std::string(elm_object_text_get(self->m_entry)))
+        )
+    );
+    self->setDBStringParamValue(PASSWORD_FIELD, hash);
+
+    // TODO: set PASSWORD_DECISION_MADE flag to true
+}
+
+void PasswordUI::_left_button_clicked(void* data, Evas_Object*, void*)
+{
+    auto self = static_cast<PasswordUI*>(data);
+    elm_entry_entry_set(self->m_entry, "");
+    self->closeUI();
+}
+
+void PasswordUI::_show_password_state_changed(void* data, Evas_Object*, void*)
+{
+    auto self = static_cast<PasswordUI*>(data);
+    elm_entry_password_set(self->m_entry, !elm_check_state_get(self->m_checkbox));
+}
+
+}
+}
\ No newline at end of file
diff --git a/services/TabUI/PasswordUI.h b/services/TabUI/PasswordUI.h
new file mode 100644 (file)
index 0000000..eed77b9
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef PASWORDUI_H
+#define PASWORDUI_H
+
+#include <Evas.h>
+#include <memory>
+#include "AbstractInterfaces/AbstractUIComponent.h"
+#include "NaviframeWrapper.h"
+
+namespace tizen_browser {
+namespace base_ui {
+
+class PasswordUI : public interfaces::AbstractUIComponent
+{
+public:
+    PasswordUI();
+    virtual ~PasswordUI();
+
+    void init(Evas_Object* parent) override;
+    Evas_Object* getContent() override;
+    void showUI() override;
+    void hideUI() override;
+
+    void createLayout();
+    boost::signals2::signal<void (std::string, std::string)> setDBStringParamValue;
+
+    static const std::string PASSWORD_FIELD;
+
+private:
+
+    static void _close_clicked(void *data, Evas_Object *obj, void *event_info);
+    static void _right_button_clicked(void * data, Evas_Object * obj, void * event_info);
+    static void _left_button_clicked(void * data, Evas_Object * obj, void * event_info);
+    static void _show_password_state_changed(void* data, Evas_Object*, void*);
+
+    Evas_Object* m_parent;
+    Evas_Object* m_content;
+    Evas_Object* m_entry;
+    Evas_Object* m_checkbox;
+    std::unique_ptr<NaviframeWrapper> m_naviframe;
+    std::string m_edjFilePath;
+};
+
+}
+}
+
+#endif // PASWORDUI_H
index 6439086b52b4f9c15261b528a9ae3abb7433bfc8..701ab65472f608207b86a9c88bf81bba47a76349 100644 (file)
@@ -31,6 +31,8 @@ namespace base_ui{
 
 EXPORT_SERVICE(TabUI, "org.tizen.browser.tabui")
 
+const std::string TabUI::PASSWORD_DECISION_MADE = "password_decision";
+
 TabUI::TabUI()
     : m_parent(nullptr)
     , m_content(nullptr)
@@ -39,6 +41,7 @@ TabUI::TabUI()
     , m_itemToShow(nullptr)
     , m_last_pressed_gengrid_item(nullptr)
     , m_item_class(nullptr)
+    , m_state(State::NORMAL)
 {
     m_edjFilePath = EDJE_DIR;
     m_edjFilePath.append("TabUI/TabUI.edj");
@@ -76,6 +79,12 @@ void TabUI::hideUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(m_naviframe->getLayout());
+    if (m_state == State::PASSWORD_DECISION) {
+        m_state = State::NORMAL;
+        createEmptyLayout();
+        setStateButtons();
+        updateNoTabsText();
+    }
     elm_gengrid_clear(m_gengrid);
     m_naviframe->hide();
 }
@@ -85,6 +94,16 @@ void TabUI::init(Evas_Object* parent)
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(parent);
     m_parent = parent;
+    auto paramExists = checkIfParamExistsInDB(PASSWORD_DECISION_MADE);
+    if (paramExists) {
+        if (!*paramExists) {
+            setDBBoolParamValue(PASSWORD_DECISION_MADE, false);
+        }
+    } else {
+        BROWSER_LOGE("[%s:%d] unknow checkIfParamExistsInDB value!", __PRETTY_FUNCTION__, __LINE__);
+    }
+
+    m_passwordUI.init(parent);
 }
 
 Evas_Object* TabUI::getContent()
@@ -136,10 +155,10 @@ void TabUI::createBottomContent()
     m_naviframe->createBottomBar(layout);
     m_naviframe->setVisibleBottomBar(true);
     //TODO: Missing translation
-    m_naviframe->addButtonToBottomBar("Enable Secret", _enable_secret_clicked, this);
+    m_naviframe->addButtonToBottomBar("Enable Secret", _left_button_clicked, this);
     m_naviframe->setEnableButtonInBottomBar(0, true);
     //TODO: _("IDS_BR_OPT_NEW_TAB") when it works
-    m_naviframe->addButtonToBottomBar("New tab", _new_tab_clicked, this);
+    m_naviframe->addButtonToBottomBar("New tab", _right_button_clicked, this);
     m_naviframe->setEnableButtonInBottomBar(1, true);
 }
 
@@ -153,10 +172,18 @@ void TabUI::createEmptyLayout()
     evas_object_size_hint_align_set(m_empty_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
     //TODO: Add translations
-    elm_object_translatable_part_text_set(m_empty_layout, "elm.text", "No tabs");
+    if (m_state != State::PASSWORD_DECISION)
+        elm_object_translatable_part_text_set(m_empty_layout, "elm.text", "No tabs");
     //TODO: _("IDS_BR_BODY_AFTER_YOU_VIEW_WEBPAGES_THEY_WILL_BE_SHOWN_HERE") when it works
-    elm_object_translatable_part_text_set(m_empty_layout, "elm.help.text",
-        "After you view webpages, they will be shown here.");
+    if (m_state == State::SECRET || m_state == State::PASSWORD_DECISION)
+        elm_object_translatable_part_text_set(m_empty_layout, "elm.help.text",
+            "Any webpages viewed while Secret mode is enabled will not appear "
+            "in your browser or search history while Secret mode is "
+            "disabled. Any bookmarks and webpages saved while Secretmode "
+            "is enabled will not be shown while it is disabled.");
+    else
+        elm_object_translatable_part_text_set(m_empty_layout, "elm.help.text",
+            "After you view webpages, they will be shown here.");
 
     elm_layout_signal_emit(m_empty_layout, "text,disabled", "");
     elm_layout_signal_emit(m_empty_layout, "align.center", "elm");
@@ -235,20 +262,6 @@ void TabUI::showContextMenu()
     }
 }
 
-void TabUI::setState(basic_webengine::State state)
-{
-    switch(state) {
-        case basic_webengine::State::NORMAL:
-            m_naviframe->setBottomButtonText(0, "Enable Secret");
-            break;
-        case basic_webengine::State::SECRET:
-            m_naviframe->setBottomButtonText(0, "Disable Secret");
-            break;
-        default:
-            BROWSER_LOGE("[%s:%d] Unknown state!", __PRETTY_FUNCTION__, __LINE__);
-    }
-}
-
 void TabUI::_cm_sync_clicked(void* data, Evas_Object*, void* )
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -308,24 +321,77 @@ Evas_Event_Flags TabUI::_gesture_occured(void * data, void * event_info)
     return flag;
 }
 
-void TabUI::_new_tab_clicked(void * data, Evas_Object*, void*)
+void TabUI::_right_button_clicked(void * data, Evas_Object*, void*)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (data) {
-        TabUI* tabUI = static_cast<TabUI*>(data);
-        tabUI->newTabClicked();
+        auto self = static_cast<TabUI*>(data);
+        switch (self->m_state) {
+        case State::NORMAL:
+            self->newTabClicked();
+            break;
+        case State::SECRET:
+            self->newTabClicked();
+            break;
+        case State::PASSWORD_DECISION:
+            self->showPasswordUI();
+            break;
+        default:
+            BROWSER_LOGW("[%s] Unknown state!", __PRETTY_FUNCTION__);
+        }
     } else {
         BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
     }
 }
 
-void TabUI::_enable_secret_clicked(void* data, Evas_Object*, void*)
+void TabUI::_left_button_clicked(void* data, Evas_Object*, void*)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (data) {
         auto self = static_cast<TabUI*>(data);
-        self->changeEngineState();
-        self->refetchTabUIData();
+
+        switch (self->m_state) {
+        case State::NORMAL: {
+            auto decisionMade = self->getDBBoolParamValue(PASSWORD_DECISION_MADE);
+            if (decisionMade) {
+                if(*decisionMade) {
+                    //TODO check password
+                    auto password = self->getDBStringParamValue(PasswordUI::PASSWORD_FIELD);
+                    if (password) {
+                        if (password->empty()) {    // password is not used
+                            self->m_state = State::SECRET;
+                            self->changeEngineState();
+                            self->refetchTabUIData();
+                        } else {    // check password validity
+                            //TODO open screen with password confirm
+                        }
+                    } else {
+                        BROWSER_LOGW("[%s] cannot read password from DB", __PRETTY_FUNCTION__);
+                    }
+                } else {    // decison not taken
+                    self->m_state = State::PASSWORD_DECISION;
+                    self->updateNoTabsText(true);
+                }
+            } else {
+                BROWSER_LOGW("[%s] cannot read decision flag from DB", __PRETTY_FUNCTION__);
+            }
+        }  break;
+        case State::SECRET:     // disable secret
+            self->m_state = State::NORMAL;
+            self->changeEngineState();
+            self->refetchTabUIData();
+            break;
+        case State::PASSWORD_DECISION:      // do not use password
+            self->m_state = State::SECRET;
+            self->setDBStringParamValue(PasswordUI::PASSWORD_FIELD, "");
+            self->setDBBoolParamValue(PASSWORD_DECISION_MADE, true);
+            self->changeEngineState();
+            self->refetchTabUIData();
+            break;
+        }
+
+        self->setStateButtons();
+        self->createEmptyLayout();
     } else {
         BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
     }
@@ -367,6 +433,24 @@ void TabUI::addTabItems(std::vector<basic_webengine::TabContentPtr>& items)
     updateNoTabsText();
 }
 
+void TabUI::setStateButtons()
+{
+        switch (m_state) {
+        case State::NORMAL:
+            m_naviframe->setBottomButtonText(0, "Enable Secret");
+            m_naviframe->setBottomButtonText(1, "New tab");
+            break;
+        case State::SECRET:
+            m_naviframe->setBottomButtonText(0, "Disable Secret");
+            m_naviframe->setBottomButtonText(1, "New tab");
+            break;
+        case State::PASSWORD_DECISION:
+            m_naviframe->setBottomButtonText(0, "Do not use password");
+            m_naviframe->setBottomButtonText(1, "Create password");
+            break;
+        }
+}
+
 char* TabUI::_gengrid_text_get(void *data, Evas_Object*, const char *part)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -507,15 +591,15 @@ void TabUI::closeAllTabs()
     closeTabUIClicked();
 }
 
-void TabUI::updateNoTabsText()
+void TabUI::updateNoTabsText(bool forceShow)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (elm_gengrid_items_count(m_gengrid)) {
-        evas_object_hide(m_empty_layout);
-        elm_object_signal_emit(m_content, "hide_overlay", "ui");
-    } else {
+    if (forceShow || elm_gengrid_items_count(m_gengrid) == 0) {
         evas_object_show(m_empty_layout);
         elm_object_signal_emit(m_content, "show_overlay", "ui");
+    } else {
+        evas_object_hide(m_empty_layout);
+        elm_object_signal_emit(m_content, "hide_overlay", "ui");
     }
 }
 
index daaae841084cadf57527f323d90e37d6498b57e5..222186acbd9e8855f16f01a899a08d31a4fc0132 100644 (file)
@@ -29,6 +29,7 @@
 #include "TabIdTypedef.h"
 #include "AbstractRotatable.h"
 #include "NaviframeWrapper.h"
+#include "PasswordUI.h"
 
 namespace tizen_browser{
 namespace base_ui{
@@ -56,7 +57,7 @@ public:
     //AbstractContextMenu interface implementation
     virtual void showContextMenu() override;
 
-    void setState(basic_webengine::State state);
+    PasswordUI& getPasswordUI() { return m_passwordUI; };
 
     boost::signals2::signal<void (const tizen_browser::basic_webengine::TabId&)> tabClicked;
     boost::signals2::signal<void ()> newTabClicked;
@@ -64,6 +65,12 @@ public:
     boost::signals2::signal<void ()> closeTabUIClicked;
     boost::signals2::signal<void ()> changeEngineState;
     boost::signals2::signal<void ()> refetchTabUIData;
+    boost::signals2::signal<bool (std::string)> checkIfParamExistsInDB;
+    boost::signals2::signal<void (std::string, bool)> setDBBoolParamValue;
+    boost::signals2::signal<void (std::string, std::string)> setDBStringParamValue;
+    boost::signals2::signal<bool (std::string)> getDBBoolParamValue;
+    boost::signals2::signal<std::string (std::string)> getDBStringParamValue;
+    boost::signals2::signal<void ()> showPasswordUI;
 
 private:
     struct TabData
@@ -72,6 +79,12 @@ private:
         std::shared_ptr<tizen_browser::base_ui::TabUI> tabUI;
     };
 
+    enum class State {
+        NORMAL,
+        SECRET,
+        PASSWORD_DECISION
+    };
+
     static char* _gengrid_text_get(void *data, Evas_Object *obj, const char *part);
     static Evas_Object * _gengrid_content_get(void *data, Evas_Object *obj, const char *part);
 
@@ -79,12 +92,11 @@ private:
     static void _gengrid_tab_released(void * data, Evas_Object * obj, void * event_info);
     static void _gengrid_tab_clicked(void * data, Evas_Object * obj, void * event_info);
     static void _close_clicked(void *data, Evas_Object *obj, void *event_info);
-    void updateNoTabsText();
+    void updateNoTabsText(bool forceShow=false);
 
     static void _openedtabs_clicked(void * data, Evas_Object * obj, void * event_info);
-    static void _new_tab_clicked(void * data, Evas_Object * obj, void * event_info);
-    static void _newincognitotab_clicked(void * data, Evas_Object * obj, void * event_info);
-    static void _enable_secret_clicked(void * data, Evas_Object * obj, void * event_info);
+    static void _right_button_clicked(void * data, Evas_Object * obj, void * event_info);
+    static void _left_button_clicked(void * data, Evas_Object * obj, void * event_info);
     static void _close_all_clicked(void * data, Evas_Object * obj, void * event_info);
     static void _close_tab_clicked(void *data, Evas_Object*, void*);
     static void _cm_sync_clicked(void*, Evas_Object*, void*);
@@ -101,6 +113,7 @@ private:
     void createTabItemClass();
     void closeAllTabs();
     void addTabItem(basic_webengine::TabContentPtr);
+    void setStateButtons();
 
     Evas_Object *m_parent;
     Evas_Object *m_content;
@@ -113,11 +126,15 @@ private:
     Elm_Gengrid_Item_Class * m_item_class;
     std::string m_edjFilePath;
 
+    State m_state;
+    PasswordUI m_passwordUI;
+
     const unsigned int GENGRID_ITEM_WIDTH = 700;
     const unsigned int GENGRID_ITEM_HEIGHT = 312;
     const unsigned int GENGRID_ITEM_WIDTH_LANDSCAPE = 636;
     const unsigned int GENGRID_ITEM_HEIGHT_LANDSCAPE = 274;
     const unsigned int GESTURE_MOMENTUM_MIN = 2000;
+    static const std::string PASSWORD_DECISION_MADE;
 };
 }
 }
diff --git a/services/TabUI/edc/PasswordUI.edc b/services/TabUI/edc/PasswordUI.edc
new file mode 100644 (file)
index 0000000..b351128
--- /dev/null
@@ -0,0 +1,102 @@
+
+collections { base_scale: 2.6;
+    group {
+        name: "main_layout";
+
+        styles {
+            style { name: "instruction_style";
+                base: "font=Tizen:style=Regular font_size=40 align=left color=#FFFFFF wrap=mixed ellipsis=1.0";
+            }
+        }
+
+        parts {
+            rect {
+                name: "bg";
+                scale: 1;
+                description {
+                    align: 0 0;
+                    color: 255 255 255 255;
+                    rel1 { relative: 0.0 0.0; }
+                    rel2 { relative: 1.0 1.0; }
+                }
+            }
+
+            textblock {
+                name: "instruction";
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    align: 0 0;
+                    color: 0 0 0 255;
+                    min: 0 200;
+                    max: -1 200;
+                    rel1 { relative: 0.05 0.0; to: "bg"; }
+                    rel2 { relative: 0.95 1.0; to: "bg"; }
+
+                    text {
+                       style: "instruction_style";
+                       align: 0.0 0.5;
+                    }
+                }
+            }
+
+            swallow {
+                name: "password_field";
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    align: 0 0;
+                    rel1 { relative: 0.0 1.0; to: "instruction"; }
+                    rel2 { relative: 0.95 1.0; to: "bg"; }
+                }
+            }
+
+            rect {
+                name: "line";
+                scale : 1;
+                description {
+                    state: "default" 0.0;
+                    min: 1 1;
+                    max: -1 1;
+                    visible: 1;
+                    align: 0 0;
+                    color: 0 0 0 255;
+                    rel1 { relative: 0.0 1.0; to: "password_field"; }
+                    rel2 { relative: 0.95 1.0; to: "bg";}
+                }
+            }
+
+            swallow {
+                name: "show_password";
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    align: 0 0;
+                    min: 100 100;
+                    max: 100 100;
+                    rel1 { relative: 0.0 1.0; to: "line"; }
+                    rel2 { relative: 1.0 1.0; to: "bg"; }
+                }
+            }
+
+            textblock {
+                name: "chb_label";
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    align: 0 0;
+                    color: 0 0 0 255;
+                    min: 100 100;
+                    max: -1 100;
+                    rel1 { relative: 1.0 0.0; to: "show_password"; }
+                    rel2 { relative: 1.0 1.0; to: "bg"; }
+
+                    text {
+                       style: "instruction_style";
+                       align: 0.0 0.5;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
index c617faecc1caf5cff20451656b8035470a6d9af5..b5a9e047ea6b2b82534eb6f216bf990a4b8c0b9a 100755 (executable)
@@ -754,6 +754,7 @@ void WebEngineService::clearPrivateData()
         it.second->clearPrivateData();
     }
 }
+
 void WebEngineService::clearPasswordData()
 {
     for(const auto& it: m_stateStruct->tabs) {