diff options
| -rw-r--r-- | res/drawable/btn_transparent.xml | 21 | ||||
| -rw-r--r-- | res/drawable/btn_transparent_background.xml | 26 | ||||
| -rw-r--r-- | res/drawable/preview_bottom_sheet_background.xml | 22 | ||||
| -rwxr-xr-x | res/layout/fragment_preview.xml | 107 | ||||
| -rw-r--r-- | res/layout/preview_action.xml | 25 | ||||
| -rw-r--r-- | res/layout/preview_page_info.xml | 106 | ||||
| -rwxr-xr-x | res/menu/preview_menu.xml | 10 | ||||
| -rwxr-xr-x | res/values-notnight-v26/picker_colors.xml | 2 | ||||
| -rwxr-xr-x | res/values-notnight-v26/styles.xml | 4 | ||||
| -rwxr-xr-x | res/values-notnight-v27/styles.xml | 2 | ||||
| -rwxr-xr-x | res/values-sw720dp/dimens.xml | 3 | ||||
| -rwxr-xr-x | res/values/dimens.xml | 13 | ||||
| -rwxr-xr-x | res/values/picker_colors.xml | 2 | ||||
| -rwxr-xr-x | res/values/strings.xml | 3 | ||||
| -rwxr-xr-x | res/values/styles.xml | 21 | ||||
| -rwxr-xr-x | src/com/android/wallpaper/picker/PreviewFragment.java | 294 | ||||
| -rwxr-xr-x | src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java | 2 |
17 files changed, 407 insertions, 256 deletions
diff --git a/res/drawable/btn_transparent.xml b/res/drawable/btn_transparent.xml new file mode 100644 index 0000000..b8e0d1e --- /dev/null +++ b/res/drawable/btn_transparent.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Copyright (C) 2019 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. +--> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/btn_transparent_background" + android:insetBottom="5dp" + android:insetTop="5dp"/>
\ No newline at end of file diff --git a/res/drawable/btn_transparent_background.xml b/res/drawable/btn_transparent_background.xml new file mode 100644 index 0000000..9eb3bfc --- /dev/null +++ b/res/drawable/btn_transparent_background.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Copyright (C) 2019 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. +--> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="rectangle"> + <stroke android:width="1dp" android:color="@android:color/white"/> + <corners android:radius="?android:attr/buttonCornerRadius"/> + </shape> + </item> + <item android:drawable="?selectableItemBackground"/> +</layer-list>
\ No newline at end of file diff --git a/res/drawable/preview_bottom_sheet_background.xml b/res/drawable/preview_bottom_sheet_background.xml new file mode 100644 index 0000000..847cbf3 --- /dev/null +++ b/res/drawable/preview_bottom_sheet_background.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Copyright (C) 2019 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. +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/translucent_black"/> + <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="@dimen/preview_bottom_sheet_corner_radius" android:topRightRadius="@dimen/preview_bottom_sheet_corner_radius"/> +</shape>
\ No newline at end of file diff --git a/res/layout/fragment_preview.xml b/res/layout/fragment_preview.xml index a861213..82c481f 100755 --- a/res/layout/fragment_preview.xml +++ b/res/layout/fragment_preview.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:fitsSystemWindows="false"> + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="false"> <ImageView android:id="@+id/low_res_image" @@ -30,107 +31,19 @@ android:layout_height="match_parent" android:fitsSystemWindows="true"> - <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" + <androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@+id/coordinator_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom"> - <LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/bottom_sheet" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:minHeight="@dimen/preview_attribution_pane_expanded_height" - android:orientation="vertical" - android:background="@color/translucent_black" - app:behavior_peekHeight="@dimen/preview_attribution_pane_collapsed_height" - app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> - - <LinearLayout - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/preview_attribution_pane_content_side_margin" - android:layout_marginRight="@dimen/preview_attribution_pane_content_side_margin" - android:layout_marginBottom="@dimen/preview_attribution_pane_content_bottom_margin"> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <TextView - android:id="@+id/preview_attribution_pane_title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="top|start" - android:layout_marginRight="@dimen/preview_attribution_pane_title_end_margin" - android:layout_marginEnd="@dimen/preview_attribution_pane_title_end_margin" - android:layout_marginTop="@dimen/preview_attribution_pane_title_top_margin" - style="@style/preview_attribution_pane_title"/> - - <ImageView - android:id="@+id/preview_attribution_pane_arrow" - android:contentDescription="@string/expand_attribution_panel" - android:layout_gravity="top|end" - android:layout_width="@dimen/preview_attribution_pane_arrow_size" - android:layout_height="@dimen/preview_attribution_pane_arrow_size" - android:layout_marginLeft="@dimen/preview_attribution_pane_arrow_start_margin" - android:layout_marginStart="@dimen/preview_attribution_pane_arrow_start_margin" - android:layout_marginTop="@dimen/preview_attribution_pane_arrow_top_bottom_margin" - android:layout_marginBottom="@dimen/preview_attribution_pane_arrow_top_bottom_margin" - android:scaleType="center" - android:focusable="true" - android:clickable="true" - android:src="@drawable/material_ic_keyboard_arrow_up_black_24" - style="?attr/borderlessButtonStyle"/> - - </FrameLayout> - - <TextView - android:id="@+id/preview_attribution_pane_subtitle1" + <include + layout="@layout/preview_page_info" + android:id="@+id/bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/preview_attribution_pane_subtitle1_top_margin" - android:visibility="gone" - style="@style/preview_attribution_pane_subtitle"/> - - <TextView - android:id="@+id/preview_attribution_pane_subtitle2" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:visibility="gone" - android:textColor="@color/white_70_alpha" - android:textSize="@dimen/abc_text_size_caption_material" - android:layout_marginTop="@dimen/preview_attribution_pane_subtitle2_top_margin"/> - - </LinearLayout> - - <FrameLayout - android:id="@+id/preview_attribution_pane_explore_section" - android:layout_width="match_parent" - android:layout_height="@dimen/preview_attribution_pane_explore_height" - android:layout_marginBottom="@dimen/preview_attribution_pane_explore_bottom_margin" - android:visibility="gone"> - - <Button - android:id="@+id/preview_attribution_pane_explore_button" - android:drawablePadding="@dimen/explore_button_drawable_padding" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="@color/accent_color" - android:text="@string/explore" - android:layout_marginLeft="@dimen/preview_attribution_pane_explore_left_margin" - android:layout_marginStart="@dimen/preview_attribution_pane_explore_left_margin" - android:layout_gravity="center_vertical" - style="?attr/borderlessButtonStyle"/> - - </FrameLayout> - - </LinearLayout> + app:behavior_peekHeight="@dimen/preview_attribution_pane_collapsed_height" + app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"/> </androidx.coordinatorlayout.widget.CoordinatorLayout> diff --git a/res/layout/preview_action.xml b/res/layout/preview_action.xml new file mode 100644 index 0000000..9f5cc6d --- /dev/null +++ b/res/layout/preview_action.xml @@ -0,0 +1,25 @@ +<!-- Copyright (C) 2019 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. +--> + +<CheckBox + xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/ActionBarCheckboxStyle" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:text="@string/preview" + android:textAllCaps="false" + android:textAppearance="?android:attr/actionMenuTextAppearance" + android:theme="@style/PreviewCheckboxDeviceTheme"/>
\ No newline at end of file diff --git a/res/layout/preview_page_info.xml b/res/layout/preview_page_info.xml new file mode 100644 index 0000000..587e120 --- /dev/null +++ b/res/layout/preview_page_info.xml @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Copyright (C) 2019 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. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/page_info" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="vertical" + android:paddingHorizontal="@dimen/preview_attribution_pane_horizontal_padding" + android:background="@drawable/preview_bottom_sheet_background" + android:theme="@android:style/Theme.DeviceDefault.Settings"> + + <Space + android:id="@+id/preview_attribution_pane_title_spacer" + android:layout_width="0dp" + android:layout_height="@dimen/preview_attribution_pane_inner_spacer_height"/> + + <TextView + android:id="@+id/preview_attribution_pane_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/preview_attribution_pane_title_height" + android:ellipsize="end" + android:forceHasOverlappingRendering="false" + android:gravity="center" + android:singleLine="true" + android:textAppearance="@style/HeaderTextAppearance" + android:textColor="@color/material_white_100"/> + + <TextView + android:id="@+id/preview_attribution_pane_subtitle1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/preview_attribution_pane_author_height" + android:layout_marginTop="@dimen/preview_attribution_pane_author_top_margin" + android:forceHasOverlappingRendering="false" + android:gravity="center" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" + android:textColor="@color/material_white_100" + android:visibility="gone"/> + + <TextView + android:id="@+id/preview_attribution_pane_subtitle2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/preview_attribution_pane_description_height" + android:forceHasOverlappingRendering="false" + android:gravity="center_horizontal" + android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Caption" + android:textColor="@color/material_white_100" + android:visibility="gone"/> + + <Space + android:id="@+id/preview_attribution_pane_spacer" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginTop="@dimen/preview_attribution_pane_inner_spacer_height" + android:layout_weight="1"/> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/preview_attribution_pane_button_bottom_margin" + android:gravity="center" + android:orientation="horizontal"> + + <Button + style="@style/OutlinedButtonStyle" + android:id="@+id/preview_attribution_pane_explore_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/explore" + android:visibility="gone"/> + + <Space + android:id="@+id/spacer" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="gone"/> + + <Button + style="@style/ButtonStyle" + android:id="@+id/preview_attribution_pane_set_wallpaper_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/set_wallpaper_button_text" + android:visibility="gone"/> + + </LinearLayout> + +</LinearLayout>
\ No newline at end of file diff --git a/res/menu/preview_menu.xml b/res/menu/preview_menu.xml index d35a16d..7c9d610 100755 --- a/res/menu/preview_menu.xml +++ b/res/menu/preview_menu.xml @@ -15,9 +15,9 @@ --> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/set_wallpaper" - android:actionLayout="@layout/set_wallpaper_action" - android:title="@string/set_wallpaper_button_text" - app:showAsAction="always|withText" /> + <item android:id="@+id/preview" + android:checkable="true" + app:actionLayout="@layout/preview_action" + app:showAsAction="always|withText" + android:title="@string/preview"/> </menu> diff --git a/res/values-notnight-v26/picker_colors.xml b/res/values-notnight-v26/picker_colors.xml index c8c8424..a21500f 100755 --- a/res/values-notnight-v26/picker_colors.xml +++ b/res/values-notnight-v26/picker_colors.xml @@ -50,4 +50,6 @@ <color name="individual_tile_title_text_color">@color/textColorPrimary</color> <color name="individual_picker_background_color">@color/material_white_100</color> + + <color name="toolbar_icon_color">@color/text_color_dark</color> </resources> diff --git a/res/values-notnight-v26/styles.xml b/res/values-notnight-v26/styles.xml index ae7f7dd..3ca6dcf 100755 --- a/res/values-notnight-v26/styles.xml +++ b/res/values-notnight-v26/styles.xml @@ -22,9 +22,7 @@ <item name="android:windowLightStatusBar">true</item> </style> - <style name="RegularToolbarStyle" parent="@style/Widget.AppCompat.Toolbar"> - <item name="android:background">@color/primary_color</item> + <style name="RegularToolbarStyle" parent="@android:style/Widget.DeviceDefault.Light.ActionBar.Solid"> <item name="android:theme">@style/WallpaperTheme</item> - <item name="titleTextColor">@color/accent_color</item> </style> </resources> diff --git a/res/values-notnight-v27/styles.xml b/res/values-notnight-v27/styles.xml index 7c104f7..4de0e9f 100755 --- a/res/values-notnight-v27/styles.xml +++ b/res/values-notnight-v27/styles.xml @@ -17,7 +17,7 @@ <style name="WallpaperTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="colorControlActivated">?attr/colorPrimary</item> - <item name="colorControlNormal">?attr/colorAccent</item> + <item name="colorControlNormal">?android:attr/colorPrimary</item> <item name="android:statusBarColor">?attr/colorPrimary</item> <item name="android:windowLightStatusBar">true</item> diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml index 3289d1b..ece1ff7 100755 --- a/res/values-sw720dp/dimens.xml +++ b/res/values-sw720dp/dimens.xml @@ -38,8 +38,7 @@ <!-- Dimensions for the preview attribution pane. --> - <!-- 48dp + 2 * 8dp margin --> - <dimen name="preview_attribution_pane_collapsed_height">64dp</dimen> + <dimen name="preview_attribution_pane_collapsed_height">0dp</dimen> <dimen name="preview_attribution_pane_content_side_margin">24dp</dimen> <dimen name="preview_attribution_pane_explore_left_margin">10dp</dimen> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index d7a149b..5c7a4a9 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -102,8 +102,7 @@ <dimen name="preview_toolbar_up_button_start_padding">0dp</dimen> <dimen name="preview_toolbar_set_wallpaper_button_end_padding">12dp</dimen> - <!-- 48dp + 2 * 1dp margin --> - <dimen name="preview_attribution_pane_collapsed_height">50dp</dimen> + <dimen name="preview_attribution_pane_collapsed_height">0dp</dimen> <dimen name="preview_attribution_pane_expanded_height">96dp</dimen> <dimen name="preview_attribution_pane_content_side_margin">16dp</dimen> @@ -118,6 +117,15 @@ <dimen name="preview_attribution_pane_explore_height">48dp</dimen> <dimen name="preview_attribution_pane_explore_left_margin">2dp</dimen> <dimen name="preview_attribution_pane_explore_bottom_margin">16dp</dimen> + <dimen name="preview_attribution_pane_horizontal_padding">24dp</dimen> + <dimen name="preview_attribution_pane_extra_spacer_height">16dp</dimen> + <dimen name="preview_attribution_pane_inner_spacer_height">14dp</dimen> + <dimen name="preview_attribution_pane_title_height">48dp</dimen> + <dimen name="preview_attribution_pane_author_height">24dp</dimen> + <dimen name="preview_attribution_pane_author_top_margin">0dp</dimen> + <dimen name="preview_attribution_pane_description_height">34dp</dimen> + <dimen name="preview_attribution_pane_button_bottom_margin">8dp</dimen> + <!-- Dimensions for the "start rotation" dialog. --> <dimen name="start_rotation_dialog_subhead_margin_top">19dp</dimen> @@ -168,5 +176,6 @@ <!-- Dimensions for the "disabled by admin" UI in desktop mode. --> <dimen name="disabled_by_admin_desktop_message_text_size">13sp</dimen> + <dimen name="preview_bottom_sheet_corner_radius">?android:attr/dialogCornerRadius</dimen> </resources> diff --git a/res/values/picker_colors.xml b/res/values/picker_colors.xml index f6c85c5..3f6b6af 100755 --- a/res/values/picker_colors.xml +++ b/res/values/picker_colors.xml @@ -70,4 +70,6 @@ <color name="individual_picker_background_color">@color/translucent_black</color> <color name="preview_pane_arrow_color">@color/material_white_100</color> + + <color name="toolbar_icon_color">@color/material_white_text</color> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index 83bea72..fe99050 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -297,4 +297,7 @@ <string name="third_party_app_wallpaper_collection_id" translatable="false"> third_party_app_wallpapers </string> + + <!-- Label for a checkbox which lets user preview the displayed image as wallpaper. [CHAR LIMIT=30] --> + <string name="preview">Preview</string> </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index 0c66ab1..511f0fb 100755 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -27,6 +27,8 @@ <!-- Set no title and no action bar because we use a toolbar instead. --> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> + <item name="android:windowActionBar">false</item> + <item name="android:windowNoTitle">true</item> <!-- Set status bar and navigation buttons to be translucent. --> <item name="android:colorPrimaryDark">@color/translucent_black</item> @@ -42,7 +44,7 @@ </style> <style name="TranslucentToolbarStyle" parent="@style/Widget.AppCompat.Toolbar"> - <item name="android:background">@color/translucent_black</item> + <item name="android:background">@android:color/transparent</item> <item name="android:theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item> </style> @@ -106,4 +108,21 @@ <style name="HeaderTextAppearance" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> <item name="android:textFontWeight">400</item> </style> + + <style name="ButtonStyle" parent="@android:style/Widget.DeviceDefault.Button.Colored"> + <item name="android:padding">16dp</item> + <item name="android:minHeight">48dp</item> + </style> + + <style name="OutlinedButtonStyle" parent="@android:style/Widget.DeviceDefault.Button"> + <item name="android:background">@drawable/btn_transparent</item> + <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> + <item name="android:textColor">@android:color/white</item> + </style> + + <style name="ActionBarCheckboxStyle" parent="@android:style/Widget.DeviceDefault.CompoundButton.CheckBox"/> + + <style name="PreviewCheckboxDeviceTheme" parent="@android:style/Theme.DeviceDefault"> + <item name="android:colorControlActivated">@*android:color/accent_device_default_light</item> + </style> </resources> diff --git a/src/com/android/wallpaper/picker/PreviewFragment.java b/src/com/android/wallpaper/picker/PreviewFragment.java index 0ba9412..dc05fa5 100755 --- a/src/com/android/wallpaper/picker/PreviewFragment.java +++ b/src/com/android/wallpaper/picker/PreviewFragment.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Resources.NotFoundException; +import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Color; @@ -32,12 +33,11 @@ import android.graphics.PointF; import android.graphics.PorterDuff.Mode; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; import android.net.Uri; -import android.os.Build; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.util.Log; +import android.view.ContextThemeWrapper; import android.view.Display; import android.view.LayoutInflater; import android.view.Menu; @@ -45,11 +45,10 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.Surface; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; -import android.widget.FrameLayout; +import android.widget.CheckBox; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -68,8 +67,6 @@ import com.android.wallpaper.asset.Asset; import com.android.wallpaper.asset.Asset.BitmapReceiver; import com.android.wallpaper.asset.Asset.DimensionsReceiver; import com.android.wallpaper.compat.BuildCompat; -import com.android.wallpaper.compat.ButtonDrawableSetterCompat; -import com.android.wallpaper.config.Flags; import com.android.wallpaper.model.WallpaperInfo; import com.android.wallpaper.module.ExploreIntentChecker; import com.android.wallpaper.module.Injector; @@ -154,9 +151,7 @@ public class PreviewFragment extends Fragment implements private TextView mAttributionTitle; private TextView mAttributionSubtitle1; private TextView mAttributionSubtitle2; - private FrameLayout mAttributionExploreSection; private Button mAttributionExploreButton; - private ImageView mPreviewPaneArrow; private int mCurrentScreenOrientation; private Point mDefaultCropSurfaceSize; private Point mScreenSize; @@ -164,6 +159,9 @@ public class PreviewFragment extends Fragment implements private ImageView mLoadingIndicator; private MaterialProgressDrawable mProgressDrawable; private ImageView mLowResImageView; + private Button mSetWallpaperButton; + private View mSpacer; + private CheckBox mPreview; @SuppressWarnings("RestrictTo") @State @@ -194,6 +192,13 @@ public class PreviewFragment extends Fragment implements return fragment; } + private static int getAttrColor(Context context, int attr) { + TypedArray ta = context.obtainStyledAttributes(new int[]{attr}); + int colorAccent = ta.getColor(0, 0); + ta.recycle(); + return colorAccent; + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -233,10 +238,11 @@ public class PreviewFragment extends Fragment implements View view = inflater.inflate(R.layout.fragment_preview, container, false); // Set toolbar as the action bar. - Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); - ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); - ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false); + Toolbar toolbar = view.findViewById(R.id.toolbar); + AppCompatActivity activity = (AppCompatActivity) getActivity(); + activity.setSupportActionBar(toolbar); + activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + activity.getSupportActionBar().setDisplayShowTitleEnabled(false); // Use updated fancy arrow icon for O+. if (BuildCompat.isAtLeastO()) { @@ -267,15 +273,22 @@ public class PreviewFragment extends Fragment implements mAttributionTitle = view.findViewById(R.id.preview_attribution_pane_title); mAttributionSubtitle1 = view.findViewById(R.id.preview_attribution_pane_subtitle1); mAttributionSubtitle2 = view.findViewById(R.id.preview_attribution_pane_subtitle2); - mAttributionExploreSection = view.findViewById( - R.id.preview_attribution_pane_explore_section); mAttributionExploreButton = view.findViewById( R.id.preview_attribution_pane_explore_button); - mPreviewPaneArrow = view.findViewById(R.id.preview_attribution_pane_arrow); mLowResImageView = view.findViewById(R.id.low_res_image); - - mPreviewPaneArrow.setColorFilter( - getResources().getColor(R.color.preview_pane_arrow_color), Mode.SRC_IN); + mSetWallpaperButton = view.findViewById(R.id.preview_attribution_pane_set_wallpaper_button); + mSpacer = view.findViewById(R.id.spacer); + + // Workaround as we don't have access to bottomDialogCornerRadius, mBottomSheet radii are + // set to dialogCornerRadius by default. + GradientDrawable bottomSheetBackground = (GradientDrawable) mBottomSheet.getBackground(); + float[] radii = bottomSheetBackground.getCornerRadii(); + for (int i = 0; i < radii.length; i++) { + radii[i]*=2f; + } + bottomSheetBackground = ((GradientDrawable)bottomSheetBackground.mutate()); + bottomSheetBackground.setCornerRadii(radii); + mBottomSheet.setBackground(bottomSheetBackground); // Trim some memory from Glide to make room for the full-size image in this fragment. Glide.get(getActivity()).setMemoryCategory(MemoryCategory.LOW); @@ -289,7 +302,8 @@ public class PreviewFragment extends Fragment implements // shown to the user more quickly than the full-sized image. if (mWallpaperAsset.hasLowResDataSource()) { mWallpaperAsset.loadLowResDrawable(getActivity(), mLowResImageView, Color.BLACK, - new WallpaperPreviewBitmapTransformation(getActivity().getApplicationContext(), isRtl())); + new WallpaperPreviewBitmapTransformation(getActivity().getApplicationContext(), + isRtl())); } mWallpaperAsset.decodeRawDimensions(getActivity(), new DimensionsReceiver() { @@ -332,23 +346,23 @@ public class PreviewFragment extends Fragment implements mProgressDrawable = new MaterialProgressDrawable(getActivity().getApplicationContext(), mLoadingIndicator); mProgressDrawable.setAlpha(255); - mProgressDrawable.setBackgroundColor(getResources().getColor(R.color.material_white_100)); - mProgressDrawable.setColorSchemeColors(getResources().getColor(R.color.accent_color)); + mProgressDrawable.setBackgroundColor(getResources().getColor(R.color.material_white_100, + getContext().getTheme())); + mProgressDrawable.setColorSchemeColors(getAttrColor( + new ContextThemeWrapper(getContext(), getDeviceDefaultTheme()), + android.R.attr.colorAccent)); mProgressDrawable.updateSizes(MaterialProgressDrawable.LARGE); mLoadingIndicator.setImageDrawable(mProgressDrawable); // We don't want to show the spinner every time we load an image if it loads quickly; instead, // only start showing the spinner if loading the image has taken longer than half of a second. - mLoadingIndicator.postDelayed(new Runnable() { - @Override - public void run() { - if (mFullResImageView != null && !mFullResImageView.hasImage() - && !mTestingModeEnabled) { - mLoadingIndicator.setVisibility(View.VISIBLE); - mLoadingIndicator.setAlpha(1f); - if (mProgressDrawable != null) { - mProgressDrawable.start(); - } + mLoadingIndicator.postDelayed(() -> { + if (mFullResImageView != null && !mFullResImageView.hasImage() + && !mTestingModeEnabled) { + mLoadingIndicator.setVisibility(View.VISIBLE); + mLoadingIndicator.setAlpha(1f); + if (mProgressDrawable != null) { + mProgressDrawable.start(); } } }, 500); @@ -363,6 +377,16 @@ public class PreviewFragment extends Fragment implements return view; } + protected int getDeviceDefaultTheme() { + return BuildCompat.isAtLeastQ() ? getDayNightDeviceDefault() + : android.R.style.Theme_DeviceDefault; + } + + @TargetApi(29) + private int getDayNightDeviceDefault() { + return R.style.Theme_AppCompat_DayNight; + } + @Override public void onResume() { super.onResume(); @@ -389,32 +413,13 @@ public class PreviewFragment extends Fragment implements public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.preview_menu, menu); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - MenuItem setWallpaperButton = menu.findItem(R.id.set_wallpaper); - - if (mPreviewMode == MODE_CROP_AND_SET_WALLPAPER && isWallpaperLoaded()) { - setWallpaperButton.setVisible(true); - } else { - setWallpaperButton.setVisible(false); - } + setupPreviewMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.set_wallpaper) { - if (BuildCompat.isAtLeastN()) { - mWallpaperSetter.requestDestination(getContext(), getFragmentManager(), mWallpaper, - this); - } else { - setCurrentWallpaper(WallpaperPersister.DEST_HOME_SCREEN); - } - return true; - } else if (id == android.R.id.home) { + if (id == android.R.id.home) { // The Preview screen has multiple entry points. It could be opened from either // the IndividualPreviewActivity, the "My photos" selection (by way of // TopLevelPickerActivity), or from a system "crop and set wallpaper" intent. @@ -426,6 +431,31 @@ public class PreviewFragment extends Fragment implements return false; } + protected void setupPreviewMenu(Menu menu) { + mPreview = (CheckBox) menu.findItem(R.id.preview).getActionView(); + mPreview.setOnClickListener(this::setPreviewBehavior); + } + + private void setPreviewChecked(boolean checked) { + if (mPreview != null) { + mPreview.setChecked(checked); + int resId = checked ? R.string.expand_attribution_panel + : R.string.collapse_attribution_panel; + mPreview.setContentDescription(getResources().getString(resId)); + } + } + + private void setPreviewBehavior(final View v) { + CheckBox checkbox = (CheckBox) v; + BottomSheetBehavior<?> behavior = BottomSheetBehavior.from(mBottomSheet); + + if (checkbox.isChecked()) { + behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + } else { + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + } + @Override public void onSetHomeScreen() { setCurrentWallpaper(WallpaperPersister.DEST_HOME_SCREEN); @@ -472,18 +502,13 @@ public class PreviewFragment extends Fragment implements outState.putInt(KEY_BOTTOM_SHEET_STATE, bottomSheetBehavior.getState()); } - private void updatePreviewPaneArrow(int bottomSheetState) { - if (bottomSheetState == BottomSheetBehavior.STATE_COLLAPSED) { - mPreviewPaneArrow.setImageResource(R.drawable.material_ic_keyboard_arrow_up_black_24); - mPreviewPaneArrow.setContentDescription( - getResources().getString(R.string.expand_attribution_panel)); - } else if (bottomSheetState == BottomSheetBehavior.STATE_EXPANDED) { - mPreviewPaneArrow.setImageResource(R.drawable.material_ic_keyboard_arrow_down_black_24); - mPreviewPaneArrow.setContentDescription( - getResources().getString(R.string.collapse_attribution_panel)); + private void onSetWallpaperClicked(View button) { + if (BuildCompat.isAtLeastN()) { + mWallpaperSetter.requestDestination(getContext(), getFragmentManager(), mWallpaper, + this); + } else { + setCurrentWallpaper(WallpaperPersister.DEST_HOME_SCREEN); } - mPreviewPaneArrow.setColorFilter( - getResources().getColor(R.color.preview_pane_arrow_color), Mode.SRC_IN); } /** @@ -518,30 +543,23 @@ public class PreviewFragment extends Fragment implements private void setUpBottomSheetListeners() { final BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(mBottomSheet); - OnClickListener onClickListener = new OnClickListener() { - @Override - public void onClick(View view) { - if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) { - bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); - } else if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { - bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); - } - } - }; - mAttributionTitle.setOnClickListener(onClickListener); - mPreviewPaneArrow.setOnClickListener(onClickListener); - bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(View bottomSheet, int newState) { - // Don't respond to lingering state change events occurring after the fragment has already - // been detached from the activity. Else, IllegalStateException may occur when trying to - // fetch resources. + // Don't respond to lingering state change events occurring after the fragment has + // already been detached from the activity. Else, IllegalStateException may occur + // when trying to fetch resources. if (getActivity() == null) { return; } - - updatePreviewPaneArrow(newState); + switch (newState) { + case BottomSheetBehavior.STATE_COLLAPSED: + setPreviewChecked(true /* checked */); + break; + case BottomSheetBehavior.STATE_EXPANDED: + setPreviewChecked(false /* checked */); + break; + } } @Override @@ -584,60 +602,57 @@ public class PreviewFragment extends Fragment implements mAttributionSubtitle2.setText(attributions.get(2)); } + if (mPreviewMode == MODE_CROP_AND_SET_WALLPAPER) { + mSetWallpaperButton.setVisibility(View.VISIBLE); + mSetWallpaperButton.setOnClickListener(this::onSetWallpaperClicked); + } else { + mSetWallpaperButton.setVisibility(View.GONE); + } + String actionUrl = mWallpaper.getActionUrl(context); + + mAttributionExploreButton.setVisibility(View.GONE); if (actionUrl != null && !actionUrl.isEmpty()) { if (mExploreIntent != null) { - if (Flags.skipDailyWallpaperButtonEnabled) { - Drawable exploreButtonDrawable = context.getDrawable( - mWallpaper.getActionIconRes(context)); - - // This Drawable's state is shared across the app, so make a copy of it before applying a - // color tint as not to affect other clients elsewhere in the app. - exploreButtonDrawable = exploreButtonDrawable.getConstantState() - .newDrawable().mutate(); - // Color the "compass" icon with the accent color. - exploreButtonDrawable.setColorFilter( - getResources().getColor(R.color.accent_color), Mode.SRC_IN); - ButtonDrawableSetterCompat.setDrawableToButtonStart( - mAttributionExploreButton, exploreButtonDrawable); - mAttributionExploreButton.setText(context.getString( - mWallpaper.getActionLabelRes(context))); - } + mAttributionExploreButton.setVisibility(View.VISIBLE); + mAttributionExploreButton.setText(context.getString( + mWallpaper.getActionLabelRes(context))); - mAttributionExploreSection.setVisibility(View.VISIBLE); - mAttributionExploreButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - mUserEventLogger.logActionClicked(mWallpaper.getCollectionId(context), - mWallpaper.getActionLabelRes(context)); + mAttributionExploreButton.setOnClickListener(view -> { + mUserEventLogger.logActionClicked(mWallpaper.getCollectionId(context), + mWallpaper.getActionLabelRes(context)); - startActivity(mExploreIntent); - } + startActivity(mExploreIntent); }); } } + if (mAttributionExploreButton.getVisibility() == View.VISIBLE + && mSetWallpaperButton.getVisibility() == View.VISIBLE) { + mSpacer.setVisibility(View.VISIBLE); + } else { + mSpacer.setVisibility(View.GONE); + } + mBottomSheet.setVisibility(View.VISIBLE); // Initialize the state of the BottomSheet based on the current state because if the initial // and current state are the same, the state change listener won't fire and set the correct // arrow asset and text alpha. - if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { - updatePreviewPaneArrow(BottomSheetBehavior.STATE_EXPANDED); - } else { + if (bottomSheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED) { mAttributionTitle.setAlpha(0f); mAttributionSubtitle1.setAlpha(0f); mAttributionSubtitle2.setAlpha(0f); } - // Let the state change listener take care of animating a state change to the initial state if - // there's a state change. + // Let the state change listener take care of animating a state change to the initial state + // if there's a state change. bottomSheetBehavior.setState(mBottomSheetInitialState); } /** - * Initializes MosaicView by initializing tiling, setting a fallback page bitmap, and initializing - * a zoom-scroll observer and click listener. + * Initializes MosaicView by initializing tiling, setting a fallback page bitmap, and + * initializing a zoom-scroll observer and click listener. */ private void initFullResView() { mFullResImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP); @@ -666,7 +681,8 @@ public class PreviewFragment extends Fragment implements if (mLoadingIndicator != null) { mLoadingIndicator.setVisibility(View.GONE); } - // The page bitmap may be null if there was a decoding error, so show an error dialog. + // The page bitmap may be null if there was a decoding error, so show an + // error dialog. if (pageBitmap == null) { showLoadWallpaperErrorDialog(); return; @@ -693,7 +709,8 @@ public class PreviewFragment extends Fragment implements * indicator. */ private void crossFadeInMosaicView() { - long shortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime); + long shortAnimationDuration = getResources().getInteger( + android.R.integer.config_shortAnimTime); mFullResImageView.setAlpha(0f); mFullResImageView.animate() @@ -702,7 +719,8 @@ public class PreviewFragment extends Fragment implements .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - // Clear the thumbnail bitmap reference to save memory since it's no longer visible. + // Clear the thumbnail bitmap reference to save memory since it's no longer + // visible. if (mLowResImageView != null) { mLowResImageView.setImageBitmap(null); } @@ -773,8 +791,8 @@ public class PreviewFragment extends Fragment implements rect.set(0, 0, scaledWallpaperWidth, scaledWallpaperHeight); Point screenSize = ScreenSizeCalculator.getInstance().getScreenSize( getActivity().getWindowManager().getDefaultDisplay()); - // Crop rect should start off as the visible screen and then include extra width and height if - // available within wallpaper at the current zoom. + // Crop rect should start off as the visible screen and then include extra width and height + // if available within wallpaper at the current zoom. Rect cropRect = new Rect(scrollX, scrollY, scrollX + screenSize.x, scrollY + screenSize.y); Point defaultCropSurfaceSize = WallpaperCropUtils.getDefaultCropSurfaceSize( @@ -782,7 +800,8 @@ public class PreviewFragment extends Fragment implements int extraWidth = defaultCropSurfaceSize.x - screenSize.x; int extraHeightTopAndBottom = (int) ((defaultCropSurfaceSize.y - screenSize.y) / 2f); - // Try to increase size of screenRect to include extra width depending on the layout direction. + // Try to increase size of screenRect to include extra width depending on the layout + // direction. if (isRtl()) { cropRect.left = Math.max(cropRect.left - extraWidth, rect.left); } else { @@ -843,8 +862,9 @@ public class PreviewFragment extends Fragment implements R.string.set_wallpaper_error_message, wallpaperDestination); newFragment.setTargetFragment(this, UNUSED_REQUEST_CODE); - // Show 'set wallpaper' error dialog now if it's safe to commit fragment transactions, otherwise - // stage it for later when the hosting activity is in a state to commit fragment transactions. + // Show 'set wallpaper' error dialog now if it's safe to commit fragment transactions, + // otherwise stage it for later when the hosting activity is in a state to commit fragment + // transactions. BasePreviewActivity activity = (BasePreviewActivity) getActivity(); if (activity.isSafeToCommitFragmentTransaction()) { newFragment.show(getFragmentManager(), TAG_SET_WALLPAPER_ERROR_DIALOG_FRAGMENT); @@ -854,8 +874,8 @@ public class PreviewFragment extends Fragment implements } /** - * Shows 'load wallpaper' error dialog now or stage it to be shown when the hosting activity is in - * a state that allows committing fragment transactions. + * Shows 'load wallpaper' error dialog now or stage it to be shown when the hosting activity is + * in a state that allows committing fragment transactions. */ private void showLoadWallpaperErrorDialog() { LoadWallpaperErrorDialogFragment dialogFragment = @@ -923,33 +943,19 @@ public class PreviewFragment extends Fragment implements case 3: return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; default: - Log.e(TAG, "Display rotation did not correspond to a valid ActivityInfo orientation with" - + " display rotation: " + display.getRotation() + " and index offset: " + indexOffset - + "."); + Log.e(TAG, "Display rotation did not correspond to a valid ActivityInfo orientation" + + "with display rotation: " + display.getRotation() + " and index offset: " + + indexOffset + "."); return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) - private void saveAndLockScreenOrientation() { - mCurrentScreenOrientation = getActivity().getRequestedOrientation(); - if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) { - getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); - } else { - getActivity().setRequestedOrientation(getCompatActivityInfoOrientation()); - } - } - - private void restoreScreenOrientation() { - getActivity().setRequestedOrientation(mCurrentScreenOrientation); - } - /** - * Returns whether layout direction is RTL (or false for LTR). Since native RTL layout support was - * added in API 17, returns false for versions lower than 17. + * Returns whether layout direction is RTL (or false for LTR). Since native RTL layout support + * was added in API 17, returns false for versions lower than 17. */ private boolean isRtl() { - return VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 - && getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; + return getResources().getConfiguration().getLayoutDirection() + == View.LAYOUT_DIRECTION_RTL; } }
\ No newline at end of file diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java b/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java index 4df59eb..24eb535 100755 --- a/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java +++ b/src/com/android/wallpaper/picker/individual/IndividualPickerActivity.java @@ -114,7 +114,7 @@ public class IndividualPickerActivity extends BaseActivity { // color tint as not to affect other clients elsewhere in the app. navigationIcon = navigationIcon.getConstantState().newDrawable().mutate(); navigationIcon.setColorFilter( - ContextCompat.getColor(this, R.color.accent_color), Mode.SRC_IN); + ContextCompat.getColor(this, R.color.toolbar_icon_color), Mode.SRC_IN); // Need to explicitly check against 19 rather than using BuildCompat in order to avoid a // NoSuchMethodError here in UI tests running on pre-API 19 emulators. |
