Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2016 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package com.android.documentsui; |
| 18 | |
| 19 | import android.app.Activity; |
Garfield Tan | be1e079 | 2017-02-24 17:14:53 -0800 | [diff] [blame] | 20 | import android.content.BroadcastReceiver; |
| 21 | import android.content.Context; |
| 22 | import android.content.Intent; |
| 23 | import android.content.IntentFilter; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 24 | import android.net.Uri; |
KOUSHIK PANUGANTI | 6ca7acc | 2018-04-17 16:00:10 -0700 | [diff] [blame] | 25 | import androidx.localbroadcastmanager.content.LocalBroadcastManager; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 26 | |
| 27 | import com.android.documentsui.AbstractActionHandler.CommonAddons; |
| 28 | import com.android.documentsui.base.DocumentInfo; |
| 29 | import com.android.documentsui.base.PairedTask; |
| 30 | import com.android.documentsui.base.RootInfo; |
| 31 | import com.android.documentsui.base.State; |
| 32 | import com.android.documentsui.dirlist.AnimationView; |
Steve McKay | 3a26823 | 2016-10-19 11:15:47 -0700 | [diff] [blame] | 33 | import com.android.documentsui.queries.SearchViewManager; |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 34 | import com.android.documentsui.roots.ProvidersAccess; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 35 | |
| 36 | import java.util.Collection; |
| 37 | |
| 38 | /** |
| 39 | * Monitors roots change and refresh the page when necessary. |
| 40 | */ |
| 41 | final class RootsMonitor<T extends Activity & CommonAddons> { |
| 42 | |
Garfield Tan | be1e079 | 2017-02-24 17:14:53 -0800 | [diff] [blame] | 43 | private final LocalBroadcastManager mManager; |
| 44 | private final BroadcastReceiver mReceiver; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 45 | |
| 46 | RootsMonitor( |
| 47 | final T activity, |
| 48 | final ActionHandler actions, |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 49 | final ProvidersAccess providers, |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 50 | final DocumentsAccess docs, |
| 51 | final State state, |
Garfield Tan | 80b52b3 | 2017-04-25 15:50:52 -0700 | [diff] [blame] | 52 | final SearchViewManager searchMgr, |
| 53 | final Runnable actionModeFinisher) { |
Garfield Tan | be1e079 | 2017-02-24 17:14:53 -0800 | [diff] [blame] | 54 | mManager = LocalBroadcastManager.getInstance(activity); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 55 | |
Garfield Tan | be1e079 | 2017-02-24 17:14:53 -0800 | [diff] [blame] | 56 | mReceiver = new BroadcastReceiver() { |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 57 | @Override |
Garfield Tan | be1e079 | 2017-02-24 17:14:53 -0800 | [diff] [blame] | 58 | public void onReceive(Context context, Intent intent) { |
Steve McKay | 2d19a69 | 2017-08-22 09:05:08 -0700 | [diff] [blame] | 59 | new HandleRootsChangedTask<>( |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 60 | activity, |
| 61 | actions, |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 62 | providers, |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 63 | docs, |
| 64 | state, |
Garfield Tan | 80b52b3 | 2017-04-25 15:50:52 -0700 | [diff] [blame] | 65 | searchMgr, |
| 66 | actionModeFinisher).execute(activity.getCurrentRoot()); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 67 | } |
| 68 | }; |
| 69 | } |
| 70 | |
| 71 | void start() { |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 72 | mManager.registerReceiver(mReceiver, new IntentFilter(ProvidersAccess.BROADCAST_ACTION)); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 73 | } |
| 74 | |
| 75 | void stop() { |
Garfield Tan | be1e079 | 2017-02-24 17:14:53 -0800 | [diff] [blame] | 76 | mManager.unregisterReceiver(mReceiver); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 77 | } |
| 78 | |
| 79 | private static class HandleRootsChangedTask<T extends Activity & CommonAddons> |
| 80 | extends PairedTask<T, RootInfo, RootInfo> { |
| 81 | private final ActionHandler mActions; |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 82 | private final ProvidersAccess mProviders; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 83 | private final DocumentsAccess mDocs; |
| 84 | private final State mState; |
| 85 | private final SearchViewManager mSearchMgr; |
Garfield Tan | 80b52b3 | 2017-04-25 15:50:52 -0700 | [diff] [blame] | 86 | private final Runnable mActionModeFinisher; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 87 | |
| 88 | private RootInfo mCurrentRoot; |
| 89 | private DocumentInfo mDefaultRootDocument; |
| 90 | |
| 91 | private HandleRootsChangedTask( |
| 92 | T activity, |
| 93 | ActionHandler actions, |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 94 | ProvidersAccess providers, |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 95 | DocumentsAccess docs, |
| 96 | State state, |
Garfield Tan | 80b52b3 | 2017-04-25 15:50:52 -0700 | [diff] [blame] | 97 | SearchViewManager searchMgr, |
| 98 | Runnable actionModeFinisher) { |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 99 | super(activity); |
| 100 | mActions = actions; |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 101 | mProviders = providers; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 102 | mDocs = docs; |
| 103 | mState = state; |
| 104 | mSearchMgr = searchMgr; |
Garfield Tan | 80b52b3 | 2017-04-25 15:50:52 -0700 | [diff] [blame] | 105 | mActionModeFinisher = actionModeFinisher; |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | @Override |
| 109 | protected RootInfo run(RootInfo... roots) { |
| 110 | assert (roots.length == 1); |
| 111 | mCurrentRoot = roots[0]; |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 112 | final Collection<RootInfo> cachedRoots = mProviders.getRootsBlocking(); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 113 | for (final RootInfo root : cachedRoots) { |
| 114 | if (root.getUri().equals(mCurrentRoot.getUri())) { |
| 115 | // We don't need to change the current root as the current root was not removed. |
| 116 | return null; |
| 117 | } |
| 118 | } |
| 119 | |
| 120 | // Choose the default root. |
Jon Mann | 9bd4099 | 2017-03-24 12:34:34 -0700 | [diff] [blame] | 121 | final RootInfo defaultRoot = mProviders.getDefaultRootBlocking(mState); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 122 | assert (defaultRoot != null); |
| 123 | if (!defaultRoot.isRecents()) { |
| 124 | mDefaultRootDocument = mDocs.getRootDocument(defaultRoot); |
| 125 | } |
| 126 | return defaultRoot; |
| 127 | } |
| 128 | |
| 129 | @Override |
| 130 | protected void finish(RootInfo defaultRoot) { |
| 131 | if (defaultRoot == null) { |
| 132 | return; |
| 133 | } |
| 134 | |
| 135 | // If the activity has been launched for the specific root and it is removed, finish the |
| 136 | // activity. |
| 137 | final Uri uri = mOwner.getIntent().getData(); |
| 138 | if (uri != null && uri.equals(mCurrentRoot.getUri())) { |
| 139 | mOwner.finish(); |
| 140 | return; |
| 141 | } |
| 142 | |
Garfield Tan | 80b52b3 | 2017-04-25 15:50:52 -0700 | [diff] [blame] | 143 | // Clean action mode before changing root. |
| 144 | mActionModeFinisher.run(); |
| 145 | |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 146 | // Clear entire backstack and start in new root. |
Garfield Tan | 2a83742 | 2016-10-19 11:50:45 -0700 | [diff] [blame] | 147 | mState.stack.changeRoot(defaultRoot); |
Tomasz Mikolajewski | 9e04785 | 2017-02-13 14:05:17 +0900 | [diff] [blame] | 148 | mSearchMgr.update(mState.stack); |
Garfield Tan | 63bf813 | 2016-10-11 11:00:49 -0700 | [diff] [blame] | 149 | |
| 150 | if (defaultRoot.isRecents()) { |
| 151 | mOwner.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE); |
| 152 | } else { |
| 153 | mActions.openContainerDocument(mDefaultRootDocument); |
| 154 | } |
| 155 | } |
| 156 | } |
| 157 | } |