diff options
Diffstat (limited to 'src')
8 files changed, 82 insertions, 132 deletions
diff --git a/src/com/android/documentsui/AbstractActionHandler.java b/src/com/android/documentsui/AbstractActionHandler.java index c450c70de..0c612eddd 100644 --- a/src/com/android/documentsui/AbstractActionHandler.java +++ b/src/com/android/documentsui/AbstractActionHandler.java @@ -87,9 +87,7 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA implements ActionHandler { @VisibleForTesting - public static final int CODE_FORWARD = 42; public static final int CODE_AUTHENTICATION = 43; - public static final int CODE_FORWARD_CROSS_PROFILE = 44; @VisibleForTesting static final int LOADER_ID = 42; @@ -177,6 +175,11 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA } @Override + public void requestQuietModeDisabled(RootInfo info, UserId userId) { + new RequestQuietModeDisabledTask(mActivity, userId).execute(); + } + + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CODE_AUTHENTICATION: diff --git a/src/com/android/documentsui/ActionHandler.java b/src/com/android/documentsui/ActionHandler.java index 71cccf9ee..15124eb33 100644 --- a/src/com/android/documentsui/ActionHandler.java +++ b/src/com/android/documentsui/ActionHandler.java @@ -89,6 +89,8 @@ public interface ActionHandler { */ void startAuthentication(PendingIntent intent); + void requestQuietModeDisabled(RootInfo info, UserId userId); + void showAppDetails(ResolveInfo info, UserId userId); void openRoot(RootInfo root); diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java index d0ffe593c..0ddf001be 100644 --- a/src/com/android/documentsui/BaseActivity.java +++ b/src/com/android/documentsui/BaseActivity.java @@ -619,10 +619,10 @@ public abstract class BaseActivity // Causes talkback to announce the activity's new title String appName = getString(R.string.files_label); - if (getTitle().toString().isEmpty()) { + if (getTitle() == null || getTitle().toString().isEmpty()) { // First launch, TalkBack announces app name. setTitle(String.format("%s. %s", appName, mState.stack.getTitle())); - } else { + } else if (mState.stack.getTitle() != null) { setTitle(mState.stack.getTitle()); } diff --git a/src/com/android/documentsui/ForResultForwarderActivity.java b/src/com/android/documentsui/ForResultForwarderActivity.java deleted file mode 100644 index 61cee71dc..000000000 --- a/src/com/android/documentsui/ForResultForwarderActivity.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2020 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; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; - -import com.android.documentsui.base.UserId; - -/** - * Forwards a cross-profile startActivityForResult intent. - */ -public class ForResultForwarderActivity extends Activity { - - private static final String TAG = "ForResultForwarderActiv"; - private static final String EXTRA_INTENT = "EXTRA_INTENT"; - private static final String EXTRA_USER = "EXTRA_USER"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - final Intent intent = getIntent(); - - if (!intent.hasExtra(EXTRA_INTENT) || !intent.hasExtra(EXTRA_USER)) { - Log.e(TAG, "Missing intent or user"); - setResult(Activity.RESULT_CANCELED); - finish(); - return; - } - - Intent targetIntent = intent.getParcelableExtra(EXTRA_INTENT); - // We should never have the default value because of the above check - UserId targetUserId = UserId.of(intent.getIntExtra(EXTRA_USER, /* defaultValue= */ -1)); - - targetIntent.addFlags( - Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); - try { - targetUserId.startActivityAsUser(this, targetIntent); - } catch (RuntimeException e) { - Log.e(TAG, "Failed to forward activity"); - setResult(Activity.RESULT_CANCELED); - } - finish(); - } - - public static Intent getIntent(Context context, Intent intent, UserId targetUserId) { - Intent forwarder = new Intent(context, ForResultForwarderActivity.class); - forwarder.putExtra(EXTRA_INTENT, intent); - forwarder.putExtra(EXTRA_USER, targetUserId.getIdentifier()); - return forwarder; - } -} diff --git a/src/com/android/documentsui/RequestQuietModeDisabledTask.java b/src/com/android/documentsui/RequestQuietModeDisabledTask.java new file mode 100644 index 000000000..238e4f96c --- /dev/null +++ b/src/com/android/documentsui/RequestQuietModeDisabledTask.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2020 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; + +import static androidx.core.util.Preconditions.checkNotNull; + +import android.content.Context; +import android.os.AsyncTask; + +import com.android.documentsui.base.UserId; + +import java.lang.ref.WeakReference; + +/** + * A task to request disabling quiet mode for a given user. + */ +class RequestQuietModeDisabledTask extends AsyncTask<Void, Void, Void> { + + private final WeakReference<Context> mContextWeakReference; + private final UserId mUserId; + + RequestQuietModeDisabledTask(Context context, UserId userId) { + mContextWeakReference = new WeakReference<>(checkNotNull(context)); + mUserId = checkNotNull(userId); + } + + @Override + protected Void doInBackground(Void... voids) { + Context context = mContextWeakReference.get(); + if (context != null) { + mUserId.requestQuietModeDisabled(context); + } + return null; + } +} diff --git a/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java b/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java index 9148345e6..4b1113675 100644 --- a/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java +++ b/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java @@ -22,6 +22,7 @@ import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.ProgressBar; import android.widget.TextView; import com.android.documentsui.R; @@ -47,11 +48,15 @@ final class InflateMessageDocumentHolder extends MessageHolder { private View mContentView; private View mCrossProfileView; + private View mCrossProfileContent; + private ProgressBar mCrossProfileProgress; public InflateMessageDocumentHolder(Context context, ViewGroup parent) { super(context, parent, R.layout.item_doc_inflated_message); mContentView = itemView.findViewById(R.id.content); mCrossProfileView = itemView.findViewById(R.id.cross_profile); + mCrossProfileContent = mCrossProfileView.findViewById(R.id.cross_profile_content); + mCrossProfileProgress = mCrossProfileView.findViewById(R.id.cross_profile_progress); mContentMessage = mContentView.findViewById(R.id.message); mContentImage = mContentView.findViewById(R.id.artwork); @@ -76,7 +81,9 @@ final class InflateMessageDocumentHolder extends MessageHolder { } } - private void onButtonClick(View button) { + private void onCrossProfileButtonClick(View button) { + mCrossProfileContent.setVisibility(View.GONE); + mCrossProfileProgress.setVisibility(View.VISIBLE); mMessage.runCallback(); } @@ -91,6 +98,9 @@ final class InflateMessageDocumentHolder extends MessageHolder { private void bindCrossProfileMessageView() { mContentView.setVisibility(View.GONE); mCrossProfileView.setVisibility(View.VISIBLE); + mCrossProfileContent.setVisibility(View.VISIBLE); + mCrossProfileProgress.setVisibility(View.GONE); + mCrossProfileTitle.setText(mMessage.getTitleString()); if (!TextUtils.isEmpty(mMessage.getMessageString())) { mCrossProfileMessage.setVisibility(View.VISIBLE); @@ -102,7 +112,7 @@ final class InflateMessageDocumentHolder extends MessageHolder { if (!TextUtils.isEmpty(mMessage.getButtonString())) { mCrossProfileButton.setVisibility(View.VISIBLE); mCrossProfileButton.setText(mMessage.getButtonString()); - mCrossProfileButton.setOnClickListener(this::onButtonClick); + mCrossProfileButton.setOnClickListener(this::onCrossProfileButtonClick); } else { mCrossProfileButton.setVisibility(View.GONE); } diff --git a/src/com/android/documentsui/dirlist/Message.java b/src/com/android/documentsui/dirlist/Message.java index 4fc7c497f..b5074e4a1 100644 --- a/src/com/android/documentsui/dirlist/Message.java +++ b/src/com/android/documentsui/dirlist/Message.java @@ -21,7 +21,6 @@ import android.app.AuthenticationRequiredException; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; -import android.os.AsyncTask; import androidx.annotation.Nullable; @@ -215,14 +214,8 @@ abstract class Message { CharSequence buttonText = null; if (mCanModifyQuietMode) { buttonText = mEnv.getContext().getResources().getText(R.string.quiet_mode_button); - mCallback = () -> - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... voids) { - userId.requestQuietModeDisabled(mEnv.getContext()); - return null; - } - }.execute(); + mCallback = () -> mEnv.getActionHandler().requestQuietModeDisabled( + mEnv.getDisplayState().stack.getRoot(), userId); } update( mEnv.getContext().getResources().getText(R.string.quiet_mode_error_title), diff --git a/src/com/android/documentsui/picker/ActionHandler.java b/src/com/android/documentsui/picker/ActionHandler.java index c58927dc7..18a1487ca 100644 --- a/src/com/android/documentsui/picker/ActionHandler.java +++ b/src/com/android/documentsui/picker/ActionHandler.java @@ -43,7 +43,6 @@ import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails; import com.android.documentsui.AbstractActionHandler; import com.android.documentsui.ActivityConfig; import com.android.documentsui.DocumentsAccess; -import com.android.documentsui.ForResultForwarderActivity; import com.android.documentsui.Injector; import com.android.documentsui.MetricConsts; import com.android.documentsui.Metrics; @@ -243,46 +242,6 @@ class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionH } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (DEBUG) { - Log.d(TAG, "onActivityResult() code=" + resultCode); - } - - // Only relay back results when not canceled; otherwise stick around to - // let the user pick another app/backend. - switch (requestCode) { - case CODE_FORWARD: - case CODE_FORWARD_CROSS_PROFILE: - onExternalAppResult(requestCode, resultCode, data); - break; - default: - super.onActivityResult(requestCode, resultCode, data); - } - } - - private void onExternalAppResult(int requestCode, int resultCode, Intent data) { - if (resultCode != FragmentActivity.RESULT_CANCELED) { - if (requestCode == CODE_FORWARD_CROSS_PROFILE) { - UserId otherUser = UserId.CURRENT_USER.equals(mUserIdManager.getSystemUser()) - ? mUserIdManager.getManagedUser() - : mUserIdManager.getSystemUser(); - if (!mState.canInteractWith(otherUser)) { - mDialogs.showActionNotAllowed(); - return; - } - } - // Remember that we last picked via external app - mLastAccessed.setLastAccessedToExternalApp(mActivity); - - updatePickResult(data, false, MetricConsts.ROOT_THIRD_PARTY_APP); - - // Pass back result to original caller - mActivity.setResult(resultCode, data, 0); - mActivity.finish(); - } - } - - @Override public void openInNewWindow(DocumentStack path) { // Open new window support only depends on vanilla Activity, so it is // implemented in our parent class. But we don't support that in @@ -311,27 +270,30 @@ class ActionHandler<T extends FragmentActivity & Addons> extends AbstractActionH } Intent intent = new Intent(mActivity.getIntent()); - final int flagsRemoved = Intent.FLAG_ACTIVITY_FORWARD_RESULT - | Intent.FLAG_GRANT_READ_URI_PERMISSION + final int flagsRemoved = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; intent.setFlags(intent.getFlags() & ~flagsRemoved); + intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); intent.setComponent(new ComponentName( info.activityInfo.applicationInfo.packageName, info.activityInfo.name)); - if (!UserId.CURRENT_USER.equals(userId)) { - intent = ForResultForwarderActivity.getIntent(mActivity, intent, userId); - } try { boolean isCurrentUser = UserId.CURRENT_USER.equals(userId); - mActivity.startActivityForResult(intent, - isCurrentUser ? CODE_FORWARD : CODE_FORWARD_CROSS_PROFILE); + if (isCurrentUser) { + mActivity.startActivity(intent); + } else { + userId.startActivityAsUser(mActivity, intent); + } + mActivity.finish(); } catch (SecurityException | ActivityNotFoundException e) { Log.e(TAG, "Caught error: " + e.getLocalizedMessage()); mInjector.dialogs.showNoApplicationFound(); } } + @Override public void springOpenDirectory(DocumentInfo doc) { } |