From 6fa685433e23ce56286c3fbcae9cf1ef7a1a6e68 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 4 Jun 2017 00:19:58 -0700 Subject: Fix log webview and use leak canary --- app/build.gradle | 4 ++++ app/proguard-rules.pro | 2 +- .../main/kotlin/com/pitchedapps/frost/BaseLeakActivity.kt | 14 ++++++++++++++ app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt | 15 ++++++++++++++- .../main/kotlin/com/pitchedapps/frost/LoginActivity.kt | 4 ++-- app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt | 2 +- .../main/kotlin/com/pitchedapps/frost/StartActivity.kt | 2 +- .../kotlin/com/pitchedapps/frost/WebOverlayActivity.kt | 3 +-- .../com/pitchedapps/frost/fragments/BaseFragment.kt | 6 ++++++ .../kotlin/com/pitchedapps/frost/utils/ContextUtils.kt | 10 +++++++++- .../main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt | 7 ++++--- .../com/pitchedapps/frost/web/FrostWebViewClient.kt | 5 ++++- .../kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt | 12 ++++++------ app/src/main/res/layout/activity_login.xml | 10 +++++++++- app/src/main/res/values/strings.xml | 1 + 15 files changed, 77 insertions(+), 20 deletions(-) create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/BaseLeakActivity.kt (limited to 'app') diff --git a/app/build.gradle b/app/build.gradle index fb0c4e37..891db44d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,6 +84,10 @@ dependencies { //Logging compile "com.jakewharton.timber:timber:${TIMBER}" + debugCompile "com.squareup.leakcanary:leakcanary-android:${LEAK_CANARY}" + releaseCompile "com.squareup.leakcanary:leakcanary-android-no-op:${LEAK_CANARY}" + testCompile "com.squareup.leakcanary:leakcanary-android-no-op:${LEAK_CANARY}" + //Dialog compile "com.afollestad.material-dialogs:core:${MATERIAL_DIALOG}" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c08dbb30..bd688950 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,5 +1,5 @@ -ignorewarnings - +-dontwarn kotlin.** -keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; } -keepattributes *Annotation* #EventBus diff --git a/app/src/main/kotlin/com/pitchedapps/frost/BaseLeakActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/BaseLeakActivity.kt new file mode 100644 index 00000000..ab91f044 --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/BaseLeakActivity.kt @@ -0,0 +1,14 @@ +package com.pitchedapps.frost + +import android.support.v7.app.AppCompatActivity +import com.pitchedapps.frost.utils.refWatch + +/** + * Created by Allan Wang on 2017-06-04. + */ +open class BaseLeakActivity : AppCompatActivity() { + override fun onDestroy() { + super.onDestroy() + refWatch() + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt b/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt index 52cb8c06..5527e434 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/FrostApp.kt @@ -9,7 +9,6 @@ import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.crashlytics.android.Crashlytics import com.crashlytics.android.answers.Answers -import com.crashlytics.android.core.CrashlyticsCore import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader import com.mikepenz.materialdrawer.util.DrawerImageLoader import com.mikepenz.materialdrawer.util.DrawerUIUtils @@ -18,6 +17,8 @@ import com.pitchedapps.frost.utils.CrashReportingTree import com.pitchedapps.frost.utils.Prefs import com.raizlabs.android.dbflow.config.FlowConfig import com.raizlabs.android.dbflow.config.FlowManager +import com.squareup.leakcanary.LeakCanary +import com.squareup.leakcanary.RefWatcher import io.fabric.sdk.android.Fabric import timber.log.Timber import timber.log.Timber.DebugTree @@ -28,7 +29,19 @@ import timber.log.Timber.DebugTree */ class FrostApp : Application() { + companion object { + fun refWatcher(c: Context) = (c.applicationContext as FrostApp).refWatcher + } + + lateinit var refWatcher: RefWatcher + override fun onCreate() { + if (LeakCanary.isInAnalyzerProcess(this)) { + // This process is dedicated to LeakCanary for heap analysis. + // You should not init your app in this process. + return; + } + refWatcher = LeakCanary.install(this); if (BuildConfig.DEBUG) Timber.plant(DebugTree()) else { Fabric.with(this, Crashlytics(), Answers()) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt index fcda7fb4..914e27b2 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/LoginActivity.kt @@ -4,7 +4,6 @@ import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler import android.support.v4.widget.SwipeRefreshLayout -import android.support.v7.app.AppCompatActivity import android.support.v7.widget.AppCompatTextView import android.support.v7.widget.Toolbar import android.widget.ImageView @@ -40,7 +39,7 @@ import kotlin.concurrent.thread /** * Created by Allan Wang on 2017-06-01. */ -class LoginActivity : AppCompatActivity() { +class LoginActivity : BaseLeakActivity() { val toolbar: Toolbar by bindView(R.id.toolbar) val web: LoginWebView by bindView(R.id.login_webview) @@ -67,6 +66,7 @@ class LoginActivity : AppCompatActivity() { setContentView(R.layout.activity_login) ButterKnife.bind(this) setSupportActionBar(toolbar) + setTitle(R.string.login) web.loginObservable = loginObservable web.progressObservable = progressObservable loginObservable.observeOn(AndroidSchedulers.mainThread()).subscribe { diff --git a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt index 931d6df7..7d46ef50 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt @@ -34,7 +34,7 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -class MainActivity : AppCompatActivity() { +class MainActivity : BaseLeakActivity() { lateinit var adapter: SectionsPagerAdapter val toolbar: Toolbar by bindView(R.id.toolbar) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/StartActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/StartActivity.kt index 04056043..7245b9c5 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/StartActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/StartActivity.kt @@ -9,7 +9,7 @@ import com.pitchedapps.frost.utils.launchNewTask /** * Created by Allan Wang on 2017-05-28. */ -class StartActivity : AppCompatActivity() { +class StartActivity : BaseLeakActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt index 3ec47a10..9bf6f500 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/WebOverlayActivity.kt @@ -1,7 +1,6 @@ package com.pitchedapps.frost import android.os.Bundle -import android.support.v7.app.AppCompatActivity import android.support.v7.widget.Toolbar import butterknife.ButterKnife import com.jude.swipbackhelper.SwipeBackHelper @@ -13,7 +12,7 @@ import com.pitchedapps.frost.web.FrostWebView /** * Created by Allan Wang on 2017-06-01. */ -class WebOverlayActivity : AppCompatActivity() { +class WebOverlayActivity : BaseLeakActivity() { val toolbar: Toolbar by bindView(R.id.overlay_toolbar) val frostWeb: FrostWebView by bindView(R.id.overlay_frost_webview) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/BaseFragment.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/BaseFragment.kt index 06484500..4ca45d86 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/BaseFragment.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/BaseFragment.kt @@ -1,7 +1,9 @@ package com.pitchedapps.frost.fragments +import android.support.annotation.CallSuper import android.support.v4.app.Fragment import com.pitchedapps.frost.utils.putInt +import com.pitchedapps.frost.utils.refWatch /** * Created by Allan Wang on 2017-05-29. @@ -22,4 +24,8 @@ abstract class BaseFragment : Fragment(), BaseFragmentContract { } } +// override fun onDestroyView() { +// super.onDestroyView() +// refWatch() +// } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt index 1cc0bf64..13a8a836 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/ContextUtils.kt @@ -4,7 +4,9 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.support.v4.app.ActivityOptionsCompat +import android.support.v4.app.Fragment import android.support.v4.content.ContextCompat +import com.pitchedapps.frost.FrostApp import com.pitchedapps.frost.R import com.pitchedapps.frost.WebOverlayActivity import com.pitchedapps.frost.dbflow.CookieModel @@ -45,4 +47,10 @@ fun Activity.restart() { overridePendingTransition(0, 0) //No transitions startActivity(intent); overridePendingTransition(0, 0) -} \ No newline at end of file +} + +fun Context.refWatch() { + FrostApp.refWatcher(this).watch(this) +} + +fun Fragment.refWatch() = context.refWatch() \ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt index d5fd6391..c5ac03ae 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebView.kt @@ -37,12 +37,13 @@ class FrostWebView @JvmOverloads constructor(context: Context, attrs: AttributeS inflate(getContext(), R.layout.swipe_webview, this) ButterKnife.bind(this) web.progressObservable.observeOn(AndroidSchedulers.mainThread()).subscribe { - val loaded = it == 100 - refresh.isRefreshing = !loaded - progress.visibility = if (loaded) View.INVISIBLE else View.VISIBLE + progress.visibility = if (it == 100) View.INVISIBLE else View.VISIBLE if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) progress.setProgress(it, true) else progress.progress = it } + web.refreshObservable.observeOn(AndroidSchedulers.mainThread()).subscribe { + refresh.isRefreshing = it + } refresh.setOnRefreshListener(this) addOnAttachStateChangeListener(object : OnAttachStateChangeListener { override fun onViewDetachedFromWindow(v: View) { diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt index 5c1aa5b1..fb5fd0e7 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewClient.kt @@ -15,11 +15,12 @@ import com.pitchedapps.frost.utils.Prefs import com.pitchedapps.frost.utils.launchNewTask import com.pitchedapps.frost.views.circularReveal import com.pitchedapps.frost.views.fadeOut +import io.reactivex.subjects.Subject /** * Created by Allan Wang on 2017-05-31. */ -class FrostWebViewClient(val position: () -> Int) : WebViewClient() { +class FrostWebViewClient(val refreshObservable: Subject) : WebViewClient() { companion object { //Collections of jewels mapped with url match -> id @@ -33,6 +34,7 @@ class FrostWebViewClient(val position: () -> Int) : WebViewClient() { override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) L.i("FWV Loading $url") + refreshObservable.onNext(true) if (!url.contains(FACEBOOK_COM)) return if (url.contains("logout.php")) { FbCookie.logout(Prefs.userId) @@ -46,6 +48,7 @@ class FrostWebViewClient(val position: () -> Int) : WebViewClient() { override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) + refreshObservable.onNext(false) if (!url.contains(FACEBOOK_COM)) return CssAssets.HEADER.inject(view, { view.circularReveal(offset = 150L) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt index eaee60bc..34fd4509 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/web/FrostWebViewCore.kt @@ -36,18 +36,18 @@ class FrostWebViewCore @JvmOverloads constructor( private val scrollOffset = IntArray(2) private val scrollConsumed = IntArray(2) private var nestedOffsetY: Int = 0 - val progressObservable: Subject - val titleObservable: Subject + val progressObservable: BehaviorSubject // Keeps track of every progress change + val refreshObservable: BehaviorSubject // Only emits on page loads + val titleObservable: BehaviorSubject // Only emits on different non http titles - private val chromeClient: FrostChromeClient var baseUrl: String? = null var position: Int = -1 init { isNestedScrollingEnabled = true progressObservable = BehaviorSubject.create() + refreshObservable = BehaviorSubject.create() titleObservable = BehaviorSubject.create() - chromeClient = FrostChromeClient(progressObservable, titleObservable) setupWebview() } @@ -56,8 +56,8 @@ class FrostWebViewCore @JvmOverloads constructor( settings.javaScriptEnabled = true settings.domStorageEnabled = true setLayerType(View.LAYER_TYPE_HARDWARE, null) - setWebViewClient(FrostWebViewClient({ position })) - setWebChromeClient(chromeClient) + setWebViewClient(FrostWebViewClient(refreshObservable)) + setWebChromeClient(FrostChromeClient(progressObservable, titleObservable)) } override fun loadUrl(url: String?) { diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 2c03624b..eef0e434 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -13,9 +13,17 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" + android:theme="@style/AppTheme.AppBarOverlay" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> - + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 97c84093..f99bd0ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,4 +24,5 @@ Photos Getting everything ready… Welcome %s + Login -- cgit v1.2.3