Skip to content

Commit

Permalink
Merge pull request #36 from StepicOrg/release/1.4
Browse files Browse the repository at this point in the history
Release/1.4
  • Loading branch information
KirillMakarov committed Feb 25, 2016
2 parents df6ded2 + fc071b2 commit 6499e28
Show file tree
Hide file tree
Showing 29 changed files with 437 additions and 139 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
# generated files
bin/
gen/
captures/

# Local configuration file (sdk path, etc)
local.properties
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ android {
applicationId "org.stepic.droid"
minSdkVersion 14
targetSdkVersion 23
versionCode 29
versionName "1.4dev"
versionCode 32
versionName "1.4"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// Enabling multidex support.
multiDexEnabled true
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@
</intent-filter>
</receiver>

<receiver
android:name="org.stepic.droid.receivers.DownloadClickReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
</intent-filter>
</receiver>

<receiver
android:name=".receivers.InternetConnectionEnabledReceiver"
android:exported="true">
Expand All @@ -107,6 +115,10 @@
android:name="org.stepic.droid.services.ViewPusher"
android:exported="true"/>

<service
android:name="org.stepic.droid.services.CancelLoadingService"
android:exported="true"/>

<activity
android:name=".view.activities.CourseSearchResultActivity"
android:label="@string/search_title"
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/org/stepic/droid/core/IScreenManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,6 @@ public interface IScreenManager {
void showTextFeedback(Activity sourceActivity);

void showStoreWithApp(Activity sourceActivity);

void showDownload();
}
18 changes: 17 additions & 1 deletion app/src/main/java/org/stepic/droid/core/ScreenManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.stepic.droid.services.ViewPusher;
import org.stepic.droid.util.AppConstants;
import org.stepic.droid.util.JsonHelper;
import org.stepic.droid.util.resolvers.IMainMenuResolver;
import org.stepic.droid.view.activities.CourseDetailActivity;
import org.stepic.droid.view.activities.LaunchActivity;
import org.stepic.droid.view.activities.LoginActivity;
Expand All @@ -32,6 +33,7 @@
import org.stepic.droid.view.activities.TextFeedbackActivity;
import org.stepic.droid.view.activities.UnitsActivity;
import org.stepic.droid.view.dialogs.RemindPasswordDialogFragment;
import org.stepic.droid.view.fragments.DownloadsFragment;
import org.stepic.droid.web.ViewAssignment;

import javax.inject.Inject;
Expand All @@ -40,10 +42,13 @@
@Singleton
public class ScreenManager implements IScreenManager {
private IConfig mConfig;
private IMainMenuResolver mMainMenuResolver;


@Inject
public ScreenManager(IConfig config) {
public ScreenManager(IConfig config, IMainMenuResolver mainMenuResolver) {
this.mConfig = config;
mMainMenuResolver = mainMenuResolver;
}

@Override
Expand Down Expand Up @@ -127,6 +132,17 @@ public void showStoreWithApp(@NotNull Activity sourceActivity) {
}
}

@Override
public void showDownload() {
Intent intent = new Intent (MainApplication.getAppContext(), MainFeedActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle bundle = new Bundle();
int index = mMainMenuResolver.getIndexOfFragment(DownloadsFragment.class);
bundle.putInt(MainFeedActivity.KEY_CURRENT_INDEX, index);
intent.putExtras(bundle);
MainApplication.getAppContext().startActivity(intent);
}

@Override
public void showSections(Context sourceActivity, @NotNull Course course) {
YandexMetrica.reportEvent("Screen manager: show section", JsonHelper.toJson(course));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
import org.stepic.droid.concurrency.UpdateCourseTask;
import org.stepic.droid.model.Course;
import org.stepic.droid.model.Section;
import org.stepic.droid.receivers.DownloadClickReceiver;
import org.stepic.droid.receivers.DownloadCompleteReceiver;
import org.stepic.droid.receivers.InternetConnectionEnabledReceiver;
import org.stepic.droid.services.CancelLoadingService;
import org.stepic.droid.services.DeleteService;
import org.stepic.droid.services.LoadService;
import org.stepic.droid.services.ViewPusher;
Expand Down Expand Up @@ -120,4 +122,8 @@ public interface StepicCoreComponent {
void inject(RemindPasswordDialogFragment remindPasswordDialogFragment);

void inject(DatabaseFacade databaseFacade);

void inject(CancelLoadingService service);

void inject(DownloadClickReceiver downloadClickReceiver);
}
24 changes: 20 additions & 4 deletions app/src/main/java/org/stepic/droid/core/StepicDefaultModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@
import org.stepic.droid.store.CleanManager;
import org.stepic.droid.store.DatabaseHelper;
import org.stepic.droid.store.DownloadManagerImpl;
import org.stepic.droid.store.ICancelSniffer;
import org.stepic.droid.store.IDownloadManager;
import org.stepic.droid.store.IStoreStateManager;
import org.stepic.droid.store.StoreStateManager;
import org.stepic.droid.store.SynchronizedCancelSniffer;
import org.stepic.droid.store.dao.AssignmentDaoImpl;
import org.stepic.droid.store.dao.BlockDaoImpl;
import org.stepic.droid.store.dao.CourseDaoImpl;
Expand All @@ -41,9 +43,11 @@
import org.stepic.droid.store.dao.ViewAssignmentDaoImpl;
import org.stepic.droid.store.operations.DatabaseFacade;
import org.stepic.droid.util.resolvers.CoursePropertyResolver;
import org.stepic.droid.util.resolvers.IMainMenuResolver;
import org.stepic.droid.util.resolvers.ISearchResolver;
import org.stepic.droid.util.resolvers.IStepResolver;
import org.stepic.droid.util.resolvers.IVideoResolver;
import org.stepic.droid.util.resolvers.MainMenuResolverImpl;
import org.stepic.droid.util.resolvers.SearchResolver;
import org.stepic.droid.util.resolvers.StepTypeResolver;
import org.stepic.droid.util.resolvers.VideoResolver;
Expand All @@ -70,8 +74,8 @@ public StepicDefaultModule(Context context) {

@Provides
@Singleton
public IScreenManager provideIScreenManager(IConfig config) {
return new ScreenManager(config);
public IScreenManager provideIScreenManager(IConfig config, IMainMenuResolver mainMenuResolver) {
return new ScreenManager(config, mainMenuResolver);
}

@Provides
Expand Down Expand Up @@ -210,12 +214,12 @@ public SQLiteOpenHelper provideSqlOpenHelper(Context context) {
}

@Provides
public IDao<Section> provideSectionDao(SQLiteOpenHelper openHelper){
public IDao<Section> provideSectionDao(SQLiteOpenHelper openHelper) {
return new SectionDaoImpl(openHelper);
}

@Provides
public IDao<Unit> provideUnitDao(SQLiteOpenHelper openHelper, IDao<Progress> progressDao){
public IDao<Unit> provideUnitDao(SQLiteOpenHelper openHelper, IDao<Progress> progressDao) {
return new UnitDaoImpl(openHelper, progressDao);
}

Expand Down Expand Up @@ -267,4 +271,16 @@ public IDao<Course> provideCourse(SQLiteOpenHelper openHelper, IDao<CachedVideo>
return new CourseDaoImpl(openHelper, daoCached);
}

@Provides
@Singleton
public ICancelSniffer provideCancelSniffer() {
return new SynchronizedCancelSniffer();
}

@Provides
@Singleton
public IMainMenuResolver provideResolver(){
return new MainMenuResolverImpl();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.stepic.droid.receivers

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent

import org.stepic.droid.base.MainApplication
import org.stepic.droid.core.IScreenManager
import javax.inject.Inject

class DownloadClickReceiver : BroadcastReceiver() {

@Inject
lateinit var mScreenProvider : IScreenManager

init {
MainApplication.component().inject(this)
}

override fun onReceive(context: Context, intent: Intent) = mScreenProvider.showDownload()
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
import org.stepic.droid.model.DownloadEntity;
import org.stepic.droid.model.Step;
import org.stepic.droid.preferences.UserPreferences;
import org.stepic.droid.store.ICancelSniffer;
import org.stepic.droid.store.IStoreStateManager;
import org.stepic.droid.store.operations.DatabaseFacade;
import org.stepic.droid.util.RWLocks;

import java.io.File;

Expand All @@ -28,6 +30,9 @@ public class DownloadCompleteReceiver extends BroadcastReceiver {
@Inject
IStoreStateManager mStoreStateManager;

@Inject
ICancelSniffer mCancelSniffer;

public DownloadCompleteReceiver() {
MainApplication.component().inject(this);
}
Expand All @@ -38,25 +43,41 @@ public void onReceive(Context context, Intent intent) {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void[] params) {
//critical section:
try {
RWLocks.DownloadLock.writeLock().lock();

DownloadEntity downloadEntity = mDatabaseFacade.getDownloadEntityIfExist(referenceId);
if (downloadEntity != null) {
long video_id = downloadEntity.getVideoId();
long step_id = downloadEntity.getStepId();
mDatabaseFacade.deleteDownloadEntityByDownloadId(referenceId);


DownloadEntity downloadEntity = mDatabaseFacade.getDownloadEntityIfExist(referenceId);
if (downloadEntity != null) {
long video_id = downloadEntity.getVideoId();
long step_id = downloadEntity.getStepId();
mDatabaseFacade.deleteDownloadEntityByDownloadId(referenceId);
File downloadFolderAndFile = new File(mUserPrefs.getUserDownloadFolder(), video_id + "");
String path = Uri.fromFile(downloadFolderAndFile).getPath();

File downloadFolderAndFile = new File(mUserPrefs.getUserDownloadFolder(), video_id + "");
String path = Uri.fromFile(downloadFolderAndFile).getPath();
CachedVideo cachedVideo = new CachedVideo(step_id, video_id, path, downloadEntity.getThumbnail());
cachedVideo.setQuality(downloadEntity.getQuality());
mDatabaseFacade.addVideo(cachedVideo);
if (mCancelSniffer.isStepIdCanceled(step_id)) {
File file = new File(path);
if (file.exists()) {
file.delete();
}
mCancelSniffer.removeStepIdCancel(step_id);
}
{
//is not canceled
CachedVideo cachedVideo = new CachedVideo(step_id, video_id, path, downloadEntity.getThumbnail());
cachedVideo.setQuality(downloadEntity.getQuality());
mDatabaseFacade.addVideo(cachedVideo);

Step step = mDatabaseFacade.getStepById(step_id);
step.set_cached(true);
step.set_loading(false);
mDatabaseFacade.updateOnlyCachedLoadingStep(step);
mStoreStateManager.updateUnitLessonState(step.getLesson());
Step step = mDatabaseFacade.getStepById(step_id);
step.set_cached(true);
step.set_loading(false);
mDatabaseFacade.updateOnlyCachedLoadingStep(step);
mStoreStateManager.updateUnitLessonState(step.getLesson());
}
}
} finally {
RWLocks.DownloadLock.writeLock().unlock();
}
return null;
//end critical section
Expand Down
104 changes: 104 additions & 0 deletions app/src/main/java/org/stepic/droid/services/CancelLoadingService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package org.stepic.droid.services

import android.app.DownloadManager
import android.app.IntentService
import android.app.Service
import android.content.Intent
import com.squareup.otto.Bus
import org.stepic.droid.base.MainApplication
import org.stepic.droid.model.Lesson
import org.stepic.droid.model.Section
import org.stepic.droid.preferences.UserPreferences
import org.stepic.droid.store.ICancelSniffer
import org.stepic.droid.store.IStoreStateManager
import org.stepic.droid.store.operations.DatabaseFacade
import org.stepic.droid.util.AppConstants
import org.stepic.droid.util.RWLocks
import javax.inject.Inject

class CancelLoadingService : IntentService("cancel_loading") {

@Inject
lateinit var mSystemDownloadManager: DownloadManager
@Inject
lateinit var mUserPrefs: UserPreferences
@Inject
lateinit var mBus: Bus
@Inject
lateinit var mDb: DatabaseFacade
@Inject
lateinit var mStoreStateManager: IStoreStateManager
@Inject
lateinit var mCancelSniffer: ICancelSniffer


override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
MainApplication.component().inject(this)
super.onStartCommand(intent, flags, startId)
return Service.START_REDELIVER_INTENT
}

override fun onHandleIntent(intent: Intent?) {
val type = intent?.getSerializableExtra(AppConstants.KEY_LOAD_TYPE) as? LoadService.LoadTypeKey
when (type) {
LoadService.LoadTypeKey.Section -> {
val section = intent?.getSerializableExtra(AppConstants.KEY_SECTION_BUNDLE) as? Section
cancelSection(section)
}
LoadService.LoadTypeKey.UnitLesson -> {
val lesson = intent?.getSerializableExtra(AppConstants.KEY_LESSON_BUNDLE) as? Lesson
cancelUnitLesson(lesson)
}
LoadService.LoadTypeKey.Course -> {
return
}
LoadService.LoadTypeKey.Step -> {
return
}
}
}

private fun cancelUnitLesson(lesson: Lesson?) {
lesson?.let {
try {
val lessonSteps = lesson.steps
lessonSteps?.forEach { mCancelSniffer.addStepIdCancel(it)}

RWLocks.DownloadLock.writeLock().lock()
val steps = mDb.getStepsOfLesson(lesson.id)
val downloads = mDb.getAllDownloadEntities()


//todo: improve time of operation
for (step in steps) {
for (download in downloads) {
if (step != null && download != null && download.stepId.equals(step.id)) {
val numberOfRemoved = mSystemDownloadManager.remove(download.downloadId)
if (numberOfRemoved > 0) {
mCancelSniffer.removeStepIdCancel(step.id)
mDb.deleteDownloadEntityByDownloadId(download.downloadId)
mDb.deleteVideo(download.videoId)
if (mDb.isStepCached(step)) {
step.is_cached = false
step.is_loading = false
mDb.updateOnlyCachedLoadingStep(step)
}
}
}
}
}

mStoreStateManager.updateUnitLessonAfterDeleting(lesson.id)
} finally {
RWLocks.DownloadLock.writeLock().unlock()
}
}
}

private fun cancelSection(section: Section?) {
section?.let {

}
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
Loading

0 comments on commit 6499e28

Please sign in to comment.