forked from github/wulkanowy-mirror
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
cdd3d6a53b | |||
8431661d54 | |||
3dabb11473 | |||
63b4ed42ca | |||
2bb2341d0f | |||
797e233809 | |||
64b964ca18 | |||
c9bdac6a66 |
@ -126,6 +126,9 @@ jobs:
|
|||||||
name: Launch emulator
|
name: Launch emulator
|
||||||
command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on
|
command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on
|
||||||
background: true
|
background: true
|
||||||
|
- run:
|
||||||
|
name: Change circle-android script file permissions
|
||||||
|
command: sudo chmod +rx /bin/circle-android
|
||||||
- run:
|
- run:
|
||||||
name: Wait emulator
|
name: Wait emulator
|
||||||
command: |
|
command: |
|
||||||
|
@ -28,12 +28,12 @@ jacocoTestReport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'org.jsoup:jsoup:1.10.3'
|
implementation "org.jsoup:jsoup:$jsoup"
|
||||||
implementation 'org.apache.commons:commons-lang3:3.7'
|
implementation "org.apache.commons:commons-lang3:$apacheLang"
|
||||||
implementation 'com.google.code.gson:gson:2.8.2'
|
implementation "com.google.code.gson:gson:$gson"
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation "junit:junit:$junit"
|
||||||
testImplementation 'org.mockito:mockito-core:2.13.0'
|
testImplementation "org.mockito:mockito-core:$mockito"
|
||||||
}
|
}
|
||||||
|
|
||||||
version = PUBLISH_VERSION
|
version = PUBLISH_VERSION
|
||||||
|
@ -108,7 +108,11 @@ public class Client {
|
|||||||
|
|
||||||
this.cookies.addItems(response.cookies());
|
this.cookies.addItems(response.cookies());
|
||||||
|
|
||||||
return checkForErrors(response.parse());
|
Document doc = checkForErrors(response.parse());
|
||||||
|
|
||||||
|
lastSuccessRequest = new Date();
|
||||||
|
|
||||||
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Document postPageByUrl(String url, String[][] params) throws IOException, VulcanException {
|
public Document postPageByUrl(String url, String[][] params) throws IOException, VulcanException {
|
||||||
@ -165,16 +169,16 @@ public class Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Document checkForErrors(Document doc) throws VulcanException {
|
Document checkForErrors(Document doc) throws VulcanException {
|
||||||
if ("Przerwa techniczna".equals(doc.select("title").text())) {
|
String title = doc.select("title").text();
|
||||||
throw new VulcanOfflineException();
|
if ("Przerwa techniczna".equals(title)) {
|
||||||
|
throw new VulcanOfflineException(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("Zaloguj się".equals(doc.select(".loginButton").text())) {
|
String singIn = doc.select(".loginButton").text();
|
||||||
throw new NotLoggedInErrorException();
|
if ("Zaloguj się".equals(singIn)) {
|
||||||
|
throw new NotLoggedInErrorException(singIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastSuccessRequest = new Date();
|
|
||||||
|
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
package io.github.wulkanowy.api;
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
public class NotLoggedInErrorException extends VulcanException {
|
public class NotLoggedInErrorException extends VulcanException {
|
||||||
|
|
||||||
|
public NotLoggedInErrorException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public class StudentAndParent implements SnP {
|
|||||||
Element studentTileLink = startPage.select(".panel.linkownia.pracownik.klient > a").first();
|
Element studentTileLink = startPage.select(".panel.linkownia.pracownik.klient > a").first();
|
||||||
|
|
||||||
if (null == studentTileLink) {
|
if (null == studentTileLink) {
|
||||||
throw new NotLoggedInErrorException();
|
throw new NotLoggedInErrorException("You are probably not logged in. Force login");
|
||||||
}
|
}
|
||||||
|
|
||||||
String snpPageUrl = studentTileLink.attr("href");
|
String snpPageUrl = studentTileLink.attr("href");
|
||||||
@ -62,7 +62,7 @@ public class StudentAndParent implements SnP {
|
|||||||
String[] path = snpPageUrl.split(client.getHost())[1].split("/");
|
String[] path = snpPageUrl.split(client.getHost())[1].split("/");
|
||||||
|
|
||||||
if (5 != path.length) {
|
if (5 != path.length) {
|
||||||
throw new NotLoggedInErrorException();
|
throw new NotLoggedInErrorException("You are probably not logged in");
|
||||||
}
|
}
|
||||||
|
|
||||||
return path[2];
|
return path[2];
|
||||||
|
@ -32,7 +32,7 @@ public class Vulcan {
|
|||||||
|
|
||||||
public Client getClient() throws NotLoggedInErrorException {
|
public Client getClient() throws NotLoggedInErrorException {
|
||||||
if (null == client) {
|
if (null == client) {
|
||||||
throw new NotLoggedInErrorException();
|
throw new NotLoggedInErrorException("Use setCredentials() method first");
|
||||||
}
|
}
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
package io.github.wulkanowy.api;
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
public abstract class VulcanException extends Exception {
|
public abstract class VulcanException extends Exception {
|
||||||
|
|
||||||
|
protected VulcanException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
package io.github.wulkanowy.api;
|
package io.github.wulkanowy.api;
|
||||||
|
|
||||||
public class VulcanOfflineException extends VulcanException {
|
public class VulcanOfflineException extends VulcanException {
|
||||||
|
|
||||||
|
VulcanOfflineException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,8 @@ package io.github.wulkanowy.api.login;
|
|||||||
import io.github.wulkanowy.api.VulcanException;
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
public class AccountPermissionException extends VulcanException {
|
public class AccountPermissionException extends VulcanException {
|
||||||
|
|
||||||
|
AccountPermissionException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,8 @@ package io.github.wulkanowy.api.login;
|
|||||||
import io.github.wulkanowy.api.VulcanException;
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
public class BadCredentialsException extends VulcanException {
|
public class BadCredentialsException extends VulcanException {
|
||||||
|
|
||||||
|
BadCredentialsException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package io.github.wulkanowy.api.login;
|
|||||||
|
|
||||||
import org.jsoup.Jsoup;
|
import org.jsoup.Jsoup;
|
||||||
import org.jsoup.nodes.Document;
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
import org.jsoup.parser.Parser;
|
import org.jsoup.parser.Parser;
|
||||||
import org.jsoup.select.Elements;
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
@ -42,8 +43,9 @@ public class Login {
|
|||||||
{"Password", password}
|
{"Password", password}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (null != html.select(".ErrorMessage").first()) {
|
Element errorMessage = html.select(".ErrorMessage").first();
|
||||||
throw new BadCredentialsException();
|
if (null != errorMessage) {
|
||||||
|
throw new BadCredentialsException(errorMessage.text());
|
||||||
}
|
}
|
||||||
|
|
||||||
return html.select("input[name=wresult]").attr("value");
|
return html.select("input[name=wresult]").attr("value");
|
||||||
@ -59,11 +61,11 @@ public class Login {
|
|||||||
}).select("title").text();
|
}).select("title").text();
|
||||||
|
|
||||||
if ("Logowanie".equals(title)) {
|
if ("Logowanie".equals(title)) {
|
||||||
throw new AccountPermissionException();
|
throw new AccountPermissionException("No account access. Try another symbol");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!"Uonet+".equals(title)) {
|
if (!"Uonet+".equals(title)) {
|
||||||
throw new LoginErrorException();
|
throw new LoginErrorException("Could not log in, unknown error");
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.symbol;
|
return this.symbol;
|
||||||
|
@ -2,5 +2,9 @@ package io.github.wulkanowy.api.login;
|
|||||||
|
|
||||||
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
||||||
|
|
||||||
public class LoginErrorException extends NotLoggedInErrorException {
|
class LoginErrorException extends NotLoggedInErrorException {
|
||||||
|
|
||||||
|
LoginErrorException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,8 @@ package io.github.wulkanowy.api.messages;
|
|||||||
import io.github.wulkanowy.api.VulcanException;
|
import io.github.wulkanowy.api.VulcanException;
|
||||||
|
|
||||||
class BadRequestException extends VulcanException {
|
class BadRequestException extends VulcanException {
|
||||||
|
|
||||||
|
BadRequestException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,10 +59,10 @@ public class Messages {
|
|||||||
messages = new Gson().fromJson(res, MessagesContainer.class).data;
|
messages = new Gson().fromJson(res, MessagesContainer.class).data;
|
||||||
} catch (JsonParseException e) {
|
} catch (JsonParseException e) {
|
||||||
if (res.contains(ERROR_TITLE)) {
|
if (res.contains(ERROR_TITLE)) {
|
||||||
throw new BadRequestException();
|
throw new BadRequestException(ERROR_TITLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotLoggedInErrorException();
|
throw new NotLoggedInErrorException("You are probably not logged in");
|
||||||
}
|
}
|
||||||
|
|
||||||
return messages;
|
return messages;
|
||||||
@ -80,10 +80,10 @@ public class Messages {
|
|||||||
message = new Gson().fromJson(res, MessageContainer.class).data;
|
message = new Gson().fromJson(res, MessageContainer.class).data;
|
||||||
} catch (JsonParseException e) {
|
} catch (JsonParseException e) {
|
||||||
if (res.contains(ERROR_TITLE)) {
|
if (res.contains(ERROR_TITLE)) {
|
||||||
throw new BadRequestException();
|
throw new BadRequestException(ERROR_TITLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotLoggedInErrorException();
|
throw new NotLoggedInErrorException("You are probably not logged in. Force login");
|
||||||
}
|
}
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
|
@ -21,15 +21,15 @@ apply from: '../jacoco.gradle'
|
|||||||
apply from: '../android-sonarqube.gradle'
|
apply from: '../android-sonarqube.gradle'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 27
|
compileSdkVersion 26
|
||||||
buildToolsVersion "27.0.3"
|
buildToolsVersion "26.0.3"
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "io.github.wulkanowy"
|
applicationId "io.github.wulkanowy"
|
||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 27
|
targetSdkVersion 26
|
||||||
versionCode 3
|
versionCode 5
|
||||||
versionName "0.2.0"
|
versionName "0.2.2"
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
@ -68,42 +68,39 @@ greendao {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(':api')
|
implementation project(':api')
|
||||||
implementation 'com.android.support:appcompat-v7:27.1.0'
|
implementation "com.android.support:support-v4:$supportVersion"
|
||||||
implementation 'com.android.support:design:27.1.0'
|
implementation "com.android.support:design:$supportVersion"
|
||||||
implementation 'com.android.support:support-v4:27.1.0'
|
implementation "com.android.support:cardview-v7:$supportVersion"
|
||||||
implementation 'com.android.support:recyclerview-v7:27.1.0'
|
implementation "com.android.support:customtabs:$supportVersion"
|
||||||
implementation 'com.android.support:cardview-v7:27.1.0'
|
implementation "com.firebase:firebase-jobdispatcher:$firebaseJob"
|
||||||
implementation 'com.android.support:customtabs:27.1.0'
|
implementation "org.apache.commons:commons-lang3:$apacheLang"
|
||||||
implementation 'com.firebase:firebase-jobdispatcher:0.8.5'
|
implementation "org.apache.commons:commons-collections4:$apacheCollections"
|
||||||
implementation 'org.apache.commons:commons-lang3:3.7'
|
implementation "eu.davidea:flexible-adapter:$flexibleAdapter"
|
||||||
implementation 'eu.davidea:flexible-adapter:5.0.0-rc4'
|
implementation "eu.davidea:flexible-adapter-ui:$flexibleUi"
|
||||||
implementation 'eu.davidea:flexible-adapter-ui:1.0.0-b1'
|
implementation "org.greenrobot:greendao:$greenDao"
|
||||||
implementation 'org.apache.commons:commons-collections4:4.1'
|
implementation "com.github.yuweiguocn:GreenDaoUpgradeHelper:$greenDaoHelper"
|
||||||
implementation 'org.greenrobot:greendao:3.2.2'
|
implementation "com.jakewharton:butterknife:$butterknife"
|
||||||
implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.2'
|
implementation "joda-time:joda-time:$jodaTime"
|
||||||
implementation 'com.jakewharton:butterknife:8.8.1'
|
implementation "com.google.dagger:dagger-android-support:$dagger2"
|
||||||
implementation 'joda-time:joda-time:2.9.9'
|
implementation "com.aurelhubert:ahbottomnavigation:$ahbottom"
|
||||||
implementation 'com.google.dagger:dagger-android:2.14.1'
|
|
||||||
implementation 'com.google.dagger:dagger-android-support:2.14.1'
|
|
||||||
implementation 'com.aurelhubert:ahbottomnavigation:2.1.0'
|
|
||||||
|
|
||||||
implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
|
implementation("com.crashlytics.sdk.android:crashlytics:$crashlyticsSdk@aar") {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
implementation('com.crashlytics.sdk.android:answers:1.4.1@aar') {
|
implementation("com.crashlytics.sdk.android:answers:$crashlyticsAnswers@aar") {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
|
|
||||||
annotationProcessor 'com.google.dagger:dagger-android-processor:2.14.1'
|
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger2"
|
||||||
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
|
annotationProcessor "com.google.dagger:dagger-compiler:$dagger2"
|
||||||
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
|
annotationProcessor "com.jakewharton:butterknife-compiler:$butterknife"
|
||||||
|
|
||||||
debugImplementation 'com.amitshekhar.android:debug-db:1.0.1'
|
debugImplementation "com.amitshekhar.android:debug-db:$debugDb"
|
||||||
debugImplementation 'net.zetetic:android-database-sqlcipher:3.5.9'
|
debugImplementation "net.zetetic:android-database-sqlcipher:$sqlcipher"
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation "junit:junit:$junit"
|
||||||
testImplementation 'org.mockito:mockito-core:2.13.0'
|
testImplementation "org.mockito:mockito-core:$mockito"
|
||||||
|
|
||||||
androidTestImplementation 'com.android.support.test:runner:1.0.1'
|
androidTestImplementation "com.android.support.test:runner:$testRunner"
|
||||||
androidTestImplementation 'org.mockito:mockito-android:2.13.0'
|
androidTestImplementation "org.mockito:mockito-android:$mockito"
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import io.github.wulkanowy.data.RepositoryContract;
|
|||||||
import io.github.wulkanowy.di.component.ApplicationComponent;
|
import io.github.wulkanowy.di.component.ApplicationComponent;
|
||||||
import io.github.wulkanowy.di.component.DaggerApplicationComponent;
|
import io.github.wulkanowy.di.component.DaggerApplicationComponent;
|
||||||
import io.github.wulkanowy.di.modules.ApplicationModule;
|
import io.github.wulkanowy.di.modules.ApplicationModule;
|
||||||
|
import io.github.wulkanowy.utils.LogUtils;
|
||||||
|
|
||||||
public class WulkanowyApp extends Application {
|
public class WulkanowyApp extends Application {
|
||||||
|
|
||||||
@ -37,6 +38,17 @@ public class WulkanowyApp extends Application {
|
|||||||
enableDebugLog();
|
enableDebugLog();
|
||||||
}
|
}
|
||||||
initializeFabric();
|
initializeFabric();
|
||||||
|
initializeUserSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeUserSession() {
|
||||||
|
if (repository.getCurrentUserId() != 0) {
|
||||||
|
try {
|
||||||
|
repository.initLastUser();
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtils.error("An error occurred when the application was started", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableDebugLog() {
|
private void enableDebugLog() {
|
||||||
|
@ -12,7 +12,6 @@ import javax.inject.Singleton;
|
|||||||
|
|
||||||
import io.github.wulkanowy.R;
|
import io.github.wulkanowy.R;
|
||||||
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
import io.github.wulkanowy.api.NotLoggedInErrorException;
|
||||||
import io.github.wulkanowy.api.VulcanOfflineException;
|
|
||||||
import io.github.wulkanowy.data.db.dao.entities.AttendanceLesson;
|
import io.github.wulkanowy.data.db.dao.entities.AttendanceLesson;
|
||||||
import io.github.wulkanowy.di.annotations.ApplicationContext;
|
import io.github.wulkanowy.di.annotations.ApplicationContext;
|
||||||
import io.github.wulkanowy.utils.AppConstant;
|
import io.github.wulkanowy.utils.AppConstant;
|
||||||
@ -51,8 +50,6 @@ public class AppResources implements ResourcesContract {
|
|||||||
return resources.getString(R.string.generic_timeout_error);
|
return resources.getString(R.string.generic_timeout_error);
|
||||||
} else if (exception instanceof NotLoggedInErrorException || exception instanceof IOException) {
|
} else if (exception instanceof NotLoggedInErrorException || exception instanceof IOException) {
|
||||||
return resources.getString(R.string.login_denied_text);
|
return resources.getString(R.string.login_denied_text);
|
||||||
} else if (exception instanceof VulcanOfflineException) {
|
|
||||||
return resources.getString(R.string.error_host_offline);
|
|
||||||
} else {
|
} else {
|
||||||
return exception.getMessage();
|
return exception.getMessage();
|
||||||
}
|
}
|
||||||
|
@ -17,20 +17,16 @@ public interface AttendanceContract {
|
|||||||
|
|
||||||
void setAdapterWithTabLayout();
|
void setAdapterWithTabLayout();
|
||||||
|
|
||||||
void setChildFragmentSelected(int position, boolean selected);
|
|
||||||
|
|
||||||
boolean isMenuVisible();
|
boolean isMenuVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PerActivity
|
@PerActivity
|
||||||
interface Presenter extends BaseContract.Presenter<View> {
|
interface Presenter extends BaseContract.Presenter<View> {
|
||||||
|
|
||||||
void onFragmentVisible(boolean isVisible);
|
void onFragmentActivated(boolean isVisible);
|
||||||
|
|
||||||
void onTabSelected(int position);
|
|
||||||
|
|
||||||
void onTabUnselected(int position);
|
|
||||||
|
|
||||||
void onStart(View view, OnFragmentIsReadyListener listener);
|
void onStart(View view, OnFragmentIsReadyListener listener);
|
||||||
|
|
||||||
|
void setRestoredPosition(int position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,9 @@ import io.github.wulkanowy.ui.base.BaseFragment;
|
|||||||
import io.github.wulkanowy.ui.main.OnFragmentIsReadyListener;
|
import io.github.wulkanowy.ui.main.OnFragmentIsReadyListener;
|
||||||
import io.github.wulkanowy.ui.main.TabsData;
|
import io.github.wulkanowy.ui.main.TabsData;
|
||||||
|
|
||||||
public class AttendanceFragment extends BaseFragment implements AttendanceContract.View, TabLayout.OnTabSelectedListener {
|
public class AttendanceFragment extends BaseFragment implements AttendanceContract.View {
|
||||||
|
|
||||||
|
private static final String CURRENT_ITEM_KEY = "CurrentItem";
|
||||||
|
|
||||||
@BindView(R.id.attendance_fragment_viewpager)
|
@BindView(R.id.attendance_fragment_viewpager)
|
||||||
ViewPager viewPager;
|
ViewPager viewPager;
|
||||||
@ -45,6 +47,10 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
|||||||
component.inject(this);
|
component.inject(this);
|
||||||
setButterKnife(ButterKnife.bind(this, view));
|
setButterKnife(ButterKnife.bind(this, view));
|
||||||
presenter.onStart(this, (OnFragmentIsReadyListener) getActivity());
|
presenter.onStart(this, (OnFragmentIsReadyListener) getActivity());
|
||||||
|
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
presenter.setRestoredPosition(savedInstanceState.getInt(CURRENT_ITEM_KEY));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
@ -54,25 +60,10 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
|||||||
public void setMenuVisibility(boolean menuVisible) {
|
public void setMenuVisibility(boolean menuVisible) {
|
||||||
super.setMenuVisibility(menuVisible);
|
super.setMenuVisibility(menuVisible);
|
||||||
if (presenter != null) {
|
if (presenter != null) {
|
||||||
presenter.onFragmentVisible(menuVisible);
|
presenter.onFragmentActivated(menuVisible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabSelected(TabLayout.Tab tab) {
|
|
||||||
presenter.onTabSelected(tab.getPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabUnselected(TabLayout.Tab tab) {
|
|
||||||
presenter.onTabUnselected(tab.getPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabReselected(TabLayout.Tab tab) {
|
|
||||||
//do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTabDataToAdapter(TabsData tabsData) {
|
public void setTabDataToAdapter(TabsData tabsData) {
|
||||||
pagerAdapter.setTabsData(tabsData);
|
pagerAdapter.setTabsData(tabsData);
|
||||||
@ -81,14 +72,7 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
|||||||
@Override
|
@Override
|
||||||
public void setAdapterWithTabLayout() {
|
public void setAdapterWithTabLayout() {
|
||||||
viewPager.setAdapter(pagerAdapter);
|
viewPager.setAdapter(pagerAdapter);
|
||||||
|
|
||||||
tabLayout.setupWithViewPager(viewPager);
|
tabLayout.setupWithViewPager(viewPager);
|
||||||
tabLayout.addOnTabSelectedListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setChildFragmentSelected(int position, boolean selected) {
|
|
||||||
((AttendanceTabFragment) pagerAdapter.getItem(position)).setSelected(selected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -109,6 +93,12 @@ public class AttendanceFragment extends BaseFragment implements AttendanceContra
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
outState.putInt(CURRENT_ITEM_KEY, viewPager.getCurrentItem());
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
presenter.onDestroy();
|
presenter.onDestroy();
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package io.github.wulkanowy.ui.main.attendance;
|
package io.github.wulkanowy.ui.main.attendance;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
@ -16,6 +19,7 @@ import butterknife.BindView;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
|
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.viewholders.ExpandableViewHolder;
|
import eu.davidea.viewholders.ExpandableViewHolder;
|
||||||
import io.github.wulkanowy.R;
|
import io.github.wulkanowy.R;
|
||||||
import io.github.wulkanowy.data.db.dao.entities.Day;
|
import io.github.wulkanowy.data.db.dao.entities.Day;
|
||||||
@ -55,12 +59,13 @@ public class AttendanceHeaderItem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||||
return new HeaderViewHolder(view, adapter);
|
return new HeaderViewHolder(view, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void bindViewHolder(FlexibleAdapter adapter, HeaderViewHolder holder, int position, List payloads) {
|
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, HeaderViewHolder holder,
|
||||||
|
int position, List<Object> payloads) {
|
||||||
holder.onBind(day, getSubItems());
|
holder.onBind(day, getSubItems());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,10 +92,16 @@ public class AttendanceHeaderItem
|
|||||||
@BindColor(R.color.free_day)
|
@BindColor(R.color.free_day)
|
||||||
int backgroundFreeDay;
|
int backgroundFreeDay;
|
||||||
|
|
||||||
|
@BindColor(android.R.color.black)
|
||||||
|
int black;
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
HeaderViewHolder(View view, FlexibleAdapter adapter) {
|
HeaderViewHolder(View view, FlexibleAdapter adapter) {
|
||||||
super(view, adapter);
|
super(view, adapter);
|
||||||
view.setOnClickListener(this);
|
view.setOnClickListener(this);
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
context = view.getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onBind(Day item, List<AttendanceSubItem> subItems) {
|
void onBind(Day item, List<AttendanceSubItem> subItems) {
|
||||||
@ -103,14 +114,30 @@ public class AttendanceHeaderItem
|
|||||||
description.setVisibility(numberOfHours > 0 ? View.VISIBLE : View.INVISIBLE);
|
description.setVisibility(numberOfHours > 0 ? View.VISIBLE : View.INVISIBLE);
|
||||||
alert.setVisibility(isSubItemsHasChanges(subItems) ? View.VISIBLE : View.INVISIBLE);
|
alert.setVisibility(isSubItemsHasChanges(subItems) ? View.VISIBLE : View.INVISIBLE);
|
||||||
freeName.setVisibility(subItems.isEmpty() ? View.VISIBLE : View.INVISIBLE);
|
freeName.setVisibility(subItems.isEmpty() ? View.VISIBLE : View.INVISIBLE);
|
||||||
|
setInactiveHeader(item.getAttendanceLessons().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
if (item.getAttendanceLessons().isEmpty()) {
|
|
||||||
((FrameLayout) getContentView()).setForeground(null);
|
private void setInactiveHeader(boolean inactive) {
|
||||||
|
((FrameLayout) getContentView()).setForeground(inactive ? null : getSelectableDrawable());
|
||||||
|
dayName.setTextColor(inactive ? secondaryColor : black);
|
||||||
|
|
||||||
|
if (inactive) {
|
||||||
getContentView().setBackgroundColor(backgroundFreeDay);
|
getContentView().setBackgroundColor(backgroundFreeDay);
|
||||||
dayName.setTextColor(secondaryColor);
|
} else {
|
||||||
|
getContentView().setBackgroundDrawable(context.getResources()
|
||||||
|
.getDrawable(R.drawable.ic_border));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Drawable getSelectableDrawable() {
|
||||||
|
int[] attrs = new int[]{R.attr.selectableItemBackground};
|
||||||
|
TypedArray typedArray = context.obtainStyledAttributes(attrs);
|
||||||
|
Drawable drawable = typedArray.getDrawable(0);
|
||||||
|
typedArray.recycle();
|
||||||
|
return drawable;
|
||||||
|
}
|
||||||
|
|
||||||
private int countNotPresentHours(List<AttendanceSubItem> subItems) {
|
private int countNotPresentHours(List<AttendanceSubItem> subItems) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (AttendanceSubItem subItem : subItems) {
|
for (AttendanceSubItem subItem : subItems) {
|
||||||
@ -118,17 +145,16 @@ public class AttendanceHeaderItem
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSubItemsHasChanges(List<AttendanceSubItem> subItems) {
|
private boolean isSubItemsHasChanges(List<AttendanceSubItem> subItems) {
|
||||||
for (AttendanceSubItem subItem : subItems) {
|
for (AttendanceSubItem subItem : subItems) {
|
||||||
if (subItem.getLesson().getIsAbsenceUnexcused() || subItem.getLesson().getIsUnexcusedLateness()) {
|
if (subItem.getLesson().getIsAbsenceUnexcused() || subItem.getLesson()
|
||||||
|
.getIsUnexcusedLateness()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
|||||||
|
|
||||||
private OnFragmentIsReadyListener listener;
|
private OnFragmentIsReadyListener listener;
|
||||||
|
|
||||||
private int positionToScroll;
|
private int positionToScroll = 0;
|
||||||
|
|
||||||
private boolean isFirstSight = false;
|
private boolean isFirstSight = false;
|
||||||
|
|
||||||
@ -45,7 +45,10 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
|||||||
if (dates.isEmpty()) {
|
if (dates.isEmpty()) {
|
||||||
dates = TimeUtils.getMondaysFromCurrentSchoolYear();
|
dates = TimeUtils.getMondaysFromCurrentSchoolYear();
|
||||||
}
|
}
|
||||||
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
|
||||||
|
if (positionToScroll == 0) {
|
||||||
|
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isFirstSight) {
|
if (!isFirstSight) {
|
||||||
isFirstSight = true;
|
isFirstSight = true;
|
||||||
@ -57,22 +60,12 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFragmentVisible(boolean isVisible) {
|
public void onFragmentActivated(boolean isVisible) {
|
||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
getView().setActivityTitle();
|
getView().setActivityTitle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabSelected(int position) {
|
|
||||||
getView().setChildFragmentSelected(position, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabUnselected(int position) {
|
|
||||||
getView().setChildFragmentSelected(position, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDoInBackgroundLoading() throws Exception {
|
public void onDoInBackgroundLoading() throws Exception {
|
||||||
for (String date : dates) {
|
for (String date : dates) {
|
||||||
@ -97,6 +90,11 @@ public class AttendancePresenter extends BasePresenter<AttendanceContract.View>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRestoredPosition(int position) {
|
||||||
|
this.positionToScroll = position;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
isFirstSight = false;
|
isFirstSight = false;
|
||||||
|
@ -16,6 +16,7 @@ import butterknife.BindView;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
|
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import io.github.wulkanowy.R;
|
import io.github.wulkanowy.R;
|
||||||
import io.github.wulkanowy.data.db.dao.entities.AttendanceLesson;
|
import io.github.wulkanowy.data.db.dao.entities.AttendanceLesson;
|
||||||
@ -60,12 +61,13 @@ class AttendanceSubItem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AttendanceSubItem.SubItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
public SubItemViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||||
return new AttendanceSubItem.SubItemViewHolder(view, adapter);
|
return new SubItemViewHolder(view, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void bindViewHolder(FlexibleAdapter adapter, AttendanceSubItem.SubItemViewHolder holder, int position, List payloads) {
|
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, SubItemViewHolder holder,
|
||||||
|
int position, List<Object> payloads) {
|
||||||
holder.onBind(lesson);
|
holder.onBind(lesson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,12 +21,10 @@ public interface AttendanceTabContract {
|
|||||||
|
|
||||||
interface Presenter extends BaseContract.Presenter<AttendanceTabContract.View> {
|
interface Presenter extends BaseContract.Presenter<AttendanceTabContract.View> {
|
||||||
|
|
||||||
void onFragmentSelected(boolean isSelected);
|
void onFragmentActivated(boolean isSelected);
|
||||||
|
|
||||||
void setArgumentDate(String date);
|
void setArgumentDate(String date);
|
||||||
|
|
||||||
void onStart(AttendanceTabContract.View view, boolean isPrimary);
|
|
||||||
|
|
||||||
void onRefresh();
|
void onRefresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,12 +27,6 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
|
|
||||||
private static final String ARGUMENT_KEY = "date";
|
private static final String ARGUMENT_KEY = "date";
|
||||||
|
|
||||||
private static final String SAVED_KEY = "isSelected";
|
|
||||||
|
|
||||||
private boolean isPrimary = false;
|
|
||||||
|
|
||||||
private boolean isSelected = false;
|
|
||||||
|
|
||||||
@BindView(R.id.attendance_tab_fragment_recycler)
|
@BindView(R.id.attendance_tab_fragment_recycler)
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
|
|
||||||
@ -51,6 +45,8 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
@Inject
|
@Inject
|
||||||
FlexibleAdapter<AttendanceHeaderItem> adapter;
|
FlexibleAdapter<AttendanceHeaderItem> adapter;
|
||||||
|
|
||||||
|
private boolean isFragmentVisible = false;
|
||||||
|
|
||||||
public static AttendanceTabFragment newInstance(String date) {
|
public static AttendanceTabFragment newInstance(String date) {
|
||||||
AttendanceTabFragment fragmentTab = new AttendanceTabFragment();
|
AttendanceTabFragment fragmentTab = new AttendanceTabFragment();
|
||||||
|
|
||||||
@ -61,15 +57,6 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
return fragmentTab;
|
return fragmentTab;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
if (savedInstanceState != null) {
|
|
||||||
isSelected = savedInstanceState.getBoolean(SAVED_KEY, isSelected);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
@ -84,7 +71,8 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
presenter.setArgumentDate(getArguments().getString(ARGUMENT_KEY));
|
presenter.setArgumentDate(getArguments().getString(ARGUMENT_KEY));
|
||||||
}
|
}
|
||||||
|
|
||||||
presenter.onStart(this, isPrimary);
|
presenter.onStart(this);
|
||||||
|
presenter.onFragmentActivated(isFragmentVisible);
|
||||||
}
|
}
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@ -111,10 +99,9 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
@Override
|
@Override
|
||||||
public void setMenuVisibility(boolean menuVisible) {
|
public void setMenuVisibility(boolean menuVisible) {
|
||||||
super.setMenuVisibility(menuVisible);
|
super.setMenuVisibility(menuVisible);
|
||||||
if (presenter != null && getView() != null) {
|
isFragmentVisible = menuVisible;
|
||||||
presenter.onFragmentSelected(isSelected);
|
if (presenter != null) {
|
||||||
} else if (isSelected) {
|
presenter.onFragmentActivated(menuVisible);
|
||||||
isPrimary = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,10 +130,6 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
noItemView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
noItemView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSelected(boolean selected) {
|
|
||||||
isSelected = selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(String message) {
|
public void onError(String message) {
|
||||||
if (getActivity() != null) {
|
if (getActivity() != null) {
|
||||||
@ -155,15 +138,8 @@ public class AttendanceTabFragment extends BaseFragment implements AttendanceTab
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
|
||||||
outState.putBoolean(SAVED_KEY, isSelected);
|
|
||||||
super.onSaveInstanceState(outState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
isPrimary = false;
|
|
||||||
presenter.onDestroy();
|
presenter.onDestroy();
|
||||||
super.onDestroyView();
|
super.onDestroyView();
|
||||||
}
|
}
|
||||||
|
@ -33,21 +33,22 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart(AttendanceTabContract.View view, boolean isPrimary) {
|
public void onStart(AttendanceTabContract.View view) {
|
||||||
super.onStart(view);
|
super.onStart(view);
|
||||||
getView().showProgressBar(true);
|
getView().showProgressBar(true);
|
||||||
getView().showNoItem(false);
|
getView().showNoItem(false);
|
||||||
onFragmentSelected(isPrimary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFragmentSelected(boolean isSelected) {
|
public void onFragmentActivated(boolean isSelected) {
|
||||||
if (!isFirstSight && isSelected) {
|
if (!isFirstSight && isSelected && isViewAttached()) {
|
||||||
isFirstSight = true;
|
isFirstSight = true;
|
||||||
|
|
||||||
loadingTask = new AbstractTask();
|
loadingTask = new AbstractTask();
|
||||||
loadingTask.setOnFirstLoadingListener(this);
|
loadingTask.setOnFirstLoadingListener(this);
|
||||||
loadingTask.execute();
|
loadingTask.execute();
|
||||||
|
} else if (!isSelected) {
|
||||||
|
cancelAsyncTasks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +106,7 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
|||||||
boolean isEmptyWeek = true;
|
boolean isEmptyWeek = true;
|
||||||
|
|
||||||
for (Day day : dayList) {
|
for (Day day : dayList) {
|
||||||
|
day.resetAttendanceLessons();
|
||||||
AttendanceHeaderItem headerItem = new AttendanceHeaderItem(day);
|
AttendanceHeaderItem headerItem = new AttendanceHeaderItem(day);
|
||||||
|
|
||||||
if (isEmptyWeek) {
|
if (isEmptyWeek) {
|
||||||
@ -156,10 +158,7 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
|||||||
getRepository().syncAttendance(date);
|
getRepository().syncAttendance(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void cancelAsyncTasks() {
|
||||||
public void onDestroy() {
|
|
||||||
isFirstSight = false;
|
|
||||||
|
|
||||||
if (refreshTask != null) {
|
if (refreshTask != null) {
|
||||||
refreshTask.cancel(true);
|
refreshTask.cancel(true);
|
||||||
refreshTask = null;
|
refreshTask = null;
|
||||||
@ -168,7 +167,12 @@ public class AttendanceTabPresenter extends BasePresenter<AttendanceTabContract.
|
|||||||
loadingTask.cancel(true);
|
loadingTask.cancel(true);
|
||||||
loadingTask = null;
|
loadingTask = null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
cancelAsyncTasks();
|
||||||
|
isFirstSight = false;
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,7 @@ public class GradesPresenter extends BasePresenter<GradesContract.View>
|
|||||||
headerItems = new ArrayList<>();
|
headerItems = new ArrayList<>();
|
||||||
|
|
||||||
for (Subject subject : subjectList) {
|
for (Subject subject : subjectList) {
|
||||||
|
subject.resetGradeList();
|
||||||
List<Grade> gradeList = subject.getGradeList();
|
List<Grade> gradeList = subject.getGradeList();
|
||||||
|
|
||||||
if (!gradeList.isEmpty()) {
|
if (!gradeList.isEmpty()) {
|
||||||
|
@ -37,7 +37,7 @@ public class GradesSubItem
|
|||||||
return grade;
|
return grade;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSubjectAlertImage(View subjectAlertImage) {
|
void setSubjectAlertImage(View subjectAlertImage) {
|
||||||
this.subjectAlertImage = subjectAlertImage;
|
this.subjectAlertImage = subjectAlertImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,20 +17,16 @@ public interface TimetableContract {
|
|||||||
|
|
||||||
void setAdapterWithTabLayout();
|
void setAdapterWithTabLayout();
|
||||||
|
|
||||||
void setChildFragmentSelected(int position, boolean selected);
|
|
||||||
|
|
||||||
boolean isMenuVisible();
|
boolean isMenuVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
@PerActivity
|
@PerActivity
|
||||||
interface Presenter extends BaseContract.Presenter<View> {
|
interface Presenter extends BaseContract.Presenter<View> {
|
||||||
|
|
||||||
void onFragmentVisible(boolean isVisible);
|
void onFragmentActivated(boolean isVisible);
|
||||||
|
|
||||||
void onTabSelected(int position);
|
|
||||||
|
|
||||||
void onTabUnselected(int position);
|
|
||||||
|
|
||||||
void onStart(View view, OnFragmentIsReadyListener listener);
|
void onStart(View view, OnFragmentIsReadyListener listener);
|
||||||
|
|
||||||
|
void setRestoredPosition(int position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,9 @@ import io.github.wulkanowy.ui.base.BaseFragment;
|
|||||||
import io.github.wulkanowy.ui.main.OnFragmentIsReadyListener;
|
import io.github.wulkanowy.ui.main.OnFragmentIsReadyListener;
|
||||||
import io.github.wulkanowy.ui.main.TabsData;
|
import io.github.wulkanowy.ui.main.TabsData;
|
||||||
|
|
||||||
public class TimetableFragment extends BaseFragment implements TimetableContract.View, TabLayout.OnTabSelectedListener {
|
public class TimetableFragment extends BaseFragment implements TimetableContract.View {
|
||||||
|
|
||||||
|
private static final String CURRENT_ITEM_KEY = "CurrentItem";
|
||||||
|
|
||||||
@BindView(R.id.timetable_fragment_viewpager)
|
@BindView(R.id.timetable_fragment_viewpager)
|
||||||
ViewPager viewPager;
|
ViewPager viewPager;
|
||||||
@ -44,6 +46,10 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
|||||||
component.inject(this);
|
component.inject(this);
|
||||||
setButterKnife(ButterKnife.bind(this, view));
|
setButterKnife(ButterKnife.bind(this, view));
|
||||||
presenter.onStart(this, (OnFragmentIsReadyListener) getActivity());
|
presenter.onStart(this, (OnFragmentIsReadyListener) getActivity());
|
||||||
|
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
presenter.setRestoredPosition(savedInstanceState.getInt(CURRENT_ITEM_KEY));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@ -52,25 +58,10 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
|||||||
public void setMenuVisibility(boolean menuVisible) {
|
public void setMenuVisibility(boolean menuVisible) {
|
||||||
super.setMenuVisibility(menuVisible);
|
super.setMenuVisibility(menuVisible);
|
||||||
if (presenter != null) {
|
if (presenter != null) {
|
||||||
presenter.onFragmentVisible(menuVisible);
|
presenter.onFragmentActivated(menuVisible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabSelected(TabLayout.Tab tab) {
|
|
||||||
presenter.onTabSelected(tab.getPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabUnselected(TabLayout.Tab tab) {
|
|
||||||
presenter.onTabUnselected(tab.getPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabReselected(TabLayout.Tab tab) {
|
|
||||||
//do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTabDataToAdapter(TabsData tabsData) {
|
public void setTabDataToAdapter(TabsData tabsData) {
|
||||||
pagerAdapter.setTabsData(tabsData);
|
pagerAdapter.setTabsData(tabsData);
|
||||||
@ -79,14 +70,7 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
|||||||
@Override
|
@Override
|
||||||
public void setAdapterWithTabLayout() {
|
public void setAdapterWithTabLayout() {
|
||||||
viewPager.setAdapter(pagerAdapter);
|
viewPager.setAdapter(pagerAdapter);
|
||||||
|
|
||||||
tabLayout.setupWithViewPager(viewPager);
|
tabLayout.setupWithViewPager(viewPager);
|
||||||
tabLayout.addOnTabSelectedListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setChildFragmentSelected(int position, boolean selected) {
|
|
||||||
((TimetableTabFragment) pagerAdapter.getItem(position)).setSelected(selected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -107,6 +91,12 @@ public class TimetableFragment extends BaseFragment implements TimetableContract
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
outState.putInt(CURRENT_ITEM_KEY, viewPager.getCurrentItem());
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
presenter.onDestroy();
|
presenter.onDestroy();
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package io.github.wulkanowy.ui.main.timetable;
|
package io.github.wulkanowy.ui.main.timetable;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
@ -16,6 +19,7 @@ import butterknife.BindView;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
|
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.viewholders.ExpandableViewHolder;
|
import eu.davidea.viewholders.ExpandableViewHolder;
|
||||||
import io.github.wulkanowy.R;
|
import io.github.wulkanowy.R;
|
||||||
import io.github.wulkanowy.data.db.dao.entities.Day;
|
import io.github.wulkanowy.data.db.dao.entities.Day;
|
||||||
@ -55,12 +59,13 @@ public class TimetableHeaderItem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
public HeaderViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||||
return new HeaderViewHolder(view, adapter);
|
return new HeaderViewHolder(view, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void bindViewHolder(FlexibleAdapter adapter, HeaderViewHolder holder, int position, List payloads) {
|
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, HeaderViewHolder holder,
|
||||||
|
int position, List<Object> payloads) {
|
||||||
holder.onBind(day, getSubItems());
|
holder.onBind(day, getSubItems());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,10 +89,16 @@ public class TimetableHeaderItem
|
|||||||
@BindColor(R.color.free_day)
|
@BindColor(R.color.free_day)
|
||||||
int backgroundFreeDay;
|
int backgroundFreeDay;
|
||||||
|
|
||||||
|
@BindColor(android.R.color.black)
|
||||||
|
int black;
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
HeaderViewHolder(View view, FlexibleAdapter adapter) {
|
HeaderViewHolder(View view, FlexibleAdapter adapter) {
|
||||||
super(view, adapter);
|
super(view, adapter);
|
||||||
view.setOnClickListener(this);
|
view.setOnClickListener(this);
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
context = view.getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onBind(Day item, List<TimetableSubItem> subItems) {
|
void onBind(Day item, List<TimetableSubItem> subItems) {
|
||||||
@ -96,14 +107,29 @@ public class TimetableHeaderItem
|
|||||||
alert.setVisibility(isSubItemNewMovedInOrChanged(subItems) ? View.VISIBLE : View.INVISIBLE);
|
alert.setVisibility(isSubItemNewMovedInOrChanged(subItems) ? View.VISIBLE : View.INVISIBLE);
|
||||||
freeName.setVisibility(item.getIsFreeDay() ? View.VISIBLE : View.INVISIBLE);
|
freeName.setVisibility(item.getIsFreeDay() ? View.VISIBLE : View.INVISIBLE);
|
||||||
freeName.setText(item.getFreeDayName());
|
freeName.setText(item.getFreeDayName());
|
||||||
|
setInactiveHeader(item.getIsFreeDay());
|
||||||
|
}
|
||||||
|
|
||||||
if (item.getIsFreeDay()) {
|
private void setInactiveHeader(boolean inactive) {
|
||||||
((FrameLayout) getContentView()).setForeground(null);
|
((FrameLayout) getContentView()).setForeground(inactive ? null : getSelectableDrawable());
|
||||||
|
dayName.setTextColor(inactive ? secondaryColor : black);
|
||||||
|
|
||||||
|
if (inactive) {
|
||||||
getContentView().setBackgroundColor(backgroundFreeDay);
|
getContentView().setBackgroundColor(backgroundFreeDay);
|
||||||
dayName.setTextColor(secondaryColor);
|
} else {
|
||||||
|
getContentView().setBackgroundDrawable(context.getResources()
|
||||||
|
.getDrawable(R.drawable.ic_border));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Drawable getSelectableDrawable() {
|
||||||
|
int[] attrs = new int[]{R.attr.selectableItemBackground};
|
||||||
|
TypedArray typedArray = context.obtainStyledAttributes(attrs);
|
||||||
|
Drawable drawable = typedArray.getDrawable(0);
|
||||||
|
typedArray.recycle();
|
||||||
|
return drawable;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isSubItemNewMovedInOrChanged(List<TimetableSubItem> subItems) {
|
private boolean isSubItemNewMovedInOrChanged(List<TimetableSubItem> subItems) {
|
||||||
boolean isAlertActive = false;
|
boolean isAlertActive = false;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
|||||||
|
|
||||||
private OnFragmentIsReadyListener listener;
|
private OnFragmentIsReadyListener listener;
|
||||||
|
|
||||||
private int positionToScroll;
|
private int positionToScroll = 0;
|
||||||
|
|
||||||
private boolean isFirstSight = false;
|
private boolean isFirstSight = false;
|
||||||
|
|
||||||
@ -45,7 +45,10 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
|||||||
if (dates.isEmpty()) {
|
if (dates.isEmpty()) {
|
||||||
dates = TimeUtils.getMondaysFromCurrentSchoolYear();
|
dates = TimeUtils.getMondaysFromCurrentSchoolYear();
|
||||||
}
|
}
|
||||||
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
|
||||||
|
if (positionToScroll == 0) {
|
||||||
|
positionToScroll = dates.indexOf(TimeUtils.getDateOfCurrentMonday(true));
|
||||||
|
}
|
||||||
|
|
||||||
if (!isFirstSight) {
|
if (!isFirstSight) {
|
||||||
isFirstSight = true;
|
isFirstSight = true;
|
||||||
@ -57,22 +60,12 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFragmentVisible(boolean isVisible) {
|
public void onFragmentActivated(boolean isVisible) {
|
||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
getView().setActivityTitle();
|
getView().setActivityTitle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabSelected(int position) {
|
|
||||||
getView().setChildFragmentSelected(position, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTabUnselected(int position) {
|
|
||||||
getView().setChildFragmentSelected(position, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDoInBackgroundLoading() throws Exception {
|
public void onDoInBackgroundLoading() throws Exception {
|
||||||
for (String date : dates) {
|
for (String date : dates) {
|
||||||
@ -84,7 +77,6 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
|||||||
@Override
|
@Override
|
||||||
public void onCanceledLoadingAsync() {
|
public void onCanceledLoadingAsync() {
|
||||||
//do nothing
|
//do nothing
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -97,6 +89,11 @@ public class TimetablePresenter extends BasePresenter<TimetableContract.View>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRestoredPosition(int position) {
|
||||||
|
this.positionToScroll = position;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
isFirstSight = false;
|
isFirstSight = false;
|
||||||
|
@ -17,6 +17,7 @@ import butterknife.BindView;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
|
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
|
||||||
|
import eu.davidea.flexibleadapter.items.IFlexible;
|
||||||
import eu.davidea.viewholders.FlexibleViewHolder;
|
import eu.davidea.viewholders.FlexibleViewHolder;
|
||||||
import io.github.wulkanowy.R;
|
import io.github.wulkanowy.R;
|
||||||
import io.github.wulkanowy.data.db.dao.entities.TimetableLesson;
|
import io.github.wulkanowy.data.db.dao.entities.TimetableLesson;
|
||||||
@ -27,7 +28,7 @@ public class TimetableSubItem
|
|||||||
|
|
||||||
private TimetableLesson lesson;
|
private TimetableLesson lesson;
|
||||||
|
|
||||||
public TimetableSubItem(TimetableHeaderItem header, TimetableLesson lesson) {
|
TimetableSubItem(TimetableHeaderItem header, TimetableLesson lesson) {
|
||||||
super(header);
|
super(header);
|
||||||
this.lesson = lesson;
|
this.lesson = lesson;
|
||||||
}
|
}
|
||||||
@ -62,12 +63,13 @@ public class TimetableSubItem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SubItemViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
|
public SubItemViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
|
||||||
return new SubItemViewHolder(view, adapter);
|
return new SubItemViewHolder(view, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void bindViewHolder(FlexibleAdapter adapter, SubItemViewHolder holder, int position, List payloads) {
|
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, SubItemViewHolder holder,
|
||||||
|
int position, List<Object> payloads) {
|
||||||
holder.onBind(lesson);
|
holder.onBind(lesson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,12 +23,10 @@ public interface TimetableTabContract {
|
|||||||
|
|
||||||
interface Presenter extends BaseContract.Presenter<View> {
|
interface Presenter extends BaseContract.Presenter<View> {
|
||||||
|
|
||||||
void onFragmentSelected(boolean isSelected);
|
void onFragmentActivated(boolean isSelected);
|
||||||
|
|
||||||
void setArgumentDate(String date);
|
void setArgumentDate(String date);
|
||||||
|
|
||||||
void onStart(View view, boolean isPrimary);
|
|
||||||
|
|
||||||
void onRefresh();
|
void onRefresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,6 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
|
|
||||||
private static final String ARGUMENT_KEY = "date";
|
private static final String ARGUMENT_KEY = "date";
|
||||||
|
|
||||||
private static final String SAVED_KEY = "isSelected";
|
|
||||||
|
|
||||||
private boolean isPrimary = false;
|
|
||||||
|
|
||||||
private boolean isSelected = false;
|
|
||||||
|
|
||||||
@BindView(R.id.timetable_tab_fragment_recycler)
|
@BindView(R.id.timetable_tab_fragment_recycler)
|
||||||
RecyclerView recyclerView;
|
RecyclerView recyclerView;
|
||||||
|
|
||||||
@ -55,6 +49,8 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
@Inject
|
@Inject
|
||||||
FlexibleAdapter<TimetableHeaderItem> adapter;
|
FlexibleAdapter<TimetableHeaderItem> adapter;
|
||||||
|
|
||||||
|
private boolean isFragmentVisible = false;
|
||||||
|
|
||||||
public static TimetableTabFragment newInstance(String date) {
|
public static TimetableTabFragment newInstance(String date) {
|
||||||
TimetableTabFragment fragmentTab = new TimetableTabFragment();
|
TimetableTabFragment fragmentTab = new TimetableTabFragment();
|
||||||
|
|
||||||
@ -65,14 +61,6 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
return fragmentTab;
|
return fragmentTab;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (savedInstanceState != null) {
|
|
||||||
isSelected = savedInstanceState.getBoolean(SAVED_KEY, isSelected);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
@ -86,8 +74,8 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
if (getArguments() != null) {
|
if (getArguments() != null) {
|
||||||
presenter.setArgumentDate(getArguments().getString(ARGUMENT_KEY));
|
presenter.setArgumentDate(getArguments().getString(ARGUMENT_KEY));
|
||||||
}
|
}
|
||||||
|
presenter.onStart(this);
|
||||||
presenter.onStart(this, isPrimary);
|
presenter.onFragmentActivated(isFragmentVisible);
|
||||||
}
|
}
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@ -114,10 +102,9 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
@Override
|
@Override
|
||||||
public void setMenuVisibility(boolean menuVisible) {
|
public void setMenuVisibility(boolean menuVisible) {
|
||||||
super.setMenuVisibility(menuVisible);
|
super.setMenuVisibility(menuVisible);
|
||||||
if (presenter != null && getView() != null) {
|
isFragmentVisible = menuVisible;
|
||||||
presenter.onFragmentSelected(isSelected);
|
if (presenter != null) {
|
||||||
} else if (isSelected) {
|
presenter.onFragmentActivated(menuVisible);
|
||||||
isPrimary = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,10 +138,6 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
noItemView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
noItemView.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSelected(boolean selected) {
|
|
||||||
isSelected = selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(String message) {
|
public void onError(String message) {
|
||||||
if (getActivity() != null) {
|
if (getActivity() != null) {
|
||||||
@ -163,15 +146,8 @@ public class TimetableTabFragment extends BaseFragment implements TimetableTabCo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
|
||||||
outState.putBoolean(SAVED_KEY, isSelected);
|
|
||||||
super.onSaveInstanceState(outState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
isPrimary = false;
|
|
||||||
presenter.onDestroy();
|
presenter.onDestroy();
|
||||||
super.onDestroyView();
|
super.onDestroyView();
|
||||||
}
|
}
|
||||||
|
@ -36,21 +36,22 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart(TimetableTabContract.View view, boolean isPrimary) {
|
public void onStart(TimetableTabContract.View view) {
|
||||||
super.onStart(view);
|
super.onStart(view);
|
||||||
getView().showProgressBar(true);
|
getView().showProgressBar(true);
|
||||||
getView().showNoItem(false);
|
getView().showNoItem(false);
|
||||||
onFragmentSelected(isPrimary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFragmentSelected(boolean isSelected) {
|
public void onFragmentActivated(boolean isSelected) {
|
||||||
if (!isFirstSight && isSelected) {
|
if (!isFirstSight && isSelected && isViewAttached()) {
|
||||||
isFirstSight = true;
|
isFirstSight = true;
|
||||||
|
|
||||||
loadingTask = new AbstractTask();
|
loadingTask = new AbstractTask();
|
||||||
loadingTask.setOnFirstLoadingListener(this);
|
loadingTask.setOnFirstLoadingListener(this);
|
||||||
loadingTask.execute();
|
loadingTask.execute();
|
||||||
|
} else if (!isSelected) {
|
||||||
|
cancelAsyncTasks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +109,7 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
|||||||
boolean isFreeWeek = true;
|
boolean isFreeWeek = true;
|
||||||
|
|
||||||
for (Day day : dayList) {
|
for (Day day : dayList) {
|
||||||
|
day.resetTimetableLessons();
|
||||||
TimetableHeaderItem headerItem = new TimetableHeaderItem(day);
|
TimetableHeaderItem headerItem = new TimetableHeaderItem(day);
|
||||||
|
|
||||||
if (isFreeWeek) {
|
if (isFreeWeek) {
|
||||||
@ -160,10 +162,7 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
|||||||
getRepository().syncTimetable(date);
|
getRepository().syncTimetable(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void cancelAsyncTasks() {
|
||||||
public void onDestroy() {
|
|
||||||
isFirstSight = false;
|
|
||||||
|
|
||||||
if (refreshTask != null) {
|
if (refreshTask != null) {
|
||||||
refreshTask.cancel(true);
|
refreshTask.cancel(true);
|
||||||
refreshTask = null;
|
refreshTask = null;
|
||||||
@ -172,6 +171,12 @@ public class TimetableTabPresenter extends BasePresenter<TimetableTabContract.Vi
|
|||||||
loadingTask.cancel(true);
|
loadingTask.cancel(true);
|
||||||
loadingTask = null;
|
loadingTask = null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
isFirstSight = false;
|
||||||
|
cancelAsyncTasks();
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import javax.inject.Inject;
|
|||||||
|
|
||||||
import io.github.wulkanowy.data.RepositoryContract;
|
import io.github.wulkanowy.data.RepositoryContract;
|
||||||
import io.github.wulkanowy.ui.base.BasePresenter;
|
import io.github.wulkanowy.ui.base.BasePresenter;
|
||||||
import io.github.wulkanowy.utils.LogUtils;
|
|
||||||
|
|
||||||
public class SplashPresenter extends BasePresenter<SplashContract.View>
|
public class SplashPresenter extends BasePresenter<SplashContract.View>
|
||||||
implements SplashContract.Presenter {
|
implements SplashContract.Presenter {
|
||||||
@ -24,12 +23,7 @@ public class SplashPresenter extends BasePresenter<SplashContract.View>
|
|||||||
if (getRepository().getCurrentUserId() == 0) {
|
if (getRepository().getCurrentUserId() == 0) {
|
||||||
getView().openLoginActivity();
|
getView().openLoginActivity();
|
||||||
} else {
|
} else {
|
||||||
try {
|
getView().openMainActivity();
|
||||||
getRepository().initLastUser();
|
|
||||||
getView().openMainActivity();
|
|
||||||
} catch (Exception e) {
|
|
||||||
LogUtils.error("An error occurred when the application was started", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
<string name="fragment_no_grades">Brak ocen</string>
|
<string name="fragment_no_grades">Brak ocen</string>
|
||||||
|
|
||||||
<string name="noInternet_text">Brak połączenia z internetem</string>
|
<string name="noInternet_text">Brak połączenia z internetem</string>
|
||||||
<string name="error_host_offline">Przerwa techniczna. Spróbuj ponownie później</string>
|
|
||||||
<string name="encrypt_failed_text">Szyfrowanie nie powiodło się. Automatyczne logowanie zostało wyłączone</string>
|
<string name="encrypt_failed_text">Szyfrowanie nie powiodło się. Automatyczne logowanie zostało wyłączone</string>
|
||||||
<string name="version_text">Wersja %1$s</string>
|
<string name="version_text">Wersja %1$s</string>
|
||||||
<string name="refresh_error_text">"Podczas odświeżania zawartości wystąpił błąd. "</string>
|
<string name="refresh_error_text">"Podczas odświeżania zawartości wystąpił błąd. "</string>
|
||||||
|
@ -73,7 +73,6 @@
|
|||||||
<string name="info_average_grades">Average: %1$.2f</string>
|
<string name="info_average_grades">Average: %1$.2f</string>
|
||||||
<string name="info_no_average">No average</string>
|
<string name="info_no_average">No average</string>
|
||||||
<string name="info_free_week">No lesson in this week</string>
|
<string name="info_free_week">No lesson in this week</string>
|
||||||
<string name="error_host_offline">Technical break</string>
|
|
||||||
|
|
||||||
<string name="timetable_subitem_room">Room %s</string>
|
<string name="timetable_subitem_room">Room %s</string>
|
||||||
|
|
||||||
|
28
build.gradle
28
build.gradle
@ -7,9 +7,6 @@ buildscript {
|
|||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.0.1'
|
classpath 'com.android.tools.build:gradle:3.0.1'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
|
||||||
// in the individual module build.gradle files
|
|
||||||
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.1"
|
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.1"
|
||||||
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
|
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
|
||||||
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
|
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
|
||||||
@ -29,6 +26,31 @@ subprojects {
|
|||||||
|
|
||||||
ext {
|
ext {
|
||||||
GROUP_ID = "io.github.wulkanowy"
|
GROUP_ID = "io.github.wulkanowy"
|
||||||
|
|
||||||
|
supportVersion = "26.1.0"
|
||||||
|
firebaseJob = "0.8.5"
|
||||||
|
apacheLang = "3.7"
|
||||||
|
apacheCollections = "4.1"
|
||||||
|
flexibleAdapter = "5.0.2"
|
||||||
|
flexibleUi = "1.0.0-b2"
|
||||||
|
greenDao = "3.2.2"
|
||||||
|
greenDaoHelper = "v2.0.2"
|
||||||
|
butterknife = "8.8.1"
|
||||||
|
jodaTime = "2.9.9"
|
||||||
|
dagger2 = "2.15"
|
||||||
|
ahbottom = "2.1.0"
|
||||||
|
jsoup = "1.10.3"
|
||||||
|
gson = "2.8.2"
|
||||||
|
|
||||||
|
debugDb = "1.0.3"
|
||||||
|
sqlcipher = "3.5.9"
|
||||||
|
|
||||||
|
junit = "4.12"
|
||||||
|
mockito = "2.16.0"
|
||||||
|
testRunner = "1.0.1"
|
||||||
|
|
||||||
|
crashlyticsSdk = "2.9.1"
|
||||||
|
crashlyticsAnswers = "1.4.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
|
Reference in New Issue
Block a user