This commit is contained in:
Tucan444 2021-04-15 11:34:57 +02:00
parent 2045cb4425
commit d8d3ff9b8e
25 changed files with 238 additions and 119 deletions

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.wikispot"> package="com.example.wikispot">
<!-- <!--
@ -35,8 +34,8 @@
android:value="@string/google_maps_key" /> android:value="@string/google_maps_key" />
<activity <activity
android:name=".activities.MainActivity" android:name=".activities.MainActivity">
android:screenOrientation="portrait"> <!--android:screenOrientation="portrait"> -->
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

@ -230,6 +230,10 @@ class MainActivity : AppCompatActivity() {
"settingsFragment" -> { "settingsFragment" -> {
mainBottomNavigationView.selectedItemId = R.id.settingsFragment mainBottomNavigationView.selectedItemId = R.id.settingsFragment
} }
"debugFragment" -> {
StartDirections.settingsFragmentStartDirection = "debugFragment"
mainBottomNavigationView.selectedItemId = R.id.settingsFragment
}
} }
} }

@ -1,23 +1,31 @@
package com.example.wikispot.adapters package com.example.wikispot.adapters
import android.content.Context import android.content.Context
import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.Animation import android.view.animation.Animation
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import androidx.core.content.ContextCompat.startActivity
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.example.wikispot.R import com.example.wikispot.R
import com.example.wikispot.ServerManagement import com.example.wikispot.ServerManagement
import com.example.wikispot.modelsForAdapters.FileView import com.example.wikispot.modelsForAdapters.FileView
import kotlinx.android.synthetic.main.file_view.view.* import kotlinx.android.synthetic.main.file_view.view.*
import java.io.File
import java.io.FileOutputStream
import java.net.URL
class FileViewsAdapter(private val context: Context, private val fileViews: Array<FileView?>) : RecyclerView.Adapter<FileViewsAdapter.MyViewHolder>() { class FileViewsAdapter(private val context: Context, private val fileViews: Array<FileView?>) : RecyclerView.Adapter<FileViewsAdapter.MyViewHolder>() {
private val rotateOpen: Animation by lazy { AnimationUtils.loadAnimation(context, R.anim.open_rotation_anim) } private val rotateOpen: Animation by lazy { AnimationUtils.loadAnimation(context, R.anim.open_rotation_anim) }
private val rotateClose: Animation by lazy { AnimationUtils.loadAnimation(context, R.anim.close_rotation_anim) } private val rotateClose: Animation by lazy { AnimationUtils.loadAnimation(context, R.anim.close_rotation_anim) }
private val fadeIn: Animation by lazy {AnimationUtils.loadAnimation(context, R.anim.fade_in) }
private val fadeOut: Animation by lazy {AnimationUtils.loadAnimation(context, R.anim.fade_out) }
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
@ -31,6 +39,8 @@ class FileViewsAdapter(private val context: Context, private val fileViews: Arra
init { init {
itemView.setOnClickListener { itemView.setOnClickListener {
if (!opened) { if (!opened) {
itemView.downloadFileBtn.visibility = View.VISIBLE
itemView.downloadFileBtn.startAnimation(fadeIn)
itemView.showFileBtn.startAnimation(rotateOpen) itemView.showFileBtn.startAnimation(rotateOpen)
fileView?.let { fileView?.let {
@ -60,18 +70,46 @@ class FileViewsAdapter(private val context: Context, private val fileViews: Arra
} }
pdfUrl?.let { pdfUrl?.let {
itemView.pdfContent.visibility = View.VISIBLE itemView.pdfContent.visibility = View.VISIBLE
ServerManagement.serverManager.loadPdfView(itemView.pdfContent, pdfUrl!!) ServerManagement.serverManager.loadPdfView(itemView.pdfContent, pdfUrl!!, true)
println("current page is: ${itemView.pdfContent.currentPage}")
} }
} }
} else { } else {
itemView.showFileBtn.startAnimation(rotateClose) itemView.showFileBtn.startAnimation(rotateClose)
itemView.textContent.textSize = 0F itemView.textContent.textSize = 0F
val downloadBtnVanishActionThread = Thread(DownloadBtnVanishAction())
downloadBtnVanishActionThread.start()
itemView.imageContent.visibility = View.GONE itemView.imageContent.visibility = View.GONE
itemView.pdfContent.visibility = View.GONE itemView.pdfContent.visibility = View.GONE
} }
opened = !opened opened = !opened
} }
itemView.downloadFileBtn.setOnClickListener {
textInfo?.let {
val textInformation = textInfo!!.split("|||||")
val url = "${ServerManagement.baseUrl}files/${textInformation[0]}/${textInformation[1]}"
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(context, browserIntent, null)
}
imgInfo?.let {
val imgInformation = imgInfo!!.split("|||||")
val url = "${ServerManagement.baseUrl}files/${imgInformation[0]}/${imgInformation[1]}"
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(context, browserIntent, null)
}
pdfUrl?.let {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(pdfUrl))
startActivity(context, browserIntent, null)
}
}
} }
fun setData(fileView: FileView?, pos: Int) { fun setData(fileView: FileView?, pos: Int) {
@ -92,6 +130,24 @@ class FileViewsAdapter(private val context: Context, private val fileViews: Arra
this.fileView = fileView this.fileView = fileView
this.pos = pos this.pos = pos
} }
inner class DownloadBtnVanishAction: Runnable {
override fun run() {
itemView.post {
itemView.downloadFileBtn.startAnimation(fadeOut)
}
Thread.sleep(600)
itemView.post {
itemView.downloadFileBtn.clearAnimation()
itemView.downloadFileBtn.visibility = View.GONE
}
}
}
} }
override fun onBindViewHolder(holder: MyViewHolder, position: Int) { override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

@ -5,6 +5,7 @@ import androidx.fragment.app.Fragment
import android.view.View import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.example.wikispot.R import com.example.wikispot.R
import com.example.wikispot.ServerManagement
import com.example.wikispot.adapters.ChatMessagesAdapter import com.example.wikispot.adapters.ChatMessagesAdapter
import com.example.wikispot.adapters.FileViewsAdapter import com.example.wikispot.adapters.FileViewsAdapter
import com.example.wikispot.modelsForAdapters.MessagesSupplier import com.example.wikispot.modelsForAdapters.MessagesSupplier
@ -20,8 +21,24 @@ class chatFragment : Fragment(R.layout.fragment_chat) {
updateRecyclerView() updateRecyclerView()
} }
override fun onResume() {
super.onResume()
val dataReceiver: (String) -> Unit = {data: String ->
println("[debug][chat connection] data: $data")
}
ServerManagement.serverManager.addReceiverConnection(dataReceiver, requireContext(), "chatConnection", 0, ServerManagement.chat_keyword)
}
override fun onPause() {
super.onPause()
ServerManagement.serverManager.deleteConnection("chatConnection")
}
private fun updateRecyclerView() { private fun updateRecyclerView() {
try {
chat_messages_recycler_view.post { chat_messages_recycler_view.post {
val layoutManager = LinearLayoutManager(context) val layoutManager = LinearLayoutManager(context)
layoutManager.orientation = LinearLayoutManager.VERTICAL layoutManager.orientation = LinearLayoutManager.VERTICAL
@ -30,6 +47,7 @@ class chatFragment : Fragment(R.layout.fragment_chat) {
val adapter = context?.let { ChatMessagesAdapter(it, MessagesSupplier.messages) } val adapter = context?.let { ChatMessagesAdapter(it, MessagesSupplier.messages) }
chat_messages_recycler_view.adapter = adapter chat_messages_recycler_view.adapter = adapter
} }
} catch (e: Throwable) { println("[debug] e5 Exception: $e") }
} }

@ -1,20 +1,21 @@
package com.example.wikispot.fragments package com.example.wikispot.fragments
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.Navigation import androidx.navigation.Navigation
import com.example.wikispot.IntentsKeys
import com.example.wikispot.R import com.example.wikispot.R
import com.example.wikispot.ServerManagement import com.example.wikispot.ServerManagement
import com.example.wikispot.activities.MainActivity
import com.example.wikispot.modelClasses.JsonManager import com.example.wikispot.modelClasses.JsonManager
import kotlinx.android.synthetic.main.fragment_debug.* import kotlinx.android.synthetic.main.fragment_debug.*
class debugFragment : Fragment(R.layout.fragment_debug) { class debugFragment : Fragment(R.layout.fragment_debug) {
private lateinit var jsonManager: JsonManager
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -27,30 +28,31 @@ class debugFragment : Fragment(R.layout.fragment_debug) {
outputText.text = ServerManagement.totalNumberOfRequestsSent.toString() outputText.text = ServerManagement.totalNumberOfRequestsSent.toString()
} }
val pdfRequestThread = Thread(PdfRequest()) clearServerConnectionsBtn.setOnClickListener {
pdfRequestThread.start() ServerManagement.serverManager.clearConnections()
}
editTextIp.setText(ServerManagement.baseUrl)
changeIpBtn.setOnClickListener {
ServerManagement.baseUrl = editTextIp.text.toString()
restartAppPartially()
}
restartAppPartiallyBtn.setOnClickListener {
restartAppPartially()
}
} }
inner class PdfRequest : Runnable { private fun restartAppPartially() {
val intent = Intent(context?.applicationContext, MainActivity::class.java)
override fun run() { intent.putExtra(IntentsKeys.startFragment, "debugFragment")
val inputStream = java.net.URL("${ServerManagement.baseUrl}files/1/sample.pdf").openStream()
Thread.sleep(500) ServerManagement.serverManager.clearConnections()
pdfContent.post { startActivity(intent)
pdfContent.fromStream(inputStream).load() activity?.finish()
pdfContent.zoomTo(pdfContent.width / 490.0F)
println("[debug] zoom is ${pdfContent.width / 490.0F}")
println(pdfContent.width)
Thread.sleep(1000)
println(pdfContent.currentPage)
}
ServerManagement.totalNumberOfRequestsSent += 1
}
} }
} }

@ -65,7 +65,7 @@ class infoFragment : Fragment(R.layout.fragment_info) {
val json = JsonManager(requireContext(), data) val json = JsonManager(requireContext(), data)
json.findJsonObjectByAttribute("ID", serverId) json.findJsonObjectByAttribute("ID", serverId)
mainImage?.let { mainTitle?.let {
mainTitle.post { mainTitle.post {
mainTitle.text = json.getAttributeContentByPath("description/title") mainTitle.text = json.getAttributeContentByPath("description/title")
} }
@ -177,7 +177,7 @@ class infoFragment : Fragment(R.layout.fragment_info) {
val adapter = context?.let { LabeledValuesAdapter(it, LabeledValuesSupplier.labeledValues) } val adapter = context?.let { LabeledValuesAdapter(it, LabeledValuesSupplier.labeledValues) }
labeled_values_recycler_view.adapter = adapter labeled_values_recycler_view.adapter = adapter
} }
} catch (e: Throwable) { println("[debug] e3 that i couldnt fix so try catch Exception: $e") } } catch (e: Throwable) { println("[debug] e3 Exception: $e") }
} }
@ -192,7 +192,7 @@ class infoFragment : Fragment(R.layout.fragment_info) {
val adapter = context?.let { FileViewsAdapter(it, FileViewsSupplier.fileViews) } val adapter = context?.let { FileViewsAdapter(it, FileViewsSupplier.fileViews) }
file_views_recycler_view.adapter = adapter file_views_recycler_view.adapter = adapter
} }
} catch (e: Throwable) { println("[debug] e2 that i couldnt fix so try catch Exception: $e") } } catch (e: Throwable) { println("[debug] e2 Exception: $e") }
} }

@ -62,7 +62,8 @@ class mapFragment : Fragment(), GoogleMap.OnMarkerClickListener {
// loading other markers // loading other markers
for (n in PlaceSupplier.places.indices) { for (n in PlaceSupplier.places.indices) {
val coordinates = PlaceSupplier.places[n]?.location!!.split(",") val coordinates = PlaceSupplier.places[n]?.location!!.split(",")
googleMap.addMarker(MarkerOptions().position(LatLng(coordinates[0].toDouble(), coordinates[1].toDouble())).title(PlaceSupplier.places[n]?.title)) googleMap.addMarker(MarkerOptions().position(LatLng(coordinates[0].toDouble(), coordinates[1].toDouble())).title(PlaceSupplier.places[n]?.title)
.snippet(PlaceSupplier.places[n]!!.description))
} }
googleMap.setOnMarkerClickListener(this) googleMap.setOnMarkerClickListener(this)

@ -5,10 +5,7 @@ import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.View import android.view.View
import androidx.navigation.Navigation import androidx.navigation.Navigation
import com.example.wikispot.IntentsKeys import com.example.wikispot.*
import com.example.wikispot.R
import com.example.wikispot.ServerManagement
import com.example.wikispot.ThemeOptions
import com.example.wikispot.activities.MainActivity import com.example.wikispot.activities.MainActivity
import com.example.wikispot.modelClasses.ServerManager import com.example.wikispot.modelClasses.ServerManager
import com.example.wikispot.modelClasses.SettingsSaveManager import com.example.wikispot.modelClasses.SettingsSaveManager
@ -22,6 +19,15 @@ class settingsFragment : Fragment(R.layout.fragment_settings) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
StartDirections.settingsFragmentStartDirection?.let {
when (StartDirections.settingsFragmentStartDirection) {
"debugFragment" -> {
Navigation.findNavController(debugBtn).navigate(R.id.navigateToDebugFragment)
StartDirections.settingsFragmentStartDirection = null
}
}
}
settingsSaveManager = SettingsSaveManager(requireContext()) settingsSaveManager = SettingsSaveManager(requireContext())
loadSettings() loadSettings()

@ -128,16 +128,16 @@ class ServerManager {
} }
} }
fun loadPdfView(view: PDFView, url: String) { fun loadPdfView(view: PDFView, url: String, swipeHorizontal: Boolean=false) {
val pdfLoadingRequestThread = Thread(PdfLoadingRequest(view, url)) val pdfLoadingRequestThread = Thread(PdfLoadingRequest(view, url, swipeHorizontal))
pdfLoadingRequestThread.start() pdfLoadingRequestThread.start()
} }
inner class PdfLoadingRequest(val view: PDFView, val url: String): Runnable { inner class PdfLoadingRequest(val view: PDFView, val url: String, private val swipeHorizontal: Boolean=false): Runnable {
override fun run() { override fun run() {
val inputStream = java.net.URL(url).openStream() val inputStream = java.net.URL(url).openStream()
view.post { view.post {
view.fromStream(inputStream).load() view.fromStream(inputStream).swipeHorizontal(swipeHorizontal).load()
view.zoomTo(view.width / 490.0F) view.zoomTo(view.width / 490.0F)
} }
} }
@ -150,15 +150,15 @@ class ServerManager {
for (i in 0 until receiverConnections.size) { for (i in 0 until receiverConnections.size) {
try { try {
receiverConnections[i].running = false receiverConnections[i].running = false
receiverConnections.removeAt(i)
} catch (e: Throwable) { println("In clearConnections: $e") } } catch (e: Throwable) { println("In clearConnections: $e") }
} }
receiverConnections = mutableListOf()
for (i in 0 until viewConnections.size) { for (i in 0 until viewConnections.size) {
try { try {
viewConnections[i].running = false viewConnections[i].running = false
viewConnections.removeAt(i)
} catch (e: Throwable) { println("In clearConnections: $e") } } catch (e: Throwable) { println("In clearConnections: $e") }
} }
viewConnections = mutableListOf()
} }
fun checkIfConnectionAlreadyExists(connectionName: String, connectionType: String="any"): Boolean{ fun checkIfConnectionAlreadyExists(connectionName: String, connectionType: String="any"): Boolean{

@ -2,16 +2,11 @@ package com.example.wikispot.modelsForAdapters
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.media.Image
import com.example.wikispot.ScreenParameters
import com.example.wikispot.getStringFromSharedPreferences import com.example.wikispot.getStringFromSharedPreferences
import com.example.wikispot.modelClasses.JsonManager import com.example.wikispot.modelClasses.JsonManager
import com.example.wikispot.modelClasses.JsonManagerLite import com.example.wikispot.modelClasses.JsonManagerLite
import com.example.wikispot.saveString import com.example.wikispot.saveString
import com.google.android.gms.maps.model.LatLng
import org.json.JSONArray import org.json.JSONArray
import java.lang.IndexOutOfBoundsException
import java.lang.NullPointerException
data class PlacePreview(var title: String, var description: String, var location: String? = null, var img: Bitmap? = null, val id: Int?=null) { data class PlacePreview(var title: String, var description: String, var location: String? = null, var img: Bitmap? = null, val id: Int?=null) {
@ -41,9 +36,9 @@ object PlaceSupplier {
var controlJson: JsonManagerLite? = null var controlJson: JsonManagerLite? = null
var places = arrayOf<PlacePreview?>( var places = arrayOf<PlacePreview?>(
PlacePreview("River", "", "39.94071648123733,-85.9346308193051"), PlacePreview("River", "", "39.94071648123733,-85.9346308193051", null, 12),
PlacePreview("Velky Manin", "", "49.12590793522579,18.49571849264312"), PlacePreview("Velky Manin", "", "49.12590793522579,18.49571849264312", null, 16),
PlacePreview("Klapy", "", "49.161527643132175,18.41231657316252") PlacePreview("Klapy", "", "49.161527643132175,18.41231657316252", null, 18)
) )
fun appendPlace(place: PlacePreview) { fun appendPlace(place: PlacePreview) {
@ -88,6 +83,7 @@ object PlaceSupplier {
val jsonManager = JsonManager(context, save) val jsonManager = JsonManager(context, save)
for (n in 0 until jsonManager.getLengthOfJsonArray()) { for (n in 0 until jsonManager.getLengthOfJsonArray()) {
val savedData = jsonManager.jsonArray?.get(n).toString().split("|||||") val savedData = jsonManager.jsonArray?.get(n).toString().split("|||||")
println("[debug] saved data is $savedData")
val place = PlacePreview(savedData[0], savedData[1], savedData[2], null, savedData[3].toInt()) val place = PlacePreview(savedData[0], savedData[1], savedData[2], null, savedData[3].toInt())
if (!checkIfContains(place)) { if (!checkIfContains(place)) {
appendPlace(place) appendPlace(place)

@ -1,7 +1,5 @@
package com.example.wikispot.modelsForAdapters package com.example.wikispot.modelsForAdapters
import android.graphics.Bitmap
data class FileView(val filetype: String, val filename: String, var textInfo: String? = null, var imgInfo: String? = null, var pdfUrl: String? = null) data class FileView(val filetype: String, val filename: String, var textInfo: String? = null, var imgInfo: String? = null, var pdfUrl: String? = null)

@ -13,6 +13,10 @@ object MessagesSupplier {
messages = array messages = array
} }
fun checkIfContains(message: Message) {
}
fun wipeData() { fun wipeData() {
messages = arrayOf() messages = arrayOf()
} }

@ -24,10 +24,11 @@ object ServerManagement {
const val viewConnectionOnCheckWait: Long = 5000 const val viewConnectionOnCheckWait: Long = 5000
const val dataRequestOnAttemptWait: Long = 2000 const val dataRequestOnAttemptWait: Long = 2000
const val imageRequestOnAttemptWait: Long = 2000 const val imageRequestOnAttemptWait: Long = 2000
const val baseUrl = "http://192.168.1.156:8000/" var baseUrl = "http://192.168.1.156:8000/"
var selectedServerId = 0 var selectedServerId = 0
const val sensors_keyword = "_[{(S,e,n,s,o,r,s)}]_" const val sensors_keyword = "_[{(S,e,n,s,o,r,s)}]_"
const val chat_keyword = "_[{(C,h,a,t)}]_"
var totalNumberOfRequestsSent = 0 var totalNumberOfRequestsSent = 0
} }
@ -50,7 +51,9 @@ object CustomBackstackVariables {
object ThemeOptions { object ThemeOptions {
var darkTheme = false var darkTheme = false
}
object StartDirections {
var settingsFragmentStartDirection: String? = null
} }

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="600"/>
</set>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="600"/>
</set>

@ -6,5 +6,5 @@
android:tint="?attr/colorControlNormal"> android:tint="?attr/colorControlNormal">
<path <path
android:fillColor="@android:color/white" android:fillColor="@android:color/white"
android:pathData="M7,14l5,-5 5,5H7z"/> android:pathData="M7,10l5,5 5,-5z"/>
</vector> </vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M5,20h14v-2H5V20zM19,9h-4V3H9v6H5l7,7L19,9z"/>
</vector>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:centerY="0.6"
android:startColor="?attr/mapFragmentGradientStartColor"
android:centerColor="?attr/mapFragmentGradientCenterColor"
android:endColor="?attr/mapFragmentGradientEndColor"
android:type="linear"
android:angle="225"/>
</shape>

@ -33,7 +33,7 @@
android:scaleY="4" android:scaleY="4"
card_view:layout_constraintEnd_toEndOf="parent" card_view:layout_constraintEnd_toEndOf="parent"
card_view:layout_constraintTop_toTopOf="parent" card_view:layout_constraintTop_toTopOf="parent"
card_view:srcCompat="@drawable/ic_sharp_arrow_drop_up_24" /> card_view:srcCompat="@drawable/ic_baseline_arrow_drop_down_24" />
<TextView <TextView
android:id="@+id/textContent" android:id="@+id/textContent"
@ -71,6 +71,17 @@
card_view:layout_constraintHorizontal_bias="0.5" card_view:layout_constraintHorizontal_bias="0.5"
card_view:layout_constraintStart_toStartOf="parent" /> card_view:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/downloadFileBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:visibility="gone"
card_view:layout_constraintBottom_toBottomOf="@+id/showFileBtn"
card_view:layout_constraintEnd_toStartOf="@+id/showFileBtn"
card_view:layout_constraintTop_toTopOf="@+id/showFileBtn"
card_view:srcCompat="@drawable/ic_baseline_download_24" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>

@ -31,12 +31,13 @@
<ScrollView <ScrollView
android:id="@+id/scrollView3" android:id="@+id/scrollView3"
android:layout_width="0dp" android:layout_width="252dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="32dp" android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="@+id/getNumberOfSentRequestsBtn" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/getNumberOfSentRequestsBtn" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintTop_toBottomOf="@+id/getNumberOfSentRequestsBtn"> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/clearServerConnectionsBtn">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -54,15 +55,48 @@
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
<com.github.barteksc.pdfviewer.PDFView <Button
android:id="@+id/pdfContent" android:id="@+id/changeIpBtn"
android:layout_width="200dp" android:layout_width="wrap_content"
android:layout_height="300dp" android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="16dp"
android:text="Change IP"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextIp" />
<EditText
android:id="@+id/editTextIp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Name"
app:layout_constraintEnd_toEndOf="@+id/scrollView3"
app:layout_constraintStart_toStartOf="@+id/scrollView3"
app:layout_constraintTop_toBottomOf="@+id/scrollView3" />
<Button
android:id="@+id/clearServerConnectionsBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Clear server connections"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scrollView3" app:layout_constraintTop_toBottomOf="@+id/getNumberOfSentRequestsBtn" />
app:layout_constraintVertical_bias="0.17000002" />
<Button
android:id="@+id/restartAppPartiallyBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Restart app partially"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/changeIpBtn" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -11,7 +11,7 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="match_parent">
<TextView <TextView
android:id="@+id/home_title" android:id="@+id/home_title"
@ -34,12 +34,15 @@
android:name="com.example.wikispot.fragments.infoFragment" android:name="com.example.wikispot.fragments.infoFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:layout_marginLeft="8dp"
android:layout_marginTop="40dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView4"> app:layout_constraintTop_toBottomOf="@+id/home_title">
</androidx.fragment.app.FragmentContainerView> </androidx.fragment.app.FragmentContainerView>

@ -21,10 +21,6 @@
<attr name="homeFragmentGradientCenterColor" format="color"/> <attr name="homeFragmentGradientCenterColor" format="color"/>
<attr name="homeFragmentGradientEndColor" format="color"/> <attr name="homeFragmentGradientEndColor" format="color"/>
<attr name="mapFragmentGradientStartColor" format="color"/>
<attr name="mapFragmentGradientCenterColor" format="color"/>
<attr name="mapFragmentGradientEndColor" format="color"/>
<attr name="settingsFragmentGradientStartColor" format="color"/> <attr name="settingsFragmentGradientStartColor" format="color"/>
<attr name="settingsFragmentGradientCenterColor" format="color"/> <attr name="settingsFragmentGradientCenterColor" format="color"/>
<attr name="settingsFragmentGradientEndColor" format="color"/> <attr name="settingsFragmentGradientEndColor" format="color"/>

@ -35,10 +35,6 @@
<color name="homeFragmentGradientCenterColor" >#9EC6FF</color> <color name="homeFragmentGradientCenterColor" >#9EC6FF</color>
<color name="homeFragmentGradientEndColor" >#FEBBFF</color> <color name="homeFragmentGradientEndColor" >#FEBBFF</color>
<color name="mapFragmentGradientStartColor" >#FBBEFC</color>
<color name="mapFragmentGradientCenterColor" >#A5CBFF</color>
<color name="mapFragmentGradientEndColor" >#95DDFC</color>
<color name="settingsFragmentGradientStartColor" >#92EB97FC</color> <color name="settingsFragmentGradientStartColor" >#92EB97FC</color>
<color name="settingsFragmentGradientCenterColor" >#A198F9</color> <color name="settingsFragmentGradientCenterColor" >#A198F9</color>
<color name="settingsFragmentGradientEndColor" >#74C7F7</color> <color name="settingsFragmentGradientEndColor" >#74C7F7</color>
@ -79,10 +75,6 @@
<color name="homeFragmentGradientCenterColorDark" >#9EC6FF</color> <color name="homeFragmentGradientCenterColorDark" >#9EC6FF</color>
<color name="homeFragmentGradientEndColorDark" >#FEBBFF</color> <color name="homeFragmentGradientEndColorDark" >#FEBBFF</color>
<color name="mapFragmentGradientStartColorDark" >#FBBEFC</color>
<color name="mapFragmentGradientCenterColorDark" >#A5CBFF</color>
<color name="mapFragmentGradientEndColorDark" >#95DDFC</color>
<color name="settingsFragmentGradientStartColorDark" >#92EB97FC</color> <color name="settingsFragmentGradientStartColorDark" >#92EB97FC</color>
<color name="settingsFragmentGradientCenterColorDark" >#A198F9</color> <color name="settingsFragmentGradientCenterColorDark" >#A198F9</color>
<color name="settingsFragmentGradientEndColorDark" >#74C7F7</color> <color name="settingsFragmentGradientEndColorDark" >#74C7F7</color>

@ -5,21 +5,8 @@
<string name="home">Home</string> <string name="home">Home</string>
<string name="map">Map</string> <string name="map">Map</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
<!-- Preference Titles -->
<string name="messages_header">Messages</string>
<string name="sync_header">Sync</string>
<!-- Messages Preferences -->
<string name="signature_title">Your signature</string>
<string name="reply_title">Default reply action</string>
<!-- Sync Preferences -->
<string name="sync_title">Sync email periodically</string>
<string name="attachment_title">Download incoming attachments</string>
<string name="attachment_summary_on">Automatically download attachments for incoming emails
</string>
<string name="attachment_summary_off">Only download attachments when manually requested</string>
<string name="files">Files</string> <string name="files">Files</string>
</resources> </resources>

@ -32,10 +32,6 @@
<item name="homeFragmentGradientCenterColor" >@color/homeFragmentGradientCenterColor</item> <item name="homeFragmentGradientCenterColor" >@color/homeFragmentGradientCenterColor</item>
<item name="homeFragmentGradientEndColor" >@color/homeFragmentGradientEndColor</item> <item name="homeFragmentGradientEndColor" >@color/homeFragmentGradientEndColor</item>
<item name="mapFragmentGradientStartColor" >@color/mapFragmentGradientStartColor</item>
<item name="mapFragmentGradientCenterColor" >@color/mapFragmentGradientCenterColor</item>
<item name="mapFragmentGradientEndColor" >@color/mapFragmentGradientEndColor</item>
<item name="settingsFragmentGradientStartColor" >@color/settingsFragmentGradientStartColor</item> <item name="settingsFragmentGradientStartColor" >@color/settingsFragmentGradientStartColor</item>
<item name="settingsFragmentGradientCenterColor" >@color/settingsFragmentGradientCenterColor</item> <item name="settingsFragmentGradientCenterColor" >@color/settingsFragmentGradientCenterColor</item>
<item name="settingsFragmentGradientEndColor" >@color/settingsFragmentGradientEndColor</item> <item name="settingsFragmentGradientEndColor" >@color/settingsFragmentGradientEndColor</item>
@ -94,10 +90,6 @@
<item name="homeFragmentGradientCenterColor" >@color/homeFragmentGradientCenterColorDark</item> <item name="homeFragmentGradientCenterColor" >@color/homeFragmentGradientCenterColorDark</item>
<item name="homeFragmentGradientEndColor" >@color/homeFragmentGradientEndColorDark</item> <item name="homeFragmentGradientEndColor" >@color/homeFragmentGradientEndColorDark</item>
<item name="mapFragmentGradientStartColor" >@color/mapFragmentGradientStartColorDark</item>
<item name="mapFragmentGradientCenterColor" >@color/mapFragmentGradientCenterColorDark</item>
<item name="mapFragmentGradientEndColor" >@color/mapFragmentGradientEndColorDark</item>
<item name="settingsFragmentGradientStartColor" >@color/settingsFragmentGradientStartColorDark</item> <item name="settingsFragmentGradientStartColor" >@color/settingsFragmentGradientStartColorDark</item>
<item name="settingsFragmentGradientCenterColor" >@color/settingsFragmentGradientCenterColorDark</item> <item name="settingsFragmentGradientCenterColor" >@color/settingsFragmentGradientCenterColorDark</item>
<item name="settingsFragmentGradientEndColor" >@color/settingsFragmentGradientEndColorDark</item> <item name="settingsFragmentGradientEndColor" >@color/settingsFragmentGradientEndColorDark</item>