diff --git a/core/tests/coretests/apks/version_nosys/Android.mk b/core/tests/coretests/apks/version_nosys/Android.mk new file mode 100644 index 0000000000000..bbc8e12afe8d0 --- /dev/null +++ b/core/tests/coretests/apks/version_nosys/Android.mk @@ -0,0 +1,9 @@ +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := $(call all-subdir-java-files) +LOCAL_PACKAGE_NAME := version_1_nosys +LOCAL_AAPT_FLAGS := --version-code 1 --version-name 1.0 +LOCAL_CERTIFICATE := $(LOCAL_PATH)/../../certs/unit_test +include $(FrameworkCoreTests_BUILD_PACKAGE) + diff --git a/core/tests/coretests/apks/version_nosys/AndroidManifest.xml b/core/tests/coretests/apks/version_nosys/AndroidManifest.xml new file mode 100644 index 0000000000000..46aac38cac412 --- /dev/null +++ b/core/tests/coretests/apks/version_nosys/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/core/tests/coretests/apks/version_nosys/res/values/strings.xml b/core/tests/coretests/apks/version_nosys/res/values/strings.xml new file mode 100644 index 0000000000000..3b8b3b1af9b5e --- /dev/null +++ b/core/tests/coretests/apks/version_nosys/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + + dummy + diff --git a/core/tests/coretests/apks/version_nosys/src/com/android/frameworks/coretests/version_test/NullProvider.java b/core/tests/coretests/apks/version_nosys/src/com/android/frameworks/coretests/version_test/NullProvider.java new file mode 100644 index 0000000000000..f5742f0f277fe --- /dev/null +++ b/core/tests/coretests/apks/version_nosys/src/com/android/frameworks/coretests/version_test/NullProvider.java @@ -0,0 +1,39 @@ +package com.android.frameworks.coretests.version_test; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +public class NullProvider extends ContentProvider { + @Override + public boolean onCreate() { + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public String getType(Uri uri) { + return "text/plain"; + } +} diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 1745bc774b662..44fc1f851b0e8 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -1922,7 +1922,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private PopupWindow mActionModePopup; private Runnable mShowActionModePopup; - // View added at runtime to IME windows to cover the navigation bar + // View added at runtime to draw under the status bar area + private View mStatusGuard; + // View added at runtime to draw under the navigation bar area private View mNavigationGuard; public DecorView(Context context, int featureId) { @@ -2484,7 +2486,64 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override protected boolean fitSystemWindows(Rect insets) { mFrameOffsets.set(insets); + updateStatusGuard(insets); + updateNavigationGuard(insets); + if (getForeground() != null) { + drawableChanged(); + } + return super.fitSystemWindows(insets); + } + private void updateStatusGuard(Rect insets) { + boolean showStatusGuard = false; + // Show the status guard when the non-overlay contextual action bar is showing + if (mActionModeView != null) { + if (mActionModeView.getLayoutParams() instanceof MarginLayoutParams) { + MarginLayoutParams mlp = (MarginLayoutParams) mActionModeView.getLayoutParams(); + boolean mlpChanged = false; + final boolean nonOverlayShown = + (getLocalFeatures() & (1 << FEATURE_ACTION_MODE_OVERLAY)) == 0 + && mActionModeView.isShown(); + if (nonOverlayShown) { + // set top margin to top insets, show status guard + if (mlp.topMargin != insets.top) { + mlpChanged = true; + mlp.topMargin = insets.top; + if (mStatusGuard == null) { + mStatusGuard = new View(mContext); + mStatusGuard.setBackgroundColor(mContext.getResources() + .getColor(R.color.input_method_navigation_guard)); + addView(mStatusGuard, new LayoutParams( + LayoutParams.MATCH_PARENT, mlp.topMargin, + Gravity.START | Gravity.TOP)); + } else { + LayoutParams lp = (LayoutParams) mStatusGuard.getLayoutParams(); + if (lp.height != mlp.topMargin) { + lp.height = mlp.topMargin; + mStatusGuard.setLayoutParams(lp); + } + } + } + insets.top = 0; // consume top insets + showStatusGuard = true; + } else { + // reset top margin + if (mlp.topMargin != 0) { + mlpChanged = true; + mlp.topMargin = 0; + } + } + if (mlpChanged) { + mActionModeView.setLayoutParams(mlp); + } + } + } + if (mStatusGuard != null) { + mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); + } + } + + private void updateNavigationGuard(Rect insets) { // IMEs lay out below the nav bar, but the content view must not (for back compat) if (getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD) { // prevent the content view from including the nav bar height @@ -2510,11 +2569,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { mNavigationGuard.setLayoutParams(lp); } } - - if (getForeground() != null) { - drawableChanged(); - } - return super.fitSystemWindows(insets); } private void drawableChanged() { @@ -2693,6 +2747,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + requestFitSystemWindows(); return mWrapped.onPrepareActionMode(mode, menu); } @@ -2719,6 +2774,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } mActionMode = null; + requestFitSystemWindows(); } } }