Remove InstantUploadActivity and related resources

This commit is contained in:
jabarros 2014-07-14 08:40:16 +02:00
parent e5f20fb85b
commit 055be96386
6 changed files with 4 additions and 625 deletions

View file

@ -59,9 +59,6 @@
</activity>
<activity android:name=".ui.activity.UploadFilesActivity">
</activity>
<activity android:name=".ui.activity.InstantUploadActivity">
</activity>
<activity android:name=".ui.activity.FailedUploadActivity" android:theme="@android:style/Theme.Dialog" android:excludeFromRecents="true"/>
<activity android:name=".ui.activity.Uploader" >
<intent-filter>
<action android:name="android.intent.action.SEND" >

View file

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
ownCloud Android client application
Copyright (C) 2012 Bartek Przybylski
Copyright (C) 2012-2013 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,
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/background_color"
android:orientation="vertical"
android:id="@+id/failed_files_list_view">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/failed_upload_headline_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.93"
android:hint="@string/failed_upload_headline_hint"
android:text="@string/failed_upload_headline_text" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right" >
<CheckBox
android:id="@+id/failed_upload_headline_cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/failed_upload_all_cb"
android:textSize="8sp" />
<Button
android:id="@+id/failed_upload_retry_all_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="30dp"
android:minWidth="90dp"
android:text="@string/failed_upload_headline_retryall_btn"
android:textSize="8sp" />
<Button
android:id="@+id/failed_upload_delete_all_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="30dp"
android:minWidth="90dp"
android:text="@string/failed_upload_headline_delete_all_btn"
android:textSize="8sp" />
</LinearLayout>
</LinearLayout>
<ScrollView
android:id="@+id/failedUploadScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="ifContentScrolls" >
<LinearLayout
android:id="@+id/failed_upload_scrollviewlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
</LinearLayout>

View file

@ -250,17 +250,6 @@
<string name="preview_image_error_unknown_format">This image cannot be shown</string>
<string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string>
<string name="actionbar_failed_instant_upload">Failed InstantUpload</string>
<string name="failed_upload_headline_text">Failed instant uploads</string>
<string name="failed_upload_headline_hint">Summary of all failed instant uploads</string>
<string name="failed_upload_all_cb">select all</string>
<string name="failed_upload_headline_retryall_btn">retry all selected</string>
<string name="failed_upload_headline_delete_all_btn">delete all selected from uploadqueue</string>
<string name="failed_upload_retry_text">retry to upload the image: </string>
<string name="failed_upload_load_more_images">Load more Pictures</string>
<string name="failed_upload_retry_do_nothing_text">do nothing you are not online for instant upload</string>
<string name="failed_upload_failure_text">Failure Message: </string>
<string name="failed_upload_quota_exceeded_text">Please check your server configuration,maybe your quota is exceeded.</string>
<string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your
administrator.</string>

View file

@ -70,7 +70,6 @@ import com.owncloud.android.operations.UploadFileOperation;
import com.owncloud.android.operations.common.SyncOperation;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.activity.InstantUploadActivity;
import com.owncloud.android.utils.ErrorMessageAdapter;
import com.owncloud.android.utils.Log_OC;
@ -769,17 +768,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
mUploadClient = null; // grant that future retries on the same account will get the fresh credentials
} else {
// TODO put something smart in the contentIntent below
// we add only for instant-uploads the InstantUploadActivity and the
// db entry
Intent detailUploadIntent = new Intent(this, InstantUploadActivity.class);
detailUploadIntent.putExtra(FileUploader.KEY_ACCOUNT, upload.getAccount());
resultBuilder
.setContentIntent(PendingIntent.getActivity(
this, (int) System.currentTimeMillis(), detailUploadIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT
))
.setContentText(content);
resultBuilder.setContentText(content);
if (upload.isInstant()) {
DbHandler db = null;

View file

@ -48,7 +48,6 @@ import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
//import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@ -66,11 +65,9 @@ import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.files.services.FileDownloader;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
import com.owncloud.android.operations.CreateFolderOperation;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
@ -80,6 +77,7 @@ import com.owncloud.android.lib.common.network.CertificateCombinedException;
import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.operations.CreateFolderOperation;
import com.owncloud.android.operations.CreateShareOperation;
import com.owncloud.android.operations.RemoveFileOperation;
import com.owncloud.android.operations.RenameFileOperation;
@ -739,23 +737,13 @@ FileFragment.ContainerActivity, OnNavigationListener, OnSslUntrustedCertListener
}
case DIALOG_CHOOSE_UPLOAD_SOURCE: {
String[] items = null;
String[] allTheItems = { getString(R.string.actionbar_upload_files),
getString(R.string.actionbar_upload_from_apps),
getString(R.string.actionbar_failed_instant_upload) };
String[] commonItems = { getString(R.string.actionbar_upload_files),
getString(R.string.actionbar_upload_from_apps) };
if (InstantUploadActivity.IS_ENABLED)
items = allTheItems;
else
items = commonItems;
builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.actionbar_upload);
builder.setItems(items, new DialogInterface.OnClickListener() {
builder.setItems(allTheItems, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
// if (!mDualPane) {
@ -771,10 +759,6 @@ FileFragment.ContainerActivity, OnNavigationListener, OnSslUntrustedCertListener
action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)),
ACTION_SELECT_CONTENT_FROM_APPS);
} else if (item == 2 && InstantUploadActivity.IS_ENABLED) {
Intent action = new Intent(FileDisplayActivity.this, InstantUploadActivity.class);
action.putExtra(FileUploader.KEY_ACCOUNT, FileDisplayActivity.this.getAccount());
startActivity(action);
}
}
});

View file

@ -1,476 +0,0 @@
/* ownCloud Android client application
* Copyright (C) 2012-2013 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,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.owncloud.android.ui.activity;
import java.util.ArrayList;
import java.util.List;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
import com.owncloud.android.db.DbHandler;
import com.owncloud.android.files.InstantUploadBroadcastReceiver;
import com.owncloud.android.files.services.FileUploader;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.Log_OC;
import android.accounts.Account;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
/**
* This Activity is used to display a list with images they could not be
* uploaded instantly. The images can be selected for delete or for a try again
* upload
*
* The entry-point for this activity is the 'Failed upload Notification" and a
* sub-menu underneath the 'Upload' menu-item
*
* @author andomaex / Matthias Baumann
*/
public class InstantUploadActivity extends Activity {
private static final String LOG_TAG = InstantUploadActivity.class.getSimpleName();
private LinearLayout listView;
private static final String retry_chexbox_tag = "retry_chexbox_tag";
public static final boolean IS_ENABLED = false;
private static int MAX_LOAD_IMAGES = 5;
private int lastLoadImageIdx = 0;
private SparseArray<String> fileList = null;
CheckBox failed_upload_all_cb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.failed_upload_files);
Button deleteAllBtn = (Button) findViewById(R.id.failed_upload_delete_all_btn);
deleteAllBtn.setOnClickListener(getDeleteListner());
Button retryAllBtn = (Button) findViewById(R.id.failed_upload_retry_all_btn);
retryAllBtn.setOnClickListener(getRetryListner());
this.failed_upload_all_cb = (CheckBox) findViewById(R.id.failed_upload_headline_cb);
failed_upload_all_cb.setOnCheckedChangeListener(getCheckAllListener());
listView = (LinearLayout) findViewById(R.id.failed_upload_scrollviewlayout);
loadListView(true);
}
/**
* init the listview with ImageButtons, checkboxes and filename for every
* Image that was not successfully uploaded
*
* this method is call at Activity creation and on delete one ore more
* list-entry an on retry the upload by clicking the ImageButton or by click
* to the 'retry all' button
*
*/
private void loadListView(boolean reset) {
DbHandler db = new DbHandler(getApplicationContext());
Cursor c = db.getFailedFiles();
if (reset) {
fileList = new SparseArray<String>();
listView.removeAllViews();
lastLoadImageIdx = 0;
}
if (c != null) {
try {
c.moveToPosition(lastLoadImageIdx);
while (c.moveToNext()) {
lastLoadImageIdx++;
String imp_path = c.getString(1);
String message = c.getString(4);
fileList.put(lastLoadImageIdx, imp_path);
LinearLayout rowLayout = getHorizontalLinearLayout(lastLoadImageIdx);
rowLayout.addView(getFileCheckbox(lastLoadImageIdx));
rowLayout.addView(getImageButton(imp_path, lastLoadImageIdx));
rowLayout.addView(getFileButton(imp_path, message, lastLoadImageIdx));
listView.addView(rowLayout);
Log_OC.d(LOG_TAG, imp_path + " on idx: " + lastLoadImageIdx);
if (lastLoadImageIdx % MAX_LOAD_IMAGES == 0) {
break;
}
}
if (lastLoadImageIdx > 0) {
addLoadMoreButton(listView);
}
} finally {
db.close();
}
}
}
private void addLoadMoreButton(LinearLayout listView) {
if (listView != null) {
Button loadmoreBtn = null;
View oldButton = listView.findViewById(42);
if (oldButton != null) {
// remove existing button
listView.removeView(oldButton);
// to add the button at the end
loadmoreBtn = (Button) oldButton;
} else {
// create a new button to add to the scoll view
loadmoreBtn = new Button(this);
loadmoreBtn.setId(42);
loadmoreBtn.setText(getString(R.string.failed_upload_load_more_images));
loadmoreBtn.setBackgroundResource(R.color.background_color);
loadmoreBtn.setTextSize(12);
loadmoreBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
loadListView(false);
}
});
}
listView.addView(loadmoreBtn);
}
}
/**
* provide a list of CheckBox instances, looked up from parent listview this
* list ist used to select/deselect all checkboxes at the list
*
* @return List<CheckBox>
*/
private List<CheckBox> getCheckboxList() {
List<CheckBox> list = new ArrayList<CheckBox>();
for (int i = 0; i < listView.getChildCount(); i++) {
Log_OC.d(LOG_TAG, "ListView has Childs: " + listView.getChildCount());
View childView = listView.getChildAt(i);
if (childView != null && childView instanceof ViewGroup) {
View checkboxView = getChildViews((ViewGroup) childView);
if (checkboxView != null && checkboxView instanceof CheckBox) {
Log_OC.d(LOG_TAG, "found Child: " + checkboxView.getId() + " " + checkboxView.getClass());
list.add((CheckBox) checkboxView);
}
}
}
return list;
}
/**
* recursive called method, used from getCheckboxList method
*
* @param View
* @return View
*/
private View getChildViews(ViewGroup view) {
if (view != null) {
for (int i = 0; i < view.getChildCount(); i++) {
View cb = view.getChildAt(i);
if (cb != null && cb instanceof ViewGroup) {
return getChildViews((ViewGroup) cb);
} else if (cb instanceof CheckBox) {
return cb;
}
}
}
return null;
}
/**
* create a new OnCheckedChangeListener for the 'check all' checkbox *
*
* @return OnCheckedChangeListener to select all checkboxes at the list
*/
private OnCheckedChangeListener getCheckAllListener() {
return new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
List<CheckBox> list = getCheckboxList();
for (CheckBox checkbox : list) {
((CheckBox) checkbox).setChecked(isChecked);
}
}
};
}
/**
* Button click Listener for the retry button at the headline
*
* @return a Listener to perform a retry for all selected images
*/
private OnClickListener getRetryListner() {
return new OnClickListener() {
@Override
public void onClick(View v) {
try {
List<CheckBox> list = getCheckboxList();
for (CheckBox checkbox : list) {
boolean to_retry = checkbox.isChecked();
Log_OC.d(LOG_TAG, "Checkbox for " + checkbox.getId() + " was checked: " + to_retry);
String img_path = fileList.get(checkbox.getId());
if (to_retry) {
final String msg = "Image-Path " + checkbox.getId() + " was checked: " + img_path;
Log_OC.d(LOG_TAG, msg);
startUpload(img_path);
}
}
} finally {
// refresh the List
listView.removeAllViews();
loadListView(true);
if (failed_upload_all_cb != null) {
failed_upload_all_cb.setChecked(false);
}
}
}
};
}
/**
* Button click Listener for the delete button at the headline
*
* @return a Listener to perform a delete for all selected images
*/
private OnClickListener getDeleteListner() {
return new OnClickListener() {
@Override
public void onClick(View v) {
final DbHandler dbh = new DbHandler(getApplicationContext());
try {
List<CheckBox> list = getCheckboxList();
for (CheckBox checkbox : list) {
boolean to_be_delete = checkbox.isChecked();
Log_OC.d(LOG_TAG, "Checkbox for " + checkbox.getId() + " was checked: " + to_be_delete);
String img_path = fileList.get(checkbox.getId());
Log_OC.d(LOG_TAG, "Image-Path " + checkbox.getId() + " was checked: " + img_path);
if (to_be_delete) {
boolean deleted = dbh.removeIUPendingFile(img_path);
Log_OC.d(LOG_TAG, "removing " + checkbox.getId() + " was : " + deleted);
}
}
} finally {
dbh.close();
// refresh the List
listView.removeAllViews();
loadListView(true);
if (failed_upload_all_cb != null) {
failed_upload_all_cb.setChecked(false);
}
}
}
};
}
private LinearLayout getHorizontalLinearLayout(int id) {
LinearLayout linearLayout = new LinearLayout(getApplicationContext());
linearLayout.setId(id);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
linearLayout.setGravity(Gravity.RIGHT);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
return linearLayout;
}
private LinearLayout getVerticalLinearLayout() {
LinearLayout linearLayout = new LinearLayout(getApplicationContext());
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
linearLayout.setGravity(Gravity.TOP);
linearLayout.setOrientation(LinearLayout.VERTICAL);
return linearLayout;
}
private View getFileButton(final String img_path, String message, int id) {
TextView failureTextView = new TextView(this);
failureTextView.setText(getString(R.string.failed_upload_failure_text) + message);
failureTextView.setBackgroundResource(R.color.background_color);
failureTextView.setTextSize(8);
failureTextView.setOnLongClickListener(getOnLongClickListener(message));
failureTextView.setPadding(5, 5, 5, 10);
TextView retryButton = new TextView(this);
retryButton.setId(id);
retryButton.setText(img_path);
retryButton.setBackgroundResource(R.color.background_color);
retryButton.setTextSize(8);
retryButton.setOnClickListener(getImageButtonOnClickListener(img_path));
retryButton.setOnLongClickListener(getOnLongClickListener(message));
retryButton.setPadding(5, 5, 5, 10);
LinearLayout verticalLayout = getVerticalLinearLayout();
verticalLayout.addView(retryButton);
verticalLayout.addView(failureTextView);
return verticalLayout;
}
private OnLongClickListener getOnLongClickListener(final String message) {
return new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log_OC.d(LOG_TAG, message);
Toast toast = Toast.makeText(InstantUploadActivity.this, getString(R.string.failed_upload_retry_text)
+ message, Toast.LENGTH_LONG);
toast.show();
return true;
}
};
}
private CheckBox getFileCheckbox(int id) {
CheckBox retryCB = new CheckBox(this);
retryCB.setId(id);
retryCB.setBackgroundResource(R.color.background_color);
retryCB.setTextSize(8);
retryCB.setTag(retry_chexbox_tag);
return retryCB;
}
private ImageButton getImageButton(String img_path, int id) {
ImageButton imageButton = new ImageButton(this);
imageButton.setId(id);
imageButton.setClickable(true);
imageButton.setOnClickListener(getImageButtonOnClickListener(img_path));
// scale and add a thumbnail to the imagebutton
int base_scale_size = 32;
if (img_path != null) {
Log_OC.d(LOG_TAG, "add " + img_path + " to Image Button");
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(img_path, options);
int width_tpm = options.outWidth, height_tmp = options.outHeight;
int scale = 3;
while (true) {
if (width_tpm / 2 < base_scale_size || height_tmp / 2 < base_scale_size) {
break;
}
width_tpm /= 2;
height_tmp /= 2;
scale++;
}
Log_OC.d(LOG_TAG, "scale Imgae with: " + scale);
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inSampleSize = scale;
bitmap = BitmapFactory.decodeFile(img_path, options2);
if (bitmap != null) {
Log_OC.d(LOG_TAG, "loaded Bitmap Bytes: " + bitmap.getRowBytes());
imageButton.setImageBitmap(bitmap);
} else {
Log_OC.d(LOG_TAG, "could not load imgage: " + img_path);
}
}
return imageButton;
}
private OnClickListener getImageButtonOnClickListener(final String img_path) {
return new OnClickListener() {
@Override
public void onClick(View v) {
startUpload(img_path);
loadListView(true);
}
};
}
/**
* start uploading a file to the INSTANT_UPLOD_DIR
*
* @param img_path
*/
private void startUpload(String img_path) {
// extract filename
String filename = FileStorageUtils.getInstantUploadFilePath(this, img_path);
if (canInstantUpload()) {
Account account = AccountUtils.getCurrentOwnCloudAccount(InstantUploadActivity.this);
// add file again to upload queue
DbHandler db = new DbHandler(InstantUploadActivity.this);
try {
db.updateFileState(img_path, DbHandler.UPLOAD_STATUS_UPLOAD_LATER, null);
} finally {
db.close();
}
Intent i = new Intent(InstantUploadActivity.this, FileUploader.class);
i.putExtra(FileUploader.KEY_ACCOUNT, account);
i.putExtra(FileUploader.KEY_LOCAL_FILE, img_path);
i.putExtra(FileUploader.KEY_REMOTE_FILE, filename);
i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
i.putExtra(com.owncloud.android.files.services.FileUploader.KEY_INSTANT_UPLOAD, true);
final String msg = "try to upload file with name :" + filename;
Log_OC.d(LOG_TAG, msg);
Toast toast = Toast.makeText(InstantUploadActivity.this, getString(R.string.failed_upload_retry_text)
+ filename, Toast.LENGTH_LONG);
toast.show();
startService(i);
} else {
Toast toast = Toast.makeText(InstantUploadActivity.this,
getString(R.string.failed_upload_retry_do_nothing_text) + filename, Toast.LENGTH_LONG);
toast.show();
}
}
private boolean canInstantUpload() {
if (!InstantUploadBroadcastReceiver.isOnline(this)
|| (InstantUploadBroadcastReceiver.instantPictureUploadViaWiFiOnly(this) && !InstantUploadBroadcastReceiver
.isConnectedViaWiFi(this))) {
return false;
} else {
return true;
}
}
}