diff options
author | Chris Banes <chrisbanes@google.com> | 2013-01-29 12:49:34 +0100 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-03-26 17:48:29 +0000 |
commit | a73db203f6dd55d96d4953eaaf41bd3665a63be3 (patch) | |
tree | 25971335ebe8588e055e3228cd1ef93aee485897 /templates/other | |
parent | 5e7f9a1c01c04e882090fdc57fa2966915523844 (diff) | |
download | sdk-a73db203f6dd55d96d4953eaaf41bd3665a63be3.zip sdk-a73db203f6dd55d96d4953eaaf41bd3665a63be3.tar.gz sdk-a73db203f6dd55d96d4953eaaf41bd3665a63be3.tar.bz2 |
New "Daydream" ADT template.
This change adds a new Daydream template in the 'other'
category, that creates an example DreamService class. The
template gives the option of generating a Settings Activity,
and options specific to DreamService.
Change-Id: Ic50b175610bf67cb482a48e25fed0455dd7c7901
Signed-off-by: Chris Banes <chrisbanes@google.com>
Diffstat (limited to 'templates/other')
10 files changed, 319 insertions, 0 deletions
diff --git a/templates/other/Daydream/globals.xml.ftl b/templates/other/Daydream/globals.xml.ftl new file mode 100644 index 0000000..04537f9 --- /dev/null +++ b/templates/other/Daydream/globals.xml.ftl @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<globals> + <global id="srcOut" value="src/${slashedPackageName(packageName)}" /> + <global id="class_name" value="${classToResource(className)}" /> + <global id="info_name" value="${classToResource(className)}_info" /> + <global id="settingsClassName" value="${className}SettingsActivity" /> + <global id="prefs_name" value="${classToResource(className)}_prefs" /> +</globals> diff --git a/templates/other/Daydream/recipe.xml.ftl b/templates/other/Daydream/recipe.xml.ftl new file mode 100644 index 0000000..8db9811 --- /dev/null +++ b/templates/other/Daydream/recipe.xml.ftl @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<recipe> + + <merge from="AndroidManifest.xml.ftl" /> + <merge from="res/values/strings.xml.ftl" /> + + <copy from="res/layout-v17/dream.xml" + to="res/layout-v17/${class_name}.xml" /> + + <instantiate from="src/app_package/DreamService.java.ftl" + to="${srcOut}/${className}.java" /> + +<#if configurable> + <copy from="res/xml/dream_prefs.xml" + to="res/xml/${prefs_name}.xml" /> + + <instantiate from="src/app_package/SettingsActivity.java.ftl" + to="${srcOut}/${settingsClassName}.java" /> + + <instantiate from="res/xml/xml_dream.xml.ftl" + to="res/xml/${info_name}.xml" /> +</#if> + + <open file="${srcOut}/${className}.java" /> + +</recipe> diff --git a/templates/other/Daydream/root/AndroidManifest.xml.ftl b/templates/other/Daydream/root/AndroidManifest.xml.ftl new file mode 100644 index 0000000..c23bc6e --- /dev/null +++ b/templates/other/Daydream/root/AndroidManifest.xml.ftl @@ -0,0 +1,28 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + + <application> + +<#if configurable> + <activity + android:name=".${settingsClassName}" /> +</#if> + + <!-- This service is only used on devices with API v17+ --> + <service + android:name=".${className}" + android:exported="true" > + <intent-filter> + <action android:name="android.service.dreams.DreamService" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> +<#if configurable> + + <!-- Point to additional information for this dream --> + <meta-data + android:name="android.service.dream" + android:resource="@xml/${info_name}" /> +</#if> + </service> + </application> + +</manifest> diff --git a/templates/other/Daydream/root/res/layout-v17/dream.xml b/templates/other/Daydream/root/res/layout-v17/dream.xml new file mode 100644 index 0000000..25593f3 --- /dev/null +++ b/templates/other/Daydream/root/res/layout-v17/dream.xml @@ -0,0 +1,13 @@ +<?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" > + + <TextView + android:id="@+id/dream_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:fontFamily="sans-serif-light" + android:textSize="50sp" /> + +</FrameLayout> diff --git a/templates/other/Daydream/root/res/values/strings.xml.ftl b/templates/other/Daydream/root/res/values/strings.xml.ftl new file mode 100644 index 0000000..b3d208f --- /dev/null +++ b/templates/other/Daydream/root/res/values/strings.xml.ftl @@ -0,0 +1,7 @@ +<resources> + <string name="pref_dream_text_key">pref_dream_text</string> + <string name="pref_dream_text_default">zzzZZZzzz</string> +<#if configurable> + <string name="pref_dream_text_title">Ticker text</string> +</#if> +</resources> diff --git a/templates/other/Daydream/root/res/xml/dream_prefs.xml b/templates/other/Daydream/root/res/xml/dream_prefs.xml new file mode 100644 index 0000000..997e5b2 --- /dev/null +++ b/templates/other/Daydream/root/res/xml/dream_prefs.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > + + <EditTextPreference + android:key="@string/pref_dream_text_key" + android:title="@string/pref_dream_text_title" + android:defaultValue="@string/pref_dream_text_default" /> + +</PreferenceScreen> diff --git a/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl b/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl new file mode 100644 index 0000000..5367ae1 --- /dev/null +++ b/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="utf-8"?> +<dream xmlns:android="http://schemas.android.com/apk/res/android" + android:settingsActivity="${packageName}/.${settingsClassName}" /> diff --git a/templates/other/Daydream/root/src/app_package/DreamService.java.ftl b/templates/other/Daydream/root/src/app_package/DreamService.java.ftl new file mode 100644 index 0000000..30f080f --- /dev/null +++ b/templates/other/Daydream/root/src/app_package/DreamService.java.ftl @@ -0,0 +1,140 @@ +package ${packageName}; + +import java.util.Random; + +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; +import android.annotation.TargetApi; +import android.content.SharedPreferences; +import android.graphics.Point; +import android.os.Build; +import android.preference.PreferenceManager; +import android.service.dreams.DreamService; +import android.view.ViewPropertyAnimator; +import android.view.animation.LinearInterpolator; +import android.widget.TextView; + +/** + * This class is a sample implementation of a DreamService. When activated, a + * TextView will repeatedly, move from the left to the right of screen, at a + * random y-value. +<#if configurable> + * The generated {@link BlahDreamServiceSettingsActivity} allows + * the user to change the text which is displayed. +</#if> + * <p /> + * Daydreams are only available on devices running API v17+. + */ +@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) +public class ${className} extends DreamService { + + private static final TimeInterpolator sInterpolator = new LinearInterpolator(); + + private final AnimatorListener mAnimListener = new AnimatorListenerAdapter() { + + @Override + public void onAnimationEnd(Animator animation) { + // Start animation again + startTextViewScrollAnimation(); + } + + }; + + private final Random mRandom = new Random(); + private final Point mPointSize = new Point(); + + private TextView mDreamTextView; + private ViewPropertyAnimator mAnimator; + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + + // Exit dream upon user touch? +<#if isInteractive> + setInteractive(true); +<#else> + setInteractive(false); +</#if> + + // Hide system UI? +<#if isFullscreen> + setFullscreen(true); +<#else> + setFullscreen(false); +</#if> + + // Keep screen at full brightness? +<#if isScreenBright> + setScreenBright(true); +<#else> + setScreenBright(false); +</#if> + + // Set the content view, just like you would with an Activity. + setContentView(R.layout.${class_name}); + + mDreamTextView = (TextView) findViewById(R.id.dream_text); + mDreamTextView.setText(getTextFromPreferences()); + } + + @Override + public void onDreamingStarted() { + super.onDreamingStarted(); + + // TODO: Begin animations or other behaviors here. + + startTextViewScrollAnimation(); + } + + @Override + public void onDreamingStopped() { + super.onDreamingStopped(); + + // TODO: Stop anything that was started in onDreamingStarted() + + mAnimator.cancel(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + // TODO: Dismantle resources + // (for example, detach from handlers and listeners). + } + + private String getTextFromPreferences() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + return prefs.getString(getString(R.string.pref_dream_text_key), + getString(R.string.pref_dream_text_default)); + } + + private void startTextViewScrollAnimation() { + // Refresh Size of Window + getWindowManager().getDefaultDisplay().getSize(mPointSize); + + final int windowWidth = mPointSize.x; + final int windowHeight = mPointSize.y; + + // Move TextView so it's moved all the way to the left + mDreamTextView.setTranslationX(-mDreamTextView.getWidth()); + + // Move TextView to random y value + final int yRange = windowHeight - mDreamTextView.getHeight(); + mDreamTextView.setTranslationY(mRandom.nextInt(yRange)); + + // Create an Animator and keep a reference to it + mAnimator = mDreamTextView.animate().translationX(windowWidth) + .setDuration(3000) + .setStartDelay(500) + .setListener(mAnimListener) + .setInterpolator(sInterpolator); + + // Start the animation + mAnimator.start(); + } + +} diff --git a/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl b/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl new file mode 100644 index 0000000..62d5887 --- /dev/null +++ b/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl @@ -0,0 +1,36 @@ +package ${packageName}; + +import android.annotation.TargetApi; +import android.os.Build; +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; + +/** + * A settings Activity for {@link ${className}}. + * <p /> + * A DreamService can only be used on devices with API v17+, so it is safe + * for us to use a {@link PreferenceFragment} here. + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class ${settingsClassName} extends PreferenceActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getFragmentManager().beginTransaction() + .replace(android.R.id.content, new DreamPreferenceFragment()).commit(); + } + + public static class DreamPreferenceFragment extends PreferenceFragment { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.${prefs_name}); + } + + } + +} diff --git a/templates/other/Daydream/template.xml b/templates/other/Daydream/template.xml new file mode 100644 index 0000000..2014eee --- /dev/null +++ b/templates/other/Daydream/template.xml @@ -0,0 +1,49 @@ +<?xml version="1.0"?> +<template + format="3" + revision="1" + name="New Daydream" + description="Creates a new Daydream service component, for use on devices running Android 4.2 and later." + minBuildApi="17"> + + <category value="Other" /> + + <parameter + id="className" + name="Class Name" + type="string" + constraints="class|unique|nonempty" + default="MyDaydreamService" /> + + <parameter + id="isInteractive" + name="Interactive?" + type="boolean" + default="false" + help="Whether or not the Daydream is interactive. Touching anywhere on a non-interactive Daydreams dismisses it." /> + + <parameter + id="isFullscreen" + name="Fullscreen?" + type="boolean" + default="true" + help="Whether or not the Daydream should be in fullscreen mode (in which case system UI will be hidden)." /> + + <parameter + id="isScreenBright" + name="Bright Screen?" + type="boolean" + default="true" + help="Whether or not the screen should be bright when this Daydream is running. The screen will be dim otherwise." /> + + <parameter + id="configurable" + name="Configuration Activity" + type="boolean" + default="false" + help="Whether or not to generate an associated settings Activity." /> + + <globals file="globals.xml.ftl" /> + <execute file="recipe.xml.ftl" /> + +</template> |