Fix bug 5098288 - Rethink the suite of new themes
Cut down the list of new themes for ICS. Holo apps now have
Theme.Holo, Theme.Holo.Light, and Theme.Holo.Light.DarkActionBar to
choose from.
Add manifest attribute android:uiOptions to express
splitActionBarWhenNarrow. Other options may move into this later as
well. (DialogWhenLarge?) This attribute is valid on both activity and
application tags; application settings will serve as the default for
activities that do not explicitly set uiOptions.
uiOptions are not currently reflected in the startup window for new
activities.
Change-Id: Iffdc2ce4cc69f79c9bd4e541b7923286e6936c1e
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index d5b669e..98b867d 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -4399,6 +4399,9 @@
if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
+ if (info.uiOptions != 0) {
+ mWindow.setUiOptions(info.uiOptions);
+ }
mUiThread = Thread.currentThread();
mMainThread = aThread;
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 4858f14..bba329d 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -433,7 +433,19 @@
* the mode from the theme will be used.
*/
public int softInputMode;
-
+
+ /**
+ * The desired extra UI options for this activity and its main window.
+ * Set from the {@link android.R.attr#uiOptions} attribute in the
+ * activity's manifest.
+ */
+ public int uiOptions = 0;
+
+ /**
+ * Flag for use with uiOptions.
+ */
+ public static final int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW = 1;
+
public ActivityInfo() {
}
@@ -448,6 +460,7 @@
screenOrientation = orig.screenOrientation;
configChanges = orig.configChanges;
softInputMode = orig.softInputMode;
+ uiOptions = orig.uiOptions;
}
/**
@@ -479,6 +492,9 @@
+ " configChanges=0x" + Integer.toHexString(configChanges)
+ " softInputMode=0x" + Integer.toHexString(softInputMode));
}
+ if (uiOptions != 0) {
+ pw.println(prefix + " uiOptions=0x" + Integer.toHexString(uiOptions));
+ }
super.dumpBack(pw, prefix);
}
@@ -503,6 +519,7 @@
dest.writeInt(screenOrientation);
dest.writeInt(configChanges);
dest.writeInt(softInputMode);
+ dest.writeInt(uiOptions);
}
public static final Parcelable.Creator<ActivityInfo> CREATOR
@@ -526,5 +543,6 @@
screenOrientation = source.readInt();
configChanges = source.readInt();
softInputMode = source.readInt();
+ uiOptions = source.readInt();
}
}
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index ddb6ef0..65a8750 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -91,6 +91,13 @@
public String backupAgentName;
/**
+ * The default extra UI options for activities in this application.
+ * Set from the {@link android.R.attr#uiOptions} attribute in the
+ * activity's manifest.
+ */
+ public int uiOptions = 0;
+
+ /**
* Value for {@link #flags}: if set, this application is installed in the
* device's system image.
*/
@@ -456,6 +463,9 @@
if (descriptionRes != 0) {
pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
}
+ if (uiOptions != 0) {
+ pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
+ }
super.dumpBack(pw, prefix);
}
@@ -509,6 +519,7 @@
installLocation = orig.installLocation;
manageSpaceActivityName = orig.manageSpaceActivityName;
descriptionRes = orig.descriptionRes;
+ uiOptions = orig.uiOptions;
}
@@ -547,6 +558,7 @@
dest.writeString(manageSpaceActivityName);
dest.writeString(backupAgentName);
dest.writeInt(descriptionRes);
+ dest.writeInt(uiOptions);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -584,6 +596,7 @@
manageSpaceActivityName = source.readString();
backupAgentName = source.readString();
descriptionRes = source.readInt();
+ uiOptions = source.readInt();
}
/**
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 53d6bb1..b6c64cb 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1645,6 +1645,9 @@
}
}
+ ai.uiOptions = sa.getInt(
+ com.android.internal.R.styleable.AndroidManifestApplication_uiOptions, 0);
+
sa.recycle();
if (outError[0] != null) {
@@ -1850,6 +1853,10 @@
a.info.theme = sa.getResourceId(
com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
+ a.info.uiOptions = sa.getInt(
+ com.android.internal.R.styleable.AndroidManifestActivity_uiOptions,
+ a.info.applicationInfo.uiOptions);
+
String str;
str = sa.getNonConfigurationString(
com.android.internal.R.styleable.AndroidManifestActivity_permission, 0);
@@ -2091,6 +2098,7 @@
info.screenOrientation = target.info.screenOrientation;
info.taskAffinity = target.info.taskAffinity;
info.theme = target.info.theme;
+ info.uiOptions = target.info.uiOptions;
Activity a = new Activity(mParseActivityAliasArgs, info);
if (outError[0] != null) {
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index e07085c..6ac679c 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -1213,5 +1213,10 @@
* @see android.app.Activity#getVolumeControlStream()
*/
public abstract int getVolumeControlStream();
-
+
+ /**
+ * Set extra options that will influence the UI for this window.
+ * @param uiOptions Flags specifying extra options for this window.
+ */
+ public void setUiOptions(int uiOptions) { }
}
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index dd16bd0..847afa0 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -710,6 +710,22 @@
<enum name="preferExternal" value="2" />
</attr>
+ <!-- Extra options for an activity's UI. If specified on the application
+ tag these will be considered defaults for all activities in the
+ application. -->
+ <attr name="uiOptions">
+ <!-- No extra UI options. -->
+ <flag name="none" value="0" />
+ <!-- Split the options menu into a separate bar at the bottom of
+ the screen when severely constrained for horizontal space.
+ (e.g. portrait mode on a phone.) Instead of a small number
+ of action buttons appearing in the action bar at the top
+ of the screen, the action bar will split into the top navigation
+ section and the bottom menu section. Menu items will not be
+ split across the two bars; they will always appear together. -->
+ <flag name="splitActionBarWhenNarrow" value="1" />
+ </attr>
+
<!-- The <code>manifest</code> tag is the root of an
<code>AndroidManifest.xml</code> file,
describing the contents of an Android package (.apk) file. One
@@ -812,6 +828,7 @@
application is running, the user will be informed of this.
@hide -->
<attr name="cantSaveState" format="boolean" />
+ <attr name="uiOptions" />
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
@@ -1302,6 +1319,7 @@
<attr name="windowSoftInputMode" />
<attr name="immersive" />
<attr name="hardwareAccelerated" />
+ <attr name="uiOptions" />
</declare-styleable>
<!-- The <code>activity-alias</code> tag declares a new
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 87e9249..2dfe453 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1783,11 +1783,11 @@
<public type="attr" name="minResizeHeight" />
<public type="attr" name="actionBarWidgetTheme" />
+ <public type="attr" name="uiOptions" />
<public type="style" name="TextAppearance.SuggestionHighlight" />
- <public type="style" name="Theme.Holo.SplitActionBarWhenNarrow" />
- <public type="style" name="Theme.Holo.Light.SplitActionBarWhenNarrow" />
+ <public type="style" name="Theme.Holo.Light.DarkActionBar" />
<public type="style" name="Widget.Holo.Button.Borderless.Small" />
<public type="style" name="Widget.Holo.Light.Button.Borderless.Small" />
<public type="style" name="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" />
@@ -1802,12 +1802,6 @@
<public type="style" name="Widget.Holo.Light.ActionBar.TabView.Inverse" />
<public type="style" name="Widget.Holo.Light.ActionBar.TabText.Inverse" />
<public type="style" name="Widget.Holo.Light.ActionMode.Inverse" />
- <public type="style" name="Theme.Holo.SolidActionBar" />
- <public type="style" name="Theme.Holo.Light.SolidActionBar" />
- <public type="style" name="Theme.Holo.Light.SolidActionBar.Inverse" />
- <public type="style" name="Theme.Holo.SolidActionBar.SplitActionBarWhenNarrow" />
- <public type="style" name="Theme.Holo.Light.SolidActionBar.SplitActionBarWhenNarrow" />
- <public type="style" name="Theme.Holo.Light.SolidActionBar.Inverse.SplitActionBarWhenNarrow" />
<public type="integer" name="status_bar_notification_info_maxnum" />
<public type="string" name="status_bar_notification_info_overflow" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 3e7c5ca..2b1b693 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -1207,7 +1207,7 @@
<item name="windowNoTitle">false</item>
<item name="windowFullscreen">false</item>
<item name="windowIsFloating">false</item>
- <item name="windowContentOverlay">@null</item>
+ <item name="android:windowContentOverlay">@android:drawable/ab_solid_shadow_holo</item>
<item name="windowShowWallpaper">false</item>
<item name="windowTitleStyle">@android:style/WindowTitle.Holo</item>
<item name="windowTitleSize">25dip</item>
@@ -1337,7 +1337,7 @@
<item name="actionBarTabTextStyle">@style/Widget.Holo.Light.ActionBar.TabText</item>
<item name="actionModeStyle">@style/Widget.Holo.Light.ActionMode</item>
<item name="actionModeCloseButtonStyle">@style/Widget.Holo.Light.ActionButton.CloseMode</item>
- <item name="actionBarStyle">@android:style/Widget.Holo.Light.ActionBar</item>
+ <item name="android:actionBarStyle">@android:style/Widget.Holo.Light.ActionBar.Solid</item>
<item name="actionBarSize">@dimen/action_bar_default_height</item>
<item name="actionModePopupWindowStyle">@android:style/Widget.Holo.Light.PopupWindow.ActionMode</item>
<item name="actionBarWidgetTheme">@null</item>
@@ -1384,22 +1384,10 @@
</style>
- <!-- Variant of the holographic (dark) theme that has a solid (opaque) action bar. -->
- <style name="Theme.Holo.SolidActionBar">
- <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar.Solid</item>
- <item name="android:windowContentOverlay">@android:drawable/ab_solid_shadow_holo</item>
- </style>
-
- <!-- Variant of the holographic (light) theme that has a solid (opaque) action bar. -->
- <style name="Theme.Holo.Light.SolidActionBar">
- <item name="android:actionBarStyle">@android:style/Widget.Holo.Light.ActionBar.Solid</item>
- <item name="android:windowContentOverlay">@android:drawable/ab_solid_shadow_holo</item>
- </style>
-
<!-- Variant of the holographic (light) theme that has a solid (opaque) action bar
with an inverse color profile. The dark action bar sharply stands out against
the light content. -->
- <style name="Theme.Holo.Light.SolidActionBar.Inverse">
+ <style name="Theme.Holo.Light.DarkActionBar">
<item name="android:windowContentOverlay">@android:drawable/title_bar_shadow</item>
<item name="android:actionBarStyle">@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse</item>
<item name="actionBarWidgetTheme">@android:style/Theme.Holo</item>
@@ -1427,30 +1415,6 @@
<item name="actionModeWebSearchDrawable">@android:drawable/ic_menu_search_holo_dark</item>
</style>
- <!-- Variant of the holographic (dark) theme that has a solid
- (opaque) action bar. The action bar will split across both
- the top and bottom of the screen when the screen is
- especially constrained for horizontal space. -->
- <style name="Theme.Holo.SolidActionBar.SplitActionBarWhenNarrow">
- <item name="android:windowSplitActionBar">@android:bool/split_action_bar_is_narrow</item>
- </style>
-
- <!-- Variant of the holographic (light) theme that has a solid
- (opaque) action bar. The action bar will split across both
- the top and bottom of the screen when the screen is
- especially constrained for horizontal space. -->
- <style name="Theme.Holo.Light.SolidActionBar.SplitActionBarWhenNarrow">
- <item name="android:windowSplitActionBar">@android:bool/split_action_bar_is_narrow</item>
- </style>
-
- <!-- Variant of the holographic (light) theme that has a solid (opaque) action bar
- with an inverse color profile. The dark action bar sharply stands out against
- the light content. The action bar will split across both the top and bottom of
- the screen when the screen is especially constrained for horizontal space. -->
- <style name="Theme.Holo.Light.SolidActionBar.Inverse.SplitActionBarWhenNarrow">
- <item name="android:windowSplitActionBar">@android:bool/split_action_bar_is_narrow</item>
- </style>
-
<!-- Variant of the holographic (dark) theme with no action bar. -->
<style name="Theme.Holo.NoActionBar">
<item name="android:windowActionBar">false</item>
@@ -1654,18 +1618,4 @@
<style name="Theme.Holo.Wallpaper.NoTitleBar">
<item name="android:windowNoTitle">true</item>
</style>
-
- <!-- Variant of the holographic (dark) theme with an action bar that
- splits across the top and bottom of the activity when constrained
- for horizontal space. -->
- <style name="Theme.Holo.SplitActionBarWhenNarrow">
- <item name="android:windowSplitActionBar">@android:bool/split_action_bar_is_narrow</item>
- </style>
-
- <!-- Variant of the holographic (light) theme with an action bar that
- splits across the top and bottom of the activity when constrained
- for horizontal space. -->
- <style name="Theme.Holo.Light.SplitActionBarWhenNarrow">
- <item name="android:windowSplitActionBar">@android:bool/split_action_bar_is_narrow</item>
- </style>
</resources>