1
0
mirror of https://github.com/AllanWang/Frost-for-Facebook.git synced 2024-11-10 04:52:38 +01:00

Apply spotless and update changelog

This commit is contained in:
Allan Wang 2019-05-01 17:07:18 -07:00
commit e0bea89b08
No known key found for this signature in database
GPG Key ID: C93E3F9C679D7A56
14 changed files with 144 additions and 60 deletions

View File

@ -45,7 +45,9 @@ import com.raizlabs.android.dbflow.config.DatabaseConfig
import com.raizlabs.android.dbflow.config.FlowConfig import com.raizlabs.android.dbflow.config.FlowConfig
import com.raizlabs.android.dbflow.config.FlowManager import com.raizlabs.android.dbflow.config.FlowManager
import com.raizlabs.android.dbflow.runtime.ContentResolverNotifier import com.raizlabs.android.dbflow.runtime.ContentResolverNotifier
import org.koin.android.ext.android.startKoin import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import java.util.Random import java.util.Random
import kotlin.reflect.KClass import kotlin.reflect.KClass
@ -134,7 +136,12 @@ class FrostApp : Application() {
L.d { "Activity ${activity.localClassName} created" } L.d { "Activity ${activity.localClassName} created" }
} }
}) })
startKoin(this, listOf(FrostDatabase.module(this))) startKoin {
if (BuildConfig.DEBUG)
androidLogger()
androidContext(this@FrostApp)
modules(FrostDatabase.module(this@FrostApp))
}
} }
private fun initBugsnag() { private fun initBugsnag() {

View File

@ -21,8 +21,8 @@ import androidx.room.Database
import androidx.room.Room import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import com.pitchedapps.frost.BuildConfig import com.pitchedapps.frost.BuildConfig
import org.koin.dsl.module.module import org.koin.core.context.GlobalContext
import org.koin.standalone.StandAloneContext import org.koin.dsl.module
interface FrostPrivateDao { interface FrostPrivateDao {
fun cookieDao(): CookieDao fun cookieDao(): CookieDao
@ -101,6 +101,6 @@ class FrostDatabase(private val privateDb: FrostPrivateDatabase, private val pub
* Get from koin * Get from koin
* For the most part, you can retrieve directly from other koin components * For the most part, you can retrieve directly from other koin components
*/ */
fun get(): FrostDatabase = StandAloneContext.getKoin().koinContext.get() fun get(): FrostDatabase = GlobalContext.get().koin.get()
} }
} }

View File

@ -76,7 +76,7 @@ const val FALLBACK_TIME_MOD = 1000000
data class FrostLink(val text: String, val href: String) data class FrostLink(val text: String, val href: String)
data class ParseResponse<out T: ParseData>(val cookie: String, val data: T) { data class ParseResponse<out T : ParseData>(val cookie: String, val data: T) {
override fun toString() = "ParseResponse\ncookie: $cookie\ndata:\n$data" override fun toString() = "ParseResponse\ncookie: $cookie\ndata:\n$data"
} }

View File

@ -1,3 +1,19 @@
/*
* Copyright 2019 Allan Wang
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.pitchedapps.frost.utils package com.pitchedapps.frost.utils
import android.content.Context import android.content.Context
@ -91,4 +107,4 @@ object BiometricUtils {
pool?.shutdown() pool?.shutdown()
pool = null pool = null
} }
} }

View File

@ -186,7 +186,8 @@ fun MaterialDialog.Builder.theme(): MaterialDialog.Builder {
} }
fun Activity.setFrostTheme(forceTransparent: Boolean = false) { fun Activity.setFrostTheme(forceTransparent: Boolean = false) {
val isTransparent = (Color.alpha(Prefs.bgColor) != 255) || (Color.alpha(Prefs.headerColor) != 255) || forceTransparent val isTransparent =
(Color.alpha(Prefs.bgColor) != 255) || (Color.alpha(Prefs.headerColor) != 255) || forceTransparent
if (Prefs.bgColor.isColorDark) if (Prefs.bgColor.isColorDark)
setTheme(if (isTransparent) R.style.FrostTheme_Transparent else R.style.FrostTheme) setTheme(if (isTransparent) R.style.FrostTheme_Transparent else R.style.FrostTheme)
else else
@ -357,7 +358,7 @@ val dependentSegments = arrayOf(
) )
inline val String?.isExplicitIntent inline val String?.isExplicitIntent
get() = this != null && startsWith("intent://") get() = this != null && (startsWith("intent://") || startsWith("market://"))
fun Context.frostChangelog() = showChangelog(R.xml.frost_changelog, Prefs.textColor) { fun Context.frostChangelog() = showChangelog(R.xml.frost_changelog, Prefs.textColor) {
theme() theme()

View File

@ -75,7 +75,6 @@ fun FrostWebView.requestWebOverlay(url: String): Boolean {
} }
if (!Prefs.overlayEnabled) return false if (!Prefs.overlayEnabled) return false
if (context is WebOverlayActivityBase) { if (context is WebOverlayActivityBase) {
L.v { "Check web request from overlay" }
val shouldUseDesktop = url.formattedFbUrl.shouldUseDesktopAgent val shouldUseDesktop = url.formattedFbUrl.shouldUseDesktopAgent
//already overlay; manage user agent //already overlay; manage user agent
if (userAgentString != USER_AGENT_DESKTOP && shouldUseDesktop) { if (userAgentString != USER_AGENT_DESKTOP && shouldUseDesktop) {

View File

@ -47,8 +47,8 @@ import com.pitchedapps.frost.services.NotificationContent
import com.pitchedapps.frost.services.NotificationType import com.pitchedapps.frost.services.NotificationType
import com.pitchedapps.frost.utils.Prefs import com.pitchedapps.frost.utils.Prefs
import com.pitchedapps.frost.utils.toReadableTime import com.pitchedapps.frost.utils.toReadableTime
import org.koin.standalone.KoinComponent import org.koin.core.KoinComponent
import org.koin.standalone.inject import org.koin.core.inject
class NotificationWidget : AppWidgetProvider() { class NotificationWidget : AppWidgetProvider() {

View File

@ -9,9 +9,10 @@
<version title="v2.3.0" /> <version title="v2.3.0" />
<item text="Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x" /> <item text="Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x" />
<item text="Added notification widget" /> <item text="Added notification widget" />
<item text="" /> <item text="Update theme" />
<item text="" /> <item text="Update translations" />
<item text="" /> <item text="Add fingerprint unlock screen" />
<item text="Fix messenger redirect" />
<item text="" /> <item text="" />
<item text="" /> <item text="" />
<item text="" /> <item text="" />

View File

@ -246,6 +246,8 @@ class CoroutineTest {
} }
} }
class TestException(msg: String) : RuntimeException(msg)
@Test @Test
fun exceptionChecks() { fun exceptionChecks() {
val mainTag = "main-test" val mainTag = "main-test"
@ -257,7 +259,7 @@ class CoroutineTest {
val job = SupervisorJob() val job = SupervisorJob()
val flyweight = Flyweight<Int, Int>(GlobalScope, 200L) { val flyweight = Flyweight<Int, Int>(GlobalScope, 200L) {
throw java.lang.RuntimeException("Flyweight exception") throw TestException("Flyweight exception")
} }
suspend fun crash(): Boolean = withContext(Dispatchers.IO) { suspend fun crash(): Boolean = withContext(Dispatchers.IO) {
@ -266,7 +268,7 @@ class CoroutineTest {
flyweight.fetch(0).await() flyweight.fetch(0).await()
} }
true true
} catch (e: java.lang.Exception) { } catch (e: TestException) {
false false
} }
} }
@ -282,10 +284,6 @@ class CoroutineTest {
println("B") println("B")
channel.offer(1) channel.offer(1)
} }
// launch {
// delay(2000)
// job.cancel()
// }
} }
} }
} }

View File

@ -19,7 +19,7 @@ textarea:not([style*="color: rgb"]), ._24pi, ._4en9, ._1kb, ._5p7j, ._2klz, ._57
div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w, div.sharerSelector, .footer, ._4pv_, ._1dbp, ._3kad, ._20zc, ._2i5v, ._2i5w,
a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn, a, ._5fpq, ._4gux, ._3bg5 ._52x1, ._3bg5 ._52x2, ._6dsj ._3gin, ._hdn._hdn,
.mentions-input:not([style*="color: rgb"]), .mentions-placeholder:not([style*="color: rgb"]), .mentions-input:not([style*="color: rgb"]), .mentions-placeholder:not([style*="color: rgb"]),
.largeStatusBox .placeHolder, .fcw, ._2rgt, ._67i4 ._5hu6 ._59tt, .largeStatusBox .placeHolder, .fcw, ._2rgt, ._67i4 ._5hu6 ._59tt, ._2bu3, ._2bu4,
._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4, ._5-7t, .fcl, ._4qas, .thread-title, .title, ._46pa, ._336p, ._1rrd, ._2om4,
._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs, ._3m1m, ._2om2, ._5n_e, .appListExplanation, ._5yt8, ._8he, ._2luw, ._5rgs,
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {

View File

@ -1,34 +1,81 @@
(function () { (function () {
let prevented = false; let prevented = false;
/**
* Go up at most [depth] times, to retrieve a parent matching the provided predicate
* If one is found, it is returned immediately.
* Otherwise, null is returned.
*/
function _parentEl(el: HTMLElement, depth: number, predicate: (el: HTMLElement) => boolean): HTMLElement | null {
for (let i = 0; i < depth + 1; i++) {
if (predicate(el)) {
return el
}
const parent = el.parentElement;
if (!parent) {
return null
}
el = parent
}
return null
}
/**
* Attempts to find a url entry at most [depth] away
* A url is found if the element has tag 'A', and the url isn't blank
*/
function _parentUrl(el: HTMLElement, depth: number): string | null {
const element = _parentEl(el, depth, (el) => el.tagName === 'A');
if (!element) {
return null;
}
const url = element.getAttribute('href');
if (!url || url === '#') {
return null;
}
return url
}
/**
* Given event and target, return true if handled and false otherwise.
*/
type EventHandler = (e: Event, target: HTMLElement) => Boolean
const _frostGeneral: EventHandler = (e, target) => {
// Notifications are two layers under
const url = _parentUrl(target, 2);
return Frost.loadUrl(url);
};
const _frostLaunchpadClick: EventHandler = (e, target) => {
if (!_parentEl(target, 6, (el) => el.id === 'launchpad')) {
return false
}
console.log('Clicked launchpad');
const url = _parentUrl(target, 5);
return Frost.loadUrl(url);
};
const handlers: EventHandler[] = [_frostLaunchpadClick, _frostGeneral];
const _frostAClick = (e: Event) => { const _frostAClick = (e: Event) => {
// check for valid target if (prevented) {
console.log("Click intercept prevented");
return
}
/*
* Commonality; check for valid target
*/
const target = e.target || e.currentTarget || e.srcElement; const target = e.target || e.currentTarget || e.srcElement;
if (!(target instanceof Element)) { if (!(target instanceof HTMLElement)) {
console.log("No element found"); console.log("No element found");
return return
} }
let element: Element = target; for (const h of handlers) {
// Notifications are two layers under if (h(e, target)) {
for (let i = 0; i < 2; i++) { e.stopPropagation();
if (element.tagName !== 'A') { e.preventDefault();
element = <Element>element.parentElement; return
}
}
if (element.tagName === 'A') {
if (!prevented) {
const url = element.getAttribute('href');
if (!url || url === '#') {
return
}
console.log(`Click intercept ${url}`);
// If Frost is injected, check if loading the url through an overlay works
if (Frost.loadUrl(url)) {
e.stopPropagation();
e.preventDefault();
}
} else {
console.log("Click intercept prevented")
} }
} }
}; };

View File

@ -6,6 +6,25 @@
(function () { (function () {
let longClick = false; let longClick = false;
/**
* Go up at most [depth] times, to retrieve a parent matching the provided predicate
* If one is found, it is returned immediately.
* Otherwise, null is returned.
*/
function _parentEl(el: HTMLElement, depth: number, predicate: (el: HTMLElement) => boolean): HTMLElement | null {
for (let i = 0; i < depth + 1; i++) {
if (predicate(el)) {
return el
}
const parent = el.parentElement;
if (!parent) {
return null
}
el = parent
}
return null
}
/** /**
* Given event and target, return true if handled and false otherwise. * Given event and target, return true if handled and false otherwise.
*/ */
@ -55,16 +74,8 @@
* Opens image activity for posts with just one image * Opens image activity for posts with just one image
*/ */
const _frostImage: EventHandler = (e, target) => { const _frostImage: EventHandler = (e, target) => {
let element: Element = target; const element = _parentEl(target, 2, (el) => el.tagName === 'A');
// Notifications are two layers under if (!element) {
for (let i = 0; i < 2; i++) {
if (element.tagName !== 'A') {
element = <Element>element.parentElement;
} else {
break
}
}
if (element.tagName !== 'A') {
return false; return false;
} }
const url = element.getAttribute('href'); const url = element.getAttribute('href');
@ -92,7 +103,7 @@
return true; return true;
}; };
const handlers = [_frostImage, _frostCopyComment, _frostCopyPost]; const handlers: EventHandler[] = [_frostImage, _frostCopyComment, _frostCopyPost];
const _frostAContext = (e: Event) => { const _frostAContext = (e: Event) => {
Frost.longClick(true); Frost.longClick(true);

View File

@ -3,6 +3,10 @@
## v2.3.0 ## v2.3.0
* Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x * Converted internals of Facebook data storage; auto migration will only work from 2.2.x to 2.3.x
* Added notification widget * Added notification widget
* Update theme
* Update translations
* Add fingerprint unlock screen
* Fix messenger redirect
## v2.2.4 ## v2.2.4
* Show top bar to allow sharing posts * Show top bar to allow sharing posts

View File

@ -17,7 +17,7 @@ APP_ID=Frost
APP_GROUP=com.pitchedapps APP_GROUP=com.pitchedapps
KAU=4.0.0 KAU=4.0.0
KOTLIN=1.3.30 KOTLIN=1.3.31
# https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google # https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google
ANDROID_GRADLE=3.3.2 ANDROID_GRADLE=3.3.2
@ -43,7 +43,7 @@ DBFLOW=4.2.4
# https://github.com/brianwernick/ExoMedia/releases # https://github.com/brianwernick/ExoMedia/releases
EXOMEDIA=4.3.0 EXOMEDIA=4.3.0
# https://github.com/InsertKoinIO/koin/blob/master/CHANGELOG.md # https://github.com/InsertKoinIO/koin/blob/master/CHANGELOG.md
KOIN=1.0.2 KOIN=2.0.0-rc-2
# https://github.com/mockk/mockk/releases # https://github.com/mockk/mockk/releases
MOCKK=1.9.3 MOCKK=1.9.3
# https://mvnrepository.com/artifact/androidx.core/core-ktx?repo=google # https://mvnrepository.com/artifact/androidx.core/core-ktx?repo=google
@ -58,10 +58,10 @@ LEAK_CANARY=1.6.2
# https://github.com/zsmb13/MaterialDrawerKt/releases # https://github.com/zsmb13/MaterialDrawerKt/releases
MATERIAL_DRAWER_KT=2.0.1 MATERIAL_DRAWER_KT=2.0.1
# https://github.com/square/okhttp/releases # https://github.com/square/okhttp/releases
OKHTTP=3.14.0 OKHTTP=3.14.1
# http://robolectric.org/getting-started/
# https://developer.android.com/jetpack/androidx/releases/room # https://developer.android.com/jetpack/androidx/releases/room
ROOM=2.1.0-alpha04 ROOM=2.1.0-alpha04
# http://robolectric.org/getting-started/
ROBOELECTRIC=4.2 ROBOELECTRIC=4.2
# https://github.com/davemorrissey/subsampling-scale-image-view#quick-start # https://github.com/davemorrissey/subsampling-scale-image-view#quick-start
SCALE_IMAGE_VIEW=3.10.0 SCALE_IMAGE_VIEW=3.10.0