From 9cce55b2fd5b03502ff81c626eb458e8ee2bdbf5 Mon Sep 17 00:00:00 2001 From: maxiaohong Date: Sat, 9 Dec 2017 17:52:59 +0800 Subject: [PATCH] Fixed the crash in some time open setting pager,Fixed some crash in google play,change sign-On login ui --- .gitignore | 1 + README.md | 2 +- .../seafile/seadroid2/SettingsManager.java | 12 +- .../seadroid2/data/StorageManager.java | 3 +- .../seadroid2/monitor/SeafileObserver.java | 12 +- .../seadroid2/transfer/UploadTask.java | 1 - .../ui/activity/MarkdownActivity.java | 2 +- .../seadroid2/ui/adapter/SeafItemAdapter.java | 9 +- .../seadroid2/ui/fragment/ReposFragment.java | 6 +- .../seafile/seadroid2/util/FileMimeUtils.java | 129 +++--------------- .../com/seafile/seadroid2/util/Utils.java | 18 ++- .../main/res/drawable-xhdpi/shibboleth.png | Bin 9909 -> 0 bytes app/src/main/res/values/dimens.xml | 4 +- app/src/main/res/values/strings.xml | 1 + build.gradle | 2 +- 15 files changed, 65 insertions(+), 137 deletions(-) delete mode 100644 app/src/main/res/drawable-xhdpi/shibboleth.png diff --git a/.gitignore b/.gitignore index e3e740471..aac5a753a 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ app/seed.txt out/ *.store +*.jks diff --git a/README.md b/README.md index 5f7712f03..85f6b7cce 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ You will get `app/build/outputs/apk/seafile-${versionName}.apk` after the build ### Prerequisites * Android Studio -* OpenJDK 7 / OracleJDK 7 +* OpenJDK 8 / OracleJDK 8 ### Import project diff --git a/app/src/main/java/com/seafile/seadroid2/SettingsManager.java b/app/src/main/java/com/seafile/seadroid2/SettingsManager.java index 768ede9b6..955aa483c 100644 --- a/app/src/main/java/com/seafile/seadroid2/SettingsManager.java +++ b/app/src/main/java/com/seafile/seadroid2/SettingsManager.java @@ -18,16 +18,17 @@ public final class SettingsManager { private static final String DEBUG_TAG = "SettingsManager"; - private static SettingsManager instance; - private static SharedPreferences.Editor editor; + private SharedPreferences settingsSharedPref; private static SharedPreferences sharedPref; + private static SharedPreferences.Editor editor; private SettingsManager() { + settingsSharedPref = PreferenceManager.getDefaultSharedPreferences(SeadroidApplication.getAppContext()); + sharedPref = SeadroidApplication.getAppContext().getSharedPreferences(AccountManager.SHARED_PREF_NAME, Context.MODE_PRIVATE); + editor = sharedPref.edit(); } - private SharedPreferences settingsSharedPref = PreferenceManager - .getDefaultSharedPreferences(SeadroidApplication.getAppContext()); // Account public static final String SETTINGS_ACCOUNT_INFO_KEY = "account_info_user_key"; @@ -98,12 +99,9 @@ public static SettingsManager instance() { synchronized (SettingsManager.class) { if (instance == null) { instance = new SettingsManager(); - sharedPref = SeadroidApplication.getAppContext().getSharedPreferences(AccountManager.SHARED_PREF_NAME, Context.MODE_PRIVATE); - editor = sharedPref.edit(); } } } - return instance; } diff --git a/app/src/main/java/com/seafile/seadroid2/data/StorageManager.java b/app/src/main/java/com/seafile/seadroid2/data/StorageManager.java index a358321fc..84f2fb708 100644 --- a/app/src/main/java/com/seafile/seadroid2/data/StorageManager.java +++ b/app/src/main/java/com/seafile/seadroid2/data/StorageManager.java @@ -18,7 +18,6 @@ import org.apache.commons.io.FileUtils; import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -247,7 +246,7 @@ public final void setStorageDir(int id) { } notifyAndroidGalleryDirectoryChange(FileUtils.listFiles(newMediaDir, null, true)); - } catch (IOException e) { + } catch (Exception e) { Log.e(DEBUG_TAG, "Could not move cache to new location", e); return; } diff --git a/app/src/main/java/com/seafile/seadroid2/monitor/SeafileObserver.java b/app/src/main/java/com/seafile/seadroid2/monitor/SeafileObserver.java index a5f1121d6..61f9b4e99 100644 --- a/app/src/main/java/com/seafile/seadroid2/monitor/SeafileObserver.java +++ b/app/src/main/java/com/seafile/seadroid2/monitor/SeafileObserver.java @@ -7,7 +7,6 @@ import com.seafile.seadroid2.data.DataManager; import com.seafile.seadroid2.data.SeafCachedFile; import com.seafile.seadroid2.data.SeafRepo; -import com.seafile.seadroid2.util.FileMimeUtils; import com.seafile.seadroid2.util.Utils; import org.apache.commons.io.monitor.FileAlterationListener; @@ -127,16 +126,13 @@ public void onFileChange(File file) { SeafCachedFile cachedFile = watchedFiles.get(path); if (cachedFile != null) { // office or txt file need to update file - String fileMime = FileMimeUtils.getFileMime(file); - boolean needUpdateFile = FileMimeUtils.isOfficeOrTextFile(fileMime); - // file size is change , - if (file.length() == cachedFile.fileOriginalSize && !needUpdateFile) { - Log.d(DEBUG_TAG, "ignore file size not change " + path); + boolean isTextFile = Utils.isTextFile(file); + //if file is not TextFile and file size not changed, do not update + if (file.length() == cachedFile.fileOriginalSize && !isTextFile) { return; - } else { - cachedFile.fileOriginalSize = file.length(); } + cachedFile.fileOriginalSize = file.length(); final SeafRepo repo = dataManager.getCachedRepoByID(cachedFile.repoID); if (repo != null && repo.canLocalDecrypt()) { listener.onCachedBlocksChanged(account, cachedFile, file, repo.encVersion); diff --git a/app/src/main/java/com/seafile/seadroid2/transfer/UploadTask.java b/app/src/main/java/com/seafile/seadroid2/transfer/UploadTask.java index 7ff6e54f9..146734c28 100644 --- a/app/src/main/java/com/seafile/seadroid2/transfer/UploadTask.java +++ b/app/src/main/java/com/seafile/seadroid2/transfer/UploadTask.java @@ -124,7 +124,6 @@ protected void onCancelled() { if (uploadStateListener != null) { uploadStateListener.onFileUploadCancelled(taskID); } - uploadStateListener.onFileUploadCancelled(taskID); } public String getDir() { diff --git a/app/src/main/java/com/seafile/seadroid2/ui/activity/MarkdownActivity.java b/app/src/main/java/com/seafile/seadroid2/ui/activity/MarkdownActivity.java index fd2585381..b0673dcf9 100644 --- a/app/src/main/java/com/seafile/seadroid2/ui/activity/MarkdownActivity.java +++ b/app/src/main/java/com/seafile/seadroid2/ui/activity/MarkdownActivity.java @@ -96,7 +96,7 @@ private void edit() { uri = Uri.parse(path); } - String mime = FileMimeUtils.getFileMime(new File(path)); + String mime = FileMimeUtils.getMimeType(new File(path)); editAsMarkDown.setDataAndType(uri, mime); if (pm.queryIntentActivities(editAsMarkDown, 0).size() > 0) { diff --git a/app/src/main/java/com/seafile/seadroid2/ui/adapter/SeafItemAdapter.java b/app/src/main/java/com/seafile/seadroid2/ui/adapter/SeafItemAdapter.java index fe842a80c..47a089f39 100644 --- a/app/src/main/java/com/seafile/seadroid2/ui/adapter/SeafItemAdapter.java +++ b/app/src/main/java/com/seafile/seadroid2/ui/adapter/SeafItemAdapter.java @@ -352,7 +352,14 @@ private void setFileView(SeafDirent dirent, Viewholder viewHolder, int position) if (repoName == null || repoID == null) return; - File file = dataManager.getLocalRepoFile(repoName, repoID, filePath); + File file = null; + try { + file = dataManager.getLocalRepoFile(repoName, repoID, filePath); + } catch (RuntimeException e) { + mActivity.showShortToast(mActivity, mActivity.getResources().getString(R.string.storage_space_insufficient)); + e.printStackTrace(); + return; + } boolean cacheExists = false; if (file.exists()) { diff --git a/app/src/main/java/com/seafile/seadroid2/ui/fragment/ReposFragment.java b/app/src/main/java/com/seafile/seadroid2/ui/fragment/ReposFragment.java index 32c4adf67..d1335bfa4 100644 --- a/app/src/main/java/com/seafile/seadroid2/ui/fragment/ReposFragment.java +++ b/app/src/main/java/com/seafile/seadroid2/ui/fragment/ReposFragment.java @@ -475,9 +475,9 @@ public void run() { String repoID = getNavContext().getRepoID(); String repoName = getNavContext().getRepoName(); String currentDir = getNavContext().getDirPath(); - - adapter.setDownloadTaskList(ts.getDownloadTaskInfosByPath(repoID, currentDir)); - + if (ts != null) { + adapter.setDownloadTaskList(ts.getDownloadTaskInfosByPath(repoID, currentDir)); + } // Log.d(DEBUG_TAG, "timer post refresh signal " + System.currentTimeMillis()); mTimer.postDelayed(this, 1 * 3500); } diff --git a/app/src/main/java/com/seafile/seadroid2/util/FileMimeUtils.java b/app/src/main/java/com/seafile/seadroid2/util/FileMimeUtils.java index 325f747e4..73ae170e1 100644 --- a/app/src/main/java/com/seafile/seadroid2/util/FileMimeUtils.java +++ b/app/src/main/java/com/seafile/seadroid2/util/FileMimeUtils.java @@ -1,5 +1,7 @@ package com.seafile.seadroid2.util; +import android.media.MediaMetadataRetriever; + import java.io.File; import java.util.HashMap; @@ -40,121 +42,30 @@ public class FileMimeUtils { needUpdateFileMime.put(".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"); needUpdateFileMime.put(".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"); needUpdateFileMime.put(".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"); - needUpdateFileMime.put(".c", "text/plain"); - needUpdateFileMime.put(".conf", "text/plain"); - needUpdateFileMime.put(".cpp", "text/plain"); - needUpdateFileMime.put(".h", "text/plain"); - needUpdateFileMime.put(".java", "text/plain"); - needUpdateFileMime.put(".log", "text/plain"); - needUpdateFileMime.put(".htm", "text/html"); - needUpdateFileMime.put(".html", "text/html"); - needUpdateFileMime.put(".prop", "text/plain"); - needUpdateFileMime.put(".rc", "text/plain"); - needUpdateFileMime.put(".sh", "text/plain"); - needUpdateFileMime.put(".txt", "text/plain"); - needUpdateFileMime.put(".md", "text/markdown"); - needUpdateFileMime.put(".markdown", "text/x-markdown"); - needUpdateFileMime.put(".md1", "text/vnd.daringfireball.markdown"); - needUpdateFileMime.put(".md2", " text/x-web-markdown"); needUpdateFileMime.put(".wps", "application/vnd.ms-works"); } - private static String[][] MIME_MapTable = { - //{last name, MIME type} - {".3gp", "video/3gpp"}, - {".apk", "application/vnd.android.package-archive"}, - {".asf", "video/x-ms-asf"}, - {".avi", "video/x-msvideo"}, - {".bin", "application/octet-stream"}, - {".bmp", "image/bmp"}, - {".c", "text/plain"}, - {".class", "application/octet-stream"}, - {".conf", "text/plain"}, - {".cpp", "text/plain"}, - {".doc", "application/msword"}, - {".exe", "application/octet-stream"}, - {".gif", "image/gif"}, - {".gtar", "application/x-gtar"}, - {".gz", "application/x-gzip"}, - {".h", "text/plain"}, - {".htm", "text/html"}, - {".html", "text/html"}, - {".jar", "application/java-archive"}, - {".java", "text/plain"}, - {".jpeg", "image/jpeg"}, - {".jpg", "image/jpeg"}, - {".js", "application/x-javascript"}, - {".log", "text/plain"}, - {".m3u", "audio/x-mpegurl"}, - {".m4a", "audio/mp4a-latm"}, - {".m4b", "audio/mp4a-latm"}, - {".m4p", "audio/mp4a-latm"}, - {".m4u", "video/vnd.mpegurl"}, - {".m4v", "video/x-m4v"}, - {".mov", "video/quicktime"}, - {".mp2", "audio/x-mpeg"}, - {".mp3", "audio/x-mpeg"}, - {".mp4", "video/mp4"}, - {".mpc", "application/vnd.mpohun.certificate"}, - {".mpe", "video/mpeg"}, - {".mpeg", "video/mpeg"}, - {".mpg", "video/mpeg"}, - {".mpg4", "video/mp4"}, - {".mpga", "audio/mpeg"}, - {".msg", "application/vnd.ms-outlook"}, - {".ogg", "audio/ogg"}, - {".pdf", "application/pdf"}, - {".png", "image/png"}, - {".pps", "application/vnd.ms-powerpoint"}, - {".ppt", "application/vnd.ms-powerpoint"}, - {".prop", "text/plain"}, - {".rar", "application/x-rar-compressed"}, - {".rc", "text/plain"}, - {".rmvb", "audio/x-pn-realaudio"}, - {".rtf", "application/rtf"}, - {".sh", "text/plain"}, - {".tar", "application/x-tar"}, - {".tgz", "application/x-compressed"}, - {".txt", "text/plain"}, - {".wav", "audio/x-wav"}, - {".wma", "audio/x-ms-wma"}, - {".wmv", "audio/x-ms-wmv"}, - {".wps", "application/vnd.ms-works"}, -// {".xml", "text/xml"}, - {".xml", "text/plain"}, - {".z", "application/x-compress"}, - {".zip", "application/zip"}, - {".md", "text/markdown"}, - {".markdown", "text/x-markdown"}, - {"", "*/*"} - }; - - public static String getFileMime(File file) { - String type = "*/*"; - String fName = file.getName(); - //get "." index in file name - int dotIndex = fName.lastIndexOf("."); - if (dotIndex < 0) { - return type; - } - /* get last name */ - String end = fName.substring(dotIndex, fName.length()).toLowerCase(); - if (end == "") - return type; - // find MIME file type 。 - for (int i = 0; i < MIME_MapTable.length; i++) { - if (end.equals(MIME_MapTable[i][0])) - type = MIME_MapTable[i][1]; - } - return type; - - } - - public static boolean isOfficeOrTextFile(String mime) { return needUpdateFileMime.containsValue(mime); } - + public static String getMimeType(File file) { + String mime = "text/plain"; + String filePath = file.getAbsolutePath(); + MediaMetadataRetriever mmr = new MediaMetadataRetriever(); + if (filePath != null) { + try { + mmr.setDataSource(filePath); + mime = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE); + } catch (IllegalStateException e) { + return mime; + } catch (IllegalArgumentException e) { + return mime; + } catch (RuntimeException e) { + return mime; + } + } + return mime; + } } diff --git a/app/src/main/java/com/seafile/seadroid2/util/Utils.java b/app/src/main/java/com/seafile/seadroid2/util/Utils.java index 02bb42dc3..58c048b7a 100644 --- a/app/src/main/java/com/seafile/seadroid2/util/Utils.java +++ b/app/src/main/java/com/seafile/seadroid2/util/Utils.java @@ -305,7 +305,7 @@ public static boolean isVideoFile(String name) { if (name == null) return false; String suffix = name.substring(name.lastIndexOf('.') + 1).toLowerCase(); - if (suffix == null || suffix.length() == 0) + if (TextUtils.isEmpty(suffix)) return false; String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix); if (mime == null) @@ -313,6 +313,22 @@ public static boolean isVideoFile(String name) { return mime.contains("video/"); } + public static boolean isTextFile(File file) { + if (file != null) { + String fileName = file.getName(); + if (!TextUtils.isEmpty(fileName)) { + String suffix = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase(); + if (!TextUtils.isEmpty(suffix)) { + String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix); + if (!TextUtils.isEmpty(mime)) { + return mime.contains("text/") || FileMimeUtils.isOfficeOrTextFile(mime); + } + } + } + } + return false; + } + public static boolean isNetworkOn() { ConnectivityManager connMgr = (ConnectivityManager) SeadroidApplication.getAppContext().getSystemService( diff --git a/app/src/main/res/drawable-xhdpi/shibboleth.png b/app/src/main/res/drawable-xhdpi/shibboleth.png deleted file mode 100644 index 55a0961a3bf34814b5a95e787e11784323474f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9909 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

F2Y4 z-JhI1dXh(b4rKe*biSJxN3(|;la^4Paqj_QMNbZHDsaK!(YX7>pVY!axtBBHdX7f} z>h9#7J9-uHzpU<_e9aH2j-oV>itPcZBhrD3y3SW|aVg>c{=W5-lP_`P=t*7~-JN-} zqZu~({HoLpI@uf?ppac@tyX*7?mclW)2`>1FI_U5dEf2i*vWX3F57tRjdR4t*`@&> zdFZP_ZJ}aEW44bVc3V7*5CF36pqb#Ix)T1*XxtU~y_~^it`wmmi=%Np&sT2pyUCp> zMEOFrb8+9#P}Dh!!4+ts;Cm-@gQMSegJ6pBoeVZZbWANI5K>s1DTVl}3u{l^LrWJm ztNG*JgsVY**MR3GwSo0b?y6Sj^)U~SaQP}{<1VmaV=Sl7WUWDX2b#&-JW;V?$I^eu&q3?>(a4 z{)&T$EcJarY(hf%kKfKecovbAT-=w5{w_Z^lZZ-Cxt-y__oB=v5UYO+l_lrk<%`}; zo&W7pSjcyOp3T~C@ZeyFz{j(be-!xRX6MIP9Pa3m)S z55gdCS9ztl8rLZc5x&=_fNoE~%>6_g^cSdU2S49%Z zW56VD7kTBcP=%u8<5{p}0et=iwD<*llHk!F#V7k9oJ@t7T-O$NC>AIm3=s{WZYK!r z1=Nx^JBM(0Ee3~8DBMZp-+az1Ub!v61=yVqcRvL~#=&dPL!Bt#ISA09$pvWQOpmo7 z7Ck!mw*wKqn-44ieuorI{5z9^S!G`F%54R%Q|4ZPd9OpaH{hwN(7Gj5j6|$8D}e|# zA3&_;J0%P+?HnXn#YQ9R5SjJYz1`uJ|0Zxj#HrS3u;x4jorikM#0rU862Cr(w2e!W n%AP`O&XMiy060dp 0dp 7dp - 30dp - 30dp + 20dp + 20dp 18sp 60dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8acb441cf..c43cd99dd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -226,6 +226,7 @@ Open as Select files to upload Storage was removed + Insufficient storage space Error when selecting file %1$d file selected diff --git a/build.gradle b/build.gradle index 319f17bcc..246177712 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files