Merge remote-tracking branch 'upstream/develop' into beautifyTimestamps
authortobiasKaminsky <tobias@kaminsky.me>
Wed, 12 Nov 2014 08:02:23 +0000 (09:02 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Wed, 12 Nov 2014 08:02:23 +0000 (09:02 +0100)
Conflicts:
src/com/owncloud/android/utils/DisplayUtils.java

1  2 
res/values/strings.xml
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/utils/DisplayUtils.java

diff --combined res/values/strings.xml
@@@ -39,7 -39,9 +39,9 @@@
      <string name="prefs_recommend">Recommend to a friend</string>
      <string name="prefs_feedback">Feedback</string>
      <string name="prefs_imprint">Imprint</string>
-     
+     <string name="prefs_remember_last_share_location">Remember share location</string>
+     <string name="prefs_remember_last_upload_location_summary">Remember last share upload location</string>
        <string name="recommend_subject">"Try %1$s on your smartphone!"</string>
        <string name="recommend_text">"I want to invite you to use %1$s on your smartphone!\nDownload here: %2$s"</string>
  
@@@ -60,7 -62,6 +62,7 @@@
      <string name="uploader_wrn_no_content_text">No content was received. Nothing to upload.</string>
      <string name="uploader_error_forbidden_content">%1$s is not allowed to access the shared content</string>
      <string name="uploader_info_uploading">Uploading</string>
 +    <string name="file_list_seconds_ago">seconds ago</string>
      <string name="file_list_empty">Nothing in here. Upload something!</string>
      <string name="file_list_loading">Loading...</string>
      <string name="local_file_list_empty">There are no files in this folder.</string>
        <string name="network_error_socket_timeout_exception">An error occurred while waiting for the server, the operation couldn\'t have been done</string>
        <string name="network_error_connect_timeout_exception">An error occurred while waiting for the server, the operation couldn\'t have been done</string>
        <string name="network_host_not_available">The operation couldn\'t be completed, server is unavailable</string>
        <string name="empty"></string>
        
        <string name="forbidden_permissions">You do not have permission %s</string>
  
        <string name="prefs_category_instant_uploading">Instant Uploads</string>
        <string name="prefs_category_security">Security</string>
  </resources>
@@@ -29,7 -29,6 +29,7 @@@ import android.content.Context
  import android.content.SharedPreferences;\r
  import android.graphics.Bitmap;\r
  import android.preference.PreferenceManager;\r
 +import android.text.format.DateUtils;\r
  import android.view.LayoutInflater;\r
  import android.view.View;\r
  import android.view.ViewGroup;\r
@@@ -47,7 -46,6 +47,7 @@@ import com.owncloud.android.datamodel.T
  import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncDrawable;\r
  import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
  import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
 +import com.owncloud.android.lib.common.utils.Log_OC;\r
  import com.owncloud.android.ui.activity.ComponentsGetter;\r
  import com.owncloud.android.utils.DisplayUtils;\r
  import com.owncloud.android.utils.FileStorageUtils;\r
@@@ -84,10 -82,11 +84,11 @@@ public class FileListListAdapter extend
              Context context, \r
              ComponentsGetter transferServiceGetter\r
              ) {\r
-         \r
\r
          mJustFolders = justFolders;\r
          mContext = context;\r
          mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
          mTransferServiceGetter = transferServiceGetter;
          \r
          mAppPreferences = PreferenceManager\r
          \r
          // initialise thumbnails cache on background thread\r
          new ThumbnailsCacheManager.InitDiskCacheTask().execute();\r
\r
      }\r
      
      @Override\r
                  fileSizeV.setVisibility(View.VISIBLE);\r
                  fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
                  lastModV.setVisibility(View.VISIBLE);\r
 -                lastModV.setText(\r
 -                        DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
 -                );\r
 +                lastModV.setText(showRelativeTimestamp(file));\r
                  // this if-else is needed even thoe fav icon is visible by default\r
                  // because android reuses views in listview\r
                  if (!file.keepInSync()) {\r
                          if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) {\r
                              final ThumbnailsCacheManager.ThumbnailGenerationTask task = \r
                                      new ThumbnailsCacheManager.ThumbnailGenerationTask(\r
-                                             fileIcon, mStorageManager\r
+                                             fileIcon, mStorageManager, mAccount\r
                                      );\r
                              if (thumbnail == null) {\r
                                  thumbnail = ThumbnailsCacheManager.mDefaultImg;\r
  //                }\r
  
                  lastModV.setVisibility(View.VISIBLE);\r
 -                lastModV.setText(\r
 -                        DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
 -                );\r
 +                lastModV.setText(showRelativeTimestamp(file));\r
                  checkBoxV.setVisibility(View.GONE);\r
                  view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
  \r
          mSortAscending = ascending;\r
          \r
          sortDirectory();\r
 -    }    
 +    }    \r
 +    \r
 +    private CharSequence showRelativeTimestamp(OCFile file){\r
 +        return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(),\r
 +                DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);\r
 +    }
  }\r
@@@ -18,8 -18,7 +18,7 @@@
  \r
  package com.owncloud.android.utils;\r
  \r
- import java.sql.Time;\r
- import java.text.SimpleDateFormat;\r
+ import java.net.IDN;\r
  import java.util.Arrays;\r
  import java.util.Calendar;\r
  import java.util.Date;\r
@@@ -27,12 -26,11 +26,14 @@@ import java.util.HashMap
  import java.util.HashSet;\r
  import java.util.Set;\r
  \r
+ import android.annotation.TargetApi;\r
 +import android.content.Context;\r
+ import android.os.Build;\r
 +import android.text.format.DateFormat;\r
 +import android.text.format.DateUtils;\r
  \r
+ import com.owncloud.android.MainApp;\r
  import com.owncloud.android.R;\r
- import com.owncloud.android.lib.common.utils.Log_OC;\r
  \r
  /**\r
   * A helper class for some string operations.\r
@@@ -42,6 -40,8 +43,8 @@@
   */\r
  public class DisplayUtils {\r
      \r
+     private static final String OWNCLOUD_APP_NAME = "ownCloud";\r
\r
      //private static String TAG = DisplayUtils.class.getSimpleName(); \r
      \r
      private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };\r
      \r
      \r
      public static int getSeasonalIconId() {\r
-         if (Calendar.getInstance().get(Calendar.DAY_OF_YEAR) >= 354) {\r
+         if (Calendar.getInstance().get(Calendar.DAY_OF_YEAR) >= 354 &&\r
+                 MainApp.getAppContext().getString(R.string.app_name).equals(OWNCLOUD_APP_NAME)) {\r
              return R.drawable.winter_holidays_icon;\r
          } else {\r
              return R.drawable.icon;\r
          }\r
      }\r
      \r
+     /**\r
+      * Converts an internationalized domain name (IDN) in an URL to and from ASCII/Unicode.\r
+      * @param url the URL where the domain name should be converted\r
+      * @param toASCII if true converts from Unicode to ASCII, if false converts from ASCII to Unicode\r
+      * @return the URL containing the converted domain name\r
+      */\r
+     @TargetApi(Build.VERSION_CODES.GINGERBREAD)\r
+     public static String convertIdn(String url, boolean toASCII) {\r
+         \r
+         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {\r
+             // Find host name after '//' or '@'\r
+             int hostStart = 0;\r
+             if  (url.indexOf("//") != -1) {\r
+                 hostStart = url.indexOf("//") + "//".length();\r
+             } else if (url.indexOf("@") != -1) {\r
+                 hostStart = url.indexOf("@") + "@".length();\r
+             }\r
+             \r
+             int hostEnd = url.substring(hostStart).indexOf("/");\r
+             // Handle URL which doesn't have a path (path is implicitly '/')\r
+             hostEnd = (hostEnd == -1 ? url.length() : hostStart + hostEnd);\r
+             \r
+             String host = url.substring(hostStart, hostEnd);\r
+             host = (toASCII ? IDN.toASCII(host) : IDN.toUnicode(host));\r
+             \r
+             return url.substring(0, hostStart) + host + url.substring(hostEnd);\r
+         } else {\r
+             return url;\r
+         }\r
+     }\r
++    \r
 +    public static CharSequence getRelativeDateTimeString(Context c, long time, long minResolution, long transitionResolution, int flags){\r
 +        if (time > System.currentTimeMillis()){\r
 +            return DisplayUtils.unixTimeToHumanReadable(time);\r
 +        } else if ((System.currentTimeMillis() - time) < 60000) {\r
 +            return  c.getString(R.string.file_list_seconds_ago)  + ", " + \r
 +                DateFormat.getTimeFormat(c).format(new Date(time));\r
 +        } else {\r
 +            return DateUtils.getRelativeDateTimeString(c, time, minResolution, transitionResolution, flags);\r
 +        }\r
 +    }\r
  }\r