Support Dark/Light Theme for DocumentsUI (2/N)
1) Define Light Theme and ToolBarTheme to match M2 design
2) Adjust GridItem / ListItem background in Dark Theme
3) Tuning StatusBar and NavigationBar color fulfill design
4) Refactor legacy style definition for GridItem
Test: atest com.android.documentsui.dirlist.ThemeUiTest
atest com.android.documentsui.dirlist.DarkThemeUiTest
manually swich to night mode
Bug: 111862978
Bug: 114369969
Bug: 114805149
Change-Id: I3029a4f25640f83cfd5986f965923656fd01958d
diff --git a/res/color/item_title.xml b/res/color/item_doc_grid_tint_dark.xml
similarity index 80%
rename from res/color/item_title.xml
rename to res/color/item_doc_grid_tint_dark.xml
index d1760d0..6c40827 100644
--- a/res/color/item_title.xml
+++ b/res/color/item_doc_grid_tint_dark.xml
@@ -16,9 +16,9 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:state_enabled="true"
- android:color="@color/item_doc_title" />
+ android:state_activated="true"
+ android:color="@color/item_grid_tint_dark"
+ android:alpha=".15" />
<item
- android:state_enabled="false"
- android:color="@color/item_doc_title_disabled"/>
+ android:color="@android:color/transparent" />
</selector>
diff --git a/res/color/item_title.xml b/res/drawable/grid_item_background_dark.xml
similarity index 69%
copy from res/color/item_title.xml
copy to res/drawable/grid_item_background_dark.xml
index d1760d0..88becad 100644
--- a/res/color/item_title.xml
+++ b/res/drawable/grid_item_background_dark.xml
@@ -15,10 +15,10 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_enabled="true"
- android:color="@color/item_doc_title" />
- <item
- android:state_enabled="false"
- android:color="@color/item_doc_title_disabled"/>
-</selector>
+ <item android:drawable="@color/item_doc_background_selected_dark"
+ android:state_selected="true" />
+ <item android:drawable="@color/item_hover_color_dark"
+ android:state_drag_hovered="true" />
+ <item android:drawable="@color/item_doc_background_dark"
+ android:state_selected="false" />
+</selector>
\ No newline at end of file
diff --git a/res/layout/drag_shadow_layout.xml b/res/layout/drag_shadow_layout.xml
index 1917e25..f424742 100644
--- a/res/layout/drag_shadow_layout.xml
+++ b/res/layout/drag_shadow_layout.xml
@@ -40,7 +40,7 @@
android:maxLines="1"
android:ellipsize="end"
android:textAlignment="viewStart"
- android:textColor="@color/item_title"
+ android:textAppearance="@android:style/TextAppearance.Material.Subhead"
android:paddingStart="6dp"
android:paddingBottom="1dp"/>
diff --git a/res/layout/inspector_header.xml b/res/layout/inspector_header.xml
index d621801..623ae23 100644
--- a/res/layout/inspector_header.xml
+++ b/res/layout/inspector_header.xml
@@ -29,16 +29,15 @@
android:id="@+id/inspector_file_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textSize="20sp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
- android:textColor="@android:color/white"
android:layout_gravity="center_vertical"
android:background="@color/inspector_title_background"
android:textIsSelectable="true"
android:textAlignment="viewStart"
- android:layout_alignBottom="@+id/inspector_thumbnail" />
+ android:layout_alignBottom="@+id/inspector_thumbnail"
+ android:textAppearance="@style/InspectorHeaderTitle" />
</RelativeLayout>
diff --git a/res/layout/item_dir_grid.xml b/res/layout/item_dir_grid.xml
index 7bc949e..210af6f 100644
--- a/res/layout/item_dir_grid.xml
+++ b/res/layout/item_dir_grid.xml
@@ -23,20 +23,17 @@
decide to rip these out, please be sure to check out focus and keyboards. -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:layout_margin="4dp"
android:focusable="true">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:duplicateParentState="true"
- android:background="@drawable/grid_item_background"
- app:cardUseCompatPadding="true"
- app:cardCornerRadius="@dimen/grid_item_radius"
- app:cardElevation="@dimen/grid_item_elevation">
+ android:layout_margin="2dp"
+ android:duplicateParentState="true">
<!-- The height is 48px.
paddingTop (9dp) + @dimen/check_icon_size (30dp) + paddingBottom (9dp) -->
@@ -44,6 +41,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
+ android:background="?attr/colorBackgroundFloating"
android:gravity="center_vertical">
<FrameLayout
@@ -84,7 +82,6 @@
android:singleLine="true"
android:textAlignment="viewStart"
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
- android:textColor="@color/item_title"
android:layout_marginBottom="9dp"
android:layout_marginEnd="12dp"
android:layout_marginTop="9dp"/>
diff --git a/res/layout/item_doc_grid.xml b/res/layout/item_doc_grid.xml
index f4163ff..c9cd6d1 100644
--- a/res/layout/item_doc_grid.xml
+++ b/res/layout/item_doc_grid.xml
@@ -22,20 +22,17 @@
decide to rip these out, please be sure to check out focus and keyboards. -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:layout_margin="4dp"
android:focusable="true">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/grid_item_background"
- android:focusable="true"
- app:cardUseCompatPadding="true"
- app:cardCornerRadius="@dimen/grid_item_radius"
- app:cardElevation="@dimen/grid_item_elevation">
+ android:layout_margin="2dp"
+ android:focusable="true">
<RelativeLayout
android:layout_width="match_parent"
@@ -48,7 +45,6 @@
<FrameLayout
android:id="@+id/thumbnail"
- android:background="@drawable/grid_item_background"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -58,7 +54,7 @@
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:contentDescription="@null"
- android:tint="@color/item_doc_grid_tint"
+ android:tint="?attr/gridItemTint"
android:tintMode="src_over"/>
<com.android.documentsui.GridItemThumbnail
@@ -76,7 +72,7 @@
<LinearLayout
android:id="@+id/nameplate"
- android:background="@drawable/grid_item_background"
+ android:background="?attr/colorBackgroundFloating"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -140,8 +136,7 @@
android:singleLine="true"
android:ellipsize="end"
android:textAlignment="viewStart"
- android:textAppearance="@android:style/TextAppearance.Material.Caption"
- android:textColor="@color/item_details"/>
+ android:textAppearance="@android:style/TextAppearance.Material.Caption"/>
<TextView
android:id="@+id/date"
@@ -152,8 +147,8 @@
android:singleLine="true"
android:ellipsize="end"
android:textAlignment="viewStart"
- android:textAppearance="@android:style/TextAppearance.Material.Caption"
- android:textColor="@color/item_details"/>
+ android:textAppearance="@android:style/TextAppearance.Material.Caption"/>
+
</RelativeLayout>
</LinearLayout>
@@ -174,4 +169,4 @@
</com.google.android.material.card.MaterialCardView>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/res/layout/item_doc_list.xml b/res/layout/item_doc_list.xml
index 0c190f4..bc23356 100644
--- a/res/layout/item_doc_list.xml
+++ b/res/layout/item_doc_list.xml
@@ -83,7 +83,7 @@
android:ellipsize="end"
android:singleLine="true"
android:textAlignment="viewStart"
- style="?android:attr/textAppearanceListItem" />
+ android:textAppearance="?android:attr/textAppearanceListItem" />
<LinearLayout
android:id="@+id/line2"
diff --git a/res/layout/table_key_value_row.xml b/res/layout/table_key_value_row.xml
index b45cda4..6d0d500 100644
--- a/res/layout/table_key_value_row.xml
+++ b/res/layout/table_key_value_row.xml
@@ -30,9 +30,8 @@
android:layout_width="0dp"
android:layout_weight="1"
android:paddingEnd="5dp"
- android:textColor="@android:color/black"
- android:textSize="14sp"
- android:textAlignment="viewStart">
+ android:textAlignment="viewStart"
+ android:textAppearance="?attr/textAppearanceSubtitle1">
</TextView>
<TextView
@@ -40,10 +39,9 @@
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
- android:textColor="@color/inspector_value"
- android:textSize="14sp"
android:textIsSelectable="true"
- android:textAlignment="viewStart">
+ android:textAlignment="viewStart"
+ android:textAppearance="@style/InspectorKeySubTitle">
</TextView>
</com.android.documentsui.inspector.KeyValueRow>
diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml
index fe6659c..93277ae 100644
--- a/res/values-night/styles.xml
+++ b/res/values-night/styles.xml
@@ -38,4 +38,11 @@
<style name="ActionBarPopupTheme" parent="@android:style/ThemeOverlay.Material.Dark" />
<style name="ListViewStyle" parent="@android:style/Widget.Material.ListView"></style>
+
+ <style name="CardViewStyle" parent="@style/Widget.MaterialComponents.CardView">
+ <item name="colorBackgroundFloating">@drawable/grid_item_background_dark</item>
+ <item name="cardPreventCornerOverlap">false</item>
+ <item name="cardCornerRadius">@dimen/grid_item_radius</item>
+ <item name="cardElevation">@dimen/grid_item_elevation</item>
+ </style>
</resources>
diff --git a/res/values-night/themes.xml b/res/values-night/themes.xml
index e0c17b9..dd45d31 100644
--- a/res/values-night/themes.xml
+++ b/res/values-night/themes.xml
@@ -22,13 +22,14 @@
<item name="actionModeStyle">@style/ActionModeStyle</item>
<item name="snackbarButtonStyle">@style/SnackbarButtonStyle</item>
- <item name="android:windowBackground">@color/g_dark_grey</item>
+ <item name="android:windowBackground">?android:attr/colorPrimary</item>
<item name="android:colorPrimaryDark">@color/g_grey</item>
- <item name="android:colorPrimary">@color/g_grey</item>
- <item name="android:colorSecondary">@color/g_grey</item>
- <item name="android:colorAccent">@color/accent</item>
- <item name="android:colorBackground">@color/g_grey</item>
+ <item name="android:colorPrimary">@color/g_dark_grey</item>
+ <item name="android:colorSecondary">@color/g_dark_grey</item>
+ <item name="android:colorAccent">@color/accent_dark</item>
+ <item name="android:colorBackground">?android:attr/colorPrimary</item>
<item name="android:windowLightStatusBar">false</item>
+ <item name="android:windowLightNavigationBar">false</item>
<item name="android:queryBackground">@color/menu_search_background</item>
<item name="android:listDivider">@drawable/list_divider</item>
<item name="android:windowActionBar">false</item>
@@ -37,9 +38,18 @@
<item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
<item name="android:actionModeBackground">?android:attr/colorBackground</item>
<item name="android:actionModeCloseDrawable">@drawable/ic_action_clear</item>
- <item name="android:statusBarColor">@android:color/transparent</item>
+ <item name="android:statusBarColor">?android:attr/colorPrimary</item>
+ <item name="android:navigationBarColor">?android:attr/colorPrimary</item>
+
+ <item name="colorControlHighlight">@color/g_grey</item>
+ <item name="materialCardViewStyle">@style/CardViewStyle</item>
<item name="textHandleColor">@color/text_handle_dark</item>
<item name="textCursorColor">@color/text_cursor_dark</item>
+
+ <item name="gridItemTint">@color/item_doc_grid_tint_dark</item>
+ <item name="gridItemColor">@color/item_doc_background_dark</item>
+ <item name="gridItemSelectedColor">@color/item_doc_background_selected_dark</item>
+ <item name="gridItemDisableColor">@color/item_doc_background_disabled_dark</item>
</style>
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 84a37b8..f489756 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -14,8 +14,15 @@
limitations under the License.
-->
<resources>
- <declare-styleable name="HighlightedItemView">
- <attr name="state_highlighted" format="boolean"/>
+
+ <declare-styleable name="ActionBarView">
+ <attr name="android:colorPrimary" format="color" />
+ <attr name="android:colorControlNormal" format="color" />
+ <attr name="android:textColorPrimary" format="color" />
+ </declare-styleable>
+
+ <declare-styleable name="CardView">
+ <attr name="colorBackgroundFloating" format="color" />
</declare-styleable>
<declare-styleable name="DropBadgeView">
@@ -23,12 +30,32 @@
<attr name="state_copy" format="boolean"/>
</declare-styleable>
- <declare-styleable name="TextHandleView">
- <attr name="textHandleColor" format="reference" />
- <attr name="textCursorColor" format="reference" />
+ <declare-styleable name="GridItem">
+ <attr name="gridItemTint" format="reference" />
+ <attr name="gridItemColor" format="reference" />
+ <attr name="gridItemSelectedColor" format="reference" />
+ <attr name="gridItemDisableColor" format="reference" />
+ </declare-styleable>
+
+ <declare-styleable name="HighlightedItemView">
+ <attr name="state_highlighted" format="boolean"/>
</declare-styleable>
<declare-styleable name="SnackbarView">
<attr name="android:textColor" format="reference" />
</declare-styleable>
+
+ <declare-styleable name="SystemWindow">
+ <attr name="android:statusBarColor" format="color" />
+ <attr name="android:navigationBarColor" format="color" />
+ <attr name="android:windowBackground" format="color" />
+ <attr name="android:windowLightStatusBar" format="boolean" />
+ <attr name="android:windowLightNavigationBar" format="boolean" />
+ </declare-styleable>
+
+ <declare-styleable name="TextHandleView">
+ <attr name="textHandleColor" format="reference" />
+ <attr name="textCursorColor" format="reference" />
+ </declare-styleable>
+
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ce3f34a..c11f08b 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -48,22 +48,28 @@
<color name="root_focus_color">#ffe0e0e0</color>
<color name="item_hover_color">#ffe0e0e0</color>
+ <color name="item_hover_color_dark">#ff5f6368</color>
- <item name="root_icon_disabled_alpha" format="float" type="dimen">?android:attr/disabledAlpha</item>
+ <item name="root_icon_disabled_alpha" format="float" type="dimen">?android:attr/disabledAlpha
+ </item>
<color name="doc_icon_color">#ff5a5a5a</color>
<color name="tool_bar_color">#ff0e70e8</color> <!--M2 Google Blue 800-->
<!-- TODO: Would be nice to move this to a color-set, but not sure how to support animation -->
- <color name="item_doc_title">#ff333333</color>
+ <color name="item_doc_title">?android:attr/textColorSecondary</color>
<color name="item_doc_title_disabled">?android:attr/textColorSecondaryInverse</color>
- <color name="item_doc_details">#ff333333</color>
+ <color name="item_doc_details">?android:attr/textColorSecondary</color>
<color name="item_doc_background">@android:color/white</color>
+ <color name="item_doc_background_dark">@color/g_grey</color>
<color name="item_doc_background_disabled">#fff4f4f4</color>
+ <color name="item_doc_background_disabled_dark">@color/g_light_grey</color>
<color name="item_doc_background_selected">#4d3367d6</color>
+ <color name="item_doc_background_selected_dark">#4d2297f0</color>
<color name="item_breadcrumb_background_hovered">#1affffff</color>
<color name="item_doc_droppable_background">#ffe8f0fb</color>
<color name="item_doc_not_droppable_background">#ffe0e0e0</color>
- <color name="item_grid_tint">#ff127beb</color> <!--M2 Google Blue 700-->
+ <color name="item_grid_tint">#ff127beb</color> <!--M2 Google Blue 700-->
+ <color name="item_grid_tint_dark">@color/primary_dark</color> <!--M2 Google Blue 800-->
<color name="item_drag_shadow_background">@android:color/white</color>
<color name="item_drag_shadow_container_background">@android:color/transparent</color>
@@ -80,8 +86,9 @@
<color name="scroll_track">#fff0f0f0</color>
<color name="inspector_value">#ff939393</color>
- <color name="inspector_link">#6633b5e5</color>
+ <color name="inspector_link">?android:attr/colorAccent</color>
<color name="inspector_section_title">#ff939393</color>
<color name="inspector_section_divider">#E0E0E0</color>
<color name="inspector_title_background">#40000000</color>
+ <color name="inspector_debug_mode_color">#607d8b</color>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 4fd49d5..e22d074 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -39,6 +39,13 @@
<style name="ListViewStyle" parent="@android:style/Widget.Material.Light.ListView"></style>
+ <style name="CardViewStyle" parent="@style/Widget.MaterialComponents.CardView">
+ <item name="colorBackgroundFloating">@drawable/grid_item_background</item>
+ <item name="cardPreventCornerOverlap">false</item>
+ <item name="cardCornerRadius">@dimen/grid_item_radius</item>
+ <item name="cardElevation">@dimen/grid_item_elevation</item>
+ </style>
+
<style name="TrimmedHorizontalProgressBar" parent="android:Widget.Material.ProgressBar.Horizontal">
<item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material_trimmed</item>
<item name="android:minHeight">3dp</item>
@@ -46,10 +53,18 @@
</style>
<style name="SortTitle" parent="@style/TextAppearance.MaterialComponents.Headline6" >
- <item name="android:textColor">?android:attr/textColorSecondary</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">16sp</item>
</style>
+ <style name="InspectorHeaderTitle" parent="@style/TextAppearance.MaterialComponents.Headline6">
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ </style>
+
+ <style name="InspectorKeySubTitle" parent="@style/TextAppearance.MaterialComponents.Subtitle1">
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ </style>
+
<style name="DrawerMenuPrimary" parent="android:style/TextAppearance.Material.Body2">
<item name="android:textColor">@color/item_root_primary_text</item>
</style>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 1b8926e..4afbcdd 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -22,12 +22,14 @@
<item name="actionModeStyle">@style/ActionModeStyle</item>
<item name="snackbarButtonStyle">@style/SnackbarButtonStyle</item>
- <item name="android:windowBackground">@android:color/white</item>
+ <item name="android:windowBackground">?android:attr/colorPrimary</item>
<item name="android:colorPrimaryDark">@color/g_grey</item>
<item name="android:colorPrimary">@android:color/white</item>
<item name="android:colorSecondary">@android:color/white</item>
- <item name="android:colorBackground">@android:color/white</item>
+ <item name="android:colorAccent">@color/accent</item>
+ <item name="android:colorBackground">?android:attr/colorPrimary</item>
<item name="android:windowLightStatusBar">true</item>
+ <item name="android:windowLightNavigationBar">true</item>
<item name="android:queryBackground">@color/menu_search_background</item>
<item name="android:listDivider">@drawable/list_divider</item>
<item name="android:windowActionBar">false</item>
@@ -37,8 +39,17 @@
<item name="android:actionModeBackground">?android:attr/colorBackground</item>
<item name="android:actionModeCloseDrawable">@drawable/ic_action_clear</item>
<item name="android:statusBarColor">?android:attr/colorPrimary</item>
+ <item name="android:navigationBarColor">?android:attr/colorPrimary</item>
+
+ <item name="colorControlHighlight">@android:color/white</item>
+ <item name="materialCardViewStyle">@style/CardViewStyle</item>
<item name="textHandleColor">@color/text_handle</item>
<item name="textCursorColor">@color/text_cursor</item>
+
+ <item name="gridItemTint">@color/item_doc_grid_tint</item>
+ <item name="gridItemColor">@color/item_doc_background</item>
+ <item name="gridItemSelectedColor">@color/item_doc_background_selected</item>
+ <item name="gridItemDisableColor">@color/item_doc_background_disabled</item>
</style>
</resources>
\ No newline at end of file
diff --git a/src/com/android/documentsui/GridItemThumbnail.java b/src/com/android/documentsui/GridItemThumbnail.java
index 38d6d72..6348148 100644
--- a/src/com/android/documentsui/GridItemThumbnail.java
+++ b/src/com/android/documentsui/GridItemThumbnail.java
@@ -17,6 +17,8 @@
package com.android.documentsui;
import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.ImageView;
@@ -34,6 +36,10 @@
public GridItemThumbnail(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ TypedArray ta = context.obtainStyledAttributes(R.styleable.GridItem);
+ ColorStateList color = ta.getColorStateList(R.styleable.GridItem_gridItemTint);
+ ta.recycle();
+ setImageTintList(color);
}
@Override
diff --git a/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java b/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java
index f568f34..14b448a 100644
--- a/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java
+++ b/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java
@@ -23,6 +23,8 @@
import androidx.collection.ArrayMap;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
+
+import android.content.res.TypedArray;
import android.util.TypedValue;
import com.android.documentsui.R;
@@ -45,8 +47,12 @@
private final Integer mSelectedColor;
public DirectoryItemAnimator(Context context) {
- mDefaultColor = context.getResources().getColor(R.color.item_doc_background);
- mSelectedColor = context.getResources().getColor(R.color.item_doc_background_selected);
+ TypedArray ta = context.obtainStyledAttributes(R.styleable.GridItem);
+ mSelectedColor = ta.getColor(R.styleable.GridItem_gridItemSelectedColor
+ , R.color.item_doc_background_selected);
+ mDefaultColor = ta.getColor(R.styleable.GridItem_gridItemColor
+ , R.color.item_doc_background);
+ ta.recycle();
}
@Override
diff --git a/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
index 3c36d90..7d99ed6 100644
--- a/src/com/android/documentsui/dirlist/GridDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/GridDocumentHolder.java
@@ -21,6 +21,7 @@
import androidx.annotation.ColorInt;
import android.content.Context;
+import android.content.res.TypedArray;
import android.database.Cursor;
import android.graphics.Rect;
import android.provider.DocumentsContract.Document;
@@ -48,17 +49,12 @@
final IconHelper mIconHelper;
final View mIconLayout;
- private final @ColorInt int mDisabledBgColor;
- private final @ColorInt int mDefaultBgColor;
// This is used in as a convenience in our bind method.
private final DocumentInfo mDoc = new DocumentInfo();
public GridDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper) {
super(context, parent, R.layout.item_doc_grid);
- mDisabledBgColor = context.getColor(R.color.item_doc_background_disabled);
- mDefaultBgColor = context.getColor(R.color.item_doc_background);
-
mIconLayout = itemView.findViewById(R.id.icon);
mTitle = (TextView) itemView.findViewById(android.R.id.title);
mDate = (TextView) itemView.findViewById(R.id.date);
@@ -103,8 +99,6 @@
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
- // Text colors enabled/disabled is handle via a color set.
- itemView.setBackgroundColor(enabled ? mDefaultBgColor : mDisabledBgColor);
float imgAlpha = enabled ? 1f : DISABLED_ALPHA;
mIconMimeLg.setAlpha(imgAlpha);
diff --git a/src/com/android/documentsui/inspector/DebugView.java b/src/com/android/documentsui/inspector/DebugView.java
index b4c00bb..a781ec5 100644
--- a/src/com/android/documentsui/inspector/DebugView.java
+++ b/src/com/android/documentsui/inspector/DebugView.java
@@ -64,7 +64,8 @@
void init(Lookup<String, Executor> executors) {
assert executors != null;
- setBackgroundColor(0xFFFFFFFF); // it's just debug. We do what we want!
+ // it's just debug. We do what we want!
+ setBackgroundColor(getResources().getColor(R.color.inspector_debug_mode_color));
mExecutors = executors;
}
diff --git a/src/com/android/documentsui/inspector/KeyValueRow.java b/src/com/android/documentsui/inspector/KeyValueRow.java
index 7fbd5a4..b6a1637 100644
--- a/src/com/android/documentsui/inspector/KeyValueRow.java
+++ b/src/com/android/documentsui/inspector/KeyValueRow.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
+import android.content.res.TypedArray;
import android.graphics.Paint;
import androidx.annotation.Nullable;
import android.text.Selection;
@@ -90,7 +91,11 @@
public void setOnClickListener(OnClickListener callback) {
TextView clickable = ((TextView) findViewById(R.id.table_row_value));
mDefaultTextColor = clickable.getTextColors();
- clickable.setTextColor(R.color.inspector_link);
+ TypedArray ta = getContext().obtainStyledAttributes(R.styleable.TextAppearance);
+ int linkColor = ta.getColor(R.styleable.TextAppearance_android_textColorLink,
+ mDefaultTextColor.getDefaultColor());
+ ta.recycle();
+ clickable.setTextColor(linkColor);
clickable.setPaintFlags(clickable.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
clickable.setOnClickListener(callback);
}
diff --git a/tests/Android.mk b/tests/Android.mk
index 143e685..4ff0c8a 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -17,7 +17,10 @@
mockito-target \
ub-uiautomator \
espresso-core \
- guava
+ guava \
+ truth-prebuilt \
+ android-support-test
+
LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
LOCAL_PACKAGE_NAME := DocumentsUITests
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 1b6dfba..082dad6 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="com.android.documentsui.tests">
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.MODIFY_DAY_NIGHT_MODE" />
<application android:label="DocumentsUI Tests">
<uses-library android:name="android.test.runner" />
diff --git a/tests/functional/com/android/documentsui/ActivityTest.java b/tests/functional/com/android/documentsui/ActivityTest.java
index 262ea33..a2f48b1 100644
--- a/tests/functional/com/android/documentsui/ActivityTest.java
+++ b/tests/functional/com/android/documentsui/ActivityTest.java
@@ -18,10 +18,12 @@
import android.app.Activity;
import android.app.UiAutomation;
+import android.app.UiModeManager;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.DocumentsContract;
@@ -48,6 +50,7 @@
public abstract class ActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> {
static final int TIMEOUT = 5000;
+ static final int NIGHT_MODE_CHANGE_WAIT_TIME = 1000;
// Testing files. For custom ones, override initTestFiles().
public static final String dirName1 = "Dir1";
@@ -69,6 +72,7 @@
protected ContentResolver mResolver;
protected DocumentsProviderHelper mDocsHelper;
protected ContentProviderClient mClient;
+ protected UiModeManager mUiModeManager;
public ActivityTest(Class<T> activityClass) {
super(activityClass);
@@ -181,4 +185,24 @@
bots.directory.waitForDocument(fileName4);
bots.directory.assertDocumentsCount(2);
}
+
+ /**
+ * Setup test Activity UI Mode YES or not(AUTO/YES/NO) before start to testing
+ * @param uiModeNight Constant for {@link #setNightMode(int)}
+ * 0 - MODE_NIGHT_AUTO
+ * 1 - MODE_NIGHT_NO
+ * 2 - MODE_NIGHT_YES
+ */
+ protected void setSystemUiModeNight(int uiModeNight) {
+ int systemUiMode = getActivity().getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_NIGHT_MASK;
+ if(uiModeNight != systemUiMode) {
+ /* TODO since ag/4947691 enable config_lockDayNightMode to block app setNightMode()
+ create b/115315612 to handle the UiModeManager permission deny problem */
+ mUiModeManager = (UiModeManager) getActivity()
+ .getSystemService(Context.UI_MODE_SERVICE);
+ mUiModeManager.setNightMode(uiModeNight);
+ device.waitForIdle(NIGHT_MODE_CHANGE_WAIT_TIME);
+ }
+ }
}
diff --git a/tests/unit/com/android/documentsui/dirlist/ThemeUiTest.java b/tests/unit/com/android/documentsui/dirlist/ThemeUiTest.java
new file mode 100644
index 0000000..00cf76c
--- /dev/null
+++ b/tests/unit/com/android/documentsui/dirlist/ThemeUiTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2018 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.dirlist;
+
+import android.app.UiModeManager;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+
+import android.support.test.filters.SmallTest;
+
+import com.android.documentsui.ActivityTest;
+import com.android.documentsui.R;
+import com.android.documentsui.files.FilesActivity;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+* This class test default Light Theme (Night Mode Disable)
+* Verify ActionBar background, Window background, and GridItem background to meet Light style
+*/
+@SmallTest
+public class ThemeUiTest extends ActivityTest<FilesActivity> {
+ public ThemeUiTest() {
+ super(FilesActivity.class);
+ }
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ setSystemUiModeNight(UiModeManager.MODE_NIGHT_NO);
+ }
+
+ @After
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ setSystemUiModeNight(UiModeManager.MODE_NIGHT_NO);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_actionBarColor() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.ActionBarView);
+ int actionBarBackground = ta.getColor(R.styleable.ActionBarView_android_colorPrimary,
+ Color.RED);
+ ta.recycle();
+ assertEquals(getActivity().getColor(android.R.color.white), actionBarBackground);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_gridItemBackgroundColor() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.GridItem);
+ int gridItemColor = ta.getColor(R.styleable.GridItem_gridItemColor, Color.RED);
+ ta.recycle();
+ assertEquals(getActivity().getColor(R.color.item_doc_background), gridItemColor);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_lightNavigationBar() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.SystemWindow);
+ boolean isLightNavigationBar = ta.getBoolean(
+ R.styleable.SystemWindow_android_windowLightNavigationBar, false);
+ ta.recycle();
+ assertTrue(isLightNavigationBar);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_lightStatusBar() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.SystemWindow);
+ boolean isLightStatusBar = ta.getBoolean(
+ R.styleable.SystemWindow_android_windowLightNavigationBar, false);
+ ta.recycle();
+ assertTrue(isLightStatusBar);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_navigationBarColor() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.SystemWindow);
+ int navigationBarColor = ta.getColor(R.styleable.SystemWindow_android_navigationBarColor,
+ Color.RED);
+ ta.recycle();
+ assertEquals(getActivity().getColor(android.R.color.white), navigationBarColor);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_windowBackgroundColor() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.SystemWindow);
+ int windowBackground = ta.getColor(
+ R.styleable.SystemWindow_android_windowBackground, Color.RED);
+ ta.recycle();
+ assertEquals(getActivity().getColor(android.R.color.white), windowBackground);
+ }
+
+ @Test
+ public void testThemeNightModeEnable_statusBarColor() {
+ TypedArray ta = getActivity().obtainStyledAttributes(R.styleable.SystemWindow);
+ int statusBarColor = ta.getColor(R.styleable.SystemWindow_android_statusBarColor,
+ Color.RED);
+ ta.recycle();
+ assertEquals(getActivity().getColor(android.R.color.white), statusBarColor);
+ }
+}