From 6f1cb317af8890d1a87804bf7fa04497d53b7af4 Mon Sep 17 00:00:00 2001 From: iamyajat <68477362+iamyajat@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:49:54 +0530 Subject: [PATCH 1/2] feat: community page created --- .idea/gradle.xml | 1 - .idea/misc.xml | 4 +- app/build.gradle | 28 ++-- app/src/main/AndroidManifest.xml | 11 +- .../com/dscvit/vitty/activity/HomeActivity.kt | 28 ++++ .../vitty/activity/InstructionsActivity.kt | 4 +- .../com/dscvit/vitty/adapter/DayAdapter.kt | 3 +- .../com/dscvit/vitty/adapter/PeriodAdapter.kt | 39 ++++- .../vitty/ui/community/CommunityFragment.kt | 37 +++++ .../vitty/ui/community/CommunityViewModel.kt | 6 + .../ui/instructions/InstructionsFragment.kt | 24 +-- .../schedule/ScheduleFragment.kt} | 153 ++++++++++-------- .../vitty/ui/schedule/ScheduleViewModel.kt | 6 + .../vitty/ui/settings/AccountPreference.kt | 10 +- .../com/dscvit/vitty/util/UtilFunctions.kt | 14 ++ .../main/res/drawable/ic_community_filled.xml | 23 +++ .../res/drawable/ic_community_outline.xml | 19 +++ .../res/drawable/ic_community_selector.xml | 5 + .../main/res/drawable/ic_timetable_filled.xml | 10 ++ .../res/drawable/ic_timetable_outline.xml | 10 ++ .../res/drawable/ic_timetable_selector.xml | 5 + app/src/main/res/layout/activity_home.xml | 37 +++++ .../main/res/layout/fragment_community.xml | 39 +++++ app/src/main/res/layout/fragment_day.xml | 1 + ...ity_schedule.xml => fragment_schedule.xml} | 9 +- app/src/main/res/layout/item_period.xml | 2 +- app/src/main/res/menu/bottom_nav_menu.xml | 14 ++ .../main/res/navigation/mobile_navigation.xml | 18 +++ app/src/main/res/values/strings.xml | 4 +- app/src/main/res/values/themes.xml | 2 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 32 files changed, 441 insertions(+), 129 deletions(-) create mode 100644 app/src/main/java/com/dscvit/vitty/activity/HomeActivity.kt create mode 100644 app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt create mode 100644 app/src/main/java/com/dscvit/vitty/ui/community/CommunityViewModel.kt rename app/src/main/java/com/dscvit/vitty/{activity/ScheduleActivity.kt => ui/schedule/ScheduleFragment.kt} (67%) mode change 100755 => 100644 create mode 100644 app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleViewModel.kt create mode 100644 app/src/main/res/drawable/ic_community_filled.xml create mode 100644 app/src/main/res/drawable/ic_community_outline.xml create mode 100644 app/src/main/res/drawable/ic_community_selector.xml create mode 100644 app/src/main/res/drawable/ic_timetable_filled.xml create mode 100644 app/src/main/res/drawable/ic_timetable_outline.xml create mode 100644 app/src/main/res/drawable/ic_timetable_selector.xml create mode 100644 app/src/main/res/layout/activity_home.xml create mode 100644 app/src/main/res/layout/fragment_community.xml rename app/src/main/res/layout/{activity_schedule.xml => fragment_schedule.xml} (94%) mode change 100755 => 100644 create mode 100644 app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 app/src/main/res/navigation/mobile_navigation.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml index e9969a1..7b46144 100755 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -14,7 +14,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index 655019c..6d6971a 100755 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,9 @@ - + + + diff --git a/app/build.gradle b/app/build.gradle index 9744a2d..7a5acc9 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,15 +20,15 @@ android { storePassword keystoreProperties['storePassword'] } } - compileSdkVersion 31 + compileSdkVersion 33 buildToolsVersion "30.0.3" defaultConfig { applicationId "com.dscvit.vitty" minSdkVersion 24 - targetSdkVersion 31 - versionCode 32 - versionName "1.4.0" + targetSdkVersion 33 + versionCode 34 + versionName "2.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.release } @@ -55,14 +55,16 @@ android { dependencies { // Android Stuff - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.4.0' - implementation 'com.google.android.material:material:1.4.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0' - implementation 'androidx.preference:preference-ktx:1.1.1' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0' + implementation 'androidx.preference:preference-ktx:1.2.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' + implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' @@ -76,10 +78,10 @@ dependencies { implementation 'com.google.android.gms:play-services-auth:19.2.0' // Firestore - implementation 'com.google.firebase:firebase-firestore:24.0.0' + implementation 'com.google.firebase:firebase-firestore:24.2.0' // FCM - implementation 'com.google.firebase:firebase-messaging:23.0.0' + implementation 'com.google.firebase:firebase-messaging:23.0.6' // Remote Config implementation 'com.google.firebase:firebase-config-ktx' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02e7ed9..a01a9fc 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -80,22 +80,17 @@ android:resource="@xml/next_class_widget_info" /> - + + android:exported="true"> - + , private val d val periodTime = binding.periodTime val classNav = binding.classNav val classIdOnline = binding.classIdOnline -// val courseCode = binding.courseCode + + // val courseCode = binding.courseCode fun bind(data: PeriodDetails) { binding.periodDetails = data } @@ -85,8 +87,19 @@ class PeriodAdapter(private val dataSet: ArrayList, private val d holder.apply { periodTime.text = "$sTime - $eTime" activePeriod.visibility = View.INVISIBLE - classNav.setOnClickListener { - VITMap.openClassMap(classNav.context, item.roomNo) + classNav.apply { + setOnClickListener { + VITMap.openClassMap(classNav.context, item.roomNo) + } + setOnLongClickListener { + copyItem( + context, + "Room Number", + "ROOM_NUMBER_ITEM", + item.roomNo + ) + true + } } } @@ -115,12 +128,22 @@ class PeriodAdapter(private val dataSet: ArrayList, private val d if (isExpanded) previousExpandedPosition = position - holder.itemView.setOnClickListener { - vibrateOnClick(holder.itemView.context) - mExpandedPosition = if (isExpanded) -1 else position - notifyItemChanged(previousExpandedPosition) - notifyItemChanged(position) + holder.itemView.apply { + setOnClickListener { + vibrateOnClick(holder.itemView.context) + mExpandedPosition = if (isExpanded) -1 else position + notifyItemChanged(previousExpandedPosition) + notifyItemChanged(position) + } + setOnLongClickListener { + mExpandedPosition = position + notifyItemChanged(previousExpandedPosition) + notifyItemChanged(position) + true + } } + + } override fun getItemCount() = dataSet.size diff --git a/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt b/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt new file mode 100644 index 0000000..ffd4a82 --- /dev/null +++ b/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt @@ -0,0 +1,37 @@ +package com.dscvit.vitty.ui.community + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.dscvit.vitty.databinding.FragmentCommunityBinding + +class CommunityFragment : Fragment() { + + private var _binding: FragmentCommunityBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val communityViewModel = + ViewModelProvider(this)[CommunityViewModel::class.java] + + _binding = FragmentCommunityBinding.inflate(inflater, container, false) + val root: View = binding.root + + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dscvit/vitty/ui/community/CommunityViewModel.kt b/app/src/main/java/com/dscvit/vitty/ui/community/CommunityViewModel.kt new file mode 100644 index 0000000..bdbcb19 --- /dev/null +++ b/app/src/main/java/com/dscvit/vitty/ui/community/CommunityViewModel.kt @@ -0,0 +1,6 @@ +package com.dscvit.vitty.ui.community + +import androidx.lifecycle.ViewModel + +class CommunityViewModel : ViewModel() { +} \ No newline at end of file diff --git a/app/src/main/java/com/dscvit/vitty/ui/instructions/InstructionsFragment.kt b/app/src/main/java/com/dscvit/vitty/ui/instructions/InstructionsFragment.kt index c1caabb..7f76bae 100755 --- a/app/src/main/java/com/dscvit/vitty/ui/instructions/InstructionsFragment.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/instructions/InstructionsFragment.kt @@ -1,14 +1,11 @@ package com.dscvit.vitty.ui.instructions -import android.content.ClipData -import android.content.ClipboardManager import android.content.Context import android.content.SharedPreferences import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import coil.load @@ -16,6 +13,7 @@ import coil.transform.CircleCropTransformation import com.dscvit.vitty.R import com.dscvit.vitty.databinding.FragmentInstructionsBinding import com.dscvit.vitty.model.UserDetails +import com.dscvit.vitty.util.UtilFunctions.copyItem import com.dscvit.vitty.util.UtilFunctions.openLink import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.ktx.auth @@ -59,7 +57,9 @@ class InstructionsFragment : Fragment() { openLink(context, context.getString(R.string.instructions_1_link)) } setOnLongClickListener { - copyLink( + copyItem( + requireContext(), + "Link", "GDSC_WEBSITE_LINK", context.getString(R.string.instructions_1_link) ) @@ -71,7 +71,9 @@ class InstructionsFragment : Fragment() { openLink(context, context.getString(R.string.telegram_link)) } setOnLongClickListener { - copyLink( + copyItem( + requireContext(), + "Link", "GDSC_TELEGRAM_LINK", context.getString(R.string.telegram_link) ) @@ -80,16 +82,4 @@ class InstructionsFragment : Fragment() { } } } - - private fun copyLink(label: String, url: String) { - Toast.makeText( - context, - "Link Copied", - Toast.LENGTH_LONG - ).show() - val clipboard: ClipboardManager? = - context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager? - val clip = ClipData.newPlainText(label, url) - clipboard?.setPrimaryClip(clip) - } } diff --git a/app/src/main/java/com/dscvit/vitty/activity/ScheduleActivity.kt b/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleFragment.kt old mode 100755 new mode 100644 similarity index 67% rename from app/src/main/java/com/dscvit/vitty/activity/ScheduleActivity.kt rename to app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleFragment.kt index b67705f..b8b1f4f --- a/app/src/main/java/com/dscvit/vitty/activity/ScheduleActivity.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleFragment.kt @@ -1,4 +1,4 @@ -package com.dscvit.vitty.activity +package com.dscvit.vitty.ui.schedule import android.app.Activity import android.app.PendingIntent @@ -8,72 +8,71 @@ import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.widget.Button import android.widget.RelativeLayout import android.widget.TextView -import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.edit -import androidx.databinding.DataBindingUtil -import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import com.dscvit.vitty.BuildConfig import com.dscvit.vitty.R +import com.dscvit.vitty.activity.InstructionsActivity +import com.dscvit.vitty.activity.SettingsActivity +import com.dscvit.vitty.activity.VITEventsActivity import com.dscvit.vitty.adapter.DayAdapter -import com.dscvit.vitty.databinding.ActivityScheduleBinding +import com.dscvit.vitty.databinding.FragmentScheduleBinding import com.dscvit.vitty.receiver.ShareReceiver -import com.dscvit.vitty.util.Constants.EXAM_MODE -import com.dscvit.vitty.util.Constants.FIRST_TIME_SETUP -import com.dscvit.vitty.util.Constants.SHARE_INTENT -import com.dscvit.vitty.util.Constants.TIMETABLE_AVAILABLE -import com.dscvit.vitty.util.Constants.UPDATE -import com.dscvit.vitty.util.Constants.UPDATE_CODE -import com.dscvit.vitty.util.Constants.USER_INFO +import com.dscvit.vitty.util.Constants import com.dscvit.vitty.util.LogoutHelper import com.dscvit.vitty.util.RemoteConfigUtils -import com.dscvit.vitty.util.UtilFunctions.getBitmapFromView -import com.dscvit.vitty.util.UtilFunctions.isUpdated -import com.dscvit.vitty.util.UtilFunctions.openLink -import com.dscvit.vitty.util.UtilFunctions.takeScreenshotAndShare +import com.dscvit.vitty.util.UtilFunctions import com.dscvit.vitty.util.VITMap import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayoutMediator import com.google.firebase.firestore.FirebaseFirestore import java.util.Calendar -class ScheduleActivity : FragmentActivity() { +class ScheduleFragment : Fragment() { - private lateinit var binding: ActivityScheduleBinding + private var _binding: FragmentScheduleBinding? = null private val days = listOf("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") private lateinit var prefs: SharedPreferences private var uid = "" private val db = FirebaseFirestore.getInstance() - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_schedule) - prefs = getSharedPreferences(USER_INFO, 0) + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val scheduleViewModel = + ViewModelProvider(this)[ScheduleViewModel::class.java] + + _binding = FragmentScheduleBinding.inflate(inflater, container, false) + val root: View = binding.root + + prefs = requireContext().getSharedPreferences(Constants.USER_INFO, 0) uid = prefs.getString("uid", "").toString() val classLocation = prefs.getString("openClassId", "").toString() if (classLocation != "") { prefs.edit().putString("openClassId", "").apply() - VITMap.openClassMap(this, classLocation) + VITMap.openClassMap(requireContext(), classLocation) } pageSetup() firstTimeSetup() - } - override fun onStart() { - super.onStart() - setupOnStart() + return root } - override fun onResume() { - super.onResume() - checkExamMode() - } private fun checkExamMode() { - if (!prefs.getBoolean(EXAM_MODE, false)) { + if (!prefs.getBoolean(Constants.EXAM_MODE, false)) { binding.examModeAlert.apply { visibility = View.INVISIBLE layoutParams = @@ -81,10 +80,10 @@ class ScheduleActivity : FragmentActivity() { addRule(RelativeLayout.ALIGN_PARENT_BOTTOM) } } - window.navigationBarColor = getColor(R.color.background) +// window.navigationBarColor = getColor(R.color.background) return } - window.navigationBarColor = getColor(R.color.tab_back) +// window.navigationBarColor = getColor(R.color.tab_back) binding.examModeAlert.apply { visibility = View.VISIBLE layoutParams = RelativeLayout.LayoutParams( @@ -97,7 +96,7 @@ class ScheduleActivity : FragmentActivity() { startActivity(Intent(context, SettingsActivity::class.java)) } } - binding.examModeAlertIcon.setColorFilter(getColor(R.color.translucent)) + binding.examModeAlertIcon.setColorFilter(requireContext().getColor(R.color.translucent)) } private fun setupOnStart() { @@ -105,12 +104,12 @@ class ScheduleActivity : FragmentActivity() { .document(uid) .get() .addOnSuccessListener { document -> - if (isUpdated(document, prefs)) { - prefs.edit().putInt(TIMETABLE_AVAILABLE, 0).apply() - prefs.edit().putInt(UPDATE, 1).apply() - val intent = Intent(this, InstructionsActivity::class.java) + if (UtilFunctions.isUpdated(document, prefs)) { + prefs.edit().putInt(Constants.TIMETABLE_AVAILABLE, 0).apply() + prefs.edit().putInt(Constants.UPDATE, 1).apply() + val intent = Intent(context, InstructionsActivity::class.java) startActivity(intent) - finish() + requireActivity().finish() } } } @@ -129,29 +128,29 @@ class ScheduleActivity : FragmentActivity() { } binding.VITEventsButton.setOnClickListener { - val intent = Intent(this, VITEventsActivity::class.java) + val intent = Intent(context, VITEventsActivity::class.java) startActivity(intent) } - binding.shareTimeTableButton.setOnClickListener { - Toast.makeText(this, "Share Timetable Alpha", Toast.LENGTH_LONG).show() - val rootView = window.decorView.findViewById(R.id.pager) - rootView.setBackgroundColor(getColor(R.color.background)) - takeScreenshotAndShare(this, getBitmapFromView(rootView)) - } +// binding.shareTimeTableButton.setOnClickListener { +// Toast.makeText(context, "Share Timetable Alpha", Toast.LENGTH_LONG).show() +// val rootView = window.decorView.findViewById(R.id.pager) +// rootView.setBackgroundColor(getColor(R.color.background)) +// UtilFunctions.takeScreenshotAndShare(this, UtilFunctions.getBitmapFromView(rootView)) +// } binding.scheduleToolbar.setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.logout -> { - LogoutHelper.logout(this, this as Activity, prefs) + LogoutHelper.logout(requireContext(), requireContext() as Activity, prefs) true } R.id.settings -> { - startActivity(Intent(this, SettingsActivity::class.java)) + startActivity(Intent(context, SettingsActivity::class.java)) true } R.id.support -> { - openLink(this, getString(R.string.telegram_link)) + UtilFunctions.openLink(requireContext(), getString(R.string.telegram_link)) true } R.id.share -> { @@ -164,9 +163,9 @@ class ScheduleActivity : FragmentActivity() { getString(R.string.share_text) ) val pendingIntent = PendingIntent.getBroadcast( - this, - SHARE_INTENT, - Intent(this, ShareReceiver::class.java), + context, + Constants.SHARE_INTENT, + Intent(context, ShareReceiver::class.java), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE else @@ -197,18 +196,22 @@ class ScheduleActivity : FragmentActivity() { } private fun firstTimeSetup() { - var max = 6 - val upCode = prefs.getInt(UPDATE_CODE, 0) - if (!prefs.getBoolean(FIRST_TIME_SETUP, false) || upCode != BuildConfig.VERSION_CODE) { + val max = 6 + val upCode = prefs.getInt(Constants.UPDATE_CODE, 0) + if (!prefs.getBoolean( + Constants.FIRST_TIME_SETUP, + false + ) || upCode != BuildConfig.VERSION_CODE + ) { var count = 1 val v: View = LayoutInflater - .from(this) + .from(context) .inflate(R.layout.dialog_setup_complete, null) - val dialog = MaterialAlertDialogBuilder(this) + val dialog = MaterialAlertDialogBuilder(requireContext()) .setView(v) .setBackground( AppCompatResources.getDrawable( - this, + requireContext(), R.color.transparent ) ) @@ -221,7 +224,11 @@ class ScheduleActivity : FragmentActivity() { val title = v.findViewById(R.id.title) val desc = v.findViewById(R.id.description) - if (prefs.getBoolean(FIRST_TIME_SETUP, false) && upCode < BuildConfig.VERSION_CODE) { + if (prefs.getBoolean( + Constants.FIRST_TIME_SETUP, + false + ) && upCode < BuildConfig.VERSION_CODE + ) { val msg = introMessage(max - 1) title.text = msg[0] desc.text = msg[1] @@ -232,8 +239,8 @@ class ScheduleActivity : FragmentActivity() { skip.setOnClickListener { prefs.edit { - putBoolean(FIRST_TIME_SETUP, true) - putInt(UPDATE_CODE, BuildConfig.VERSION_CODE) + putBoolean(Constants.FIRST_TIME_SETUP, true) + putInt(Constants.UPDATE_CODE, BuildConfig.VERSION_CODE) apply() } dialog.dismiss() @@ -250,8 +257,8 @@ class ScheduleActivity : FragmentActivity() { } if (count > max) { prefs.edit { - putBoolean(FIRST_TIME_SETUP, true) - putInt(UPDATE_CODE, BuildConfig.VERSION_CODE) + putBoolean(Constants.FIRST_TIME_SETUP, true) + putInt(Constants.UPDATE_CODE, BuildConfig.VERSION_CODE) apply() } dialog.dismiss() @@ -261,6 +268,7 @@ class ScheduleActivity : FragmentActivity() { } } + private fun introMessage(pos: Int): List { return when (pos) { 0 -> listOf(getString(R.string.congratulations), getString(R.string.complete_msg)) @@ -272,4 +280,19 @@ class ScheduleActivity : FragmentActivity() { else -> listOf(getString(R.string.final_heading), getString(R.string.about_final)) } } -} + + override fun onStart() { + super.onStart() + setupOnStart() + } + + override fun onResume() { + super.onResume() + checkExamMode() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleViewModel.kt b/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleViewModel.kt new file mode 100644 index 0000000..00e59ae --- /dev/null +++ b/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleViewModel.kt @@ -0,0 +1,6 @@ +package com.dscvit.vitty.ui.schedule + +import androidx.lifecycle.ViewModel + +class ScheduleViewModel : ViewModel() { +} \ No newline at end of file diff --git a/app/src/main/java/com/dscvit/vitty/ui/settings/AccountPreference.kt b/app/src/main/java/com/dscvit/vitty/ui/settings/AccountPreference.kt index a9dd61c..c498702 100755 --- a/app/src/main/java/com/dscvit/vitty/ui/settings/AccountPreference.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/settings/AccountPreference.kt @@ -12,14 +12,14 @@ import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase -class AccountPreference(context: Context?, attrs: AttributeSet?) : Preference(context, attrs) { +class AccountPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) { private val firebaseUser: FirebaseUser = Firebase.auth.currentUser!! - override fun onBindViewHolder(holder: PreferenceViewHolder?) { + override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) - holder?.itemView?.findViewById(R.id.title)?.text = firebaseUser.displayName - holder?.itemView?.findViewById(R.id.summary)?.text = firebaseUser.email - holder?.itemView?.findViewById(R.id.icon)?.load(firebaseUser.photoUrl) + holder.itemView.findViewById(R.id.title)?.text = firebaseUser.displayName + holder.itemView.findViewById(R.id.summary)?.text = firebaseUser.email + holder.itemView.findViewById(R.id.icon)?.load(firebaseUser.photoUrl) } init { diff --git a/app/src/main/java/com/dscvit/vitty/util/UtilFunctions.kt b/app/src/main/java/com/dscvit/vitty/util/UtilFunctions.kt index 491462d..c67653f 100755 --- a/app/src/main/java/com/dscvit/vitty/util/UtilFunctions.kt +++ b/app/src/main/java/com/dscvit/vitty/util/UtilFunctions.kt @@ -1,6 +1,8 @@ package com.dscvit.vitty.util import android.appwidget.AppWidgetManager +import android.content.ClipData +import android.content.ClipboardManager import android.content.ComponentName import android.content.Context import android.content.Intent @@ -35,6 +37,18 @@ object UtilFunctions { } } + fun copyItem(context: Context, item: String, label: String, url: String) { + Toast.makeText( + context, + "$item Copied", + Toast.LENGTH_LONG + ).show() + val clipboard: ClipboardManager? = + context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager? + val clip = ClipData.newPlainText(label, url) + clipboard?.setPrimaryClip(clip) + } + fun reloadWidgets(context: Context) { reloadWidget(context, NextClassWidget::class.java) reloadWidget(context, TodayWidget::class.java) diff --git a/app/src/main/res/drawable/ic_community_filled.xml b/app/src/main/res/drawable/ic_community_filled.xml new file mode 100644 index 0000000..d978a69 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_filled.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_community_outline.xml b/app/src/main/res/drawable/ic_community_outline.xml new file mode 100644 index 0000000..e456b12 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_outline.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_community_selector.xml b/app/src/main/res/drawable/ic_community_selector.xml new file mode 100644 index 0000000..c6164e3 --- /dev/null +++ b/app/src/main/res/drawable/ic_community_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_timetable_filled.xml b/app/src/main/res/drawable/ic_timetable_filled.xml new file mode 100644 index 0000000..51027b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_timetable_filled.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_timetable_outline.xml b/app/src/main/res/drawable/ic_timetable_outline.xml new file mode 100644 index 0000000..6706b8f --- /dev/null +++ b/app/src/main/res/drawable/ic_timetable_outline.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_timetable_selector.xml b/app/src/main/res/drawable/ic_timetable_selector.xml new file mode 100644 index 0000000..e67e0e7 --- /dev/null +++ b/app/src/main/res/drawable/ic_timetable_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..32a18e8 --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_community.xml b/app/src/main/res/layout/fragment_community.xml new file mode 100644 index 0000000..01fa8af --- /dev/null +++ b/app/src/main/res/layout/fragment_community.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_day.xml b/app/src/main/res/layout/fragment_day.xml index 287ddc3..d08c993 100755 --- a/app/src/main/res/layout/fragment_day.xml +++ b/app/src/main/res/layout/fragment_day.xml @@ -14,6 +14,7 @@ android:clipToPadding="false" android:layoutAnimation="@anim/layout_animation" android:paddingTop="10dp" + tools:listitem="@layout/card_period" android:paddingBottom="180dp" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> diff --git a/app/src/main/res/layout/activity_schedule.xml b/app/src/main/res/layout/fragment_schedule.xml old mode 100755 new mode 100644 similarity index 94% rename from app/src/main/res/layout/activity_schedule.xml rename to app/src/main/res/layout/fragment_schedule.xml index 84d69a9..0df7428 --- a/app/src/main/res/layout/activity_schedule.xml +++ b/app/src/main/res/layout/fragment_schedule.xml @@ -1,7 +1,8 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".ui.schedule.ScheduleFragment"> + android:padding="5dp" + android:visibility="gone" + tools:visibility="visible"> diff --git a/app/src/main/res/layout/item_period.xml b/app/src/main/res/layout/item_period.xml index 56dd343..b87e707 100755 --- a/app/src/main/res/layout/item_period.xml +++ b/app/src/main/res/layout/item_period.xml @@ -49,7 +49,7 @@ android:paddingStart="5dp" android:paddingEnd="20dp" android:text="@string/sample_room" - android:textSize="15sp" /> + android:textSize="14sp" /> \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..d238490 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml new file mode 100644 index 0000000..bc72737 --- /dev/null +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8926dc..6eb7d2a 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,7 +56,7 @@ Get control of the notifications by tapping on ⋮ > Settings > Notifications.\n\nThere you can:\n1. Turn on No CLasses Mode to pause your class notifications.\n2. Individually turn on/off notifications for your classes (Android 8+ only). To get notifications on time, keep the battery optimisations for the app turned off.\n\nTo change this setting, tap on ⋮ > Settings > Battery. Don\'t know which class is where? Don\'t worry, we\'ve got you covered!\n\nNow you can hit the directions button on the Next Class widget or tap on a room number in the app to start navigation to your class! - 1. VIT Events is now available on VITTY.\n2. Share your timetable with your friends.\n3. Exam/Holiday Mode is now called No Classes Mode. + 1. Exam/Holiday Mode is now called No Classes Mode. Let\'s go! You\'re all set to start using the app. Congratulations! @@ -84,6 +84,8 @@ https://dscv.it/telegram Support SJT101 + Timetable + Community Don\'t you have a quiz coming up? Finish your DAs! diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index feca4b0..03a41fa 100755 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -15,7 +15,7 @@ @font/poppins_400 @color/translucent @color/background - @color/background + @color/tab_back @color/white @drawable/menu_background diff --git a/build.gradle b/build.gradle index 455e351..aa4d177 100755 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' + classpath 'com.android.tools.build:gradle:7.2.1' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21' classpath 'com.google.gms:google-services:4.3.10' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3c026e4..ba3018c 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip From 69a669490f6d21951951688f671f22e7f9e84fb7 Mon Sep 17 00:00:00 2001 From: Yajat Malhotra <68477362+iamyajat@users.noreply.github.com> Date: Sun, 5 Feb 2023 02:30:02 +0530 Subject: [PATCH 2/2] feat: requests page --- .../vitty/ui/community/CommunityFragment.kt | 33 +++ .../vitty/ui/community/RequestsFragment.kt | 67 +++++ .../com/dscvit/vitty/util/APIConstants.kt | 6 + app/src/main/res/drawable/ic_requests.xml | 5 + app/src/main/res/drawable/nav_color.xml | 6 + app/src/main/res/layout/activity_home.xml | 5 +- .../main/res/layout/fragment_community.xml | 244 +++++++++++++++++- app/src/main/res/layout/fragment_requests.xml | 123 +++++++++ app/src/main/res/menu/community_menu.xml | 10 + app/src/main/res/menu/requests_menu.xml | 10 + .../main/res/navigation/mobile_navigation.xml | 11 +- app/src/main/res/values/colors.xml | 4 +- 12 files changed, 515 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/dscvit/vitty/ui/community/RequestsFragment.kt create mode 100644 app/src/main/java/com/dscvit/vitty/util/APIConstants.kt create mode 100644 app/src/main/res/drawable/ic_requests.xml create mode 100644 app/src/main/res/drawable/nav_color.xml create mode 100644 app/src/main/res/layout/fragment_requests.xml create mode 100644 app/src/main/res/menu/community_menu.xml create mode 100644 app/src/main/res/menu/requests_menu.xml diff --git a/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt b/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt index ffd4a82..dee1479 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/community/CommunityFragment.kt @@ -1,16 +1,22 @@ package com.dscvit.vitty.ui.community +import android.content.SharedPreferences import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import androidx.navigation.findNavController +import com.dscvit.vitty.R import com.dscvit.vitty.databinding.FragmentCommunityBinding +import com.dscvit.vitty.util.Constants class CommunityFragment : Fragment() { private var _binding: FragmentCommunityBinding? = null + private lateinit var prefs: SharedPreferences + // This property is only valid between onCreateView and // onDestroyView. @@ -27,6 +33,33 @@ class CommunityFragment : Fragment() { _binding = FragmentCommunityBinding.inflate(inflater, container, false) val root: View = binding.root + prefs = requireContext().getSharedPreferences(Constants.USER_INFO, 0) + + binding.communityToolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.requests -> { + requireView().findNavController() + .navigate(R.id.action_navigation_community_to_navigation_requests) + true + } + else -> { + false + } + } + } + + if (!prefs.getBoolean("KRISH", false)) { + binding.krish.visibility = View.GONE + } else { + binding.krish.visibility = View.VISIBLE + } + + binding.krish.setOnLongClickListener { + prefs.edit().putBoolean("KRISH", false).apply() + binding.krish.visibility = View.GONE + true + } + return root } diff --git a/app/src/main/java/com/dscvit/vitty/ui/community/RequestsFragment.kt b/app/src/main/java/com/dscvit/vitty/ui/community/RequestsFragment.kt new file mode 100644 index 0000000..c31d48c --- /dev/null +++ b/app/src/main/java/com/dscvit/vitty/ui/community/RequestsFragment.kt @@ -0,0 +1,67 @@ +package com.dscvit.vitty.ui.community + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.dscvit.vitty.R +import com.dscvit.vitty.databinding.FragmentRequestsBinding +import com.dscvit.vitty.util.Constants + +class RequestsFragment : Fragment() { + + private var _binding: FragmentRequestsBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + private lateinit var prefs: SharedPreferences + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val communityViewModel = + ViewModelProvider(this)[CommunityViewModel::class.java] + + _binding = FragmentRequestsBinding.inflate(inflater, container, false) + val root: View = binding.root + + prefs = requireContext().getSharedPreferences(Constants.USER_INFO, 0) + + binding.scheduleToolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.close -> { + requireActivity().onBackPressed() + true + } + else -> { + false + } + } + } + + binding.logout.setOnClickListener { + prefs.edit().putBoolean("KRISH", true).apply() + binding.reqKrish.visibility = View.GONE + } + + if (prefs.getBoolean("KRISH", false)) { + binding.reqKrish.visibility = View.GONE + } else { + binding.reqKrish.visibility = View.VISIBLE + } + + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dscvit/vitty/util/APIConstants.kt b/app/src/main/java/com/dscvit/vitty/util/APIConstants.kt new file mode 100644 index 0000000..ed05084 --- /dev/null +++ b/app/src/main/java/com/dscvit/vitty/util/APIConstants.kt @@ -0,0 +1,6 @@ +package com.dscvit.vitty.util + +object APIConstants { + const val BASE_URL = "https://shielded-beyond-17845.herokuapp.com" + const val TIMEOUT = 10 +} diff --git a/app/src/main/res/drawable/ic_requests.xml b/app/src/main/res/drawable/ic_requests.xml new file mode 100644 index 0000000..89c57d7 --- /dev/null +++ b/app/src/main/res/drawable/ic_requests.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/nav_color.xml b/app/src/main/res/drawable/nav_color.xml new file mode 100644 index 0000000..6d52bcc --- /dev/null +++ b/app/src/main/res/drawable/nav_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 32a18e8..3c59d3d 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -14,8 +14,9 @@ android:layout_marginStart="0dp" android:layout_marginEnd="0dp" android:background="@color/tab_back" - app:itemIconTint="@color/white" - app:itemTextColor="@color/white" + app:itemIconTint="@drawable/nav_color" + app:itemTextColor="@drawable/nav_color" + app:itemRippleColor="@color/translucent_ripple" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" diff --git a/app/src/main/res/layout/fragment_community.xml b/app/src/main/res/layout/fragment_community.xml index 01fa8af..e28c17b 100644 --- a/app/src/main/res/layout/fragment_community.xml +++ b/app/src/main/res/layout/fragment_community.xml @@ -10,19 +10,20 @@ android:animateLayoutChanges="true"> @@ -30,10 +31,243 @@ + android:visibility="gone" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_requests.xml b/app/src/main/res/layout/fragment_requests.xml new file mode 100644 index 0000000..e173b2f --- /dev/null +++ b/app/src/main/res/layout/fragment_requests.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/community_menu.xml b/app/src/main/res/menu/community_menu.xml new file mode 100644 index 0000000..7be1990 --- /dev/null +++ b/app/src/main/res/menu/community_menu.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/requests_menu.xml b/app/src/main/res/menu/requests_menu.xml new file mode 100644 index 0000000..beb0241 --- /dev/null +++ b/app/src/main/res/menu/requests_menu.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index bc72737..3ec965c 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -14,5 +14,14 @@ android:id="@+id/navigation_community" android:name="com.dscvit.vitty.ui.community.CommunityFragment" android:label="@string/title_community" - tools:layout="@layout/fragment_community" /> + tools:layout="@layout/fragment_community" > + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e4fd43f..462794f 100755 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,5 +1,5 @@ - + #FF000000 #FFFFFFFF #D1D1D1 @@ -9,6 +9,7 @@ #082F63 #041727 #688FBC + #25688FBC #9DBADC #C3D4E8 #AD5B7CA1 @@ -17,4 +18,5 @@ #99126AFC #1A126AFC #00000000 + @color/translucent \ No newline at end of file