/** * Updates the current notification * * @param chunk The current downloaded chunk */ private void updateProgress(ResponseLibraryChunk chunk) { // Update notification double progress = ((double) chunk.getChunkNumber() / (double) chunk.getChunkCount()) * 100; publishProgress((int) progress); }
/** Start the Download */ private DownloaderResult startDownloading(ClementineMessage clementineMessage) { boolean downloadFinished = false; DownloaderResult result = new DownloaderResult(DownloadResult.SUCCESSFUL); File f = null; FileOutputStream fo = null; publishProgress(0); // Now request the songs mClient.sendRequest(clementineMessage); while (!downloadFinished) { // Check if the user canceled the process if (isCancelled()) { // Close the stream and delete the incomplete file try { if (fo != null) { fo.flush(); fo.close(); } if (f != null) { f.delete(); } } catch (IOException e) { } Log.d(TAG, "isCancelled"); break; } // Get the raw protocol buffer ClementineMessage message = mClient.getProtoc(); if (message.isErrorMessage()) { result = new DownloaderResult(DownloadResult.CONNECTION_ERROR); break; } // Is the download forbidden? if (message.getMessageType() == MsgType.DISCONNECT) { result = new DownloaderResult(DownloadResult.FOBIDDEN); break; } // Ignore other elements! if (message.getMessageType() != MsgType.LIBRARY_CHUNK) { continue; } ResponseLibraryChunk chunk = message.getMessage().getResponseLibraryChunk(); try { // Check if we need to create a new file if (f == null) { // Check if we have enougth free space // size times 2, because we optimise the table later and // need space for that too! if ((chunk.getSize() * 2) > Utilities.getFreeSpaceExternal()) { result = new DownloaderResult(DownloadResult.INSUFFIANT_SPACE); break; } f = mLibrary.getLibraryDb(); // User wants to override files, so delete it here! // The check was already done in processSongOffer() if (f.exists()) { f.delete(); } f.createNewFile(); fo = new FileOutputStream(f); } // Write chunk to sdcard fo.write(chunk.getData().toByteArray()); // Have we downloaded all chunks? if (chunk.getChunkCount() == chunk.getChunkNumber()) { fo.flush(); fo.close(); f = null; downloadFinished = true; } // Update notification updateProgress(chunk); } catch (IOException e) { result = new DownloaderResult(DownloaderResult.DownloadResult.NOT_MOUNTED); break; } } // Disconnect at the end mClient.disconnect(ClementineMessage.getMessage(MsgType.DISCONNECT)); // Optimize library table if (mLibrary.getLibraryDb().exists()) { mLibrary.optimizeTable(); } return result; }