Merge "Fix User unable to view the keyboard input" into pi-dev
This commit is contained in:
@@ -42,7 +42,7 @@
|
||||
android:singleLine="true"
|
||||
android:ellipsize="start"
|
||||
android:inputType="textShortMessage|textAutoCorrect|textCapSentences"
|
||||
android:imeOptions="actionSend" />
|
||||
android:imeOptions="actionSend|flagNoExtractUi|flagNoFullscreen" />
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -56,6 +56,7 @@ import com.android.systemui.statusbar.phone.ScrimState;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
|
||||
import com.android.systemui.statusbar.policy.SmartReplyConstants;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
@@ -148,5 +149,7 @@ public class SystemUIFactory {
|
||||
providers.put(NotificationEntryManager.class, () -> new NotificationEntryManager(context));
|
||||
providers.put(KeyguardDismissUtil.class, KeyguardDismissUtil::new);
|
||||
providers.put(SmartReplyController.class, () -> new SmartReplyController());
|
||||
providers.put(RemoteInputQuickSettingsDisabler.class,
|
||||
() -> new RemoteInputQuickSettingsDisabler(context));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.FrameLayout.LayoutParams;
|
||||
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.Interpolators;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.R.id;
|
||||
@@ -43,6 +44,7 @@ import com.android.systemui.plugins.qs.QS;
|
||||
import com.android.systemui.qs.customize.QSCustomizer;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
|
||||
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
|
||||
import com.android.systemui.statusbar.stack.StackStateAnimator;
|
||||
|
||||
public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks {
|
||||
@@ -72,6 +74,9 @@ public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks {
|
||||
private float mLastQSExpansion = -1;
|
||||
private boolean mQsDisabled;
|
||||
|
||||
private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler =
|
||||
Dependency.get(RemoteInputQuickSettingsDisabler.class);
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
@@ -191,6 +196,8 @@ public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks {
|
||||
|
||||
@Override
|
||||
public void disable(int state1, int state2, boolean animate) {
|
||||
state2 = mRemoteInputQuickSettingsDisabler.adjustDisableFlags(state2);
|
||||
|
||||
final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
|
||||
if (disabled == mQsDisabled) return;
|
||||
mQsDisabled = disabled;
|
||||
|
||||
@@ -234,6 +234,7 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
|
||||
import com.android.systemui.statusbar.policy.NetworkController;
|
||||
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
|
||||
import com.android.systemui.statusbar.policy.PreviewInflater;
|
||||
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
|
||||
import com.android.systemui.statusbar.policy.UserInfoController;
|
||||
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
|
||||
import com.android.systemui.statusbar.policy.UserSwitcherController;
|
||||
@@ -399,6 +400,9 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
private View mPendingRemoteInputView;
|
||||
private View mPendingWorkRemoteInputView;
|
||||
|
||||
private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler =
|
||||
Dependency.get(RemoteInputQuickSettingsDisabler.class);
|
||||
|
||||
private View mReportRejectedTouch;
|
||||
|
||||
private int mMaxAllowedKeyguardNotifications;
|
||||
@@ -1759,6 +1763,8 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
*/
|
||||
@Override
|
||||
public void disable(int state1, int state2, boolean animate) {
|
||||
state2 = mRemoteInputQuickSettingsDisabler.adjustDisableFlags(state2);
|
||||
|
||||
animate &= mStatusBarWindowState != WINDOW_STATE_HIDDEN;
|
||||
final int old1 = mDisabled1;
|
||||
final int diff1 = state1 ^ old1;
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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.systemui.statusbar.policy;
|
||||
|
||||
import android.app.StatusBarManager;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.SysUiServiceProvider;
|
||||
import com.android.systemui.qs.QSFragment;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
|
||||
/**
|
||||
* Let {@link RemoteInputView} to control the visibility of QuickSetting.
|
||||
*/
|
||||
public class RemoteInputQuickSettingsDisabler
|
||||
implements ConfigurationController.ConfigurationListener {
|
||||
|
||||
private Context mContext;
|
||||
@VisibleForTesting boolean mRemoteInputActive;
|
||||
@VisibleForTesting boolean misLandscape;
|
||||
private int mLastOrientation;
|
||||
@VisibleForTesting CommandQueue mCommandQueue;
|
||||
|
||||
public RemoteInputQuickSettingsDisabler(Context context) {
|
||||
mContext = context;
|
||||
mCommandQueue = SysUiServiceProvider.getComponent(context, CommandQueue.class);
|
||||
mLastOrientation = mContext.getResources().getConfiguration().orientation;
|
||||
Dependency.get(ConfigurationController.class).addCallback(this);
|
||||
}
|
||||
|
||||
public int adjustDisableFlags(int state) {
|
||||
if (mRemoteInputActive && misLandscape) {
|
||||
state |= StatusBarManager.DISABLE2_QUICK_SETTINGS;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setRemoteInputActive(boolean active){
|
||||
if(mRemoteInputActive != active){
|
||||
mRemoteInputActive = active;
|
||||
recomputeDisableFlags();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigChanged(Configuration newConfig) {
|
||||
if (newConfig.orientation != mLastOrientation) {
|
||||
misLandscape = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE;
|
||||
mLastOrientation = newConfig.orientation;
|
||||
recomputeDisableFlags();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reapplies the disable flags. Then the method adjustDisableFlags in this class will be invoked
|
||||
* in {@link QSFragment#disable(int, int, boolean)} and
|
||||
* {@link StatusBar#disable(int, int, boolean)}
|
||||
* to modify the disable flags according to the status of mRemoteInputActive and misLandscape.
|
||||
*/
|
||||
private void recomputeDisableFlags() {
|
||||
mCommandQueue.recomputeDisableFlags(true);
|
||||
}
|
||||
}
|
||||
@@ -53,6 +53,7 @@ import android.widget.TextView;
|
||||
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.Interpolators;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.NotificationData;
|
||||
@@ -81,6 +82,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
|
||||
private RemoteInput[] mRemoteInputs;
|
||||
private RemoteInput mRemoteInput;
|
||||
private RemoteInputController mController;
|
||||
private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
|
||||
|
||||
private NotificationData.Entry mEntry;
|
||||
|
||||
@@ -96,6 +98,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
|
||||
|
||||
public RemoteInputView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
mRemoteInputQuickSettingsDisabler = Dependency.get(RemoteInputQuickSettingsDisabler.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -233,6 +236,9 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(false);
|
||||
|
||||
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_REMOTE_INPUT_CLOSE,
|
||||
mEntry.notification.getPackageName());
|
||||
}
|
||||
@@ -292,6 +298,9 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
|
||||
mEditText.setSelection(mEditText.getText().length());
|
||||
mEditText.requestFocus();
|
||||
mController.addRemoteInput(mEntry, mToken);
|
||||
|
||||
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(true);
|
||||
|
||||
updateSendButton();
|
||||
}
|
||||
|
||||
@@ -554,6 +563,14 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
|
||||
return super.onKeyUp(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
|
||||
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
|
||||
mRemoteInputView.mRemoteInputQuickSettingsDisabler.setRemoteInputActive(false);
|
||||
}
|
||||
return super.dispatchKeyEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCheckIsTextEditor() {
|
||||
// Stop being editable while we're being removed. During removal, we get reattached,
|
||||
@@ -566,11 +583,6 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
|
||||
@Override
|
||||
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
|
||||
final InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
|
||||
//if pinned, set imeOption to keep the behavior like in portrait.
|
||||
if (mRemoteInputView != null && mRemoteInputView.mEntry.row.isPinned()) {
|
||||
outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI
|
||||
| EditorInfo.IME_FLAG_NO_FULLSCREEN;
|
||||
}
|
||||
|
||||
if (mShowImeOnInputConnection && inputConnection != null) {
|
||||
final InputMethodManager imm = InputMethodManager.getInstance();
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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.systemui.statusbar.policy;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static junit.framework.TestCase.assertTrue;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class RemoteInputQuickSettingsDisablerTest extends SysuiTestCase {
|
||||
|
||||
private CommandQueue mCommandQueue;
|
||||
private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mCommandQueue = mock(CommandQueue.class);
|
||||
mContext.putComponent(CommandQueue.class, mCommandQueue);
|
||||
|
||||
mRemoteInputQuickSettingsDisabler = new RemoteInputQuickSettingsDisabler(mContext);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldEnableQuickSetting_afterDeactiviate() {
|
||||
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(Boolean.TRUE);
|
||||
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(Boolean.FALSE);
|
||||
assertFalse(mRemoteInputQuickSettingsDisabler.mRemoteInputActive);
|
||||
verify(mCommandQueue, atLeastOnce()).recomputeDisableFlags(anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldDisableQuickSetting_afteActiviate() {
|
||||
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(Boolean.FALSE);
|
||||
mRemoteInputQuickSettingsDisabler.setRemoteInputActive(Boolean.TRUE);
|
||||
assertTrue(mRemoteInputQuickSettingsDisabler.mRemoteInputActive);
|
||||
verify(mCommandQueue, atLeastOnce()).recomputeDisableFlags(anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChangeToLandscape() {
|
||||
Configuration c = new Configuration(mContext.getResources().getConfiguration());
|
||||
c.orientation = Configuration.ORIENTATION_PORTRAIT;
|
||||
mRemoteInputQuickSettingsDisabler.onConfigChanged(c);
|
||||
c.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||
mRemoteInputQuickSettingsDisabler.onConfigChanged(c);
|
||||
assertTrue(mRemoteInputQuickSettingsDisabler.misLandscape);
|
||||
verify(mCommandQueue, atLeastOnce()).recomputeDisableFlags(anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChangeToPortrait() {
|
||||
Configuration c = new Configuration(mContext.getResources().getConfiguration());
|
||||
c.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||
mRemoteInputQuickSettingsDisabler.onConfigChanged(c);
|
||||
c.orientation = Configuration.ORIENTATION_PORTRAIT;
|
||||
mRemoteInputQuickSettingsDisabler.onConfigChanged(c);
|
||||
assertFalse(mRemoteInputQuickSettingsDisabler.misLandscape);
|
||||
verify(mCommandQueue, atLeastOnce()).recomputeDisableFlags(anyBoolean());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -54,6 +54,7 @@ public class RemoteInputViewTest extends SysuiTestCase {
|
||||
|
||||
@Mock private RemoteInputController mController;
|
||||
@Mock private ShortcutManager mShortcutManager;
|
||||
@Mock private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
|
||||
private BlockingQueueIntentReceiver mReceiver;
|
||||
private RemoteInputView mView;
|
||||
|
||||
@@ -61,6 +62,9 @@ public class RemoteInputViewTest extends SysuiTestCase {
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mDependency.injectTestDependency(RemoteInputQuickSettingsDisabler.class,
|
||||
mRemoteInputQuickSettingsDisabler);
|
||||
|
||||
mReceiver = new BlockingQueueIntentReceiver();
|
||||
mContext.registerReceiver(mReceiver, new IntentFilter(TEST_ACTION), null,
|
||||
Handler.createAsync(Dependency.get(Dependency.BG_LOOPER)));
|
||||
|
||||
Reference in New Issue
Block a user