Merge remote-tracking branch 'upstream/develop' into uploadWhenCharging
authortobiasKaminsky <tobias@kaminsky.me>
Wed, 22 Jul 2015 18:15:14 +0000 (20:15 +0200)
committertobiasKaminsky <tobias@kaminsky.me>
Wed, 22 Jul 2015 18:15:14 +0000 (20:15 +0200)
1  2 
AndroidManifest.xml
res/values/strings.xml
res/xml/preferences.xml
src/com/owncloud/android/files/InstantUploadBroadcastReceiver.java

diff --combined AndroidManifest.xml
@@@ -3,7 -3,7 +3,7 @@@
    ownCloud Android client application
  
    Copyright (C) 2012  Bartek Przybylski
-   Copyright (C) 2012-2014 ownCloud Inc.
+   Copyright (C) 2012-2015 ownCloud Inc.
  
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License version 2,
@@@ -18,8 -18,8 +18,8 @@@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
   -->
  <manifest package="com.owncloud.android"
-     android:versionCode="10600100"
-     android:versionName="1.6.1" xmlns:android="http://schemas.android.com/apk/res/android">
+     android:versionCode="10700200"
+     android:versionName="1.7.2" xmlns:android="http://schemas.android.com/apk/res/android">
  
      <uses-permission android:name="android.permission.GET_ACCOUNTS" />
      <uses-permission android:name="android.permission.USE_CREDENTIALS" />
      <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
      <uses-permission android:name="android.permission.BROADCAST_STICKY" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
      <uses-permission android:name="android.permission.WAKE_LOCK"/>
      
      <uses-sdk
-         android:minSdkVersion="8"
+         android:minSdkVersion="14"
          android:targetSdkVersion="19" />
  
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
@@@ -86,9 -85,6 +85,6 @@@
              android:name=".ui.activity.Preferences"
              android:theme="@style/Theme.ownCloud" >
          </activity>
-         <activity android:name=".ui.activity.PreferencesNewSessionewSession" >
-         </activity>
-         
          <activity     
              android:name=".ui.preview.PreviewImageActivity" 
              />
          <service android:name=".files.services.FileUploader" />
          <service android:name=".media.MediaService" />
          
-         <activity android:name=".ui.activity.PinCodeActivity" />
+         <activity android:name=".ui.activity.PassCodeActivity" />
          <activity android:name=".ui.activity.ConflictsResolveActivity"/>
          <activity android:name=".ui.activity.GenericExplanationActivity"/>
          <activity android:name=".ui.activity.ErrorsWhileCopyingHandlerActivity"/>
              <intent-filter>
                  <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
              </intent-filter>
 +            <intent-filter>
 +                              <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
 +                          <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
 +                      </intent-filter>
          </receiver>
          <receiver android:name=".files.BootupBroadcastReceiver">
              <intent-filter>
                        android:icon="@drawable/copy_link"/>
  
          <activity 
-                       android:name=".ui.activity.MoveActivity"
+                       android:name=".ui.activity.FolderPickerActivity"
+                       android:label="@string/app_name"/>
+         <activity 
+                       android:name=".ui.activity.UploadPathActivity"
                        android:label="@string/app_name"/>
          
      </application>
diff --combined res/values/strings.xml
        <!-- TODO re-enable when server-side folder size calculation is available   
        <item>Biggest - Smallest</item>  -->
      </string-array>
+     <!-- TODO re-enable when "Accounts" is available in Navigation Drawer -->
+     <!--<string name="drawer_item_accounts">Accounts</string>-->
+     <string name="drawer_item_all_files">All files</string>
+     <!-- TODO re-enable when "On Device" is available
+     <string name="drawer_item_on_device">On device</string>-->
+     <string name="drawer_item_settings">Settings</string>
+     <string name="drawer_item_logs">Logs</string>
+       <string name="drawer_close">Close</string>
      <string name="prefs_category_general">General</string>
      <string name="prefs_category_more">More</string>
      <string name="prefs_accounts">Accounts</string>
      <string name="prefs_manage_accounts">Manage Accounts</string>
-     <string name="prefs_pincode">App PIN</string>
-     <string name="prefs_pincode_summary">Protect your client</string>
+     <string name="prefs_passcode">Passcode lock</string>
      <string name="prefs_instant_upload">Instant picture uploads</string>
      <string name="prefs_instant_upload_summary">Instantly upload pictures taken by camera</string>
      <string name="prefs_instant_video_upload">Instant video uploads</string>
@@@ -53,6 -60,7 +60,7 @@@
      <string name="sync_string_files">Files</string>
      <string name="setup_btn_connect">Connect</string>
      <string name="uploader_btn_upload_text">Upload</string>
+     <string name="uploader_btn_new_folder_text">New folder</string>
      <string name="uploader_top_message">Choose upload folder:</string>
      <string name="uploader_wrn_no_account_title">No account found</string>
      <string name="uploader_wrn_no_account_text">There are no %1$s accounts on your device. Please setup an account first.</string>
@@@ -64,7 -72,7 +72,7 @@@
      <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="file_list_loading">Loading&#8230;</string>
      <string name="local_file_list_empty">There are no files in this folder.</string>
      <string name="filedetails_select_file">Tap on a file to display additional information.</string>
      <string name="filedetails_size">Size:</string>
@@@ -74,6 -82,7 +82,7 @@@
      <string name="filedetails_download">Download</string>
      <string name="filedetails_sync_file">Refresh file</string>
      <string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string>
+     <string name="list_layout">List Layout</string>
      <string name="action_share_file">Share link</string>
      <string name="action_unshare_file">Unshare link</string>
      <string name="common_yes">Yes</string>
      <string name="foreign_files_local_text">"Local: %1$s"</string>
      <string name="foreign_files_remote_text">"Remote: %1$s"</string>
      <string name="upload_query_move_foreign_files">There is not space enough to copy the selected files into the %1$s folder. Would you like to move them instead? </string>
-     <string name="pincode_enter_pin_code">Please, insert your App PIN</string>
+     <string name="pass_code_enter_pass_code">Please, insert your passcode</string>
      
-     <string name="pincode_configure_your_pin">Enter your App PIN</string>
-     <string name="pincode_configure_your_pin_explanation">The PIN will be requested every time the app is started</string>
-     <string name="pincode_reenter_your_pincode">Please, reenter your App PIN</string>
-     <string name="pincode_remove_your_pincode">Remove your App PIN</string>
-     <string name="pincode_mismatch">The App PINs are not the same</string>
-     <string name="pincode_wrong">Incorrect App PIN</string>
-     <string name="pincode_removed">App PIN removed</string>
-     <string name="pincode_stored">App PIN stored</string>
+     <string name="pass_code_configure_your_pass_code">Enter your passcode</string>
+     <string name="pass_code_configure_your_pass_code_explanation">The passcode will be requested every time the app is started</string>
+     <string name="pass_code_reenter_your_pass_code">Please, reenter your passcode</string>
+     <string name="pass_code_remove_your_pass_code">Remove your passcode</string>
+     <string name="pass_code_mismatch">The passcodes are not the same</string>
+     <string name="pass_code_wrong">Incorrect passcode</string>
+     <string name="pass_code_removed">Passcode removed</string>
+     <string name="pass_code_stored">Passcode stored</string>
      
      <string name="media_notif_ticker">"%1$s music player"</string>
      <string name="media_state_playing">"%1$s (playing)"</string>
        <string name="auth_no_net_conn_title">No network connection</string>
        <string name="auth_nossl_plain_ok_title">Secure connection unavailable.</string>
        <string name="auth_connection_established">Connection established</string>
-       <string name="auth_testing_connection">Testing connection&#8230;</string>
+       <string name="auth_testing_connection">Testing connection</string>
        <string name="auth_not_configured_title">Malformed server configuration</string>
        <string name="auth_account_not_new">An account for the same user and server already exists in the device</string>
        <string name="auth_account_not_the_same">The entered user does not match the user of this account</string>
        <string name="auth_fail_get_user_name">Your server is not returning a correct user id, please contact an administrator
        </string>
        <string name="auth_can_not_auth_against_server">Cannot authenticate against this server</string>
+     <string name="auth_account_does_not_exist">Account does not exist in the device yet</string>
      
      <string name="fd_keep_in_sync">Keep file up to date</string>
      <string name="common_rename">Rename</string>
      <string name="sync_file_nothing_to_do_msg">File contents already synchronized</string>
      <string name="create_dir_fail_msg">Folder could not be created</string>
      <string name="filename_forbidden_characters">Forbidden characters: / \\ &lt; &gt; : " | ? *</string>
+     <string name="filename_forbidden_charaters_from_server">File name contains at least one invalid character</string>
      <string name="filename_empty">File name cannot be empty</string>
      <string name="wait_a_moment">Wait a moment</string>
      <string name="filedisplay_unexpected_bad_get_content">"Unexpected problem ; please select the file from a different app"</string>
      <string name="filedisplay_no_file_selected">No file was selected</string>
      <string name="activity_chooser_title">Send link to &#8230;</string>
+     <string name="wait_for_tmp_copy_from_private_storage">Copying file from private storage</string>
      
      <string name="oauth_check_onoff">Login with oAuth2</string> 
      <string name="oauth_login_connection">Connecting to oAuth2 server…</string>    
      <string name="placeholder_media_time">12:23:45</string>
      
      <string name="instant_upload_on_wifi">Upload pictures via WiFi only</string>
 +    <string name="instant_upload_on_charging">Upload when charging only</string>
      <string name="instant_video_upload_on_wifi">Upload videos via WiFi only</string>
      <string name="instant_upload_path">/InstantUpload</string>
      <string name="conflict_title">Update conflict</string>
        <string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
        <string name="unshare_link_file_no_exist">Unable to unshare. Please check whether the file exists</string>
        <string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
+     <string name="share_link_password_title">Enter a password</string>
+     <string name="share_link_empty_password">You must enter a password</string>
  
        <string name="activity_chooser_send_file_title">Send</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="empty" />
        
        <string name="forbidden_permissions">You do not have permission %s</string>
        <string name="forbidden_permissions_rename">to rename this file</string>
  
        <string name="actionbar_logger">Logs</string>
        <string name="log_send_history_button">Send History</string>
-       <string name="log_mail_subject">ownCloud Android app logs</string>
-       <string name="log_progress_dialog_text">Loading data...</string>
+       <string name="log_send_no_mail_app">No app for sending logs found. Install mail app!</string>
+       <string name="log_send_mail_subject">%1$s Android app logs</string>
+       <string name="log_progress_dialog_text">Loading data&#8230;</string>
  
        <string name="saml_authentication_required_text">Authentication required</string>
        <string name="saml_authentication_wrong_pass">Wrong password</string>
        <string name="actionbar_move">Move</string>
        <string name="file_list_empty_moving">Nothing in here. You can add a folder!</string>
-       <string name="move_choose_button_text">Choose</string>
+       <string name="folder_picker_choose_button_text">Choose</string>
  
        <string name="move_file_not_found">Unable to move. Please check whether the file exists</string>
        <string name="move_file_invalid_into_descendent">It is not possible to move a folder into a descendant</string>
  
        <string name="prefs_category_instant_uploading">Instant Uploads</string>
        <string name="prefs_category_security">Security</string>
+       <string name="prefs_instant_video_upload_path_title">Upload Video Path</string>
+     <string name="download_folder_failed_content">Download of %1$s folder could not be completed</string>
+       <string name="shared_subject_header">shared</string>
+       <string name="with_you_subject_header">with you</string>
+     
+       <string name="subject_token">%1$s shared \"%2$s\" with you</string>
+     <string name="auth_refresh_button">Refresh connection</string>
+     <string name="auth_host_address">Server address</string>
+     <string name="common_error_out_memory">Not enough memory</string>
+     <string name="username">Username</string>
+     <string name="file_list__footer__folder">1 folder</string>
+     <string name="file_list__footer__folders">%1$d folders</string>
+     <string name="file_list__footer__file">1 file</string>
+     <string name="file_list__footer__file_and_folder">1 file, 1 folder</string>
+     <string name="file_list__footer__file_and_folders">1 file, %1$d folders</string>
+     <string name="file_list__footer__files">%1$d files</string>
+     <string name="file_list__footer__files_and_folder">%1$d files, 1 folder</string>
+     <string name="file_list__footer__files_and_folders">%1$d files, %2$d folders</string>
  </resources>
diff --combined res/xml/preferences.xml
@@@ -3,7 -3,7 +3,7 @@@
    ownCloud Android client application
  
    Copyright (C) 2012  Bartek Przybylski
-   Copyright (C) 2012-2013 ownCloud Inc.
+   Copyright (C) 2015 ownCloud Inc.
  
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License version 2,
      </PreferenceCategory>
      
        <PreferenceCategory android:title="@string/prefs_category_security">
-           <!-- ListPreference
-               android:key="select_oc_account"
-               android:title="@string/prefs_select_oc_account"
-               android:summary="@string/prefs_summary_select_oc_account"
-               / -->
-           <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:title="@string/prefs_pincode" android:key="set_pincode" 
-                         android:summary="@string/prefs_pincode_summary"/>
+           <android.preference.CheckBoxPreference android:title="@string/prefs_passcode" android:key="set_pincode" />
        </PreferenceCategory>
  
 -    <PreferenceCategory android:title="@string/prefs_category_instant_uploading" android:key="instant_uploading_category">
 -         <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:key="instant_uploading"
 +    <PreferenceCategory android:title="@string/prefs_category_instant_uploading">
 +          <EditTextPreference android:title="@string/prefs_instant_upload_path_title"
 +                                              android:defaultValue="@string/instant_upload_path"
 +                                              android:key="instant_upload_path"/>
-           <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:dependency="instant_uploading"
-                                       android:disableDependentsState="true"
-                                       android:title="@string/instant_upload_on_charging"
-                                       android:key="instant_upload_on_charging"/>
 +          <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:key="instant_uploading"
                                android:title="@string/prefs_instant_upload"
                                android:summary="@string/prefs_instant_upload_summary"/>
-           <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:dependency="instant_uploading"
-                                               android:disableDependentsState="true"
+          <com.owncloud.android.ui.PreferenceWithLongSummary
+                                                       android:title="@string/prefs_instant_upload_path_title"
+                                                       android:key="instant_upload_path" />
+           <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
                                                android:title="@string/instant_upload_on_wifi"
                                                android:key="instant_upload_on_wifi"/>
            <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:key="instant_video_uploading"
                                android:title="@string/prefs_instant_video_upload"
-                               android:summary="@string/prefs_instant_video_upload_summary"/>
-           <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle android:dependency="instant_video_uploading"
-                                               android:disableDependentsState="true"
+                               android:summary="@string/prefs_instant_video_upload_summary" />
+           <com.owncloud.android.ui.PreferenceWithLongSummary
+                                                       android:title="@string/prefs_instant_video_upload_path_title"
+                                                       android:key="instant_video_upload_path" />
+           <com.owncloud.android.ui.CheckBoxPreferenceWithLongTitle
                                                android:title="@string/instant_video_upload_on_wifi"
                                                android:key="instant_video_upload_on_wifi"/>
            <!-- DISABLED FOR RELEASE UNTIL FIXED
@@@ -1,6 -1,8 +1,8 @@@
- /* ownCloud Android client application
+ /**
+  *   ownCloud Android client application
+  *
   *   Copyright (C) 2012  Bartek Przybylski
-  *   Copyright (C) 2012-2014 ownCloud Inc.
+  *   Copyright (C) 2015 ownCloud Inc.
   *
   *   This program is free software: you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License version 2,
@@@ -27,15 -29,14 +29,15 @@@ import com.owncloud.android.files.servi
  import com.owncloud.android.lib.common.utils.Log_OC;
  import com.owncloud.android.utils.FileStorageUtils;
  
 -
  import android.accounts.Account;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
 +import android.content.IntentFilter;
  import android.database.Cursor;
  import android.net.ConnectivityManager;
  import android.net.NetworkInfo.State;
 +import android.os.BatteryManager;
  import android.preference.PreferenceManager;
  import android.provider.MediaStore.Images;
  import android.provider.MediaStore.Video;
@@@ -57,7 -58,7 +59,7 @@@ public class InstantUploadBroadcastRece
      @Override
      public void onReceive(Context context, Intent intent) {
          Log_OC.d(TAG, "Received: " + intent.getAction());
 -        if (intent.getAction().equals(android.net.ConnectivityManager.CONNECTIVITY_ACTION)) {
 +        if (intent.getAction().equals(android.net.ConnectivityManager.CONNECTIVITY_ACTION) || intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
              handleConnectivityAction(context, intent);
          }else if (intent.getAction().equals(NEW_PHOTO_ACTION_UNOFFICIAL)) {
              handleNewPictureAction(context, intent); 
@@@ -88,7 -89,7 +90,7 @@@
  
          Account account = AccountUtils.getCurrentOwnCloudAccount(context);
          if (account == null) {
-             Log_OC.w(TAG, "No owncloud account found for instant upload, aborting");
+             Log_OC.w(TAG, "No ownCloud account found for instant upload, aborting");
              return;
          }
  
          file_name = c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME));
          mime_type = c.getString(c.getColumnIndex(Images.Media.MIME_TYPE));
          c.close();
 -        
          Log_OC.d(TAG, file_path + "");
  
          // save always temporally the picture to upload
          db.putFileForLater(file_path, account.name, null);
          db.close();
  
 -        if (!isOnline(context) || (instantPictureUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))) {
 +        if (!isOnline(context) 
 +                || (instantPictureUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))
 +                || (instantUploadWhenChargingOnly(context) && !isCharging(context))
 +           ) {
              return;
          }
  
          mime_type = c.getString(c.getColumnIndex(Video.Media.MIME_TYPE));
          c.close();
          Log_OC.d(TAG, file_path + "");
 +        
 +        // save always temporally the picture to upload
 +        DbHandler db = new DbHandler(context);
 +        db.putFileForLater(file_path, account.name, null);
 +        db.close();
  
 -        if (!isOnline(context) || (instantVideoUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))) {
 +        if (!isOnline(context) 
 +                || (instantVideoUploadViaWiFiOnly(context) && !isConnectedViaWiFi(context))
 +                || (instantUploadWhenChargingOnly(context) && !isCharging(context))
 +           ) {
              return;
          }
  
          Intent i = new Intent(context, FileUploader.class);
          i.putExtra(FileUploader.KEY_ACCOUNT, account);
          i.putExtra(FileUploader.KEY_LOCAL_FILE, file_path);
-         i.putExtra(FileUploader.KEY_REMOTE_FILE, FileStorageUtils.getInstantUploadFilePath(context, file_name));
+         i.putExtra(FileUploader.KEY_REMOTE_FILE, FileStorageUtils.getInstantVideoUploadFilePath(context, file_name));
          i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
          i.putExtra(FileUploader.KEY_MIME_TYPE, mime_type);
          i.putExtra(FileUploader.KEY_INSTANT_UPLOAD, true);
      }
  
      private void handleConnectivityAction(Context context, Intent intent) {
 -        if (!instantPictureUploadEnabled(context)) {
 +        if (!instantPictureUploadEnabled(context) && !instantVideoUploadEnabled(context)) {
              Log_OC.d(TAG, "Instant upload disabled, don't upload anything");
              return;
          }
  
          if (!intent.hasExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY)
                  && isOnline(context)
 -                && (!instantPictureUploadViaWiFiOnly(context) || (instantPictureUploadViaWiFiOnly(context) == isConnectedViaWiFi(context) == true))) {
 +                && (!instantUploadWhenChargingOnly(context) || (instantUploadWhenChargingOnly(context) == isCharging(context) == true))
 +                && (!instantPictureUploadViaWiFiOnly(context) || (instantPictureUploadViaWiFiOnly(context) == isConnectedViaWiFi(context) == true))
 +                && (!instantVideoUploadViaWiFiOnly(context) || (instantVideoUploadViaWiFiOnly(context) == isConnectedViaWiFi(context) == true))
 +            ) {
              DbHandler db = new DbHandler(context);
              Cursor c = db.getAwaitingFiles();
              if (c.moveToFirst()) {
              c.close();
              db.close();
          }
 -
      }
  
      public static boolean isOnline(Context context) {
                  && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI
                  && cm.getActiveNetworkInfo().getState() == State.CONNECTED;
      }
 +    
 +    public static boolean isCharging(Context context){
 +        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
 +        Intent batteryStatus = context.registerReceiver(null, ifilter);
 +        
 +        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
 +        return status == BatteryManager.BATTERY_STATUS_CHARGING ||
 +                status == BatteryManager.BATTERY_STATUS_FULL;
 +    }
  
      public static boolean instantPictureUploadEnabled(Context context) {
          return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_uploading", false);
      public static boolean instantVideoUploadViaWiFiOnly(Context context) {
          return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_video_upload_on_wifi", false);
      }
 +    public static boolean instantUploadWhenChargingOnly(Context context) {
 +        return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("instant_upload_on_charging", false);
 +    }
  }