summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tony Huang <tonyychuang@google.com> 2018-09-13 14:41:16 +0800
committer Tony Huang <tonyychuang@google.com> 2018-11-01 18:57:19 +0800
commit8d8d92f38f2a92cc914b3e59648f3eee7ce9af47 (patch)
treeda0d96886c30a6bdb11cb3ffc7edcb062f8ee976
parent360365815ae97b684ddf7f3c9d488df74a74ad65 (diff)
Refactor to androidx fragment and appcompatactivity
1. Update all deprecated Fragment to androidx Fragment 2. Update Activity to AppCompatActivity or FragmentActivity. 3. Update other components to support libraries version. Bug: 111921428 Test: manual Test: atest DocumentsUITests Change-Id: I2e629867b961bc6b52cf5d15378e121e4efa33d3
-rw-r--r--res/drawable/list_checker.xml22
-rw-r--r--res/layout/drawer_layout.xml6
-rw-r--r--res/layout/fixed_layout.xml4
-rw-r--r--res/menu/activity.xml40
-rw-r--r--res/values-night/styles.xml2
-rw-r--r--res/values-night/themes.xml38
-rw-r--r--res/values/styles.xml2
-rw-r--r--res/values/themes.xml41
-rw-r--r--src/com/android/documentsui/AbstractActionHandler.java10
-rw-r--r--src/com/android/documentsui/BaseActivity.java23
-rw-r--r--src/com/android/documentsui/CreateDirectoryFragment.java5
-rw-r--r--src/com/android/documentsui/DrawerController.java2
-rw-r--r--src/com/android/documentsui/MenuManager.java3
-rw-r--r--src/com/android/documentsui/NavigationViewManager.java3
-rw-r--r--src/com/android/documentsui/OperationDialogFragment.java7
-rw-r--r--src/com/android/documentsui/ScopedAccessActivity.java33
-rw-r--r--src/com/android/documentsui/dirlist/AnimationView.java3
-rw-r--r--src/com/android/documentsui/dirlist/DirectoryFragment.java11
-rw-r--r--src/com/android/documentsui/dirlist/RenameDocumentFragment.java10
-rw-r--r--src/com/android/documentsui/files/ActionHandler.java4
-rw-r--r--src/com/android/documentsui/files/FilesActivity.java8
-rw-r--r--src/com/android/documentsui/files/MenuManager.java2
-rw-r--r--src/com/android/documentsui/inspector/InspectorActivity.java3
-rw-r--r--src/com/android/documentsui/inspector/MetadataLoader.java3
-rw-r--r--src/com/android/documentsui/inspector/RuntimeDataSupplier.java19
-rw-r--r--src/com/android/documentsui/picker/ActionHandler.java14
-rw-r--r--src/com/android/documentsui/picker/OverwriteConfirmFragment.java9
-rw-r--r--src/com/android/documentsui/picker/PickActivity.java19
-rw-r--r--src/com/android/documentsui/picker/PickFragment.java11
-rw-r--r--src/com/android/documentsui/picker/SaveFragment.java7
-rw-r--r--src/com/android/documentsui/queries/SearchViewManager.java4
-rw-r--r--src/com/android/documentsui/roots/RootsLoader.java3
-rw-r--r--src/com/android/documentsui/sidebar/RootsFragment.java13
-rw-r--r--src/com/android/documentsui/sorting/DropdownSortWidgetController.java3
-rw-r--r--src/com/android/documentsui/sorting/SortController.java7
-rw-r--r--src/com/android/documentsui/sorting/SortListFragment.java6
-rw-r--r--src/com/android/documentsui/ui/DialogController.java3
-rw-r--r--tests/common/com/android/documentsui/TestActivity.java13
-rw-r--r--tests/common/com/android/documentsui/bots/DirectoryListBot.java4
-rw-r--r--tests/common/com/android/documentsui/bots/SearchBot.java8
-rw-r--r--tests/common/com/android/documentsui/bots/UiBot.java8
-rw-r--r--tests/common/com/android/documentsui/testing/TestLoaderManager.java1
-rw-r--r--tests/common/com/android/documentsui/testing/TestMenu.java3
-rw-r--r--tests/common/com/android/documentsui/testing/TestSupportLoaderManager.java103
-rw-r--r--tests/common/com/android/documentsui/ui/TestDialogController.java3
-rw-r--r--tests/functional/com/android/documentsui/SearchViewUiTest.java27
-rw-r--r--tests/unit/com/android/documentsui/AbstractActionHandlerTest.java5
-rw-r--r--tests/unit/com/android/documentsui/inspector/DocumentLoaderTest.java6
48 files changed, 381 insertions, 203 deletions
diff --git a/res/drawable/list_checker.xml b/res/drawable/list_checker.xml
new file mode 100644
index 000000000..d0d3a1d9b
--- /dev/null
+++ b/res/drawable/list_checker.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_checked="true"
+ android:drawable="@drawable/ic_done"/>
+ <item
+ android:drawable="@android:color/transparent"/>
+</selector> \ No newline at end of file
diff --git a/res/layout/drawer_layout.xml b/res/layout/drawer_layout.xml
index 47c219c69..b319e4ee2 100644
--- a/res/layout/drawer_layout.xml
+++ b/res/layout/drawer_layout.xml
@@ -32,7 +32,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
- <Toolbar
+ <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
@@ -50,7 +50,7 @@
android:background="@android:color/transparent"
android:overlapAnchor="true" />
- </Toolbar>
+ </androidx.appcompat.widget.Toolbar>
<FrameLayout
android:layout_width="match_parent"
@@ -78,7 +78,7 @@
android:elevation="0dp"
android:background="?android:attr/colorPrimary">
- <Toolbar
+ <androidx.appcompat.widget.Toolbar
android:id="@+id/roots_toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
diff --git a/res/layout/fixed_layout.xml b/res/layout/fixed_layout.xml
index a3933db73..f2604d962 100644
--- a/res/layout/fixed_layout.xml
+++ b/res/layout/fixed_layout.xml
@@ -28,7 +28,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
- <Toolbar
+ <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
@@ -43,7 +43,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
- </Toolbar>
+ </androidx.appcompat.widget.Toolbar>
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/menu/activity.xml b/res/menu/activity.xml
index fb53a2ad2..778e7acba 100644
--- a/res/menu/activity.xml
+++ b/res/menu/activity.xml
@@ -14,7 +14,9 @@
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
+<menu
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- showAsAction flag impacts the behavior of SearchView.
When set to collapseActionView, collapsing SearchView to icon is the
default behavior. It would fit UX, however after expanding SearchView is
@@ -27,10 +29,10 @@
android:id="@+id/option_menu_search"
android:title="@string/menu_search"
android:icon="@drawable/ic_menu_search"
- android:showAsAction="always"
- android:actionViewClass="android.widget.SearchView"
android:imeOptions="actionSearch"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="always"
+ app:actionViewClass="androidx.appcompat.widget.SearchView"/>
<!-- This group is being hidden when searching is in full bar mode-->
<group android:id="@+id/group_hide_when_searching">
<item
@@ -38,30 +40,30 @@
android:title="Debug"
android:icon="@drawable/ic_debug_menu"
android:visible="false"
- android:showAsAction="always" />
+ app:showAsAction="always"/>
<item
android:id="@+id/option_menu_grid"
android:title="@string/menu_grid"
android:icon="@drawable/ic_menu_view_grid"
- android:showAsAction="always" />
+ app:showAsAction="always"/>
<item
android:id="@+id/option_menu_list"
android:title="@string/menu_list"
android:icon="@drawable/ic_menu_view_list"
- android:showAsAction="always" />
+ app:showAsAction="always"/>
<item
android:id="@+id/option_menu_new_window"
android:title="@string/menu_new_window"
android:alphabeticShortcut="n"
- android:showAsAction="never"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never"/>
<item
android:id="@+id/option_menu_create_dir"
android:title="@string/menu_create_dir"
android:icon="@drawable/ic_menu_new_folder"
android:alphabeticShortcut="e"
- android:showAsAction="never"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never"/>
<item
android:id="@+id/option_menu_sort"
android:title="@string/menu_sort"
@@ -71,21 +73,21 @@
android:id="@+id/option_menu_select_all"
android:title="@string/menu_select_all"
android:alphabeticShortcut="a"
- android:showAsAction="never"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never"/>
<item
android:id="@+id/option_menu_advanced"
- android:showAsAction="never"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never"/>
<item
android:id="@+id/option_menu_settings"
android:title="@string/menu_settings"
- android:showAsAction="never"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never"/>
<item
android:id="@+id/option_menu_inspect"
android:title="@string/menu_inspect"
- android:showAsAction="never"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never"/>
</group>
</menu>
diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml
index 3a2f62729..a12bcba5c 100644
--- a/res/values-night/styles.xml
+++ b/res/values-night/styles.xml
@@ -26,7 +26,7 @@
<item name="android:subtitleTextStyle">@android:style/TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse</item>
</style>
- <style name="actionModeStyle" parent="@android:style/Widget.Material.ActionMode">
+ <style name="actionModeStyle" parent="Widget.AppCompat.ActionMode">
<item name="android:background">?android:attr/actionModeBackground</item>
<item name="android:backgroundSplit">?android:attr/actionModeBackground</item>
<item name="android:titleTextStyle">@android:style/TextAppearance.Material.Widget.ActionMode.Title.Inverse</item>
diff --git a/res/values-night/themes.xml b/res/values-night/themes.xml
index 892d67f27..733454842 100644
--- a/res/values-night/themes.xml
+++ b/res/values-night/themes.xml
@@ -23,24 +23,16 @@
<item name="snackbarButtonStyle">@style/SnackbarButtonStyle</item>
<item name="bottomSheetDialogTheme">@style/BottomSheetDialogStyle</item>
- <item name="android:windowBackground">?android:attr/colorPrimary</item>
- <item name="android:colorPrimaryDark">@color/g_grey</item>
- <item name="android:colorPrimary">@color/g_dark_grey</item>
- <item name="android:colorSecondary">@color/g_dark_grey</item>
- <item name="android:colorAccent">@color/accent_dark</item>
- <item name="android:colorBackground">?android:attr/colorPrimary</item>
- <item name="android:windowLightStatusBar">false</item>
- <item name="android:windowLightNavigationBar">false</item>
- <item name="android:queryBackground">@color/menu_search_background</item>
- <item name="android:listDivider">@drawable/list_divider</item>
- <item name="android:windowActionBar">false</item>
- <item name="android:windowActionModeOverlay">true</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
- <item name="android:actionModeBackground">?android:attr/colorBackground</item>
- <item name="android:actionModeCloseDrawable">@drawable/ic_action_clear</item>
- <item name="android:statusBarColor">?android:attr/colorPrimary</item>
-
+ <item name="colorPrimaryDark">@color/g_grey</item>
+ <item name="colorPrimary">@color/g_dark_grey</item>
+ <item name="colorSecondary">@color/g_dark_grey</item>
+ <item name="colorAccent">@color/accent_dark</item>
+
+ <item name="queryBackground">@color/menu_search_background</item>
+ <item name="windowActionBar">false</item>
+ <item name="windowActionModeOverlay">true</item>
+ <item name="windowNoTitle">true</item>
+ <item name="actionModeBackground">?android:attr/colorBackground</item>
<item name="materialCardViewStyle">@style/CardViewStyle</item>
<item name="textHandleColor">@color/text_handle_dark</item>
@@ -50,5 +42,13 @@
<item name="gridItemColor">@color/item_doc_background_dark</item>
<item name="gridItemSelectedColor">@color/item_doc_background_selected_dark</item>
<item name="gridItemDisableColor">@color/item_doc_background_disabled_dark</item>
+
+ <item name="android:windowBackground">?android:attr/colorPrimary</item>
+ <item name="android:colorBackground">?android:attr/colorPrimary</item>
+ <item name="android:statusBarColor">?android:attr/colorPrimary</item>
+ <item name="android:windowLightStatusBar">false</item>
+ <item name="android:windowLightNavigationBar">false</item>
+ <item name="android:listDivider">@drawable/list_divider</item>
+ <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
</style>
-</resources>
+</resources> \ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 20959e7b4..d79fd35b5 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -26,7 +26,7 @@
<item name="android:subtitleTextStyle">@android:style/TextAppearance.Material.Widget.ActionBar.Subtitle</item>
</style>
- <style name="ActionModeStyle" parent="@android:style/Widget.Material.Light.ActionMode">
+ <style name="ActionModeStyle" parent="Widget.AppCompat.ActionMode">
<item name="android:background">?android:attr/actionModeBackground</item>
<item name="android:backgroundSplit">?android:attr/actionModeBackground</item>
<item name="android:titleTextStyle">@android:style/TextAppearance.Material.Widget.ActionMode.Title</item>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 75c5601c2..7475f514f 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -23,26 +23,17 @@
<item name="snackbarButtonStyle">@style/SnackbarButtonStyle</item>
<item name="bottomSheetDialogTheme">@style/BottomSheetDialogStyle</item>
- <item name="android:windowBackground">?android:attr/colorPrimary</item>
- <item name="android:colorPrimaryDark">@color/g_grey</item>
- <item name="android:colorPrimary">@color/primary</item>
- <item name="android:colorSecondary">@color/primary</item>
- <item name="android:colorAccent">@color/accent</item>
- <item name="android:colorBackground">?android:attr/colorPrimary</item>
- <item name="android:windowLightStatusBar">true</item>
- <item name="android:windowLightNavigationBar">true</item>
- <item name="android:queryBackground">@color/menu_search_background</item>
- <item name="android:listDivider">@drawable/list_divider</item>
- <item name="android:windowActionBar">false</item>
- <item name="android:windowActionModeOverlay">true</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
- <item name="android:actionModeBackground">?android:attr/colorBackground</item>
- <item name="android:actionModeCloseDrawable">@drawable/ic_action_clear</item>
- <item name="android:statusBarColor">?android:attr/colorPrimary</item>
- <item name="android:navigationBarColor">?android:attr/colorPrimary</item>
- <item name="android:navigationBarDividerColor">@color/drawer_border</item>
-
+ <item name="colorPrimaryDark">@color/g_grey</item>
+ <item name="colorPrimary">@android:color/white</item>
+ <item name="colorSecondary">@android:color/white</item>
+ <item name="colorAccent">@color/accent</item>
+
+ <item name="queryBackground">@color/menu_search_background</item>
+ <item name="windowActionBar">false</item>
+ <item name="windowActionModeOverlay">true</item>
+ <item name="windowNoTitle">true</item>
+ <item name="actionModeBackground">?android:attr/colorBackground</item>
+ <item name="actionModeCloseDrawable">@drawable/ic_action_clear</item>
<item name="materialCardViewStyle">@style/CardViewStyle</item>
<item name="textHandleColor">@color/text_handle</item>
@@ -52,5 +43,15 @@
<item name="gridItemColor">@color/item_doc_background</item>
<item name="gridItemSelectedColor">@color/item_doc_background_selected</item>
<item name="gridItemDisableColor">@color/item_doc_background_disabled</item>
+
+ <item name="android:windowBackground">?android:attr/colorPrimary</item>
+ <item name="android:colorBackground">?android:attr/colorPrimary</item>
+ <item name="android:statusBarColor">?android:attr/colorPrimary</item>
+ <item name="android:navigationBarColor">?android:attr/colorPrimary</item>
+ <item name="android:navigationBarDividerColor">@color/drawer_border</item>
+ <item name="android:windowLightStatusBar">true</item>
+ <item name="android:windowLightNavigationBar">true</item>
+ <item name="android:listDivider">@drawable/list_divider</item>
+ <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
</style>
</resources> \ No newline at end of file
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java
index 1ded9f697..a95b1ec9f 100644
--- a/src/com/android/documentsui/AbstractActionHandler.java
+++ b/src/com/android/documentsui/AbstractActionHandler.java
@@ -20,7 +20,6 @@ import static com.android.documentsui.base.DocumentInfo.getCursorInt;
import static com.android.documentsui.base.DocumentInfo.getCursorString;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
-import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.app.PendingIntent;
import android.content.Context;
@@ -39,6 +38,7 @@ import android.util.Pair;
import android.view.DragEvent;
import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import androidx.recyclerview.selection.MutableSelection;
import androidx.recyclerview.selection.SelectionTracker;
@@ -77,7 +77,7 @@ import javax.annotation.Nullable;
/**
* Provides support for specializing the actions (openDocument etc.) to the host activity.
*/
-public abstract class AbstractActionHandler<T extends Activity & CommonAddons>
+public abstract class AbstractActionHandler<T extends FragmentActivity & CommonAddons>
implements ActionHandler {
@VisibleForTesting
@@ -175,7 +175,7 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons>
}
private void onAuthenticationResult(int resultCode) {
- if (resultCode == Activity.RESULT_OK) {
+ if (resultCode == FragmentActivity.RESULT_OK) {
Log.v(TAG, "Authentication was successful. Refreshing directory now.");
mActivity.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE);
}
@@ -305,12 +305,12 @@ public abstract class AbstractActionHandler<T extends Activity & CommonAddons>
public void showCreateDirectoryDialog() {
Metrics.logUserAction(mActivity, Metrics.USER_ACTION_CREATE_DIR);
- CreateDirectoryFragment.show(mActivity.getFragmentManager());
+ CreateDirectoryFragment.show(mActivity.getSupportFragmentManager());
}
@Override
public void showSortDialog() {
- SortListFragment.show(mActivity.getFragmentManager(), mState.sortModel);
+ SortListFragment.show(mActivity.getSupportFragmentManager(), mState.sortModel);
}
@Override
diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index 8b2003748..4a7764e51 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -20,8 +20,6 @@ import static com.android.documentsui.base.Shared.EXTRA_BENCHMARK;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.State.MODE_GRID;
-import android.app.Activity;
-import android.app.Fragment;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -36,11 +34,13 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.widget.Toolbar;
import androidx.annotation.CallSuper;
import androidx.annotation.LayoutRes;
import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.Fragment;
import com.android.documentsui.AbstractActionHandler.CommonAddons;
import com.android.documentsui.Injector.Injected;
@@ -72,7 +72,7 @@ import java.util.List;
import javax.annotation.Nullable;
public abstract class BaseActivity
- extends Activity implements CommonAddons, NavigationViewManager.Environment {
+ extends AppCompatActivity implements CommonAddons, NavigationViewManager.Environment {
private static final String BENCHMARK_TESTING_PACKAGE = "com.android.documentsui.appperftests";
@@ -136,7 +136,7 @@ public abstract class BaseActivity
mDocs = DocumentsAccess.create(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setActionBar(toolbar);
+ setSupportActionBar(toolbar);
Breadcrumb breadcrumb =
Shared.findView(this, R.id.dropdown_breadcrumb, R.id.horizontal_breadcrumb);
@@ -194,7 +194,7 @@ public abstract class BaseActivity
mPreferencesMonitor.start();
// Base classes must update result in their onCreate.
- setResult(Activity.RESULT_CANCELED);
+ setResult(AppCompatActivity.RESULT_CANCELED);
}
public void onPreferenceChanged(String pref) {
@@ -366,7 +366,7 @@ public abstract class BaseActivity
}
protected final @Nullable DirectoryFragment getDirectoryFragment() {
- return DirectoryFragment.get(getFragmentManager());
+ return DirectoryFragment.get(getSupportFragmentManager());
}
/**
@@ -401,7 +401,7 @@ public abstract class BaseActivity
// chance to spawn a fragment before we need to do it now. However if we spawned a fragment
// already, system will automatically restore the fragment for us so we don't need to do
// that manually this time.
- if (DirectoryFragment.get(getFragmentManager()) == null) {
+ if (DirectoryFragment.get(getSupportFragmentManager()) == null) {
refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE);
}
}
@@ -425,7 +425,7 @@ public abstract class BaseActivity
refreshDirectory(anim);
- final RootsFragment roots = RootsFragment.get(getFragmentManager());
+ final RootsFragment roots = RootsFragment.get(getSupportFragmentManager());
if (roots != null) {
roots.onCurrentRootChanged();
}
@@ -478,7 +478,7 @@ public abstract class BaseActivity
private void updateDisplayAdvancedDevices(boolean display) {
mState.showAdvanced = display;
- @Nullable RootsFragment fragment = RootsFragment.get(getFragmentManager());
+ @Nullable RootsFragment fragment = RootsFragment.get(getSupportFragmentManager());
if (fragment != null) {
// This also takes care of updating launcher shortcuts (which are roots :)
fragment.onDisplayStateChanged();
@@ -580,6 +580,7 @@ public abstract class BaseActivity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
mInjector.actions.onActivityResult(requestCode, resultCode, data);
}
@@ -599,7 +600,7 @@ public abstract class BaseActivity
}
protected boolean focusSidebar() {
- RootsFragment rf = RootsFragment.get(getFragmentManager());
+ RootsFragment rf = RootsFragment.get(getSupportFragmentManager());
assert (rf != null);
return rf.requestFocus();
}
diff --git a/src/com/android/documentsui/CreateDirectoryFragment.java b/src/com/android/documentsui/CreateDirectoryFragment.java
index 76534d7e4..addb7897e 100644
--- a/src/com/android/documentsui/CreateDirectoryFragment.java
+++ b/src/com/android/documentsui/CreateDirectoryFragment.java
@@ -20,8 +20,6 @@ import static com.android.documentsui.base.SharedMinimal.TAG;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
@@ -33,6 +31,9 @@ import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
+
import android.util.Log;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
diff --git a/src/com/android/documentsui/DrawerController.java b/src/com/android/documentsui/DrawerController.java
index 3a7e8a213..613ac3a8a 100644
--- a/src/com/android/documentsui/DrawerController.java
+++ b/src/com/android/documentsui/DrawerController.java
@@ -21,12 +21,12 @@ import static com.android.documentsui.base.SharedMinimal.DEBUG;
import androidx.annotation.IntDef;
import android.app.Activity;
import androidx.annotation.ColorRes;
+import androidx.appcompat.widget.Toolbar;
import androidx.legacy.app.ActionBarDrawerToggle;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.drawerlayout.widget.DrawerLayout.DrawerListener;
import android.util.Log;
import android.view.View;
-import android.widget.Toolbar;
import com.android.documentsui.base.Display;
diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java
index 6e34bb88f..fa60b6f70 100644
--- a/src/com/android/documentsui/MenuManager.java
+++ b/src/com/android/documentsui/MenuManager.java
@@ -16,8 +16,6 @@
package com.android.documentsui;
-import android.app.Fragment;
-import android.util.Log;
import android.view.KeyboardShortcutGroup;
import android.view.Menu;
import android.view.MenuInflater;
@@ -33,6 +31,7 @@ import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.queries.SearchViewManager;
import com.android.documentsui.sidebar.RootsFragment;
import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.Fragment;
import java.util.List;
import java.util.function.IntFunction;
diff --git a/src/com/android/documentsui/NavigationViewManager.java b/src/com/android/documentsui/NavigationViewManager.java
index 2012415a9..c96682607 100644
--- a/src/com/android/documentsui/NavigationViewManager.java
+++ b/src/com/android/documentsui/NavigationViewManager.java
@@ -19,10 +19,11 @@ package com.android.documentsui;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
import androidx.annotation.Nullable;
+import androidx.appcompat.widget.Toolbar;
+
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.View;
-import android.widget.Toolbar;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;
diff --git a/src/com/android/documentsui/OperationDialogFragment.java b/src/com/android/documentsui/OperationDialogFragment.java
index 7fd31636e..7b36599e9 100644
--- a/src/com/android/documentsui/OperationDialogFragment.java
+++ b/src/com/android/documentsui/OperationDialogFragment.java
@@ -18,13 +18,14 @@ package com.android.documentsui;
import androidx.annotation.IntDef;
import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
import android.text.Html;
import com.android.documentsui.base.DocumentInfo;
diff --git a/src/com/android/documentsui/ScopedAccessActivity.java b/src/com/android/documentsui/ScopedAccessActivity.java
index 2c5081c1e..3e606bc61 100644
--- a/src/com/android/documentsui/ScopedAccessActivity.java
+++ b/src/com/android/documentsui/ScopedAccessActivity.java
@@ -16,55 +16,47 @@
package com.android.documentsui;
-import static android.os.Environment.isStandardDirectory;
import static android.os.storage.StorageVolume.EXTRA_DIRECTORY_NAME;
import static android.os.storage.StorageVolume.EXTRA_STORAGE_VOLUME;
import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED;
import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED;
import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_DENIED;
-import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST;
+import static com.android.documentsui.ScopedAccessMetrics
+ .SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST;
import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_ERROR;
import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_GRANTED;
import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS;
-import static com.android.documentsui.ScopedAccessMetrics.SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY;
import static com.android.documentsui.ScopedAccessMetrics.logInvalidScopedAccessRequest;
import static com.android.documentsui.ScopedAccessMetrics.logValidScopedAccessRequest;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.DIRECTORY_ROOT;
-import static com.android.documentsui.base.SharedMinimal.getUriPermission;
import static com.android.documentsui.base.SharedMinimal.getInternalDirectoryName;
+import static com.android.documentsui.base.SharedMinimal.getUriPermission;
import static com.android.documentsui.prefs.ScopedAccessLocalPreferences.PERMISSION_ASK_AGAIN;
import static com.android.documentsui.prefs.ScopedAccessLocalPreferences.PERMISSION_NEVER_ASK;
-import static com.android.documentsui.prefs.ScopedAccessLocalPreferences.getScopedAccessPermissionStatus;
-import static com.android.documentsui.prefs.ScopedAccessLocalPreferences.setScopedAccessPermissionStatus;
+import static com.android.documentsui.prefs.ScopedAccessLocalPreferences
+ .getScopedAccessPermissionStatus;
+import static com.android.documentsui.prefs.ScopedAccessLocalPreferences
+ .setScopedAccessPermissionStatus;
-import androidx.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
import android.app.GrantedUriPermission;
import android.content.ContentProviderClient;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
-import android.content.UriPermission;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
-import android.os.RemoteException;
import android.os.UserHandle;
-import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
-import android.os.storage.VolumeInfo;
-import android.provider.DocumentsContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -73,16 +65,19 @@ import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
import com.android.documentsui.base.Providers;
import java.io.File;
-import java.io.IOException;
-import java.util.List;
/**
* Activity responsible for handling {@link StorageVolume#createAccessIntent(String)}.
*/
-public class ScopedAccessActivity extends Activity {
+public class ScopedAccessActivity extends AppCompatActivity {
private static final String TAG = "ScopedAccessActivity";
private static final String FM_TAG = "open_external_directory";
private static final String EXTRA_FILE = "com.android.documentsui.FILE";
@@ -185,7 +180,7 @@ public class ScopedAccessActivity extends Activity {
args.putBoolean(EXTRA_IS_ROOT, isRoot);
args.putBoolean(EXTRA_IS_PRIMARY, isPrimary);
- final FragmentManager fm = activity.getFragmentManager();
+ final FragmentManager fm = activity.getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
final ScopedAccessDialogFragment fragment = new ScopedAccessDialogFragment();
fragment.setArguments(args);
diff --git a/src/com/android/documentsui/dirlist/AnimationView.java b/src/com/android/documentsui/dirlist/AnimationView.java
index fdeb6d4c1..d17bddf98 100644
--- a/src/com/android/documentsui/dirlist/AnimationView.java
+++ b/src/com/android/documentsui/dirlist/AnimationView.java
@@ -17,7 +17,8 @@
package com.android.documentsui.dirlist;
import androidx.annotation.IntDef;
-import android.app.FragmentTransaction;
+import androidx.fragment.app.FragmentTransaction;
+
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index bfa5b0259..2f7de3bb7 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -25,11 +25,7 @@ import static com.android.documentsui.base.State.MODE_LIST;
import androidx.annotation.DimenRes;
import androidx.annotation.FractionRes;
import androidx.annotation.IntDef;
-import android.app.Activity;
import android.app.ActivityManager;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
@@ -51,6 +47,10 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import androidx.recyclerview.selection.MutableSelection;
import androidx.recyclerview.selection.Selection;
@@ -246,7 +246,6 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
@Override
public void onDestroyView() {
- mSelectionMgr.clearSelection();
mInjector.actions.unregisterDisplayStateChangedListener(mOnDisplayStateChanged);
// Cancel any outstanding thumbnail requests
@@ -454,7 +453,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
FileOperation operation = mLocalState.claimPendingOperation();
- if (resultCode == Activity.RESULT_CANCELED || data == null) {
+ if (resultCode == FragmentActivity.RESULT_CANCELED || data == null) {
// User pressed the back button or otherwise cancelled the destination pick. Don't
// proceed with the copy.
operation.dispose();
diff --git a/src/com/android/documentsui/dirlist/RenameDocumentFragment.java b/src/com/android/documentsui/dirlist/RenameDocumentFragment.java
index 03fcf2719..b950aa8d1 100644
--- a/src/com/android/documentsui/dirlist/RenameDocumentFragment.java
+++ b/src/com/android/documentsui/dirlist/RenameDocumentFragment.java
@@ -20,18 +20,14 @@ import static com.android.documentsui.base.SharedMinimal.TAG;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.provider.DocumentsContract;
import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
+
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
diff --git a/src/com/android/documentsui/files/ActionHandler.java b/src/com/android/documentsui/files/ActionHandler.java
index 69319d325..a7cbf06bc 100644
--- a/src/com/android/documentsui/files/ActionHandler.java
+++ b/src/com/android/documentsui/files/ActionHandler.java
@@ -18,7 +18,6 @@ package com.android.documentsui.files;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
-import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ContentProviderClient;
@@ -30,6 +29,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.DragEvent;
+import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import androidx.recyclerview.selection.MutableSelection;
import androidx.recyclerview.selection.Selection;
@@ -80,7 +80,7 @@ import javax.annotation.Nullable;
/**
* Provides {@link FilesActivity} action specializations to fragments.
*/
-public class ActionHandler<T extends Activity & Addons> extends AbstractActionHandler<T> {
+public class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionHandler<T> {
private static final String TAG = "ManagerActionHandler";
diff --git a/src/com/android/documentsui/files/FilesActivity.java b/src/com/android/documentsui/files/FilesActivity.java
index 5db68344c..fd05f666b 100644
--- a/src/com/android/documentsui/files/FilesActivity.java
+++ b/src/com/android/documentsui/files/FilesActivity.java
@@ -19,7 +19,6 @@ package com.android.documentsui.files;
import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_UNKNOWN;
import android.app.ActivityManager.TaskDescription;
-import android.app.FragmentManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@@ -29,6 +28,7 @@ import android.view.Menu;
import android.view.MenuItem;
import androidx.annotation.CallSuper;
+import androidx.fragment.app.FragmentManager;
import com.android.documentsui.ActionModeController;
import com.android.documentsui.BaseActivity;
@@ -154,7 +154,7 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons
mInjector.features,
mDrawer);
- RootsFragment.show(getFragmentManager(), null);
+ RootsFragment.show(getSupportFragmentManager(), null);
final Intent intent = getIntent();
@@ -206,7 +206,7 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons
final ArrayList<Uri> uriList =
intent.getParcelableArrayListExtra(FileOperationService.EXTRA_FAILED_URIS);
OperationDialogFragment.show(
- getFragmentManager(),
+ getSupportFragmentManager(),
dialogType,
docList,
uriList,
@@ -310,7 +310,7 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons
@Override
public void refreshDirectory(@AnimationType int anim) {
- final FragmentManager fm = getFragmentManager();
+ final FragmentManager fm = getSupportFragmentManager();
final RootInfo root = getCurrentRoot();
final DocumentInfo cwd = getCurrentDirectory();
diff --git a/src/com/android/documentsui/files/MenuManager.java b/src/com/android/documentsui/files/MenuManager.java
index e89b4084f..7c302f5a7 100644
--- a/src/com/android/documentsui/files/MenuManager.java
+++ b/src/com/android/documentsui/files/MenuManager.java
@@ -16,7 +16,6 @@
package com.android.documentsui.files;
-import android.app.Fragment;
import android.content.Context;
import android.content.res.Resources;
import android.net.Uri;
@@ -28,6 +27,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import androidx.fragment.app.Fragment;
import androidx.recyclerview.selection.SelectionTracker;
import com.android.documentsui.R;
diff --git a/src/com/android/documentsui/inspector/InspectorActivity.java b/src/com/android/documentsui/inspector/InspectorActivity.java
index ec973de37..4990ca4f8 100644
--- a/src/com/android/documentsui/inspector/InspectorActivity.java
+++ b/src/com/android/documentsui/inspector/InspectorActivity.java
@@ -28,6 +28,7 @@ import android.view.View;
import androidx.annotation.ColorInt;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
+import androidx.loader.app.LoaderManager;
import com.android.documentsui.R;
import com.android.documentsui.base.Shared;
@@ -55,7 +56,7 @@ public class InspectorActivity extends AppCompatActivity {
AppBarLayout appBarLayout = findViewById(R.id.appBar);
appBarLayout.addOnOffsetChangedListener(this::onOffsetChanged);
- final DataSupplier loader = new RuntimeDataSupplier(this, getLoaderManager());
+ final DataSupplier loader = new RuntimeDataSupplier(this, LoaderManager.getInstance(this));
mView = findViewById(R.id.inspector_root);
mController = new InspectorController(this, loader, mView,
diff --git a/src/com/android/documentsui/inspector/MetadataLoader.java b/src/com/android/documentsui/inspector/MetadataLoader.java
index ae447645c..3d12d4e2c 100644
--- a/src/com/android/documentsui/inspector/MetadataLoader.java
+++ b/src/com/android/documentsui/inspector/MetadataLoader.java
@@ -15,12 +15,13 @@
*/
package com.android.documentsui.inspector;
-import android.content.AsyncTaskLoader;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import androidx.annotation.Nullable;
+import androidx.loader.content.AsyncTaskLoader;
+
import android.util.Log;
import java.io.FileNotFoundException;
diff --git a/src/com/android/documentsui/inspector/RuntimeDataSupplier.java b/src/com/android/documentsui/inspector/RuntimeDataSupplier.java
index 1b7ff84ea..a7bac8140 100644
--- a/src/com/android/documentsui/inspector/RuntimeDataSupplier.java
+++ b/src/com/android/documentsui/inspector/RuntimeDataSupplier.java
@@ -17,10 +17,7 @@ package com.android.documentsui.inspector;
import static androidx.core.util.Preconditions.checkArgument;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
-import android.content.CursorLoader;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
@@ -29,6 +26,10 @@ import android.os.Handler;
import android.os.Looper;
import android.provider.DocumentsContract;
import androidx.annotation.Nullable;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.app.LoaderManager.LoaderCallbacks;
+import androidx.loader.content.CursorLoader;
+import androidx.loader.content.Loader;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.inspector.InspectorController.DataSupplier;
@@ -109,17 +110,17 @@ public class RuntimeDataSupplier implements DataSupplier {
public void getDocumentMetadata(Uri uri, Consumer<Bundle> callback) {
mMetadataCallbacks = new LoaderCallbacks<Bundle>() {
@Override
- public android.content.Loader<Bundle> onCreateLoader(int id, Bundle unused) {
+ public Loader<Bundle> onCreateLoader(int id, Bundle unused) {
return new MetadataLoader(mContext, uri);
}
@Override
- public void onLoadFinished(android.content.Loader<Bundle> loader, Bundle data) {
+ public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
callback.accept(data);
}
@Override
- public void onLoaderReset(android.content.Loader<Bundle> loader) {
+ public void onLoaderReset(Loader<Bundle> loader) {
}
};
@@ -173,12 +174,12 @@ public class RuntimeDataSupplier implements DataSupplier {
}
@Override
- public android.content.Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(mContext, mUri, null, null, null, null);
}
@Override
- public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor cursor) {
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor != null) {
mObserver = new InspectorContentObserver(loader::onContentChanged);
@@ -189,7 +190,7 @@ public class RuntimeDataSupplier implements DataSupplier {
}
@Override
- public void onLoaderReset(android.content.Loader<Cursor> loader) {
+ public void onLoaderReset(Loader<Cursor> loader) {
if (mObserver != null) {
mContext.getContentResolver().unregisterContentObserver(mObserver);
}
diff --git a/src/com/android/documentsui/picker/ActionHandler.java b/src/com/android/documentsui/picker/ActionHandler.java
index ff8a2dd71..ca4679b7a 100644
--- a/src/com/android/documentsui/picker/ActionHandler.java
+++ b/src/com/android/documentsui/picker/ActionHandler.java
@@ -23,8 +23,6 @@ import static com.android.documentsui.base.State.ACTION_OPEN;
import static com.android.documentsui.base.State.ACTION_OPEN_TREE;
import static com.android.documentsui.base.State.ACTION_PICK_COPY_DESTINATION;
-import android.app.Activity;
-import android.app.FragmentManager;
import android.content.ClipData;
import android.content.ComponentName;
import android.content.Intent;
@@ -36,6 +34,8 @@ import android.provider.DocumentsContract;
import android.provider.Settings;
import android.util.Log;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import com.android.documentsui.AbstractActionHandler;
@@ -67,7 +67,7 @@ import javax.annotation.Nullable;
/**
* Provides {@link PickActivity} action specializations to fragments.
*/
-class ActionHandler<T extends Activity & Addons> extends AbstractActionHandler<T> {
+class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionHandler<T> {
private static final String TAG = "PickerActionHandler";
@@ -208,7 +208,7 @@ class ActionHandler<T extends Activity & Addons> extends AbstractActionHandler<T
}
private void onExternalAppResult(int resultCode, Intent data) {
- if (resultCode != Activity.RESULT_CANCELED) {
+ if (resultCode != FragmentActivity.RESULT_CANCELED) {
// Remember that we last picked via external app
mLastAccessed.setLastAccessedToExternalApp(mActivity);
@@ -361,7 +361,7 @@ class ActionHandler<T extends Activity & Addons> extends AbstractActionHandler<T
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
}
- mActivity.setResult(Activity.RESULT_OK, intent, 0);
+ mActivity.setResult(FragmentActivity.RESULT_OK, intent, 0);
mActivity.finish();
}
@@ -379,8 +379,8 @@ class ActionHandler<T extends Activity & Addons> extends AbstractActionHandler<T
void onDocumentPicked(DocumentInfo doc);
/**
- * Overload final method {@link Activity#setResult(int, Intent)} so that we can intercept
- * this method call in test environment.
+ * Overload final method {@link FragmentActivity#setResult(int, Intent)} so that we can
+ * intercept this method call in test environment.
*/
@VisibleForTesting
void setResult(int resultCode, Intent result, int notUsed);
diff --git a/src/com/android/documentsui/picker/OverwriteConfirmFragment.java b/src/com/android/documentsui/picker/OverwriteConfirmFragment.java
index e4cb62341..5c36fe9d8 100644
--- a/src/com/android/documentsui/picker/OverwriteConfirmFragment.java
+++ b/src/com/android/documentsui/picker/OverwriteConfirmFragment.java
@@ -18,13 +18,14 @@ package com.android.documentsui.picker;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.os.Bundle;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Shared;
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index 4e1556275..76312a0da 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -22,13 +22,14 @@ import static com.android.documentsui.base.State.ACTION_OPEN;
import static com.android.documentsui.base.State.ACTION_OPEN_TREE;
import static com.android.documentsui.base.State.ACTION_PICK_COPY_DESTINATION;
-import android.app.Fragment;
-import android.app.FragmentManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import androidx.annotation.CallSuper;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
import android.view.KeyEvent;
import android.view.Menu;
@@ -142,22 +143,22 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
if (mState.action == ACTION_CREATE) {
final String mimeType = intent.getType();
final String title = intent.getStringExtra(Intent.EXTRA_TITLE);
- SaveFragment.show(getFragmentManager(), mimeType, title);
+ SaveFragment.show(getSupportFragmentManager(), mimeType, title);
} else if (mState.action == ACTION_OPEN_TREE ||
mState.action == ACTION_PICK_COPY_DESTINATION) {
- PickFragment.show(getFragmentManager());
+ PickFragment.show(getSupportFragmentManager());
}
if (mState.action == ACTION_GET_CONTENT) {
final Intent moreApps = new Intent(intent);
moreApps.setComponent(null);
moreApps.setPackage(null);
- RootsFragment.show(getFragmentManager(), moreApps);
+ RootsFragment.show(getSupportFragmentManager(), moreApps);
} else if (mState.action == ACTION_OPEN ||
mState.action == ACTION_CREATE ||
mState.action == ACTION_OPEN_TREE ||
mState.action == ACTION_PICK_COPY_DESTINATION) {
- RootsFragment.show(getFragmentManager(), (Intent) null);
+ RootsFragment.show(getSupportFragmentManager(), (Intent) null);
}
}
@@ -238,7 +239,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
final DocumentInfo cwd = getCurrentDirectory();
if (mState.action == ACTION_CREATE) {
- final FragmentManager fm = getFragmentManager();
+ final FragmentManager fm = getSupportFragmentManager();
SaveFragment.get(fm).prepareForDirectory(cwd);
}
@@ -247,7 +248,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
@Override
protected void refreshDirectory(int anim) {
- final FragmentManager fm = getFragmentManager();
+ final FragmentManager fm = getSupportFragmentManager();
final RootInfo root = getCurrentRoot();
final DocumentInfo cwd = getCurrentDirectory();
@@ -291,7 +292,7 @@ public class PickActivity extends BaseActivity implements ActionHandler.Addons {
@Override
public void onDocumentPicked(DocumentInfo doc) {
- final FragmentManager fm = getFragmentManager();
+ final FragmentManager fm = getSupportFragmentManager();
// Do not inline-open archives, as otherwise it would be impossible to pick
// archive files. Note, that picking files inside archives is not supported.
if (doc.isDirectory()) {
diff --git a/src/com/android/documentsui/picker/PickFragment.java b/src/com/android/documentsui/picker/PickFragment.java
index 3649cf409..bdb9f8058 100644
--- a/src/com/android/documentsui/picker/PickFragment.java
+++ b/src/com/android/documentsui/picker/PickFragment.java
@@ -23,10 +23,6 @@ import static com.android.documentsui.services.FileOperationService.OPERATION_EX
import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE;
import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN;
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -34,6 +30,11 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
import com.android.documentsui.BaseActivity;
import com.android.documentsui.Injector;
import com.android.documentsui.R;
@@ -62,7 +63,7 @@ public class PickFragment extends Fragment {
@Override
public void onClick(View v) {
final BaseActivity activity = BaseActivity.get(PickFragment.this);
- activity.setResult(Activity.RESULT_CANCELED);
+ activity.setResult(FragmentActivity.RESULT_CANCELED);
activity.finish();
}
};
diff --git a/src/com/android/documentsui/picker/SaveFragment.java b/src/com/android/documentsui/picker/SaveFragment.java
index 9bdb27222..f881768b9 100644
--- a/src/com/android/documentsui/picker/SaveFragment.java
+++ b/src/com/android/documentsui/picker/SaveFragment.java
@@ -16,9 +16,6 @@
package com.android.documentsui.picker;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
@@ -34,6 +31,10 @@ import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
import com.android.documentsui.IconUtils;
import com.android.documentsui.Injector;
import com.android.documentsui.R;
diff --git a/src/com/android/documentsui/queries/SearchViewManager.java b/src/com/android/documentsui/queries/SearchViewManager.java
index 14fb1e933..70c893a43 100644
--- a/src/com/android/documentsui/queries/SearchViewManager.java
+++ b/src/com/android/documentsui/queries/SearchViewManager.java
@@ -31,8 +31,6 @@ import android.view.MenuItem.OnActionExpandListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
-import android.widget.SearchView;
-import android.widget.SearchView.OnQueryTextListener;
import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
@@ -42,6 +40,8 @@ import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.Shared;
import androidx.annotation.GuardedBy;
import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.widget.SearchView;
+import androidx.appcompat.widget.SearchView.OnQueryTextListener;
import java.util.Timer;
import java.util.TimerTask;
diff --git a/src/com/android/documentsui/roots/RootsLoader.java b/src/com/android/documentsui/roots/RootsLoader.java
index c6687c464..f197c77d3 100644
--- a/src/com/android/documentsui/roots/RootsLoader.java
+++ b/src/com/android/documentsui/roots/RootsLoader.java
@@ -16,11 +16,12 @@
package com.android.documentsui.roots;
-import android.content.AsyncTaskLoader;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+
+import androidx.loader.content.AsyncTaskLoader;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.android.documentsui.base.RootInfo;
diff --git a/src/com/android/documentsui/sidebar/RootsFragment.java b/src/com/android/documentsui/sidebar/RootsFragment.java
index c77baa3e2..62fdf0584 100644
--- a/src/com/android/documentsui/sidebar/RootsFragment.java
+++ b/src/com/android/documentsui/sidebar/RootsFragment.java
@@ -20,13 +20,8 @@ import static com.android.documentsui.base.Shared.compareToIgnoreCaseNullable;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.Intent;
-import android.content.Loader;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
@@ -50,6 +45,12 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.app.LoaderManager.LoaderCallbacks;
+import androidx.loader.content.Loader;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
@@ -416,7 +417,7 @@ public class RootsFragment extends Fragment {
mList.setLongClickable(false);
}
- getLoaderManager().restartLoader(2, null, mCallbacks);
+ LoaderManager.getInstance(this).restartLoader(2, null, mCallbacks);
}
public void onCurrentRootChanged() {
diff --git a/src/com/android/documentsui/sorting/DropdownSortWidgetController.java b/src/com/android/documentsui/sorting/DropdownSortWidgetController.java
index 6dba172af..9e3a9c72a 100644
--- a/src/com/android/documentsui/sorting/DropdownSortWidgetController.java
+++ b/src/com/android/documentsui/sorting/DropdownSortWidgetController.java
@@ -16,10 +16,11 @@
package com.android.documentsui.sorting;
-import android.app.FragmentManager;
import android.view.View;
import android.widget.TextView;
+import androidx.fragment.app.FragmentManager;
+
import com.android.documentsui.R;
import com.android.documentsui.sorting.SortController.WidgetController;
import com.android.documentsui.sorting.SortModel.SortDimensionId;
diff --git a/src/com/android/documentsui/sorting/SortController.java b/src/com/android/documentsui/sorting/SortController.java
index 037a69c93..62e5741b7 100644
--- a/src/com/android/documentsui/sorting/SortController.java
+++ b/src/com/android/documentsui/sorting/SortController.java
@@ -17,7 +17,8 @@
package com.android.documentsui.sorting;
import androidx.annotation.Nullable;
-import android.app.Activity;
+import androidx.fragment.app.FragmentActivity;
+
import android.view.View;
import com.android.documentsui.Metrics;
@@ -73,7 +74,7 @@ public final class SortController {
}
public static SortController create(
- Activity activity,
+ FragmentActivity activity,
@ViewMode int initialMode,
SortModel sortModel) {
@@ -95,7 +96,7 @@ public final class SortController {
new DropdownSortWidgetController(
sortModel,
activity.findViewById(R.id.dropdown_sort_widget),
- activity.getFragmentManager()),
+ activity.getSupportFragmentManager()),
TableHeaderController.create(
sortModel,
activity.findViewById(R.id.table_header)));
diff --git a/src/com/android/documentsui/sorting/SortListFragment.java b/src/com/android/documentsui/sorting/SortListFragment.java
index e577f3b1f..3a602f199 100644
--- a/src/com/android/documentsui/sorting/SortListFragment.java
+++ b/src/com/android/documentsui/sorting/SortListFragment.java
@@ -1,8 +1,6 @@
package com.android.documentsui.sorting;
import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
@@ -14,6 +12,8 @@ import android.widget.FrameLayout;
import android.widget.ListView;
import androidx.annotation.StringRes;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
import com.android.documentsui.R;
import com.android.documentsui.sorting.SortDimension.SortDirection;
@@ -154,7 +154,7 @@ public class SortListFragment extends DialogFragment {
boolean selected = item.id == mModel.getSortedDimensionId()
&& item.direction == mModel.getCurrentSortDirection();
text.setChecked(selected);
- text.setCheckMarkDrawable(selected ? R.drawable.ic_done : 0);
+ text.setCheckMarkDrawable(R.drawable.list_checker);
return view;
}
}
diff --git a/src/com/android/documentsui/ui/DialogController.java b/src/com/android/documentsui/ui/DialogController.java
index 6b46ea41e..67ea5c5bf 100644
--- a/src/com/android/documentsui/ui/DialogController.java
+++ b/src/com/android/documentsui/ui/DialogController.java
@@ -17,11 +17,12 @@ package com.android.documentsui.ui;
import android.app.Activity;
import android.app.AlertDialog;
-import android.app.FragmentManager;
import android.content.DialogInterface;
import android.widget.Button;
import android.widget.TextView;
+import androidx.fragment.app.FragmentManager;
+
import com.google.android.material.snackbar.Snackbar;
import com.android.documentsui.R;
diff --git a/tests/common/com/android/documentsui/TestActivity.java b/tests/common/com/android/documentsui/TestActivity.java
index 3cdf78913..103fb404b 100644
--- a/tests/common/com/android/documentsui/TestActivity.java
+++ b/tests/common/com/android/documentsui/TestActivity.java
@@ -19,7 +19,8 @@ package com.android.documentsui;
import static junit.framework.Assert.assertEquals;
import androidx.annotation.Nullable;
-import android.app.Activity;
+import androidx.fragment.app.FragmentActivity;
+
import android.app.ActivityManager;
import android.app.LoaderManager;
import android.content.ComponentName;
@@ -42,6 +43,7 @@ import com.android.documentsui.testing.TestEventListener;
import com.android.documentsui.testing.TestLoaderManager;
import com.android.documentsui.testing.TestPackageManager;
import com.android.documentsui.testing.TestResources;
+import com.android.documentsui.testing.TestSupportLoaderManager;
import org.mockito.Mockito;
@@ -57,6 +59,7 @@ public abstract class TestActivity extends AbstractBase {
public RootInfo currentRoot;
public MockContentResolver contentResolver;
public TestLoaderManager loaderManager;
+ public TestSupportLoaderManager supportLoaderManager;
public ActivityManager activityManager;
public TestEventListener<Intent> startActivity;
@@ -90,6 +93,7 @@ public abstract class TestActivity extends AbstractBase {
notifyDirectoryNavigated = new TestEventListener<>();
contentResolver = env.contentResolver;
loaderManager = new TestLoaderManager();
+ supportLoaderManager = new TestSupportLoaderManager();
finishedHandler = new TestEventHandler<>();
}
@@ -198,6 +202,11 @@ public abstract class TestActivity extends AbstractBase {
}
@Override
+ public final androidx.loader.app.LoaderManager getSupportLoaderManager() {
+ return supportLoaderManager;
+ }
+
+ @Override
public final Object getSystemService(String service) {
switch (service) {
case Context.ACTIVITY_SERVICE:
@@ -215,4 +224,4 @@ public abstract class TestActivity extends AbstractBase {
// Trick Mockito into finding our Addons methods correctly. W/o this
// hack, Mockito thinks Addons methods are not implemented.
-abstract class AbstractBase extends Activity implements CommonAddons {}
+abstract class AbstractBase extends FragmentActivity implements CommonAddons {}
diff --git a/tests/common/com/android/documentsui/bots/DirectoryListBot.java b/tests/common/com/android/documentsui/bots/DirectoryListBot.java
index 4b1123235..cb287dbff 100644
--- a/tests/common/com/android/documentsui/bots/DirectoryListBot.java
+++ b/tests/common/com/android/documentsui/bots/DirectoryListBot.java
@@ -161,6 +161,10 @@ public class DirectoryListBot extends Bots.BaseBot {
"com.android.documentsui:id/message");
}
+ public void waitForHolderMessage() {
+ findPlaceholderMessageTextView().waitForExists(mTimeout);
+ }
+
public void assertSnackbar(int id) {
assertNotNull(getSnackbar(mContext.getString(id)));
}
diff --git a/tests/common/com/android/documentsui/bots/SearchBot.java b/tests/common/com/android/documentsui/bots/SearchBot.java
index fdd7a6cc9..0e2b7b132 100644
--- a/tests/common/com/android/documentsui/bots/SearchBot.java
+++ b/tests/common/com/android/documentsui/bots/SearchBot.java
@@ -58,7 +58,7 @@ public class SearchBot extends Bots.BaseBot {
// require this input be not clickable.
@SuppressWarnings("unchecked")
private static final Matcher<View> SEARCH_INPUT = allOf(
- withId(R.id.option_menu_search),
+ withId(R.id.search_src_text),
isDisplayed());
public SearchBot(UiDevice device, Context context, int timeout) {
@@ -113,12 +113,14 @@ public class SearchBot extends Bots.BaseBot {
}
private UiObject findSearchViewTextField() {
- return findObject("com.android.documentsui:id/option_menu_search", "android:id/search_src_text");
+ return findObject("com.android.documentsui:id/option_menu_search",
+ "com.android.documentsui:id/search_src_text");
}
private UiObject findSearchViewIcon() {
return mContext.getResources().getBoolean(R.bool.full_bar_search_view)
? findObject("com.android.documentsui:id/option_menu_search")
- : findObject("com.android.documentsui:id/option_menu_search", "android:id/search_button");
+ : findObject("com.android.documentsui:id/option_menu_search",
+ "android:id/search_button");
}
}
diff --git a/tests/common/com/android/documentsui/bots/UiBot.java b/tests/common/com/android/documentsui/bots/UiBot.java
index 11b98cc00..0d28c058c 100644
--- a/tests/common/com/android/documentsui/bots/UiBot.java
+++ b/tests/common/com/android/documentsui/bots/UiBot.java
@@ -44,7 +44,8 @@ import android.support.test.uiautomator.UiSelector;
import android.support.test.uiautomator.Until;
import android.util.TypedValue;
import android.view.View;
-import android.widget.Toolbar;
+
+import androidx.appcompat.widget.Toolbar;
import com.android.documentsui.R;
@@ -193,7 +194,8 @@ public class UiBot extends Bots.BaseBot {
public boolean waitForActionModeBarToAppear() {
UiObject2 bar =
- mDevice.wait(Until.findObject(By.res("android:id/action_mode_bar")), mTimeout);
+ mDevice.wait(Until.findObject(
+ By.res("com.android.documentsui:id/action_mode_bar")), mTimeout);
return (bar != null);
}
@@ -278,7 +280,7 @@ public class UiBot extends Bots.BaseBot {
}
UiObject findMenuMoreOptions() {
- UiSelector selector = new UiSelector().className("android.widget.ImageButton")
+ UiSelector selector = new UiSelector().className("android.widget.ImageView")
.descriptionContains("More options");
// TODO: use the system string ? android.R.string.action_menu_overflow_description
return mDevice.findObject(selector);
diff --git a/tests/common/com/android/documentsui/testing/TestLoaderManager.java b/tests/common/com/android/documentsui/testing/TestLoaderManager.java
index 334439830..172b9f51d 100644
--- a/tests/common/com/android/documentsui/testing/TestLoaderManager.java
+++ b/tests/common/com/android/documentsui/testing/TestLoaderManager.java
@@ -86,7 +86,6 @@ public class TestLoaderManager extends LoaderManager {
public void runAsyncTaskLoader(int id) {
AsyncTaskLoader loader = (AsyncTaskLoader) getLoader(id);
loader.startLoading();
- loader.waitForLoader();
}
@Override
diff --git a/tests/common/com/android/documentsui/testing/TestMenu.java b/tests/common/com/android/documentsui/testing/TestMenu.java
index 20c22a0c1..32dfce0f4 100644
--- a/tests/common/com/android/documentsui/testing/TestMenu.java
+++ b/tests/common/com/android/documentsui/testing/TestMenu.java
@@ -18,7 +18,8 @@ package com.android.documentsui.testing;
import android.util.SparseArray;
import android.view.Menu;
-import android.widget.SearchView;
+
+import androidx.appcompat.widget.SearchView;
import com.android.documentsui.R;
diff --git a/tests/common/com/android/documentsui/testing/TestSupportLoaderManager.java b/tests/common/com/android/documentsui/testing/TestSupportLoaderManager.java
new file mode 100644
index 000000000..12ef540f0
--- /dev/null
+++ b/tests/common/com/android/documentsui/testing/TestSupportLoaderManager.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * 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.android.documentsui.testing;
+
+import android.os.Bundle;
+import android.util.SparseArray;
+
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.AsyncTaskLoader;
+import androidx.loader.content.Loader;
+import androidx.loader.content.Loader.OnLoadCompleteListener;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * A test double of {@link LoaderManager} that doesn't kick off loading when {@link Loader} is
+ * created. If caller needs to kick off loading caller can obtain the loader initialized and
+ * explicitly call {@link Loader#startLoading()}.
+ *
+ * This is androidx version of TestLoaderManager.
+ */
+public class TestSupportLoaderManager extends LoaderManager {
+
+ private final SparseArray<Loader> mLoaders = new SparseArray<>();
+ private final SparseArray<OnLoadCompleteListener> mListeners = new SparseArray<>();
+
+ @Override
+ public <D> Loader<D> initLoader(int id, Bundle args,
+ LoaderCallbacks<D> callback) {
+ Loader<D> loader = mLoaders.get(id);
+ OnLoadCompleteListener<D> listener = callback::onLoadFinished;
+ if (loader == null) {
+ loader = callback.onCreateLoader(id, args);
+ mLoaders.put(id, loader);
+ } else {
+ loader.unregisterListener(mListeners.get(id));
+ }
+
+ loader.registerListener(id, listener);
+ mListeners.put(id, listener);
+
+ return loader;
+ }
+
+ @Override
+ public <D> Loader<D> restartLoader(int id, Bundle args,
+ LoaderCallbacks<D> callback) {
+ if (mLoaders.get(id) != null) {
+ destroyLoader(id);
+ }
+
+ return initLoader(id, args, callback);
+ }
+
+ @Override
+ public void destroyLoader(int id) {
+ Loader loader = getLoader(id);
+ if (loader != null) {
+ loader.abandon();
+ mLoaders.remove(id);
+ mListeners.remove(id);
+ }
+ }
+
+ @Override
+ public <D> Loader<D> getLoader(int id) {
+ return mLoaders.get(id);
+ }
+
+ @Override
+ public void markForRedelivery() {
+
+ }
+
+ public <D> OnLoadCompleteListener<D> getListener(int id) {
+ return mListeners.get(id);
+ }
+
+ public void runAsyncTaskLoader(int id) {
+ AsyncTaskLoader loader = (AsyncTaskLoader) getLoader(id);
+ loader.startLoading();
+ }
+
+ @Override
+ public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+
+ }
+}
diff --git a/tests/common/com/android/documentsui/ui/TestDialogController.java b/tests/common/com/android/documentsui/ui/TestDialogController.java
index 3bd6db6fb..ac4d5323b 100644
--- a/tests/common/com/android/documentsui/ui/TestDialogController.java
+++ b/tests/common/com/android/documentsui/ui/TestDialogController.java
@@ -15,7 +15,7 @@
*/
package com.android.documentsui.ui;
-import android.app.FragmentManager;
+import androidx.fragment.app.FragmentManager;
import com.android.documentsui.base.ConfirmationCallback;
import com.android.documentsui.base.DocumentInfo;
@@ -26,7 +26,6 @@ import junit.framework.Assert;
import java.util.List;
-
public class TestDialogController implements DialogController {
public int mNextConfirmationCode;
diff --git a/tests/functional/com/android/documentsui/SearchViewUiTest.java b/tests/functional/com/android/documentsui/SearchViewUiTest.java
index 685ed2ac4..e84136149 100644
--- a/tests/functional/com/android/documentsui/SearchViewUiTest.java
+++ b/tests/functional/com/android/documentsui/SearchViewUiTest.java
@@ -83,7 +83,6 @@ public class SearchViewUiTest extends ActivityTest<FilesActivity> {
public void testSearchView_CollapsesOnBack() throws Exception {
bots.search.clickIcon();
device.pressBack();
- device.pressBack();
bots.search.assertIconVisible(true);
bots.search.assertInputExists(false);
@@ -94,7 +93,6 @@ public class SearchViewUiTest extends ActivityTest<FilesActivity> {
bots.search.setInputText("file2");
device.pressBack();
- device.pressBack();
// Wait for a file in the default directory to be listed.
bots.directory.waitForDocument(dirName1);
@@ -103,6 +101,31 @@ public class SearchViewUiTest extends ActivityTest<FilesActivity> {
bots.search.assertInputExists(false);
}
+ public void testSearchView_ClearsSearchOnBack() throws Exception {
+ bots.search.clickIcon();
+ bots.search.setInputText("file1");
+ bots.keyboard.pressEnter();
+ device.waitForIdle();
+
+ device.pressBack();
+
+ bots.search.assertIconVisible(true);
+ bots.search.assertInputExists(false);
+ }
+
+ public void testSearchView_ClearsAutoSearchOnBack() throws Exception {
+ bots.search.clickIcon();
+ bots.search.setInputText("chocolate");
+ //Wait for auto search result, it should be no results and show holder message.
+ bots.directory.waitForHolderMessage();
+
+ device.pressBack();
+ device.pressBack();
+
+ bots.search.assertIconVisible(true);
+ bots.search.assertInputExists(false);
+ }
+
public void testSearchView_StateAfterSearch() throws Exception {
bots.search.clickIcon();
bots.search.setInputText("file1");
diff --git a/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java b/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java
index cc267bcc0..afb895251 100644
--- a/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/AbstractActionHandlerTest.java
@@ -47,6 +47,8 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* A unit test *for* AbstractActionHandler, not an abstract test baseclass.
@@ -257,8 +259,11 @@ public class AbstractActionHandlerTest {
.setNextChildDocumentsReturns(TestEnv.FILE_APK, TestEnv.FILE_GIF);
mHandler.loadDocumentsForCurrentStack();
+ CountDownLatch latch = new CountDownLatch(1);
+ mEnv.model.addUpdateListener(event -> latch.countDown());
mActivity.loaderManager.runAsyncTaskLoader(AbstractActionHandler.LOADER_ID);
+ latch.await(1, TimeUnit.SECONDS);
assertEquals(2, mEnv.model.getItemCount());
String[] modelIds = mEnv.model.getModelIds();
assertEquals(TestEnv.FILE_APK, mEnv.model.getDocument(modelIds[0]));
diff --git a/tests/unit/com/android/documentsui/inspector/DocumentLoaderTest.java b/tests/unit/com/android/documentsui/inspector/DocumentLoaderTest.java
index 963c8d656..243bb8860 100644
--- a/tests/unit/com/android/documentsui/inspector/DocumentLoaderTest.java
+++ b/tests/unit/com/android/documentsui/inspector/DocumentLoaderTest.java
@@ -29,7 +29,7 @@ import com.android.documentsui.InspectorProvider;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.inspector.InspectorController.DataSupplier;
import com.android.documentsui.testing.LatchedConsumer;
-import com.android.documentsui.testing.TestLoaderManager;
+import com.android.documentsui.testing.TestSupportLoaderManager;
import junit.framework.TestCase;
@@ -49,7 +49,7 @@ public class DocumentLoaderTest extends TestCase {
private static final String NOT_DIRECTORY = "OpenInProviderTest";
private Context mContext;
- private TestLoaderManager mLoaderManager;
+ private TestSupportLoaderManager mLoaderManager;
private DataSupplier mLoader;
private ContentResolver mResolver;
@@ -58,7 +58,7 @@ public class DocumentLoaderTest extends TestCase {
super.setUp();
mContext = InstrumentationRegistry.getTargetContext();
mResolver = mContext.getContentResolver();
- mLoaderManager = new TestLoaderManager();
+ mLoaderManager = new TestSupportLoaderManager();
mLoader = new RuntimeDataSupplier(mContext, mLoaderManager);
if (Looper.myLooper() == null) {