Skip to content

Commit

Permalink
Auto upload feature (#253)
Browse files Browse the repository at this point in the history
* adds auto upload settings to preference screen

* adds NEW_PICTURE broadcast receiver

* adds upload service

* adds upload settings preference fragment

* adds hda and share list fetching to upload settings

* adds sqlite db for storing image paths

* adds custom upload queue

* implements upload manager and server connection in background service

* fix the UI stuck on file uploads

* fix multiple files uploading at the same time

* code refactoring

* adds upload only on wifi preference option

* adds api-19 to travis.yml

* adds Job for tracking changes in images content uri

* adds job scheduling to the application class

* adds net connnectivity job

* adds permission checker to auto upload settings
  • Loading branch information
csoni111 authored and cpg committed Aug 14, 2017
1 parent 9bd358f commit 4eb7360
Show file tree
Hide file tree
Showing 30 changed files with 1,814 additions and 162 deletions.
19 changes: 19 additions & 0 deletions src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
</intent-filter>
</service>
<service android:name=".service.VideoService"/>
<service android:name=".service.UploadService"/>

<receiver android:name=".receiver.AudioReceiver">
<intent-filter>
Expand All @@ -166,6 +167,24 @@
</intent-filter>
</receiver>

<receiver
android:name=".receiver.CameraReceiver"
android:enabled="true">
<intent-filter>
<!--<action android:name="com.android.camera.NEW_PICTURE" />-->
<action android:name="android.hardware.action.NEW_PICTURE" />
<data android:mimeType="image/*" />
</intent-filter>
</receiver>

<service
android:name=".job.PhotosContentJob"
android:permission="android.permission.BIND_JOB_SERVICE" />

<service
android:name=".job.NetConnectivityJob"
android:permission="android.permission.BIND_JOB_SERVICE" />

<meta-data
android:name="com.crashlytics.ApiKey"
android:value="d7b65346d3cf0028328f006bff447501d70f8996"/>
Expand Down
28 changes: 26 additions & 2 deletions src/main/java/org/amahi/anywhere/AmahiApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,15 @@

import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.os.StrictMode;
import android.support.annotation.RequiresApi;

import com.crashlytics.android.Crashlytics;

import org.amahi.anywhere.job.NetConnectivityJob;
import org.amahi.anywhere.job.PhotosContentJob;

import dagger.ObjectGraph;
import io.fabric.sdk.android.Fabric;
import timber.log.Timber;
Expand All @@ -49,9 +54,13 @@ public void onCreate() {
setUpDetecting();

setUpInjections();
}

private void setUpLogging() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setUpJobs();
}
}

private void setUpLogging() {
if (isDebugging()) {
Timber.plant(new Timber.DebugTree());
}
Expand Down Expand Up @@ -80,4 +89,19 @@ private void setUpInjections() {
public void inject(Object injectionsConsumer) {
injector.inject(injectionsConsumer);
}

public static class JobIds {
public static final int PHOTOS_CONTENT_JOB = 125;
public static final int NET_CONNECTIVITY_JOB = 126;
}

@RequiresApi(api = Build.VERSION_CODES.N)
private void setUpJobs() {
if (!PhotosContentJob.isScheduled(this)) {
PhotosContentJob.scheduleJob(this);
}
if (!NetConnectivityJob.isScheduled(this)) {
NetConnectivityJob.scheduleJob(this);
}
}
}
8 changes: 7 additions & 1 deletion src/main/java/org/amahi/anywhere/AmahiModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,18 @@
import org.amahi.anywhere.fragment.ServerFilesFragment;
import org.amahi.anywhere.fragment.ServerSharesFragment;
import org.amahi.anywhere.fragment.SettingsFragment;
import org.amahi.anywhere.fragment.UploadSettingsFragment;
import org.amahi.anywhere.server.ApiModule;
import org.amahi.anywhere.service.AudioService;
import org.amahi.anywhere.service.UploadService;
import org.amahi.anywhere.service.VideoService;
import org.amahi.anywhere.tv.activity.TVWebViewActivity;
import org.amahi.anywhere.tv.activity.TvPlaybackOverlayActivity;
import org.amahi.anywhere.tv.fragment.MainTVFragment;
import org.amahi.anywhere.tv.fragment.ServerFileTvFragment;
import org.amahi.anywhere.tv.fragment.ServerSelectFragment;
import org.amahi.anywhere.tv.fragment.TvPlaybackOverlayFragment;
import org.amahi.anywhere.util.UploadManager;

import javax.inject.Singleton;

Expand Down Expand Up @@ -78,13 +81,16 @@
ServerFileImageFragment.class,
ServerFileDownloadingFragment.class,
SettingsFragment.class,
UploadSettingsFragment.class,
AudioService.class,
VideoService.class,
MainTVFragment.class,
TVWebViewActivity.class,
ServerFileTvFragment.class,
TvPlaybackOverlayFragment.class,
TvPlaybackOverlayActivity.class
TvPlaybackOverlayActivity.class,
UploadService.class,
UploadManager.class
}
)
class AmahiModule {
Expand Down
18 changes: 10 additions & 8 deletions src/main/java/org/amahi/anywhere/activity/ServerFilesActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -408,13 +408,15 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
String filePath = querySelectedImagePath(selectedImageUri);
if (filePath != null) {
File file = new File(filePath);
ServerFilesFragment fragment = (ServerFilesFragment)
getSupportFragmentManager()
.findFragmentById(R.id.container_files);
if (fragment.checkForDuplicateFile(file.getName())) {
showDuplicateFileUploadDialog(file);
} else {
uploadFile(file);
if (file.exists()) {
ServerFilesFragment fragment = (ServerFilesFragment)
getSupportFragmentManager()
.findFragmentById(R.id.container_files);
if (fragment.checkForDuplicateFile(file.getName())) {
showDuplicateFileUploadDialog(file);
} else {
uploadFile(file);
}
}
}
}
Expand Down Expand Up @@ -461,7 +463,7 @@ public void onClick(DialogInterface dialog, int which) {
}

private void uploadFile(File uploadFile) {
serverClient.uploadFile(uploadFile, getShare(), file);
serverClient.uploadFile(0, uploadFile, getShare(), file);
uploadProgressDialog.show();
}

Expand Down
37 changes: 32 additions & 5 deletions src/main/java/org/amahi/anywhere/activity/SettingsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,25 @@

package org.amahi.anywhere.activity;

import android.os.Bundle;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

import com.squareup.otto.Subscribe;

import org.amahi.anywhere.R;
import org.amahi.anywhere.bus.BusProvider;
import org.amahi.anywhere.bus.UploadSettingsOpeningEvent;
import org.amahi.anywhere.fragment.SettingsFragment;
import org.amahi.anywhere.fragment.UploadSettingsFragment;

/**
* Settings activity. Shows application's settings.
* Settings itself are provided via {@link org.amahi.anywhere.fragment.SettingsFragment}.
*/
public class SettingsActivity extends AppCompatActivity
{
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -53,18 +57,41 @@ private void setUpHomeNavigation() {
private void setUpSettingsFragment() {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.replace(R.id.settings_container,new SettingsFragment()).commit();
.replace(R.id.settings_container, new SettingsFragment()).commit();
}

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case android.R.id.home:
finish();
onBackPressed();
return true;

default:
return super.onOptionsItemSelected(menuItem);
}
}

@Subscribe
public void onUploadSettingsOpenEvent(UploadSettingsOpeningEvent event) {
getFragmentManager().beginTransaction()
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.replace(R.id.settings_container, new UploadSettingsFragment())
.addToBackStack(null)
.commit();
}

@Override
protected void onResume() {
super.onResume();

BusProvider.getBus().register(this);
}

@Override
protected void onPause() {
super.onPause();

BusProvider.getBus().unregister(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,19 @@
package org.amahi.anywhere.bus;

public class ServerFileUploadCompleteEvent implements BusEvent {
private boolean wasUploadSuccessful;
private int id;
private boolean wasUploadSuccessful;

public ServerFileUploadCompleteEvent(boolean wasUploadSuccessful) {
this.wasUploadSuccessful = wasUploadSuccessful;
}
public ServerFileUploadCompleteEvent(int id, boolean wasUploadSuccessful) {
this.id = id;
this.wasUploadSuccessful = wasUploadSuccessful;
}

public boolean wasUploadSuccessful() {
return wasUploadSuccessful;
}
public int getId() {
return id;
}

public boolean wasUploadSuccessful() {
return wasUploadSuccessful;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,19 @@
package org.amahi.anywhere.bus;

public class ServerFileUploadProgressEvent implements BusEvent {
private int progress;
private int id;
private int progress;

public ServerFileUploadProgressEvent(int progress) {
this.progress = progress;
}
public ServerFileUploadProgressEvent(int id, int progress) {
this.id = id;
this.progress = progress;
}

public int getProgress() {
return this.progress;
}
public int getId() {
return this.id;
}

public int getProgress() {
return this.progress;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright (c) 2014 Amahi
*
* This file is part of Amahi.
*
* Amahi is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Amahi 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 Amahi. If not, see <http ://www.gnu.org/licenses/>.
*/

package org.amahi.anywhere.bus;

public class UploadSettingsOpeningEvent implements BusEvent {
}
44 changes: 44 additions & 0 deletions src/main/java/org/amahi/anywhere/db/UploadQueueDb.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.amahi.anywhere.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* SQLite db for maintaining image uploads in a persistent database.
* Query methods managed by {@link UploadQueueDbHelper UploadQueueDbHelper}.
*/

class UploadQueueDb extends SQLiteOpenHelper {

// Database version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "AMAHI_ANYWHERE_DATABASE";

// Table name
static final String TABLE_NAME = "UPLOAD_QUEUE_TABLE";

// column names
static final String KEY_ID = "id";
static final String KEY_FILE_PATH = "file_path";

UploadQueueDb(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_FILE_PATH + " VARCHAR(200) NOT NULL)";

db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

}
Loading

0 comments on commit 4eb7360

Please sign in to comment.