Commit 074ab2da authored by Devinda's avatar Devinda

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	WebFrontEnd/smartcoach-frontend/src/App.js
#	WebFrontEnd/smartcoach-frontend/src/Components/Admin/Dashboard.js
parents fcf1730d 1a847d63
......@@ -5,6 +5,8 @@
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
<excludeFolder url="file://$MODULE_DIR$/MobileFrontEnd/FlutterApplication/flutter_app/.pub" />
<excludeFolder url="file://$MODULE_DIR$/MobileFrontEnd/FlutterApplication/flutter_app/build" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
......
......@@ -5,7 +5,7 @@ const Schema = mongoose.Schema;
const ClassStudentSchema = new Schema({
class_id:{type:mongoose.Schema.Types.ObjectId,ref: 'Classes'},
student_id:{type:mongoose.Schema.Types.ObjectId,ref: 'student'},
tutor_id:{type:mongoose.Schema.Types.ObjectId,ref: 'tutor'},
},{
timestamps:true,
});
......
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ClassStudentRequestSchema = new Schema({
class_id:{type:mongoose.Schema.Types.ObjectId,ref: 'Classes'},
student_id:{type:mongoose.Schema.Types.ObjectId,ref: 'student'},
tutor_id:{type:mongoose.Schema.Types.ObjectId,ref: 'tutor'},
},{
timestamps:true,
});
const ClassStudentRequestList = mongoose.model('ClassStudentRequestList',ClassStudentRequestSchema);
module.exports = ClassStudentRequestList;
\ No newline at end of file
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let PerformanceSchema = new Schema({
student_id : {type:mongoose.Schema.Types.ObjectId,ref: 'student', required:true},
tutor_id : {type:mongoose.Schema.Types.ObjectId,ref: 'tutor', required:true},
sex : {type: Number, required:true},
guardian : {type : Number, required:true},
study_time : {type: Number, required:true},
activities : {type: Number, required:true},
internet : {type: Number, required:true},
free_time : {type: Number, required:true},
absences : {type: Number, required:true},
g1 : {type: Number},
g2 : {type: Number},
g3 : {type: Number}
},{
timestamps : true
});
const StudPerf = mongoose.model('stud_performance', PerformanceSchema);
module.exports = StudPerf;
\ No newline at end of file
......@@ -7,12 +7,6 @@ const ALResultsSchema = new Schema({
year:{type:String,required:false},
stream: {type:String,required:true},
Subjects : {type:Object},
subject01:{type:String,required:true},
subject02:{type:String,required:true},
subject03:{type:String,required:true},
subject01Result:{type:String,required:true},
subject02Result:{type:String,required:true},
subject03Result:{type:String,required:true},
generalEnglish:{type:String},
commonGeneralTest:{type:String},
image:{type:String},
......
......@@ -19,6 +19,7 @@ const userSchema = new Schema({
tutor_main_city:[{type:String}],
tutor_medium:{type:String},
tutor_qualification:{type:String},
tutor_student_count:{type:Number},
tutor_instituteIDList:[{type:mongoose.Schema.Types.ObjectId,ref: 'institute'}],
}, {
timestamps:true,
......
This diff is collapsed.
......@@ -10,12 +10,21 @@
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.24.0",
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"mongoose": "^5.12.15"
"mongoose": "^5.12.15",
"morgan": "^1.10.0"
},
"devDependencies": {
"bluebird": "^3.7.2",
"cookie-parser": "^1.4.6",
"http-errors": "^1.8.1",
"method-override": "^3.0.0",
"multer": "^1.4.3",
"multer-gridfs-storage": "^5.0.2",
"nodemailer": "^6.6.2"
}
}
......@@ -2,6 +2,7 @@ const router = require('express').Router();
let classes = require('../models/createClass.model');
let student = require('../models/student.user.model');
let studentList = require('../models/ClassStudentList.model');
let studentRequestList = require('../models/ClassStudentRquestList.model');
const mongoose = require("mongoose");
router.route('/add').post(async(req,res) =>{
......@@ -104,6 +105,7 @@ router.route('/studentList/update').post((req, res) => {
const class_id = req.body._id;
const student_nic = req.body.student_nic;
const tutor_id = req.body.tutor_id;
console.log("classID: " + class_id);
console.log("student_nic: " + student_nic);
......@@ -126,7 +128,7 @@ router.route('/studentList/update').post((req, res) => {
const newClassStudent = new studentList({
class_id,
student_id,
tutor_id
});
newClassStudent.save().then(result =>{
......@@ -160,4 +162,64 @@ router.route('/studentList/:id').get(function (req, res) {
});
});
router.route('/studentRequestList/add').post((req, res) => {
const class_id = req.body._id;
const student_id = req.body.student_id;
const tutor_id = req.body.tutor_id;
console.log("classID: " + class_id);
console.log("student_nic: " + student_id);
classes.findById(class_id,function(err, tutorsClass){
if(!tutorsClass)
res.status(404).send("Sorry Class Could not Found.");
else {
student.find({"_id": student_id}).then(student => {
console.log(student)
console.log(student[0]._id)
if(student[0].student_nic === ""){
res.status(500).send("Sorry, This Student Not Registered");
}else{
const student_id = student[0]._id;
const newClassStudent = new studentRequestList({
class_id,
student_id,
tutor_id
});
studentRequestList.find({"student_id" : student_id, "class_id" : class_id}).then(reqClass =>{
console.log("reqClass : ")
console.log(reqClass)
if(reqClass.length > 0){
res.status(501).send("Already Request to this Class");
}
else{
newClassStudent.save().then(result =>{
res.json('Student Requested is complete!');
})
.catch(err =>{
res.status(500).send("Update not possible");
});
}
})
}
}).catch(err => res.status(500).json('Eroor: '+ err));
}
});
});
module.exports = router;
\ No newline at end of file
const router = require('express').Router();
let tutor = require('../models/tutor.user.model');
let tutorRating = require('../models/TutorRatingAndReviews.model');
let tutorClasses = require('../models/createClass.model');
let ALResults = require('../models/studentALResult.model');
let classStudentList = require('../models/ClassStudentList.model');
const axios = require('axios');
const request = require('request');
//const request = require('request');
router.route('/getFilteredList').post((req, res) => {
......@@ -26,9 +29,34 @@ router.route('/getFilteredList').post((req, res) => {
tutors.reduce(async (promise, tutor, idx) => {
await promise;
await tutorRating.find({"tutor_id": tutor._id}).then((reviews) => {
let classCount = 0;
let studentCount = 0;
await tutorRating.find({"tutor_id": tutor._id}).then(async (reviews) => {
//console.log("i : " + JSON.stringify(reviews));
await tutorClasses.find({"tutor_id": tutor._id}).then(async (tutorOneClass) =>{
classCount = tutorOneClass.length;
console.log("Class Count : " + classCount);
// let oneClassCount = 0
//
// if(tutorOneClass.length > 0){
// tutorOneClass.reduce(async (promise, tutorOneCl, idx2) =>{
// await promise;
// await classStudentList.find({"class_id": tutorOneCl._id}).then( async (stdCount)=>{
// oneClassCount = oneClassCount + stdCount.length;
//
// if(idx2 === stdCount.length - 1){
// studentCount = oneClassCount;
// }
//
// })
// }, Promise.resolve())
// }
})
console.log("idx : " + idx);
// console.log("tutor : " + tutors);
const teacherReview = {
......@@ -48,7 +76,10 @@ router.route('/getFilteredList').post((req, res) => {
"tutor_main_district": tutor.tutor_main_district,
"tutor_main_city": tutor.tutor_main_city,
"tutor_medium": tutor.tutor_medium,
"tutor_registered_date": tutor.createdAt,
"tutor_class_count": classCount,
"tutor_qualification": tutor.tutor_qualification,
"tutor_student_count": tutor.tutor_student_count,
"review": reviews.map(review => review.review),
"ratings": reviews.map(review => review.rating)
}
......@@ -98,6 +129,9 @@ router.route('/getFilteredList').post((req, res) => {
"tutor_main_city": teacherReview.tutor_main_city,
"tutor_medium": teacherReview.tutor_medium,
"tutor_qualification": teacherReview.tutor_qualification,
"tutor_registered_date": teacherReview.tutor_registered_date,
"tutor_class_count": teacherReview.tutor_class_count,
"tutor_student_count": teacherReview.tutor_student_count,
"tutor_reviewValue": response.data.result,
"tutor_avg_rating" : Number(TotalRating/teacherReview.ratings.length),
"tutor_review_count" : teacherReview.review.length
......@@ -129,6 +163,9 @@ router.route('/getFilteredList').post((req, res) => {
"tutor_class_type": teacherReview.tutor_class_type,
"tutor_main_district": teacherReview.tutor_main_district,
"tutor_main_city": teacherReview.tutor_main_city,
"tutor_registered_date": teacherReview.tutor_registered_date,
"tutor_class_count": teacherReview.tutor_class_count,
"tutor_student_count": teacherReview.tutor_student_count,
"tutor_medium": teacherReview.tutor_medium,
"tutor_qualification": teacherReview.tutor_qualification,
"tutor_reviewValue": 0,
......@@ -161,4 +198,5 @@ router.route('/getFilteredList').post((req, res) => {
});
module.exports = router;
\ No newline at end of file
......@@ -14,12 +14,12 @@ router.route('/add').post(async(req,res) =>{
const year = req.body.year;
const stream = req.body.stream;
const Subjects = req.body.Subjects;
const subject01 = req.body.subject01;
const subject02 = req.body.subject02;
const subject03 = req.body.subject03;
const subject01Result = req.body.subject01Result;
const subject02Result = req.body.subject02Result;
const subject03Result = req.body.subject03Result;
// const subject01 = req.body.subject01;
// const subject02 = req.body.subject02;
// const subject03 = req.body.subject03;
// const subject01Result = req.body.subject01Result;
// const subject02Result = req.body.subject02Result;
// const subject03Result = req.body.subject03Result;
const generalEnglish = req.body.generalEnglish;
const commonGeneralTest = req.body.commonGeneralTest;
const image = req.body.image;
......@@ -29,12 +29,12 @@ router.route('/add').post(async(req,res) =>{
year,
stream,
Subjects,
subject01,
subject02,
subject03,
subject01Result,
subject02Result,
subject03Result,
// subject01,
// subject02,
// subject03,
// subject01Result,
// subject02Result,
// subject03Result,
generalEnglish,
commonGeneralTest,
image,
......@@ -56,12 +56,12 @@ router.route('/add').post(async(req,res) =>{
else {
details.year = year;
details.stream = stream;
details.subject01 = subject01;
details.subject02 = subject02;
details.subject03 = subject03;
details.subject01Result = subject01Result;
details.subject02Result = subject02Result;
details.subject03Result = subject03Result;
// details.subject01 = subject01;
// details.subject02 = subject02;
// details.subject03 = subject03;
// details.subject01Result = subject01Result;
// details.subject02Result = subject02Result;
// details.subject03Result = subject03Result;
details.generalEnglish = generalEnglish;
details.commonGeneralTest = commonGeneralTest;
details.image = image;
......
const router = require('express').Router();
const StudPer = require('../models/studPer.model');
const axios = require("axios");
// const tutor = require('../models/tutor.user.model');
router.route('/:id').get((req,res) =>{
StudPer.find({tutor_id : req.params.id}).populate('student_id')
.then( progressstudents => res.json(progressstudents))
.catch(err => res.status(400).json('Error :'+err));
});
router.route('/store').post((req ,res) =>{
const tutor_id = req.body.tutor_id;
const student_id = req.body.student_id;
const sex = req.body.sex;
const guardian = req.body.guardian;
const study_time = req.body.study_time;
const activities = req.body.activities;
const internet = req.body.internet;
const free_time = req.body.free_time;
const absences = req.body.absences;
const g1 = req.body.g1;
const g2 = req.body.g2;
const g3 = req.body.g3;
const newPerformanceDetails = new StudPer({
tutor_id,
student_id,
sex,
guardian,
study_time,
activities,
internet,
free_time,
absences,
g1,
g2,
g3
});
newPerformanceDetails.save()
.then(()=> res.json('Student Performance Details Added!'))
.catch(err => res.status(400).json('Error :'+err));
});
router.route('/student/:id').get((req , res) =>{
StudPer.find({student_id : req.params.id}).populate('student_id')
.then( students => res.json(students))
.catch(err => res.status(400).json('Error :'+err));
});
//--------------------------Flask API Routes-------------------------------
router.route('/predict_quiz_marks').post(async (req ,res) =>{
console.log("marks route called");
let predictDetails = {
sex : req.body.sex,
guardian : req.body.guardian,
studytime : req.body.studytime,
activities : req.body.activities,
internet : req.body.internet,
freetime : req.body.freetime,
absences : req.body.absences,
G1 : req.body.G1,
G2 : req.body.G2,
}
console.log(predictDetails);
let options = {
uri: 'http://localhost:5000/predict_quiz_marks',
body: JSON.stringify(predictDetails),
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
}
let response = await axios.post(options.uri, options.body)
console.log(response.data);
res.json(response.data)
});
router.route('/predict_pass_fail').post(async (req ,res) =>{
console.log("status route called");
let predictStatusDetails = {
sex : req.body.sex,
guardian : req.body.guardian,
studytime : req.body.studytime,
activities : req.body.activities,
internet : req.body.internet,
freetime : req.body.freetime,
absences : req.body.absences,
G1 : req.body.G1,
G2 : req.body.G2,
}
console.log(predictStatusDetails);
let options = {
uri: 'http://localhost:5000/predict_pass_fail',
body: JSON.stringify(predictStatusDetails),
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
}
let response = await axios.post(options.uri, options.body)
console.log(response.data);
res.json(response.data)
});
router.route('/predict_grade').post(async (req ,res) =>{
console.log("grade route called");
let predictGradeDetails = {
sex : req.body.sex,
guardian : req.body.guardian,
studytime : req.body.studytime,
activities : req.body.activities,
internet : req.body.internet,
freetime : req.body.freetime,
absences : req.body.absences,
G1 : req.body.G1,
G2 : req.body.G2,
}
console.log(predictGradeDetails);
let options = {
uri: 'http://localhost:5000/predict_grade',
body: JSON.stringify(predictGradeDetails),
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
}
let response = await axios.post(options.uri, options.body)
console.log(response.data);
res.json(response.data)
});
module.exports = router;
\ No newline at end of file
......@@ -75,6 +75,7 @@ router.route('/add').post(async(req,res) =>{
const tutor_main_city = req.body.tutor_main_city;
const tutor_medium = req.body.tutor_medium;
const tutor_qualification = req.body.tutor_qualification;
const tutor_student_count = 0;
let instituteObjectIDList = [];
......@@ -107,7 +108,8 @@ router.route('/add').post(async(req,res) =>{
tutor_main_city,
tutor_medium,
tutor_instituteIDList,
tutor_qualification
tutor_qualification,
tutor_student_count
});
newTutor.save()
.then(tutor => {
......
......@@ -28,20 +28,21 @@ router.route('/getCredentials').post((req, res) => {
const email = req.body.user_email;
const password = req.body.user_password;
console.log(email);
userAccount.find({user_email:email}, function (err, User) {
}).then(User => {
let payload = {
user_id: User[0].user_id,
user_email:User[0].user_email,
user_name:'',
user_type:User[0].user_type
}
console.log(User);
if(User.length > 0){
let payload = {
user_id: User[0].user_id,
user_email:User[0].user_email,
user_name:'',
user_type:User[0].user_type
}
console.log(password);
console.log(User[0].user_password);
if(User[0].user_password === password){
......@@ -90,7 +91,10 @@ router.route('/getCredentials').post((req, res) => {
})
.catch(err => res.status(400).json('Error: ' + err));
.catch(err => {
console.log(err);
res.status(400).json('Error: ' + err)
});
});
......
......@@ -13,7 +13,7 @@ const bodyParser = require('body-parser');
const mongoose =require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
const port = process.env.PORT || 5001;
app.use(bodyParser.urlencoded({ extended: true }));
......@@ -81,6 +81,11 @@ const userAccount = require('./routes/userAccount.route');
const questionManage = require('./routes/question.route');
const financeRouter = require('./routes/finance.route');
const studentResult = require('./routes/studentALResult.route');
const tutorRating = require('./routes/tutorRatings.route');
const filteredList = require('./routes/filteredListNew.route');
const createClassRoute = require('./routes/createClass.route');
const studPerRoute = require('./routes/studper.route');
const imageRouter = require('./routes/pdf.route');
const answerManage = require('./routes/answer_route');
......@@ -92,6 +97,10 @@ app.use('/questions', questionManage);
app.use('/answer', answerManage);
app.use('/admin/finance', financeRouter);
app.use('/studentResults', studentResult);
app.use('/tutorRatings', tutorRating);
app.use('/filteredList', filteredList);
app.use('/createClass', createClassRoute);
app.use('/admin/studper',studPerRoute);
app.use('/', imageRouter(upload));
app.listen(port, () => {
......
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="../../Android/Sdk/platforms/android-30/data/res/layout/simple_list_item_1.xml" value="0.3677536231884058" />
<entry key="..\:/Users/HANSAKA/Desktop/Research Development/ELearningApp/app/src/main/res/layout/activity_attendence.xml" value="0.1802536231884058" />
<entry key="app/src/main/res/drawable-v24/grey_back_curved.xml" value="0.434375" />
<entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.2557291666666667" />
<entry key="app/src/main/res/drawable-v24/white_curved.xml" value="0.2557291666666667" />
<entry key="app/src/main/res/drawable/darkgrey_back_curved.xml" value="0.434375" />
<entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.2557291666666667" />
<entry key="app/src/main/res/drawable/ic_launcher_bg.xml" value="0.2557291666666667" />
<entry key="app/src/main/res/drawable/list_item.xml" value="0.2557291666666667" />
<entry key="app/src/main/res/layout/activity_attendence.xml" value="0.3061594202898551" />
<entry key="app/src/main/res/layout/activity_class_add.xml" value="0.3555253623188406" />
<entry key="app/src/main/res/layout/activity_class_detail_activty.xml" value="0.23958333333333334" />
<entry key="app/src/main/res/layout/activity_class_edit.xml" value="0.3555253623188406" />
<entry key="app/src/main/res/layout/activity_home.xml" value="0.2866847826086957" />
<entry key="app/src/main/res/layout/activity_join.xml" value="0.3333333333333333" />
<entry key="app/src/main/res/layout/activity_login.xml" value="0.23958333333333334" />
<entry key="app/src/main/res/layout/activity_main.xml" value="0.2848731884057971" />
<entry key="app/src/main/res/layout/activity_student_list.xml" value="0.3677536231884058" />
<entry key="app/src/main/res/layout/activity_timer.xml" value="0.3759057971014493" />
<entry key="app/src/main/res/layout/activity_tutor_join.xml" value="0.3759057971014493" />
<entry key="app/src/main/res/layout/list_item.xml" value="0.3555253623188406" />
<entry key="app/src/main/res/layout/student_list_item.xml" value="0.3677536231884058" />
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.2557291666666667" />
<entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.2557291666666667" />
</map>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
<component name="VisualizationToolProject">
<option name="state">
<ProjectState>
<option name="scale" value="0.2866847826086957" />
</ProjectState>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
\ No newline at end of file
/build
\ No newline at end of file
plugins {
id 'com.android.application'
}
android {
compileSdk 30
defaultConfig {
applicationId "com.symbol.elearningapp"
minSdk 26
targetSdk 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
implementation 'com.intuit.ssp:ssp-android:1.0.6'
implementation 'com.intuit.sdp:sdp-android:1.0.6'
implementation 'com.google.android.gms:play-services:12.0.1'
def camerax_version = "1.0.0-beta05"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation"androidx.camera:camera-view:1.0.0-alpha12"
implementation "androidx.camera:camera-extensions:1.0.0-alpha12"
// For Card view
implementation 'androidx.cardview:cardview:1.0.0'
// Chart and graph library
implementation 'com.github.blackfizz:eazegraph:1.2.5l@aar'
implementation 'com.nineoldandroids:library:2.4.0'
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.symbol.elearningapp;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.symbol.elearningapp", appContext.getPackageName());
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.symbol.elearningapp">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MICROPHONE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.audio.low_latency" />
<uses-feature android:name="android.hardware.audio.pro" />
<uses-feature android:name="android.hardware.microphone" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ELearningApp"
android:usesCleartextTraffic="true">
<activity
android:name=".StudentListActivity"
android:exported="true" />
<activity
android:name=".TimerActivity"
android:exported="true" />
<activity
android:name=".JoinClassActivty"
android:exported="true" />
<activity
android:name=".TutorJoinActivity"
android:exported="true" />
<activity
android:name=".AttendenceActivity"
android:exported="true" />
<activity
android:name=".JoinActivity"
android:exported="true" />
<activity
android:name=".ClassAddActivity"
android:exported="true" />
<activity
android:name=".ClassEditActivity"
android:exported="true" />
<activity
android:name=".ClassDetailActivty"
android:exported="true" />
<activity
android:name=".HomeActivity"
android:exported="true" />
<activity
android:name=".LoginActivity"
android:exported="true" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
package com.symbol.elearningapp.Adapters;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.RecyclerView;
import com.symbol.elearningapp.HomeActivity;
import com.symbol.elearningapp.LoginActivity;
import com.symbol.elearningapp.R;
import com.symbol.elearningapp.service.ClassDetail;
import java.util.List;
public class ClassAdapter extends RecyclerView.Adapter<ClassAdapter.ViewHolder>{
private List<ClassDetail> classDetails;
Context context;
ClickListener clickListener;
public ClassAdapter(List<ClassDetail> listdata,Context context,ClickListener clickListener) {
this.classDetails = listdata;
this.context = context;
this.clickListener =clickListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItem= layoutInflater.inflate(R.layout.list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(listItem);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final ClassDetail myListData = classDetails.get(position);
holder.tvSubjectname.setText(myListData.getSubject());
holder.tvDate.setText(myListData.getDate());
holder.tvClassTime.setText(myListData.getClassTime());
holder.linearLayout.setOnClickListener(v ->{
clickListener.onItemClicked(position);
// Toast.makeText(context,myListData.getSubject() +" " +myListData.getId(),Toast.LENGTH_LONG).show();
});
}
@Override
public int getItemCount() {
return classDetails.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private ClickListener listener;
public TextView tvSubjectname,tvDate,tvClassTime;
public LinearLayout linearLayout;
public ViewHolder(View itemView) {
super(itemView);
tvSubjectname = (TextView) itemView.findViewById(R.id.tvSubject);
tvDate = (TextView) itemView.findViewById(R.id.tvdate);
tvClassTime = (TextView) itemView.findViewById(R.id.tvclasstime);
linearLayout = (LinearLayout)itemView.findViewById(R.id.lvitems);
}
}
public interface ClickListener {
public void onItemClicked(int position);
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.ChartData;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import org.eazegraph.lib.charts.PieChart;
import org.eazegraph.lib.models.PieModel;
import java.util.Calendar;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class AttendenceActivity extends AppCompatActivity {
PieChart pieChart;
Spinner dropdown;
TextView tvsubject,tvTotal,tvAbsent,tvPresent;
ServiceApi serviceApi;
ProgressDialog progress;
AppPreference appPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_attendence);
appPreference = new AppPreference(this);
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
pieChart = findViewById(R.id.piechart);
dropdown = findViewById(R.id.spinner1);
tvsubject =findViewById(R.id.tvsubject);
tvTotal = findViewById(R.id.tvTotal);
tvAbsent = findViewById(R.id.tvAbsent);
tvPresent = findViewById(R.id.tvPresent);
List<ClassDetail> details= CommonData.getClassDetails();
String[] items = new String[details.size()];
for(int i = 0;i < details.size();i++)
{
items[i] = details.get(i).getSubject();
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, items);
dropdown.setAdapter(adapter);
dropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String subjectName = dropdown.getItemAtPosition(position).toString();
updateClassdetails(subjectName);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void createChart(int present,int absent){
pieChart.clearChart();
pieChart.addPieSlice(
new PieModel(
"Present",
present,
Color.parseColor("#66BB6A")));
pieChart.addPieSlice(
new PieModel(
"Absent",
absent,
Color.parseColor("#EF5350")));
pieChart.startAnimation();
}
public void updateClassdetails(String subject) {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<ChartData> userCall = serviceApi.getAttendance("atd/"+CommonData.getId()+"/"+subject);
// Call<ChartData> userCall = serviceApi.getAttendance("atd/29/"+subject);
userCall.enqueue(new Callback<ChartData>() {
@Override
public void onResponse(Call<ChartData> call, Response<ChartData> response) {
if(response.body() != null)
{
progress.dismiss();
int total = response.body().getReal();
int present =response.body().getDetected();
int absent = total-present;
createChart(present,absent);
tvsubject.setText(subject);
tvAbsent.setText(""+absent);
tvTotal.setText(""+total);
tvPresent.setText(""+present);
}
else
{
progress.dismiss();
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<ChartData> call, Throwable t) {
progress.dismiss();
appPreference.showToast("Server Error occured!!");
}
});
}
}
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ClassAddActivity extends AppCompatActivity {
Calendar myCalendar;
EditText etdate, etclasstime, etsubject;
Button addBtn;
ServiceApi serviceApi;
AppPreference appPreference;
ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class_add);
myCalendar = Calendar.getInstance();
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
appPreference = new AppPreference(this);
etdate = (EditText) findViewById(R.id.etdate);
etclasstime = (EditText) findViewById(R.id.etclasstime);
etsubject = (EditText) findViewById(R.id.etsubject);
addBtn = findViewById(R.id.btn_add);
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
etdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new DatePickerDialog(ClassAddActivity.this, date, myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
etclasstime.setOnClickListener(new View.OnClickListener() {
final Calendar c = Calendar.getInstance();
int mHour = c.get(Calendar.HOUR_OF_DAY);
int mMinute = c.get(Calendar.MINUTE);
@Override
public void onClick(View v) {
TimePickerDialog timePickerDialog = new TimePickerDialog(ClassAddActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
etclasstime.setText(hourOfDay + ":" + String.format("%02d", minute));
}
}, mHour, mMinute, true);
timePickerDialog.show();
}
});
addBtn.setOnClickListener(view -> {
addClassdetails();
});
}
public void addClassdetails() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
String Subject = etsubject.getText().toString();
String Date = etdate.getText().toString();
String time = etclasstime.getText().toString();
if (TextUtils.isEmpty(Subject)) {
appPreference.showToast("Subject name is required.");
} else if (TextUtils.isEmpty(Date)) {
appPreference.showToast("Please select the date");
} else if (TextUtils.isEmpty(time)) {
appPreference.showToast("Please select the time");
} else {
int id = Integer.parseInt(CommonData.getClassDetails().get(CommonData.getClassDetails().size() - 1).getId()) + 1;
Call<ClassDetail> userCall = serviceApi.addClassDetail(new ClassDetail("" + id, Subject, Date, time, null));
userCall.enqueue(new Callback<ClassDetail>() {
@Override
public void onResponse(Call<ClassDetail> call, Response<ClassDetail> response) {
if (!response.equals("")) {
progress.dismiss();
appPreference.showToast("Added Sucessfully!!");
stopActivity();
} else {
progress.dismiss();
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<ClassDetail> call, Throwable t) {
progress.dismiss();
appPreference.showToast(t.getMessage());
}
});
}
}
private void updateLabel() {
String myFormat = "MM/dd/yy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
etdate.setText(sdf.format(myCalendar.getTime()));
}
private void stopActivity() {
this.finish();
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.symbol.elearningapp.Adapters.ClassAdapter;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ClassDetailActivty extends AppCompatActivity implements ClassAdapter.ClickListener {
AppPreference appPreference;
Button addBtn;
ServiceApi serviceApi;
RecyclerView recyclerView;
ClassAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class_detail_activty);
appPreference = new AppPreference(this);
addBtn = findViewById(R.id.btn_add);
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
if (CommonData.getType().equals("student")) {
addBtn.setVisibility(View.INVISIBLE);
}
addBtn.setOnClickListener(v -> {
Intent intent = new Intent(ClassDetailActivty.this, ClassAddActivity.class);
startActivity(intent);
this.finish();
});
recyclerView = (RecyclerView) findViewById(R.id.rvDetails);
adapter = new ClassAdapter(CommonData.getClassDetails(), this, this);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClicked(int position) {
if (!CommonData.getType().equals("student")) {
CommonData.setSelectedIndex(position);
Intent intent = new Intent(ClassDetailActivty.this, ClassEditActivity.class);
startActivity(intent);
this.finish();
}
}
public void getClassdetails(){
Call<List<ClassDetail>> userCall = serviceApi.classDetails();
userCall.enqueue(new Callback<List<ClassDetail>>() {
@Override
public void onResponse(Call<List<ClassDetail>> call, Response<List<ClassDetail>> response) {
if (!response.body().equals("")) {
CommonData.setClassDetails(response.body());
}
else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<ClassDetail>> call, Throwable t) {
appPreference.showToast(t.getMessage());
}
});
}
@Override
protected void onResume() {
super.onResume();
// getClassdetails();
// adapter.notifyDataSetChanged();
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import com.symbol.elearningapp.service.StudentDetails;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ClassEditActivity extends AppCompatActivity {
AppPreference appPreference;
Calendar myCalendar;
EditText etSubject, etDate, etTime;
Button btnDel, btnEdit,btnAdd;
int selectedIndex;
ServiceApi serviceApi;
ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class_edit);
appPreference = new AppPreference(this);
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
etDate = findViewById(R.id.etdate1);
etSubject = findViewById(R.id.etsubject1);
etTime = findViewById(R.id.etclasstime1);
btnDel = findViewById(R.id.btn_Delete);
btnEdit = findViewById(R.id.btn_edit);
btnAdd = findViewById(R.id.btn_add);
selectedIndex = CommonData.getSelectedIndex();
etDate.setText(CommonData.getClassDetails().get(selectedIndex).getDate());
etSubject.setText(CommonData.getClassDetails().get(selectedIndex).getSubject());
etTime.setText(CommonData.getClassDetails().get(selectedIndex).getClassTime());
btnEdit.setOnClickListener(view -> {
updateClassdetails();
});
btnDel.setOnClickListener(view -> {
deleteClassdetails();
});
btnAdd.setOnClickListener(v -> {
getStudentList();
});
myCalendar = Calendar.getInstance();
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
etDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DatePickerDialog(ClassEditActivity.this, date, myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
etTime.setOnClickListener(new View.OnClickListener() {
final Calendar c = Calendar.getInstance();
int mHour = c.get(Calendar.HOUR_OF_DAY);
int mMinute = c.get(Calendar.MINUTE);
@Override
public void onClick(View v) {
TimePickerDialog timePickerDialog = new TimePickerDialog(ClassEditActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
etTime.setText(hourOfDay + ":" + String.format("%02d", minute));
}
}, mHour, mMinute, true);
timePickerDialog.show();
}
});
}
private void updateLabel() {
String myFormat = "MM/dd/yy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
etDate.setText(sdf.format(myCalendar.getTime()));
}
public void deleteClassdetails() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<String> userCall = serviceApi.deleteUser(CommonData.getClassDetails().get(CommonData.getSelectedIndex()).getId());
userCall.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.code()==200) {
progress.dismiss();
appPreference.showToast("deleted Sucessfully");
stopActivity();
} else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
appPreference.showToast(t.getMessage());
}
});
}
public void getStudentList() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<List<StudentDetails>> userCall = serviceApi.getStudents("class/students");
userCall.enqueue(new Callback<List<StudentDetails>>() {
@Override
public void onResponse(Call<List<StudentDetails>> call, Response<List<StudentDetails>> response) {
if (response.body()!=null)
{
CommonData.setStudentDetailsList(response.body());
CommonData.setStudentDetailsHashMap(new HashMap<>());
CommonData.setStudentDetailsHashMap(new HashMap<>());
for(StudentDetails details : CommonData.getStudentDetailsList()){
CommonData.getStudentDetailsHashMap().put(details.getStudentName(),details);
}
progress.dismiss();
Intent intent = new Intent(ClassEditActivity.this, StudentListActivity.class);
intent.putExtra("key", "edit");
startActivity(intent);
}
else
{
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<StudentDetails>> call, Throwable t) {
appPreference.showToast(t.getMessage());
progress.dismiss();
}
});
}
public void updateClassdetails() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
String Subject = etSubject.getText().toString();
String Date = etDate.getText().toString();
String time = etTime.getText().toString();
List<StudentDetails> listStudentDetails = new ArrayList<>();
if (CommonData.getSelectedStudentDetailsHashMap()!= null) {
for(Map.Entry<String, StudentDetails> entry : CommonData.getSelectedStudentDetailsHashMap().entrySet()) {
StudentDetails value = entry.getValue();
listStudentDetails.add(value);
}
}
if (TextUtils.isEmpty(Subject)) {
appPreference.showToast("Subject name is required.");
} else if (TextUtils.isEmpty(Date)) {
appPreference.showToast("Please select the date");
} else if (TextUtils.isEmpty(time)) {
appPreference.showToast("Please select the time");
} else {
Call<String> userCall = serviceApi.updateUser(new ClassDetail(CommonData.getClassDetails().get(CommonData.getSelectedIndex()).getId(), Subject, Date, time, listStudentDetails));
userCall.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.body().equals("ok")) {
progress.dismiss();
appPreference.showToast("updated Sucessfully");
stopActivity();
} else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
appPreference.showToast(t.getMessage());
}
});
}
}
private void stopActivity(){
this.finish();
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.StudentDetails;
import java.util.HashMap;
import java.util.List;
public class CommonData{
public static List<ClassDetail> classDetails;
public static String name;
public static String type;
public static int selectedIndex;
public static String id;
public static List<StudentDetails> studentDetailsList;
public static HashMap<String, StudentDetails> studentDetailsHashMap;
public static HashMap<String, StudentDetails> selectedStudentDetailsHashMap;
public static HashMap<String, StudentDetails> getSelectedStudentDetailsHashMap() {
return selectedStudentDetailsHashMap;
}
public static void setSelectedStudentDetailsHashMap(HashMap<String, StudentDetails> selectedStudentDetailsHashMap) {
CommonData.selectedStudentDetailsHashMap = selectedStudentDetailsHashMap;
}
public static HashMap<String, StudentDetails> getStudentDetailsHashMap() {
return studentDetailsHashMap;
}
public static void setStudentDetailsHashMap(HashMap<String, StudentDetails> studentDetailsHashMap) {
CommonData.studentDetailsHashMap = studentDetailsHashMap;
}
public static List<StudentDetails> getStudentDetailsList() {
return studentDetailsList;
}
public static void setStudentDetailsList(List<StudentDetails> studentDetailsList) {
CommonData.studentDetailsList = studentDetailsList;
}
public static String getId() {
return id;
}
public static void setId(String id) {
CommonData.id = id;
}
public static int getSelectedIndex() {
return selectedIndex;
}
public static void setSelectedIndex(int selectedIndex) {
CommonData.selectedIndex = selectedIndex;
}
public static List<ClassDetail> getClassDetails() {
return classDetails;
}
public static void setClassDetails(List<ClassDetail> classDetails) {
CommonData.classDetails = classDetails;
}
public static String getType() {
return type;
}
public static void setType(String type) {
CommonData.type = type;
}
public static void setName(String name) {
CommonData.name = name;
}
public static String getName() {
return name;
}
}
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import com.symbol.elearningapp.service.StudentDetails;
import com.symbol.elearningapp.service.User;
import java.util.HashMap;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomeActivity extends AppCompatActivity {
LinearLayout ll1, ll2, ll3, ll4;
ImageView iv1, iv2, iv3, iv4;
Button bt1, bt2, bt3, bt4;
String type = "student";
AppPreference appPreference;
ServiceApi serviceApi;
ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
type = CommonData.getType();
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
appPreference = new AppPreference(this);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
Toast.makeText(this, " Please Grant Permission for Camera", Toast.LENGTH_SHORT).show();
} else if (ActivityCompat.checkSelfPermission(this, Manifest.permission.MODIFY_AUDIO_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.MODIFY_AUDIO_SETTINGS}, 1);
Toast.makeText(this, " Please Grant Permission for Camera", Toast.LENGTH_SHORT).show();
}
ll1 = findViewById(R.id.llbutton1);
ll2 = findViewById(R.id.llbutton2);
ll3 = findViewById(R.id.llbutton3);
ll4 = findViewById(R.id.llbutton4);
iv1 = findViewById(R.id.ivbutton1);
iv2 = findViewById(R.id.ivbutton2);
iv3 = findViewById(R.id.ivbutton3);
iv4 = findViewById(R.id.ivbutton4);
bt1 = findViewById(R.id.ttbutton1);
bt2 = findViewById(R.id.ttbutton2);
bt3 = findViewById(R.id.ttbutton3);
bt4 = findViewById(R.id.ttbutton4);
populateUI();
}
public void getClassdetails() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<List<ClassDetail>> userCall = serviceApi.classDetails();
userCall.enqueue(new Callback<List<ClassDetail>>() {
@Override
public void onResponse(Call<List<ClassDetail>> call, Response<List<ClassDetail>> response) {
if (!response.body().equals("")) {
CommonData.setClassDetails(response.body());
progress.dismiss();
Intent intent = new Intent(HomeActivity.this, ClassDetailActivty.class);
startActivity(intent);
} else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<ClassDetail>> call, Throwable t) {
appPreference.showToast(t.getMessage());
progress.dismiss();
}
});
}
public void getClassjoindetails() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<List<ClassDetail>> userCall = serviceApi.classDetails();
userCall.enqueue(new Callback<List<ClassDetail>>() {
@Override
public void onResponse(Call<List<ClassDetail>> call, Response<List<ClassDetail>> response) {
if (!response.body().equals("")) {
CommonData.setClassDetails(response.body());
progress.dismiss();
Intent intent = new Intent(HomeActivity.this, JoinClassActivty.class);
startActivity(intent);
} else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<ClassDetail>> call, Throwable t) {
appPreference.showToast(t.getMessage());
progress.dismiss();
}
});
}
public void getAttendanceActivity() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<List<ClassDetail>> userCall = serviceApi.classDetails();
userCall.enqueue(new Callback<List<ClassDetail>>() {
@Override
public void onResponse(Call<List<ClassDetail>> call, Response<List<ClassDetail>> response) {
if (!response.body().equals("")) {
CommonData.setClassDetails(response.body());
progress.dismiss();
Intent intent = new Intent(HomeActivity.this, AttendenceActivity.class);
startActivity(intent);
} else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<ClassDetail>> call, Throwable t) {
appPreference.showToast(t.getMessage());
progress.dismiss();
}
});
}
public void getStudentList() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
Call<List<StudentDetails>> userCall = serviceApi.getStudents("class/students");
userCall.enqueue(new Callback<List<StudentDetails>>() {
@Override
public void onResponse(Call<List<StudentDetails>> call, Response<List<StudentDetails>> response) {
if (response.body()!=null)
{
CommonData.setStudentDetailsList(response.body());
CommonData.setStudentDetailsHashMap(new HashMap<>());
CommonData.setStudentDetailsHashMap(new HashMap<>());
for(StudentDetails details : CommonData.getStudentDetailsList()){
CommonData.getStudentDetailsHashMap().put(details.getStudentName(),details);
}
progress.dismiss();
Intent intent = new Intent(HomeActivity.this, StudentListActivity.class);
intent.putExtra("key", "home");
startActivity(intent);
}
else
{
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<StudentDetails>> call, Throwable t) {
appPreference.showToast(t.getMessage());
progress.dismiss();
}
});
}
public void populateUI() {
if (type.equals("student")) {
ll1.setVisibility(View.VISIBLE);
ll2.setVisibility(View.VISIBLE);
ll3.setVisibility(View.VISIBLE);
ll4.setVisibility(View.INVISIBLE);
iv1.setBackgroundResource(R.drawable.classlogo);
iv2.setBackgroundResource(R.drawable.attendancelogo);
iv3.setBackgroundResource(R.drawable.joinlogo);
bt1.setText("Class Details");
bt2.setText("Attendance");
bt3.setText("Join");
bt1.setOnClickListener(v -> {
getClassdetails();
});
bt2.setOnClickListener(v -> {
getAttendanceActivity();
});
bt3.setOnClickListener(v -> {
getClassjoindetails();
});
} else {
ll1.setVisibility(View.VISIBLE);
ll2.setVisibility(View.VISIBLE);
ll3.setVisibility(View.VISIBLE);
ll4.setVisibility(View.INVISIBLE);
iv1.setBackgroundResource(R.drawable.classlogo);
iv2.setBackgroundResource(R.drawable.attendancelogo);
iv3.setBackgroundResource(R.drawable.joinlogo);
bt1.setText("Class Details");
bt2.setText("Students");
bt3.setText("Start Session");
bt1.setOnClickListener(v -> {
getClassdetails();
});
bt2.setOnClickListener(v -> {
getStudentList();
});
bt3.setOnClickListener(v -> {
getClassjoindetails();
});
}
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.symbol.elearningapp.Adapters.ClassAdapter;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.ClassDetail;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class JoinClassActivty extends AppCompatActivity implements ClassAdapter.ClickListener {
AppPreference appPreference;
Button addBtn;
ServiceApi serviceApi;
RecyclerView recyclerView;
ClassAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class_detail_activty);
appPreference = new AppPreference(this);
addBtn = findViewById(R.id.btn_add);
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
addBtn.setVisibility(View.INVISIBLE);
addBtn.setOnClickListener(v -> {
Intent intent = new Intent(JoinClassActivty.this, ClassAddActivity.class);
startActivity(intent);
this.finish();
});
recyclerView = (RecyclerView) findViewById(R.id.rvDetails);
adapter = new ClassAdapter(CommonData.getClassDetails(), this, this);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClicked(int position) {
CommonData.setSelectedIndex(position);
Intent intent = new Intent(JoinClassActivty.this, JoinActivity.class);
startActivity(intent);
this.finish();
}
public void getClassdetails(){
Call<List<ClassDetail>> userCall = serviceApi.classDetails();
userCall.enqueue(new Callback<List<ClassDetail>>() {
@Override
public void onResponse(Call<List<ClassDetail>> call, Response<List<ClassDetail>> response) {
if (!response.body().equals("")) {
CommonData.setClassDetails(response.body());
}
else {
appPreference.showToast("Server Error occured!!");
}
}
@Override
public void onFailure(Call<List<ClassDetail>> call, Throwable t) {
appPreference.showToast(t.getMessage());
}
});
}
@Override
protected void onResume() {
super.onResume();
// getClassdetails();
// adapter.notifyDataSetChanged();
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Button;
import android.widget.TextView;
import com.symbol.elearningapp.Utils.AppPreference;
import com.symbol.elearningapp.Utils.Constant;
import com.symbol.elearningapp.service.RetrofitClient;
import com.symbol.elearningapp.service.ServiceApi;
import com.symbol.elearningapp.service.User;
import java.sql.SQLOutput;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class LoginActivity extends AppCompatActivity {
Button loginButton;
AppCompatImageView ivStudent, ivTutor;
TextView tvPWD, tvUserName;
ServiceApi serviceApi;
AppPreference appPreference;
String type = "student";
ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
serviceApi = RetrofitClient.getApiClient(Constant.baseUrl.BASE_URL).create(ServiceApi.class);
appPreference = new AppPreference(this);
loginButton = findViewById(R.id.btn_login);
ivStudent = findViewById(R.id.iv_student);
ivTutor = findViewById(R.id.iv_teacher);
tvPWD = findViewById(R.id.tvPWD);
tvUserName = findViewById(R.id.tvUserName);
ivStudent.setOnClickListener(View -> {
type = "student";
ivStudent.setBackground(ContextCompat.getDrawable(this, R.drawable.darkgrey_back_curved));
ivTutor.setBackground(ContextCompat.getDrawable(this, R.drawable.grey_back_curved));
});
ivTutor.setOnClickListener(View -> {
type = "tutor";
ivTutor.setBackground(ContextCompat.getDrawable(this, R.drawable.darkgrey_back_curved));
ivStudent.setBackground(ContextCompat.getDrawable(this, R.drawable.grey_back_curved));
});
loginButton.setOnClickListener(View -> {
userLogin();
});
}
public void userLogin() {
progress = new ProgressDialog(this);
progress.setTitle("Please wait");
progress.setCancelable(false);
progress.show();
String userName = tvUserName.getText().toString();
String Password = tvPWD.getText().toString();
if (TextUtils.isEmpty(userName)) {
appPreference.showToast("Username is required.");
} else if (TextUtils.isEmpty(Password)) {
appPreference.showToast("Password required");
} else {
// Call<String> userCall = serviceApi.login(new User(type, "bandara.p@gmail.com", "Bandara@123"));
Call<String> userCall = serviceApi.login(new User(type, userName,Password));
userCall.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String responseString = response.body().toString();
String[] splitStr = responseString.split("\\s+");
if (splitStr[0].equals("student")) {
CommonData.setType("student");
CommonData.setId(splitStr[1]);
Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(intent);
progress.dismiss();
tvUserName.setText("");
tvPWD.setText("");
}
else if (splitStr[0].equals("tutor")) {
CommonData.setType("tutor");
CommonData.setId(splitStr[1]);
Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(intent);
progress.dismiss();
tvUserName.setText("");
tvPWD.setText("");
}
else {
appPreference.showToast(response.body());
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
appPreference.showToast("Server Error.!");
progress.dismiss();
}
});
}
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
ImageView mLogo;
LinearLayout descimage,desctxt;
Animation uptodown,downtoup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
descimage = (LinearLayout) findViewById(R.id.titleimage);
desctxt = (LinearLayout) findViewById(R.id.titletxt);
mLogo =findViewById(R.id.imageView2);
uptodown = AnimationUtils.loadAnimation(this,R.anim.uptodown);
downtoup = AnimationUtils.loadAnimation(this,R.anim.downtoup);
descimage.setAnimation(uptodown);
desctxt.setAnimation(downtoup);
Thread myThread = new Thread(){
@Override
public void run(){
try {
sleep(5000);
Intent intent = new Intent(getApplicationContext(),LoginActivity.class);
startActivity(intent);
finish();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
myThread.start();
}
}
package com.symbol.elearningapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.SearchManager;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
import com.symbol.elearningapp.service.StudentDetails;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StudentListActivity extends AppCompatActivity {
SearchView searchView;
ListView listView;
ArrayList<String> list;
ArrayAdapter<String> adapter;
HashMap<String, StudentDetails> selectedStudentDetailsHashMap;
String passedValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_student_list);
if (getIntent().getExtras() != null) {
passedValue = getIntent().getStringExtra("key");
}
searchView = (SearchView) findViewById(R.id.searchView);
listView = (ListView) findViewById(R.id.lv1);
selectedStudentDetailsHashMap = new HashMap<>();
list = new ArrayList<>();
for(StudentDetails details : CommonData.getStudentDetailsList()){
list.add(details.getStudentName());
}
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
listView.setAdapter(adapter);
listView.setOnItemClickListener((adapterView, view, i, l) -> {
if(passedValue.equals("edit")){
String s = listView.getItemAtPosition(i).toString();
setStudentList(s);
}
// If you want to close the adapter
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if(list.contains(query)){
adapter.getFilter().filter(query);
}else{
Toast.makeText(StudentListActivity.this, "No Match found",Toast.LENGTH_LONG).show();
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
if(passedValue.equals("edit")){
if(CommonData.getClassDetails().get(CommonData.getSelectedIndex()).getListStd() != null){
for(StudentDetails studentDetails :CommonData.getClassDetails().get(CommonData.getSelectedIndex()).getListStd()){
selectedStudentDetailsHashMap.put(studentDetails.getStudentName(),studentDetails);
}
}
}
}
public void setStudentList(String name){
boolean alreadyNotAdded = true;
if (CommonData.getSelectedStudentDetailsHashMap()!=null) {
for(Map.Entry<String, StudentDetails> entry : CommonData.getSelectedStudentDetailsHashMap().entrySet()) {
String key = entry.getKey();
if(name.equals(key)){
alreadyNotAdded = false;
}
}
}
else if(selectedStudentDetailsHashMap!=null){
for(Map.Entry<String, StudentDetails> entry : selectedStudentDetailsHashMap.entrySet()) {
String key = entry.getKey();
if(name.equals(key)){
alreadyNotAdded = false;
}
}
}
if(alreadyNotAdded)
{
for(Map.Entry<String, StudentDetails> entry : CommonData.getStudentDetailsHashMap().entrySet()) {
String key = entry.getKey();
StudentDetails value = entry.getValue();
if(name.equals(key)){
selectedStudentDetailsHashMap.put(key,value);
}
}
Toast.makeText(StudentListActivity.this, "Added sucessfully",Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(StudentListActivity.this, "Already added",Toast.LENGTH_LONG).show();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
if(passedValue.equals("edit")){
CommonData.setSelectedStudentDetailsHashMap(selectedStudentDetailsHashMap);
}
}
}
\ No newline at end of file
package com.symbol.elearningapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.Preview;
import androidx.camera.extensions.HdrImageCaptureExtender;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.SurfaceView;
import android.widget.Toast;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.concurrent.ExecutionException;
public class TutorJoinActivity extends AppCompatActivity {
SurfaceView surfaceView;
PreviewView mPreviewView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tutor_join);
mPreviewView = findViewById(R.id.previewView);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
Toast.makeText(this, "Grant Permission and restart app", Toast.LENGTH_SHORT).show();
} else {
startCamera();
}
}
private void startCamera() {
final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(new Runnable() {
@Override
public void run() {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
// No errors need to be handled for this Future.
// This should never be reached.
}
}
}, ContextCompat.getMainExecutor(this));
}
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder()
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build();
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
.build();
ImageCapture.Builder builder = new ImageCapture.Builder();
HdrImageCaptureExtender hdrImageCaptureExtender = HdrImageCaptureExtender.create(builder);
if (hdrImageCaptureExtender.isExtensionAvailable(cameraSelector)) {
hdrImageCaptureExtender.enableExtension(cameraSelector);
}
final ImageCapture imageCapture = builder
.setTargetRotation(this.getWindowManager().getDefaultDisplay().getRotation())
.build();
preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, preview, imageAnalysis, imageCapture);
}
}
\ No newline at end of file
package com.symbol.elearningapp.Utils;
public class Constant {
public static class baseUrl {
public final static String BASE_URL = "https://e-education600.herokuapp.com";
}
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:toYDelta="0%p"
android:fromYDelta="100%p"
android:duration="3000"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:duration="2000"
android:fromYDelta="-100%p"
android:fromXDelta="0%p"/>
</set>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment