+ \r
+ // Initialise disk cache on background thread\r
+ new InitDiskCacheTask().execute();\r
+ }\r
+ \r
+ class InitDiskCacheTask extends AsyncTask<File, Void, Void> {\r
+ @Override\r
+ protected Void doInBackground(File... params) {\r
+ synchronized (mDiskCacheLock) {\r
+ mDiskLruCache = new DiskLruImageCache(mContext, "thumbnailCache", DISK_CACHE_SIZE, mCompressFormat,mCompressQuality);\r
+ \r
+ try {\r
+ OwnCloudAccount ocAccount = new OwnCloudAccount(mAccount, mContext);\r
+ mClient = OwnCloudClientManagerFactory.getDefaultSingleton().\r
+ getClientFor(ocAccount, mContext);\r
+ } catch (AccountNotFoundException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ } catch (AuthenticatorException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ } catch (OperationCanceledException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ } catch (IOException e) {\r
+ // TODO Auto-generated catch block\r
+ e.printStackTrace();\r
+ }\r
+\r
+ mDiskCacheStarting = false; // Finished initialization\r
+ mDiskCacheLock.notifyAll(); // Wake any waiting threads\r
+ }\r
+ return null;\r
+ }\r
+ }\r
+\r
+ class BitmapWorkerTask extends AsyncTask<OCFile, Void, Bitmap> {\r
+ private final ImageView fileIcon;\r
+ \r
+ public BitmapWorkerTask(ImageView fileIcon) {\r
+ this.fileIcon = fileIcon;\r
+ }\r
+\r
+ // Decode image in background.\r
+ @Override\r
+ protected Bitmap doInBackground(OCFile... params) {\r
+ OCFile file = params[0];\r
+ final String imageKey = String.valueOf(file.getRemoteId());\r
+\r
+ // Check disk cache in background thread\r
+ Bitmap thumbnail = getBitmapFromDiskCache(imageKey);\r
+\r
+ // Not found in disk cache\r
+ if (thumbnail == null) { \r
+ // Converts dp to pixel\r
+ Resources r = mContext.getResources();\r
+ int px = (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics()));\r
+ \r
+ if (file.isDown()){\r
+ Bitmap bitmap = BitmapFactory.decodeFile(file.getStoragePath());\r
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);\r
+ \r
+ // Add thumbnail to cache\r
+ addBitmapToCache(imageKey, thumbnail);\r
+\r
+ } else {\r
+ // Download thumbnail from server\r
+ DefaultHttpClient httpclient = new DefaultHttpClient();\r
+ try {\r
+ httpclient.getCredentialsProvider().setCredentials(\r
+ new AuthScope(mClient.getBaseUri().toString().replace("https://", ""), 443), \r
+ new UsernamePasswordCredentials(mClient.getCredentials().getUsername(), mClient.getCredentials().getAuthToken()));\r
+ \r
+\r
+ // TODO change to user preview.png\r
+ HttpGet httpget = new HttpGet(mClient.getBaseUri() + "/ocs/v1.php/thumbnail?path=" + URLEncoder.encode(file.getRemotePath(), "UTF-8"));\r
+ HttpResponse response = httpclient.execute(httpget);\r
+ HttpEntity entity = response.getEntity();\r
+ \r
+ if (entity != null) {\r
+ byte[] bytes = EntityUtils.toByteArray(entity);\r
+ Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);\r
+ thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);\r
+ \r
+ // Add thumbnail to cache\r
+ if (thumbnail != null){\r
+ addBitmapToCache(imageKey, thumbnail);\r
+ }\r
+ \r
+ }\r
+ } catch(Exception e){\r
+ e.printStackTrace();\r
+ }finally {\r
+ httpclient.getConnectionManager().shutdown();\r
+ }\r
+ } \r
+ }\r
+ return thumbnail;\r
+ }\r
+ \r
+ protected void onPostExecute(Bitmap bitmap){\r
+ fileIcon.setImageBitmap(bitmap);\r
+ }\r
+ }\r
+ \r
+ public void addBitmapToCache(String key, Bitmap bitmap) {\r
+ synchronized (mDiskCacheLock) {\r
+ if (mDiskLruCache != null && mDiskLruCache.getBitmap(key) == null) {\r
+ mDiskLruCache.put(key, bitmap);\r
+ }\r
+ }\r
+ }\r
+\r
+ public Bitmap getBitmapFromDiskCache(String key) {\r
+ synchronized (mDiskCacheLock) {\r
+ // Wait while disk cache is started from background thread\r
+ while (mDiskCacheStarting) {\r
+ try {\r
+ mDiskCacheLock.wait();\r
+ } catch (InterruptedException e) {}\r
+ }\r
+ if (mDiskLruCache != null) {\r
+ return (Bitmap) mDiskLruCache.getBitmap(key);\r
+ }\r
+ }\r
+ return null;\r