Fixed preview of images in Android 2.x ; fixed synchronization progress indicator in Android <4.0

This commit is contained in:
David A. Velasco 2012-06-27 09:19:08 +02:00
parent 91225458c1
commit 3ce234e6c7
5 changed files with 93 additions and 65 deletions

View file

@ -18,7 +18,7 @@
-->
<manifest package="eu.alefzero.owncloud"
android:versionCode="1"
android:versionName="0.1.134B" xmlns:android="http://schemas.android.com/apk/res/android">
android:versionName="0.1.135B" 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" />

View file

@ -68,6 +68,21 @@ public class AccountUtils {
return defaultAccount;
}
/**
* Checks, whether or not there are any ownCloud accounts setup.
*
* @return true, if there is at least one account.
*/
public static boolean accountsAreSetup(Context context) {
AccountManager accMan = AccountManager.get(context);
Account[] accounts = accMan
.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
return accounts.length > 0;
}
public static void setCurrentOwnCloudAccount(Context context, String name) {
SharedPreferences.Editor appPrefs = PreferenceManager
.getDefaultSharedPreferences(context).edit();

View file

@ -18,10 +18,7 @@
package eu.alefzero.owncloud.ui.activity;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import android.accounts.Account;
@ -37,18 +34,15 @@ import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.EditText;
import android.widget.TextView;
@ -81,16 +75,17 @@ import eu.alefzero.webdav.WebdavClient;
*/
public class FileDisplayActivity extends SherlockFragmentActivity implements
OnNavigationListener, OnClickListener, android.view.View.OnClickListener {
OnNavigationListener, OnClickListener, android.view.View.OnClickListener {
private ArrayAdapter<String> mDirectories;
private DataStorageManager mStorageManager;
private FileListFragment mFileList;
private OCFile mCurrentDir;
private String[] mDirs = null;
private SyncBroadcastReceiver syncBroadcastRevceiver;
private DataStorageManager mStorageManager;
private SyncBroadcastReceiver syncBroadcastReceiver;
private View mLayoutView = null;
private FileListFragment mFileList;
private static final String KEY_DIR_ARRAY = "DIR_ARRAY";
private static final String KEY_CURRENT_DIR = "DIR";
@ -98,39 +93,37 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
private static final int DIALOG_SETUP_ACCOUNT = 0;
private static final int DIALOG_CREATE_DIR = 1;
private static final int DIALOG_ABOUT_APP = 2;
private static final int ACTION_SELECT_FILE = 1;
//private static final int ACTION_CREATE_FIRST_ACCOUNT = 2; dvelasco: WIP
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(getClass().toString(), "onCreate() start");
super.onCreate(savedInstanceState);
// TODO: fix hack: workaround for bug in actionbar sherlock
// it always shows indeterminate progress bar
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(false);
}
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setSupportProgressBarIndeterminateVisibility(false);
Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));
if(savedInstanceState != null){
mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR);
mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR); // this is never saved with this key :S
}
if (findViewById(R.id.file_list_view) == null)
mLayoutView = getLayoutInflater().inflate(R.layout.files, null); // always inflate this at onCreate() ; just once!
mLayoutView = getLayoutInflater().inflate(R.layout.files, null); // always inflate this at onCreate() ; just once!
//TODO: Dialog useless -> get rid of this
if (!accountsAreSetup()) {
if (AccountUtils.accountsAreSetup(this)) {
setContentView(mLayoutView);
} else {
setContentView(R.layout.no_account_available);
setProgressBarIndeterminateVisibility(false);
getSupportActionBar().setNavigationMode(ActionBar.DISPLAY_SHOW_TITLE);
findViewById(R.id.setup_account).setOnClickListener(this);
} else if (findViewById(R.id.file_list_view) == null) {
setContentView(mLayoutView);
}
Log.i(getClass().toString(), "onCreate() end");
}
@Override
@ -199,8 +192,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
* Called, when the user selected something for uploading
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == ACTION_SELECT_FILE) {
if (requestCode == ACTION_SELECT_FILE) {
if (resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
String filemanagerstring = selectedImageUri.getPath();
@ -234,7 +227,13 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
startService(i);
}
}
}/* dvelasco: WIP - not working as expected ... yet :)
else if (requestCode == ACTION_CREATE_FIRST_ACCOUNT) {
if (resultCode != RESULT_OK) {
finish(); // the user cancelled the AuthenticatorActivity
}
}*/
}
@Override
@ -255,6 +254,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i(getClass().toString(), "onRestoreInstanceState() start");
super.onRestoreInstanceState(savedInstanceState);
mDirs = savedInstanceState.getStringArray(KEY_DIR_ARRAY);
mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
@ -263,10 +263,12 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
for (String s : mDirs)
mDirectories.insert(s, 0);
mCurrentDir = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);
Log.i(getClass().toString(), "onRestoreInstanceState() end");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i(getClass().toString(), "onSaveInstanceState() start");
super.onSaveInstanceState(outState);
if(mDirectories != null && mDirectories.getCount() != 0){
mDirs = new String[mDirectories.getCount()-1];
@ -276,20 +278,30 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
}
outState.putStringArray(KEY_DIR_ARRAY, mDirs);
outState.putParcelable(FileDetailFragment.EXTRA_FILE, mCurrentDir);
Log.i(getClass().toString(), "onSaveInstanceState() end");
}
@Override
protected void onResume() {
Log.i(getClass().toString(), "onResume() start");
super.onResume();
if (accountsAreSetup()) {
if (!AccountUtils.accountsAreSetup(this)) {
/*Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);
intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });
//startActivity(intent);
startActivityForResult(intent, ACTION_CREATE_FIRST_ACCOUNT);*/
} else { // at least an account exist: normal operation
setContentView(mLayoutView); // this should solve the crash by repeated inflating in big screens (DROIDCLOUD-27)
// set the layout only if it couldn't be set in onCreate
if (findViewById(R.id.file_list_view) == null)
setContentView(mLayoutView);
// Listen for sync messages
IntentFilter syncIntentFilter = new IntentFilter(FileSyncService.SYNC_MESSAGE);
syncBroadcastRevceiver = new SyncBroadcastReceiver();
registerReceiver(syncBroadcastRevceiver, syncIntentFilter);
syncBroadcastReceiver = new SyncBroadcastReceiver();
registerReceiver(syncBroadcastReceiver, syncIntentFilter);
// Storage manager initialization
mStorageManager = new FileDataStorageManager(
@ -355,16 +367,19 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
// List dir here
mFileList.listDirectory(mCurrentDir);
}
Log.i(getClass().toString(), "onResume() end");
}
@Override
protected void onPause() {
Log.i(getClass().toString(), "onPause() start");
super.onPause();
if (syncBroadcastRevceiver != null) {
unregisterReceiver(syncBroadcastRevceiver);
syncBroadcastRevceiver = null;
if (syncBroadcastReceiver != null) {
unregisterReceiver(syncBroadcastReceiver);
syncBroadcastReceiver = null;
}
getIntent().putExtra(FileDetailFragment.EXTRA_FILE, mCurrentDir);
Log.i(getClass().toString(), "onPause() end");
}
@Override
@ -520,18 +535,6 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
return !mDirectories.isEmpty();
}
/**
* Checks, whether or not there are any ownCloud accounts setup.
*
* @return true, if there is at least one account.
*/
private boolean accountsAreSetup() {
AccountManager accMan = AccountManager.get(this);
Account[] accounts = accMan
.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
return accounts.length > 0;
}
private class DirectoryCreator implements Runnable {
private String mTargetPath;
private Account mAccount;
@ -598,12 +601,12 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
.getStringExtra(FileSyncService.ACCOUNT_NAME);
Log.d("FileDisplay", "sync of account " + account_name
+ " is in_progress: " + inProgress);
setProgressBarIndeterminateVisibility(inProgress);
setSupportProgressBarIndeterminateVisibility(inProgress);
if (!inProgress) {
FileListFragment fileListFramgent = (FileListFragment) getSupportFragmentManager()
FileListFragment fileListFragment = (FileListFragment) getSupportFragmentManager()
.findFragmentById(R.id.fileList);
if (fileListFramgent != null)
fileListFramgent.listDirectory();
if (fileListFragment != null)
fileListFragment.listDirectory();
}
}

View file

@ -203,9 +203,13 @@ public class FileDetailFragment extends SherlockFragment implements
if (mFile.getMimetype().startsWith("image/")) {
BitmapFactory.Options options = new Options();
options.inScaled = true;
options.inMutable = false;
options.inPreferQualityOverSpeed = false;
options.inPurgeable = true;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
options.inPreferQualityOverSpeed = false;
}
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
options.inMutable = false;
}
Bitmap bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options);
@ -224,6 +228,14 @@ public class FileDetailFragment extends SherlockFragment implements
} catch (OutOfMemoryError e) {
preview.setVisibility(View.INVISIBLE);
Log.e(TAG, "Out of memory occured for file with size " + mFile.getFileLength());
} catch (NoSuchFieldError e) {
preview.setVisibility(View.INVISIBLE);
Log.e(TAG, "Error from access to unexisting field despite protection " + mFile.getFileLength());
} catch (Throwable t) {
preview.setVisibility(View.INVISIBLE);
Log.e(TAG, "Unexpected error while creating image preview " + mFile.getFileLength());
}
downloadButton.setText(R.string.filedetails_open);
downloadButton.setOnClickListener(new OnClickListener() {

View file

@ -50,36 +50,40 @@ import eu.alefzero.owncloud.ui.adapter.FileListListAdapter;
*/
public class FileListFragment extends FragmentListView {
private static final String TAG = "FileListFragment";
//private Account mAccount; // dvelasco : the fragment is not recreated when other account is selected; keep as an attribute is dangerous
private Vector<OCFile> mFiles;
//private DataStorageManager mStorageManager; // dvelasco : just the same; it depends upon the current account ; it's updated in FileDisplayActivity!!
private OCFile mFile;
private boolean mIsLargeDevice = false;
private boolean mIsLargeDevice;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(getClass().toString(), "onCreate() start");
super.onCreate(savedInstanceState);
Intent intent = getActivity().getIntent();
OCFile directory = intent.getParcelableExtra(FileDetailFragment.EXTRA_FILE);
mFile = directory;
mIsLargeDevice = false;
Log.i(getClass().toString(), "onCreate() stop");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(getClass().toString(), "onCreateView() start");
super.onCreateView(inflater, container, savedInstanceState);
getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
getListView().setDividerHeight(1);
//listDirectory(mFile);
Log.i(getClass().toString(), "onCreateView() end");
return getListView();
}
@Override
public void onStart() {
Log.i(getClass().toString(), "onStart() start");
super.onStart();
// Create a placeholder upon launch
View fragmentContainer = getActivity().findViewById(R.id.file_details_container);
if (fragmentContainer != null) {
@ -88,7 +92,7 @@ public class FileListFragment extends FragmentListView {
transaction.replace(R.id.file_details_container, new FileDetailFragment(true));
transaction.commit();
}
super.onStart();
Log.i(getClass().toString(), "onStart() end");
}
@Override
@ -212,10 +216,4 @@ public class FileListFragment extends FragmentListView {
setListAdapter(new FileListListAdapter(directory, storageManager, getActivity()));
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("ACCOUNT", AccountUtils.getCurrentOwnCloudAccount(getActivity()));
}
}