From 240edf9067d968e04bed4b8845fd3873d0cafbeb Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 15 Aug 2018 17:29:09 +0100 Subject: [PATCH 01/27] Update AGP to latest beta --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ad70cbff4d42..671b7995c3e4 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-beta04' + classpath 'com.android.tools.build:gradle:3.2.0-beta05' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 8b7837a369f1799c27561643ee9a0e75e73085cb Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Thu, 16 Aug 2018 13:44:00 +0100 Subject: [PATCH 02/27] Update to support library 28 to match target API version Requires a few tweaks along the way, mainly around nullability of variables --- app/build.gradle | 2 +- .../com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt | 2 +- .../main/java/com/duckduckgo/app/browser/BrowserActivity.kt | 5 +++-- .../java/com/duckduckgo/app/browser/BrowserTabFragment.kt | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e53e24056027..4bf5502accd6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,7 +77,7 @@ android { } ext { - supportLibrary = "27.1.1" + supportLibrary = "28.0.0-beta01" architectureComponents = "1.1.1" architectureComponentsExtensions = "1.1.1" androidKtx = "0.3" diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt index 5fc6f31b6137..24009de25885 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt @@ -172,7 +172,7 @@ class BookmarksActivity : DuckDuckGoActivity() { } } - class BookmarksViewHolder(itemView: View?, private val viewModel: BookmarksViewModel) : + class BookmarksViewHolder(itemView: View, private val viewModel: BookmarksViewModel) : ViewHolder(itemView) { lateinit var bookmark: BookmarkEntity diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt index 3938cdf2c64f..ae0a4f13a095 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt @@ -79,10 +79,11 @@ class BrowserActivity : DuckDuckGoActivity() { private fun openNewTab(tabId: String, url: String? = null) { val fragment = BrowserTabFragment.newInstance(tabId, url) val transaction = supportFragmentManager.beginTransaction() - if (currentTab == null) { + val tab = currentTab + if (tab == null) { transaction.replace(R.id.fragmentContainer, fragment, tabId) } else { - transaction.hide(currentTab) + transaction.hide(tab) transaction.add(R.id.fragmentContainer, fragment, tabId) } transaction.commit() diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 41136a817cdf..69223b0910d9 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -692,7 +692,7 @@ class BrowserTabFragment : Fragment(), FindListener { } private fun resetTabState() { - omnibarTextInput.text.clear() + omnibarTextInput.text?.clear() viewModel.resetView() destroyWebView() configureWebView() From 7f36f749df69cbd42261d92f3c40f1b12fb44416 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Thu, 16 Aug 2018 17:31:59 +0100 Subject: [PATCH 03/27] =?UTF-8?q?Potential=20interim=20solution=20for=20cl?= =?UTF-8?q?earing=20process=20on=20=F0=9F=94=A5=20button=20press?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 13 ++- .../duckduckgo/app/browser/BrowserActivity.kt | 2 +- .../app/browser/BrowserTabFragment.kt | 4 +- .../com/duckduckgo/app/fire/FireActivity.kt | 88 +++++++++++++++++++ .../app/global/DuckDuckGoApplication.kt | 2 + .../global/view/ClearPersonalDataAction.kt | 9 +- .../duckduckgo/app/global/view/FireDialog.kt | 11 +-- app/src/main/res/layout/activity_fire.xml | 36 ++++++++ app/src/main/res/values/attrs.xml | 28 ++++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/styles.xml | 16 +++- 13 files changed, 197 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt create mode 100644 app/src/main/res/layout/activity_fire.xml create mode 100644 app/src/main/res/values/attrs.xml diff --git a/app/build.gradle b/app/build.gradle index 4bf5502accd6..29194d63f290 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,6 +90,7 @@ ext { dependencies { + implementation 'com.android.support:support-v4:28.0.0-rc01' debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 262f7f9bfc97..84b125dc9dbc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,6 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> - @@ -37,13 +36,13 @@ + - + android:label="@string/appName" + android:theme="@style/AppTheme.TransparentTheme" /> + + \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt index ae0a4f13a095..2cf32d0cbe62 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt @@ -123,7 +123,7 @@ class BrowserActivity : DuckDuckGoActivity() { if (intent.getBooleanExtra(PERFORM_FIRE_ON_ENTRY_EXTRA, false) ) { viewModel.onClearRequested() - clearPersonalDataAction.clear { viewModel.onClearComplete() } + clearPersonalDataAction.clear() Toast.makeText(applicationContext, R.string.fireDataCleared, Toast.LENGTH_LONG).show() finish() return diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 69223b0910d9..8724588a248f 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -443,8 +443,8 @@ class BrowserTabFragment : Fragment(), FindListener { private fun configureToolbar() { toolbar.inflateMenu(R.menu.menu_browser_activity) - toolbar.setOnMenuItemClickListener { - when (it.itemId) { + toolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { R.id.tabs -> { browserActivity?.launchTabSwitcher() return@setOnMenuItemClickListener true diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt new file mode 100644 index 000000000000..f627a8c24c89 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.fire + +import android.app.Activity +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import androidx.core.os.postDelayed +import com.duckduckgo.app.browser.R +import com.duckduckgo.app.global.DuckDuckGoActivity +import java.util.* + +class FireActivity : DuckDuckGoActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_fire) + } + + override fun onStart() { + super.onStart() + + Handler().postDelayed(1500L){ + val intents = intent.getParcelableArrayListExtra(KEY_RESTART_INTENTS) + startActivities(intents.toTypedArray()) + finish() + Runtime.getRuntime().exit(0) // Kill kill kill! + } + } + + override fun onBackPressed() { + // do nothing - the activity will kill itself soon enough + } + + companion object { + private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" + + fun triggerRebirth(context: Context) { + triggerRebirth(context, getRestartIntent(context)) + } + + private fun triggerRebirth(context: Context, vararg nextIntents: Intent) { + val intent = Intent(context, FireActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // In case we are called with non-Activity context. + intent.putParcelableArrayListExtra(KEY_RESTART_INTENTS, ArrayList(Arrays.asList(*nextIntents))) + context.startActivity(intent) + if (context is Activity) { + context.finish() + } + Runtime.getRuntime().exit(0) // Kill kill kill! + } + + private fun getRestartIntent(context: Context): Intent { + val defaultIntent = Intent(Intent.ACTION_MAIN, null) + defaultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + defaultIntent.addCategory(Intent.CATEGORY_DEFAULT) + + val packageName = context.packageName + val packageManager = context.packageManager + for (resolveInfo in packageManager.queryIntentActivities(defaultIntent, 0)) { + val activityInfo = resolveInfo.activityInfo + if (activityInfo.packageName == packageName) { + defaultIntent.component = ComponentName(packageName, activityInfo.name) + return defaultIntent + } + } + + throw IllegalStateException("Unable to determine default activity for $packageName. Does an activity specify the DEFAULT category in its intent filter?") + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt index c20c7d197f56..8b71bb9bcb82 100644 --- a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt +++ b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt @@ -37,6 +37,7 @@ import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.APP_LAUNCH import com.duckduckgo.app.surrogates.ResourceSurrogateLoader import com.duckduckgo.app.trackerdetection.TrackerDataLoader +import com.jakewharton.processphoenix.ProcessPhoenix import com.squareup.leakcanary.LeakCanary import dagger.android.AndroidInjector import dagger.android.DispatchingAndroidInjector @@ -90,6 +91,7 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS super.onCreate() if (!installLeakCanary()) return + if (ProcessPhoenix.isPhoenixProcess(this)) return ProcessLifecycleOwner.get().lifecycle.addObserver(this) configureDependencyInjection() diff --git a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt index bb390b1674f4..ebdd030563fd 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt @@ -21,6 +21,8 @@ import android.webkit.CookieManager import android.webkit.WebStorage import android.webkit.WebView import com.duckduckgo.app.browser.WebDataManager +import com.duckduckgo.app.fire.FireActivity +import timber.log.Timber import javax.inject.Inject class ClearPersonalDataAction @Inject constructor( @@ -28,9 +30,12 @@ class ClearPersonalDataAction @Inject constructor( private val dataManager: WebDataManager ) { - fun clear(clearComplete: (() -> Unit)) { + fun clear() { dataManager.clearData(WebView(context), WebStorage.getInstance(), context) dataManager.clearWebViewSessions() - dataManager.clearExternalCookies(CookieManager.getInstance(), clearComplete) + dataManager.clearExternalCookies(CookieManager.getInstance()) { + Timber.i("Finished clearing everything; restarting process") + FireActivity.triggerRebirth(context) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt index 921a0f13461e..be51e81ca805 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt @@ -21,9 +21,9 @@ import android.os.Bundle import android.support.design.widget.BottomSheetDialog import android.view.View import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.WebDataManager +import com.duckduckgo.app.fire.FireActivity import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* +import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.FORGET_ALL_EXECUTED import kotlinx.android.synthetic.main.sheet_fire_clear_data.* class FireDialog( @@ -47,7 +47,7 @@ class FireDialog( clearAllOption.setOnClickListener { clearStarted() pixel.fire(FORGET_ALL_EXECUTED) - performClear(clearComplete) + clearPersonalDataAction.clear() dismiss() } @@ -55,9 +55,4 @@ class FireDialog( dismiss() } } - - fun performClear(clearComplete: () -> Unit) { - clearPersonalDataAction.clear(clearComplete) - } - } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire.xml b/app/src/main/res/layout/activity_fire.xml new file mode 100644 index 000000000000..463d16a671f6 --- /dev/null +++ b/app/src/main/res/layout/activity_fire.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 000000000000..5ea649481143 --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 15a00359fc24..3e1c3a315827 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -48,4 +48,6 @@ #FF333333 #FFABABAB + #66000000 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6e630e17e41b..422043632aab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -208,4 +208,8 @@ Add to Home + FireActivity + Dummy Button + DUMMY\nCONTENT + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e81521a91d02..9305cb7ccafd 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -153,7 +153,7 @@ normal - - @@ -254,4 +254,16 @@ 6sp + + + + From aa188d4971ffcda3ed398d7de90dca47f0dd070d Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Mon, 20 Aug 2018 14:43:28 +0100 Subject: [PATCH 04/27] Add competing process-restart implementations --- app/src/main/AndroidManifest.xml | 11 ++- .../duckduckgo/app/di/AndroidBindingModule.kt | 10 ++ .../com/duckduckgo/app/fire/FireActivity.kt | 58 ++++++----- .../duckduckgo/app/fire/FireSplashActivity.kt | 98 +++++++++++++++++++ .../app/global/DuckDuckGoApplication.kt | 18 +++- .../global/view/ClearPersonalDataAction.kt | 10 ++ .../duckduckgo/app/global/view/FireDialog.kt | 8 +- .../res/drawable/fire_splash_activity.xml | 27 +++++ app/src/main/res/layout/activity_fire.xml | 6 +- .../main/res/layout/sheet_fire_clear_data.xml | 35 +++++-- app/src/main/res/values/styles.xml | 5 + 11 files changed, 247 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt create mode 100644 app/src/main/res/drawable/fire_splash_activity.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 84b125dc9dbc..f1135d1281e8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,7 +36,6 @@ - + + diff --git a/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt b/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt index defec5f4e6cc..72361edd98d8 100644 --- a/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt @@ -21,6 +21,8 @@ import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.BrowserTabFragment import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserInfoActivity import com.duckduckgo.app.feedback.ui.FeedbackActivity +import com.duckduckgo.app.fire.FireActivity +import com.duckduckgo.app.fire.FireSplashActivity import com.duckduckgo.app.job.AppConfigurationJobService import com.duckduckgo.app.launch.LaunchActivity import com.duckduckgo.app.onboarding.ui.OnboardingActivity @@ -87,6 +89,14 @@ abstract class AndroidBindingModule { @ContributesAndroidInjector abstract fun defaultBrowserInfoActivity(): DefaultBrowserInfoActivity + @ActivityScoped + @ContributesAndroidInjector + abstract fun fireActivity(): FireActivity + + @ActivityScoped + @ContributesAndroidInjector + abstract fun fireSplashActivity(): FireSplashActivity + /* Fragments */ @ContributesAndroidInjector diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt index f627a8c24c89..4b70090c4a23 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -17,15 +17,14 @@ package com.duckduckgo.app.fire import android.app.Activity -import android.content.ComponentName import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Handler import androidx.core.os.postDelayed +import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.R import com.duckduckgo.app.global.DuckDuckGoActivity -import java.util.* class FireActivity : DuckDuckGoActivity() { @@ -37,11 +36,11 @@ class FireActivity : DuckDuckGoActivity() { override fun onStart() { super.onStart() - Handler().postDelayed(1500L){ - val intents = intent.getParcelableArrayListExtra(KEY_RESTART_INTENTS) - startActivities(intents.toTypedArray()) + Handler().postDelayed(ACTIVITY_FINISH_DELAY_MS){ + val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) + startActivity(intent) finish() - Runtime.getRuntime().exit(0) // Kill kill kill! + killProcess() } } @@ -50,39 +49,52 @@ class FireActivity : DuckDuckGoActivity() { } companion object { + + private const val ACTIVITY_FINISH_DELAY_MS = 600L private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" fun triggerRebirth(context: Context) { triggerRebirth(context, getRestartIntent(context)) } - private fun triggerRebirth(context: Context, vararg nextIntents: Intent) { + private fun triggerRebirth(context: Context, nextIntent: Intent) { val intent = Intent(context, FireActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // In case we are called with non-Activity context. - intent.putParcelableArrayListExtra(KEY_RESTART_INTENTS, ArrayList(Arrays.asList(*nextIntents))) + intent.putExtra(KEY_RESTART_INTENTS, nextIntent) context.startActivity(intent) if (context is Activity) { context.finish() } - Runtime.getRuntime().exit(0) // Kill kill kill! + killProcess() // Kill kill kill! } private fun getRestartIntent(context: Context): Intent { - val defaultIntent = Intent(Intent.ACTION_MAIN, null) - defaultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - defaultIntent.addCategory(Intent.CATEGORY_DEFAULT) - - val packageName = context.packageName - val packageManager = context.packageManager - for (resolveInfo in packageManager.queryIntentActivities(defaultIntent, 0)) { - val activityInfo = resolveInfo.activityInfo - if (activityInfo.packageName == packageName) { - defaultIntent.component = ComponentName(packageName, activityInfo.name) - return defaultIntent - } - } - throw IllegalStateException("Unable to determine default activity for $packageName. Does an activity specify the DEFAULT category in its intent filter?") + val intent = BrowserActivity.intent(context) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + return intent + +// val defaultIntent = Intent(Intent.ACTION_MAIN, null) +// defaultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) +// defaultIntent.addCategory(Intent.CATEGORY_DEFAULT) +// +// val packageName = context.packageName +// val packageManager = context.packageManager +// for (resolveInfo in packageManager.queryIntentActivities(defaultIntent, 0)) { +// val activityInfo = resolveInfo.activityInfo +// if (activityInfo.packageName == packageName) { +// defaultIntent.component = ComponentName(packageName, activityInfo.name) +// return defaultIntent +// } +// } +// +// throw IllegalStateException("Unable to determine default activity for $packageName. Does an activity specify the DEFAULT category in its intent filter?") + } + + private fun killProcess() { + Runtime.getRuntime().exit(0) } } + + } diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt new file mode 100644 index 000000000000..04b539746798 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.fire + +import android.app.Activity +import android.app.ActivityManager +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.Process +import androidx.core.os.postDelayed +import com.duckduckgo.app.browser.BrowserActivity +import com.duckduckgo.app.global.DuckDuckGoActivity +import timber.log.Timber + +/** + * Activity which is responsible for killing the main process and restarting it. This Activity will automatically finish itself after a brief time. + * + * This Activity runs in a separate process so that it can seamlessly restart the main app process without much in the way of a jarring UX. + * + * The correct way to invoke this Activity is through its `triggerRebirth(context)` method. + * + * This Activity was largely inspired by https://github.com/JakeWharton/ProcessPhoenix + */ +class FireSplashActivity : DuckDuckGoActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + Handler().postDelayed(ACTIVITY_FINISH_DELAY_MS) { + val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) + startActivity(intent) + finish() + killProcess() + } + } + + override fun onBackPressed() { + // do nothing - the activity will kill itself soon enough + } + + companion object { + private const val ACTIVITY_FINISH_DELAY_MS = 600L + private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" + + fun triggerRebirth(context: Context) { + triggerRebirth(context, getRestartIntent(context)) + } + + private fun triggerRebirth(context: Context, nextIntent: Intent) { + val intent = Intent(context, FireSplashActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // In case we are called with non-Activity context. + intent.putExtra(KEY_RESTART_INTENTS, nextIntent) + context.startActivity(intent) + if (context is Activity) { + context.finish() + } + killProcess() + } + + private fun getRestartIntent(context: Context): Intent { + val intent = BrowserActivity.intent(context) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + return intent + } + + private fun killProcess() { + Runtime.getRuntime().exit(0) + } + + fun appRestarting(context: Context): Boolean { + val currentProcessId = Process.myPid() + val activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + activityManager.runningAppProcesses?.forEach { + if(it.pid == currentProcessId && it.processName.endsWith(":fire")) { + Timber.e("Process ID $currentProcessId is fire process") + return true + } + } + return false + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt index 8b71bb9bcb82..a8ddb986bf6d 100644 --- a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt +++ b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt @@ -27,6 +27,7 @@ import android.os.Build import android.support.v4.app.Fragment import com.duckduckgo.app.browser.BuildConfig import com.duckduckgo.app.di.DaggerAppComponent +import com.duckduckgo.app.fire.FireSplashActivity import com.duckduckgo.app.global.install.AppInstallStore import com.duckduckgo.app.global.notification.NotificationRegistrar import com.duckduckgo.app.global.shortcut.AppShortcutCreator @@ -37,7 +38,6 @@ import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.APP_LAUNCH import com.duckduckgo.app.surrogates.ResourceSurrogateLoader import com.duckduckgo.app.trackerdetection.TrackerDataLoader -import com.jakewharton.processphoenix.ProcessPhoenix import com.squareup.leakcanary.LeakCanary import dagger.android.AndroidInjector import dagger.android.DispatchingAndroidInjector @@ -91,11 +91,13 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS super.onCreate() if (!installLeakCanary()) return - if (ProcessPhoenix.isPhoenixProcess(this)) return - ProcessLifecycleOwner.get().lifecycle.addObserver(this) - configureDependencyInjection() configureLogging() + configureDependencyInjection() + + if(appIsRestarting()) return + + ProcessLifecycleOwner.get().lifecycle.addObserver(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { appShortcutCreator.configureAppShortcuts(this) @@ -124,6 +126,14 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS return true } + private fun appIsRestarting(): Boolean { + if (FireSplashActivity.appRestarting(this)) { + Timber.i("App restarting") + return true + } + return false + } + private fun migrateLegacyDb() { doAsync { migration.start { favourites, searches -> diff --git a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt index ebdd030563fd..e77f495edf41 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt @@ -22,6 +22,7 @@ import android.webkit.WebStorage import android.webkit.WebView import com.duckduckgo.app.browser.WebDataManager import com.duckduckgo.app.fire.FireActivity +import com.duckduckgo.app.fire.FireSplashActivity import timber.log.Timber import javax.inject.Inject @@ -31,6 +32,15 @@ class ClearPersonalDataAction @Inject constructor( ) { fun clear() { + dataManager.clearData(WebView(context), WebStorage.getInstance(), context) + dataManager.clearWebViewSessions() + dataManager.clearExternalCookies(CookieManager.getInstance()) { + Timber.i("Finished clearing everything; restarting process") + FireSplashActivity.triggerRebirth(context) + } + } + + fun clear2() { dataManager.clearData(WebView(context), WebStorage.getInstance(), context) dataManager.clearWebViewSessions() dataManager.clearExternalCookies(CookieManager.getInstance()) { diff --git a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt index be51e81ca805..874935ff521e 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt @@ -21,7 +21,6 @@ import android.os.Bundle import android.support.design.widget.BottomSheetDialog import android.view.View import com.duckduckgo.app.browser.R -import com.duckduckgo.app.fire.FireActivity import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.FORGET_ALL_EXECUTED import kotlinx.android.synthetic.main.sheet_fire_clear_data.* @@ -51,6 +50,13 @@ class FireDialog( dismiss() } + clearAllOptionNewActivity.setOnClickListener { + clearStarted() + pixel.fire(FORGET_ALL_EXECUTED) + clearPersonalDataAction.clear2() + dismiss() + } + cancelOption.setOnClickListener { dismiss() } diff --git a/app/src/main/res/drawable/fire_splash_activity.xml b/app/src/main/res/drawable/fire_splash_activity.xml new file mode 100644 index 000000000000..90d205529d87 --- /dev/null +++ b/app/src/main/res/drawable/fire_splash_activity.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire.xml b/app/src/main/res/layout/activity_fire.xml index 463d16a671f6..05e5df098792 100644 --- a/app/src/main/res/layout/activity_fire.xml +++ b/app/src/main/res/layout/activity_fire.xml @@ -22,14 +22,14 @@ tools:context="com.duckduckgo.app.fire.FireActivity"> diff --git a/app/src/main/res/layout/sheet_fire_clear_data.xml b/app/src/main/res/layout/sheet_fire_clear_data.xml index 45901adcaf09..dd0ddad79766 100644 --- a/app/src/main/res/layout/sheet_fire_clear_data.xml +++ b/app/src/main/res/layout/sheet_fire_clear_data.xml @@ -24,18 +24,40 @@ + + @@ -43,22 +65,23 @@ \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9305cb7ccafd..39b27256077b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -266,4 +266,9 @@ @color/black_overlay + + From 90eefa501f5e7baa4711be238166a6104c6dd1f3 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Mon, 20 Aug 2018 15:34:08 +0100 Subject: [PATCH 05/27] Remove FireActivity approach to restarting app process --- app/src/main/AndroidManifest.xml | 7 -- .../duckduckgo/app/di/AndroidBindingModule.kt | 5 - .../com/duckduckgo/app/fire/FireActivity.kt | 100 ------------------ .../global/view/ClearPersonalDataAction.kt | 10 -- .../duckduckgo/app/global/view/FireDialog.kt | 7 -- .../main/res/layout/sheet_fire_clear_data.xml | 24 +---- 6 files changed, 2 insertions(+), 151 deletions(-) delete mode 100644 app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f1135d1281e8..f38187ea405a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -129,13 +129,6 @@ android:name=".defaultBrowsing.DefaultBrowserInfoActivity" android:theme="@style/ModalCardTheme" /> - - (KEY_RESTART_INTENTS) - startActivity(intent) - finish() - killProcess() - } - } - - override fun onBackPressed() { - // do nothing - the activity will kill itself soon enough - } - - companion object { - - private const val ACTIVITY_FINISH_DELAY_MS = 600L - private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" - - fun triggerRebirth(context: Context) { - triggerRebirth(context, getRestartIntent(context)) - } - - private fun triggerRebirth(context: Context, nextIntent: Intent) { - val intent = Intent(context, FireActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // In case we are called with non-Activity context. - intent.putExtra(KEY_RESTART_INTENTS, nextIntent) - context.startActivity(intent) - if (context is Activity) { - context.finish() - } - killProcess() // Kill kill kill! - } - - private fun getRestartIntent(context: Context): Intent { - - val intent = BrowserActivity.intent(context) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - return intent - -// val defaultIntent = Intent(Intent.ACTION_MAIN, null) -// defaultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) -// defaultIntent.addCategory(Intent.CATEGORY_DEFAULT) -// -// val packageName = context.packageName -// val packageManager = context.packageManager -// for (resolveInfo in packageManager.queryIntentActivities(defaultIntent, 0)) { -// val activityInfo = resolveInfo.activityInfo -// if (activityInfo.packageName == packageName) { -// defaultIntent.component = ComponentName(packageName, activityInfo.name) -// return defaultIntent -// } -// } -// -// throw IllegalStateException("Unable to determine default activity for $packageName. Does an activity specify the DEFAULT category in its intent filter?") - } - - private fun killProcess() { - Runtime.getRuntime().exit(0) - } - } - - -} diff --git a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt index e77f495edf41..f15f829bee83 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt @@ -21,7 +21,6 @@ import android.webkit.CookieManager import android.webkit.WebStorage import android.webkit.WebView import com.duckduckgo.app.browser.WebDataManager -import com.duckduckgo.app.fire.FireActivity import com.duckduckgo.app.fire.FireSplashActivity import timber.log.Timber import javax.inject.Inject @@ -39,13 +38,4 @@ class ClearPersonalDataAction @Inject constructor( FireSplashActivity.triggerRebirth(context) } } - - fun clear2() { - dataManager.clearData(WebView(context), WebStorage.getInstance(), context) - dataManager.clearWebViewSessions() - dataManager.clearExternalCookies(CookieManager.getInstance()) { - Timber.i("Finished clearing everything; restarting process") - FireActivity.triggerRebirth(context) - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt index 874935ff521e..a68d8c2afae2 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt @@ -50,13 +50,6 @@ class FireDialog( dismiss() } - clearAllOptionNewActivity.setOnClickListener { - clearStarted() - pixel.fire(FORGET_ALL_EXECUTED) - clearPersonalDataAction.clear2() - dismiss() - } - cancelOption.setOnClickListener { dismiss() } diff --git a/app/src/main/res/layout/sheet_fire_clear_data.xml b/app/src/main/res/layout/sheet_fire_clear_data.xml index dd0ddad79766..044484647c22 100644 --- a/app/src/main/res/layout/sheet_fire_clear_data.xml +++ b/app/src/main/res/layout/sheet_fire_clear_data.xml @@ -37,27 +37,7 @@ android:paddingEnd="24dp" android:paddingStart="24dp" android:paddingTop="24dp" - android:text="kill process (splash screen impl)" - android:textColor="@color/brickOrange" - android:textSize="16sp" - android:textStyle="normal" /> - - @@ -79,7 +59,7 @@ android:paddingTop="17dp" android:text="@string/fireCancel" android:textColor="@color/brownishGray" - app:layout_constraintTop_toBottomOf="@id/clearAllOptionNewActivity" + app:layout_constraintTop_toBottomOf="@id/clearAllOption" android:textSize="16sp" android:textStyle="normal" tools:ignore="UnusedAttribute" /> From 26981e20dbd20a908d1cf4cad15e8315dafbd06e Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Mon, 20 Aug 2018 16:17:31 +0100 Subject: [PATCH 06/27] Move fire process name to strings resources --- app/src/main/AndroidManifest.xml | 2 +- .../main/java/com/duckduckgo/app/fire/FireSplashActivity.kt | 5 +++-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f38187ea405a..ee34206826bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -134,7 +134,7 @@ android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/title_activity_fire" android:theme="@style/SplashTheme" - android:process=":fire" /> + android:process="@string/fireProcessName" /> \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt index 04b539746798..9c48d1df3391 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt @@ -25,6 +25,7 @@ import android.os.Handler import android.os.Process import androidx.core.os.postDelayed import com.duckduckgo.app.browser.BrowserActivity +import com.duckduckgo.app.browser.R import com.duckduckgo.app.global.DuckDuckGoActivity import timber.log.Timber @@ -87,8 +88,8 @@ class FireSplashActivity : DuckDuckGoActivity() { val currentProcessId = Process.myPid() val activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager activityManager.runningAppProcesses?.forEach { - if(it.pid == currentProcessId && it.processName.endsWith(":fire")) { - Timber.e("Process ID $currentProcessId is fire process") + if (it.pid == currentProcessId && it.processName.endsWith(context.getString(R.string.fireProcessName))) { + Timber.i("Process ID $currentProcessId is fire process") return true } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 422043632aab..9218395e3668 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,6 +152,7 @@ Clear All Tabs and Data Cancel Data cleared + :fire Settings From 4cc54152db217b75059421660a562253b89f5eca Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 16:53:35 +0100 Subject: [PATCH 07/27] Add Lottie to project --- app/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 7b5a0277710a..82fe1cc04d70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,6 +86,7 @@ ext { ankoVersion = "0.10.4" glide = "4.6.1" androidTestRunner = "1.0.2" + lottieVersion = "2.6.0-beta19" } @@ -141,6 +142,9 @@ dependencies { implementation "com.github.bumptech.glide:glide:$glide" kapt "com.github.bumptech.glide:compiler:$glide" + // Lottie + implementation "com.airbnb.android:lottie:$lottieVersion" + // Apache commons implementation 'org.apache.commons:commons-math3:3.6.1' From fcd58c3f8a8b0dd7d0c98bf88fb041d2dae934b0 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 16:54:27 +0100 Subject: [PATCH 08/27] Add flame animation --- app/src/main/res/raw/flame_v2.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/raw/flame_v2.json diff --git a/app/src/main/res/raw/flame_v2.json b/app/src/main/res/raw/flame_v2.json new file mode 100644 index 000000000000..acec78b76e3f --- /dev/null +++ b/app/src/main/res/raw/flame_v2.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":60,"ip":0,"op":121,"w":240,"h":720,"nm":"v2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ember-L","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":85,"s":[100],"e":[0]},{"t":90}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[86.802,458.802,0],"e":[86.802,347.802,0],"to":[0,-18.5,0],"ti":[0,18.5,0]},{"t":90}],"ix":2},"a":{"a":0,"k":[2.793,6.527,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-2.37],[0,0],[0,0],[0,2.38]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,0],[0,0],[4.19,4.19],[4.19,9.79],[4.19,9.79],[0,5.59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ember-M","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-37,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-32,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":73,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":83,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":128,"s":[100],"e":[0]},{"t":133}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-37,"s":[117.132,393.562,0],"e":[117.132,273.562,0],"to":[0,-20,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[117.132,273.562,0],"e":[117.132,393.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[117.132,393.562,0],"e":[117.132,273.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73,"s":[117.132,273.562,0],"e":[117.132,393.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[117.132,393.562,0],"e":[117.132,273.562,0],"to":[0,0,0],"ti":[0,20,0]},{"t":133}],"ix":2},"a":{"a":0,"k":[2.793,8.387,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.38],[0,0],[0,0],[0,-2.37]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,12.58],[0,12.58],[4.19,8.39],[4.19,0],[4.19,0],[0,4.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-37,"op":203,"st":-37,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"ember-R","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112,"s":[100],"e":[0]},{"t":117}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[159.132,426.562,0],"e":[159.132,366.562,0],"to":[0,-10,0],"ti":[0,10,0]},{"t":117}],"ix":2},"a":{"a":0,"k":[2.793,8.387,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.38],[0,0],[0,0],[0,-2.37]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,12.58],[0,12.58],[4.19,8.39],[4.19,0],[4.19,0],[0,4.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"flame_inner","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.381,65.866,0],"ix":2},"a":{"a":0,"k":[10.616,9.625,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.79,7.4],[17.21,4.41],[0,-0.16],[-12.3,10.62]],"o":[[0,15.79],[0,0],[2.03,4.22],[6.88,-5.94]],"v":[[26.08,0],[0,20.32],[0,20.48],[27.28,24.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.844439983368,0.541962981224,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[66.667,66.667],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"flame_outer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[118.642,504.682,0],"e":[118.642,519.682,0],"to":[0,2.5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[118.642,519.682,0],"e":[118.642,504.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[118.642,504.682,0],"e":[118.642,519.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[118.642,519.682,0],"e":[118.642,504.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[118.642,504.682,0],"e":[118.642,519.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[118.642,519.682,0],"e":[118.642,504.682,0],"to":[0,0,0],"ti":[0,2.5,0]},{"t":120}],"ix":2},"a":{"a":0,"k":[41.367,50.513,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.47,5.31],[3.21,1.54],[1.67,1.68],[-1.12,3.77],[0,0.14],[-0.42,0.7],[0.14,0],[0,0],[0,0],[0.28,0],[0,0],[0,-7.41],[0,-6.43],[6.84,-0.28],[0.28,0],[0,6.71],[-0.28,1.11],[0.28,0],[0,-0.14],[-0.28,-8.25],[-10.06,-4.89],[-0.14,0],[0,0],[-0.42,-0.28],[0,0],[0,0],[0,-0.14],[-0.42,-0.14],[-0.28,-0.14],[-0.7,-0.14],[-0.7,-0.14],[0,0],[-0.7,-0.14],[-0.42,0],[-0.69,0],[0,17.19]],"o":[[-2.37,-2.8],[-2.51,-1.25],[-2.8,-2.8],[0,-0.14],[0.28,-0.98],[-0.14,0],[0,0],[0,0],[-0.28,0],[0,0],[-3.49,0.84],[0,7.55],[0,4.47],[-0.14,0],[-6.71,0],[0,-1.26],[0.14,-0.28],[-0.14,0],[-4.89,5.73],[0.56,11.6],[0,0],[0,0],[0.56,0.28],[0,0],[0,0],[0,0],[0.42,0.14],[0.27,0.14],[0.7,0.28],[0.7,0.14],[0,0],[0.55,0.14],[0.42,0],[0.7,0],[17.19,0],[0,-7.41]],"v":[[54.92,24.89],[46.4,18.45],[39.98,13.7],[37.18,2.94],[37.32,2.52],[38.58,0],[37.74,0.14],[37.6,0.14],[37.46,0.14],[36.76,0.28],[36.76,0.28],[27.68,13],[30.34,29.64],[20.28,40.96],[19.72,40.96],[7.56,28.8],[8.12,25.03],[7.7,24.47],[7.42,24.61],[0.02,46.14],[17.62,72.7],[17.9,72.7],[17.76,72.7],[19.3,73.4],[19.3,73.4],[19.44,73.4],[19.58,73.54],[20.84,73.96],[21.53,74.24],[23.63,74.8],[25.73,75.22],[25.73,75.22],[27.54,75.5],[28.66,75.63],[30.89,75.77],[62.05,44.6]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":80,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[25],"e":[35]},{"t":140}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.352,620.572,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":40,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":60,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":80,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":100,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":120,"s":[135,135,100],"e":[150,150,100]},{"t":140}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[70,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From fbfe4c29c88488e988e6d10615b108c8779d8b5d Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 16:55:19 +0100 Subject: [PATCH 09/27] Remove fire splash activity layer list --- .../res/drawable/fire_splash_activity.xml | 27 ------------------- app/src/main/res/values/styles.xml | 3 +-- 2 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 app/src/main/res/drawable/fire_splash_activity.xml diff --git a/app/src/main/res/drawable/fire_splash_activity.xml b/app/src/main/res/drawable/fire_splash_activity.xml deleted file mode 100644 index 90d205529d87..000000000000 --- a/app/src/main/res/drawable/fire_splash_activity.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 39b27256077b..e67658df1f1f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -267,8 +267,7 @@ From 9df8cd2f094d33412b649e1d3d6b2520c2bce4a5 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 16:56:09 +0100 Subject: [PATCH 10/27] Fix BrowserActivity menu xml reference --- app/src/main/res/layout/activity_browser.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_browser.xml b/app/src/main/res/layout/activity_browser.xml index a328d7925641..47bd9f295d57 100644 --- a/app/src/main/res/layout/activity_browser.xml +++ b/app/src/main/res/layout/activity_browser.xml @@ -22,7 +22,7 @@ android:layout_height="match_parent" app:layout_scrollFlags="scroll|enterAlways" tools:context="com.duckduckgo.app.browser.BrowserActivity" - tools:menu="menu_browser_activity"> + tools:menu="@menu/menu_browser_activity"> Date: Wed, 22 Aug 2018 16:56:31 +0100 Subject: [PATCH 11/27] Show toast upon re-entering app after fire animation --- .../java/com/duckduckgo/app/browser/BrowserActivity.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt index 2cf32d0cbe62..b8c4eb7d21d8 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt @@ -129,6 +129,11 @@ class BrowserActivity : DuckDuckGoActivity() { return } + if(intent.getBooleanExtra(LAUNCHED_FROM_FIRE_EXTRA, false)) { + Timber.i("Launched from fire") + Toast.makeText(applicationContext, R.string.fireDataCleared, Toast.LENGTH_LONG).show() + } + if (launchNewSearch(intent)) { viewModel.onNewTabRequested() return @@ -233,15 +238,17 @@ class BrowserActivity : DuckDuckGoActivity() { companion object { - fun intent(context: Context, queryExtra: String? = null, newSearch: Boolean = false): Intent { + fun intent(context: Context, queryExtra: String? = null, newSearch: Boolean = false, launchedFromFireAction: Boolean = false): Intent { val intent = Intent(context, BrowserActivity::class.java) intent.putExtra(EXTRA_TEXT, queryExtra) intent.putExtra(NEW_SEARCH_EXTRA, newSearch) + intent.putExtra(LAUNCHED_FROM_FIRE_EXTRA, launchedFromFireAction) return intent } const val NEW_SEARCH_EXTRA = "NEW_SEARCH_EXTRA" const val PERFORM_FIRE_ON_ENTRY_EXTRA = "PERFORM_FIRE_ON_ENTRY_EXTRA" + const val LAUNCHED_FROM_FIRE_EXTRA = "LAUNCHED_FROM_FIRE_EXTRA" private const val DASHBOARD_REQUEST_CODE = 100 } From 678c0d41cf19ea71f9e86b92336f5c4b7407148f Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 16:57:12 +0100 Subject: [PATCH 12/27] Configure FireSplashActivity to show Lottie fire animation --- .../duckduckgo/app/fire/FireSplashActivity.kt | 30 +++++++++++++------ app/src/main/res/layout/activity_fire.xml | 25 +++++++++------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt index 9c48d1df3391..9774b9929f3b 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireSplashActivity.kt @@ -23,10 +23,13 @@ import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Process +import android.support.v4.app.ActivityOptionsCompat import androidx.core.os.postDelayed +import androidx.core.view.doOnPreDraw import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.R import com.duckduckgo.app.global.DuckDuckGoActivity +import kotlinx.android.synthetic.main.activity_fire.* import timber.log.Timber /** @@ -42,12 +45,15 @@ class FireSplashActivity : DuckDuckGoActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContentView(R.layout.activity_fire) - Handler().postDelayed(ACTIVITY_FINISH_DELAY_MS) { - val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) - startActivity(intent) - finish() - killProcess() + root.doOnPreDraw { + Handler().postDelayed(ACTIVITY_FINISH_DELAY_MS) { + val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) + startActivity(intent, activityFadeOptions(this)) + finish() + killProcess() + } } } @@ -56,7 +62,7 @@ class FireSplashActivity : DuckDuckGoActivity() { } companion object { - private const val ACTIVITY_FINISH_DELAY_MS = 600L + private const val ACTIVITY_FINISH_DELAY_MS = 1200L private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" fun triggerRebirth(context: Context) { @@ -65,9 +71,10 @@ class FireSplashActivity : DuckDuckGoActivity() { private fun triggerRebirth(context: Context, nextIntent: Intent) { val intent = Intent(context, FireSplashActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // In case we are called with non-Activity context. + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.putExtra(KEY_RESTART_INTENTS, nextIntent) - context.startActivity(intent) + + context.startActivity(intent, activityFadeOptions(context)) if (context is Activity) { context.finish() } @@ -75,7 +82,7 @@ class FireSplashActivity : DuckDuckGoActivity() { } private fun getRestartIntent(context: Context): Intent { - val intent = BrowserActivity.intent(context) + val intent = BrowserActivity.intent(context, launchedFromFireAction = true) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) return intent } @@ -95,5 +102,10 @@ class FireSplashActivity : DuckDuckGoActivity() { } return false } + + private fun activityFadeOptions(context: Context) : Bundle? { + val config = ActivityOptionsCompat.makeCustomAnimation(context, android.R.anim.fade_in, android.R.anim.fade_out) + return config.toBundle() + } } } diff --git a/app/src/main/res/layout/activity_fire.xml b/app/src/main/res/layout/activity_fire.xml index 05e5df098792..ae61424d5b31 100644 --- a/app/src/main/res/layout/activity_fire.xml +++ b/app/src/main/res/layout/activity_fire.xml @@ -15,22 +15,27 @@ --> + android:background="@color/windowBackground" + tools:context="com.duckduckgo.app.fire.FireSplashActivity"> - + app:layout_constraintVertical_bias="0.4" + app:lottie_autoPlay="true" + app:lottie_loop="true" + app:lottie_rawRes="@raw/flame_v2" /> From e9f5f43ea1932a2eb9b4b93bc0343e832e058550 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 17:05:07 +0100 Subject: [PATCH 13/27] Rename FireSplashActivity to FireActivity --- app/src/main/AndroidManifest.xml | 2 +- .../main/java/com/duckduckgo/app/di/AndroidBindingModule.kt | 4 ++-- .../app/fire/{FireSplashActivity.kt => FireActivity.kt} | 4 ++-- .../java/com/duckduckgo/app/global/DuckDuckGoApplication.kt | 4 ++-- .../com/duckduckgo/app/global/view/ClearPersonalDataAction.kt | 4 ++-- app/src/main/res/layout/activity_fire.xml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) rename app/src/main/java/com/duckduckgo/app/fire/{FireSplashActivity.kt => FireActivity.kt} (97%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ee34206826bd..166cbbc6ab99 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -130,7 +130,7 @@ android:theme="@style/ModalCardTheme" /> + tools:context="com.duckduckgo.app.fire.FireActivity"> Date: Wed, 22 Aug 2018 17:06:17 +0100 Subject: [PATCH 14/27] Subclass FireActivity from AppCompatActivity to avoid dagger binding --- .../main/java/com/duckduckgo/app/di/AndroidBindingModule.kt | 5 ----- app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt b/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt index 42cedce847a2..defec5f4e6cc 100644 --- a/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt @@ -21,7 +21,6 @@ import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.BrowserTabFragment import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserInfoActivity import com.duckduckgo.app.feedback.ui.FeedbackActivity -import com.duckduckgo.app.fire.FireActivity import com.duckduckgo.app.job.AppConfigurationJobService import com.duckduckgo.app.launch.LaunchActivity import com.duckduckgo.app.onboarding.ui.OnboardingActivity @@ -88,10 +87,6 @@ abstract class AndroidBindingModule { @ContributesAndroidInjector abstract fun defaultBrowserInfoActivity(): DefaultBrowserInfoActivity - @ActivityScoped - @ContributesAndroidInjector - abstract fun fireActivity(): FireActivity - /* Fragments */ @ContributesAndroidInjector diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt index bb757af0c029..8dd7b1c03433 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -24,11 +24,11 @@ import android.os.Bundle import android.os.Handler import android.os.Process import android.support.v4.app.ActivityOptionsCompat +import android.support.v7.app.AppCompatActivity import androidx.core.os.postDelayed import androidx.core.view.doOnPreDraw import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.R -import com.duckduckgo.app.global.DuckDuckGoActivity import kotlinx.android.synthetic.main.activity_fire.* import timber.log.Timber @@ -41,7 +41,7 @@ import timber.log.Timber * * This Activity was largely inspired by https://github.com/JakeWharton/ProcessPhoenix */ -class FireActivity : DuckDuckGoActivity() { +class FireActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -103,7 +103,7 @@ class FireActivity : DuckDuckGoActivity() { return false } - private fun activityFadeOptions(context: Context) : Bundle? { + private fun activityFadeOptions(context: Context): Bundle? { val config = ActivityOptionsCompat.makeCustomAnimation(context, android.R.anim.fade_in, android.R.anim.fade_out) return config.toBundle() } From 031623bbab25d887364ac63a7efb8e9556feddec Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Wed, 22 Aug 2018 17:10:58 +0100 Subject: [PATCH 15/27] Re-center animation vertically --- app/src/main/res/layout/activity_fire.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/activity_fire.xml b/app/src/main/res/layout/activity_fire.xml index dfae30a0f763..76ace72d0bfc 100644 --- a/app/src/main/res/layout/activity_fire.xml +++ b/app/src/main/res/layout/activity_fire.xml @@ -32,7 +32,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.4" app:lottie_autoPlay="true" app:lottie_loop="true" app:lottie_rawRes="@raw/flame_v2" /> From 828da0a89b1dd6220a482ad517a483f1ae542502 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Thu, 23 Aug 2018 11:23:18 +0100 Subject: [PATCH 16/27] Update bitrise.yml with latest config using VDT --- bitrise.yml | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index 2f2205ec48be..fcfc46207f66 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -2,13 +2,27 @@ format_version: '5' default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git project_type: android -trigger_map: -- push_branch: "*" - workflow: primary -- pull_request_source_branch: "*" - workflow: primary workflows: - primary: + vdt: + steps: + - activate-ssh-key: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@4.0.11: {} + - cache-pull@2.0.1: {} + - install-missing-android-tools@2.2.0: {} + - gradle-runner@1.8.3: + inputs: + - gradle_task: assembleDebug assembleDebugAndroidTest + title: Build APK + - virtual-device-testing-for-android@1.0.2: + inputs: + - test_devices: |- + NexusLowRes,26,en,portrait + Nexus4,21,en,portrait + - test_type: instrumentation + - deploy-to-bitrise-io: {} + - cache-push@2.0.5: {} + primary-backup: steps: - avd-manager@0.9.2: inputs: @@ -59,3 +73,8 @@ app: - opts: is_expand: false TEST_VARIANT: Debug +trigger_map: +- push_branch: feature/* + workflow: vdt +- pull_request_source_branch: "*" + workflow: vdt From c3bcb03f2846204520963c07378b45f61332cf4f Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:18:05 +0100 Subject: [PATCH 17/27] Update to latest AGP plugin --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 671b7995c3e4..d4953fb5438d 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-beta05' + classpath 'com.android.tools.build:gradle:3.2.0-rc01' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 1ba86555505e38ced1965867934e391aff66ebd5 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:19:33 +0100 Subject: [PATCH 18/27] Ensure FireActivity doesn't re-spawn Browser if user navigates away --- .../duckduckgo/app/fire/FireViewModelTest.kt | 79 +++++++++++++++++++ app/src/main/AndroidManifest.xml | 1 - .../duckduckgo/app/di/AndroidBindingModule.kt | 5 ++ .../com/duckduckgo/app/fire/FireActivity.kt | 67 ++++++++++++---- .../com/duckduckgo/app/fire/FireViewModel.kt | 64 +++++++++++++++ .../app/fire/LottieAnimationListener.kt | 31 ++++++++ .../duckduckgo/app/global/ViewModelFactory.kt | 2 + app/src/main/res/layout/activity_fire.xml | 7 +- app/src/main/res/raw/flame_v2.json | 2 +- 9 files changed, 239 insertions(+), 19 deletions(-) create mode 100644 app/src/androidTest/java/com/duckduckgo/app/fire/FireViewModelTest.kt create mode 100644 app/src/main/java/com/duckduckgo/app/fire/FireViewModel.kt create mode 100644 app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt diff --git a/app/src/androidTest/java/com/duckduckgo/app/fire/FireViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/fire/FireViewModelTest.kt new file mode 100644 index 000000000000..60d31e1b337e --- /dev/null +++ b/app/src/androidTest/java/com/duckduckgo/app/fire/FireViewModelTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.fire + +import android.arch.core.executor.testing.InstantTaskExecutorRule +import android.support.test.annotation.UiThreadTest +import com.duckduckgo.app.InstantSchedulersRule +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test + + +class FireViewModelTest { + + @Rule + @JvmField + val schedulers = InstantSchedulersRule() + + @Rule + @JvmField + var instantTaskExecutorRule = InstantTaskExecutorRule() + + private lateinit var viewState: FireViewModel.ViewState + private lateinit var testee: FireViewModel + + @UiThreadTest + @Before + fun setup() { + testee = FireViewModel() + testee.viewState.observeForever { viewState = it!! } + } + + @Test + fun whenViewModelInitialisedThenAutoStartEnabled() { + assertTrue(viewState.autoStart) + } + + @Test + fun whenViewModelInitialisedThenAnimationEnabled() { + assertTrue(viewState.animate) + } + + @Test + fun whenTimerReachedThenAnimationDisabled() { + testee.startDeathClock() + assertFalse(viewState.animate) + } + + @Test + fun whenUserLeftActivityThenAutoStartDisabled() { + testee.onViewStopped() + assertFalse(viewState.autoStart) + } + + @Test + fun whenUserLeftActivityThenReturnedThenAutoStartEnabled() { + testee.onViewStopped() + assertFalse(viewState.autoStart) + + testee.onViewRestarted() + assertTrue(viewState.autoStart) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 166cbbc6ab99..c986fceedf89 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -131,7 +131,6 @@ diff --git a/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt b/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt index defec5f4e6cc..42cedce847a2 100644 --- a/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt +++ b/app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt @@ -21,6 +21,7 @@ import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.BrowserTabFragment import com.duckduckgo.app.browser.defaultBrowsing.DefaultBrowserInfoActivity import com.duckduckgo.app.feedback.ui.FeedbackActivity +import com.duckduckgo.app.fire.FireActivity import com.duckduckgo.app.job.AppConfigurationJobService import com.duckduckgo.app.launch.LaunchActivity import com.duckduckgo.app.onboarding.ui.OnboardingActivity @@ -87,6 +88,10 @@ abstract class AndroidBindingModule { @ContributesAndroidInjector abstract fun defaultBrowserInfoActivity(): DefaultBrowserInfoActivity + @ActivityScoped + @ContributesAndroidInjector + abstract fun fireActivity(): FireActivity + /* Fragments */ @ContributesAndroidInjector diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt index 8dd7b1c03433..0f01f8701e65 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -16,21 +16,22 @@ package com.duckduckgo.app.fire +import android.animation.Animator import android.app.Activity import android.app.ActivityManager +import android.arch.lifecycle.Observer +import android.arch.lifecycle.ViewModelProviders import android.content.Context import android.content.Intent import android.os.Bundle -import android.os.Handler import android.os.Process import android.support.v4.app.ActivityOptionsCompat -import android.support.v7.app.AppCompatActivity -import androidx.core.os.postDelayed -import androidx.core.view.doOnPreDraw import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.R +import com.duckduckgo.app.global.DuckDuckGoActivity +import com.duckduckgo.app.global.ViewModelFactory import kotlinx.android.synthetic.main.activity_fire.* -import timber.log.Timber +import javax.inject.Inject /** * Activity which is responsible for killing the main process and restarting it. This Activity will automatically finish itself after a brief time. @@ -40,29 +41,68 @@ import timber.log.Timber * The correct way to invoke this Activity is through its `triggerRebirth(context)` method. * * This Activity was largely inspired by https://github.com/JakeWharton/ProcessPhoenix + * + * We need to detect the user leaving this activity and possibly returning to it: + * if the user left our app to do something else, restarting our browser activity would feel wrong + * if the user left our app but came back, we should restart the browser activity */ -class FireActivity : AppCompatActivity() { +class FireActivity : DuckDuckGoActivity() { + + @Inject + lateinit var viewModelFactory: ViewModelFactory + + private val viewModel: FireViewModel by lazy { + ViewModelProviders.of(this, viewModelFactory).get(FireViewModel::class.java) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_fire) + if (savedInstanceState == null) { + + fireAnimationView.addAnimatorListener(object : LottieAnimationListener() { + override fun onAnimationStart(p0: Animator?) { + viewModel.startDeathClock() + } + }) + } + + viewModel.viewState.observe(this, Observer { + it?.let { viewState -> + if (!viewState.animate) { - root.doOnPreDraw { - Handler().postDelayed(ACTIVITY_FINISH_DELAY_MS) { - val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) - startActivity(intent, activityFadeOptions(this)) - finish() - killProcess() + if (viewState.autoStart) { + val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) + startActivity(intent, activityFadeOptions(this)) + } + + + viewModel.viewState.removeObservers(this) + finish() + killProcess() + } } + }) + } + + override fun onStop() { + super.onStop() + + if (!isChangingConfigurations) { + viewModel.onViewStopped() } } + override fun onRestart() { + super.onRestart() + viewModel.onViewRestarted() + } + override fun onBackPressed() { // do nothing - the activity will kill itself soon enough } companion object { - private const val ACTIVITY_FINISH_DELAY_MS = 1200L private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" fun triggerRebirth(context: Context) { @@ -96,7 +136,6 @@ class FireActivity : AppCompatActivity() { val activityManager: ActivityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager activityManager.runningAppProcesses?.forEach { if (it.pid == currentProcessId && it.processName.endsWith(context.getString(R.string.fireProcessName))) { - Timber.i("Process ID $currentProcessId is fire process") return true } } diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireViewModel.kt b/app/src/main/java/com/duckduckgo/app/fire/FireViewModel.kt new file mode 100644 index 000000000000..74a1f691c749 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/fire/FireViewModel.kt @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.fire + +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.ViewModel +import io.reactivex.Completable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import java.util.concurrent.TimeUnit + + +class FireViewModel : ViewModel() { + + private var disposable: Disposable? = null + + val viewState: MutableLiveData = MutableLiveData().apply { + value = ViewState() + } + + fun startDeathClock() { + disposable = Completable.complete() + .delay(ANIMATION_FINISH_DELAY_MS, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + viewState.value = currentViewState().copy(animate = false) + } + } + + fun onViewStopped() { + viewState.value = currentViewState().copy(autoStart = false) + } + + fun onViewRestarted() { + viewState.value = currentViewState().copy(autoStart = true) + } + + private fun currentViewState(): ViewState { + return viewState.value!! + } + + data class ViewState( + val animate: Boolean = true, + val autoStart: Boolean = true + ) + + companion object { + private const val ANIMATION_FINISH_DELAY_MS = 1500L + } +} \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt b/app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt new file mode 100644 index 000000000000..ada29c6a3113 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.fire + +import android.animation.Animator + + +abstract class LottieAnimationListener : Animator.AnimatorListener { + + override fun onAnimationStart(p0: Animator?) {} + + override fun onAnimationCancel(p0: Animator?) {} + + override fun onAnimationEnd(p0: Animator?) {} + + override fun onAnimationRepeat(p0: Animator?) {} +} \ No newline at end of file diff --git a/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt b/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt index 209bbf8eca8b..19811686d995 100644 --- a/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt +++ b/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt @@ -29,6 +29,7 @@ import com.duckduckgo.app.browser.omnibar.QueryUrlConverter import com.duckduckgo.app.browser.session.WebViewSessionStorage import com.duckduckgo.app.feedback.api.FeedbackSender import com.duckduckgo.app.feedback.ui.FeedbackViewModel +import com.duckduckgo.app.fire.FireViewModel import com.duckduckgo.app.global.db.AppConfigurationDao import com.duckduckgo.app.global.model.SiteFactory import com.duckduckgo.app.launch.LaunchViewModel @@ -95,6 +96,7 @@ class ViewModelFactory @Inject constructor( isAssignableFrom(FeedbackViewModel::class.java) -> FeedbackViewModel(feedbackSender) isAssignableFrom(SettingsViewModel::class.java) -> SettingsViewModel(appSettingsPreferencesStore, defaultBrowserDetector, variantManager) isAssignableFrom(BookmarksViewModel::class.java) -> BookmarksViewModel(bookmarksDao) + isAssignableFrom(FireViewModel::class.java) -> FireViewModel() else -> throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") } } as T diff --git a/app/src/main/res/layout/activity_fire.xml b/app/src/main/res/layout/activity_fire.xml index 76ace72d0bfc..651205f9c045 100644 --- a/app/src/main/res/layout/activity_fire.xml +++ b/app/src/main/res/layout/activity_fire.xml @@ -25,8 +25,8 @@ + app:lottie_rawRes="@raw/flame_v2" + tools:background="#F00" /> diff --git a/app/src/main/res/raw/flame_v2.json b/app/src/main/res/raw/flame_v2.json index acec78b76e3f..ada8feb00e88 100644 --- a/app/src/main/res/raw/flame_v2.json +++ b/app/src/main/res/raw/flame_v2.json @@ -1 +1 @@ -{"v":"5.2.1","fr":60,"ip":0,"op":121,"w":240,"h":720,"nm":"v2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ember-L","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":85,"s":[100],"e":[0]},{"t":90}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[86.802,458.802,0],"e":[86.802,347.802,0],"to":[0,-18.5,0],"ti":[0,18.5,0]},{"t":90}],"ix":2},"a":{"a":0,"k":[2.793,6.527,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-2.37],[0,0],[0,0],[0,2.38]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,0],[0,0],[4.19,4.19],[4.19,9.79],[4.19,9.79],[0,5.59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ember-M","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-37,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-32,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":73,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":83,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":128,"s":[100],"e":[0]},{"t":133}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-37,"s":[117.132,393.562,0],"e":[117.132,273.562,0],"to":[0,-20,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[117.132,273.562,0],"e":[117.132,393.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[117.132,393.562,0],"e":[117.132,273.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73,"s":[117.132,273.562,0],"e":[117.132,393.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[117.132,393.562,0],"e":[117.132,273.562,0],"to":[0,0,0],"ti":[0,20,0]},{"t":133}],"ix":2},"a":{"a":0,"k":[2.793,8.387,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.38],[0,0],[0,0],[0,-2.37]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,12.58],[0,12.58],[4.19,8.39],[4.19,0],[4.19,0],[0,4.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-37,"op":203,"st":-37,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"ember-R","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112,"s":[100],"e":[0]},{"t":117}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[159.132,426.562,0],"e":[159.132,366.562,0],"to":[0,-10,0],"ti":[0,10,0]},{"t":117}],"ix":2},"a":{"a":0,"k":[2.793,8.387,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.38],[0,0],[0,0],[0,-2.37]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,12.58],[0,12.58],[4.19,8.39],[4.19,0],[4.19,0],[0,4.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"flame_inner","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.381,65.866,0],"ix":2},"a":{"a":0,"k":[10.616,9.625,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.79,7.4],[17.21,4.41],[0,-0.16],[-12.3,10.62]],"o":[[0,15.79],[0,0],[2.03,4.22],[6.88,-5.94]],"v":[[26.08,0],[0,20.32],[0,20.48],[27.28,24.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.844439983368,0.541962981224,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[66.667,66.667],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"flame_outer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[118.642,504.682,0],"e":[118.642,519.682,0],"to":[0,2.5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[118.642,519.682,0],"e":[118.642,504.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[118.642,504.682,0],"e":[118.642,519.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[118.642,519.682,0],"e":[118.642,504.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[118.642,504.682,0],"e":[118.642,519.682,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[118.642,519.682,0],"e":[118.642,504.682,0],"to":[0,0,0],"ti":[0,2.5,0]},{"t":120}],"ix":2},"a":{"a":0,"k":[41.367,50.513,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.47,5.31],[3.21,1.54],[1.67,1.68],[-1.12,3.77],[0,0.14],[-0.42,0.7],[0.14,0],[0,0],[0,0],[0.28,0],[0,0],[0,-7.41],[0,-6.43],[6.84,-0.28],[0.28,0],[0,6.71],[-0.28,1.11],[0.28,0],[0,-0.14],[-0.28,-8.25],[-10.06,-4.89],[-0.14,0],[0,0],[-0.42,-0.28],[0,0],[0,0],[0,-0.14],[-0.42,-0.14],[-0.28,-0.14],[-0.7,-0.14],[-0.7,-0.14],[0,0],[-0.7,-0.14],[-0.42,0],[-0.69,0],[0,17.19]],"o":[[-2.37,-2.8],[-2.51,-1.25],[-2.8,-2.8],[0,-0.14],[0.28,-0.98],[-0.14,0],[0,0],[0,0],[-0.28,0],[0,0],[-3.49,0.84],[0,7.55],[0,4.47],[-0.14,0],[-6.71,0],[0,-1.26],[0.14,-0.28],[-0.14,0],[-4.89,5.73],[0.56,11.6],[0,0],[0,0],[0.56,0.28],[0,0],[0,0],[0,0],[0.42,0.14],[0.27,0.14],[0.7,0.28],[0.7,0.14],[0,0],[0.55,0.14],[0.42,0],[0.7,0],[17.19,0],[0,-7.41]],"v":[[54.92,24.89],[46.4,18.45],[39.98,13.7],[37.18,2.94],[37.32,2.52],[38.58,0],[37.74,0.14],[37.6,0.14],[37.46,0.14],[36.76,0.28],[36.76,0.28],[27.68,13],[30.34,29.64],[20.28,40.96],[19.72,40.96],[7.56,28.8],[8.12,25.03],[7.7,24.47],[7.42,24.61],[0.02,46.14],[17.62,72.7],[17.9,72.7],[17.76,72.7],[19.3,73.4],[19.3,73.4],[19.44,73.4],[19.58,73.54],[20.84,73.96],[21.53,74.24],[23.63,74.8],[25.73,75.22],[25.73,75.22],[27.54,75.5],[28.66,75.63],[30.89,75.77],[62.05,44.6]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":80,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[25],"e":[35]},{"t":140}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.352,620.572,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":40,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":60,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":80,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":100,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":120,"s":[135,135,100],"e":[150,150,100]},{"t":140}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[70,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.2.1","fr":60,"ip":0,"op":121,"w":240,"h":480,"nm":"v2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ember-L","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":85,"s":[100],"e":[0]},{"t":90}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[86.802,201.735,0],"e":[86.802,90.735,0],"to":[0,-18.5,0],"ti":[0,18.5,0]},{"t":90}],"ix":2},"a":{"a":0,"k":[2.793,6.527,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-2.37],[0,0],[0,0],[0,2.38]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,0],[0,0],[4.19,4.19],[4.19,9.79],[4.19,9.79],[0,5.59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ember-M","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-37,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":-32,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":73,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":83,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":128,"s":[100],"e":[0]},{"t":133}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-37,"s":[117.132,136.495,0],"e":[117.132,16.495,0],"to":[0,-20,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[117.132,16.495,0],"e":[117.132,136.495,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[117.132,136.495,0],"e":[117.132,16.495,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73,"s":[117.132,16.495,0],"e":[117.132,136.495,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[117.132,136.495,0],"e":[117.132,16.495,0],"to":[0,0,0],"ti":[0,20,0]},{"t":133}],"ix":2},"a":{"a":0,"k":[2.793,8.387,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.38],[0,0],[0,0],[0,-2.37]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,12.58],[0,12.58],[4.19,8.39],[4.19,0],[4.19,0],[0,4.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-37,"op":203,"st":-37,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"ember-R","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112,"s":[100],"e":[0]},{"t":117}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[159.132,169.495,0],"e":[159.132,109.495,0],"to":[0,-10,0],"ti":[0,10,0]},{"t":117}],"ix":2},"a":{"a":0,"k":[2.793,8.387,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,2.38],[0,0],[0,0],[0,-2.37]],"o":[[0,0],[2.37,0],[0,0],[0,0],[-2.37,0],[0,0]],"v":[[0,12.58],[0,12.58],[4.19,8.39],[4.19,0],[4.19,0],[0,4.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"flame_inner","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.381,69.366,0],"ix":2},"a":{"a":0,"k":[10.616,9.625,0],"ix":1},"s":{"a":0,"k":[200,200,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.79,7.4],[17.21,4.41],[0,-0.16],[-12.3,10.62]],"o":[[0,15.79],[0,0],[2.03,4.22],[6.88,-5.94]],"v":[[26.08,0],[0,20.32],[0,20.48],[27.28,24.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.844439983368,0.541962981224,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[66.667,66.667],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"flame_outer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[118.642,247.615,0],"e":[118.642,262.615,0],"to":[0,2.5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[118.642,262.615,0],"e":[118.642,247.615,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[118.642,247.615,0],"e":[118.642,262.615,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[118.642,262.615,0],"e":[118.642,247.615,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[118.642,247.615,0],"e":[118.642,262.615,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[118.642,262.615,0],"e":[118.642,247.615,0],"to":[0,0,0],"ti":[0,2.5,0]},{"t":120}],"ix":2},"a":{"a":0,"k":[41.367,50.513,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.47,5.31],[3.21,1.54],[1.67,1.68],[-1.12,3.77],[0,0.14],[-0.42,0.7],[0.14,0],[0,0],[0,0],[0.28,0],[0,0],[0,-7.41],[0,-6.43],[6.84,-0.28],[0.28,0],[0,6.71],[-0.28,1.11],[0.28,0],[0,-0.14],[-0.28,-8.25],[-10.06,-4.89],[-0.14,0],[0,0],[-0.42,-0.28],[0,0],[0,0],[0,-0.14],[-0.42,-0.14],[-0.28,-0.14],[-0.7,-0.14],[-0.7,-0.14],[0,0],[-0.7,-0.14],[-0.42,0],[-0.69,0],[0,17.19]],"o":[[-2.37,-2.8],[-2.51,-1.25],[-2.8,-2.8],[0,-0.14],[0.28,-0.98],[-0.14,0],[0,0],[0,0],[-0.28,0],[0,0],[-3.49,0.84],[0,7.55],[0,4.47],[-0.14,0],[-6.71,0],[0,-1.26],[0.14,-0.28],[-0.14,0],[-4.89,5.73],[0.56,11.6],[0,0],[0,0],[0.56,0.28],[0,0],[0,0],[0,0],[0.42,0.14],[0.27,0.14],[0.7,0.28],[0.7,0.14],[0,0],[0.55,0.14],[0.42,0],[0.7,0],[17.19,0],[0,-7.41]],"v":[[54.92,24.89],[46.4,18.45],[39.98,13.7],[37.18,2.94],[37.32,2.52],[38.58,0],[37.74,0.14],[37.6,0.14],[37.46,0.14],[36.76,0.28],[36.76,0.28],[27.68,13],[30.34,29.64],[20.28,40.96],[19.72,40.96],[7.56,28.8],[8.12,25.03],[7.7,24.47],[7.42,24.61],[0.02,46.14],[17.62,72.7],[17.9,72.7],[17.76,72.7],[19.3,73.4],[19.3,73.4],[19.44,73.4],[19.58,73.54],[20.84,73.96],[21.53,74.24],[23.63,74.8],[25.73,75.22],[25.73,75.22],[27.54,75.5],[28.66,75.63],[30.89,75.77],[62.05,44.6]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":80,"s":[25],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[35],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[25],"e":[35]},{"t":140}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.352,363.505,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":40,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":60,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":80,"s":[135,135,100],"e":[150,150,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":100,"s":[150,150,100],"e":[135,135,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":120,"s":[135,135,100],"e":[150,150,100]},{"t":140}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[70,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666972637,0.462745010853,0.341176003218,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 867b1cfe400a133c670741ebf99b674007d4e3ba Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:39:13 +0100 Subject: [PATCH 19/27] Code tidy --- app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt index 0f01f8701e65..b6148f94c4fa 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -71,12 +71,12 @@ class FireActivity : DuckDuckGoActivity() { it?.let { viewState -> if (!viewState.animate) { + // restart the app only if the user hasn't navigated away during the fire animation if (viewState.autoStart) { val intent = intent.getParcelableExtra(KEY_RESTART_INTENTS) startActivity(intent, activityFadeOptions(this)) } - viewModel.viewState.removeObservers(this) finish() killProcess() From 73f5db8d7bc399ff4775ea984777cac87a82fbc8 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:46:16 +0100 Subject: [PATCH 20/27] Tidy up manifest and strings file to remove redundant label --- app/build.gradle | 4 ++-- app/src/main/AndroidManifest.xml | 5 ++--- app/src/main/res/values/strings.xml | 4 ---- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 82fe1cc04d70..c529fbc4207f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,7 +77,7 @@ android { } ext { - supportLibrary = "28.0.0-beta01" + supportLibrary = "28.0.0-rc01" architectureComponents = "1.1.1" architectureComponentsExtensions = "1.1.1" androidKtx = "0.3" @@ -91,7 +91,7 @@ ext { dependencies { - implementation 'com.android.support:support-v4:28.0.0-rc01' + implementation "com.android.support:support-v4:$supportLibrary" debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c986fceedf89..09b683f44a8d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -131,9 +131,8 @@ + android:process="@string/fireProcessName" + android:theme="@style/SplashTheme" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9218395e3668..2f8aea8f72d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -209,8 +209,4 @@ Add to Home - FireActivity - Dummy Button - DUMMY\nCONTENT - From 89228b2cca70278a4fed16ecdd3532730dc1fcf3 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:47:52 +0100 Subject: [PATCH 21/27] Code formatting --- .../main/java/com/duckduckgo/app/browser/BrowserActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt index b8c4eb7d21d8..9e8f6e83dba9 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt @@ -121,7 +121,7 @@ class BrowserActivity : DuckDuckGoActivity() { return } - if (intent.getBooleanExtra(PERFORM_FIRE_ON_ENTRY_EXTRA, false) ) { + if (intent.getBooleanExtra(PERFORM_FIRE_ON_ENTRY_EXTRA, false)) { viewModel.onClearRequested() clearPersonalDataAction.clear() Toast.makeText(applicationContext, R.string.fireDataCleared, Toast.LENGTH_LONG).show() @@ -129,7 +129,7 @@ class BrowserActivity : DuckDuckGoActivity() { return } - if(intent.getBooleanExtra(LAUNCHED_FROM_FIRE_EXTRA, false)) { + if (intent.getBooleanExtra(LAUNCHED_FROM_FIRE_EXTRA, false)) { Timber.i("Launched from fire") Toast.makeText(applicationContext, R.string.fireDataCleared, Toast.LENGTH_LONG).show() } From 21885df0c9decab21e835db9412b326183872b27 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:49:13 +0100 Subject: [PATCH 22/27] Code formatting --- .../main/res/layout/sheet_fire_clear_data.xml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/layout/sheet_fire_clear_data.xml b/app/src/main/res/layout/sheet_fire_clear_data.xml index 044484647c22..576912f0bb0c 100644 --- a/app/src/main/res/layout/sheet_fire_clear_data.xml +++ b/app/src/main/res/layout/sheet_fire_clear_data.xml @@ -27,20 +27,20 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" - android:drawablePadding="24dp" android:drawableStart="@drawable/icon_fire_glyph_24dp" + android:drawablePadding="24dp" android:fontFamily="sans-serif" - android:paddingBottom="17dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - android:paddingEnd="24dp" android:paddingStart="24dp" android:paddingTop="24dp" + android:paddingEnd="24dp" + android:paddingBottom="17dp" android:text="@string/fireClearAll" android:textColor="@color/brickOrange" android:textSize="16sp" - android:textStyle="normal" /> + android:textStyle="normal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file From e214c52da9f01ea174a661913723190266126d13 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 13:58:05 +0100 Subject: [PATCH 23/27] Remove unused styles and colours --- app/src/main/res/values/attrs.xml | 28 ---------------------------- app/src/main/res/values/colors.xml | 2 -- app/src/main/res/values/styles.xml | 12 ------------ 3 files changed, 42 deletions(-) delete mode 100644 app/src/main/res/values/attrs.xml diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml deleted file mode 100644 index 5ea649481143..000000000000 --- a/app/src/main/res/values/attrs.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3e1c3a315827..15a00359fc24 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -48,6 +48,4 @@ #FF333333 #FFABABAB - #66000000 - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e67658df1f1f..c10cc5cbaa99 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -254,18 +254,6 @@ 6sp - - - - From 2cd603f8d723d8ef1f36334ae868a4c8c692e056 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 14:18:11 +0100 Subject: [PATCH 24/27] Clear data pixel fired when app restarted; avoid being killed mid-flight --- app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt | 2 ++ app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt index 9e8f6e83dba9..47aede2e9e24 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt @@ -36,6 +36,7 @@ import com.duckduckgo.app.global.view.FireDialog import com.duckduckgo.app.privacy.ui.PrivacyDashboardActivity import com.duckduckgo.app.settings.SettingsActivity import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.FORGET_ALL_EXECUTED import com.duckduckgo.app.tabs.model.TabEntity import com.duckduckgo.app.tabs.ui.TabSwitcherActivity import org.jetbrains.anko.longToast @@ -132,6 +133,7 @@ class BrowserActivity : DuckDuckGoActivity() { if (intent.getBooleanExtra(LAUNCHED_FROM_FIRE_EXTRA, false)) { Timber.i("Launched from fire") Toast.makeText(applicationContext, R.string.fireDataCleared, Toast.LENGTH_LONG).show() + pixel.fire(FORGET_ALL_EXECUTED) } if (launchNewSearch(intent)) { diff --git a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt index a68d8c2afae2..c7f478f35910 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/FireDialog.kt @@ -22,7 +22,6 @@ import android.support.design.widget.BottomSheetDialog import android.view.View import com.duckduckgo.app.browser.R import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.FORGET_ALL_EXECUTED import kotlinx.android.synthetic.main.sheet_fire_clear_data.* class FireDialog( @@ -45,7 +44,6 @@ class FireDialog( clearAllOption.setOnClickListener { clearStarted() - pixel.fire(FORGET_ALL_EXECUTED) clearPersonalDataAction.clear() dismiss() } From 66de385eecfa135bbd2e5a9a5de591b3100f23d1 Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 15:22:14 +0100 Subject: [PATCH 25/27] Rename method to `triggerRestart` --- app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt | 8 ++++---- .../duckduckgo/app/global/view/ClearPersonalDataAction.kt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt index b6148f94c4fa..3c81205d9d49 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -38,7 +38,7 @@ import javax.inject.Inject * * This Activity runs in a separate process so that it can seamlessly restart the main app process without much in the way of a jarring UX. * - * The correct way to invoke this Activity is through its `triggerRebirth(context)` method. + * The correct way to invoke this Activity is through its `triggerRestart(context)` method. * * This Activity was largely inspired by https://github.com/JakeWharton/ProcessPhoenix * @@ -105,11 +105,11 @@ class FireActivity : DuckDuckGoActivity() { companion object { private const val KEY_RESTART_INTENTS = "KEY_RESTART_INTENTS" - fun triggerRebirth(context: Context) { - triggerRebirth(context, getRestartIntent(context)) + fun triggerRestart(context: Context) { + triggerRestart(context, getRestartIntent(context)) } - private fun triggerRebirth(context: Context, nextIntent: Intent) { + private fun triggerRestart(context: Context, nextIntent: Intent) { val intent = Intent(context, FireActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.putExtra(KEY_RESTART_INTENTS, nextIntent) diff --git a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt index ebdd030563fd..5f7715955553 100644 --- a/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt +++ b/app/src/main/java/com/duckduckgo/app/global/view/ClearPersonalDataAction.kt @@ -35,7 +35,7 @@ class ClearPersonalDataAction @Inject constructor( dataManager.clearWebViewSessions() dataManager.clearExternalCookies(CookieManager.getInstance()) { Timber.i("Finished clearing everything; restarting process") - FireActivity.triggerRebirth(context) + FireActivity.triggerRestart(context) } } } \ No newline at end of file From 384f309747088af744718f4ac30c837acb72930c Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 15:23:49 +0100 Subject: [PATCH 26/27] Code format --- .../java/com/duckduckgo/app/global/DuckDuckGoApplication.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt index b41769692671..abade181e9a0 100644 --- a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt +++ b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt @@ -95,7 +95,7 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS configureLogging() configureDependencyInjection() - if(appIsRestarting()) return + if (appIsRestarting()) return ProcessLifecycleOwner.get().lifecycle.addObserver(this) From 0715b456f2892484ea9e3206adbea6eeaefa187c Mon Sep 17 00:00:00 2001 From: Craig Russell Date: Fri, 24 Aug 2018 15:26:39 +0100 Subject: [PATCH 27/27] Removed redundant adapter class as one is already provided --- .../com/duckduckgo/app/fire/FireActivity.kt | 5 +-- .../app/fire/LottieAnimationListener.kt | 31 ------------------- 2 files changed, 3 insertions(+), 33 deletions(-) delete mode 100644 app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt diff --git a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt index 3c81205d9d49..36f9b4a3d3c0 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/FireActivity.kt @@ -17,6 +17,7 @@ package com.duckduckgo.app.fire import android.animation.Animator +import android.animation.AnimatorListenerAdapter import android.app.Activity import android.app.ActivityManager import android.arch.lifecycle.Observer @@ -60,8 +61,8 @@ class FireActivity : DuckDuckGoActivity() { setContentView(R.layout.activity_fire) if (savedInstanceState == null) { - fireAnimationView.addAnimatorListener(object : LottieAnimationListener() { - override fun onAnimationStart(p0: Animator?) { + fireAnimationView.addAnimatorListener(object : AnimatorListenerAdapter() { + override fun onAnimationStart(animator: Animator?) { viewModel.startDeathClock() } }) diff --git a/app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt b/app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt deleted file mode 100644 index ada29c6a3113..000000000000 --- a/app/src/main/java/com/duckduckgo/app/fire/LottieAnimationListener.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018 DuckDuckGo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.duckduckgo.app.fire - -import android.animation.Animator - - -abstract class LottieAnimationListener : Animator.AnimatorListener { - - override fun onAnimationStart(p0: Animator?) {} - - override fun onAnimationCancel(p0: Animator?) {} - - override fun onAnimationEnd(p0: Animator?) {} - - override fun onAnimationRepeat(p0: Animator?) {} -} \ No newline at end of file