diff --git a/app/build.gradle b/app/build.gradle index 6d79b087..e209598f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,9 +37,10 @@ dependencies { compile 'com.android.support:support-vector-drawable:25.3.1' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.support:recyclerview-v7:25.3.1' - compile 'com.squareup.picasso:picasso:2.5.2' compile 'org.apache.commons:commons-lang3:3.6' compile 'org.apache.commons:commons-collections4:4.1' + compile 'com.thoughtbot:expandablerecyclerview:1.3' + compile 'com.android.support:cardview-v7:25.3.1' testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:2.8.47' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a8b1362e..820ae8f9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,22 +1,25 @@ + + + android:theme="@style/WulkanowyTheme"> @@ -26,12 +29,12 @@ diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/DashboardActivity.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/DashboardActivity.java index 37cb53d1..c0eb15a5 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/DashboardActivity.java +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/DashboardActivity.java @@ -10,12 +10,12 @@ import android.view.MenuItem; import io.github.wulkanowy.R; import io.github.wulkanowy.activity.dashboard.attendance.AttendanceFragment; import io.github.wulkanowy.activity.dashboard.board.BoardFragment; +import io.github.wulkanowy.activity.dashboard.grades.GradesFragment; import io.github.wulkanowy.activity.dashboard.lessonplan.LessonPlanFragment; -import io.github.wulkanowy.activity.dashboard.marks.MarksFragment; public class DashboardActivity extends AppCompatActivity { - private MarksFragment marksFragment = new MarksFragment(); + private GradesFragment gradesFragment = new GradesFragment(); private AttendanceFragment attendanceFragment = new AttendanceFragment(); private BoardFragment boardFragment = new BoardFragment(); private LessonPlanFragment lessonPlanFragment = new LessonPlanFragment(); @@ -30,26 +30,26 @@ public class DashboardActivity extends AppCompatActivity { switch (item.getItemId()) { case R.id.navigation_marks: - setTitle(R.string.title_marks); - transaction.replace(R.id.fragment_container, marksFragment); + setTitle(R.string.grades_text); + transaction.replace(R.id.fragment_container, gradesFragment); transaction.commit(); return true; case R.id.navigation_attendance: - setTitle(R.string.title_attendance); + setTitle(R.string.attendance_text); transaction.replace(R.id.fragment_container, attendanceFragment); transaction.commit(); return true; case R.id.navigation_lessonplan: - setTitle(R.string.title_lessonplan); + setTitle(R.string.lessonplan_text); transaction.replace(R.id.fragment_container, lessonPlanFragment); transaction.commit(); return true; case R.id.navigation_dashboard: default: - setTitle(R.string.title_dashboard); + setTitle(R.string.dashboard_text); transaction.replace(R.id.fragment_container, boardFragment); transaction.commit(); return true; @@ -62,7 +62,7 @@ public class DashboardActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); - setTitle(R.string.title_dashboard); + setTitle(R.string.dashboard_text); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setSelectedItemId(R.id.navigation_dashboard); diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/attendance/AttendanceFragment.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/attendance/AttendanceFragment.java index b9a4c3f8..a40a1d22 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/attendance/AttendanceFragment.java +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/attendance/AttendanceFragment.java @@ -10,12 +10,9 @@ import io.github.wulkanowy.R; public class AttendanceFragment extends Fragment { - public AttendanceFragment() { - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_attendance, container, false); } } diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/board/BoardFragment.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/board/BoardFragment.java index 520e8900..2c76dc59 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/board/BoardFragment.java +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/board/BoardFragment.java @@ -10,12 +10,9 @@ import io.github.wulkanowy.R; public class BoardFragment extends Fragment { - public BoardFragment() { - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_board, container, false); } } diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradeItem.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradeItem.java new file mode 100644 index 00000000..2580c171 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradeItem.java @@ -0,0 +1,59 @@ +package io.github.wulkanowy.activity.dashboard.grades; + +import android.os.Parcel; +import android.os.Parcelable; + +import io.github.wulkanowy.R; +import io.github.wulkanowy.api.grades.Grade; + + +public class GradeItem extends Grade implements Parcelable { + + protected GradeItem(Parcel source) { + value = source.readString(); + } + + public GradeItem() { + // empty constructor + } + + public int getValueColor() { + if ("6".equals(value) || "6-".equals(value) || "6+".equals(value)) { + return R.color.six_grade; + } else if ("5".equals(value) || "5-".equals(value) || "5+".equals(value)) { + return R.color.five_grade; + } else if ("4".equals(value) || "4-".equals(value) || "4+".equals(value)) { + return R.color.four_grade; + } else if ("3".equals(value) || "3-".equals(value) || "3+".equals(value)) { + return R.color.three_grade; + } else if ("2".equals(value) || "2-".equals(value) || "2+".equals(value)) { + return R.color.two_grade; + } else if ("1".equals(value) || "1-".equals(value) || "1+".equals(value)) { + return R.color.one_grade; + } else { + return R.color.default_grade; + } + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(value); + } + + public static final Creator CREATOR = new Creator() { + @Override + public GradeItem createFromParcel(Parcel source) { + return new GradeItem(source); + } + + @Override + public GradeItem[] newArray(int size) { + return new GradeItem[size]; + } + }; +} diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesAdapter.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesAdapter.java new file mode 100644 index 00000000..a50bad1d --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesAdapter.java @@ -0,0 +1,182 @@ +package io.github.wulkanowy.activity.dashboard.grades; + + +import android.app.Activity; +import android.app.DialogFragment; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; +import android.widget.ImageView; +import android.widget.TextView; + +import com.thoughtbot.expandablerecyclerview.ExpandableRecyclerViewAdapter; +import com.thoughtbot.expandablerecyclerview.models.ExpandableGroup; +import com.thoughtbot.expandablerecyclerview.viewholders.ChildViewHolder; +import com.thoughtbot.expandablerecyclerview.viewholders.GroupViewHolder; + +import java.util.List; + +import io.github.wulkanowy.R; + +import static android.view.animation.Animation.RELATIVE_TO_SELF; + +public class GradesAdapter extends ExpandableRecyclerViewAdapter { + + private Activity activity; + + public GradesAdapter(List groups, Context context) { + super(groups); + activity = (Activity) context; + } + + @Override + public SubjectViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.subject_item, parent, false); + return new SubjectViewHolder(view); + } + + @Override + public GradeViewHolder onCreateChildViewHolder(ViewGroup child, int viewType) { + View view = LayoutInflater.from(child.getContext()).inflate(R.layout.grade_item, child, false); + return new GradeViewHolder(view); + } + + @Override + public void onBindGroupViewHolder(SubjectViewHolder holder, int flatPosition, ExpandableGroup group) { + holder.bind(group); + } + + @Override + public void onBindChildViewHolder(GradeViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) { + holder.bind((GradeItem) group.getItems().get(childIndex)); + } + + public class SubjectViewHolder extends GroupViewHolder { + + private TextView subjectName; + + private ImageView indicatorDown; + + private ImageView indicatorUp; + + public SubjectViewHolder(View itemView) { + super(itemView); + subjectName = (TextView) itemView.findViewById(R.id.subject_text); + indicatorDown = (ImageView) itemView.findViewById(R.id.group_indicator_down); + indicatorUp = (ImageView) itemView.findViewById(R.id.group_indicator_up); + + } + + public void bind(ExpandableGroup group) { + subjectName.setText(group.getTitle()); + + if (isGroupExpanded(group)) { + indicatorDown.setVisibility(View.INVISIBLE); + indicatorUp.setVisibility(View.VISIBLE); + } else { + indicatorDown.setVisibility(View.VISIBLE); + indicatorUp.setVisibility(View.INVISIBLE); + } + } + + @Override + public void expand() { + RotateAnimation rotate = + new RotateAnimation(-360, -180, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f); + rotate.setDuration(300); + rotate.setFillAfter(false); + rotate.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + //Empty method definition + } + + @Override + public void onAnimationEnd(Animation animation) { + indicatorDown.setVisibility(View.INVISIBLE); + indicatorUp.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + //Empty method definition + } + }); + indicatorDown.setAnimation(rotate); + } + + @Override + public void collapse() { + RotateAnimation rotate = + new RotateAnimation(360, 180, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f); + rotate.setDuration(300); + rotate.setFillAfter(false); + rotate.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + //Empty method definition + } + + @Override + public void onAnimationEnd(Animation animation) { + indicatorDown.setVisibility(View.VISIBLE); + indicatorUp.setVisibility(View.INVISIBLE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + //Empty method definition + } + }); + indicatorUp.setAnimation(rotate); + } + } + + public class GradeViewHolder extends ChildViewHolder { + + private TextView gradeValue; + + private TextView descriptionGrade; + + private TextView dateGrade; + + private GradeItem grade; + + public GradeViewHolder(final View itemView) { + super(itemView); + gradeValue = (TextView) itemView.findViewById(R.id.grade_text); + descriptionGrade = (TextView) itemView.findViewById(R.id.description_grade_text); + dateGrade = (TextView) itemView.findViewById(R.id.grade_date_text); + + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + GradesDialogFragment gradesDialogFragment = GradesDialogFragment.newInstance(grade); + gradesDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0); + gradesDialogFragment.show(activity.getFragmentManager(), grade.toString()); + } + }); + } + + public void bind(GradeItem grade) { + this.grade = grade; + gradeValue.setText(grade.getValue()); + gradeValue.setBackgroundResource(grade.getValueColor()); + dateGrade.setText(grade.getDate()); + + if (grade.getDescription().equals("") || grade.getDescription() == null) { + if (!grade.getSymbol().equals("")) { + descriptionGrade.setText(grade.getSymbol()); + } else { + descriptionGrade.setText(R.string.noDescription_text); + } + } else { + descriptionGrade.setText(grade.getDescription()); + } + + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java new file mode 100644 index 00000000..e03f9cb6 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesDialogFragment.java @@ -0,0 +1,90 @@ +package io.github.wulkanowy.activity.dashboard.grades; + + +import android.app.DialogFragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import io.github.wulkanowy.R; + +public class GradesDialogFragment extends DialogFragment { + + private GradeItem grade; + + public static final GradesDialogFragment newInstance(GradeItem grade) { + return new GradesDialogFragment().setGrade(grade); + } + + public GradesDialogFragment setGrade(GradeItem grade) { + this.grade = grade; + return this; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.grades_dialog, container, false); + + TextView gradeText = (TextView) view.findViewById(R.id.dialog_grade_text); + TextView subjectText = (TextView) view.findViewById(R.id.subject_dialog_text_value); + TextView descriptionText = (TextView) view.findViewById(R.id.description_dialog_text_value); + TextView weightText = (TextView) view.findViewById(R.id.weight_dialog_text_value); + TextView teacherText = (TextView) view.findViewById(R.id.teacher_dialog_text_value); + TextView dateText = (TextView) view.findViewById(R.id.date_dialog_text_value); + TextView colorText = (TextView) view.findViewById(R.id.color_dialog_text_value); + TextView okTextClick = (TextView) view.findViewById(R.id.OK_dialog); + + gradeText.setText(grade.getValue()); + gradeText.setBackgroundResource(grade.getValueColor()); + subjectText.setText(grade.getSubject()); + weightText.setText(grade.getWeight()); + dateText.setText(grade.getDate()); + colorText.setText(colorHexToColorName(grade.getColor())); + + if (grade.getDescription().equals("")) { + if (!grade.getSymbol().equals("")) { + descriptionText.setText(grade.getSymbol()); + } + } else if (!grade.getSymbol().equals("")) { + descriptionText.setText(grade.getSymbol() + " - " + grade.getDescription()); + } else { + descriptionText.setText(grade.getDescription()); + } + + if (!grade.getTeacher().equals("")) { + teacherText.setText(grade.getTeacher()); + } + + okTextClick.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + + return view; + } + + public int colorHexToColorName(String hexColor) { + switch (hexColor) { + case "000000": { + return R.string.color_black_text; + } + case "F04C4C": { + return R.string.color_red_text; + } + case "20A4F7": { + return R.string.color_blue_text; + } + case "6ECD07": { + return R.string.color_green_text; + } + default: { + return R.string.noColor_text; + } + + } + } +} diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/marks/MarksFragment.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java similarity index 70% rename from app/src/main/java/io/github/wulkanowy/activity/dashboard/marks/MarksFragment.java rename to app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java index 43620aff..103d9f51 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/marks/MarksFragment.java +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/GradesFragment.java @@ -1,10 +1,10 @@ -package io.github.wulkanowy.activity.dashboard.marks; +package io.github.wulkanowy.activity.dashboard.grades; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -27,40 +27,35 @@ import io.github.wulkanowy.database.accounts.AccountsDatabase; import io.github.wulkanowy.database.grades.GradesDatabase; import io.github.wulkanowy.database.subjects.SubjectsDatabase; -public class MarksFragment extends Fragment { +public class GradesFragment extends Fragment { - private ArrayList subjectsName = new ArrayList<>(); + private List subjectWithGradesList = new ArrayList<>(); private View view; - public MarksFragment() { - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - view = inflater.inflate(R.layout.fragment_marks, container, false); + view = inflater.inflate(R.layout.fragment_grades, container, false); - if (subjectsName.size() == 0) { + if (subjectWithGradesList.size() == 0) { new MarksTask(container.getContext()).execute(); - } else if (subjectsName.size() > 1) { - createGrid(); + } else if (subjectWithGradesList.size() > 1) { + createExpListView(); view.findViewById(R.id.loadingPanel).setVisibility(View.GONE); } return view; } - public void createGrid() { + public void createExpListView() { - RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.card_recycler_view); - recyclerView.setHasFixedSize(true); - RecyclerView.LayoutManager layoutManager = new GridLayoutManager(view.getContext(), 2); - recyclerView.setLayoutManager(layoutManager); + RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.subject_grade_recycler); + recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); + GradesAdapter gradesAdapter = new GradesAdapter(subjectWithGradesList, view.getContext()); + recyclerView.setAdapter(gradesAdapter); - ImageAdapter adapter = new ImageAdapter(view.getContext(), subjectsName); - recyclerView.setAdapter(adapter); } public class MarksTask extends AsyncTask { @@ -75,6 +70,7 @@ public class MarksFragment extends Fragment { @Override protected Void doInBackground(Void... params) { String cookiesPath = mContext.getFilesDir().getPath() + "/cookies.txt"; + long userId = mContext.getSharedPreferences("LoginData", mContext.MODE_PRIVATE).getLong("isLogin", 0); try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(cookiesPath)); @@ -89,7 +85,7 @@ public class MarksFragment extends Fragment { AccountsDatabase accountsDatabase = new AccountsDatabase(mContext); accountsDatabase.open(); - Account account = accountsDatabase.getAccount(mContext.getSharedPreferences("LoginData", mContext.MODE_PRIVATE).getLong("isLogin", 0)); + Account account = accountsDatabase.getAccount(userId); accountsDatabase.close(); StudentAndParent snp = new StudentAndParent(cookies, account.getCounty()); @@ -98,19 +94,24 @@ public class MarksFragment extends Fragment { SubjectsDatabase subjectsDatabase = new SubjectsDatabase(mContext); subjectsDatabase.open(); subjectsDatabase.put(subjectsList.getAll()); - List subjects = subjectsDatabase.getAllSubjectsNames(); subjectsDatabase.close(); - for (Subject subject : subjects) { - subjectsName.add(subject.getName()); - } GradesList gradesList = new GradesList(snp); GradesDatabase gradesDatabase = new GradesDatabase(mContext); gradesDatabase.open(); gradesDatabase.put(gradesList.getAll()); + + for (Subject subject : subjectsList.getAll()) { + List gradeItems = gradesDatabase.getSubjectGrades(userId, SubjectsDatabase.getSubjectId(subject.getName())); + if (gradeItems.size() > 0) { + subjectWithGradesList.add(new SubjectWithGrades(subject.getName(), gradeItems)); + } + } + gradesDatabase.close(); + } catch (Exception e) { e.printStackTrace(); } @@ -119,7 +120,7 @@ public class MarksFragment extends Fragment { } protected void onPostExecute(Void result) { - createGrid(); + createExpListView(); view.findViewById(R.id.loadingPanel).setVisibility(View.GONE); diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/SubjectWithGrades.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/SubjectWithGrades.java new file mode 100644 index 00000000..5e60e591 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/activity/dashboard/grades/SubjectWithGrades.java @@ -0,0 +1,13 @@ +package io.github.wulkanowy.activity.dashboard.grades; + + +import com.thoughtbot.expandablerecyclerview.models.ExpandableGroup; + +import java.util.List; + +public class SubjectWithGrades extends ExpandableGroup { + + public SubjectWithGrades(String title, List items) { + super(title, items); + } +} diff --git a/app/src/main/java/io/github/wulkanowy/activity/dashboard/marks/ImageAdapter.java b/app/src/main/java/io/github/wulkanowy/activity/dashboard/marks/ImageAdapter.java deleted file mode 100644 index 8127be34..00000000 --- a/app/src/main/java/io/github/wulkanowy/activity/dashboard/marks/ImageAdapter.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.github.wulkanowy.activity.dashboard.marks; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; - -import java.util.ArrayList; - -import io.github.wulkanowy.R; - -public class ImageAdapter extends RecyclerView.Adapter { - - private Context context; - private ArrayList list; - - public ImageAdapter(Context context, ArrayList list) { - this.list = list; - this.context = context; - } - - @Override - public ImageAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { - View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, - viewGroup, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(ImageAdapter.ViewHolder viewHolder, int i) { - - viewHolder.tv_android.setText(list.get(i)); - Picasso.with(context) - .load(R.drawable.sample_0) - .resize(240, 120) - .noFade() - .into(viewHolder.img_android); - - } - - @Override - public int getItemCount() { - return list.size(); - } - - public class ViewHolder extends RecyclerView.ViewHolder { - private TextView tv_android; - private ImageView img_android; - - public ViewHolder(View view) { - super(view); - - tv_android = (TextView) view.findViewById(R.id.tv_android); - img_android = (ImageView) view.findViewById(R.id.img_android); - } - } - -} diff --git a/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java b/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java index 2f86af6c..83f16ce3 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java +++ b/app/src/main/java/io/github/wulkanowy/activity/main/LoginTask.java @@ -46,8 +46,8 @@ public class LoginTask extends AsyncTask { protected void onPreExecute() { super.onPreExecute(); - progress.setTitle(activity.getText(R.string.login_title)); - progress.setMessage(activity.getText(R.string.please_wait)); + progress.setTitle(activity.getText(R.string.login_text)); + progress.setMessage(activity.getText(R.string.please_wait_text)); progress.setCancelable(false); progress.show(); } @@ -60,11 +60,11 @@ public class LoginTask extends AsyncTask { try { login.login(credentials[0], credentials[1], credentials[2]); } catch (BadCredentialsException e) { - return R.string.login_bad_credentials; + return R.string.login_bad_credentials_text; } catch (AccountPermissionException e) { - return R.string.login_bad_account_permission; + return R.string.login_bad_account_permission_text; } catch (LoginErrorException e) { - return R.string.login_denied; + return R.string.login_denied_text; } try { String cookiesPath = activity.getFilesDir().getPath() + "/cookies.txt"; @@ -73,7 +73,7 @@ public class LoginTask extends AsyncTask { outputStream.writeObject(login.getCookies()); outputStream.flush(); } catch (IOException e) { - return R.string.login_cookies_save_failed; + return R.string.login_cookies_save_failed_text; } if (save) { @@ -106,16 +106,16 @@ public class LoginTask extends AsyncTask { } catch (SQLException e) { return R.string.SQLite_ioError_text; } catch (IOException | LoginErrorException e) { - return R.string.login_denied; + return R.string.login_denied_text; } catch (CryptoException e) { - return R.string.encrypt_failed; + return R.string.encrypt_failed_text; } catch (UnsupportedOperationException e) { - return R.string.root_failed; + return R.string.root_failed_text; } } //Map cookiesList = login.getJar(); - return R.string.login_accepted; + return R.string.login_accepted_text; } protected void onPostExecute(Integer messageID) { @@ -125,8 +125,8 @@ public class LoginTask extends AsyncTask { Toast.makeText(activity, activity.getString(messageID), Toast.LENGTH_LONG).show(); - if (messageID == R.string.login_accepted || messageID == R.string.root_failed - || messageID == R.string.encrypt_failed) { + if (messageID == R.string.login_accepted_text || messageID == R.string.root_failed_text + || messageID == R.string.encrypt_failed_text) { Intent intent = new Intent(activity, DashboardActivity.class); activity.startActivity(intent); } diff --git a/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java b/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java index f91f9a5a..c7d98f31 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java +++ b/app/src/main/java/io/github/wulkanowy/activity/main/MainActivity.java @@ -28,7 +28,7 @@ public class MainActivity extends AppCompatActivity { setContentView(R.layout.activity_main); new AlertDialog.Builder(this) - .setTitle(R.string.warning_label) + .setTitle(R.string.warning_label_text) .setMessage(R.string.warning_text) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { diff --git a/app/src/main/java/io/github/wulkanowy/activity/started/LoadingTask.java b/app/src/main/java/io/github/wulkanowy/activity/started/LoadingTask.java index 5003f8b2..ac83a4b8 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/started/LoadingTask.java +++ b/app/src/main/java/io/github/wulkanowy/activity/started/LoadingTask.java @@ -97,7 +97,7 @@ public class LoadingTask extends AsyncTask { Toast.makeText(activity, R.string.SQLite_ioError_text, Toast.LENGTH_LONG).show(); } catch (CryptoException e) { - Toast.makeText(activity, R.string.decrypt_failed, Toast.LENGTH_LONG).show(); + Toast.makeText(activity, R.string.decrypt_failed_text, Toast.LENGTH_LONG).show(); } } accountsDatabase.close(); diff --git a/app/src/main/java/io/github/wulkanowy/activity/started/StartedActivity.java b/app/src/main/java/io/github/wulkanowy/activity/started/StartedActivity.java index 70f0b9d7..143aa4e8 100644 --- a/app/src/main/java/io/github/wulkanowy/activity/started/StartedActivity.java +++ b/app/src/main/java/io/github/wulkanowy/activity/started/StartedActivity.java @@ -2,7 +2,9 @@ package io.github.wulkanowy.activity.started; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.widget.TextView; +import io.github.wulkanowy.BuildConfig; import io.github.wulkanowy.R; public class StartedActivity extends AppCompatActivity { @@ -12,6 +14,9 @@ public class StartedActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_started); + TextView versionName = (TextView) findViewById(R.id.rawText); + versionName.setText(getText(R.string.version_text) + BuildConfig.VERSION_NAME); + new LoadingTask(this).execute(); } } diff --git a/app/src/main/java/io/github/wulkanowy/api/grades/Grade.java b/app/src/main/java/io/github/wulkanowy/api/grades/Grade.java index c2f85d33..2654917d 100644 --- a/app/src/main/java/io/github/wulkanowy/api/grades/Grade.java +++ b/app/src/main/java/io/github/wulkanowy/api/grades/Grade.java @@ -4,7 +4,7 @@ import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; public class Grade { - private int id; + protected int id; private int userID; @@ -12,7 +12,7 @@ public class Grade { private String subject = ""; - private String value = ""; + protected String value = ""; private String color = ""; diff --git a/app/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java b/app/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java index e9a1dfc5..6a5f24ee 100644 --- a/app/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java +++ b/app/src/main/java/io/github/wulkanowy/api/grades/SubjectsList.java @@ -18,8 +18,6 @@ public class SubjectsList extends Vulcan { private String subjectsPageUrl = "Oceny/Wszystkie?details=1"; - private List subjects = new ArrayList<>(); - public SubjectsList(StudentAndParent snp) { this.snp = snp; } @@ -29,6 +27,8 @@ public class SubjectsList extends Vulcan { Elements rows = subjectPage.select(".ocenyZwykle-table > tbody > tr"); + List subjects = new ArrayList<>(); + for (Element subjectRow : rows) { subjects.add(new Subject() .setName(subjectRow.select("td:nth-child(1)").text()) diff --git a/app/src/main/java/io/github/wulkanowy/database/grades/GradesDatabase.java b/app/src/main/java/io/github/wulkanowy/database/grades/GradesDatabase.java index 27257169..19f311b1 100644 --- a/app/src/main/java/io/github/wulkanowy/database/grades/GradesDatabase.java +++ b/app/src/main/java/io/github/wulkanowy/database/grades/GradesDatabase.java @@ -11,6 +11,7 @@ import android.util.Log; import java.util.ArrayList; import java.util.List; +import io.github.wulkanowy.activity.dashboard.grades.GradeItem; import io.github.wulkanowy.api.grades.Grade; import io.github.wulkanowy.database.DatabaseAdapter; import io.github.wulkanowy.database.DatabaseComparer; @@ -152,16 +153,16 @@ public class GradesDatabase extends DatabaseAdapter { return grade; } - public List getSubjectGrades(long userId, long subjectId) throws SQLException { + public List getSubjectGrades(long userId, long subjectId) throws SQLException { String whereExec = "SELECT * FROM " + grades + " WHERE " + userIdText + "=? AND " + subjectIdText + "=?"; - List gradesList = new ArrayList<>(); + List gradesList = new ArrayList<>(); Cursor cursor = database.rawQuery(whereExec, new String[]{String.valueOf(userId), String.valueOf(subjectId)}); while (cursor.moveToNext()) { - Grade grade = new Grade(); + GradeItem grade = new GradeItem(); grade.setId(cursor.getInt(0)); grade.setUserID(cursor.getInt(1)); grade.setSubjectID(cursor.getInt(2)); diff --git a/app/src/main/java/io/github/wulkanowy/security/Safety.java b/app/src/main/java/io/github/wulkanowy/security/Safety.java index 5326687e..116a8f98 100644 --- a/app/src/main/java/io/github/wulkanowy/security/Safety.java +++ b/app/src/main/java/io/github/wulkanowy/security/Safety.java @@ -22,7 +22,7 @@ public class Safety extends Scrambler { return encryptString(email, plainText); } else { - if (!RootUtilities.isRooted()) { + if (RootUtilities.isRooted()) { return new String(Base64.encode(plainText.getBytes(), Base64.DEFAULT)); } else { Log.e(Scrambler.DEBUG_TAG, "Password store in this devices isn't safe because is rooted"); diff --git a/app/src/main/res/color/bottomnavi_color.xml b/app/src/main/res/color/bottomnavi_color.xml index a84b0397..e874a6ac 100644 --- a/app/src/main/res/color/bottomnavi_color.xml +++ b/app/src/main/res/color/bottomnavi_color.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/border.xml b/app/src/main/res/drawable/border.xml new file mode 100644 index 00000000..a1ce7331 --- /dev/null +++ b/app/src/main/res/drawable/border.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml new file mode 100644 index 00000000..9ed8d571 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_down.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dashboard.xml b/app/src/main/res/layout/activity_dashboard.xml index 0de21abd..4bd03cfe 100644 --- a/app/src/main/res/layout/activity_dashboard.xml +++ b/app/src/main/res/layout/activity_dashboard.xml @@ -23,7 +23,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" - android:background="?android:attr/windowBackground" + android:background="@color/colorBackgroundBottomNavi" app:itemIconTint="@color/bottomnavi_color" app:itemTextColor="@color/bottomnavi_color" app:menu="@menu/navigation" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fc8c1c8a..51bb6d71 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,7 @@ @@ -26,7 +27,7 @@ android:layout_gravity="center" android:layout_marginTop="10dp" android:ems="10" - android:hint="@string/email_hint" + android:hint="@string/email_hint_text" android:inputType="textEmailAddress" /> + android:hint="@string/pass_hint_text" + android:inputType="textPassword" + tools:ignore="UnusedAttribute" /> @@ -57,7 +59,7 @@ android:layout_gravity="center" android:layout_marginTop="20dp" android:onClick="login" - android:text="@string/login_button" /> + android:text="@string/login_button_text" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_started.xml b/app/src/main/res/layout/activity_started.xml index 2148b64f..011dea36 100644 --- a/app/src/main/res/layout/activity_started.xml +++ b/app/src/main/res/layout/activity_started.xml @@ -1,54 +1,34 @@ - + android:orientation="vertical"> + + - - + android:textSize="40sp" /> - + android:layout_gravity="center" + android:layout_marginTop="50dp" + android:text="@string/version_text" + android:textSize="20sp" /> + diff --git a/app/src/main/res/layout/fragment_marks.xml b/app/src/main/res/layout/fragment_grades.xml similarity index 82% rename from app/src/main/res/layout/fragment_marks.xml rename to app/src/main/res/layout/fragment_grades.xml index d7670b4f..c1686bd2 100644 --- a/app/src/main/res/layout/fragment_marks.xml +++ b/app/src/main/res/layout/fragment_grades.xml @@ -2,13 +2,12 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="io.github.wulkanowy.activity.dashboard.marks.MarksFragment"> + tools:context="io.github.wulkanowy.activity.dashboard.grades.GradesFragment"> + android:id="@+id/subject_grade_recycler" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/grades_dialog.xml b/app/src/main/res/layout/grades_dialog.xml new file mode 100644 index 00000000..311c5131 --- /dev/null +++ b/app/src/main/res/layout/grades_dialog.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/row_layout.xml b/app/src/main/res/layout/row_layout.xml deleted file mode 100644 index 8c24fbb8..00000000 --- a/app/src/main/res/layout/row_layout.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/subject_item.xml b/app/src/main/res/layout/subject_item.xml new file mode 100644 index 00000000..92974fe9 --- /dev/null +++ b/app/src/main/res/layout/subject_item.xml @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation.xml index 0e24923e..a2fa2748 100644 --- a/app/src/main/res/menu/navigation.xml +++ b/app/src/main/res/menu/navigation.xml @@ -4,26 +4,26 @@ + android:title="@string/grades_text" /> + android:title="@string/attendance_text" /> + android:title="@string/dashboard_text" /> + android:title="@string/lessonplan_text" /> + android:title="@string/settings_text" /> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 94e417ec..d2bc5401 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,29 +1,42 @@ Wulkanowy - Surowa wersja - Logowanie - Hasło - E-mail - Zaloguj - Powiat + Logowanie + Hasło + E-mail + Zaloguj + Powiat Aplikacja ta nie jest ukończona, więc mogą występować różnego rodzaju błędy lub dane funkcje nie bedą działać. Prosimy o cierpliwość i wyrozumiałość. - Ostrzeżenie + Ostrzeżenie Brak danych logowania - Pomyślnie zalogowano - Niepoprawny e-mail lub hasło - Brak uprawnień do otwarcia dziennika. Sprawdź wprowadzoną nazwę powiatu - Logowanie nie powiodło się - Proszę czekać… - Aktywność dashboard - Dashboard - Oceny - Frekwencja - Plan lekcji - Ustawienia + Pomyślnie zalogowano + Niepoprawny e-mail lub hasło + Brak uprawnień do otwarcia dziennika. Sprawdź wprowadzoną nazwę powiatu + Logowanie nie powiodło się + Proszę czekać… + Aktywność dashboard + Dashboard + Oceny + Frekwencja + Plan lekcji + Ustawienia Brak połączenia z internetem - Nie udało się zapisać sesji + Nie udało się zapisać sesji W bazie danych wystąpił błąd. Zrestartuj aplikacje a także sprawdź iość wolnego miejsca w pamięci wewnętrznej - To urządzenie posiada posiada podwyższone uprawnienia (root). Automatyczne logowanie zosatło wyłączone. - Szyfrowanie nie powiodło się. Automatyczne logowanie zostało wyłączone - Deszyfrowanie nie powiodło się. Automatyczne logowanie zostało wyłączone + To urządzenie posiada posiada podwyższone uprawnienia (root). Automatyczne logowanie zosatło wyłączone. + Szyfrowanie nie powiodło się. Automatyczne logowanie zostało wyłączone + Deszyfrowanie nie powiodło się. Automatyczne logowanie zostało wyłączone + Wersja\u0020 + Opis + Waga + Brak opisu + Nauczyciel + Data + Kolor + Czarny + Czerwony + Niebieski + Zielony + Brak koloru + OK + Przedmiot diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3ab3e9cb..6a79fc99 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,15 @@ - #3F51B5 - #303F9F - #FF4081 + #d32f2f + #9a0007 + #ff6659 + #f0f0f0 + #ffffff + #92b53d + #66B266 + #55BBDB + #FFE68C + #CE9AD2 + #d32f2f + #cdcdcd diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 443099b9..1d793513 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,29 +1,42 @@ Wulkanowy - Raw version - Login - Password - E-mail - Log in - County + Login + Password + E-mail + Log in + County This application is not complete, so there may be a variety of errors or features that will not work. Please be patient and understanding. - Warning + Warning No login data - Login is successful - Bad e-mail or password - No permission to open log. Check entered county name - Login is failed - Please wait… - Dashboard Activity - Dashboard - Marks - Attendance - Lesson Plan - Settings + Login is successful + Bad e-mail or password + No permission to open log. Check entered county name + Login is failed + Please wait… + Dashboard Activity + Dashboard + Grades + Attendance + Lesson Plan + Settings No internet connection - Failed to save session + Failed to save session An error occurred in the database. Restart the applications and check the free space in the internal memory - This device is rooted. Automatic login has been disabled - Encryption failed. Automatic login has been disabled - Decrypt is failed. Automatic login has been disable + This device is rooted. Automatic login has been disabled + Encryption failed. Automatic login has been disabled + Decrypt is failed. Automatic login has been disable + Version\u0020 + Description + Weight + No description + Teacher + Date + Color + Black + Red + Blue + Green + No color + OK + Subject diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b4390a21..cca4bb67 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,9 +1,23 @@ - + +