-/* 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;
- }
- }
-
-}
\ No newline at end of file