diff options
5 files changed, 77 insertions, 42 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt index ecc27946..3cee4852 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt @@ -15,6 +15,7 @@ import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.pitchedapps.frost.dbflow.CookieModel +import com.pitchedapps.frost.dbflow.fetchUsername import com.pitchedapps.frost.dbflow.loadFbCookiesAsync import com.pitchedapps.frost.dbflow.saveFbCookie import com.pitchedapps.frost.facebook.FACEBOOK_COM @@ -120,20 +121,8 @@ class LoginActivity : BaseActivity() { } fun loadUsername(cookie: CookieModel) { - thread { - var name = "" - try { - name = Jsoup.connect(FbTab.PROFILE.url) - .cookie(FACEBOOK_COM, cookie.cookie) - .get().title() - L.d("User name found: $name") - } catch (e: Exception) { - L.e("User name fetching failed: ${e.message}") - } finally { - cookie.name = name - saveFbCookie(cookie) - usernameObservable.onSuccess(name) - } + cookie.fetchUsername { + usernameObservable.onSuccess(it) } } }
\ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt index f7648243..ca50d4e2 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt @@ -82,9 +82,9 @@ class MainActivity : BaseActivity() { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { super.onPageScrolled(position, positionOffset, positionOffsetPixels) val delta: Float by lazy { positionOffset * (255 - 128).toFloat() } - (0 until tabs.tabCount).asSequence().forEach { - i -> - (tabs.getTabAt(i)!!.customView as BadgedIcon).setAllAlpha(when (i) { + tabsForEachView { + position, view -> + view.setAllAlpha(when (position) { position -> 255.0f - delta position + 1 -> 128.0f + delta else -> 128f @@ -102,6 +102,13 @@ class MainActivity : BaseActivity() { setFrostColors(toolbar, headers = arrayOf(tabs, appBar), backgrounds = arrayOf(viewPager)) } + fun tabsForEachView(action: (position: Int, view: BadgedIcon) -> Unit) { + (0 until tabs.tabCount).asSequence().forEach { + i -> + action(i, tabs.getTabAt(i)!!.customView as BadgedIcon) + } + } + fun setupTabs() { viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabs)) tabs.addOnTabSelectedListener(object : TabLayout.ViewPagerOnTabSelectedListener(viewPager) { @@ -128,13 +135,13 @@ class MainActivity : BaseActivity() { .observeOn(AndroidSchedulers.mainThread()) .subscribe { (feed, requests, messages, notifications) -> - (0 until tabs.tabCount).asSequence().forEach { - val tabBadge = tabs.getTabAt(it)!!.customView as BadgedIcon - when (tabBadge.iicon) { - FbTab.FEED.icon -> tabBadge.badgeText = feed - FbTab.FRIENDS.icon -> tabBadge.badgeText = requests - FbTab.MESSAGES.icon -> tabBadge.badgeText = messages - FbTab.NOTIFICATIONS.icon -> tabBadge.badgeText = notifications + tabsForEachView { + _, view -> + when (view.iicon) { + FbTab.FEED.icon -> view.badgeText = feed + FbTab.FRIENDS.icon -> view.badgeText = requests + FbTab.MESSAGES.icon -> view.badgeText = messages + FbTab.NOTIFICATIONS.icon -> view.badgeText = notifications } } } @@ -184,7 +191,10 @@ class MainActivity : BaseActivity() { else when (profile.identifier) { -2L -> launchNewTask(LoginActivity::class.java, clearStack = false) -3L -> launchNewTask(SelectorActivity::class.java, cookies(), false) - else -> switchUser(profile.identifier, { refreshAll() }) + else -> { + switchUser(profile.identifier, { refreshAll() }) + tabsForEachView { _, view -> view.badgeText = null } + } } false } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/dbflow/CookiesDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/dbflow/CookiesDb.kt index 1d1aa86e..59ef6cd7 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/dbflow/CookiesDb.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/dbflow/CookiesDb.kt @@ -2,6 +2,8 @@ package com.pitchedapps.frost.dbflow import android.os.Parcel import android.os.Parcelable +import com.pitchedapps.frost.facebook.FACEBOOK_COM +import com.pitchedapps.frost.facebook.FbTab import com.pitchedapps.frost.utils.L import com.raizlabs.android.dbflow.annotation.ConflictAction import com.raizlabs.android.dbflow.annotation.Database @@ -9,6 +11,8 @@ import com.raizlabs.android.dbflow.annotation.PrimaryKey import com.raizlabs.android.dbflow.annotation.Table import com.raizlabs.android.dbflow.kotlinextensions.* import com.raizlabs.android.dbflow.structure.BaseModel +import org.jetbrains.anko.doAsync +import org.jsoup.Jsoup import paperparcel.PaperParcel /** @@ -56,4 +60,28 @@ fun removeCookie(id: Long) { loadFbCookie(id)?.async?.delete({ L.d("Fb cookie $id deleted") }) +} + +fun CookieModel.fetchUsername(callback: (String) -> Unit) { + doAsync { + var result = "" + try { + result = Jsoup.connect(FbTab.PROFILE.url) + .cookie(FACEBOOK_COM, cookie) + .get().title() + L.d("User name found: $result") + } catch (e: Exception) { + L.e("User name fetching failed: ${e.message}") + } finally { + if (result.isBlank() && (name?.isNotBlank() ?: false)) { + callback(name!!) + return@doAsync + } + if (name != result) { + name = result + saveFbCookie(this@fetchUsername) + } + callback(result) + } + } }
\ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt b/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt index d357ff68..813bdce2 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt @@ -7,7 +7,6 @@ import android.app.job.JobService import android.content.Context import android.content.Intent import android.net.Uri -import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationManagerCompat import ca.allanwang.kau.utils.string import com.pitchedapps.frost.BuildConfig @@ -42,8 +41,7 @@ class NotificationService : JobService() { debugNotification("Load notifs") loadFbCookiesSync().forEach { data -> - L.i("Handling notifications for ${data.id}") - L.v("Using data $data") + L.i("Handle notifications for $data") val doc = Jsoup.connect(FbTab.NOTIFICATIONS.url).cookie(FACEBOOK_COM, data.cookie).get() val unreadNotifications = doc.getElementById("notifications_list").getElementsByClass("aclb") var notifCount = 0 @@ -64,6 +62,7 @@ class NotificationService : JobService() { } L.d("Finished notifications") jobFinished(params, false) + future = null } return true } @@ -100,22 +99,30 @@ class NotificationService : JobService() { } data class NotificationContent(val data: CookieModel, val notifId: Int, val href: String, val text: String, val timestamp: Long) { - fun createNotification(context: Context) { - val intent = Intent(context, FrostWebActivity::class.java) - intent.data = Uri.parse("$FB_URL_BASE$href") - val group = "frost_${data.id}" - val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) - val notifBuilder = context.frostNotification - .setContentTitle(context.string(R.string.app_name)) - .setContentText(text) - .setContentIntent(pendingIntent) - .setCategory(Notification.CATEGORY_SOCIAL) - .setSubText(data.name) - .setGroup(group) + fun createNotification(context: Context, verifiedUser: Boolean = false) { + //in case we haven't found the name, we will try one more time before passing the notification + if (!verifiedUser && data.name?.isBlank() ?: true) { + data.fetchUsername { + data.name = it + createNotification(context, true) + } + } else { + val intent = Intent(context, FrostWebActivity::class.java) + intent.data = Uri.parse("$FB_URL_BASE$href") + val group = "frost_${data.id}" + val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) + val notifBuilder = context.frostNotification + .setContentTitle(context.string(R.string.app_name)) + .setContentText(text) + .setContentIntent(pendingIntent) + .setCategory(Notification.CATEGORY_SOCIAL) + .setSubText(data.name) + .setGroup(group) - if (timestamp != -1L) notifBuilder.setWhen(timestamp * 1000) + if (timestamp != -1L) notifBuilder.setWhen(timestamp * 1000) - NotificationManagerCompat.from(context).notify(group, notifId, notifBuilder.build()) + NotificationManagerCompat.from(context).notify(group, notifId, notifBuilder.build()) + } } } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt index cc96758b..8ae54ef3 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/views/BadgedIcon.kt @@ -47,6 +47,7 @@ class BadgedIcon @JvmOverloads constructor( var badgeText: String? get() = badgeTextView.text.toString() set(value) { + if (badgeTextView.text == value) return badgeTextView.text = value if (value != null && value != "0") badgeTextView.visible() else badgeTextView.gone() |