diff options
author | 2018-09-13 14:41:16 +0800 | |
---|---|---|
committer | 2018-11-01 18:57:19 +0800 | |
commit | 8d8d92f38f2a92cc914b3e59648f3eee7ce9af47 (patch) | |
tree | da0d96886c30a6bdb11cb3ffc7edcb062f8ee976 | |
parent | 360365815ae97b684ddf7f3c9d488df74a74ad65 (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
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) { |