Modify uninstall steps in case app is installed on an external memory
authorsung-su.kim <sung-su.kim@samsung.com>
Mon, 7 Oct 2013 09:21:23 +0000 (18:21 +0900)
committerSoo-Hyun Choi <sh9.choi@samsung.com>
Tue, 8 Oct 2013 06:06:57 +0000 (06:06 +0000)
[Issue#]   N_SE-53790
[Problem]  Re-install fails after uninstall app which was installed on external memory.
[Cause]    When uninstalling an app on external memory, unexpected error occurred.
            : SD card isn't inserted or unmounted
           In this case, wrt-installer skips to remove directory in internal memory.
           The remaining internal directory caused "application already existed" error.
[Solution] Change uninstall work-flow.
           Before : Remove the information to only an external memory (e.g., SD card).
           After  : Remove the information on both internal and external memory.

Change-Id: If7a4fe063b80ecdb6a6f5b60f2d95bd48e9cb284

src/jobs/widget_uninstall/task_remove_files.cpp

index d688a04..517e41f 100644 (file)
@@ -61,7 +61,22 @@ void TaskRemoveFiles::StepRemoveInstallationDirectory()
     Try {
         int ret = app2ext_get_app_location(m_context.tzPkgid.c_str());
 
-        if (APP2EXT_INTERNAL_MEM == ret) {
+        if (APP2EXT_SD_CARD == ret) {
+            _D("Remove external directory");
+            Try {
+                WidgetInstallToExtSingleton::Instance().initialize(m_context.tzPkgid);
+                WidgetInstallToExtSingleton::Instance().uninstallation();
+                WidgetInstallToExtSingleton::Instance().deinitialize();
+            }
+            Catch(WidgetInstallToExt::Exception::ErrorInstallToExt)
+            {
+                // Continue uninstall even fail to remove external directory.
+                // i.e.) SD card isn't inserted or unmounted.
+                // This behavior is recommended by platform(app2sd maintainer).
+                _E("Fail to remove external directory");
+            }
+         }
+        if (APP2EXT_INTERNAL_MEM == ret || APP2EXT_SD_CARD == ret) {
             _D("Removing directory");
             m_context.removeStarted = true;
             DPL::Utils::Path widgetDir= m_context.installedPath;
@@ -76,18 +91,6 @@ void TaskRemoveFiles::StepRemoveInstallationDirectory()
             } Catch(DPL::Utils::Path::BaseException){
                 _W("%s is already removed", dataDir.Fullpath().c_str());
             }
-        } else if (APP2EXT_SD_CARD == ret) {
-            _D("Removing sdcard directory");
-            Try {
-                WidgetInstallToExtSingleton::Instance().initialize(m_context.tzPkgid);
-                WidgetInstallToExtSingleton::Instance().uninstallation();
-                WidgetInstallToExtSingleton::Instance().deinitialize();
-            }
-            Catch(WidgetInstallToExt::Exception::ErrorInstallToExt)
-            {
-                Throw(Jobs::WidgetUninstall::TaskRemoveFiles::Exception::
-                        RemoveFilesFailed);
-            }
         } else {
             _E("app is not installed");
             ThrowMsg(Exceptions::WidgetNotExist, "failed to get app location");