diff options
author | Jeremy Walker <jewalker@google.com> | 2019-03-31 15:55:18 -0700 |
---|---|---|
committer | Jeremy Walker <jewalker@google.com> | 2019-04-01 15:12:21 -0700 |
commit | 5d76fedbfa7a022a62783e86e8c9192d54c7dd3b (patch) | |
tree | 758d17dc8f2d435a2b9738a303aad15d3b5bca44 /wearable | |
parent | 38c7da1220c60cf7c6ee02df914aabb2668667a2 (diff) | |
download | android-5d76fedbfa7a022a62783e86e8c9192d54c7dd3b.tar.gz |
WearAccessibilityApp - Updates to latest libraries and MessagingStyles.
Bug: 129548613
Test: Manually tested.
Change-Id: Ic1c4931459407be7fb2b9e7917d57a0a9f3a7089
Diffstat (limited to 'wearable')
39 files changed, 488 insertions, 246 deletions
diff --git a/wearable/wear/WearAccessibilityApp/Wearable/build.gradle b/wearable/wear/WearAccessibilityApp/Wearable/build.gradle index e5ee2ffa..c8e23bb8 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/build.gradle +++ b/wearable/wear/WearAccessibilityApp/Wearable/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:3.3.2' } } @@ -21,17 +21,19 @@ repositories { dependencies { - implementation 'com.android.support:wear:27.1.0' - implementation 'com.android.support.constraint:constraint-layout:1.0.2' - implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'androidx.wear:wear:1.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.legacy:legacy-support-v13:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'com.google.android.gms:play-services-wearable:15.0.1' - implementation 'com.android.support:support-v13:27.1.1' + implementation 'com.google.android.gms:play-services-wearable:16.0.1' - compileOnly 'com.google.android.wearable:wearable:2.3.0' - implementation 'com.google.android.support:wearable:2.3.0' + compileOnly 'com.google.android.wearable:wearable:2.4.0' + + implementation 'com.google.android.support:wearable:2.4.0' } @@ -45,9 +47,9 @@ List<String> dirs = [ android { - compileSdkVersion 26 + compileSdkVersion 28 - buildToolsVersion "27.0.3" + buildToolsVersion "28.0.3" defaultConfig { versionCode 1 @@ -55,7 +57,7 @@ android { minSdkVersion 24 - targetSdkVersion 26 + targetSdkVersion 28 multiDexEnabled true diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/AndroidManifest.xml b/wearable/wear/WearAccessibilityApp/Wearable/src/main/AndroidManifest.xml index 3c7fcaf1..6e936d6f 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/AndroidManifest.xml +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/AndroidManifest.xml @@ -17,8 +17,6 @@ <manifest package="com.example.android.wearable.wear.wearaccessibilityapp" xmlns:android="http://schemas.android.com/apk/res/android"> - <uses-sdk android:minSdkVersion="14"/> - <uses-feature android:name="android.hardware.type.watch"/> <!-- Required for Always-on. --> diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AccessibilityActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AccessibilityActivity.java index d982d123..319fa34d 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AccessibilityActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AccessibilityActivity.java @@ -19,12 +19,14 @@ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.provider.Settings; -import android.support.wear.ambient.AmbientMode; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.TextView; +import androidx.wear.ambient.AmbientMode; + + public class AccessibilityActivity extends Activity implements AmbientMode.AmbientCallbackProvider { @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItem.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItem.java index ee1002bf..7c713c04 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItem.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItem.java @@ -52,6 +52,9 @@ public class AppItem { } public void launchActivity(Context context) { - context.startActivity(new Intent(context, mClass)); + Intent intent = new Intent(context, mClass); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + context.startActivity(intent); } } diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItemListViewAdapter.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItemListViewAdapter.java index 372f995b..e82cafe3 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItemListViewAdapter.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/AppItemListViewAdapter.java @@ -16,8 +16,6 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -25,6 +23,9 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.util.List; public class AppItemListViewAdapter extends ArrayAdapter<AppItem> { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ControlsActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ControlsActivity.java index 5cb897e5..91dd1274 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ControlsActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ControlsActivity.java @@ -17,8 +17,9 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; import android.preference.PreferenceFragment; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; + +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; public class ControlsActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/DialogsActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/DialogsActivity.java index e17476c8..41825dcd 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/DialogsActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/DialogsActivity.java @@ -20,8 +20,6 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.support.wearable.view.AcceptDenyDialog; import android.support.wearable.view.WearableDialogHelper.DialogBuilder; import android.view.LayoutInflater; @@ -30,6 +28,9 @@ import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/FullScreenActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/FullScreenActivity.java index f254e288..bee32771 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/FullScreenActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/FullScreenActivity.java @@ -16,8 +16,9 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; + +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; public class FullScreenActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/GlobalNotificationBuilder.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/GlobalNotificationBuilder.java index 812ed944..c77d6238 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/GlobalNotificationBuilder.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/GlobalNotificationBuilder.java @@ -15,7 +15,7 @@ */ package com.example.android.wearable.wear.wearaccessibilityapp; -import android.support.v4.app.NotificationCompat; +import androidx.core.app.NotificationCompat; /** * We use a Singleton for a global copy of the NotificationCompat.Builder to update active diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ImagesActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ImagesActivity.java index dcb95046..f9334de8 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ImagesActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ImagesActivity.java @@ -19,10 +19,11 @@ import android.graphics.drawable.Animatable2.AnimationCallback; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.widget.ImageView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + public class ImagesActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { private AnimatedVectorDrawable mAnimatedVectorDrawableSwipe; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/InLineActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/InLineActivity.java index 275f5444..25a2011e 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/InLineActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/InLineActivity.java @@ -21,8 +21,9 @@ import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.preference.SwitchPreference; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; + +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; public class InLineActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListOfGraphicsActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListOfGraphicsActivity.java index 1d700667..e0aff859 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListOfGraphicsActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListOfGraphicsActivity.java @@ -16,14 +16,15 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + import java.util.ArrayList; import java.util.List; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListViewAdapter.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListViewAdapter.java index 41b18d8a..8899b4e4 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListViewAdapter.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListViewAdapter.java @@ -16,8 +16,6 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -25,6 +23,9 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.util.List; public class ListViewAdapter<T extends Item> extends ArrayAdapter<T> { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsActivity.java index bd9d7736..6680900d 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsActivity.java @@ -16,14 +16,15 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + import java.util.ArrayList; import java.util.List; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsItem.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsItem.java index 42e84642..57be950c 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsItem.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ListsItem.java @@ -33,6 +33,9 @@ public class ListsItem implements Item { } public void launchActivity(Context context) { - context.startActivity(new Intent(context, mClass)); + Intent intent = new Intent(context, mClass); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + context.startActivity(intent); } } diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListActivity.java index 42403975..c1255e6a 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListActivity.java @@ -17,14 +17,15 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; import android.os.Handler; -import android.support.v4.app.FragmentActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.wear.ambient.AmbientModeSupport; -import android.support.wear.widget.WearableRecyclerView; -import android.support.wear.widget.drawer.WearableActionDrawerView; import android.view.View; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.wear.ambient.AmbientModeSupport; +import androidx.wear.widget.WearableRecyclerView; +import androidx.wear.widget.drawer.WearableActionDrawerView; + import com.example.android.wearable.wear.wearaccessibilityapp.LongListRecyclerViewAdapter.SwitchChangeListener; import java.util.ArrayList; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListRecyclerViewAdapter.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListRecyclerViewAdapter.java index 96b273a5..27681b31 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListRecyclerViewAdapter.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/LongListRecyclerViewAdapter.java @@ -16,8 +16,6 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -26,6 +24,9 @@ import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + import java.util.List; public class LongListRecyclerViewAdapter diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MainActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MainActivity.java index 4bbfacdd..370c0e5a 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MainActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MainActivity.java @@ -16,10 +16,11 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; -import android.support.wear.widget.WearableLinearLayoutManager; -import android.support.wear.widget.WearableRecyclerView; + +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; +import androidx.wear.widget.WearableLinearLayoutManager; +import androidx.wear.widget.WearableRecyclerView; import java.util.ArrayList; import java.util.List; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MenuRecyclerViewAdapter.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MenuRecyclerViewAdapter.java index e5367625..3e57c008 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MenuRecyclerViewAdapter.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MenuRecyclerViewAdapter.java @@ -16,14 +16,15 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + import java.util.List; public class MenuRecyclerViewAdapter extends RecyclerView.Adapter<MenuRecyclerViewAdapter.Holder> { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingIntentService.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingIntentService.java index b8e998f9..980dcbc7 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingIntentService.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingIntentService.java @@ -21,12 +21,15 @@ import android.app.PendingIntent; import android.content.Intent; import android.graphics.BitmapFactory; import android.os.Bundle; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.NotificationCompat.MessagingStyle; -import android.support.v4.app.NotificationManagerCompat; -import android.support.v4.app.RemoteInput; import android.util.Log; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationCompat.MessagingStyle; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.Person; +import androidx.core.app.RemoteInput; +import androidx.core.content.ContextCompat; + /** * Asynchronously handles updating messaging app posts (and active Notification) with replies from * user in a conversation. Notification for social app use MessagingStyle. @@ -100,8 +103,9 @@ public class MessagingIntentService extends IntentService { NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification( notification); - // Add new message to the MessagingStyle - messagingStyle.addMessage(replyCharSequence, System.currentTimeMillis(), null); + // Add new message to the MessagingStyle. Set last parameter to null for responses + // from user. + messagingStyle.addMessage(replyCharSequence, System.currentTimeMillis(), (Person) null); // Updates the Notification notification = notificationCompatBuilder.setStyle(messagingStyle).build(); @@ -130,51 +134,52 @@ public class MessagingIntentService extends IntentService { */ private NotificationCompat.Builder recreateBuilderWithMessagingStyle() { - // Main steps for building a MESSAGING_STYLE notification (for more detailed comments on - // building this notification, check StandaloneMainActivity.java):: + // Main steps for building a MESSAGING_STYLE notification: // 0. Get your data - // 1. Build the MESSAGING_STYLE - // 2. Add support for Wear 1.+ + // 1. Create Notification Channel for O and beyond devices (26+) + // 2. Build the MESSAGING_STYLE // 3. Set up main Intent for notification // 4. Set up RemoteInput (users can input directly from notification) // 5. Build and issue the notification - // 0. Get your data (everything unique per Notification) + // 0. Get your data (everything unique per Notification). MockDatabase.MessagingStyleCommsAppData messagingStyleCommsAppData = - MockDatabase.getMessagingStyleData(); + MockDatabase.getMessagingStyleData(getApplicationContext()); + + // 1. Retrieve Notification Channel for O and beyond devices (26+). We don't need to create + // the NotificationChannel, since it was created the first time this Notification was + // created. + String notificationChannelId = messagingStyleCommsAppData.getChannelId(); - // 1. Build the Notification.Style (MESSAGING_STYLE) + // 2. Build the Notification.Style (MESSAGING_STYLE). String contentTitle = messagingStyleCommsAppData.getContentTitle(); MessagingStyle messagingStyle = - new NotificationCompat.MessagingStyle(messagingStyleCommsAppData.getReplayName()) + new NotificationCompat.MessagingStyle(messagingStyleCommsAppData.getMe()) + /* + * <p>This API's behavior was changed in SDK version + * {@link Build.VERSION_CODES#P}. If your application's target version is + * less than {@link Build.VERSION_CODES#P}, setting a conversation title to + * a non-null value will make {@link #isGroupConversation()} return + * {@code true} and passing {@code null} will make it return {@code false}. + * This behavior can be overridden by calling + * {@link #setGroupConversation(boolean)} regardless of SDK version. + * In {@code P} and above, this method does not affect group conversation + * settings. + * + * In our case, we use the same title. + */ .setConversationTitle(contentTitle); - // Adds all Messages + // Adds all Messages. + // Note: Messages include the text, timestamp, and sender. for (MessagingStyle.Message message : messagingStyleCommsAppData.getMessages()) { messagingStyle.addMessage(message); } - // 2. Add support for Wear 1.+. - String fullMessageForWearVersion1 = messagingStyleCommsAppData.getFullConversation(); - - Notification chatHistoryForWearV1 = - new NotificationCompat.Builder(getApplicationContext()) - .setStyle( - new NotificationCompat.BigTextStyle() - .bigText(fullMessageForWearVersion1)) - .setContentTitle(contentTitle) - .setSmallIcon(R.drawable.watch) - .setContentText(fullMessageForWearVersion1) - .build(); + messagingStyle.setGroupConversation(messagingStyleCommsAppData.isGroupConversation()); - // Adds page with all text to support Wear 1.+. - NotificationCompat.WearableExtender wearableExtenderForWearVersion1 = - new NotificationCompat.WearableExtender() - .setHintContentIntentLaunchesActivity(true) - .addPage(chatHistoryForWearV1); - - // 3. Set up main Intent for notification + // 3. Set up main Intent for notification. Intent notifyIntent = new Intent(this, MessagingMainActivity.class); PendingIntent mainPendingIntent = @@ -182,58 +187,83 @@ public class MessagingIntentService extends IntentService { // 4. Set up a RemoteInput Action, so users can input (keyboard, drawing, voice) directly // from the notification without entering the app. + + // Create the RemoteInput specifying this key. String replyLabel = getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(MessagingIntentService.EXTRA_REPLY) .setLabel(replyLabel) + // Use machine learning to create responses based on previous messages. + .setChoices(messagingStyleCommsAppData.getReplyChoicesBasedOnLastMessage()) .build(); + // Create PendingIntent for service that handles input. Intent replyIntent = new Intent(this, MessagingIntentService.class); replyIntent.setAction(MessagingIntentService.ACTION_REPLY); PendingIntent replyActionPendingIntent = PendingIntent.getService(this, 0, replyIntent, 0); // Enable action to appear inline on Wear 2.0 (24+). This means it will appear over the // lower portion of the Notification for easy action (only possible for one action). - final NotificationCompat.Action.WearableExtender inlineActionForWear2_0 = + final NotificationCompat.Action.WearableExtender inlineActionForWear2 = new NotificationCompat.Action.WearableExtender() .setHintDisplayActionInline(true) .setHintLaunchesActivity(false); NotificationCompat.Action replyAction = new NotificationCompat.Action.Builder( - R.drawable.reply, replyLabel, replyActionPendingIntent) + R.drawable.reply, + replyLabel, + replyActionPendingIntent) .addRemoteInput(remoteInput) - // Allows system to generate replies by context of conversation + // Informs system we aren't bringing up our own custom UI for a reply + // action. + .setShowsUserInterface(false) + // Allows system to generate replies by context of conversation. .setAllowGeneratedReplies(true) - // Add WearableExtender to enable inline actions - .extend(inlineActionForWear2_0) + // Add WearableExtender to enable inline actions. + .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY) + .extend(inlineActionForWear2) .build(); - // 5. Build and issue the notification + // 5. Build and issue the notification. + + // Notification Channel Id is ignored for Android pre O (26). NotificationCompat.Builder notificationCompatBuilder = - new NotificationCompat.Builder(getApplicationContext()); + new NotificationCompat.Builder(getApplicationContext(), notificationChannelId); GlobalNotificationBuilder.setNotificationCompatBuilderInstance(notificationCompatBuilder); - // Builds and issues notification notificationCompatBuilder + // MESSAGING_STYLE sets title and content for Wear 1.+ and Wear 2.0 devices. .setStyle(messagingStyle) .setContentTitle(contentTitle) .setContentText(messagingStyleCommsAppData.getContentText()) .setSmallIcon(R.drawable.watch) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.avatar)) .setContentIntent(mainPendingIntent) + .setDefaults(NotificationCompat.DEFAULT_ALL) + // Set primary color (important for Wear 2.0 Notifications). + .setColor(ContextCompat.getColor(getApplicationContext(), R.color.background)) + + // Number of new notifications for API <24 (Wear 1.+) devices. .setSubText(Integer.toString(messagingStyleCommsAppData.getNumberOfNewMessages())) .addAction(replyAction) .setCategory(Notification.CATEGORY_MESSAGE) - .setPriority(Notification.PRIORITY_HIGH) - .setVisibility(Notification.VISIBILITY_PRIVATE) - .extend(wearableExtenderForWearVersion1); - for (String name : messagingStyleCommsAppData.getParticipants()) { - notificationCompatBuilder.addPerson(name); - } + // Sets priority for 25 and below. For 26 and above, 'priority' is deprecated for + // 'importance' which is set in the NotificationChannel. The integers representing + // 'priority' are different from 'importance', so make sure you don't mix them. + .setPriority(messagingStyleCommsAppData.getPriority()) + // Sets lock-screen visibility for 25 and below. For 26 and above, lock screen + // visibility is set in the NotificationChannel. + .setVisibility(messagingStyleCommsAppData.getChannelLockscreenVisibility()); + + // If the phone is in "Do not disturb" mode, the user may still be notified if the + // sender(s) are in a group allowed through "Do not disturb" by the user. + for (Person person : messagingStyleCommsAppData.getParticipants()) { + notificationCompatBuilder.addPerson(person.getUri()); + } return notificationCompatBuilder; } } diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingMainActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingMainActivity.java index b3d64644..81fed8f6 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingMainActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MessagingMainActivity.java @@ -19,7 +19,8 @@ import android.app.Activity; import android.app.NotificationManager; import android.content.Context; import android.os.Bundle; -import android.support.wear.ambient.AmbientMode; + +import androidx.wear.ambient.AmbientMode; /** * Template class meant to include functionality for your Messaging App. (This project's main focus diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MockDatabase.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MockDatabase.java index 421a7195..1b70e036 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MockDatabase.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/MockDatabase.java @@ -16,105 +16,135 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.app.NotificationManager; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.NotificationCompat.MessagingStyle; +import android.content.ContentResolver; +import android.content.Context; +import android.net.Uri; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationCompat.MessagingStyle; +import androidx.core.app.Person; +import androidx.core.graphics.drawable.IconCompat; import java.util.ArrayList; /** Mock data for each of the Notification Style Demos. */ public final class MockDatabase { - public static MessagingStyleCommsAppData getMessagingStyleData() { - return MessagingStyleCommsAppData.getInstance(); + /** + * Returns object containing all information to create a Messaging.Style Notification. + * @param context + * @return + */ + public static MessagingStyleCommsAppData getMessagingStyleData(Context context) { + return MessagingStyleCommsAppData.getInstance(context); } /** Represents data needed for MessagingStyle Notification. */ - public static class MessagingStyleCommsAppData { + public static class MessagingStyleCommsAppData extends MockNotificationData { private static MessagingStyleCommsAppData sInstance = null; - // Standard notification values - protected String mContentTitle; - protected String mContentText; - protected int mPriority; + // Unique data for this Notification.Style: + private ArrayList<MessagingStyle.Message> mMessages; + // String of all mMessages. + private String mFullConversation; + // Name preferred when replying to chat. + private Person mMe; + private ArrayList<Person> mParticipants; - // Style notification values - protected ArrayList<MessagingStyle.Message> mMessages; - // Basically, String of all mMessages - protected String mFullConversation; - // Name preferred when replying to chat - protected String mReplayName; - protected int mNumberOfNewMessages; - protected ArrayList<String> mParticipants; + private CharSequence[] mReplyChoicesBasedOnLastMessages; - // Notification channel values (O and above): - protected String mChannelId; - protected CharSequence mChannelName; - protected String mChannelDescription; - protected int mChannelImportance; - protected boolean mChannelEnableVibrate; - protected int mChannelLockscreenVisibility; - - public static MessagingStyleCommsAppData getInstance() { + /** + * Returns singleton version of Messaging.Style data. + */ + public static MessagingStyleCommsAppData getInstance(Context context) { if (sInstance == null) { - sInstance = getSync(); + sInstance = getSync(context); } return sInstance; } - private static synchronized MessagingStyleCommsAppData getSync() { + private static synchronized MessagingStyleCommsAppData getSync(Context context) { if (sInstance == null) { - sInstance = new MessagingStyleCommsAppData(); + sInstance = new MessagingStyleCommsAppData(context); } return sInstance; } - private MessagingStyleCommsAppData() { - // Standard notification values - // Content for API <24 (M and below) devices - mContentTitle = "2 Messages w/ Famous McFamously"; - mContentText = "Dude! ... You know I am a Pesce-pescetarian. :P"; + private MessagingStyleCommsAppData(Context context) { + // Standard notification values: + // Content for API <24 (M and below) devices. + // Note: I am actually hardcoding these Strings based on info below. You would be + // pulling these values from the same source in your database. I leave this up here, so + // you can see the standard parts of a Notification first. + mContentTitle = "3 Messages w/ Famous, Wendy"; + mContentText = "HEY, I see my house! :)"; mPriority = NotificationCompat.PRIORITY_HIGH; - // Style notification values + // Create the users for the conversation. + // Name preferred when replying to chat. + mMe = + new Person.Builder() + .setName("Me MacDonald") + .setKey("1234567890") + .setUri("tel:1234567890") + .setIcon( + IconCompat.createWithResource(context, R.drawable.me_macdonald)) + .build(); + + Person participant1 = + new Person.Builder() + .setName("Famous Fryer") + .setKey("9876543210") + .setUri("tel:9876543210") + .setIcon( + IconCompat.createWithResource(context, R.drawable.famous_fryer)) + .build(); + + Person participant2 = + new Person.Builder() + .setName("Wendy Wonda") + .setKey("2233221122") + .setUri("tel:2233221122") + .setIcon(IconCompat.createWithResource(context, R.drawable.wendy_wonda)) + .build(); - // For each message, you need the timestamp, in this case, we are using arbitrary ones. - long currentTime = System.currentTimeMillis(); + // If the phone is in "Do not disturb mode, the user will still be notified if + // the user(s) is starred as a favorite. + // Note: You don't need to add yourself, aka 'me', as a participant. + mParticipants = new ArrayList<>(); + mParticipants.add(participant1); + mParticipants.add(participant2); mMessages = new ArrayList<>(); + + // For each message, you need the timestamp. In this case, we are using arbitrary longs + // representing time in milliseconds. mMessages.add( - new MessagingStyle.Message( - "What are you doing tonight?", currentTime - 4000, "Famous")); + // When you are setting an image for a message, text does not display. + new MessagingStyle.Message("", 1528490641998L, participant1) + .setData( + "image/png", resourceToUri(context, R.drawable.earth))); + mMessages.add( new MessagingStyle.Message( - "I don't know, dinner maybe?", currentTime - 3000, null)); - mMessages.add(new MessagingStyle.Message("Sounds good.", currentTime - 2000, "Famous")); - mMessages.add(new MessagingStyle.Message("How about BBQ?", currentTime - 1000, null)); - // Last two are the newest message (2) from friend - mMessages.add(new MessagingStyle.Message("Hey!", currentTime, "Famous")); + "Visiting the moon again? :P", 1528490643998L, mMe)); + mMessages.add( new MessagingStyle.Message( - "You know I am a Pesce-pescetarian. :P", currentTime, "Famous")); + "HEY, I see my house!", 1528490645998L, participant2)); - // String version of the mMessages above + // String version of the mMessages above. mFullConversation = - "Famous: What are you doing tonight?\n\n" - + "Me: I don't know, dinner maybe?\n\n" - + "Famous: Sounds good.\n\n" - + "Me: How about BBQ?\n\n" - + "Famous: Hey!\n\n" - + "Famous: You know I am a Pesce-pescetarian. :P\n\n"; - - mNumberOfNewMessages = 2; + "Famous: [Picture of Moon]\n\n" + + "Me: Visiting the moon again? :P\n\n" + + "Wendy: HEY, I see my house! :)\n\n"; - // Name preferred when replying to chat - mReplayName = "Me"; - - // If the phone is in "Do not disturb mode, the user will still be notified if - // the user(s) is starred as a favorite. - mParticipants = new ArrayList<>(); - mParticipants.add("Famous McFamously"); + // Responses based on the last messages of the conversation. You would use + // Machine Learning to get these (https://developers.google.com/ml-kit/). + mReplyChoicesBasedOnLastMessages = + new CharSequence[] {"Me too!", "How's the weather?", "You have good eyesight."}; // Notification channel values (for devices targeting 26 and above): mChannelId = "channel_messaging_1"; @@ -127,14 +157,6 @@ public final class MockDatabase { mChannelLockscreenVisibility = NotificationCompat.VISIBILITY_PRIVATE; } - public String getContentTitle() { - return mContentTitle; - } - - public String getContentText() { - return mContentText; - } - public ArrayList<MessagingStyle.Message> getMessages() { return mMessages; } @@ -143,18 +165,57 @@ public final class MockDatabase { return mFullConversation; } - public String getReplayName() { - return mReplayName; + public Person getMe() { + return mMe; } public int getNumberOfNewMessages() { - return mNumberOfNewMessages; + return mMessages.size(); } - public ArrayList<String> getParticipants() { + public ArrayList<Person> getParticipants() { return mParticipants; } + public CharSequence[] getReplyChoicesBasedOnLastMessage() { + return mReplyChoicesBasedOnLastMessages; + } + + @Override + public String toString() { + return getFullConversation(); + } + + public boolean isGroupConversation() { + return mParticipants.size() > 1; + } + } + + /** Represents standard data needed for a Notification. */ + public abstract static class MockNotificationData { + + // Standard notification values: + protected String mContentTitle; + protected String mContentText; + protected int mPriority; + + // Notification channel values (O and above): + protected String mChannelId; + protected CharSequence mChannelName; + protected String mChannelDescription; + protected int mChannelImportance; + protected boolean mChannelEnableVibrate; + protected int mChannelLockscreenVisibility; + + // Notification Standard notification get methods: + public String getContentTitle() { + return mContentTitle; + } + + public String getContentText() { + return mContentText; + } + public int getPriority() { return mPriority; } @@ -183,10 +244,22 @@ public final class MockDatabase { public int getChannelLockscreenVisibility() { return mChannelLockscreenVisibility; } + } - @Override - public String toString() { - return getFullConversation(); - } + /** + * Returns URI from a resource. + * @param context + * @param resId + * @return + */ + public static Uri resourceToUri(Context context, int resId) { + return Uri.parse( + ContentResolver.SCHEME_ANDROID_RESOURCE + + "://" + + context.getResources().getResourcePackageName(resId) + + "/" + + context.getResources().getResourceTypeName(resId) + + "/" + + context.getResources().getResourceEntryName(resId)); } } diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/NotificationsActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/NotificationsActivity.java index fd0bfeb4..d573948e 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/NotificationsActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/NotificationsActivity.java @@ -29,15 +29,19 @@ import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; import android.preference.SwitchPreference; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.NotificationCompat.MessagingStyle; -import android.support.v4.app.NotificationManagerCompat; -import android.support.v4.app.RemoteInput; -import android.support.v4.content.ContextCompat; -import android.support.wear.ambient.AmbientModeSupport; import android.util.Log; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationCompat.MessagingStyle; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.app.Person; +import androidx.core.app.RemoteInput; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + +import com.example.android.wearable.wear.wearaccessibilityapp.util.NotificationUtil; + public class NotificationsActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { @@ -145,7 +149,7 @@ public class NotificationsActivity extends FragmentActivity implements // Main steps for building a MESSAGING_STYLE notification: // 0. Get your data - // 1. Retrieve Notification Channel for O and beyond devices (26+) + // 1. Create/Retrieve Notification Channel for O and beyond devices (26+) // 2. Build the MESSAGING_STYLE // 3. Set up main Intent for notification // 4. Set up RemoteInput (users can input directly from notification) @@ -153,46 +157,64 @@ public class NotificationsActivity extends FragmentActivity implements // 0. Get your data (everything unique per Notification). MockDatabase.MessagingStyleCommsAppData messagingStyleCommsAppData = - MockDatabase.getMessagingStyleData(); + MockDatabase.getMessagingStyleData(getContext()); // 1. Create/Retrieve Notification Channel for O and beyond devices (26+). - String notificationChannelId = - createNotificationChannel(context, messagingStyleCommsAppData); + String notificationChannelId = NotificationUtil.createNotificationChannel( + getContext(), + messagingStyleCommsAppData); + - // 2. Build the Notification.Style (MESSAGING_STYLE) + // 2. Build the Notification.Style (MESSAGING_STYLE). String contentTitle = messagingStyleCommsAppData.getContentTitle(); MessagingStyle messagingStyle = - new NotificationCompat.MessagingStyle( - messagingStyleCommsAppData.getReplayName()) - // You could set a different title to appear when the messaging style - // is supported on device (24+) if you wish. In our case, we use the - // same - // title. + new NotificationCompat.MessagingStyle(messagingStyleCommsAppData.getMe()) + /* + * <p>This API's behavior was changed in SDK version + * {@link Build.VERSION_CODES#P}. If your application's target version + * is less than {@link Build.VERSION_CODES#P}, setting a conversation + * title to a non-null value will make {@link #isGroupConversation()} + * return {@code true} and passing {@code null} will make it return + * {@code false}. + * This behavior can be overridden by calling + * {@link #setGroupConversation(boolean)} regardless of SDK version. + * In {@code P} and above, this method does not affect group + * conversation settings. + * + * In our case, we use the same title. + */ .setConversationTitle(contentTitle); - // Adds all Messages - // Note: Messages include the text, timestamp, and sender + // Adds all Messages. + // Note: Messages include the text, timestamp, and sender. for (MessagingStyle.Message message : messagingStyleCommsAppData.getMessages()) { messagingStyle.addMessage(message); } - // 3. Set up main Intent for notification + messagingStyle.setGroupConversation(messagingStyleCommsAppData.isGroupConversation()); + + // 3. Set up main Intent for notification. Intent notifyIntent = new Intent(getActivity(), MessagingMainActivity.class); PendingIntent mainPendingIntent = PendingIntent.getActivity( - getActivity(), 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); + getActivity(), + 0, + notifyIntent, + PendingIntent.FLAG_UPDATE_CURRENT + ); // 4. Set up a RemoteInput Action, so users can input (keyboard, drawing, voice) // directly from the notification without entering the app. // Create the RemoteInput specifying this key. String replyLabel = getString(R.string.reply_label); - RemoteInput remoteInput = - new RemoteInput.Builder(MessagingIntentService.EXTRA_REPLY) - .setLabel(replyLabel) - .build(); + RemoteInput remoteInput = new RemoteInput.Builder(MessagingIntentService.EXTRA_REPLY) + .setLabel(replyLabel) + // Use machine learning to create responses based on previous messages. + .setChoices(messagingStyleCommsAppData.getReplyChoicesBasedOnLastMessage()) + .build(); // Create PendingIntent for service that handles input. Intent replyIntent = new Intent(getActivity(), MessagingIntentService.class); @@ -204,44 +226,55 @@ public class NotificationsActivity extends FragmentActivity implements // lower portion of the Notification for easy action (only possible for one action). final NotificationCompat.Action.WearableExtender inlineActionForWear2 = new NotificationCompat.Action.WearableExtender() - .setHintDisplayActionInline(mActionOn) + .setHintDisplayActionInline(true) .setHintLaunchesActivity(false); NotificationCompat.Action replyAction = new NotificationCompat.Action.Builder( - R.drawable.reply, replyLabel, replyActionPendingIntent) + R.drawable.reply, + replyLabel, + replyActionPendingIntent) .addRemoteInput(remoteInput) - // Allows system to generate replies by context of conversation + // Informs system we aren't bringing up our own custom UI for a reply + // action. + .setShowsUserInterface(false) + // Allows system to generate replies by context of conversation. .setAllowGeneratedReplies(true) - // Add WearableExtender to enable inline actions + // Add WearableExtender to enable inline actions. + .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY) .extend(inlineActionForWear2) .build(); - // 5. Build and issue the notification - // Because we want this to be a new notification (not updating current notification), - // we create a new Builder. Later, we update this same notification, so we need to save + // 5. Build and issue the notification. + + // Because we want this to be a new notification (not updating current notification), we + // create a new Builder. Later, we update this same notification, so we need to save // this Builder globally (as outlined earlier). // Notification Channel Id is ignored for Android pre O (26). NotificationCompat.Builder notificationCompatBuilder = - new NotificationCompat.Builder(context, notificationChannelId); + new NotificationCompat.Builder( + context, notificationChannelId); GlobalNotificationBuilder.setNotificationCompatBuilderInstance( notificationCompatBuilder); - // Builds and issues notification notificationCompatBuilder // MESSAGING_STYLE sets title and content for Wear 1.+ and Wear 2.0 devices. .setStyle(messagingStyle) .setContentTitle(contentTitle) .setContentText(messagingStyleCommsAppData.getContentText()) .setSmallIcon(R.drawable.watch) + .setLargeIcon(BitmapFactory.decodeResource( + getResources(), + mAvatarOn ? R.drawable.avatar : R.drawable.watch)) .setContentIntent(mainPendingIntent) - .setColor(ContextCompat.getColor(context, R.color.background)) .setDefaults(NotificationCompat.DEFAULT_ALL) + // Set primary color (important for Wear 2.0 Notifications). + .setColor(ContextCompat.getColor(context, R.color.background)) - // Number of new notifications for API <24 (Wear 1.+) devices + // Number of new notifications for API <24 (Wear 1.+) devices. .setSubText( Integer.toString(messagingStyleCommsAppData.getNumberOfNewMessages())) .addAction(replyAction) @@ -257,14 +290,10 @@ public class NotificationsActivity extends FragmentActivity implements // visibility is set in the NotificationChannel. .setVisibility(messagingStyleCommsAppData.getChannelLockscreenVisibility()); - notificationCompatBuilder.setLargeIcon( - BitmapFactory.decodeResource( - getResources(), mAvatarOn ? R.drawable.avatar : R.drawable.watch)); - - // If the phone is in "Do not disturb mode, the user will still be notified if - // the sender(s) is starred as a favorite. - for (String name : messagingStyleCommsAppData.getParticipants()) { - notificationCompatBuilder.addPerson(name); + // If the phone is in "Do not disturb" mode, the user may still be notified if the + // sender(s) are in a group allowed through "Do not disturb" by the user. + for (Person person : messagingStyleCommsAppData.getParticipants()) { + notificationCompatBuilder.addPerson(person.getUri()); } Notification notification = notificationCompatBuilder.build(); diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/OpenOnPhoneAnimationActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/OpenOnPhoneAnimationActivity.java index acc3c534..606c3d11 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/OpenOnPhoneAnimationActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/OpenOnPhoneAnimationActivity.java @@ -19,10 +19,11 @@ import android.graphics.drawable.Animatable2.AnimationCallback; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.widget.ImageView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + public class OpenOnPhoneAnimationActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { private AnimationCallback mAnimationCallback; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/PhotoCarouselActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/PhotoCarouselActivity.java index 5fa1f8b0..8828fc8c 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/PhotoCarouselActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/PhotoCarouselActivity.java @@ -17,12 +17,13 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.content.Intent; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + public class PhotoCarouselActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider, OnClickListener { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ProgressActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ProgressActivity.java index 38add02e..22602feb 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ProgressActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ProgressActivity.java @@ -16,14 +16,15 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + import java.util.ArrayList; import java.util.List; diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/RadioListActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/RadioListActivity.java index d5bcc8b9..dcd675f4 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/RadioListActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/RadioListActivity.java @@ -16,10 +16,11 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + public class RadioListActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ScalingScrollLayoutCallback.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ScalingScrollLayoutCallback.java index 00b42268..6b3f7ca6 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ScalingScrollLayoutCallback.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ScalingScrollLayoutCallback.java @@ -15,10 +15,11 @@ */ package com.example.android.wearable.wear.wearaccessibilityapp; -import android.support.v7.widget.RecyclerView; -import android.support.wear.widget.WearableLinearLayoutManager; import android.view.View; +import androidx.recyclerview.widget.RecyclerView; +import androidx.wear.widget.WearableLinearLayoutManager; + public class ScalingScrollLayoutCallback extends WearableLinearLayoutManager.LayoutCallback { /** How much should we scale the icon at most. */ diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ZoomImageActivity.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ZoomImageActivity.java index cde17b57..5bed9775 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ZoomImageActivity.java +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/ZoomImageActivity.java @@ -17,10 +17,11 @@ package com.example.android.wearable.wear.wearaccessibilityapp; import android.content.res.Resources.NotFoundException; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.wear.ambient.AmbientModeSupport; import android.widget.ImageView; +import androidx.fragment.app.FragmentActivity; +import androidx.wear.ambient.AmbientModeSupport; + public class ZoomImageActivity extends FragmentActivity implements AmbientModeSupport.AmbientCallbackProvider { diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/util/NotificationUtil.java b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/util/NotificationUtil.java new file mode 100644 index 00000000..bbdcbdcc --- /dev/null +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/java/com/example/android/wearable/wear/wearaccessibilityapp/util/NotificationUtil.java @@ -0,0 +1,77 @@ +/* + * Copyright 2018 The Android Open Source Project. All Rights Reserved. + * + * 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.wearable.wear.wearaccessibilityapp.util; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.os.Build; + +import com.example.android.wearable.wear.wearaccessibilityapp.MockDatabase; + +/** + * Simplifies common {@link Notification} tasks. + */ +public class NotificationUtil { + + /** + * Creates Notification Channel used for Notifications on O (26) and higher. + * + * @param context + * @param mockNotificationData + * @return + */ + public static String createNotificationChannel( + Context context, + MockDatabase.MessagingStyleCommsAppData mockNotificationData) { + + // NotificationChannels are required for Notifications on O (API 26) and above. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + // The id of the channel. + String channelId = mockNotificationData.getChannelId(); + + // The user-visible name of the channel. + CharSequence channelName = mockNotificationData.getChannelName(); + // The user-visible description of the channel. + String channelDescription = mockNotificationData.getChannelDescription(); + int channelImportance = mockNotificationData.getChannelImportance(); + boolean channelEnableVibrate = mockNotificationData.isChannelEnableVibrate(); + int channelLockscreenVisibility = + mockNotificationData.getChannelLockscreenVisibility(); + + // Initializes NotificationChannel. + NotificationChannel notificationChannel = + new NotificationChannel(channelId, channelName, channelImportance); + notificationChannel.setDescription(channelDescription); + notificationChannel.enableVibration(channelEnableVibrate); + notificationChannel.setLockscreenVisibility(channelLockscreenVisibility); + + // Adds NotificationChannel to system. Attempting to create an existing notification + // channel with its original values performs no operation, so it's safe to perform the + // below sequence. + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.createNotificationChannel(notificationChannel); + + return channelId; + } else { + // Returns null for pre-O (26) devices. + return null; + } + } +} diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/earth.png b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/earth.png Binary files differnew file mode 100644 index 00000000..13abd77a --- /dev/null +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/earth.png diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/famous_fryer.png b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/famous_fryer.png Binary files differnew file mode 100644 index 00000000..92204dbf --- /dev/null +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/famous_fryer.png diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/me_macdonald.png b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/me_macdonald.png Binary files differnew file mode 100644 index 00000000..cbf4a056 --- /dev/null +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/me_macdonald.png diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/wendy_wonda.png b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/wendy_wonda.png Binary files differnew file mode 100644 index 00000000..3097ce12 --- /dev/null +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/drawable-hdpi/wendy_wonda.png diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_long_list.xml b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_long_list.xml index e133f15f..addc66c0 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_long_list.xml +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_long_list.xml @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. --> -<android.support.wear.widget.drawer.WearableDrawerLayout +<androidx.wear.widget.drawer.WearableDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" @@ -22,7 +22,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:deviceIds="wear"> - <android.support.wear.widget.WearableRecyclerView + <androidx.wear.widget.WearableRecyclerView android:id="@+id/recycler_view_long_list" android:layout_width="match_parent" android:layout_height="match_parent" @@ -30,12 +30,12 @@ android:paddingBottom="?android:dialogPreferredPadding" android:clipToPadding="false" android:scrollbars="vertical"/> - <android.support.wear.widget.drawer.WearableActionDrawerView + <androidx.wear.widget.drawer.WearableActionDrawerView android:id="@+id/action_drawer_long_list" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible" app:actionMenu="@menu/action_drawer_menu" app:show_overflow_in_peek="true"> - </android.support.wear.widget.drawer.WearableActionDrawerView> -</android.support.wear.widget.drawer.WearableDrawerLayout> + </androidx.wear.widget.drawer.WearableActionDrawerView> +</androidx.wear.widget.drawer.WearableDrawerLayout> diff --git a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_main.xml b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_main.xml index 21446473..60135190 100644 --- a/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_main.xml +++ b/wearable/wear/WearAccessibilityApp/Wearable/src/main/res/layout/activity_main.xml @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. --> -<android.support.wear.widget.WearableRecyclerView +<androidx.wear.widget.WearableRecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_recycler_view" android:layout_width="match_parent" diff --git a/wearable/wear/WearAccessibilityApp/gradle.properties b/wearable/wear/WearAccessibilityApp/gradle.properties new file mode 100644 index 00000000..5465fec0 --- /dev/null +++ b/wearable/wear/WearAccessibilityApp/gradle.properties @@ -0,0 +1,2 @@ +android.enableJetifier=true +android.useAndroidX=true
\ No newline at end of file diff --git a/wearable/wear/WearAccessibilityApp/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/WearAccessibilityApp/gradle/wrapper/gradle-wrapper.properties index 9470ad8b..c68d61eb 100644 --- a/wearable/wear/WearAccessibilityApp/gradle/wrapper/gradle-wrapper.properties +++ b/wearable/wear/WearAccessibilityApp/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ -#Wed Apr 10 15:27:10 PDT 2013 +#Sun Mar 31 15:27:57 PDT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip - +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/wearable/wear/WearAccessibilityApp/template-params.xml b/wearable/wear/WearAccessibilityApp/template-params.xml index 7e32902c..1148f074 100644 --- a/wearable/wear/WearAccessibilityApp/template-params.xml +++ b/wearable/wear/WearAccessibilityApp/template-params.xml @@ -21,14 +21,18 @@ <package>com.example.android.wearable.wear.wearaccessibilityapp</package> <minSdkVersionWear>24</minSdkVersionWear> - <compileSdkVersionWear>26</compileSdkVersionWear> - <targetSdkVersionWear>26</targetSdkVersionWear> + <compileSdkVersionWear>28</compileSdkVersionWear> + <targetSdkVersionWear>28</targetSdkVersionWear> <multiDexEnabled>true</multiDexEnabled> - <dependency_wearable>com.android.support:wear:27.1.1</dependency_wearable> - <dependency_wearable>com.android.support.constraint:constraint-layout:1.0.2</dependency_wearable> - <dependency_wearable>com.android.support:appcompat-v7:27.1.1</dependency_wearable> + <androidX>true</androidX> + + <dependency_wearable>androidx.wear:wear:1.0.0</dependency_wearable> + <dependency_wearable>androidx.legacy:legacy-support-v4:1.0.0</dependency_wearable> + <dependency_wearable>androidx.legacy:legacy-support-v13:1.0.0</dependency_wearable> + <dependency_wearable>androidx.constraintlayout:constraintlayout:1.1.3</dependency_wearable> + <dependency_wearable>androidx.appcompat:appcompat:1.0.2</dependency_wearable> <strings> |