diff options
author | Jeremy Walker <jewalker@google.com> | 2019-03-31 13:22:01 -0700 |
---|---|---|
committer | Jeremy Walker <jewalker@google.com> | 2019-04-01 15:04:07 -0700 |
commit | 4e62d53063e4530d6d9bf3dfb0904e39ab57cb66 (patch) | |
tree | 1e91a61f265014d47f7ff4837becda40216e0903 /wearable/wear | |
parent | a78d8fa024b1416fa82349df4e9deac33a42bf19 (diff) | |
download | android-4e62d53063e4530d6d9bf3dfb0904e39ab57cb66.tar.gz |
Jumping Jack: Fixes broken sensor logic and updates Wear apps for migration to new devrel repo.
Bug: 129548613
Test: Manually tested.
Change-Id: If436341d731d449457bb33d5aebdaff845f0739f
Diffstat (limited to 'wearable/wear')
13 files changed, 103 insertions, 815 deletions
diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/activities/SampleActivityBase.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/activities/SampleActivityBase.java deleted file mode 100644 index 3228927b..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/activities/SampleActivityBase.java +++ /dev/null @@ -1,52 +0,0 @@ -/* -* 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. -*/ - -package com.example.android.common.activities; - -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; - -import com.example.android.common.logger.Log; -import com.example.android.common.logger.LogWrapper; - -/** - * Base launcher activity, to handle most of the common plumbing for samples. - */ -public class SampleActivityBase extends FragmentActivity { - - public static final String TAG = "SampleActivityBase"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - protected void onStart() { - super.onStart(); - initializeLogging(); - } - - /** Set up targets to receive log data */ - public void initializeLogging() { - // Using Log, front-end to the logging chain, emulates android.util.log method signatures. - // Wraps Android's native log framework - LogWrapper logWrapper = new LogWrapper(); - Log.setLogNode(logWrapper); - - Log.i(TAG, "Ready"); - } -} diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/Log.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/Log.java deleted file mode 100644 index 17503c56..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/Log.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 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. - */ -package com.example.android.common.logger; - -/** - * Helper class for a list (or tree) of LoggerNodes. - * - * <p>When this is set as the head of the list, - * an instance of it can function as a drop-in replacement for {@link android.util.Log}. - * Most of the methods in this class server only to map a method call in Log to its equivalent - * in LogNode.</p> - */ -public class Log { - // Grabbing the native values from Android's native logging facilities, - // to make for easy migration and interop. - public static final int NONE = -1; - public static final int VERBOSE = android.util.Log.VERBOSE; - public static final int DEBUG = android.util.Log.DEBUG; - public static final int INFO = android.util.Log.INFO; - public static final int WARN = android.util.Log.WARN; - public static final int ERROR = android.util.Log.ERROR; - public static final int ASSERT = android.util.Log.ASSERT; - - // Stores the beginning of the LogNode topology. - private static LogNode mLogNode; - - /** - * Returns the next LogNode in the linked list. - */ - public static LogNode getLogNode() { - return mLogNode; - } - - /** - * Sets the LogNode data will be sent to. - */ - public static void setLogNode(LogNode node) { - mLogNode = node; - } - - /** - * Instructs the LogNode to print the log data provided. Other LogNodes can - * be chained to the end of the LogNode as desired. - * - * @param priority Log level of the data being logged. Verbose, Error, etc. - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void println(int priority, String tag, String msg, Throwable tr) { - if (mLogNode != null) { - mLogNode.println(priority, tag, msg, tr); - } - } - - /** - * Instructs the LogNode to print the log data provided. Other LogNodes can - * be chained to the end of the LogNode as desired. - * - * @param priority Log level of the data being logged. Verbose, Error, etc. - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. The actual message to be logged. - */ - public static void println(int priority, String tag, String msg) { - println(priority, tag, msg, null); - } - - /** - * Prints a message at VERBOSE priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void v(String tag, String msg, Throwable tr) { - println(VERBOSE, tag, msg, tr); - } - - /** - * Prints a message at VERBOSE priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - */ - public static void v(String tag, String msg) { - v(tag, msg, null); - } - - - /** - * Prints a message at DEBUG priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void d(String tag, String msg, Throwable tr) { - println(DEBUG, tag, msg, tr); - } - - /** - * Prints a message at DEBUG priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - */ - public static void d(String tag, String msg) { - d(tag, msg, null); - } - - /** - * Prints a message at INFO priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void i(String tag, String msg, Throwable tr) { - println(INFO, tag, msg, tr); - } - - /** - * Prints a message at INFO priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - */ - public static void i(String tag, String msg) { - i(tag, msg, null); - } - - /** - * Prints a message at WARN priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void w(String tag, String msg, Throwable tr) { - println(WARN, tag, msg, tr); - } - - /** - * Prints a message at WARN priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - */ - public static void w(String tag, String msg) { - w(tag, msg, null); - } - - /** - * Prints a message at WARN priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void w(String tag, Throwable tr) { - w(tag, null, tr); - } - - /** - * Prints a message at ERROR priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void e(String tag, String msg, Throwable tr) { - println(ERROR, tag, msg, tr); - } - - /** - * Prints a message at ERROR priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - */ - public static void e(String tag, String msg) { - e(tag, msg, null); - } - - /** - * Prints a message at ASSERT priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void wtf(String tag, String msg, Throwable tr) { - println(ASSERT, tag, msg, tr); - } - - /** - * Prints a message at ASSERT priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. - */ - public static void wtf(String tag, String msg) { - wtf(tag, msg, null); - } - - /** - * Prints a message at ASSERT priority. - * - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public static void wtf(String tag, Throwable tr) { - wtf(tag, null, tr); - } -} diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogFragment.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogFragment.java deleted file mode 100644 index b302acd4..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogFragment.java +++ /dev/null @@ -1,109 +0,0 @@ -/* -* 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. -*/ -/* - * 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. - */ - -package com.example.android.common.logger; - -import android.graphics.Typeface; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ScrollView; - -/** - * Simple fraggment which contains a LogView and uses is to output log data it receives - * through the LogNode interface. - */ -public class LogFragment extends Fragment { - - private LogView mLogView; - private ScrollView mScrollView; - - public LogFragment() {} - - public View inflateViews() { - mScrollView = new ScrollView(getActivity()); - ViewGroup.LayoutParams scrollParams = new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT); - mScrollView.setLayoutParams(scrollParams); - - mLogView = new LogView(getActivity()); - ViewGroup.LayoutParams logParams = new ViewGroup.LayoutParams(scrollParams); - logParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; - mLogView.setLayoutParams(logParams); - mLogView.setClickable(true); - mLogView.setFocusable(true); - mLogView.setTypeface(Typeface.MONOSPACE); - - // Want to set padding as 16 dips, setPadding takes pixels. Hooray math! - int paddingDips = 16; - double scale = getResources().getDisplayMetrics().density; - int paddingPixels = (int) ((paddingDips * (scale)) + .5); - mLogView.setPadding(paddingPixels, paddingPixels, paddingPixels, paddingPixels); - mLogView.setCompoundDrawablePadding(paddingPixels); - - mLogView.setGravity(Gravity.BOTTOM); - mLogView.setTextAppearance(getActivity(), android.R.style.TextAppearance_Holo_Medium); - - mScrollView.addView(mLogView); - return mScrollView; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View result = inflateViews(); - - mLogView.addTextChangedListener(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) {} - - @Override - public void afterTextChanged(Editable s) { - mScrollView.fullScroll(ScrollView.FOCUS_DOWN); - } - }); - return result; - } - - public LogView getLogView() { - return mLogView; - } -}
\ No newline at end of file diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogNode.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogNode.java deleted file mode 100644 index bc37cabc..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogNode.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2012 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.android.common.logger; - -/** - * Basic interface for a logging system that can output to one or more targets. - * Note that in addition to classes that will output these logs in some format, - * one can also implement this interface over a filter and insert that in the chain, - * such that no targets further down see certain data, or see manipulated forms of the data. - * You could, for instance, write a "ToHtmlLoggerNode" that just converted all the log data - * it received to HTML and sent it along to the next node in the chain, without printing it - * anywhere. - */ -public interface LogNode { - - /** - * Instructs first LogNode in the list to print the log data provided. - * @param priority Log level of the data being logged. Verbose, Error, etc. - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - public void println(int priority, String tag, String msg, Throwable tr); - -} diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogView.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogView.java deleted file mode 100644 index c01542b9..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogView.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 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. - */ -package com.example.android.common.logger; - -import android.app.Activity; -import android.content.Context; -import android.util.*; -import android.widget.TextView; - -/** Simple TextView which is used to output log data received through the LogNode interface. -*/ -public class LogView extends TextView implements LogNode { - - public LogView(Context context) { - super(context); - } - - public LogView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public LogView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - /** - * Formats the log data and prints it out to the LogView. - * @param priority Log level of the data being logged. Verbose, Error, etc. - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - @Override - public void println(int priority, String tag, String msg, Throwable tr) { - - - String priorityStr = null; - - // For the purposes of this View, we want to print the priority as readable text. - switch(priority) { - case android.util.Log.VERBOSE: - priorityStr = "VERBOSE"; - break; - case android.util.Log.DEBUG: - priorityStr = "DEBUG"; - break; - case android.util.Log.INFO: - priorityStr = "INFO"; - break; - case android.util.Log.WARN: - priorityStr = "WARN"; - break; - case android.util.Log.ERROR: - priorityStr = "ERROR"; - break; - case android.util.Log.ASSERT: - priorityStr = "ASSERT"; - break; - default: - break; - } - - // Handily, the Log class has a facility for converting a stack trace into a usable string. - String exceptionStr = null; - if (tr != null) { - exceptionStr = android.util.Log.getStackTraceString(tr); - } - - // Take the priority, tag, message, and exception, and concatenate as necessary - // into one usable line of text. - final StringBuilder outputBuilder = new StringBuilder(); - - String delimiter = "\t"; - appendIfNotNull(outputBuilder, priorityStr, delimiter); - appendIfNotNull(outputBuilder, tag, delimiter); - appendIfNotNull(outputBuilder, msg, delimiter); - appendIfNotNull(outputBuilder, exceptionStr, delimiter); - - // In case this was originally called from an AsyncTask or some other off-UI thread, - // make sure the update occurs within the UI thread. - ((Activity) getContext()).runOnUiThread( (new Thread(new Runnable() { - @Override - public void run() { - // Display the text we just generated within the LogView. - appendToLog(outputBuilder.toString()); - } - }))); - - if (mNext != null) { - mNext.println(priority, tag, msg, tr); - } - } - - public LogNode getNext() { - return mNext; - } - - public void setNext(LogNode node) { - mNext = node; - } - - /** Takes a string and adds to it, with a separator, if the bit to be added isn't null. Since - * the logger takes so many arguments that might be null, this method helps cut out some of the - * agonizing tedium of writing the same 3 lines over and over. - * @param source StringBuilder containing the text to append to. - * @param addStr The String to append - * @param delimiter The String to separate the source and appended strings. A tab or comma, - * for instance. - * @return The fully concatenated String as a StringBuilder - */ - private StringBuilder appendIfNotNull(StringBuilder source, String addStr, String delimiter) { - if (addStr != null) { - if (addStr.length() == 0) { - delimiter = ""; - } - - return source.append(addStr).append(delimiter); - } - return source; - } - - // The next LogNode in the chain. - LogNode mNext; - - /** Outputs the string as a new line of log data in the LogView. */ - public void appendToLog(String s) { - append("\n" + s); - } - - -} diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogWrapper.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogWrapper.java deleted file mode 100644 index 16a9e7ba..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/LogWrapper.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2012 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.android.common.logger; - -import android.util.Log; - -/** - * Helper class which wraps Android's native Log utility in the Logger interface. This way - * normal DDMS output can be one of the many targets receiving and outputting logs simultaneously. - */ -public class LogWrapper implements LogNode { - - // For piping: The next node to receive Log data after this one has done its work. - private LogNode mNext; - - /** - * Returns the next LogNode in the linked list. - */ - public LogNode getNext() { - return mNext; - } - - /** - * Sets the LogNode data will be sent to.. - */ - public void setNext(LogNode node) { - mNext = node; - } - - /** - * Prints data out to the console using Android's native log mechanism. - * @param priority Log level of the data being logged. Verbose, Error, etc. - * @param tag Tag for for the log data. Can be used to organize log statements. - * @param msg The actual message to be logged. The actual message to be logged. - * @param tr If an exception was thrown, this can be sent along for the logging facilities - * to extract and print useful information. - */ - @Override - public void println(int priority, String tag, String msg, Throwable tr) { - // There actually are log methods that don't take a msg parameter. For now, - // if that's the case, just convert null to the empty string and move on. - String useMsg = msg; - if (useMsg == null) { - useMsg = ""; - } - - // If an exeption was provided, convert that exception to a usable string and attach - // it to the end of the msg method. - if (tr != null) { - msg += "\n" + Log.getStackTraceString(tr); - } - - // This is functionally identical to Log.x(tag, useMsg); - // For instance, if priority were Log.VERBOSE, this would be the same as Log.v(tag, useMsg) - Log.println(priority, tag, useMsg); - - // If this isn't the last node in the chain, move things along. - if (mNext != null) { - mNext.println(priority, tag, msg, tr); - } - } -} diff --git a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/MessageOnlyLogFilter.java b/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/MessageOnlyLogFilter.java deleted file mode 100644 index 19967dcd..00000000 --- a/wearable/wear/JumpingJack/Application/src/common/java/com/example/android/common/logger/MessageOnlyLogFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 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. - */ -package com.example.android.common.logger; - -/** - * Simple {@link LogNode} filter, removes everything except the message. - * Useful for situations like on-screen log output where you don't want a lot of metadata displayed, - * just easy-to-read message updates as they're happening. - */ -public class MessageOnlyLogFilter implements LogNode { - - LogNode mNext; - - /** - * Takes the "next" LogNode as a parameter, to simplify chaining. - * - * @param next The next LogNode in the pipeline. - */ - public MessageOnlyLogFilter(LogNode next) { - mNext = next; - } - - public MessageOnlyLogFilter() { - } - - @Override - public void println(int priority, String tag, String msg, Throwable tr) { - if (mNext != null) { - getNext().println(Log.NONE, null, msg, null); - } - } - - /** - * Returns the next LogNode in the chain. - */ - public LogNode getNext() { - return mNext; - } - - /** - * Sets the LogNode data will be sent to.. - */ - public void setNext(LogNode node) { - mNext = node; - } - -} diff --git a/wearable/wear/JumpingJack/Wearable/src/main/AndroidManifest.xml b/wearable/wear/JumpingJack/Wearable/src/main/AndroidManifest.xml index 0e0475a2..eff177c8 100644 --- a/wearable/wear/JumpingJack/Wearable/src/main/AndroidManifest.xml +++ b/wearable/wear/JumpingJack/Wearable/src/main/AndroidManifest.xml @@ -17,13 +17,12 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.wearable.jumpingjack"> - <uses-sdk android:minSdkVersion="20" - android:targetSdkVersion="25" /> - <uses-feature android:name="android.hardware.type.watch" /> <uses-permission android:name="android.permission.VIBRATE"/> + <uses-permission android:name="android.permission.WAKE_LOCK" /> + <application android:allowBackup="true" android:icon="@drawable/ic_launcher" diff --git a/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/MainActivity.java b/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/MainActivity.java index 8618a9d6..f344cfee 100644 --- a/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/MainActivity.java +++ b/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/MainActivity.java @@ -16,79 +16,78 @@ package com.example.android.wearable.jumpingjack; -import com.example.android.wearable.jumpingjack.fragments.CounterFragment; -import com.example.android.wearable.jumpingjack.fragments.SettingsFragment; - -import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; -import android.os.Handler; -import android.support.v4.view.ViewPager; import android.util.Log; -import android.view.WindowManager; import android.widget.ImageView; -import java.util.Timer; -import java.util.TimerTask; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager.widget.ViewPager; +import androidx.wear.ambient.AmbientModeSupport; + +import com.example.android.wearable.jumpingjack.fragments.CounterFragment; +import com.example.android.wearable.jumpingjack.fragments.SettingsFragment; + +import java.util.concurrent.TimeUnit; /** * The main activity for the Jumping Jack application. This activity registers itself to receive - * sensor values. Since on wearable devices a full screen activity is very short-lived, we set the - * FLAG_KEEP_SCREEN_ON to give user adequate time for taking actions but since we don't want to - * keep screen on for an extended period of time, there is a SCREEN_ON_TIMEOUT_MS that is enforced - * if no interaction is discovered. + * sensor values. * - * This activity includes a {@link android.support.v4.view.ViewPager} with two pages, one that + * This activity includes a {@link ViewPager} with two pages, one that * shows the current count and one that allows user to reset the counter. the current value of the * counter is persisted so that upon re-launch, the counter picks up from the last value. At any * stage, user can set this counter to 0. */ -public class MainActivity extends Activity - implements SensorEventListener { +public class MainActivity extends FragmentActivity + implements AmbientModeSupport.AmbientCallbackProvider, SensorEventListener { private static final String TAG = "MainActivity"; - /** How long to keep the screen on when no activity is happening **/ - private static final long SCREEN_ON_TIMEOUT_MS = 20000; // in milliseconds - - /** an up-down movement that takes more than this will not be registered as such **/ - private static final long TIME_THRESHOLD_NS = 2000000000; // in nanoseconds (= 2sec) + // An up-down movement that takes more than 2 seconds will not be registered (in nanoseconds). + private static final long TIME_THRESHOLD_NS = TimeUnit.SECONDS.toNanos(2); /** * Earth gravity is around 9.8 m/s^2 but user may not completely direct his/her hand vertical - * during the exercise so we leave some room. Basically if the x-component of gravity, as - * measured by the Gravity sensor, changes with a variation (delta) > GRAVITY_THRESHOLD, - * we consider that a successful count. + * during the exercise so we leave some room. Basically, if the x-component of gravity, as + * measured by the Gravity sensor, changes with a variation delta > 0.03 from the hand down + * and hand up threshold we define below, we consider that a successful count. + * + * This is a very rudimentary formula and is by no means production accurate. You will want to + * take into account Y and Z gravity changes to get a truly accurate jumping jack. + * + * This sample is just meant to show how to easily get sensor values and use them. */ - private static final float GRAVITY_THRESHOLD = 7.0f; + private static final float HAND_DOWN_GRAVITY_X_THRESHOLD = -.040f; + private static final float HAND_UP_GRAVITY_X_THRESHOLD = -.010f; private SensorManager mSensorManager; private Sensor mSensor; private long mLastTime = 0; - private boolean mUp = false; private int mJumpCounter = 0; + private boolean mHandDown = true; + + private ViewPager mPager; private CounterFragment mCounterPage; private SettingsFragment mSettingPage; private ImageView mSecondIndicator; private ImageView mFirstIndicator; - private Timer mTimer; - private TimerTask mTimerTask; - private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.jj_layout); + setContentView(R.layout.jumping_jack_layout); + + AmbientModeSupport.attach(this); + setupViews(); - mHandler = new Handler(); + mJumpCounter = Utils.getCounterFromPreference(this); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - renewTimer(); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); } @@ -97,9 +96,12 @@ public class MainActivity extends Activity mPager = findViewById(R.id.pager); mFirstIndicator = findViewById(R.id.indicator_0); mSecondIndicator = findViewById(R.id.indicator_1); + final PagerAdapter adapter = new PagerAdapter(getFragmentManager()); + mCounterPage = new CounterFragment(); mSettingPage = new SettingsFragment(); + adapter.addFragment(mCounterPage); adapter.addFragment(mSettingPage); setIndicator(0); @@ -111,7 +113,6 @@ public class MainActivity extends Activity @Override public void onPageSelected(int i) { setIndicator(i); - renewTimer(); } @Override @@ -149,23 +150,29 @@ public class MainActivity extends Activity @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { + // No op. } /** - * A simple algorithm to detect a successful up-down movement of hand(s). The algorithm is - * based on the assumption that when a person is wearing the watch, the x-component of gravity - * as measured by the Gravity Sensor is +9.8 when the hand is downward and -9.8 when the hand - * is upward (signs are reversed if the watch is worn on the right hand). Since the upward or - * downward may not be completely accurate, we leave some room and instead of 9.8, we use - * GRAVITY_THRESHOLD. We also consider the up <-> down movement successful if it takes less than - * TIME_THRESHOLD_NS. + * A very simple algorithm to detect a successful up-down movement of hand(s). The algorithm + * is based on a delta of the handing being up vs. down and taking less than TIME_THRESHOLD_NS + * to happen. + * + * + * This algorithm isn't intended to be used in production but just to show what's possible with + * sensors. You will want to take into account other components (y and z) and other sensors to + * get a more accurate reading. */ - private void detectJump(float xValue, long timestamp) { - if ((Math.abs(xValue) > GRAVITY_THRESHOLD)) { - if(timestamp - mLastTime < TIME_THRESHOLD_NS && mUp != (xValue > 0)) { - onJumpDetected(!mUp); + private void detectJump(float xGravity, long timestamp) { + + if ((xGravity <= HAND_DOWN_GRAVITY_X_THRESHOLD) + || (xGravity >= HAND_UP_GRAVITY_X_THRESHOLD)) { + + if (timestamp - mLastTime < TIME_THRESHOLD_NS) { + // Hand is down when yValue is negative. + onJumpDetected(xGravity <= HAND_DOWN_GRAVITY_X_THRESHOLD); } - mUp = xValue > 0; + mLastTime = timestamp; } } @@ -173,14 +180,16 @@ public class MainActivity extends Activity /** * Called on detection of a successful down -> up or up -> down movement of hand. */ - private void onJumpDetected(boolean up) { - // we only count a pair of up and down as one successful movement - if (up) { - return; + private void onJumpDetected(boolean handDown) { + if (mHandDown != handDown) { + mHandDown = handDown; + + // Only count when the hand is down (means the hand has gone up, then down). + if (mHandDown) { + mJumpCounter++; + setCounter(mJumpCounter); + } } - mJumpCounter++; - setCounter(mJumpCounter); - renewTimer(); } /** @@ -188,6 +197,7 @@ public class MainActivity extends Activity * reaches a multiple of 10. */ private void setCounter(int i) { + mJumpCounter = i; mCounterPage.setCounter(i); Utils.saveCounterToPreference(this, i); if (i > 0 && i % 10 == 0) { @@ -197,44 +207,6 @@ public class MainActivity extends Activity public void resetCounter() { setCounter(0); - renewTimer(); - } - - /** - * Starts a timer to clear the flag FLAG_KEEP_SCREEN_ON. - */ - private void renewTimer() { - if (null != mTimer) { - mTimer.cancel(); - } - mTimerTask = new TimerTask() { - @Override - public void run() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, - "Removing the FLAG_KEEP_SCREEN_ON flag to allow going to background"); - } - resetFlag(); - } - }; - mTimer = new Timer(); - mTimer.schedule(mTimerTask, SCREEN_ON_TIMEOUT_MS); - } - - /** - * Resets the FLAG_KEEP_SCREEN_ON flag so activity can go into background. - */ - private void resetFlag() { - mHandler.post(new Runnable() { - @Override - public void run() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Resetting FLAG_KEEP_SCREEN_ON flag to allow going to background"); - } - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - finish(); - } - }); } /** @@ -254,4 +226,35 @@ public class MainActivity extends Activity } + @Override + public AmbientModeSupport.AmbientCallback getAmbientCallback() { + return new MyAmbientCallback(); + } + + /** Customizes appearance for Ambient mode. (We don't do anything minus default.) */ + private class MyAmbientCallback extends AmbientModeSupport.AmbientCallback { + /** Prepares the UI for ambient mode. */ + @Override + public void onEnterAmbient(Bundle ambientDetails) { + super.onEnterAmbient(ambientDetails); + } + + /** + * Updates the display in ambient mode on the standard interval. Since we're using a custom + * refresh cycle, this method does NOT update the data in the display. Rather, this method + * simply updates the positioning of the data in the screen to avoid burn-in, if the display + * requires it. + */ + @Override + public void onUpdateAmbient() { + super.onUpdateAmbient(); + } + + /** Restores the UI to active (non-ambient) mode. */ + @Override + public void onExitAmbient() { + super.onExitAmbient(); + } + } + } diff --git a/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/PagerAdapter.java b/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/PagerAdapter.java index f7ac2b01..d4532e71 100644 --- a/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/PagerAdapter.java +++ b/wearable/wear/JumpingJack/Wearable/src/main/java/com/example/android/wearable/jumpingjack/PagerAdapter.java @@ -18,13 +18,15 @@ package com.example.android.wearable.jumpingjack; import android.app.Fragment; import android.app.FragmentManager; -import android.support.v13.app.FragmentPagerAdapter; + +import androidx.legacy.app.FragmentPagerAdapter; +import androidx.viewpager.widget.ViewPager; import java.util.ArrayList; import java.util.List; /** - * A simple adapter for the {@link android.support.v4.view.ViewPager} + * A simple adapter for the {@link ViewPager} */ public class PagerAdapter extends FragmentPagerAdapter { diff --git a/wearable/wear/JumpingJack/Wearable/src/main/res/layout/jj_layout.xml b/wearable/wear/JumpingJack/Wearable/src/main/res/layout/jumping_jack_layout.xml index 73af6e31..0d0a67b8 100644 --- a/wearable/wear/JumpingJack/Wearable/src/main/res/layout/jj_layout.xml +++ b/wearable/wear/JumpingJack/Wearable/src/main/res/layout/jumping_jack_layout.xml @@ -19,7 +19,7 @@ android:layout_height="match_parent" android:background="@color/white"> - <android.support.v4.view.ViewPager + <androidx.viewpager.widget.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" diff --git a/wearable/wear/JumpingJack/gradle.properties b/wearable/wear/JumpingJack/gradle.properties new file mode 100644 index 00000000..5465fec0 --- /dev/null +++ b/wearable/wear/JumpingJack/gradle.properties @@ -0,0 +1,2 @@ +android.enableJetifier=true +android.useAndroidX=true
\ No newline at end of file diff --git a/wearable/wear/JumpingJack/template-params.xml b/wearable/wear/JumpingJack/template-params.xml index d746b2c1..9d802f6a 100644 --- a/wearable/wear/JumpingJack/template-params.xml +++ b/wearable/wear/JumpingJack/template-params.xml @@ -34,8 +34,6 @@ <template src="base-build"/> <template src="Wear"/> - <common src="logger"/> - <common src="activities"/> <metadata> <status>PUBLISHED</status> |