2  *   ownCloud Android client application 
   4  *   Copyright (C) 2012  Bartek Przybylski 
   5  *   Copyright (C) 2015 ownCloud Inc. 
   7  *   This program is free software: you can redistribute it and/or modify 
   8  *   it under the terms of the GNU General Public License version 2, 
   9  *   as published by the Free Software Foundation. 
  11  *   This program is distributed in the hope that it will be useful, 
  12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14  *   GNU General Public License for more details. 
  16  *   You should have received a copy of the GNU General Public License 
  17  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. 
  21 package com
.owncloud
.android
.files
; 
  25 import com
.owncloud
.android
.MainApp
; 
  26 import com
.owncloud
.android
.authentication
.AccountUtils
; 
  27 import com
.owncloud
.android
.db
.DbHandler
; 
  28 import com
.owncloud
.android
.files
.services
.FileUploader
; 
  29 import com
.owncloud
.android
.lib
.common
.utils
.Log_OC
; 
  30 import com
.owncloud
.android
.utils
.FileStorageUtils
; 
  33 import android
.accounts
.Account
; 
  34 import android
.content
.BroadcastReceiver
; 
  35 import android
.content
.Context
; 
  36 import android
.content
.Intent
; 
  37 import android
.database
.Cursor
; 
  38 import android
.net
.ConnectivityManager
; 
  39 import android
.net
.NetworkInfo
.State
; 
  40 import android
.preference
.PreferenceManager
; 
  41 import android
.provider
.MediaStore
.Images
; 
  42 import android
.provider
.MediaStore
.Video
; 
  43 import android
.webkit
.MimeTypeMap
; 
  46 public class InstantUploadBroadcastReceiver 
extends BroadcastReceiver 
{ 
  48     private static String TAG 
= InstantUploadBroadcastReceiver
.class.getName(); 
  50     // Unofficial action, works for most devices but not HTC. See: https://github.com/owncloud/android/issues/6 
  51     private static String NEW_PHOTO_ACTION_UNOFFICIAL 
= "com.android.camera.NEW_PICTURE"; 
  52     // Officially supported action since SDK 14: http://developer.android.com/reference/android/hardware/Camera.html#ACTION_NEW_PICTURE 
  53     private static String NEW_PHOTO_ACTION 
= "android.hardware.action.NEW_PICTURE"; 
  55     // Officially supported action since SDK 14: http://developer.android.com/reference/android/hardware/Camera.html#ACTION_NEW_VIDEO 
  56     private static String NEW_VIDEO_ACTION 
= "android.hardware.action.NEW_VIDEO"; 
  59     public void onReceive(Context context
, Intent intent
) { 
  60         Log_OC
.d(TAG
, "Received: " + intent
.getAction()); 
  61         if (intent
.getAction().equals(android
.net
.ConnectivityManager
.CONNECTIVITY_ACTION
)) { 
  62             handleConnectivityAction(context
, intent
); 
  63         }else if (intent
.getAction().equals(NEW_PHOTO_ACTION_UNOFFICIAL
)) { 
  64             handleNewPictureAction(context
, intent
);  
  65             Log_OC
.d(TAG
, "UNOFFICIAL processed: com.android.camera.NEW_PICTURE"); 
  66         } else if (intent
.getAction().equals(NEW_PHOTO_ACTION
)) { 
  67             handleNewPictureAction(context
, intent
);  
  68             Log_OC
.d(TAG
, "OFFICIAL processed: android.hardware.action.NEW_PICTURE"); 
  69         } else if (intent
.getAction().equals(NEW_VIDEO_ACTION
)) { 
  70             Log_OC
.d(TAG
, "OFFICIAL processed: android.hardware.action.NEW_VIDEO"); 
  71             handleNewVideoAction(context
, intent
); 
  73             Log_OC
.e(TAG
, "Incorrect intent sent: " + intent
.getAction()); 
  77     private void handleNewPictureAction(Context context
, Intent intent
) { 
  79         String file_path 
= null
; 
  80         String file_name 
= null
; 
  81         String mime_type 
= null
; 
  83         Log_OC
.w(TAG
, "New photo received"); 
  85         if (!instantPictureUploadEnabled(context
)) { 
  86             Log_OC
.d(TAG
, "Instant picture upload disabled, ignoring new picture"); 
  90         Account account 
= AccountUtils
.getCurrentOwnCloudAccount(context
); 
  91         if (account 
== null
) { 
  92             Log_OC
.w(TAG
, "No owncloud account found for instant upload, aborting"); 
  96         String
[] CONTENT_PROJECTION 
= { Images
.Media
.DATA
, Images
.Media
.DISPLAY_NAME
, Images
.Media
.MIME_TYPE
, Images
.Media
.SIZE 
}; 
  97         c 
= context
.getContentResolver().query(intent
.getData(), CONTENT_PROJECTION
, null
, null
, null
); 
  98         if (!c
.moveToFirst()) { 
  99             Log_OC
.e(TAG
, "Couldn't resolve given uri: " + intent
.getDataString()); 
 102         file_path 
= c
.getString(c
.getColumnIndex(Images
.Media
.DATA
)); 
 103         file_name 
= c
.getString(c
.getColumnIndex(Images
.Media
.DISPLAY_NAME
)); 
 104         mime_type 
= c
.getString(c
.getColumnIndex(Images
.Media
.MIME_TYPE
)); 
 107         Log_OC
.d(TAG
, file_path 
+ ""); 
 109         // save always temporally the picture to upload 
 110         DbHandler db 
= new DbHandler(context
); 
 111         db
.putFileForLater(file_path
, account
.name
, null
); 
 114         if (!isOnline(context
) || (instantPictureUploadViaWiFiOnly(context
) && !isConnectedViaWiFi(context
))) { 
 118         Intent i 
= new Intent(context
, FileUploader
.class); 
 119         i
.putExtra(FileUploader
.KEY_ACCOUNT
, account
); 
 120         i
.putExtra(FileUploader
.KEY_LOCAL_FILE
, file_path
); 
 121         i
.putExtra(FileUploader
.KEY_REMOTE_FILE
, FileStorageUtils
.getInstantUploadFilePath(context
, file_name
)); 
 122         i
.putExtra(FileUploader
.KEY_UPLOAD_TYPE
, FileUploader
.UPLOAD_SINGLE_FILE
); 
 123         i
.putExtra(FileUploader
.KEY_MIME_TYPE
, mime_type
); 
 124         i
.putExtra(FileUploader
.KEY_INSTANT_UPLOAD
, true
); 
 125         context
.startService(i
); 
 128     private void handleNewVideoAction(Context context
, Intent intent
) { 
 130         String file_path 
= null
; 
 131         String file_name 
= null
; 
 132         String mime_type 
= null
; 
 134         Log_OC
.w(TAG
, "New video received"); 
 136         if (!instantVideoUploadEnabled(context
)) { 
 137             Log_OC
.d(TAG
, "Instant video upload disabled, ignoring new video"); 
 141         Account account 
= AccountUtils
.getCurrentOwnCloudAccount(context
); 
 142         if (account 
== null
) { 
 143             Log_OC
.w(TAG
, "No owncloud account found for instant upload, aborting"); 
 147         String
[] CONTENT_PROJECTION 
= { Video
.Media
.DATA
, Video
.Media
.DISPLAY_NAME
, Video
.Media
.MIME_TYPE
, Video
.Media
.SIZE 
}; 
 148         c 
= context
.getContentResolver().query(intent
.getData(), CONTENT_PROJECTION
, null
, null
, null
); 
 149         if (!c
.moveToFirst()) { 
 150             Log_OC
.e(TAG
, "Couldn't resolve given uri: " + intent
.getDataString()); 
 153         file_path 
= c
.getString(c
.getColumnIndex(Video
.Media
.DATA
)); 
 154         file_name 
= c
.getString(c
.getColumnIndex(Video
.Media
.DISPLAY_NAME
)); 
 155         mime_type 
= c
.getString(c
.getColumnIndex(Video
.Media
.MIME_TYPE
)); 
 157         Log_OC
.d(TAG
, file_path 
+ ""); 
 159         if (!isOnline(context
) || (instantVideoUploadViaWiFiOnly(context
) && !isConnectedViaWiFi(context
))) { 
 163         Intent i 
= new Intent(context
, FileUploader
.class); 
 164         i
.putExtra(FileUploader
.KEY_ACCOUNT
, account
); 
 165         i
.putExtra(FileUploader
.KEY_LOCAL_FILE
, file_path
); 
 166         i
.putExtra(FileUploader
.KEY_REMOTE_FILE
, FileStorageUtils
.getInstantVideoUploadFilePath(context
, file_name
)); 
 167         i
.putExtra(FileUploader
.KEY_UPLOAD_TYPE
, FileUploader
.UPLOAD_SINGLE_FILE
); 
 168         i
.putExtra(FileUploader
.KEY_MIME_TYPE
, mime_type
); 
 169         i
.putExtra(FileUploader
.KEY_INSTANT_UPLOAD
, true
); 
 170         context
.startService(i
); 
 174     private void handleConnectivityAction(Context context
, Intent intent
) { 
 175         if (!instantPictureUploadEnabled(context
)) { 
 176             Log_OC
.d(TAG
, "Instant upload disabled, don't upload anything"); 
 180         if (!intent
.hasExtra(ConnectivityManager
.EXTRA_NO_CONNECTIVITY
) 
 182                 && (!instantPictureUploadViaWiFiOnly(context
) || (instantPictureUploadViaWiFiOnly(context
) == isConnectedViaWiFi(context
) == true
))) { 
 183             DbHandler db 
= new DbHandler(context
); 
 184             Cursor c 
= db
.getAwaitingFiles(); 
 185             if (c
.moveToFirst()) { 
 187                     String account_name 
= c
.getString(c
.getColumnIndex("account")); 
 188                     String file_path 
= c
.getString(c
.getColumnIndex("path")); 
 189                     File f 
= new File(file_path
); 
 191                         Account account 
= new Account(account_name
, MainApp
.getAccountType()); 
 193                         String mimeType 
= null
; 
 195                             mimeType 
= MimeTypeMap
.getSingleton().getMimeTypeFromExtension( 
 196                                     f
.getName().substring(f
.getName().lastIndexOf('.') + 1)); 
 198                         } catch (Throwable e
) { 
 199                             Log_OC
.e(TAG
, "Trying to find out MIME type of a file without extension: " + f
.getName()); 
 201                         if (mimeType 
== null
) 
 202                             mimeType 
= "application/octet-stream"; 
 204                         Intent i 
= new Intent(context
, FileUploader
.class); 
 205                         i
.putExtra(FileUploader
.KEY_ACCOUNT
, account
); 
 206                         i
.putExtra(FileUploader
.KEY_LOCAL_FILE
, file_path
); 
 207                         i
.putExtra(FileUploader
.KEY_REMOTE_FILE
, FileStorageUtils
.getInstantUploadFilePath(context
, f
.getName())); 
 208                         i
.putExtra(FileUploader
.KEY_UPLOAD_TYPE
, FileUploader
.UPLOAD_SINGLE_FILE
); 
 209                         i
.putExtra(FileUploader
.KEY_INSTANT_UPLOAD
, true
); 
 210                         context
.startService(i
); 
 213                         Log_OC
.w(TAG
, "Instant upload file " + f
.getAbsolutePath() + " dont exist anymore"); 
 215                 } while (c
.moveToNext()); 
 223     public static boolean isOnline(Context context
) { 
 224         ConnectivityManager cm 
= (ConnectivityManager
) context
.getSystemService(Context
.CONNECTIVITY_SERVICE
); 
 225         return cm
.getActiveNetworkInfo() != null 
&& cm
.getActiveNetworkInfo().isConnected(); 
 228     public static boolean isConnectedViaWiFi(Context context
) { 
 229         ConnectivityManager cm 
= (ConnectivityManager
) context
.getSystemService(Context
.CONNECTIVITY_SERVICE
); 
 230         return cm 
!= null 
&& cm
.getActiveNetworkInfo() != null
 
 231                 && cm
.getActiveNetworkInfo().getType() == ConnectivityManager
.TYPE_WIFI
 
 232                 && cm
.getActiveNetworkInfo().getState() == State
.CONNECTED
; 
 235     public static boolean instantPictureUploadEnabled(Context context
) { 
 236         return PreferenceManager
.getDefaultSharedPreferences(context
).getBoolean("instant_uploading", false
); 
 239     public static boolean instantVideoUploadEnabled(Context context
) { 
 240         return PreferenceManager
.getDefaultSharedPreferences(context
).getBoolean("instant_video_uploading", false
); 
 243     public static boolean instantPictureUploadViaWiFiOnly(Context context
) { 
 244         return PreferenceManager
.getDefaultSharedPreferences(context
).getBoolean("instant_upload_on_wifi", false
); 
 247     public static boolean instantVideoUploadViaWiFiOnly(Context context
) { 
 248         return PreferenceManager
.getDefaultSharedPreferences(context
).getBoolean("instant_video_upload_on_wifi", false
);