diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-09-09 17:00:07 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-09-09 17:00:07 +0000 |
commit | 0b95125d997a550ced386fa56ecd49a4220f03e4 (patch) | |
tree | 5877966030e1d0f81ea36df49fff0512f1c16dda /tests | |
parent | a60a1bf9d348b06b2a067e5421bd3ca69226305f (diff) | |
parent | aadc76edb1de861182332910c343693b6ceb511a (diff) | |
download | frameworks_base-0b95125d997a550ced386fa56ecd49a4220f03e4.zip frameworks_base-0b95125d997a550ced386fa56ecd49a4220f03e4.tar.gz frameworks_base-0b95125d997a550ced386fa56ecd49a4220f03e4.tar.bz2 |
am 1420cfbf: am 2146dc79: am 0ad9e247: Merge "Add new wallpaper features for insets and offsets." into lmp-dev
* commit '1420cfbf788fa9272f43231c15be29f7febdcde3':
Add new wallpaper features for insets and offsets.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/WallpaperTest/Android.mk | 15 | ||||
-rw-r--r-- | tests/WallpaperTest/AndroidManifest.xml | 31 | ||||
-rw-r--r-- | tests/WallpaperTest/res/drawable-hdpi/test_wallpaper_thumb.png | bin | 0 -> 34700 bytes | |||
-rw-r--r-- | tests/WallpaperTest/res/layout/activity_main.xml | 177 | ||||
-rw-r--r-- | tests/WallpaperTest/res/values-v11/styles.xml | 28 | ||||
-rw-r--r-- | tests/WallpaperTest/res/values-v21/styles.xml | 29 | ||||
-rw-r--r-- | tests/WallpaperTest/res/values/colors.xml | 19 | ||||
-rw-r--r-- | tests/WallpaperTest/res/values/strings.xml | 42 | ||||
-rw-r--r-- | tests/WallpaperTest/res/values/styles.xml | 37 | ||||
-rw-r--r-- | tests/WallpaperTest/res/xml/test_wallpaper.xml | 26 | ||||
-rw-r--r-- | tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java | 176 | ||||
-rw-r--r-- | tests/WallpaperTest/src/com/example/wallpapertest/TestWallpaper.java | 251 |
12 files changed, 831 insertions, 0 deletions
diff --git a/tests/WallpaperTest/Android.mk b/tests/WallpaperTest/Android.mk new file mode 100644 index 0000000..b4259cd --- /dev/null +++ b/tests/WallpaperTest/Android.mk @@ -0,0 +1,15 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res + +LOCAL_PACKAGE_NAME := WallpaperTest + +LOCAL_PROGUARD_ENABLED := disabled + +include $(BUILD_PACKAGE) + diff --git a/tests/WallpaperTest/AndroidManifest.xml b/tests/WallpaperTest/AndroidManifest.xml new file mode 100644 index 0000000..4c914dd --- /dev/null +++ b/tests/WallpaperTest/AndroidManifest.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.wallpapertest" > + + <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" /> + + <application + android:label="@string/app_name" + android:theme="@style/AppTheme" > + <activity + android:name=".MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <service + android:label="@string/test_wallpaper" + android:name=".TestWallpaper" + android:permission="android.permission.BIND_WALLPAPER" + android:enabled="true"> + <intent-filter> + <action android:name="android.service.wallpaper.WallpaperService" /> + </intent-filter> + <meta-data android:name="android.service.wallpaper" + android:resource="@xml/test_wallpaper" /> + </service> + </application> +</manifest> diff --git a/tests/WallpaperTest/res/drawable-hdpi/test_wallpaper_thumb.png b/tests/WallpaperTest/res/drawable-hdpi/test_wallpaper_thumb.png Binary files differnew file mode 100644 index 0000000..df92eb5 --- /dev/null +++ b/tests/WallpaperTest/res/drawable-hdpi/test_wallpaper_thumb.png diff --git a/tests/WallpaperTest/res/layout/activity_main.xml b/tests/WallpaperTest/res/layout/activity_main.xml new file mode 100644 index 0000000..d968396 --- /dev/null +++ b/tests/WallpaperTest/res/layout/activity_main.xml @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/window_background"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/dimens"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/width"/> + <EditText + android:id="@+id/dimen_width" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="numberDecimal"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/height"/> + <EditText + android:id="@+id/dimen_height" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="numberDecimal"/> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/wallpaper_offset"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/x"/> + <EditText + android:id="@+id/walloff_x" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="numberDecimal"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/y"/> + <EditText + android:id="@+id/walloff_y" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="numberDecimal"/> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/padding"/> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/left"/> + <EditText + android:id="@+id/padding_left" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="number"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/right"/> + <EditText + android:id="@+id/padding_right" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="number"/> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/top"/> + <EditText + android:id="@+id/padding_top" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="number"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/bottom"/> + <EditText + android:id="@+id/padding_bottom" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="number"/> + </LinearLayout> + </LinearLayout> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/display_offset"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/x"/> + <EditText + android:id="@+id/dispoff_x" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="numberSigned"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:textSize="17sp" + android:text="@string/y"/> + <EditText + android:id="@+id/dispoff_y" + android:layout_width="60sp" + android:layout_height="wrap_content" + android:inputType="numberSigned"/> + </LinearLayout> + </LinearLayout> +</ScrollView> diff --git a/tests/WallpaperTest/res/values-v11/styles.xml b/tests/WallpaperTest/res/values-v11/styles.xml new file mode 100644 index 0000000..95000b2 --- /dev/null +++ b/tests/WallpaperTest/res/values-v11/styles.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2013 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. +--> + +<resources> + + <!-- + Base application theme for API 11+. This theme completely replaces + AppBaseTheme from res/values/styles.xml on API 11+ devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Holo.Wallpaper"> + <!-- API 11 theme customizations can go here. --> + </style> + +</resources>
\ No newline at end of file diff --git a/tests/WallpaperTest/res/values-v21/styles.xml b/tests/WallpaperTest/res/values-v21/styles.xml new file mode 100644 index 0000000..e42d526 --- /dev/null +++ b/tests/WallpaperTest/res/values-v21/styles.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2013 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. +--> + +<resources> + + <!-- + Base application theme for API 21+. This theme completely replaces + AppBaseTheme from BOTH res/values/styles.xml and + res/values-v11/styles.xml on API 14+ devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Material.Wallpaper"> + <!-- API 14 theme customizations can go here. --> + </style> + +</resources>
\ No newline at end of file diff --git a/tests/WallpaperTest/res/values/colors.xml b/tests/WallpaperTest/res/values/colors.xml new file mode 100644 index 0000000..8c08249 --- /dev/null +++ b/tests/WallpaperTest/res/values/colors.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2014 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 + --> +<resources> + <color name="window_background">#80000000</color> +</resources>
\ No newline at end of file diff --git a/tests/WallpaperTest/res/values/strings.xml b/tests/WallpaperTest/res/values/strings.xml new file mode 100644 index 0000000..fd21259 --- /dev/null +++ b/tests/WallpaperTest/res/values/strings.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2014 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. +--> + +<resources> + <string name="app_name">Wallpaper Test</string> + + <string name="test_wallpaper">Test Wallpaper</string> + <string name="test_wallpaper_author">Google</string> + <string name="test_wallpaper_desc"> + Test wallpaper for use with the wallpaper test app. + </string> + + <string name="dimens">Dimens: </string> + <string name="width">Width: </string> + <string name="height">Height: </string> + + <string name="wallpaper_offset">Wall off: </string> + <string name="x">X: </string> + <string name="y">Y: </string> + + <string name="padding">Padding: </string> + <string name="left">Left: </string> + <string name="right">Right: </string> + <string name="top">Top: </string> + <string name="bottom">Bottom: </string> + + <string name="display_offset">Disp off: </string> +</resources> diff --git a/tests/WallpaperTest/res/values/styles.xml b/tests/WallpaperTest/res/values/styles.xml new file mode 100644 index 0000000..d2b91d6 --- /dev/null +++ b/tests/WallpaperTest/res/values/styles.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2013 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. +--> + +<resources> + + <!-- + Base application theme, dependent on API level. This theme is replaced + by AppBaseTheme from res/values-vXX/styles.xml on newer devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Wallpaper"> + <!-- + Theme customizations available in newer API levels can go in + res/values-vXX/styles.xml, while customizations related to + backward-compatibility can go here. + --> + </style> + + <!-- Application theme. --> + <style name="AppTheme" parent="AppBaseTheme"> + <!-- All customizations that are NOT specific to a particular API-level can go here. --> + </style> + +</resources>
\ No newline at end of file diff --git a/tests/WallpaperTest/res/xml/test_wallpaper.xml b/tests/WallpaperTest/res/xml/test_wallpaper.xml new file mode 100644 index 0000000..9f7d714 --- /dev/null +++ b/tests/WallpaperTest/res/xml/test_wallpaper.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright (c) 2008, 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. + */ +--> + +<!-- The attributes in this XML file provide configuration information --> +<!-- about the polar clock. --> + +<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" + android:author="@string/test_wallpaper_author" + android:description="@string/test_wallpaper_desc" + android:thumbnail="@drawable/test_wallpaper_thumb" /> diff --git a/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java b/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java new file mode 100644 index 0000000..7880f67 --- /dev/null +++ b/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java @@ -0,0 +1,176 @@ +/* + * Copyright 2014 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.example.wallpapertest; + +import android.app.Activity; +import android.app.WallpaperManager; +import android.content.Context; +import android.graphics.Point; +import android.graphics.Rect; +import android.os.Bundle; +import android.os.IBinder; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.WindowManager; +import android.widget.TextView; + +public class MainActivity extends Activity { + private static final String TAG = "MainActivity"; + + WallpaperManager mWallpaperManager; + WindowManager mWindowManager; + + TextView mDimenWidthView; + TextView mDimenHeightView; + + TextView mWallOffXView; + TextView mWallOffYView; + + TextView mPaddingLeftView; + TextView mPaddingRightView; + TextView mPaddingTopView; + TextView mPaddingBottomView; + + TextView mDispOffXView; + TextView mDispOffYView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + mWallpaperManager = (WallpaperManager)getSystemService(Context.WALLPAPER_SERVICE); + mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); + + mDimenWidthView = (TextView) findViewById(R.id.dimen_width); + mDimenWidthView.addTextChangedListener(mTextWatcher); + mDimenHeightView = (TextView) findViewById(R.id.dimen_height); + mDimenHeightView.addTextChangedListener(mTextWatcher); + + mWallOffXView = (TextView) findViewById(R.id.walloff_x); + mWallOffXView.addTextChangedListener(mTextWatcher); + mWallOffYView = (TextView) findViewById(R.id.walloff_y); + mWallOffYView.addTextChangedListener(mTextWatcher); + + mPaddingLeftView = (TextView) findViewById(R.id.padding_left); + mPaddingLeftView.addTextChangedListener(mTextWatcher); + mPaddingRightView = (TextView) findViewById(R.id.padding_right); + mPaddingRightView.addTextChangedListener(mTextWatcher); + mPaddingTopView = (TextView) findViewById(R.id.padding_top); + mPaddingTopView.addTextChangedListener(mTextWatcher); + mPaddingBottomView = (TextView) findViewById(R.id.padding_bottom); + mPaddingBottomView.addTextChangedListener(mTextWatcher); + + mDispOffXView = (TextView) findViewById(R.id.dispoff_x); + mDispOffXView.addTextChangedListener(mTextWatcher); + mDispOffYView = (TextView) findViewById(R.id.dispoff_y); + mDispOffYView.addTextChangedListener(mTextWatcher); + + updateDimens(); + updateWallOff(); + updatePadding(); + updateDispOff(); + } + + private int loadPropIntText(TextView view, int baseVal) { + String str = view.getText().toString(); + if (str != null && !TextUtils.isEmpty(str)) { + try { + float fval = Float.parseFloat(str); + return (int)(fval*baseVal); + } catch (NumberFormatException e) { + Log.i(TAG, "Bad number: " + str, e); + } + } + return baseVal; + } + + private float loadFloatText(TextView view) { + String str = view.getText().toString(); + if (str != null && !TextUtils.isEmpty(str)) { + try { + return Float.parseFloat(str); + } catch (NumberFormatException e) { + Log.i(TAG, "Bad number: " + str, e); + } + } + return 0; + } + + private int loadIntText(TextView view) { + String str = view.getText().toString(); + if (str != null && !TextUtils.isEmpty(str)) { + try { + return Integer.parseInt(str); + } catch (NumberFormatException e) { + Log.i(TAG, "Bad number: " + str, e); + } + } + return 0; + } + + public void updateDimens() { + Point minDims = new Point(); + Point maxDims = new Point(); + mWindowManager.getDefaultDisplay().getCurrentSizeRange(minDims, maxDims); + mWallpaperManager.suggestDesiredDimensions( + loadPropIntText(mDimenWidthView, maxDims.x), + loadPropIntText(mDimenHeightView, maxDims.y)); + } + + public void updateWallOff() { + IBinder token = getWindow().getDecorView().getWindowToken(); + if (token != null) { + mWallpaperManager.setWallpaperOffsets(token, loadFloatText(mWallOffXView), + loadFloatText(mWallOffYView)); + } + } + + public void updatePadding() { + Rect padding = new Rect(); + padding.left = loadIntText(mPaddingLeftView); + padding.top = loadIntText(mPaddingTopView); + padding.right = loadIntText(mPaddingRightView); + padding.bottom = loadIntText(mPaddingBottomView); + mWallpaperManager.setDisplayPadding(padding); + } + + public void updateDispOff() { + IBinder token = getWindow().getDecorView().getWindowToken(); + if (token != null) { + mWallpaperManager.setDisplayOffset(token, loadIntText(mDispOffXView), + loadIntText(mDispOffYView)); + } + } + + final TextWatcher mTextWatcher = new TextWatcher() { + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + updateDimens(); + updateWallOff(); + updatePadding(); + updateDispOff(); + } + + @Override public void afterTextChanged(Editable s) { + } + }; +} diff --git a/tests/WallpaperTest/src/com/example/wallpapertest/TestWallpaper.java b/tests/WallpaperTest/src/com/example/wallpapertest/TestWallpaper.java new file mode 100644 index 0000000..95db6d1 --- /dev/null +++ b/tests/WallpaperTest/src/com/example/wallpapertest/TestWallpaper.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2014 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.example.wallpapertest; + +import android.service.wallpaper.WallpaperService; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.Paint; +import android.graphics.Color; +import android.graphics.RectF; +import android.text.TextPaint; +import android.view.SurfaceHolder; +import android.content.res.XmlResourceParser; + +import android.os.Handler; +import android.util.Log; + +import android.view.WindowInsets; + +public class TestWallpaper extends WallpaperService { + private static final String LOG_TAG = "PolarClock"; + + private final Handler mHandler = new Handler(); + + @Override + public void onCreate() { + super.onCreate(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + public Engine onCreateEngine() { + return new ClockEngine(); + } + + class ClockEngine extends Engine { + private static final int OUTER_COLOR = 0xffff0000; + private static final int INNER_COLOR = 0xff000080; + private static final int STABLE_COLOR = 0xa000ff00; + private static final int TEXT_COLOR = 0xa0ffffff; + + private final Paint.FontMetrics mTextMetrics = new Paint.FontMetrics(); + + private int mPadding; + + private final Rect mMainInsets = new Rect(); + private final Rect mStableInsets = new Rect(); + private boolean mRound = false; + + private int mDesiredWidth; + private int mDesiredHeight; + + private float mOffsetX; + private float mOffsetY; + private float mOffsetXStep; + private float mOffsetYStep; + private int mOffsetXPixels; + private int mOffsetYPixels; + + private final Paint mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + + private final Runnable mDrawClock = new Runnable() { + public void run() { + drawFrame(); + } + }; + private boolean mVisible; + + ClockEngine() { + } + + @Override + public void onCreate(SurfaceHolder surfaceHolder) { + super.onCreate(surfaceHolder); + + mDesiredWidth = getDesiredMinimumWidth(); + mDesiredHeight = getDesiredMinimumHeight(); + + Paint paint = mFillPaint; + paint.setStyle(Paint.Style.FILL); + + paint = mStrokePaint; + paint.setStrokeWidth(3); + paint.setStrokeCap(Paint.Cap.ROUND); + paint.setStyle(Paint.Style.STROKE); + + TextPaint tpaint = mTextPaint; + tpaint.density = getResources().getDisplayMetrics().density; + tpaint.setCompatibilityScaling(getResources().getCompatibilityInfo().applicationScale); + tpaint.setColor(TEXT_COLOR); + tpaint.setTextSize(18 * getResources().getDisplayMetrics().scaledDensity); + tpaint.setShadowLayer(4 * getResources().getDisplayMetrics().density, 0, 0, 0xff000000); + + mTextPaint.getFontMetrics(mTextMetrics); + + mPadding = (int)(16 * getResources().getDisplayMetrics().density); + + if (isPreview()) { + mOffsetX = 0.5f; + mOffsetY = 0.5f; + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + mHandler.removeCallbacks(mDrawClock); + } + + @Override + public void onVisibilityChanged(boolean visible) { + mVisible = visible; + if (!visible) { + mHandler.removeCallbacks(mDrawClock); + } + drawFrame(); + } + + @Override + public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { + super.onSurfaceChanged(holder, format, width, height); + drawFrame(); + } + + @Override + public void onSurfaceCreated(SurfaceHolder holder) { + super.onSurfaceCreated(holder); + } + + @Override + public void onSurfaceDestroyed(SurfaceHolder holder) { + super.onSurfaceDestroyed(holder); + mVisible = false; + mHandler.removeCallbacks(mDrawClock); + } + + @Override + public void onApplyWindowInsets(WindowInsets insets) { + super.onApplyWindowInsets(insets); + mMainInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()); + mStableInsets.set(insets.getStableInsetLeft(), insets.getStableInsetTop(), + insets.getStableInsetRight(), insets.getStableInsetBottom()); + mRound = insets.isRound(); + drawFrame(); + } + + @Override + public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) { + super.onDesiredSizeChanged(desiredWidth, desiredHeight); + mDesiredWidth = desiredWidth; + mDesiredHeight = desiredHeight; + drawFrame(); + } + + @Override + public void onOffsetsChanged(float xOffset, float yOffset, + float xStep, float yStep, int xPixels, int yPixels) { + super.onOffsetsChanged(xOffset, yOffset, xStep, yStep, xPixels, yPixels); + + if (isPreview()) return; + + mOffsetX = xOffset; + mOffsetY = yOffset; + mOffsetXStep = xStep; + mOffsetYStep = yStep; + mOffsetXPixels = xPixels; + mOffsetYPixels = yPixels; + + drawFrame(); + } + + void drawFrame() { + final SurfaceHolder holder = getSurfaceHolder(); + final Rect frame = holder.getSurfaceFrame(); + final int width = frame.width(); + final int height = frame.height(); + + Canvas c = null; + try { + c = holder.lockCanvas(); + if (c != null) { + final Paint paint = mFillPaint; + + paint.setColor(OUTER_COLOR); + c.drawRect(0, 0, width, height, paint); + + paint.setColor(INNER_COLOR); + c.drawRect(0+mMainInsets.left, 0+mMainInsets.top, + width-mMainInsets.right, height-mMainInsets.bottom, paint); + + mStrokePaint.setColor(STABLE_COLOR); + c.drawRect(0 + mStableInsets.left, 0 + mStableInsets.top, + width - mStableInsets.right, height - mStableInsets.bottom, + mStrokePaint); + + final int ascdesc = (int)(-mTextMetrics.ascent + mTextMetrics.descent); + final int linegap = (int)(-mTextMetrics.ascent + mTextMetrics.descent + + mTextMetrics.leading); + + int x = mStableInsets.left + mPadding; + int y = height - mStableInsets.bottom - mPadding - ascdesc; + c.drawText("Surface Size: " + width + " x " + height, + x, y, mTextPaint); + y -= linegap; + c.drawText("Desired Size: " + mDesiredWidth + " x " + mDesiredHeight, + x, y, mTextPaint); + y -= linegap; + c.drawText("Cur Offset Raw: " + mOffsetX + ", " + mOffsetY, + x, y, mTextPaint); + y -= linegap; + c.drawText("Cur Offset Step: " + mOffsetXStep + ", " + mOffsetYStep, + x, y, mTextPaint); + y -= linegap; + c.drawText("Cur Offset Pixels: " + mOffsetXPixels + ", " + mOffsetYPixels, + x, y, mTextPaint); + y -= linegap; + c.drawText("Stable Insets: (" + mStableInsets.left + ", " + mStableInsets.top + + ") - (" + mStableInsets.right + ", " + mStableInsets.bottom + ")", + x, y, mTextPaint); + y -= linegap; + c.drawText("System Insets: (" + mMainInsets.left + ", " + mMainInsets.top + + ") - (" + mMainInsets.right + ", " + mMainInsets.bottom + ")", + x, y, mTextPaint); + + } + } finally { + if (c != null) holder.unlockCanvasAndPost(c); + } + } + } +} |