This commit is contained in:
parent
0c8ec7fd28
commit
4c00eaaa1b
@ -71,4 +71,7 @@ dependencies {
|
|||||||
testImplementation 'androidx.test.ext:truth:' + rootProject.extTruthVersion
|
testImplementation 'androidx.test.ext:truth:' + rootProject.extTruthVersion
|
||||||
testImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion
|
testImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion
|
||||||
testImplementation 'org.robolectric:robolectric:' + rootProject.robolectricVersion
|
testImplementation 'org.robolectric:robolectric:' + rootProject.robolectricVersion
|
||||||
|
|
||||||
|
implementation 'com.facebook.android:facebook-login:[5,6)'
|
||||||
|
implementation 'com.facebook.android:facebook-share:[5,6)'
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="pl.edu.amu.wmi.socialaggregator">
|
package="pl.edu.amu.wmi.socialaggregator">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
@ -43,6 +45,32 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<meta-data android:name="com.facebook.sdk.ApplicationId"
|
||||||
|
android:value="@string/facebook_app_id"/>
|
||||||
|
|
||||||
|
<activity android:name="com.facebook.FacebookActivity"
|
||||||
|
android:configChanges=
|
||||||
|
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
|
||||||
|
android:label="@string/app_name" />
|
||||||
|
<activity
|
||||||
|
android:name="com.facebook.CustomTabActivity"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="@string/fb_login_protocol_scheme" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
<provider android:authorities="com.facebook.app.FacebookContentProvider2437098899888167"
|
||||||
|
android:name="com.facebook.FacebookContentProvider"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -8,7 +8,7 @@ import kotlinx.android.synthetic.main.activity_add_social.*
|
|||||||
import kotlinx.android.synthetic.main.content_add_social.*
|
import kotlinx.android.synthetic.main.content_add_social.*
|
||||||
import pl.edu.amu.wmi.socialaggregator.R
|
import pl.edu.amu.wmi.socialaggregator.R
|
||||||
import pl.edu.amu.wmi.socialaggregator.utils.SocialPlatformsManager
|
import pl.edu.amu.wmi.socialaggregator.utils.SocialPlatformsManager
|
||||||
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithImageRecycler
|
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithButtonRecycler
|
||||||
|
|
||||||
class AddSocialActivity : AppCompatActivity() {
|
class AddSocialActivity : AppCompatActivity() {
|
||||||
|
|
||||||
@ -23,33 +23,33 @@ class AddSocialActivity : AppCompatActivity() {
|
|||||||
val loggedInSocials = SocialPlatformsManager.getLoggedIn(this)
|
val loggedInSocials = SocialPlatformsManager.getLoggedIn(this)
|
||||||
val recyclers = mutableListOf(availableSocialsRecyclerView, addSocialRecyclerView)
|
val recyclers = mutableListOf(availableSocialsRecyclerView, addSocialRecyclerView)
|
||||||
|
|
||||||
availableSocialsRecyclerView.apply {
|
// availableSocialsRecyclerView.apply {
|
||||||
layoutManager = LinearLayoutManager(this@AddSocialActivity)
|
// layoutManager = LinearLayoutManager(this@AddSocialActivity)
|
||||||
adapter = SocialWithImageRecycler(
|
// adapter = SocialWithButtonRecycler(
|
||||||
loggedInSocials,
|
// loggedInSocials,
|
||||||
R.mipmap.ic_opaque_remove
|
// R.mipmap.ic_opaque_remove
|
||||||
) {
|
// ) {
|
||||||
it.logout(context)
|
// it.logout(context)
|
||||||
loggedInSocials.remove(it)
|
// loggedInSocials.remove(it)
|
||||||
notLoggedInSocials.add(it)
|
// notLoggedInSocials.add(it)
|
||||||
recyclers.forEach { it.adapter?.notifyDataSetChanged() }
|
// recyclers.forEach { it.adapter?.notifyDataSetChanged() }
|
||||||
Toast.makeText(context, "Logged out from ${it.getName()}!", Toast.LENGTH_SHORT).show()
|
// Toast.makeText(context, "Logged out from ${it.getName()}!", Toast.LENGTH_SHORT).show()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
addSocialRecyclerView.apply {
|
// addSocialRecyclerView.apply {
|
||||||
layoutManager = LinearLayoutManager(this@AddSocialActivity)
|
// layoutManager = LinearLayoutManager(this@AddSocialActivity)
|
||||||
adapter = SocialWithImageRecycler(
|
// adapter = SocialWithButtonRecycler(
|
||||||
notLoggedInSocials,
|
// notLoggedInSocials,
|
||||||
R.mipmap.ic_opaque_add
|
// R.mipmap.ic_opaque_add
|
||||||
) {
|
// ) {
|
||||||
it.login(context)
|
// it.login(context)
|
||||||
notLoggedInSocials.remove(it)
|
// notLoggedInSocials.remove(it)
|
||||||
loggedInSocials.add(it)
|
// loggedInSocials.add(it)
|
||||||
recyclers.forEach { it.adapter?.notifyDataSetChanged() }
|
// recyclers.forEach { it.adapter?.notifyDataSetChanged() }
|
||||||
Toast.makeText(context, "Logged in to ${it.getName()}!", Toast.LENGTH_SHORT).show()
|
// Toast.makeText(context, "Logged in to ${it.getName()}!", Toast.LENGTH_SHORT).show()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,20 +2,31 @@ package pl.edu.amu.wmi.socialaggregator.activity
|
|||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.facebook.CallbackManager
|
||||||
|
import com.facebook.FacebookCallback
|
||||||
|
import com.facebook.FacebookException
|
||||||
|
import com.facebook.login.LoginResult
|
||||||
import com.jakewharton.rxbinding2.view.RxView
|
import com.jakewharton.rxbinding2.view.RxView
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
import kotlinx.android.synthetic.main.activity_main.*
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
import pl.edu.amu.wmi.socialaggregator.R
|
import pl.edu.amu.wmi.socialaggregator.R
|
||||||
import pl.edu.amu.wmi.socialaggregator.utils.SocialPlatformsManager
|
import pl.edu.amu.wmi.socialaggregator.utils.SocialPlatformsManager
|
||||||
import pl.edu.amu.wmi.socialaggregator.viewholders.PostSummaryRecycler
|
import pl.edu.amu.wmi.socialaggregator.viewholders.PostSummaryRecycler
|
||||||
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithImageRecycler
|
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithButtonRecycler
|
||||||
|
import com.facebook.AccessToken
|
||||||
|
import com.facebook.login.LoginManager
|
||||||
|
import com.facebook.share.widget.ShareDialog
|
||||||
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private val subs = CompositeDisposable()
|
private val subs = CompositeDisposable()
|
||||||
|
|
||||||
|
private val TAG = MainActivity::class.java.simpleName
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(R.layout.activity_main)
|
setContentView(R.layout.activity_main)
|
||||||
@ -26,18 +37,42 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val intent = Intent(this, NewPostActivity::class.java)
|
val intent = Intent(this, NewPostActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
},
|
},
|
||||||
RxView.clicks(connectedSocialsButton)
|
// RxView.clicks(connectedSocialsButton)
|
||||||
.subscribe {
|
// .subscribe {
|
||||||
val intent = Intent(this, AddSocialActivity::class.java)
|
// val accessToken = AccessToken.getCurrentAccessToken()
|
||||||
startActivity(intent)
|
// val isLoggedIn = accessToken != null && !accessToken.isExpired
|
||||||
},
|
//
|
||||||
|
// Log.i(TAG, isLoggedIn.toString())
|
||||||
|
//
|
||||||
|
// LoginManager.getInstance().logInWithReadPermissions(this, listOf("public_profile"))
|
||||||
|
//
|
||||||
|
//// val request = GraphRequest.newMeRequest(
|
||||||
|
//// accessToken
|
||||||
|
//// ) { `object`, response ->
|
||||||
|
//// Log.v("LoginActivity", response.toString())
|
||||||
|
////
|
||||||
|
//// // Application code
|
||||||
|
//// }
|
||||||
|
//// val parameters = Bundle()
|
||||||
|
//// parameters.putString("fields", "id,name,email,gender,birthday")
|
||||||
|
//// request.parameters = parameters
|
||||||
|
//// request.executeAsync()
|
||||||
|
// ShareDialog(this).show()
|
||||||
|
//// val intent = Intent(this, AddSocialActivity::class.java)
|
||||||
|
//// startActivity(intent)
|
||||||
|
// },
|
||||||
RxView.clicks(previousPostsButton)
|
RxView.clicks(previousPostsButton)
|
||||||
.subscribe {
|
.subscribe {
|
||||||
val intent = Intent(this, PostHistoryActivity::class.java)
|
val intent = Intent(this, PostHistoryActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
SocialPlatformsManager.getAll()
|
||||||
|
.forEach { it.onActivityResult(requestCode, resultCode, data)}
|
||||||
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
@ -45,7 +80,8 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
connectedSocialsRecyclerView.apply {
|
connectedSocialsRecyclerView.apply {
|
||||||
layoutManager = LinearLayoutManager(this@MainActivity)
|
layoutManager = LinearLayoutManager(this@MainActivity)
|
||||||
adapter = SocialWithImageRecycler(SocialPlatformsManager.getLoggedIn(this@MainActivity)) {}
|
adapter =
|
||||||
|
SocialWithButtonRecycler(SocialPlatformsManager.getAll(), this@MainActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
previousPostsRecyclerView.apply {
|
previousPostsRecyclerView.apply {
|
||||||
|
@ -1,20 +1,31 @@
|
|||||||
package pl.edu.amu.wmi.socialaggregator.activity
|
package pl.edu.amu.wmi.socialaggregator.activity
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.provider.MediaStore
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.jakewharton.rxbinding2.view.RxView
|
import com.jakewharton.rxbinding2.view.RxView
|
||||||
|
import io.reactivex.Observable
|
||||||
import kotlinx.android.synthetic.main.activity_new_post.*
|
import kotlinx.android.synthetic.main.activity_new_post.*
|
||||||
import kotlinx.android.synthetic.main.content_new_post.*
|
import kotlinx.android.synthetic.main.content_new_post.*
|
||||||
import pl.edu.amu.wmi.socialaggregator.R
|
import pl.edu.amu.wmi.socialaggregator.R
|
||||||
import pl.edu.amu.wmi.socialaggregator.utils.SocialPlatformsManager
|
import pl.edu.amu.wmi.socialaggregator.utils.SocialPlatformsManager
|
||||||
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithToggleRecycler
|
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithToggleRecycler
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class NewPostActivity : AppCompatActivity() {
|
class NewPostActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
var file: String? = null
|
||||||
|
|
||||||
@SuppressLint("CheckResult")
|
@SuppressLint("CheckResult")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -35,17 +46,79 @@ class NewPostActivity : AppCompatActivity() {
|
|||||||
adapter = availablesRecycler
|
adapter = availablesRecycler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Observable.fromIterable(availablesRecycler.chips.entries)
|
||||||
|
.filter { file != null }
|
||||||
|
.filter { (_, chip) -> chip.isChecked }
|
||||||
|
.flatMap { (social, _) ->
|
||||||
|
val bitmap = BitmapFactory.decodeFile(file!!)
|
||||||
|
// Toast.makeText(this, "Posted to ${social.getName()}!", Toast.LENGTH_LONG)
|
||||||
|
// .show()
|
||||||
|
social.addPost(this, postText.text?.toString() ?: "test", listOf(bitmap))
|
||||||
|
}
|
||||||
|
.take(availablesRecycler.chips.entries.count { (_, chip) -> chip.isChecked }.toLong())
|
||||||
|
.subscribe {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
RxView.clicks(publishPost)
|
RxView.clicks(publishPost)
|
||||||
.subscribe {
|
.subscribe {
|
||||||
availablesRecycler.chips.entries.forEach { (social, chip) ->
|
availablesRecycler.chips.entries
|
||||||
if (chip.isChecked) {
|
.filter { file != null }
|
||||||
social.addPost(this, postText.text?.toString() ?: "test", emptyList())
|
.filter { (_, chip) -> chip.isChecked }
|
||||||
|
.forEach { (social, _) ->
|
||||||
|
val bitmap = BitmapFactory.decodeFile(file!!)
|
||||||
|
social.addPost(this, postText.text?.toString() ?: "test", listOf(bitmap))
|
||||||
Toast.makeText(this, "Posted to ${social.getName()}!", Toast.LENGTH_LONG)
|
Toast.makeText(this, "Posted to ${social.getName()}!", Toast.LENGTH_LONG)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
RxView.clicks(imageView2)
|
||||||
|
.subscribe {
|
||||||
|
val getIntent = Intent(Intent.ACTION_GET_CONTENT)
|
||||||
|
getIntent.type = "image/*"
|
||||||
|
|
||||||
|
val pickIntent = Intent(
|
||||||
|
Intent.ACTION_PICK,
|
||||||
|
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
||||||
|
)
|
||||||
|
pickIntent.type = "image/*"
|
||||||
|
|
||||||
|
val chooserIntent = Intent.createChooser(getIntent, "Select Image")
|
||||||
|
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(pickIntent))
|
||||||
|
|
||||||
|
startActivityForResult(chooserIntent, PICK_IMAGE_REQUEST_CODE)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (canAccessGallery()) {
|
||||||
|
ActivityCompat.requestPermissions(
|
||||||
|
this,
|
||||||
|
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
|
|
||||||
|
if (requestCode == PICK_IMAGE_REQUEST_CODE) {
|
||||||
|
data?.data?.let { uri ->
|
||||||
|
uri.pathSegments?.last()?.let {
|
||||||
|
file = it
|
||||||
|
}
|
||||||
|
imageView2.setImageURI(uri)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun canAccessGallery() =
|
||||||
|
(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||||
|
!= PackageManager.PERMISSION_GRANTED)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val PICK_IMAGE_REQUEST_CODE = 69
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,145 @@
|
|||||||
|
package pl.edu.amu.wmi.socialaggregator.socialplatforms
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.constraintlayout.widget.ConstraintSet
|
||||||
|
import com.facebook.CallbackManager
|
||||||
|
import com.facebook.FacebookCallback
|
||||||
|
import com.facebook.FacebookException
|
||||||
|
import com.facebook.login.LoginResult
|
||||||
|
import com.facebook.login.widget.LoginButton
|
||||||
|
import pl.edu.amu.wmi.socialaggregator.utils.Utils
|
||||||
|
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithButtonRecycler
|
||||||
|
import com.facebook.AccessToken
|
||||||
|
import com.facebook.login.LoginManager
|
||||||
|
import com.facebook.share.Sharer
|
||||||
|
import com.facebook.share.model.ShareMediaContent
|
||||||
|
import com.facebook.share.model.SharePhoto
|
||||||
|
import com.facebook.share.widget.ShareDialog
|
||||||
|
import io.reactivex.Single
|
||||||
|
import io.reactivex.subjects.PublishSubject
|
||||||
|
import pl.edu.amu.wmi.socialaggregator.R
|
||||||
|
import java.lang.Exception
|
||||||
|
|
||||||
|
|
||||||
|
class Facebook : SocialPlatform {
|
||||||
|
|
||||||
|
private var callbackManager: CallbackManager = CallbackManager.Factory.create()
|
||||||
|
|
||||||
|
override fun getName(): String = "Facebook"
|
||||||
|
|
||||||
|
override fun getLogo(): Int = R.mipmap.ic_logo_facebook
|
||||||
|
|
||||||
|
override fun login(context: Context) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun logout(context: Context) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isLoggedIn(context: Context): Boolean {
|
||||||
|
val accessToken = AccessToken.getCurrentAccessToken()
|
||||||
|
return accessToken != null && !accessToken.isExpired
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addPost(context: Context, text: String, images: List<Bitmap>) : PublishSubject<Any> {
|
||||||
|
val content = ShareMediaContent.Builder().apply {
|
||||||
|
images.forEach {addMedium(
|
||||||
|
SharePhoto.Builder().setBitmap(it).build()
|
||||||
|
)}
|
||||||
|
}.build()
|
||||||
|
|
||||||
|
val publishSubject = PublishSubject.create<Any>()
|
||||||
|
|
||||||
|
val shareDialog = ShareDialog(context as Activity)
|
||||||
|
shareDialog.registerCallback(callbackManager, object : FacebookCallback<Sharer.Result?> {
|
||||||
|
override fun onSuccess(result: Sharer.Result?) {
|
||||||
|
publishSubject.onNext(Any())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCancel() {
|
||||||
|
publishSubject.onError(Exception("Cancelled"))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onError(error: FacebookException?) {
|
||||||
|
publishSubject.onError(Exception(error?.localizedMessage))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
shareDialog.show(content, ShareDialog.Mode.AUTOMATIC)
|
||||||
|
|
||||||
|
return publishSubject
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getPosts(context: Context): List<Post> {
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun handleButtonView(context: Context): (SocialWithButtonRecycler.ViewHolder) -> Unit =
|
||||||
|
{ viewHolder ->
|
||||||
|
viewHolder.textView.text = this.getName()
|
||||||
|
|
||||||
|
val constraintSet = ConstraintSet()
|
||||||
|
val button = LoginButton(context)
|
||||||
|
button.id = View.generateViewId()
|
||||||
|
|
||||||
|
val parent = viewHolder.image.parent as ViewGroup
|
||||||
|
parent.removeView(viewHolder.image)
|
||||||
|
parent.addView(button)
|
||||||
|
|
||||||
|
constraintSet.clone(parent as ConstraintLayout)
|
||||||
|
constraintSet.connect(button.id, ConstraintSet.TOP,
|
||||||
|
parent.id, ConstraintSet.TOP, 8.toPx(context))
|
||||||
|
constraintSet.connect(button.id, ConstraintSet.END,
|
||||||
|
parent.id, ConstraintSet.END)
|
||||||
|
constraintSet.connect(button.id, ConstraintSet.BOTTOM,
|
||||||
|
parent.id, ConstraintSet.BOTTOM, 8.toPx(context))
|
||||||
|
|
||||||
|
constraintSet.connect(viewHolder.textView.id, ConstraintSet.BOTTOM,
|
||||||
|
button.id, ConstraintSet.BOTTOM)
|
||||||
|
constraintSet.connect(viewHolder.textView.id, ConstraintSet.END,
|
||||||
|
button.id, ConstraintSet.START, 8.toPx(context))
|
||||||
|
constraintSet.connect(viewHolder.textView.id, ConstraintSet.START,
|
||||||
|
parent.id, ConstraintSet.START)
|
||||||
|
constraintSet.connect(viewHolder.textView.id, ConstraintSet.TOP,
|
||||||
|
button.id, ConstraintSet.TOP)
|
||||||
|
constraintSet.setHorizontalBias(viewHolder.textView.id, 0.toFloat())
|
||||||
|
constraintSet.applyTo(parent)
|
||||||
|
|
||||||
|
button.setPermissions(listOf("email"))
|
||||||
|
val callback = object : FacebookCallback<LoginResult> {
|
||||||
|
override fun onSuccess(result: LoginResult?) {
|
||||||
|
Log.i(getName(), "SUCCESS!")
|
||||||
|
LoginManager.getInstance().logInWithReadPermissions(context as Activity,
|
||||||
|
listOf("email"))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCancel() {
|
||||||
|
Log.i(getName(), "CANCEL!")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onError(error: FacebookException?) {
|
||||||
|
Log.i(getName(), "FAIL!")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
button.registerCallback(callbackManager, callback)
|
||||||
|
LoginManager.getInstance().registerCallback(callbackManager, callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
callbackManager.onActivityResult(requestCode, resultCode, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Int.toPx(context: Context): Int {
|
||||||
|
return Utils.convertDpToPixel(this.toFloat(), context).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,13 +10,13 @@ import java.io.File
|
|||||||
import java.text.DateFormat
|
import java.text.DateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class FacebookMock : SocialPlatform {
|
abstract class FacebookMock : SocialPlatform {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val TAG = FacebookMock::class.java.canonicalName
|
val TAG = FacebookMock::class.java.canonicalName
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String = "Facebook"
|
override fun getName(): String = "Facebook Mock"
|
||||||
|
|
||||||
override fun getLogo(): Int = R.mipmap.ic_logo_facebook
|
override fun getLogo(): Int = R.mipmap.ic_logo_facebook
|
||||||
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package pl.edu.amu.wmi.socialaggregator.socialplatforms
|
package pl.edu.amu.wmi.socialaggregator.socialplatforms
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
|
import io.reactivex.subjects.PublishSubject
|
||||||
|
import pl.edu.amu.wmi.socialaggregator.viewholders.SocialWithButtonRecycler
|
||||||
|
|
||||||
interface SocialPlatform {
|
interface SocialPlatform {
|
||||||
|
|
||||||
@ -9,7 +12,9 @@ interface SocialPlatform {
|
|||||||
fun login(context: Context)
|
fun login(context: Context)
|
||||||
fun logout(context: Context)
|
fun logout(context: Context)
|
||||||
fun isLoggedIn(context: Context): Boolean
|
fun isLoggedIn(context: Context): Boolean
|
||||||
fun addPost(context: Context, text: String, images: List<Bitmap>)
|
fun addPost(context: Context, text: String, images: List<Bitmap>): PublishSubject<Any>
|
||||||
fun getPosts(context: Context): List<Post>
|
fun getPosts(context: Context): List<Post>
|
||||||
fun getLogo(): Int
|
fun getLogo(): Int
|
||||||
|
fun handleButtonView(context: Context): (SocialWithButtonRecycler.ViewHolder) -> Unit = {}
|
||||||
|
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {}
|
||||||
}
|
}
|
@ -1,14 +1,18 @@
|
|||||||
package pl.edu.amu.wmi.socialaggregator.utils
|
package pl.edu.amu.wmi.socialaggregator.utils
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import pl.edu.amu.wmi.socialaggregator.socialplatforms.Facebook
|
||||||
import pl.edu.amu.wmi.socialaggregator.socialplatforms.FacebookMock
|
import pl.edu.amu.wmi.socialaggregator.socialplatforms.FacebookMock
|
||||||
import pl.edu.amu.wmi.socialaggregator.socialplatforms.SocialPlatform
|
import pl.edu.amu.wmi.socialaggregator.socialplatforms.SocialPlatform
|
||||||
|
|
||||||
object SocialPlatformsManager {
|
object SocialPlatformsManager {
|
||||||
private val IMPLEMENTED_PLATFORMS = listOf<SocialPlatform>(
|
private val IMPLEMENTED_PLATFORMS = listOf<SocialPlatform>(
|
||||||
FacebookMock()
|
// FacebookMock()
|
||||||
|
Facebook()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun getAll() = IMPLEMENTED_PLATFORMS
|
||||||
|
|
||||||
fun getLoggedIn(context: Context) =
|
fun getLoggedIn(context: Context) =
|
||||||
IMPLEMENTED_PLATFORMS.filter { it.isLoggedIn(context) }.toMutableList()
|
IMPLEMENTED_PLATFORMS.filter { it.isLoggedIn(context) }.toMutableList()
|
||||||
|
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
package pl.edu.amu.wmi.socialaggregator.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.DisplayMetrics
|
||||||
|
|
||||||
|
|
||||||
|
object Utils {
|
||||||
|
|
||||||
|
fun convertDpToPixel(dp: Float, context: Context): Float {
|
||||||
|
return dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package pl.edu.amu.wmi.socialaggregator.viewholders
|
package pl.edu.amu.wmi.socialaggregator.viewholders
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
@ -11,11 +12,10 @@ import io.reactivex.disposables.Disposable
|
|||||||
import pl.edu.amu.wmi.socialaggregator.R
|
import pl.edu.amu.wmi.socialaggregator.R
|
||||||
import pl.edu.amu.wmi.socialaggregator.socialplatforms.SocialPlatform
|
import pl.edu.amu.wmi.socialaggregator.socialplatforms.SocialPlatform
|
||||||
|
|
||||||
class SocialWithImageRecycler(
|
class SocialWithButtonRecycler(
|
||||||
val availableSocials: List<SocialPlatform>,
|
val availableSocials: List<SocialPlatform>,
|
||||||
private val imageResource: Int? = null,
|
val context: Context
|
||||||
private val action: (SocialPlatform) -> Unit
|
) : RecyclerView.Adapter<SocialWithButtonRecycler.ViewHolder>() {
|
||||||
) : RecyclerView.Adapter<SocialWithImageRecycler.ViewHolder>() {
|
|
||||||
|
|
||||||
private val disposables = HashMap<SocialPlatform, Disposable>()
|
private val disposables = HashMap<SocialPlatform, Disposable>()
|
||||||
|
|
||||||
@ -34,18 +34,18 @@ class SocialWithImageRecycler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
val social = availableSocials[position]
|
availableSocials[position].handleButtonView(context)(holder)
|
||||||
holder.text.text = social.getName()
|
// holder.textView.text = social.getName()
|
||||||
holder.image.setImageResource(imageResource ?: social.getLogo())
|
// holder.image.setImageResource(imageResource ?: social.getLogo())
|
||||||
|
//
|
||||||
disposables[social] = RxView.clicks(holder.image)
|
// disposables[social] = RxView.clicks(holder.image)
|
||||||
.map { social }
|
// .map { social }
|
||||||
.subscribe(action)
|
// .subscribe(action)
|
||||||
}
|
}
|
||||||
|
|
||||||
class ViewHolder(
|
class ViewHolder(
|
||||||
root: ConstraintLayout,
|
root: ConstraintLayout,
|
||||||
val text: TextView,
|
val textView: TextView,
|
||||||
val image: ImageView
|
val image: ImageView
|
||||||
) : RecyclerView.ViewHolder(root)
|
) : RecyclerView.ViewHolder(root)
|
||||||
|
|
@ -22,14 +22,14 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:text="Connected Socials"
|
android:text="Available Socials"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
app:layout_constraintTop_toBottomOf="@+id/imageView" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/connectedSocialsRecyclerView"
|
android:id="@+id/connectedSocialsRecyclerView"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="100dp"
|
android:layout_height="200dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
@ -41,17 +41,6 @@
|
|||||||
|
|
||||||
</androidx.recyclerview.widget.RecyclerView>
|
</androidx.recyclerview.widget.RecyclerView>
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/connectedSocialsButton"
|
|
||||||
style="@style/Widget.AppCompat.Button.Colored"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:text="Connect new"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/connectedSocialsRecyclerView" />
|
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/divider"
|
android:id="@+id/divider"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
@ -63,7 +52,7 @@
|
|||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="1.0"
|
app:layout_constraintHorizontal_bias="1.0"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/connectedSocialsButton" />
|
app:layout_constraintTop_toBottomOf="@+id/connectedSocialsRecyclerView" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/textView2"
|
android:id="@+id/textView2"
|
||||||
@ -134,6 +123,7 @@
|
|||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/previousPostsButton"
|
app:layout_constraintTop_toBottomOf="@+id/previousPostsButton"
|
||||||
|
app:layout_constraintVertical_bias="1.0"
|
||||||
app:srcCompat="@mipmap/ic_opaque_add" />
|
app:srcCompat="@mipmap/ic_opaque_add" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -27,5 +27,5 @@
|
|||||||
app:layout_constraintDimensionRatio="1:1"
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:srcCompat="@mipmap/ic_launcher_round" />
|
tools:srcCompat="@mipmap/ic_logo_facebook" />
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -3,4 +3,7 @@
|
|||||||
<string name="title_activity_new_post">NewPostActivity</string>
|
<string name="title_activity_new_post">NewPostActivity</string>
|
||||||
<string name="title_activity_add_social">AddSocialActivity</string>
|
<string name="title_activity_add_social">AddSocialActivity</string>
|
||||||
<string name="title_activity_post_history">PostHistoryActivity</string>
|
<string name="title_activity_post_history">PostHistoryActivity</string>
|
||||||
|
|
||||||
|
<string name="facebook_app_id">2437098899888167</string>
|
||||||
|
<string name="fb_login_protocol_scheme">fb2437098899888167</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user