along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<manifest package="com.owncloud.android"
- android:versionCode="10600200"
- android:versionName="1.6.2" xmlns:android="http://schemas.android.com/apk/res/android">
+ android:versionCode="10700000"
+ android:versionName="1.7.0" 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" />
android:name=".ui.activity.Preferences"
android:theme="@style/Theme.ownCloud" >
</activity>
- <activity android:name=".ui.activity.PreferencesNewSessionewSession" >
- </activity>
-
+
<activity
android:name=".ui.preview.PreviewImageActivity"
/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.owncloud.android.workaround.accounts"
- android:versionCode="0100020"
- android:versionName="1.0.20" >
+ android:versionCode="0100021"
+ android:versionName="1.0.21" >
<uses-sdk
android:minSdkVersion="16"
-Subproject commit e87f5f25ad91950d47ec9b6fa01401360cd7ec8d
+Subproject commit 2f178c9c34e3dab507c46e718705913ed44db3c5
android:layout_weight="1" >
<android.support.v4.widget.SwipeRefreshLayout
- android:id="@+id/swipe_refresh_files"
+ android:id="@+id/swipe_containing_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
- android:footerDividersEnabled="false" >
+ android:footerDividersEnabled="false"
+ android:visibility="visible" >
- <third_parties.in.srain.cube.GridViewWithHeaderAndFooter
+ <com.owncloud.android.ui.ExtendedListView
android:id="@+id/list_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:visibility="visible" />
+
+ </android.support.v4.widget.SwipeRefreshLayout>
+
+ <android.support.v4.widget.SwipeRefreshLayout
+ android:id="@+id/swipe_containing_grid"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:footerDividersEnabled="false"
+ android:visibility="gone" >
+
+ <third_parties.in.srain.cube.GridViewWithHeaderAndFooter
+ android:id="@+id/grid_root"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:columnWidth="100dp"
android:gravity="center"
android:horizontalSpacing="2dp"
android:visibility="visible" />
</android.support.v4.widget.SwipeRefreshLayout>
-
+
<android.support.v4.widget.SwipeRefreshLayout
- android:id="@+id/swipe_refresh_files_emptyView"
+ android:id="@+id/swipe_containing_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" >
<string name="saml_authentication_wrong_pass">كلمة مرور خاطئة</string>
<string name="folder_picker_choose_button_text">اختيار</string>
<string name="prefs_category_security">الأمان</string>
- <string name="shared_subject_header">مُشارك</string>
</resources>
<string name="prefs_category_accounts">Hesablar</string>
<string name="prefs_add_account">Hesab əlavə et</string>
<string name="saml_authentication_wrong_pass">Yalnış şifrə</string>
- <string name="shared_subject_header">yayımlanmış</string>
</resources>
<string name="folder_picker_choose_button_text">বেছে নিন</string>
<string name="move_file_not_found">সরাতে ব্যার্থ হলো। ফাইলটি রয়েছে কিনা দেখুন।</string>
<string name="prefs_category_security">নিরাপত্তা</string>
- <string name="shared_subject_header">ভাগাভাগিকৃত</string>
</resources>
<string name="saml_authentication_wrong_pass">Contrasenya incorrecta</string>
<string name="folder_picker_choose_button_text">Escull</string>
<string name="prefs_category_security">Seguretat</string>
- <string name="shared_subject_header">compartit</string>
</resources>
<string name="prefs_category_security">Zabezpečení</string>
<string name="prefs_instant_video_upload_path_title">Cesta pro nahrávání videí</string>
<string name="download_folder_failed_content">Stažení adresáře %1$s nemohlo být dokončeno</string>
- <string name="shared_subject_header">sdílené</string>
- <string name="with_you_subject_header">s vámi</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Sikkerhed</string>
<string name="prefs_instant_video_upload_path_title">Sti til videoupload</string>
<string name="download_folder_failed_content">Download af %1$s mappe kunne ikke fuldføres</string>
- <string name="shared_subject_header">delt</string>
- <string name="with_you_subject_header">med dig</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Sicherheit</string>
<string name="prefs_instant_video_upload_path_title">Verzeichnis zum Hochladen der Videos</string>
<string name="download_folder_failed_content">Herunterladen des %1$s - Ordners konnte nicht abgeschlossen werden</string>
- <string name="shared_subject_header">geteilt</string>
- <string name="with_you_subject_header">Mit Ihnen</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Sicherheit</string>
<string name="prefs_instant_video_upload_path_title">Verzeichnis zum Hochladen der Videos</string>
<string name="download_folder_failed_content">Herunterladen des %1$s - Ordners konnte nicht abgeschlossen werden</string>
- <string name="shared_subject_header">geteilt</string>
- <string name="with_you_subject_header">Mit Dir</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Ασφάλεια</string>
<string name="prefs_instant_video_upload_path_title">Διαδρομή Μεταφόρτωσης Βίντεο</string>
<string name="download_folder_failed_content">Η λήψη του φακέλου %1$s δεν ολοκληρώθηκε με επιτυχία.</string>
- <string name="shared_subject_header">μοιρασμένο </string>
- <string name="with_you_subject_header">με εσένα</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<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 %2$s >>%3$s<< %4$s</string>
</resources>
<string name="saml_authentication_wrong_pass">Malĝusta pasvorto</string>
<string name="folder_picker_choose_button_text">Elekti</string>
<string name="prefs_category_security">Sekuro</string>
- <string name="shared_subject_header">kunhavigita</string>
</resources>
<string name="saml_authentication_wrong_pass">Clave incorrecta</string>
<string name="folder_picker_choose_button_text">Elegir</string>
<string name="prefs_category_security">Seguridad</string>
- <string name="shared_subject_header">compartido</string>
</resources>
<string name="saml_authentication_wrong_pass">Contraseña incorrecta</string>
<string name="folder_picker_choose_button_text">Seleccionar</string>
<string name="prefs_category_security">Seguridad</string>
- <string name="shared_subject_header">compartido</string>
</resources>
<string name="forbidden_permissions_move">selle faili liigutamiseks</string>
<string name="prefs_category_instant_uploading">Kohesed üleslaadimised</string>
<string name="prefs_category_security">Turvalisus</string>
- <string name="shared_subject_header">jagatud</string>
</resources>
<string name="saml_authentication_wrong_pass">رمز عبور اشتباه است</string>
<string name="folder_picker_choose_button_text">انتخاب کردن</string>
<string name="prefs_category_security">امنیت</string>
- <string name="shared_subject_header">اشتراک گذاشته شده</string>
</resources>
<string name="move_file_error">Tämän tiedoston tai kansion siirtoa yrittäessä tapahtui virhe</string>
<string name="prefs_category_instant_uploading">Välittömät lähetykset</string>
<string name="prefs_category_security">Tietoturva</string>
- <string name="shared_subject_header">jaettu</string>
- <string name="with_you_subject_header">kanssasi</string>
</resources>
<string name="actionbar_move">Mozgatás</string>
<string name="folder_picker_choose_button_text">Válasszon</string>
<string name="prefs_category_security">Biztonság</string>
- <string name="shared_subject_header">Megosztott</string>
</resources>
<string name="forbidden_permissions_move">untuk memindahkan berkas ini</string>
<string name="prefs_category_instant_uploading">Unggah Cepat</string>
<string name="prefs_category_security">Keamanan</string>
- <string name="shared_subject_header">dibagikan</string>
</resources>
<string name="prefs_category_security">Protezione</string>
<string name="prefs_instant_video_upload_path_title">Percorso di caricamento video</string>
<string name="download_folder_failed_content">Lo scaricamento della cartella %1$s non può essere completato</string>
- <string name="shared_subject_header">condiviso</string>
- <string name="with_you_subject_header">con te</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">セキュリティ</string>
<string name="prefs_instant_video_upload_path_title">動画のアップロードパス</string>
<string name="download_folder_failed_content">%1$s のフォルダのダウンロードが完了しませんでした。</string>
- <string name="shared_subject_header">共有中</string>
- <string name="with_you_subject_header">あなたと</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">보안</string>
<string name="prefs_instant_video_upload_path_title">동영상 업로드 경로</string>
<string name="download_folder_failed_content">%1$s 폴더를 다운로드할 수 없습니다</string>
- <string name="shared_subject_header">공유됨</string>
- <string name="with_you_subject_header">나와</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="saml_authentication_wrong_pass">Neteisingas slaptažodis</string>
<string name="folder_picker_choose_button_text">Pasirinkite</string>
<string name="prefs_category_security">Saugumas</string>
- <string name="shared_subject_header">bendrinamas</string>
</resources>
<string name="saml_authentication_wrong_pass">Погрешна лозинка</string>
<string name="folder_picker_choose_button_text">Избери</string>
<string name="prefs_category_security">Безбедност</string>
- <string name="shared_subject_header">споделен</string>
</resources>
<string name="prefs_category_security">Beveiliging</string>
<string name="prefs_instant_video_upload_path_title">Upload Video Pad</string>
<string name="download_folder_failed_content">Download van %1$s map kon niet worden voltooid</string>
- <string name="shared_subject_header">gedeeld</string>
- <string name="with_you_subject_header">met u</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
+ <string name="subject_token">%1$s deelde \"%2$s\" met u</string>
</resources>
<string name="prefs_category_security">Segurança</string>
<string name="prefs_instant_video_upload_path_title">Enviar o Caminho do Vídeo</string>
<string name="download_folder_failed_content">Baixar %1$s da pasta não pode ser completado</string>
- <string name="shared_subject_header">compartilhado</string>
- <string name="with_you_subject_header">com você</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Безопасность</string>
<string name="prefs_instant_video_upload_path_title">Путь для загрузки Видео</string>
<string name="download_folder_failed_content">Загрузка папки %1$s не может быть завершена</string>
- <string name="shared_subject_header">общие</string>
- <string name="with_you_subject_header">с вами</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Zabezpečenie</string>
<string name="prefs_instant_video_upload_path_title">Cesta pre nahrávanie videí</string>
<string name="download_folder_failed_content">Sťahovanie %1$s priečinka nebolo dokončené</string>
- <string name="shared_subject_header">zdieľané</string>
- <string name="with_you_subject_header">s vami</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="saml_authentication_wrong_pass">Fjalëkalim i gabuar</string>
<string name="folder_picker_choose_button_text">Zgjidh</string>
<string name="prefs_category_security">Siguria</string>
- <string name="shared_subject_header">Ndarë</string>
</resources>
<string name="prefs_category_instant_uploading">Direktuppladning</string>
<string name="prefs_category_security">Säkerhet</string>
<string name="prefs_instant_video_upload_path_title">Uppladdnings-sökväg för video</string>
- <string name="shared_subject_header">delad</string>
- <string name="with_you_subject_header">med dig</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
</resources>
<string name="prefs_category_security">Güvenlik</string>
<string name="prefs_instant_video_upload_path_title">Video Yükleme Yolu</string>
<string name="download_folder_failed_content">%1$s klasörün indirilmesi tamamlanamadı</string>
- <string name="shared_subject_header">paylaşılan</string>
- <string name="with_you_subject_header">sizinle</string>
- <string name="subject_token">%1$s %2$s >>%3$s<< %4$s</string>
+ <string name="subject_token">%1$s sizinle \"%2$s\" paylaştı</string>
</resources>
<string name="empty"></string>
<string name="prefs_category_accounts">ھېساباتلار</string>
<string name="prefs_category_security">بىخەتەرلىك</string>
- <string name="shared_subject_header">ھەمبەھىرلەنگەن</string>
</resources>
<string name="prefs_category_security">安全</string>
<string name="prefs_instant_video_upload_path_title">视频上传路径</string>
<string name="download_folder_failed_content">%1$s 文件夹的下载无法完成</string>
- <string name="shared_subject_header">分享</string>
</resources>
<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 %2$s >>%3$s<< %4$s</string>
+ <string name="subject_token">%1$s shared \"%2$s\" with you</string>
</resources>
dismissDialog(WAIT_DIALOG_TAG);\r
if (result.isIdPRedirection()) {
- String url = result.getRedirectedLocation();\r
String targetUrl = mServerInfo.mBaseUrl \r
+ AccountUtils.getWebdavPath(mServerInfo.mVersion, mAuthTokenType);\r
\r
// Show dialog\r
- SamlWebViewDialog dialog = SamlWebViewDialog.newInstance(url, targetUrl); \r
+ SamlWebViewDialog dialog = SamlWebViewDialog.newInstance(targetUrl, targetUrl); \r
dialog.show(getSupportFragmentManager(), SAML_DIALOG_TAG);\r
\r
mAuthStatusIcon = 0;\r
/* ownCloud Android client application
- * Copyright (C) 2012-2013 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,
view.setVisibility(View.GONE);
CookieManager cookieManager = CookieManager.getInstance();
final String cookies = cookieManager.getCookie(url);
- Log_OC.d(TAG, "Cookies: " + cookies);
+ //Log_OC.d(TAG, "Cookies: " + cookies);
if (mListenerHandler != null && mListenerRef != null) {
// this is good idea because onPageFinished is not running in the UI thread
mListenerHandler.post(new Runnable() {
}
}
-
- @Override
- public void doUpdateVisitedHistory (WebView view, String url, boolean isReload) {
- Log_OC.d(TAG, "doUpdateVisitedHistory : " + url);
- }
-
@Override
public void onReceivedSslError (final WebView view, final SslErrorHandler handler, SslError error) {
- Log_OC.d(TAG, "onReceivedSslError : " + error);
+ Log_OC.e(TAG, "onReceivedSslError : " + error);
// Test 1
X509Certificate x509Certificate = getX509CertificateFromError(error);
boolean isKnownServer = false;
if (x509Certificate != null) {
- Log_OC.d(TAG, "------>>>>> x509Certificate " + x509Certificate.toString());
-
try {
isKnownServer = NetworkUtils.isCertInKnownServersStore((Certificate) x509Certificate, mContext);
} catch (Exception e) {
((AuthenticatorActivity)mContext).createAuthenticationDialog(view, handler);
}
- @Override
- public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
- Log_OC.d(TAG, "shouldInterceptRequest : " + url);
- return null;
- }
-
- @Override
- public void onLoadResource (WebView view, String url) {
- Log_OC.d(TAG, "onLoadResource : " + url);
- }
-
- @Override
- public void onReceivedLoginRequest (WebView view, String realm, String account, String args) {
- Log_OC.d(TAG, "onReceivedLoginRequest : " + realm + ", " + account + ", " + args);
- }
-
- @Override
- public void onScaleChanged (WebView view, float oldScale, float newScale) {
- Log_OC.d(TAG, "onScaleChanged : " + oldScale + " -> " + newScale);
- super.onScaleChanged(view, oldScale, newScale);
- }
-
- @Override
- public void onUnhandledKeyEvent (WebView view, KeyEvent event) {
- Log_OC.d(TAG, "onUnhandledKeyEvent : " + event);
- }
-
- @Override
- public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
- Log_OC.d(TAG, "shouldOverrideKeyEvent : " + event);
- return false;
- }
}
@Override
public void onCreate() {
super.onCreate();
+ Log_OC.d(TAG, "Creating service");
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- HandlerThread thread = new HandlerThread("FileDownloaderThread",
- Process.THREAD_PRIORITY_BACKGROUND);
+ HandlerThread thread = new HandlerThread("FileDownloaderThread", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper, this);
mBinder = new FileDownloaderBinder();
}
+
+ /**
+ * Service clean up
+ */
+ @Override
+ public void onDestroy() {
+ Log_OC.v(TAG, "Destroying service" );
+ mBinder = null;
+ mServiceHandler = null;
+ mServiceLooper.quit();
+ mServiceLooper = null;
+ mNotificationManager = null;
+ super.onDestroy();
+ }
+
+
/**
* Entry point to add one or several files to the queue of downloads.
*
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
+ Log_OC.d(TAG, "Starting command with id " + startId);
+
if ( !intent.hasExtra(EXTRA_ACCOUNT) ||
!intent.hasExtra(EXTRA_FILE)
) {
Iterator<String> it = requestedDownloads.iterator();
while (it.hasNext()) {
String next = it.next();
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Handling download file " + next);*/
mService.downloadFile(next);
}
}
+ Log_OC.d(TAG, "Stopping after command with id " + msg.arg1);
mService.stopSelf(msg.arg1);
}
}
@Override
public void onCreate() {
super.onCreate();
- Log_OC.i(TAG, "mPendingUploads size:" + mPendingUploads.size());
+ Log_OC.d(TAG, "Creating service");
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
HandlerThread thread = new HandlerThread("FileUploaderThread", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
}
/**
+ * Service clean up
+ */
+ @Override
+ public void onDestroy() {
+ Log_OC.v(TAG, "Destroying service" );
+ mBinder = null;
+ mServiceHandler = null;
+ mServiceLooper.quit();
+ mServiceLooper = null;
+ mNotificationManager = null;
+ super.onDestroy();
+ }
+
+
+ /**
* Entry point to add one or several files to the queue of uploads.
*
* New uploads are added calling to startService(), resulting in a call to
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
+ Log_OC.d(TAG, "Starting command with id " + startId);
+
if (!intent.hasExtra(KEY_ACCOUNT) || !intent.hasExtra(KEY_UPLOAD_TYPE)
|| !(intent.hasExtra(KEY_LOCAL_FILE) || intent.hasExtra(KEY_FILE))) {
Log_OC.e(TAG, "Not enough information provided in intent");
mService.uploadFile(it.next());
}
}
+ Log_OC.d(TAG, "Stopping command after id " + msg.arg1);
mService.stopSelf(msg.arg1);
}
}
if (file!=null) {
mSendIntent.putExtra(Intent.EXTRA_TEXT, share.getShareLink());
mSendIntent.putExtra(Intent.EXTRA_SUBJECT, String.format(mContext.getString(R.string.subject_token),
- getClient().getCredentials().getUsername(), mContext.getString(R.string.shared_subject_header),
- file.getFileName(), mContext.getString(R.string.with_you_subject_header)));
+ getClient().getCredentials().getUsername(), file.getFileName()));
file.setPublicLink(share.getShareLink());
file.setShareByLink(true);
getStorageManager().saveFile(file);
*/
private void startContentSynchronizations(List<SyncOperation> filesToSyncContents, OwnCloudClient client)
throws OperationCancelledException {
-
+
+ Log_OC.v(TAG, "Starting content synchronization... ");
RemoteOperationResult contentsResult = null;
for (SyncOperation op: filesToSyncContents) {
if (mCancellationRequested.get()) {
@Override
public void onCreate() {
super.onCreate();
+ Log_OC.d(TAG, "Creating service");
+
/// First worker thread for most of operations
HandlerThread thread = new HandlerThread("Operations thread", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- // WIP: for the moment, only SYNC_FOLDER and CANCEL_SYNC_FOLDER is expected here;
+ Log_OC.d(TAG, "Starting command with id " + startId);
+
+ // WIP: for the moment, only SYNC_FOLDER is expected here;
// the rest of the operations are requested through the Binder
if (ACTION_SYNC_FOLDER.equals(intent.getAction())) {
- /*Log_OC.v("NOW " + TAG + ", thread " + Thread.currentThread().getName(), "Received request to sync folder");*/
-
if (!intent.hasExtra(EXTRA_ACCOUNT) || !intent.hasExtra(EXTRA_REMOTE_PATH)) {
Log_OC.e(TAG, "Not enough information provided in intent");
return START_NOT_STICKY;
Message msg = mSyncFolderHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = itemSyncKey;
- /*Log_OC.v(
- "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Sync folder " + remotePath + " added to queue"
- );*/
mSyncFolderHandler.sendMessage(msg);
}
@Override
public void onDestroy() {
- //Log_OC.wtf(TAG, "onDestroy init" );
+ Log_OC.v(TAG, "Destroying service" );
// Saving cookies
try {
OwnCloudClientManagerFactory.getDefaultSingleton().
e.printStackTrace();
}
- //Log_OC.wtf(TAG, "Clear mUndispatchedFinishedOperations" );
mUndispatchedFinishedOperations.clear();
-
- //Log_OC.wtf(TAG, "onDestroy end" );
+
+ mOperationsBinder = null;
+
+ mOperationsHandler.getLooper().quit();
+ mOperationsHandler = null;
+
+ mSyncFolderHandler.getLooper().quit();
+ mSyncFolderHandler = null;
+
super.onDestroy();
}
* @param file A folder in the queue of pending synchronizations
*/
public void cancel(Account account, OCFile file) {
- /*Log_OC.v(
- "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Received request to cancel folder " + file.getRemotePath()
- );*/
mSyncFolderHandler.cancel(account, file);
}
@Override
public void handleMessage(Message msg) {
nextOperation();
+ Log_OC.d(TAG, "Stopping after command with id " + msg.arg1);
mService.stopSelf(msg.arg1);
}
@Override
public void handleMessage(Message msg) {
Pair<Account, String> itemSyncKey = (Pair<Account, String>) msg.obj;
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Handling sync folder " + itemSyncKey.second);*/
doOperation(itemSyncKey.first, itemSyncKey.second);
+ Log_OC.d(TAG, "Stopping after command with id " + msg.arg1);
mService.stopSelf(msg.arg1);
}
*/
private void doOperation(Account account, String remotePath) {
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Getting sync folder " + remotePath);*/
mCurrentSyncOperation = mPendingOperations.get(account, remotePath);
if (mCurrentSyncOperation != null) {
mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
getClientFor(ocAccount, mService);
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Executing sync folder " + remotePath);*/
result = mCurrentSyncOperation.execute(mOwnCloudClient, mStorageManager);
} catch (AccountsException e) {
} catch (IOException e) {
Log_OC.e(TAG, "Error while trying to get authorization", e);
} finally {
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Removing payload " + remotePath);*/
-
mPendingOperations.removePayload(account, remotePath);
mService.dispatchResultToOperationListeners(null, mCurrentSyncOperation, result);
Log_OC.e(TAG, "Cannot cancel with NULL parameters");
return;
}
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Removing sync folder " + file.getRemotePath());*/
Pair<SynchronizeFolderOperation, String> removeResult =
mPendingOperations.remove(account, file.getRemotePath());
SynchronizeFolderOperation synchronization = removeResult.first;
if (synchronization != null) {
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Canceling returned sync of " + file.getRemotePath());*/
synchronization.cancel();
} else {
// TODO synchronize?
if (mCurrentSyncOperation != null && mCurrentAccount != null &&
mCurrentSyncOperation.getRemotePath().startsWith(file.getRemotePath()) &&
account.name.equals(mCurrentAccount.name)) {
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Canceling current sync as descendant: " + mCurrentSyncOperation.getRemotePath());*/
mCurrentSyncOperation.cancel();
- } else {
- /*Log_OC.v( "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
- "Nothing else in cancelation of " + file.getRemotePath());*/
}
}
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012 Bartek Przybylski
+ * 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,
+ * 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;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.widget.ListView;
+
+import com.owncloud.android.lib.common.utils.Log_OC;
+
+/**
+ * ListView allowing to specify the position of an item that should be centered in the visible area, if possible.
+ *
+ * The cleanest way I found to overcome the problem due to getHeight() returns 0 until the view is really drawn.
+ *
+ * @author David A. Velasco
+ */
+public class ExtendedListView extends ListView {
+
+ private static final String TAG = ExtendedListView.class.getSimpleName();
+
+ private int mPositionToSetAndCenter = 0;
+
+ public ExtendedListView(Context context) {
+ super(context);
+ }
+
+ public ExtendedListView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public ExtendedListView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ *
+ */
+ @Override
+ protected void onDraw (Canvas canvas) {
+ super.onDraw(canvas);
+ if (mPositionToSetAndCenter > 0) {
+ Log_OC.v(TAG, "Centering around position " + mPositionToSetAndCenter);
+ this.setSelectionFromTop(mPositionToSetAndCenter, getHeight() / 2);
+ mPositionToSetAndCenter = 0;
+ }
+ }
+
+ /**
+ * Public method to set the position of the item that should be centered in the visible area of the view.
+ *
+ * The position is saved here and checked in onDraw().
+ *
+ * @param position Position (in the list of items) of the item to center in the visible area.
+ */
+ public void setAndCenterSelection(int position) {
+ mPositionToSetAndCenter = position;
+ }
+
+}
\ No newline at end of file
setNavigationListWithFolder(file);
if (!stateWasRecovered) {
- Log_OC.e(TAG, "Initializing Fragments in onAccountChanged..");
+ Log_OC.d(TAG, "Initializing Fragments in onAccountChanged..");
initFragmentsWithFile();
if (file.isFolder()) {
startSyncFolderOperation(file, false);
}
private void startSynchronization() {
- Log_OC.e(TAG, "Got to start sync");
+ Log_OC.d(TAG, "Got to start sync");
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
- Log_OC.e(TAG, "Canceling all syncs for " + MainApp.getAuthority());
+ Log_OC.d(TAG, "Canceling all syncs for " + MainApp.getAuthority());
ContentResolver.cancelSync(null, MainApp.getAuthority()); // cancel the current synchronizations of any ownCloud account
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
- Log_OC.e(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority());
+ Log_OC.d(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority());
ContentResolver.requestSync(
getAccount(),
MainApp.getAuthority(), bundle);
} else {
- Log_OC.e(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority() + " with new API");
+ Log_OC.d(TAG, "Requesting sync for " + getAccount().name + " at " + MainApp.getAuthority() + " with new API");
SyncRequest.Builder builder = new SyncRequest.Builder();
builder.setSyncAdapter(getAccount(), MainApp.getAuthority());
builder.setExpedited(true);
} finally {
if (filepath == null) {
- Log_OC.e(TAG, "Couldnt resolve path to file");
+ Log_OC.e(TAG, "Couldn't resolve path to file");
Toast t = Toast.makeText(this, getString(R.string.filedisplay_unexpected_bad_get_content), Toast.LENGTH_LONG);
t.show();
return;
@Override
protected void onSaveInstanceState(Bundle outState) {
// responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved
- Log_OC.e(TAG, "onSaveInstanceState() start");
+ Log_OC.d(TAG, "onSaveInstanceState() start");
super.onSaveInstanceState(outState);
outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress);
@Override
protected void onResume() {
super.onResume();
- Log_OC.e(TAG, "onResume() start");
+ Log_OC.d(TAG, "onResume() start");
// refresh list of files
refreshListOfFilesFragment();
@Override
protected void onPause() {
- Log_OC.e(TAG, "onPause() start");
+ Log_OC.d(TAG, "onPause() start");
if (mSyncBroadcastReceiver != null) {
unregisterReceiver(mSyncBroadcastReceiver);
//LocalBroadcastManager.getInstance(this).unregisterReceiver(mSyncBroadcastReceiver);
import android.view.LayoutInflater;\r
import android.view.View;\r
import android.view.ViewGroup;\r
+import android.widget.AbsListView;\r
import android.widget.BaseAdapter;\r
import android.widget.GridView;\r
import android.widget.ImageView;\r
private FileDataStorageManager mStorageManager;\r
private Account mAccount;\r
private ComponentsGetter mTransferServiceGetter;\r
+ private boolean mGridMode;\r
\r
private enum ViewType {LIST_ITEM, GRID_IMAGE, GRID_ITEM };\r
\r
\r
// initialise thumbnails cache on background thread\r
new ThumbnailsCacheManager.InitDiskCacheTask().execute();\r
+\r
+ mGridMode = false;\r
}\r
\r
@Override\r
@Override\r
public View getView(int position, View convertView, ViewGroup parent) {\r
\r
- boolean fileView = DisplayUtils.decideViewLayout(mFiles);\r
-\r
View view = convertView;\r
OCFile file = null;\r
LayoutInflater inflator = (LayoutInflater) mContext\r
\r
// Find out which layout should be displayed\r
ViewType viewType;\r
- if (!fileView){\r
+ if (!mGridMode){\r
viewType = ViewType.LIST_ITEM;\r
} else if (file.isImage()){\r
viewType = ViewType.GRID_IMAGE;\r
fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
\r
if (!file.isFolder()) {\r
- GridView parentList = (GridView)parent;\r
- if (parentList.getChoiceMode() == GridView.CHOICE_MODE_NONE) {\r
+ AbsListView parentList = (AbsListView)parent;\r
+ if (parentList.getChoiceMode() == AbsListView.CHOICE_MODE_NONE) {\r
checkBoxV.setVisibility(View.GONE);\r
} else {\r
if (parentList.isItemChecked(position)) {\r
return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(),\r
DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);\r
}\r
+\r
+ public void setGridMode(boolean gridMode) {\r
+ mGridMode = gridMode;\r
+ }\r
}\r
lastModV.setVisibility(View.VISIBLE);
lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.lastModified()));
- GridViewWithHeaderAndFooter parentList = (GridViewWithHeaderAndFooter)parent;
+ ListView parentList = (ListView) parent;
if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) {
checkBoxV.setVisibility(View.GONE);
} else {
* @return New dialog instance, ready to show.
*/
public static SamlWebViewDialog newInstance(String url, String targetUrl) {
- Log_OC.d(TAG, "New instance");
SamlWebViewDialog fragment = new SamlWebViewDialog();
Bundle args = new Bundle();
args.putString(ARG_INITIAL_URL, url);
public SamlWebViewDialog() {
super();
- Log_OC.d(TAG, "constructor");
}
@Override
public void onAttach(Activity activity) {
- Log_OC.d(TAG, "onAttach");
+ Log_OC.v(TAG, "onAttach");
super.onAttach(activity);
try {
mSsoWebViewClientListener = (SsoWebViewClientListener) activity;
@SuppressLint("SetJavaScriptEnabled")
@Override
public void onCreate(Bundle savedInstanceState) {
- Log_OC.d(TAG, "onCreate, savedInstanceState is " + savedInstanceState);
+ Log_OC.v(TAG, "onCreate, savedInstanceState is " + savedInstanceState);
super.onCreate(savedInstanceState);
setRetainInstance(true);
@SuppressLint("SetJavaScriptEnabled")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- Log_OC.d(TAG, "onCreateView, savedInsanceState is " + savedInstanceState);
+ Log_OC.v(TAG, "onCreateView, savedInsanceState is " + savedInstanceState);
// Inflate layout of the dialog
RelativeLayout ssoRootView = (RelativeLayout) inflater.inflate(R.layout.sso_dialog, container, false); // null parent view because it will go in the dialog layout
mSsoWebView.setFocusableInTouchMode(true);
mSsoWebView.setClickable(true);
- CookieManager cookieManager = CookieManager.getInstance();
- cookieManager.setAcceptCookie(true);
- cookieManager.removeAllCookie();
- mSsoWebView.loadUrl(mInitialUrl);
-
WebSettings webSettings = mSsoWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(false);
webSettings.setSavePassword(false);
webSettings.setUserAgentString(OwnCloudClient.USER_AGENT);
webSettings.setSaveFormData(false);
+
+ CookieManager cookieManager = CookieManager.getInstance();
+ cookieManager.setAcceptCookie(true);
+ cookieManager.removeAllCookie();
+
+ mSsoWebView.loadUrl(mInitialUrl);
}
mWebViewClient.setTargetUrl(mTargetUrl);
@Override
public void onSaveInstanceState(Bundle outState) {
- Log_OC.d(TAG, "onSaveInstanceState being CALLED");
+ Log_OC.v(TAG, "onSaveInstanceState being CALLED");
super.onSaveInstanceState(outState);
// save URLs
@Override
public void onDestroyView() {
- Log_OC.d(TAG, "onDestroyView");
+ Log_OC.v(TAG, "onDestroyView");
if ((ViewGroup)mSsoWebView.getParent() != null) {
((ViewGroup)mSsoWebView.getParent()).removeView(mSsoWebView);
Dialog dialog = getDialog();
if ((dialog != null)) {
dialog.setOnDismissListener(null);
- //dialog.dismiss();
- //dialog.setDismissMessage(null);
}
super.onDestroyView();
@Override
public void onDestroy() {
- Log_OC.d(TAG, "onDestroy");
+ Log_OC.v(TAG, "onDestroy");
super.onDestroy();
}
@Override
public void onDetach() {
- Log_OC.d(TAG, "onDetach");
+ Log_OC.v(TAG, "onDetach");
mSsoWebViewClientListener = null;
mWebViewClient = null;
super.onDetach();
@Override
public void onStart() {
- Log_OC.d(TAG, "onStart");
+ Log_OC.v(TAG, "onStart");
super.onStart();
}
@Override
public void onStop() {
- Log_OC.d(TAG, "onStop");
+ Log_OC.v(TAG, "onStop");
super.onStop();
}
@Override
public void onResume() {
- Log_OC.d(TAG, "onResume");
+ Log_OC.v(TAG, "onResume");
super.onResume();
mSsoWebView.onResume();
}
@Override
public void onPause() {
- Log_OC.d(TAG, "onPause");
+ Log_OC.v(TAG, "onPause");
mSsoWebView.onPause();
super.onPause();
}
@Override
public int show (FragmentTransaction transaction, String tag) {
- Log_OC.d(TAG, "show (transaction)");
+ Log_OC.v(TAG, "show (transaction)");
return super.show(transaction, tag);
}
@Override
public void show (FragmentManager manager, String tag) {
- Log_OC.d(TAG, "show (manager)");
+ Log_OC.v(TAG, "show (manager)");
super.show(manager, tag);
}
/* ownCloud Android client application
* Copyright (C) 2012 Bartek Przybylski
- * Copyright (C) 2012-2013 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,
import java.util.ArrayList;
+import android.content.Context;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import com.actionbarsherlock.app.SherlockFragment;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.utils.Log_OC;
-import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
+import com.owncloud.android.ui.ExtendedListView;
import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
+import com.owncloud.android.ui.adapter.FileListListAdapter;
+
+import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
/**
* TODO extending SherlockListFragment instead of SherlockFragment
private static final String KEY_HEIGHT_CELL = "HEIGHT_CELL";
private static final String KEY_EMPTY_LIST_MESSAGE = "EMPTY_LIST_MESSAGE";
- private SwipeRefreshLayout mRefreshLayout;
+ private SwipeRefreshLayout mRefreshListLayout;
+ private SwipeRefreshLayout mRefreshGridLayout;
private SwipeRefreshLayout mRefreshEmptyLayout;
private TextView mEmptyListMessage;
private OnEnforceableRefreshListener mOnRefreshListener = null;
- protected GridViewWithHeaderAndFooter imageView;
-
- public void setListAdapter(ListAdapter listAdapter) {
- imageView.setAdapter(listAdapter);
- imageView.invalidate();
- }
+ protected AbsListView mCurrentListView;
+ private ExtendedListView mListView;
+ private View mListFooterView;
+ private GridViewWithHeaderAndFooter mGridView;
+ private View mGridFooterView;
- public GridView getGridView() {
- return imageView;
- }
+ private ListAdapter mAdapter;
- public void setFooterView(View footer) {
- imageView.addFooterView(footer, null, false);
- imageView.invalidate();
- }
- public void removeFooterView(View footer) {
- imageView.removeFooterView(footer);
- imageView.invalidate();
+ protected void setListAdapter(ListAdapter listAdapter) {
+ mAdapter = listAdapter;
+ mCurrentListView.setAdapter(listAdapter);
+ mCurrentListView.invalidate();
}
- public int getFooterViewCount() {
- return imageView.getFooterViewCount();
+ protected AbsListView getListView() {
+ return mCurrentListView;
}
-
- protected void switchImageView(){
- imageView.setNumColumns(GridView.AUTO_FIT);
- imageView.invalidateRowHeight(); // Force to recalculate mRowHeight of imageView
- imageView.invalidate();
+
+
+ protected void switchToGridView() {
+ if ((mCurrentListView == mListView)) {
+
+ mListView.setAdapter(null);
+ mRefreshListLayout.setVisibility(View.GONE);
+
+ if (mAdapter instanceof FileListListAdapter) {
+ ((FileListListAdapter) mAdapter).setGridMode(true);
+ }
+ mGridView.setAdapter(mAdapter);
+ mRefreshGridLayout.setVisibility(View.VISIBLE);
+
+ mCurrentListView = mGridView;
+ }
}
- protected void switchFileView(){
- imageView.setNumColumns(1);
- imageView.invalidate();
+ protected void switchToListView() {
+ if (mCurrentListView == mGridView) {
+ mGridView.setAdapter(null);
+ mRefreshGridLayout.setVisibility(View.GONE);
+
+ if (mAdapter instanceof FileListListAdapter) {
+ ((FileListListAdapter) mAdapter).setGridMode(false);
+ }
+ mListView.setAdapter(mAdapter);
+ mRefreshListLayout.setVisibility(View.VISIBLE);
+
+ mCurrentListView = mListView;
+ }
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- Log_OC.e(TAG, "onCreateView");
+ Log_OC.d(TAG, "onCreateView");
View v = inflater.inflate(R.layout.list_fragment, null);
-
- imageView = (GridViewWithHeaderAndFooter)(v.findViewById(R.id.list_root));
- imageView.setOnItemClickListener(this);
+
+ mListView = (ExtendedListView)(v.findViewById(R.id.list_root));
+ mListView.setOnItemClickListener(this);
+ mListFooterView = inflater.inflate(R.layout.list_footer, null, false);
+
+ mGridView = (GridViewWithHeaderAndFooter) (v.findViewById(R.id.grid_root));
+ mGridView.setNumColumns(GridView.AUTO_FIT);
+ mGridView.setOnItemClickListener(this);
+ mGridFooterView = inflater.inflate(R.layout.list_footer, null, false);
if (savedInstanceState != null) {
int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION);
- setReferencePosition(referencePosition);
+ if (mCurrentListView == mListView) {
+ Log_OC.v(TAG, "Setting and centering around list position " + referencePosition);
+ mListView.setAndCenterSelection(referencePosition);
+ } else {
+ Log_OC.v(TAG, "Setting grid position " + referencePosition);
+ mGridView.setSelection(referencePosition);
+ }
}
- // Pull down refresh
- mRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh_files);
- mRefreshEmptyLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh_files_emptyView);
+ // Pull-down to refresh layout
+ mRefreshListLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_containing_list);
+ mRefreshGridLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_containing_grid);
+ mRefreshEmptyLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_containing_empty);
mEmptyListMessage = (TextView) v.findViewById(R.id.empty_list_view);
- onCreateSwipeToRefresh(mRefreshLayout);
+ onCreateSwipeToRefresh(mRefreshListLayout);
+ onCreateSwipeToRefresh(mRefreshGridLayout);
onCreateSwipeToRefresh(mRefreshEmptyLayout);
- imageView.setEmptyView(mRefreshEmptyLayout);
-
+ mListView.setEmptyView(mRefreshEmptyLayout);
+ mGridView.setEmptyView(mRefreshEmptyLayout);
+
+ mCurrentListView = mListView; // list as default
+
return v;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
- Log_OC.e(TAG, "onSaveInstanceState()");
+ Log_OC.d(TAG, "onSaveInstanceState()");
savedInstanceState.putInt(KEY_SAVED_LIST_POSITION, getReferencePosition());
savedInstanceState.putIntegerArrayList(KEY_INDEXES, mIndexes);
savedInstanceState.putIntegerArrayList(KEY_FIRST_POSITIONS, mFirstPositions);
* reposition the visible items in the list when the device is turned to
* other position.
*
- * THe current policy is take as a reference the visible item in the center
+ * The current policy is take as a reference the visible item in the center
* of the screen.
*
* @return The position in the list of the visible item in the center of the
* screen.
*/
protected int getReferencePosition() {
- if (imageView != null) {
- return (imageView.getFirstVisiblePosition() + imageView.getLastVisiblePosition()) / 2;
+ if (mCurrentListView != null) {
+ return (mCurrentListView.getFirstVisiblePosition() + mCurrentListView.getLastVisiblePosition()) / 2;
} else {
return 0;
}
}
- /**
- * Sets the visible part of the list from the reference position.
- *
- * @param position Reference position previously returned by
- * {@link LocalFileListFragment#getReferencePosition()}
- */
- protected void setReferencePosition(int position) {
- if (imageView != null) {
- imageView.setSelection(position);
- }
- }
-
/*
* Restore index and position
// needs to be checked; not every browse-up had a browse-down before
int index = mIndexes.remove(mIndexes.size() - 1);
-
- int firstPosition = mFirstPositions.remove(mFirstPositions.size() -1);
-
+ final int firstPosition = mFirstPositions.remove(mFirstPositions.size() -1);
int top = mTops.remove(mTops.size() - 1);
-
- imageView.smoothScrollToPosition(firstPosition);
-
- // Move the scroll if the selection is not visible
- int indexPosition = mHeightCell*index;
- int height = imageView.getHeight();
-
- if (indexPosition > height) {
- imageView.smoothScrollToPosition(index);
+
+ Log_OC.v(TAG, "Setting selection to position: " + firstPosition + "; top: " + top + "; index: " + index);
+
+ if (mCurrentListView == mListView) {
+ if (mHeightCell*index <= mListView.getHeight()) {
+ mListView.setSelectionFromTop(firstPosition, top);
+ } else {
+ mListView.setSelectionFromTop(index, 0);
+ }
+
+ } else {
+ if (mHeightCell*index <= mGridView.getHeight()) {
+ mGridView.setSelection(firstPosition);
+ //mGridView.smoothScrollToPosition(firstPosition);
+ } else {
+ mGridView.setSelection(index);
+ //mGridView.smoothScrollToPosition(index);
+ }
}
+
}
}
mIndexes.add(index);
- int firstPosition = imageView.getFirstVisiblePosition();
+ int firstPosition = mCurrentListView.getFirstVisiblePosition();
mFirstPositions.add(firstPosition);
- View view = imageView.getChildAt(0);
+ View view = mCurrentListView.getChildAt(0);
int top = (view == null) ? 0 : view.getTop() ;
mTops.add(top);
@Override
public void onRefresh() {
- // to be @overriden
- mRefreshLayout.setRefreshing(false);
+ mRefreshListLayout.setRefreshing(false);
+ mRefreshGridLayout.setRefreshing(false);
mRefreshEmptyLayout.setRefreshing(false);
-
+
if (mOnRefreshListener != null) {
mOnRefreshListener.onRefresh();
}
/**
- * Enables swipe gesture
+ * Disables swipe gesture.
+ *
+ * Sets the 'enabled' state of the refresh layouts contained in the fragment.
+ *
+ * When 'false' is set, prevents user gestures but keeps the option to refresh programatically,
+ *
+ * @param enabled Desired state for capturing swipe gesture.
*/
- public void enableSwipe() {
- mRefreshLayout.setEnabled(true);
- }
-
- /**
- * Disables swipe gesture. It prevents manual gestures but keeps the option you show
- * refreshing programmatically.
- */
- public void disableSwipe() {
- mRefreshLayout.setEnabled(false);
- }
-
- /**
- * It shows the SwipeRefreshLayout progress
- */
- public void showSwipeProgress() {
- mRefreshLayout.setRefreshing(true);
- }
-
- /**
- * It shows the SwipeRefreshLayout progress
- */
- public void hideSwipeProgress() {
- mRefreshLayout.setRefreshing(false);
+ public void setSwipeEnabled(boolean enabled) {
+ mRefreshListLayout.setEnabled(enabled);
+ mRefreshGridLayout.setEnabled(enabled);
+ mRefreshEmptyLayout.setEnabled(enabled);
}
/**
@Override
public void onRefresh(boolean ignoreETag) {
- mRefreshLayout.setRefreshing(false);
+ mRefreshListLayout.setRefreshing(false);
+ mRefreshGridLayout.setRefreshing(false);
mRefreshEmptyLayout.setRefreshing(false);
if (mOnRefreshListener != null) {
mOnRefreshListener.onRefresh(ignoreETag);
}
}
+
+
+ protected void setChoiceMode(int choiceMode) {
+ mListView.setChoiceMode(choiceMode);
+ mGridView.setChoiceMode(choiceMode);
+ }
+
+ protected void registerForContextMenu() {
+ registerForContextMenu(mListView);
+ registerForContextMenu(mGridView);
+ mListView.setOnCreateContextMenuListener(this);
+ mGridView.setOnCreateContextMenuListener(this);
+ }
+
+ /**
+ * TODO doc
+ * To be called before setAdapter, or GridViewWithHeaderAndFooter will throw an exception
+ *
+ * @param enabled
+ */
+ protected void setFooterEnabled(boolean enabled) {
+ if (enabled) {
+ if (mGridView.getFooterViewCount() == 0) {
+ if (mGridFooterView.getParent() != null ) {
+ ((ViewGroup) mGridFooterView.getParent()).removeView(mGridFooterView);
+ }
+ mGridView.addFooterView(mGridFooterView, null, false);
+ }
+ mGridFooterView.invalidate();
+
+ if (mListView.getFooterViewsCount() == 0) {
+ if (mListFooterView.getParent() != null ) {
+ ((ViewGroup) mListFooterView.getParent()).removeView(mListFooterView);
+ }
+ mListView.addFooterView(mListFooterView, null, false);
+ }
+ mListFooterView.invalidate();
+
+ } else {
+ mGridView.removeFooterView(mGridFooterView);
+ mListView.removeFooterView(mListFooterView);
+ }
+ }
+
+ /**
+ * TODO doc
+ * @param text
+ */
+ protected void setFooterText(String text) {
+ if (text != null && text.length() > 0) {
+ ((TextView)mListFooterView.findViewById(R.id.footerText)).setText(text);
+ ((TextView)mGridFooterView.findViewById(R.id.footerText)).setText(text);
+ setFooterEnabled(true);
+
+ } else {
+ setFooterEnabled(false);
+ }
+ }
+
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log_OC.i(TAG, "onCreateView() start");
View v = super.onCreateView(inflater, container, savedInstanceState);
- getGridView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- disableSwipe(); // Disable pull refresh
+ setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+ setSwipeEnabled(false); // Disable pull-to-refresh
setMessageForEmptyList(getString(R.string.local_file_list_empty));
Log_OC.i(TAG, "onCreateView() end");
return v;
- }
+ }
/**
} else { /// Click on a file
ImageView checkBoxV = (ImageView) v.findViewById(R.id.custom_checkbox);
if (checkBoxV != null) {
- if (getGridView().isItemChecked(position)) {
+ if (getListView().isItemChecked(position)) {
checkBoxV.setImageResource(android.R.drawable.checkbox_on_background);
} else {
checkBoxV.setImageResource(android.R.drawable.checkbox_off_background);
directory = directory.getParentFile();
}
- imageView.clearChoices(); // by now, only files in the same directory will be kept as selected
+ mCurrentListView.clearChoices(); // by now, only files in the same directory will be kept as selected
mAdapter.swapDirectory(directory);
if (mDirectory == null || !mDirectory.equals(directory)) {
- imageView.setSelection(0);
+ mCurrentListView.setSelection(0);
}
mDirectory = directory;
}
*/
public String[] getCheckedFilePaths() {
ArrayList<String> result = new ArrayList<String>();
- SparseBooleanArray positions = imageView.getCheckedItemPositions();
+ SparseBooleanArray positions = mCurrentListView.getCheckedItemPositions();
if (positions.size() > 0) {
for (int i = 0; i < positions.size(); i++) {
if (positions.get(positions.keyAt(i)) == true) {
- result.add(((File) imageView.getItemAtPosition(positions.keyAt(i))).getAbsolutePath());
+ result.add(((File) mCurrentListView.getItemAtPosition(positions.keyAt(i))).getAbsolutePath());
}
}
/**
* Callback method invoked when a directory is clicked by the user on the files list
*
- * @param file
+ * @param directory
*/
public void onDirectoryClick(File directory);
package com.owncloud.android.ui.fragment;
import java.io.File;
-import java.util.Vector;
import android.app.Activity;
-import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.TextView;
-import android.view.LayoutInflater;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.ui.preview.PreviewMediaFragment;
-import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
/**
private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE";
+ private final static Double THUMBNAIL_THRESHOLD = 0.5;
+
private FileFragment.ContainerActivity mContainerActivity;
private OCFile mFile = null;
private FileListListAdapter mAdapter;
- private View mFooterView;
+ private boolean mJustFolders;
private OCFile mTargetFile;
mFile = savedInstanceState.getParcelable(KEY_FILE);
}
- mFooterView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
- R.layout.list_footer, null, false);
- setFooterView(mFooterView);
+ if (mJustFolders) {
+ setFooterEnabled(false);
+ } else {
+ setFooterEnabled(true);
+ }
Bundle args = getArguments();
- boolean justFolders = (args == null) ? false : args.getBoolean(ARG_JUST_FOLDERS, false);
+ mJustFolders = (args == null) ? false : args.getBoolean(ARG_JUST_FOLDERS, false);
mAdapter = new FileListListAdapter(
- justFolders,
+ mJustFolders,
getSherlockActivity(),
mContainerActivity
);
setListAdapter(mAdapter);
-
- registerForContextMenu(getGridView());
- getGridView().setOnCreateContextMenuListener(this);
+
+ registerForContextMenu();
}
-
+
/**
* Saves the current listed folder.
*/
mAdapter.swapDirectory(directory, storageManager);
if (mFile == null || !mFile.equals(directory)) {
- imageView.setSelection(0);
+ mCurrentListView.setSelection(0);
}
mFile = directory;
- Vector<OCFile> files = storageManager.getFolderContent(directory);
- // Update Footer
- TextView footerText = (TextView) mFooterView.findViewById(R.id.footerText);
- footerText.setText(generateFooterText(directory));
- if (DisplayUtils.decideViewLayout(files)){
- switchImageView();
- } else {
- switchFileView();
- }
+ updateLayout();
+
}
}
-
- private String generateFooterText(OCFile directory) {
- Integer files = 0;
- Integer folders = 0;
- FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
- Vector<OCFile> mFiles = storageManager.getFolderContent(mFile);
+ private void updateLayout() {
+ if (!mJustFolders) {
+ int filesCount = 0, foldersCount = 0, imagesCount = 0;
+ int count = mAdapter.getCount();
+ OCFile file;
+ for (int i=0; i < count ; i++) {
+ file = (OCFile) mAdapter.getItem(i);
+ if (file.isFolder()) {
+ foldersCount++;
+ } else {
+ filesCount++;
+ if (file.isImage()){
+ imagesCount++;
+ }
+ }
+ }
+ // set footer text
+ setFooterText(generateFooterText(filesCount, foldersCount));
- for (OCFile ocFile : mFiles) {
- if (ocFile.isFolder()) {
- folders++;
+ // decide grid vs list view
+ if (((double)imagesCount / (double)filesCount) >= THUMBNAIL_THRESHOLD) {
+ switchToGridView();
} else {
- files++;
+ switchToListView();
}
}
+ }
+ private String generateFooterText(int filesCount, int foldersCount) {
String output = "";
-
- if (files > 0){
- if (files == 1) {
- output = output + files.toString() + " " + getResources().getString(R.string.file_list_file);
+ if (filesCount > 0){
+ if (filesCount == 1) {
+ output = output + filesCount + " " + getResources().getString(R.string.file_list_file);
} else {
- output = output + files.toString() + " " + getResources().getString(R.string.file_list_files);
+ output = output + filesCount + " " + getResources().getString(R.string.file_list_files);
}
}
- if (folders > 0 && files > 0){
+ if (foldersCount > 0 && filesCount > 0){
output = output + ", ";
}
- if (folders == 1) {
- output = output + folders.toString() + " " + getResources().getString(R.string.file_list_folder);
- } else if (folders > 1) {
- output = output + folders.toString() + " " + getResources().getString(R.string.file_list_folders);
+ if (foldersCount == 1) {
+ output = output + foldersCount + " " + getResources().getString(R.string.file_list_folder);
+ } else if (foldersCount > 1) {
+ output = output + foldersCount + " " + getResources().getString(R.string.file_list_folders);
}
- // Fix for showing or not to show the footerView
- if (folders == 0 && files == 0) { // If no files or folders, remove footerView for allowing
- // to show the emptyList message
- removeFooterView(mFooterView);
- } else { // set a new footerView if there is not one for showing the number or files/folders
- if (getFooterViewCount()== 0) {
- ((ViewGroup)mFooterView.getParent()).removeView(mFooterView);
- setFooterView(mFooterView);
- }
- }
-
return output;
}
-
+
+
public void sortByName(boolean descending) {
mAdapter.setSortOrder(FileStorageUtils.SORT_NAME, descending);
}
\r
private static final String[] sizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };\r
\r
- private final static Double THUMBNAIL_THRESHOLD = 0.5;\r
-\r
private static HashMap<String, String> mimeType2HUmanReadable;\r
static {\r
mimeType2HUmanReadable = new HashMap<String, String>();\r
return path;\r
}\r
\r
- /**\r
- *\r
- * @param mFiles\r
- * @return true: imageView, false: listView\r
- */\r
- public static boolean decideViewLayout(Vector<OCFile> mFiles){\r
- // decide image vs. file view\r
- double countImages = 0;\r
- double countFiles = 0;\r
-\r
- for (OCFile file : mFiles){\r
- if (!file.isFolder()){\r
- countFiles++;\r
-\r
- if (file.isImage()){\r
- countImages++;\r
- }\r
- }\r
- }\r
-\r
- if ((countImages / countFiles) >= THUMBNAIL_THRESHOLD){\r
- return true;\r
- } else {\r
- return false;\r
- }\r
- }\r
}\r
package third_parties.in.srain.cube;
- import android.annotation.TargetApi;
- import android.content.Context;
- import android.database.DataSetObservable;
- import android.database.DataSetObserver;
- import android.os.Build;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.*;
-
- import java.lang.reflect.Field;
- import java.util.ArrayList;
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.database.DataSetObservable;
+import android.database.DataSetObserver;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.Filter;
+import android.widget.Filterable;
+import android.widget.FrameLayout;
+import android.widget.GridView;
+import android.widget.ListAdapter;
+import android.widget.WrapperListAdapter;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
/**
- * A {@link GridView} that supports adding header rows in a
+ * A {@link android.widget.GridView} that supports adding header rows in a
* very similar way to {@link android.widget.ListView}.
* See {@link GridViewWithHeaderAndFooter#addHeaderView(View, Object, boolean)}
* See {@link GridViewWithHeaderAndFooter#addFooterView(View, Object, boolean)}
public View view;
public ViewGroup viewContainer;
/**
- * The data backing the view. This is returned from {@link ListAdapter#getItem(int)}.
+ * The data backing the view. This is returned from {@link android.widget.ListAdapter#getItem(int)}.
*/
public Object data;
/**
if (lyp != null) {
v.setLayoutParams(new FrameLayout.LayoutParams(lyp.width, lyp.height));
- fl.setLayoutParams(new AbsListView.LayoutParams(lyp.width, lyp.height));
+ fl.setLayoutParams(new LayoutParams(lyp.width, lyp.height));
}
fl.addView(v);
info.view = v;
if (lyp != null) {
v.setLayoutParams(new FrameLayout.LayoutParams(lyp.width, lyp.height));
- fl.setLayoutParams(new AbsListView.LayoutParams(lyp.width, lyp.height));
+ fl.setLayoutParams(new LayoutParams(lyp.width, lyp.height));
}
fl.addView(v);
info.view = v;
}
int mColumnWidth = getColumnWidthCompatible();
View view = getAdapter().getView(numColumns * mHeaderViewInfos.size(), mViewForMeasureRowHeight, this);
- AbsListView.LayoutParams p = (AbsListView.LayoutParams) view.getLayoutParams();
+ LayoutParams p = (LayoutParams) view.getLayoutParams();
if (p == null) {
- p = new AbsListView.LayoutParams(-1, -2, 0);
+ p = new LayoutParams(-1, -2, 0);
view.setLayoutParams(p);
}
int childHeightSpec = getChildMeasureSpec(
mDataSetObservable.notifyChanged();
}
}
+
+
+ /**
+ * Sets the selected item and positions the selection y pixels from the top edge of the ListView.
+ * (If in touch mode, the item will not be selected but it will still be positioned appropriately.)
+ *
+ * @param position Index (starting at 0) of the data item to be selected.
+ * @param y The distance from the top edge of the ListView (plus padding)
+ * that the item will be positioned.
+ *
+ * @see <a href="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/widget/ListView.java#ListView.setSelectionFromTop%28int%2Cint%29">Original code</a>
+ */
+ public void setSelectionFromTop(int position, int y) {
+ if (getAdapter() == null) {
+ return;
+ }
+
+ setSelection(position);
+ //setSelectionInt(position);
+
+ /*if (!isInTouchMode()) {
+ position = super.lookForSelectablePosition(position, true);
+ if (position >= 0) {
+ setNextSelectedPositionInt(position);
+ }
+ } else {
+ mResurrectToPosition = position;
+ }*/
+
+ /*
+ if (position >= 0) {
+ mLayoutMode = LAYOUT_SPECIFIC;
+ mSpecificTop = mListPadding.top + y;
+
+ if (mNeedSync) {
+ mSyncPosition = position;
+ mSyncRowId = getAdapter().getItemId(position);
+ }
+
+ if (mPositionScroller != null) {
+ mPositionScroller.stop();
+ }
+
+ requestLayout();
+ }
+ */
+ }
+
}