Skip to content

Commit

Permalink
Merge pull request #30 from StepicOrg/development
Browse files Browse the repository at this point in the history
release 1.1
  • Loading branch information
KirillMakarov committed Jan 11, 2016
2 parents 2d8adc6 + 2daa65f commit 8791eb9
Show file tree
Hide file tree
Showing 67 changed files with 1,831 additions and 510 deletions.
20 changes: 10 additions & 10 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ android {
applicationId "org.stepic.droid"
minSdkVersion 14
targetSdkVersion 23
versionCode 15
versionName "0.8"
versionCode 18
versionName "1.1"

// Enabling multidex support.
multiDexEnabled true
Expand Down Expand Up @@ -41,17 +41,17 @@ dependencies {
compile 'com.google.code.gson:gson:2.4'


compile 'com.squareup.okhttp:okhttp:2.3.0'
compile 'com.squareup.okhttp:okhttp-ws:2.3.0'
compile 'com.squareup.okhttp:okhttp:2.7.0'
compile 'com.squareup.okhttp:okhttp-ws:2.7.0'
compile 'com.squareup.okio:okio:1.6.0'

compile 'de.hdodenhof:circleimageview:1.3.0'

compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:palette-v7:23.0.1'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.android.support:palette-v7:23.1.1'
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'

compile 'com.squareup.picasso:picasso:2.5.2'
Expand All @@ -68,7 +68,7 @@ dependencies {
// AppMetrica from maven central. Protobuf will be included as dependency.
compile 'com.yandex.android:mobmetricalib:2.21@aar'

compile 'jp.wasabeef:recyclerview-animators:1.3.0'
compile 'jp.wasabeef:recyclerview-animators:2.1.0'

compile 'uk.co.chrisjenx:calligraphy:2.1.0'

Expand Down
22 changes: 20 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.stepic.droid">
package="org.stepic.droid"
android:installLocation="auto">


<uses-permission android:name="android.permission.INTERNET" />
Expand Down Expand Up @@ -64,7 +65,12 @@

<activity
android:name="org.stepic.droid.view.activities.MainFeedActivity"
android:label="@string/my_courses_title" />
android:label="@string/my_courses_title">

<meta-data
android:name="android.app.default_searchable"
android:value=".view.activities.CourseSearchResultActivity" />
</activity>

<activity
android:name=".view.activities.CourseDetailActivity"
Expand Down Expand Up @@ -112,6 +118,18 @@
android:name="org.stepic.droid.services.ViewPusher"
android:exported="true" />

<activity
android:launchMode="singleTop"
android:name=".view.activities.CourseSearchResultActivity"
android:label="@string/search_title">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>


</application>
</manifest>
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
package org.stepic.droid.base;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import com.squareup.otto.Subscribe;
Expand All @@ -40,114 +33,29 @@
import org.stepic.droid.util.AppConstants;
import org.stepic.droid.util.JsonHelper;
import org.stepic.droid.util.ProgressHelper;
import org.stepic.droid.view.activities.MainFeedActivity;
import org.stepic.droid.view.adapters.MyCoursesAdapter;
import org.stepic.droid.view.fragments.CourseListFragmentBase;
import org.stepic.droid.web.CoursesStepicResponse;
import org.stepic.droid.web.IApi;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;

public abstract class CoursesFragmentBase extends FragmentBase implements SwipeRefreshLayout.OnRefreshListener {
public abstract class CoursesDatabaseFragmentBase extends CourseListFragmentBase {
private static final String TAG = "base_fragment";

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_courses, container, false);
ButterKnife.bind(this, v);
return v;
}

@Bind(R.id.swipe_refresh_layout_mycourses)
protected SwipeRefreshLayout mSwipeRefreshLayout;

@Bind(R.id.list_of_courses)
protected ListView mListOfCourses;

@Bind(R.id.report_problem)
protected View mReportConnectionProblem;

@Bind(R.id.empty_courses)
protected View mEmptyCoursesView;


// protected LoadingCoursesTask mLoadingCoursesTask;
protected List<Course> mCourses;
protected MyCoursesAdapter mCoursesAdapter;
protected int mCurrentPage;
protected boolean mHasNextPage;

protected FromDbCoursesTask mDbGetCoursesTask;
protected ToDbCoursesTask mDbSaveCoursesTask;
protected View mFooterDownloadingView;
protected volatile boolean isLoading;

boolean userScrolled;

private boolean isFirstCreating;

public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

isFirstCreating = true;
isLoading = false;
mCurrentPage = 1;
mHasNextPage = true;

mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeResources(
R.color.stepic_brand_primary,
R.color.stepic_orange_carrot,
R.color.stepic_blue_ribbon);

if (mCourses == null) mCourses = new ArrayList<>();

mFooterDownloadingView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.loading_view, null, false);
mFooterDownloadingView.setVisibility(View.GONE);
mListOfCourses.addFooterView(mFooterDownloadingView);

registerForContextMenu(mListOfCourses);

mCoursesAdapter = new MyCoursesAdapter(this, mCourses, getCourseType());
mListOfCourses.setAdapter(mCoursesAdapter);

mListOfCourses.setOnScrollListener(new AbsListView.OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
userScrolled = true; // just for 1st creation
} else {
// userScrolled = false;
}
Log.i(TAG, "user scrolled " + (userScrolled ? "true" : "false"));
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (!isLoading && mHasNextPage && firstVisibleItem + visibleItemCount >= totalItemCount && userScrolled) {
Log.i(TAG, "Go load from scroll");
isLoading = true;
downloadData();
}
}
});

mEmptyCoursesView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainFeedActivity parent = (MainFeedActivity) getActivity();
if (parent == null || parent instanceof MainFeedActivity == false) return;

parent.showFindLesson();
}
});
bus.register(this);

mSwipeRefreshLayout.post(new Runnable() {
@Override
Expand All @@ -158,7 +66,8 @@ public void run() {
}

protected void showCourses(List<Course> cachedCourses) {
if (cachedCourses != null || cachedCourses.size() != 0) {
if (cachedCourses == null) return;
if (cachedCourses != null && !cachedCourses.isEmpty()) {
showEmptyScreen(false);
mReportConnectionProblem.setVisibility(View.GONE);
}
Expand All @@ -176,49 +85,6 @@ protected void showCourses(List<Course> cachedCourses) {
mCoursesAdapter.notifyDataSetChanged();
}

protected abstract DatabaseManager.Table getCourseType();

@Override
public final void onRefresh() {
YandexMetrica.reportEvent(AppConstants.METRICA_REFRESH_COURSE);
mCurrentPage = 1;
mHasNextPage = true;
downloadData();
}


public void downloadData() {
retrofit.Callback<CoursesStepicResponse> callback = new retrofit.Callback<CoursesStepicResponse>() {
@Override
public void onResponse(Response<CoursesStepicResponse> response, Retrofit retrofit) {
if (response.isSuccess()) {
bus.post(new SuccessCoursesDownloadEvent(getCourseType(), response, retrofit));
} else {

bus.post(new FailCoursesDownloadEvent(getCourseType()));
}
}

@Override
public void onFailure(Throwable t) {
bus.post(new FailCoursesDownloadEvent(getCourseType()));
}
};

IApi api = mShell.getApi();


Log.i(TAG, "post pre load");
bus.post(new PreLoadCoursesEvent(getCourseType()));
if (getCourseType() == DatabaseManager.Table.featured) {
api.getFeaturedCourses(mCurrentPage).enqueue(callback);
} else {
api.getEnrolledCourses(mCurrentPage).enqueue(callback);
}
Log.i(TAG, "mLoadingCoursesTask starts to execute");

}

private void saveDataToCache(List<Course> courses) {
mDbSaveCoursesTask = new ToDbCoursesTask(courses, getCourseType(), mCurrentPage);
mDbSaveCoursesTask.execute();
Expand Down Expand Up @@ -275,15 +141,7 @@ public void onSuccessDataLoad(SuccessCoursesDownloadEvent e) {

@Subscribe
public void onFailureDataLoad(FailCoursesDownloadEvent e) {
ProgressHelper.dismiss(mSwipeRefreshLayout);
mFooterDownloadingView.setVisibility(View.GONE);
isLoading = false;

if (mCourses == null || mCourses.size() == 0) {
//screen is clear due to error connection
showEmptyScreen(false);
mReportConnectionProblem.setVisibility(View.VISIBLE);
}
super.onFailureDataLoad(e);
}


Expand Down Expand Up @@ -327,17 +185,19 @@ public void onSuccessJoin(SuccessJoinEvent e) {

private void updateEnrollment(Course courseForUpdate, long enrollment) {

boolean inList = false;
for (Course courseItem : mCourses) {
if (courseItem.getCourseId() == courseForUpdate.getCourseId()) {
courseItem.setEnrollment((int) courseItem.getCourseId());
courseForUpdate = courseItem;
inList = true;
break;
if (getCourseType() == DatabaseManager.Table.enrolled) {
boolean inList = false;
for (Course courseItem : mCourses) {
if (courseItem.getCourseId() == courseForUpdate.getCourseId()) {
courseItem.setEnrollment((int) courseItem.getCourseId());
courseForUpdate = courseItem;
inList = true;
break;
}
}
if (!inList) {
mCourses.add(courseForUpdate);
}
}
if (!inList) {
mCourses.add(courseForUpdate);
}

}
Expand All @@ -346,7 +206,6 @@ private void updateEnrollment(Course courseForUpdate, long enrollment) {
public void onStart() {
super.onStart();
mSwipeRefreshLayout.setRefreshing(false);
bus.register(this);
}

@Override
Expand All @@ -363,11 +222,11 @@ public void onPause() {
@Override
public void onStop() {
super.onStop();
bus.unregister(this);
}

@Override
public void onDestroyView() {
bus.unregister(this);
super.onDestroyView();
}

Expand Down Expand Up @@ -419,8 +278,14 @@ public void onResponse(Response<Void> response, Retrofit retrofit) {
@Override
public void run() {
mDatabaseManager.deleteCourse(localRef, DatabaseManager.Table.enrolled);
localRef.setEnrollment(0);
mDatabaseManager.addCourse(localRef, DatabaseManager.Table.featured);

// if (!course.is_featured()){
// localRef.setEnrollment(0);
// mDatabaseManager.addCourse(localRef, DatabaseManager.Table.featured);}
// else{
// mDatabaseManager.deleteCourse(localRef, DatabaseManager.Table.featured);
// }

}
});

Expand All @@ -439,7 +304,6 @@ public void onSuccessDrop(final SuccessDropCourseEvent e) {
YandexMetrica.reportEvent(AppConstants.METRICA_DROP_COURSE + " successful", JsonHelper.toJson(e.getCourse()));
Toast.makeText(getContext(), getContext().getString(R.string.you_dropped) + " " + e.getCourse().getTitle(), Toast.LENGTH_LONG).show();
if (e.getType() == DatabaseManager.Table.enrolled) {

mCourses.remove(e.getCourse());
mCoursesAdapter.notifyDataSetChanged();
}
Expand Down Expand Up @@ -478,7 +342,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}

void showEmptyScreen(boolean isShowed) {
@Override
public void showEmptyScreen(boolean isShowed) {
if (isShowed) {
mEmptyCoursesView.setVisibility(View.VISIBLE);
mSwipeRefreshLayout.setVisibility(View.GONE);
Expand Down
Loading

0 comments on commit 8791eb9

Please sign in to comment.