Merge remote-tracking branch 'upstream/develop' into uploadNewFolder
authortobiasKaminsky <tobias@kaminsky.me>
Thu, 8 Jan 2015 21:41:41 +0000 (22:41 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Thu, 8 Jan 2015 21:41:41 +0000 (22:41 +0100)
Conflicts:
src/com/owncloud/android/ui/activity/Uploader.java

1  2 
res/values/strings.xml
src/com/owncloud/android/ui/activity/Uploader.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>
  
@@@ -51,7 -53,6 +53,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>
      <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="file_list_folder">folder</string>
+     <string name="file_list_folders">folders</string>
+     <string name="file_list_file">file</string>
+     <string name="file_list_files">files</string>
      <string name="filedetails_select_file">Tap on a file to display additional information.</string>
      <string name="filedetails_size">Size:</string>
      <string name="filedetails_type">Type:</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="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="shared_subject_header">shared</string>
+       <string name="with_you_subject_header">with you</string>
+       <string name="subject_token">%1$s %2$s &gt;&gt;%3$s&lt;&lt; %4$s</string>
  </resources>
@@@ -26,6 -26,14 +26,6 @@@ import java.util.List
  import java.util.Stack;
  import java.util.Vector;
  
 -import com.owncloud.android.MainApp;
 -import com.owncloud.android.R;
 -import com.owncloud.android.authentication.AccountAuthenticator;
 -import com.owncloud.android.datamodel.FileDataStorageManager;
 -import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.files.services.FileUploader;
 -import com.owncloud.android.lib.common.utils.Log_OC;
 -
  import android.accounts.Account;
  import android.accounts.AccountManager;
  import android.app.AlertDialog;
@@@ -37,37 -45,27 +37,41 @@@ import android.content.DialogInterface
  import android.content.DialogInterface.OnCancelListener;
  import android.content.DialogInterface.OnClickListener;
  import android.content.Intent;
+ import android.content.SharedPreferences;
 +import android.content.res.Resources.NotFoundException;
  import android.database.Cursor;
  import android.net.Uri;
  import android.os.Bundle;
  import android.os.Parcelable;
+ import android.preference.PreferenceManager;
  import android.provider.MediaStore.Audio;
  import android.provider.MediaStore.Images;
  import android.provider.MediaStore.Video;
  import android.view.View;
- import android.view.Window;
  import android.widget.AdapterView;
  import android.widget.AdapterView.OnItemClickListener;
  import android.widget.Button;
  import android.widget.EditText;
 +import android.widget.ListView;
  import android.widget.SimpleAdapter;
  import android.widget.Toast;
  
 -import com.actionbarsherlock.app.SherlockListActivity;
+ import com.actionbarsherlock.app.ActionBar;
+ import com.actionbarsherlock.view.MenuItem;
 +import com.owncloud.android.MainApp;
 +import com.owncloud.android.R;
 +import com.owncloud.android.authentication.AccountAuthenticator;
 +import com.owncloud.android.datamodel.FileDataStorageManager;
 +import com.owncloud.android.datamodel.OCFile;
 +import com.owncloud.android.files.services.FileUploader;
 +import com.owncloud.android.lib.common.operations.RemoteOperation;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 +import com.owncloud.android.lib.common.utils.Log_OC;
 +import com.owncloud.android.operations.CreateFolderOperation;
 +import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
+ import com.owncloud.android.utils.DisplayUtils;
 +import com.owncloud.android.utils.ErrorMessageAdapter;
 +
  
  /**
   * This can be used to upload things to an ownCloud instance.
@@@ -75,7 -73,7 +79,7 @@@
   * @author Bartek Przybylski
   * 
   */
 -public class Uploader extends SherlockListActivity implements OnItemClickListener, android.view.View.OnClickListener {
 +public class Uploader extends FileActivity implements OnItemClickListener, android.view.View.OnClickListener {
      private static final String TAG = "ownCloudUploader";
  
      private Account mAccount;
@@@ -86,7 -84,7 +90,7 @@@
      private String mUploadPath;
      private FileDataStorageManager mStorageManager;
      private OCFile mFile;
 -
 +    
      private final static int DIALOG_NO_ACCOUNT = 0;
      private final static int DIALOG_WAITING = 1;
      private final static int DIALOG_NO_STREAM = 2;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
-         getWindow().requestFeature(Window.FEATURE_NO_TITLE);
          mParents = new Stack<String>();
-         mParents.add("");
+         ActionBar actionBar = getSupportActionBar();
+         actionBar.setIcon(DisplayUtils.getSeasonalIconId());
          if (prepareStreamsToUpload()) {
              mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
              Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType());
              } else {
                  mAccount = accounts[0];
                  mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+                 initTargetFolder();
                  populateDirectoryList();
+                 
              }
+             
          } else {
              showDialog(DIALOG_NO_STREAM);
          }
          case DIALOG_MULTIPLE_ACCOUNT:
              CharSequence ac[] = new CharSequence[mAccountManager.getAccountsByType(MainApp.getAccountType()).length];
              for (int i = 0; i < ac.length; ++i) {
-                 ac[i] = mAccountManager.getAccountsByType(MainApp.getAccountType())[i].name;
+                 ac[i] = DisplayUtils.convertIdn(mAccountManager.getAccountsByType(MainApp.getAccountType())[i].name, false);
              }
              builder.setTitle(R.string.common_choose_account);
              builder.setItems(ac, new OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                      mAccount = mAccountManager.getAccountsByType(MainApp.getAccountType())[which];
                      mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+                     initTargetFolder();
                      populateDirectoryList();
                  }
              });
              uploadFiles();
  
              break;
 +            
 +        case R.id.uploader_new_folder:
 +            CreateFolderDialogFragment dialog = CreateFolderDialogFragment.newInstance(mFile);
 +            dialog.show(getSupportFragmentManager(), "createdirdialog");
 +            break;
 +            
 +            
          default:
              throw new IllegalArgumentException("Wrong element clicked");
          }
  
      private void populateDirectoryList() {
          setContentView(R.layout.uploader_layout);
 +        
 +        ListView mListView = (ListView) findViewById(android.R.id.list);
  
-         String full_path = "";
-         for (String a : mParents)
-             full_path += a + "/";
+         String current_dir = mParents.peek();
+         if(current_dir.equals("")){
+             getSupportActionBar().setTitle(getString(R.string.default_display_name_for_root_folder));
+         }
+         else{
+             getSupportActionBar().setTitle(current_dir);
+         }
+         boolean notRoot = (mParents.size() > 1);
+         ActionBar actionBar = getSupportActionBar();
+         actionBar.setDisplayHomeAsUpEnabled(notRoot);
+         actionBar.setHomeButtonEnabled(notRoot);
+         String full_path = generatePath(mParents);
          
          Log_OC.d(TAG, "Populating view with content of : " + full_path);
-         
          mFile = mStorageManager.getFileByPath(full_path);
          if (mFile != null) {
              Vector<OCFile> files = mStorageManager.getFolderContent(mFile);
                                                  R.layout.uploader_list_item_layout,
                                                  new String[] {"dirname"},
                                                  new int[] {R.id.textView1});
 -            setListAdapter(sa);
 -            Button btn = (Button) findViewById(R.id.uploader_choose_folder);
 -            btn.setOnClickListener(this);
 -            getListView().setOnItemClickListener(this);
 +            
 +            mListView.setAdapter(sa);
 +            Button btnChooseFolder = (Button) findViewById(R.id.uploader_choose_folder);
 +            btnChooseFolder.setOnClickListener(this);
 +            
 +            Button btnNewFolder = (Button) findViewById(R.id.uploader_new_folder);
 +            btnNewFolder.setOnClickListener(this);
 +            
 +            mListView.setOnItemClickListener(this);
          }
      }
  
+     private String generatePath(Stack<String> dirs) {
+         String full_path = "";
+         for (String a : dirs)
+             full_path += a + "/";
+         return full_path;
+     }
      private boolean prepareStreamsToUpload() {
          if (getIntent().getAction().equals(Intent.ACTION_SEND)) {
              mStreamsToUpload = new ArrayList<Parcelable>();
              intent.putExtra(FileUploader.KEY_REMOTE_FILE, remote.toArray(new String[remote.size()]));
              intent.putExtra(FileUploader.KEY_ACCOUNT, mAccount);
              startService(intent);
+             //Save the path to shared preferences
+             SharedPreferences.Editor appPrefs = PreferenceManager
+                     .getDefaultSharedPreferences(getApplicationContext()).edit();
+             appPrefs.putString("last_upload_path", mUploadPath);
+             appPrefs.apply();
              finish();
              }
              
          }
      }
      
 +    @Override
 +    public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
 +        super.onRemoteOperationFinish(operation, result);
 +        
 +      
 +        if (operation instanceof CreateFolderOperation) {
 +            onCreateFolderOperationFinish((CreateFolderOperation)operation, result);
 +        }
 +        
 +    }
 +    
 +    /**
 +     * Updates the view associated to the activity after the finish of an operation trying create a new folder
 +     * 
 +     * @param operation     Creation operation performed.
 +     * @param result        Result of the creation.
 +     */
 +    private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) {
 +        if (result.isSuccess()) {
 +            dismissLoadingDialog();
 +            populateDirectoryList();
 +        } else {
 +            dismissLoadingDialog();
 +            try {
 +                Toast msg = Toast.makeText(this, 
 +                        ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), 
 +                        Toast.LENGTH_LONG); 
 +                msg.show();
 +
 +            } catch (NotFoundException e) {
 +                Log_OC.e(TAG, "Error while trying to show fail message " , e);
 +            }
 +        }
 +    }
++    
++    
+     /**
+      *  Loads the target folder initialize shown to the user.
+      * 
+      *  The target account has to be chosen before this method is called. 
+      */
+     private void initTargetFolder() {
+         if (mStorageManager == null) {
+             throw new IllegalStateException("Do not call this method before initializing mStorageManager");
+         }
+         
+         SharedPreferences appPreferences = PreferenceManager
+                 .getDefaultSharedPreferences(getApplicationContext());
+         String last_path = appPreferences.getString("last_upload_path", "");
+         // "/" equals root-directory
+         if(last_path.equals("/")) {
+             mParents.add("");
+         }
+         else{
+             String[] dir_names = last_path.split("/");
+             for (String dir : dir_names)
+                 mParents.add(dir);
+         }
+         //Make sure that path still exists, if it doesn't pop the stack and try the previous path
+             while(!mStorageManager.fileExists(generatePath(mParents)) && mParents.size() > 1){
+                 mParents.pop();
+             }
+     }
+     
+     @Override
+     public boolean onOptionsItemSelected(MenuItem item) {
+         boolean retval = true;
+         switch (item.getItemId()) {
+         case android.R.id.home: {
+             if((mParents.size() > 1)) {                
+                 onBackPressed(); 
+             }
+             break;
+         }
+         default:
+             retval = super.onOptionsItemSelected(item);
+         }
+         return retval;
+     }
+     
  }