Fixed
Status Update
Comments
ra...@google.com <ra...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 3582a85010eea5f6676c7ab596e5f019b4ec794f
Author: Ian Lake <ilake@google.com>
Date: Thu Nov 15 13:20:39 2018
Expand ActivityNavigator.Extras for passing flags
Instead of just being able to pass an instance
of ActivityOptionsCompat, move ActivityNavigator.Extras
to a Builder pattern and add the ability to add
any set of Intent.FLAG_ACTIVITY_ flags at runtime.
Test: updated tests
BUG: 119628354
Change-Id: If58c80ac4eafd630cb982762ea7fa802dd16ec92
M navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/NavigationActivity.kt
M navigation/runtime/ktx/build.gradle
A navigation/runtime/ktx/src/androidTest/java/androidx/navigation/ActivityNavigatorExtrasTest.kt
A navigation/runtime/ktx/src/main/java/androidx/navigation/ActivityNavigatorExtras.kt
M navigation/runtime/src/androidTest/java/androidx/navigation/ActivityNavigatorTest.kt
M navigation/runtime/src/main/java/androidx/navigation/ActivityNavigator.java
https://android-review.googlesource.com/828140
https://goto.google.com/android-sha1/3582a85010eea5f6676c7ab596e5f019b4ec794f
Branch: androidx-master-dev
commit 3582a85010eea5f6676c7ab596e5f019b4ec794f
Author: Ian Lake <ilake@google.com>
Date: Thu Nov 15 13:20:39 2018
Expand ActivityNavigator.Extras for passing flags
Instead of just being able to pass an instance
of ActivityOptionsCompat, move ActivityNavigator.Extras
to a Builder pattern and add the ability to add
any set of Intent.FLAG_ACTIVITY_ flags at runtime.
Test: updated tests
BUG: 119628354
Change-Id: If58c80ac4eafd630cb982762ea7fa802dd16ec92
M navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/NavigationActivity.kt
M navigation/runtime/ktx/build.gradle
A navigation/runtime/ktx/src/androidTest/java/androidx/navigation/ActivityNavigatorExtrasTest.kt
A navigation/runtime/ktx/src/main/java/androidx/navigation/ActivityNavigatorExtras.kt
M navigation/runtime/src/androidTest/java/androidx/navigation/ActivityNavigatorTest.kt
M navigation/runtime/src/main/java/androidx/navigation/ActivityNavigator.java
ra...@google.com <ra...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-master-dev
commit a62e0621853c18be1d07cc8fba078d92a424e24a
Author: Ian Lake <ilake@google.com>
Date: Thu Nov 15 13:50:59 2018
Remove deprecated clearTask and launchDocument flags
Test: remaining tests still pass
BUG: 119628354
Change-Id: Ic411df16dd3a21351bbd7bac367ed98f9e66025a
M navigation/common/ktx/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt
M navigation/common/ktx/src/main/java/androidx/navigation/NavOptionsBuilder.kt
M navigation/common/src/main/java/androidx/navigation/NavOptions.java
M navigation/common/src/main/res/values/attrs.xml
M navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
M navigation/runtime/src/main/java/androidx/navigation/NavController.java
M navigation/runtime/src/main/java/androidx/navigation/NavInflater.java
https://android-review.googlesource.com/828160
https://goto.google.com/android-sha1/a62e0621853c18be1d07cc8fba078d92a424e24a
Branch: androidx-master-dev
commit a62e0621853c18be1d07cc8fba078d92a424e24a
Author: Ian Lake <ilake@google.com>
Date: Thu Nov 15 13:50:59 2018
Remove deprecated clearTask and launchDocument flags
Test: remaining tests still pass
BUG: 119628354
Change-Id: Ic411df16dd3a21351bbd7bac367ed98f9e66025a
M navigation/common/ktx/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt
M navigation/common/ktx/src/main/java/androidx/navigation/NavOptionsBuilder.kt
M navigation/common/src/main/java/androidx/navigation/NavOptions.java
M navigation/common/src/main/res/values/attrs.xml
M navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
M navigation/runtime/src/main/java/androidx/navigation/NavController.java
M navigation/runtime/src/main/java/androidx/navigation/NavInflater.java
d....@googlemail.com <d....@googlemail.com> #4
If the app:clearTask is removed, how can i do when i have a splash and guide page ?
The first page is splash and wen enter the main page, the splash should be removed,or when back from the main,it will go to splash page,that is total wrong.
The first page is splash and wen enter the main page, the splash should be removed,or when back from the main,it will go to splash page,that is total wrong.
d....@googlemail.com <d....@googlemail.com> #6
At current now,there is two ways to do the above。
One:
In the NavHostFragment's Activity, override the onBackPress() method,adn if the current NavDestination is MainFragment then just finish the Activity.
@Override
public void onBackPressed() {
NavDestination navDestination = mNavController.getCurrentDestination();
if (navDestination != null
&& navDestination.getId() == R.id.mainFragment) {
finish();
return;
}
super.onBackPressed();
}
Two:
Set the to MainFragment action in Navigation_graph app:popUpTo="@id/nav_graph" and app:popUpToInclusive="true"
<?xml version="1.0" encoding="utf-8"?>
<navigation
android:id="@+id/nav_graph"
xmlns:android="http://schemas.android.com/apk/res/android "
xmlns:app="http://schemas.android.com/apk/res-auto "
xmlns:tools="http://schemas.android.com/tools "
app:startDestination="@id/splashFragment">
<fragment
android:id="@+id/splashFragment"
android:name="com.ihuman.storydemo.fragment.splash.SplashFragment"
android:label="fragment_splash"
tools:layout="@layout/fragment_splash">
<action
android:id="@+id/action_splashFragment_to_mainFragment"
app:destination="@id/mainFragment"
app:enterAnim="@anim/anim_right_in"
app:exitAnim="@anim/anim_left_out"
app:popEnterAnim="@anim/anim_left_in"
app:popExitAnim="@anim/anim_right_out"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"/>
<action
android:id="@+id/action_splashFragment_to_guideFragment"
app:destination="@id/guideFragment"
app:enterAnim="@anim/anim_right_in"
app:exitAnim="@anim/anim_left_out"
app:popEnterAnim="@anim/anim_left_in"
app:popExitAnim="@anim/anim_right_out"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"/>
</fragment>
<fragment
android:id="@+id/guideFragment"
android:name="com.ihuman.storydemo.fragment.guide.GuideFragment"
android:label="GuideFragment"
tools:layout="@layout/fragment_guide">
<action
android:id="@+id/action_guideFragment_to_mainFragment"
app:destination="@id/mainFragment"
app:enterAnim="@anim/anim_right_in"
app:exitAnim="@anim/anim_left_out"
app:popEnterAnim="@anim/anim_left_in"
app:popExitAnim="@anim/anim_right_out"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"/>
</fragment>
<fragment
android:id="@+id/mainFragment"
android:name="com.ihuman.storydemo.fragment.main.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
</fragment>
</navigation>
Wish for help!
One:
In the NavHostFragment's Activity, override the onBackPress() method,adn if the current NavDestination is MainFragment then just finish the Activity.
@Override
public void onBackPressed() {
NavDestination navDestination = mNavController.getCurrentDestination();
if (navDestination != null
&& navDestination.getId() == R.id.mainFragment) {
finish();
return;
}
super.onBackPressed();
}
Two:
Set the to MainFragment action in Navigation_graph app:popUpTo="@id/nav_graph" and app:popUpToInclusive="true"
<?xml version="1.0" encoding="utf-8"?>
<navigation
android:id="@+id/nav_graph"
xmlns:android="
xmlns:app="
xmlns:tools="
app:startDestination="@id/splashFragment">
<fragment
android:id="@+id/splashFragment"
android:name="com.ihuman.storydemo.fragment.splash.SplashFragment"
android:label="fragment_splash"
tools:layout="@layout/fragment_splash">
<action
android:id="@+id/action_splashFragment_to_mainFragment"
app:destination="@id/mainFragment"
app:enterAnim="@anim/anim_right_in"
app:exitAnim="@anim/anim_left_out"
app:popEnterAnim="@anim/anim_left_in"
app:popExitAnim="@anim/anim_right_out"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"/>
<action
android:id="@+id/action_splashFragment_to_guideFragment"
app:destination="@id/guideFragment"
app:enterAnim="@anim/anim_right_in"
app:exitAnim="@anim/anim_left_out"
app:popEnterAnim="@anim/anim_left_in"
app:popExitAnim="@anim/anim_right_out"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"/>
</fragment>
<fragment
android:id="@+id/guideFragment"
android:name="com.ihuman.storydemo.fragment.guide.GuideFragment"
android:label="GuideFragment"
tools:layout="@layout/fragment_guide">
<action
android:id="@+id/action_guideFragment_to_mainFragment"
app:destination="@id/mainFragment"
app:enterAnim="@anim/anim_right_in"
app:exitAnim="@anim/anim_left_out"
app:popEnterAnim="@anim/anim_left_in"
app:popExitAnim="@anim/anim_right_out"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"/>
</fragment>
<fragment
android:id="@+id/mainFragment"
android:name="com.ihuman.storydemo.fragment.main.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
</fragment>
</navigation>
Wish for help!
ra...@google.com <ra...@google.com> #7
This should be available in the next version of WorkManager.
ap...@google.com <ap...@google.com> #8
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 2d2b53f0f39033e72b686d5b56ad8be2e5eec900
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Tue Jun 04 12:42:38 2019
Notify constraint changes on the main thread only.
Fixes: b/134361006
Test: Ran integration tests. Updated unit tests.
Change-Id: I3e84c5f3229c30e810638ba97fb4ac5414288faa
M work/workmanager-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
M work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplLargeExecutorTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/background/greedy/GreedySchedulerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/BatteryChargingTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/BatteryNotLowTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/ConstraintTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/NetworkStateTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/StorageNotLowTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
M work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
M work/workmanager/src/main/java/androidx/work/impl/background/greedy/GreedyScheduler.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/DelayMetCommandHandler.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/ConstraintListener.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/WorkConstraintsTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/BatteryChargingController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/BatteryNotLowController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkConnectedController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkMeteredController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkNotRoamingController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkUnmeteredController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/StorageNotLowController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BatteryNotLowTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/StorageNotLowTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/Trackers.java
M work/workmanager/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
https://android-review.googlesource.com/975608
https://goto.google.com/android-sha1/2d2b53f0f39033e72b686d5b56ad8be2e5eec900
Branch: androidx-master-dev
commit 2d2b53f0f39033e72b686d5b56ad8be2e5eec900
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Tue Jun 04 12:42:38 2019
Notify constraint changes on the main thread only.
Fixes:
Test: Ran integration tests. Updated unit tests.
Change-Id: I3e84c5f3229c30e810638ba97fb4ac5414288faa
M work/workmanager-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
M work/workmanager/src/androidTest/java/androidx/work/impl/WorkManagerImplLargeExecutorTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/background/greedy/GreedySchedulerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcherTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/BatteryChargingTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/BatteryNotLowTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/ConstraintTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/NetworkStateTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/constraints/trackers/StorageNotLowTrackerTest.java
M work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
M work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
M work/workmanager/src/main/java/androidx/work/impl/background/greedy/GreedyScheduler.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/DelayMetCommandHandler.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/ConstraintListener.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/WorkConstraintsTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/BatteryChargingController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/BatteryNotLowController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkConnectedController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkMeteredController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkNotRoamingController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/NetworkUnmeteredController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/controllers/StorageNotLowController.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BatteryNotLowTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/StorageNotLowTracker.java
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/Trackers.java
M work/workmanager/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
Description
Version used: 1.0.1
Devices/Android versions reproduced on: different Samsung Galaxy devices running Android 8 and 9
I have received deadlock reports like this:
"main" prio=5 tid=1 Blocked
| group="main" sCount=1 dsCount=0 flags=1 obj=0x76790a58 self=0x7d81014c00
| sysTid=27874 nice=0 cgrp=default sched=0/0 handle=0x7e07c1a560
| state=S schedstat=( 1835900780 7285545518 5958 ) utm=82 stm=100 core=1 HZ=100
| stack=0x7febcdd000-0x7febcdf000 stackSize=8MB
| held mutexes=
at androidx.work.impl.constraints.trackers.ConstraintTracker.removeListener (ConstraintTracker.java:77)
- waiting to lock <0x08a4f10d> (a java.lang.Object) held by thread 13 // ConstraintTracker.mLock
at androidx.work.impl.constraints.controllers.ConstraintController.replace (ConstraintController.java:98)
at androidx.work.impl.constraints.WorkConstraintsTracker.replace (WorkConstraintsTracker.java:99)
- locked <0x0cbac8c2> (a java.lang.Object) // WorkConstrainsTracker.mLock
at androidx.work.impl.background.greedy.GreedyScheduler.removeConstraintTrackingFor (GreedyScheduler.java:153)
- locked <0x0cbec6d3> (a java.lang.Object) // GreedyScheduler.mLock
at androidx.work.impl.background.greedy.GreedyScheduler.onExecuted (GreedyScheduler.java:141)
at androidx.work.impl.Processor.onExecuted (Processor.java:230)
- locked <0x08012210> (a java.lang.Object)
at androidx.work.impl.Processor$FutureListener.run (Processor.java:263)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:214)
at android.app.ActivityThread.main (ActivityThread.java:7032)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)
"ConnectivityThread" tid=13 Blocked
"ConnectivityThread" prio=5 tid=13 Blocked
| group="main" sCount=1 dsCount=0 flags=1 obj=0x12fc0770 self=0x7d7ab86800
| sysTid=27897 nice=0 cgrp=default sched=0/0 handle=0x7d684114f0
| state=S schedstat=( 247567475 11539483672 1368 ) utm=16 stm=7 core=2 HZ=100
| stack=0x7d6830e000-0x7d68310000 stackSize=1041KB
| held mutexes=
at androidx.work.impl.a.d.c (SourceFile:157) // synchronized (mLock)
- waiting to lock <0x0cbac8c2> (a java.lang.Object) held by thread 1 // trying to lock WorkConstraintsTracker.mLock
at androidx.work.impl.a.a.c.b (SourceFile:133) ConstraintController: mCallback.onConstraintNotMet(mMatchingWorkSpecIds);
at androidx.work.impl.a.a.c.a (SourceFile:142) ConstraintController: updateCallback();
at androidx.work.impl.a.b.d.a (SourceFile:103) listener.onConstraintChanged(mCurrentState);
- locked <0x08a4f10d> (a java.lang.Object) (ConstraintTracker.mLock)
at androidx.work.impl.a.b.e$b.onCapabilitiesChanged (SourceFile:149) (NetworkStateTracker)
at android.net.ConnectivityManager$CallbackHandler.handleMessage (ConnectivityManager.java:3331)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loop (Looper.java:214)
at android.os.HandlerThread.run (HandlerThread.java:65)
I have written after the lines what is happening there.
The GreedyScheduler has finished executing and onExecuted is called. This tries to remove the workSpecId from the mConstrainedWorkSpecs list. After removing it it calls mWorkConstraintsTracker.replace to send the new list to the WorkContraintsTracker. This causes a lock of WorkConstraintsTracker.mLock and a call to ConstraintController.replace. This calls ConstraintController.removeListener which tries to lock ConstraintController.mLock but fails/deadlocks. So as you can see it has first locked WorkConstraintsTracker.mLock and then it tries to lock ConstraintController.mLock.
As you can see now the other thread does the opposite, which leads to the deadlock: The WorkManager receives a "onCapabilitiesChanges" message and locks ConstraintTracker.mLock. Then it tries to call onConstraintNotMet but it cannot lock WorkConstraintsTracker.mLock, because it is already locked by the upper thread.
So there is a deadlock because both functions are running at the same time and are locking the locks in opposite order. Can you please fix it? Or did I make a mistake somewhere?
(BTW I am only using WorkManager.getInstance, I am not calling "initialize").
Thank you very much!