Build beautifully for Android Wear’s Round Screen using API 23’s -round identifier

Using the Wear UI Library | Android Developers

Syncing Data Between Android Handhelds and Wearables – Developer.com

original source : https://developer.android.com/training/wearables/apps/debugging.html

실제 기기들을 이용해서 하는 debug 설정

mobile은 usb로 개발용 컴퓨터에 연결, wear는 bluetooth를 통해 mobile을 거쳐 r개발용 컴퓨터에 연결하는 방법

Enable Developer Options on your watch

Before you can debug on your watch you must enable developer options. You only need to do this one time. Developer options remain enabled until you disable them.

  1. Open the watch’s Settings.
  2. Tap System > About.
  3. Scroll to Build number and tap the build number seven times.
  4. A dialog will appear confirming that you are now a developer.

Debugging over Bluetooth

Bluetooth debugging only works for Android-paired watches. Before you begin, be sure the watch and phone are paired and you’ve enabled developer options on the watch. You should also be sure that developer options is also enabled on the phone. To check, open the phone’s Settings menu, selectAbout phone and click the build number seven times.

Enable USB debugging on the phone

  1. Open the phone’s Settings menu.
  2. Select Developer Options and enable USB debugging.

Enable ADB/Bluetooth debugging on the watch

  1. Open the watch’s Settings menu.
  2. Scroll to Developer Options.
  3. Confirm that ADB debugging is enabled.
  4. Enable Debug over Bluetooth.

Enable Bluetooth debugging on the phone

(mobile기기에 설치된 android wear 앱의 기본화면)

image

(mobile기기에 설치된 android wear 앱의 설정화면)

image

(하단의 Debugging over Bluetooth 을 enale해야한다. 5번 내용)

  1. On the phone, open the Android Wear companion app.
  2. Tap the Settings icon.
  3. Enable Debugging over Bluetooth. A status message appears under the option. It looks like this:
Host: disconnected
Target: connected

At this point the development machine (the host) is not communicating with with the watch (the target). You need to complete the link.

Connect the debugger to the watch

In this final step, you’ll use everything: the debugger, the phone, and the watch.

C:UsersjacobAppDataLocalAndroidsdkplatform-tools> 경로안에 adb 가들어있다. 그러므로 이 폴더 안으로 들어가서 아래 명령어를 실행한다.

(이작업은 handheld기기가 컴퓨터와 연결이 끊어지거나 android studio 가 새로 시작되면 매번 다시해야 하는 작업이다.)

image
adb forward tcp:4444 localabstract:/adb-hub
adb connect 127.0.0.1:4444

Note: You must use the IP address 127.0.0.1. You can use any available port on your development machine. Be sure you use the same port in both commands. (In this example the port is 4444.)

Host: connected
Target: connected

The watch is now connected to the debugger and you’re ready to start debugging.

When you debug a watch using Bluetooth, adb always uses the IP address 127.0.0.1 plus the port that you assigned. Therefore, all adb commands use this format (continuing the example, the port is 4444):

adb -s 127.0.0.1:4444 <command> 

If you are not using the emulator and have only one device connected for debugging, you don’t need to specify the address at all:

adb <command>

mac os의 경우 
https://stackoverflow.com/questions/17901692/set-up-adb-on-mac-os-x

Option 2 – Manually (just the platform tools)

This is the easiest way to get a manual installation of ADB and Fastboot.

Delete your old installation (optional)

rm -rf ~/.android-sdk-macosx/

Navigate to https://developer.android.com/studio/releases/platform-tools.html and click on the SDK Platform-Tools for Mac link.

Go to your Downloads folder

cd ~/Downloads/

Unzip the tools you downloaded

unzip platform-tools-latest*.zip 

Move them somewhere you won’t accidentally delete them

mkdir ~/.android-sdk-macosx
mv platform-tools/ ~/.android-sdk-macosx/platform-tools

Add platform-tools to your path

echo 'export PATH=$PATH:~/.android-sdk-macosx/platform-tools/' >> ~/.bash_profile

Refresh your bash profile (or restart your terminal app)

source ~/.bash_profile

Start using adb

adb devices

original source : https://developer.android.com/training/wearables/apps/debugging.html

실제 기기들을 이용해서 하는 debug 설정

mobile은 usb로 개발용 컴퓨터에 연결, wear는 bluetooth를 통해 mobile을 거쳐 r개발용 컴퓨터에 연결하는 방법

Enable Developer Options on your watch

Before you can debug on your watch you must enable developer options. You only need to do this one time. Developer options remain enabled until you disable them.

  1. Open the watch’s Settings.
  2. Tap System > About.
  3. Scroll to Build number and tap the build number seven times.
  4. A dialog will appear confirming that you are now a developer.

Debugging over Bluetooth

Bluetooth debugging only works for Android-paired watches. Before you begin, be sure the watch and phone are paired and you’ve enabled developer options on the watch. You should also be sure that developer options is also enabled on the phone. To check, open the phone’s Settings menu, selectAbout phone and click the build number seven times.

Enable USB debugging on the phone

  1. Open the phone’s Settings menu.
  2. Select Developer Options and enable USB debugging.

Enable ADB/Bluetooth debugging on the watch

  1. Open the watch’s Settings menu.
  2. Scroll to Developer Options.
  3. Confirm that ADB debugging is enabled.
  4. Enable Debug over Bluetooth.

Enable Bluetooth debugging on the phone

(mobile기기에 설치된 android wear 앱의 기본화면)

image

(mobile기기에 설치된 android wear 앱의 설정화면)

image

(하단의 Debugging over Bluetooth 을 enale해야한다. 5번 내용)

  1. On the phone, open the Android Wear companion app.
  2. Tap the Settings icon.
  3. Enable Debugging over Bluetooth. A status message appears under the option. It looks like this:
Host: disconnected
Target: connected

At this point the development machine (the host) is not communicating with with the watch (the target). You need to complete the link.

Connect the debugger to the watch

In this final step, you’ll use everything: the debugger, the phone, and the watch.

C:UsersjacobAppDataLocalAndroidsdkplatform-tools> 경로안에 adb 가들어있다. 그러므로 이 폴더 안으로 들어가서 아래 명령어를 실행한다.

(이작업은 handheld기기가 컴퓨터와 연결이 끊어지거나 android studio 가 새로 시작되면 매번 다시해야 하는 작업이다.)

image
adb forward tcp:4444 localabstract:/adb-hub
adb connect 127.0.0.1:4444

Note: You must use the IP address 127.0.0.1. You can use any available port on your development machine. Be sure you use the same port in both commands. (In this example the port is 4444.)

Host: connected
Target: connected

The watch is now connected to the debugger and you’re ready to start debugging.

When you debug a watch using Bluetooth, adb always uses the IP address 127.0.0.1 plus the port that you assigned. Therefore, all adb commands use this format (continuing the example, the port is 4444):

adb -s 127.0.0.1:4444 <command> 

If you are not using the emulator and have only one device connected for debugging, you don’t need to specify the address at all:

adb <command>

mac os의 경우 
https://stackoverflow.com/questions/17901692/set-up-adb-on-mac-os-x

Option 2 – Manually (just the platform tools)

This is the easiest way to get a manual installation of ADB and Fastboot.

Delete your old installation (optional)

rm -rf ~/.android-sdk-macosx/

Navigate to https://developer.android.com/studio/releases/platform-tools.html and click on the SDK Platform-Tools for Mac link.

Go to your Downloads folder

cd ~/Downloads/

Unzip the tools you downloaded

unzip platform-tools-latest*.zip 

Move them somewhere you won’t accidentally delete them

mkdir ~/.android-sdk-macosx
mv platform-tools/ ~/.android-sdk-macosx/platform-tools

Add platform-tools to your path

echo 'export PATH=$PATH:~/.android-sdk-macosx/platform-tools/' >> ~/.bash_profile

Refresh your bash profile (or restart your terminal app)

source ~/.bash_profile

Start using adb

adb devices

original source : http://www.androiddocs.com/training/wearables/ui/lists.html

Creating Lists

Lists let users select an item from a set of choices easily on wearable devices.

The Wearable UI Library includes the WearableListView class .

To create a list in your Android Wear apps:

  1. Add a WearableListView element to your activity’s layout definition.
  2. Create a custom layout implementation for your list items.
  3. Use this implementation to create a layout definition file for your list items.
  4. Create an adapter to populate the list.
  5. Assign the adapter to the WearableListView element

Add a List View

<android.support.wearable.view.BoxInsetLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:background="@drawable/robot_background"
   android:layout_height="match_parent"
   android:layout_width="match_parent">

   <FrameLayout
       android:id="@+id/frame_layout"
       android:layout_height="match_parent"
       android:layout_width="match_parent"
       app:layout_box="left|bottom|right">

       <android.support.wearable.view.WearableListView
           android:id="@+id/wearable_list"
           android:layout_height="match_parent"
           android:layout_width="match_parent">
       </android.support.wearable.view.WearableListView>
   </FrameLayout>
</android.support.wearable.view.BoxInsetLayout>



Create a Layout Implementation for List Items

This layout also implements the methods in the WearableListView.OnCenterProximityListener interface to change the color of the item’s icon and fade the text in response to events from WearableListView as the user scrolls through the list.

public class WearableListItemLayout extends LinearLayout
            implements WearableListView.OnCenterProximityListener {

   private ImageView mCircle;
   private TextView mName;

   private final float mFadedTextAlpha;
   private final int mFadedCircleColor;
   private final int mChosenCircleColor;

   public WearableListItemLayout(Context context) {
       this(context, null);
   }

   public WearableListItemLayout(Context context, AttributeSet attrs) {
       this(context, attrs, 0);
   }

   public WearableListItemLayout(Context context, AttributeSet attrs,
                                 int defStyle) {
       super(context, attrs, defStyle);

       mFadedTextAlpha = getResources()
                        .getInteger(R.integer.action_text_faded_alpha) / 100f;
       mFadedCircleColor = getResources().getColor(R.color.grey);
       mChosenCircleColor = getResources().getColor(R.color.blue);
   }

   // Get references to the icon and text in the item layout definition
   @Override
   protected void onFinishInflate() {
       super.onFinishInflate();
       // These are defined in the layout file for list items
       // (see next section)
       mCircle = (ImageView) findViewById(R.id.circle);
       mName = (TextView) findViewById(R.id.name);
   }

   @Override
   public void onCenterPosition(boolean animate) {
       mName.setAlpha(1f);
       ((GradientDrawable) mCircle.getDrawable()).setColor(mChosenCircleColor);
   }

   @Override
   public void onNonCenterPosition(boolean animate) {
       ((GradientDrawable) mCircle.getDrawable()).setColor(mFadedCircleColor);
       mName.setAlpha(mFadedTextAlpha);
   }
}



Create a Layout Definition for Items

res/layout/list_item.xml

<com.example.android.support.wearable.notifications.WearableListItemLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:gravity="center_vertical"
   android:layout_width="match_parent"
   android:layout_height="80dp">
   <ImageView
       android:id="@+id/circle"
       android:layout_height="20dp"
       android:layout_margin="16dp"
       android:layout_width="20dp"
       android:src="@drawable/wl_circle"/>
   <TextView
       android:id="@+id/name"
       android:gravity="center_vertical|left"
       android:layout_width="wrap_content"
       android:layout_marginRight="16dp"
       android:layout_height="match_parent"
       android:fontFamily="sans-serif-condensed-light"
       android:lineSpacingExtra="-4sp"
       android:textColor="@color/text_color"
       android:textSize="16sp"/>
</com.example.android.support.wearable.notifications.WearableListItemLayout>



Create an Adapter to Populate the List

private static final class Adapter extends WearableListView.Adapter {
   private String[] mDataset;
   private final Context mContext;
   private final LayoutInflater mInflater;

   // Provide a suitable constructor (depends on the kind of dataset)
   public Adapter(Context context, String[] dataset) {
       mContext = context;
       mInflater = LayoutInflater.from(context);
       mDataset = dataset;
   }

   // Provide a reference to the type of views you're using
   public static class ItemViewHolder extends WearableListView.ViewHolder {
       private TextView textView;
       public ItemViewHolder(View itemView) {
           super(itemView);
           // find the text view within the custom item's layout
           textView = (TextView) itemView.findViewById(R.id.name);
       }
   }

   // Create new views for list items
   // (invoked by the WearableListView's layout manager)
   @Override
   public WearableListView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                         int viewType) {
       // Inflate our custom layout for list items
       return new ItemViewHolder(mInflater.inflate(R.layout.list_item, null));
   }

   // Replace the contents of a list item
   // Instead of creating new views, the list tries to recycle existing ones
   // (invoked by the WearableListView's layout manager)
   @Override
   public void onBindViewHolder(WearableListView.ViewHolder holder,
                                int position) {
       // retrieve the text view
       ItemViewHolder itemHolder = (ItemViewHolder) holder;
       TextView view = itemHolder.textView;
       // replace text contents
       view.setText(mDataset[position]);
       // replace list item's metadata
       holder.itemView.setTag(position);
   }

   // Return the size of your dataset
   // (invoked by the WearableListView's layout manager)
   @Override
   public int getItemCount() {
       return mDataset.length;
   }
}



Associate the Adapter and Set a Click Listener

public class WearActivity extends Activity
                         implements WearableListView.ClickListener {

   // Sample dataset for the list
   String[] elements = { "List Item 1", "List Item 2", ... };

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.my_list_activity);

       // Get the list component from the layout of the activity
       WearableListView listView =
           (WearableListView) findViewById(R.id.wearable_list);

       // Assign an adapter to the list
       listView.setAdapter(new Adapter(this, elements));

       // Set a click listener
       listView.setClickListener(this);
   }

   // WearableListView click listener
   @Override
   public void onClick(WearableListView.ViewHolder v) {
       Integer tag = (Integer) v.itemView.getTag();
       // use this data to complete some action ...
   }

   @Override
   public void onTopEmptyRegionClick() {
   }
}

original source : http://www.androiddocs.com/training/wearables/ui/lists.html

Creating Lists

Lists let users select an item from a set of choices easily on wearable devices.

The Wearable UI Library includes the WearableListView class .

To create a list in your Android Wear apps:

  1. Add a WearableListView element to your activity’s layout definition.
  2. Create a custom layout implementation for your list items.
  3. Use this implementation to create a layout definition file for your list items.
  4. Create an adapter to populate the list.
  5. Assign the adapter to the WearableListView element

Add a List View

<android.support.wearable.view.BoxInsetLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:background="@drawable/robot_background"
   android:layout_height="match_parent"
   android:layout_width="match_parent">

   <FrameLayout
       android:id="@+id/frame_layout"
       android:layout_height="match_parent"
       android:layout_width="match_parent"
       app:layout_box="left|bottom|right">

       <android.support.wearable.view.WearableListView
           android:id="@+id/wearable_list"
           android:layout_height="match_parent"
           android:layout_width="match_parent">
       </android.support.wearable.view.WearableListView>
   </FrameLayout>
</android.support.wearable.view.BoxInsetLayout>



Create a Layout Implementation for List Items

This layout also implements the methods in the WearableListView.OnCenterProximityListener interface to change the color of the item’s icon and fade the text in response to events from WearableListView as the user scrolls through the list.

public class WearableListItemLayout extends LinearLayout
            implements WearableListView.OnCenterProximityListener {

   private ImageView mCircle;
   private TextView mName;

   private final float mFadedTextAlpha;
   private final int mFadedCircleColor;
   private final int mChosenCircleColor;

   public WearableListItemLayout(Context context) {
       this(context, null);
   }

   public WearableListItemLayout(Context context, AttributeSet attrs) {
       this(context, attrs, 0);
   }

   public WearableListItemLayout(Context context, AttributeSet attrs,
                                 int defStyle) {
       super(context, attrs, defStyle);

       mFadedTextAlpha = getResources()
                        .getInteger(R.integer.action_text_faded_alpha) / 100f;
       mFadedCircleColor = getResources().getColor(R.color.grey);
       mChosenCircleColor = getResources().getColor(R.color.blue);
   }

   // Get references to the icon and text in the item layout definition
   @Override
   protected void onFinishInflate() {
       super.onFinishInflate();
       // These are defined in the layout file for list items
       // (see next section)
       mCircle = (ImageView) findViewById(R.id.circle);
       mName = (TextView) findViewById(R.id.name);
   }

   @Override
   public void onCenterPosition(boolean animate) {
       mName.setAlpha(1f);
       ((GradientDrawable) mCircle.getDrawable()).setColor(mChosenCircleColor);
   }

   @Override
   public void onNonCenterPosition(boolean animate) {
       ((GradientDrawable) mCircle.getDrawable()).setColor(mFadedCircleColor);
       mName.setAlpha(mFadedTextAlpha);
   }
}



Create a Layout Definition for Items

res/layout/list_item.xml

<com.example.android.support.wearable.notifications.WearableListItemLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:gravity="center_vertical"
   android:layout_width="match_parent"
   android:layout_height="80dp">
   <ImageView
       android:id="@+id/circle"
       android:layout_height="20dp"
       android:layout_margin="16dp"
       android:layout_width="20dp"
       android:src="@drawable/wl_circle"/>
   <TextView
       android:id="@+id/name"
       android:gravity="center_vertical|left"
       android:layout_width="wrap_content"
       android:layout_marginRight="16dp"
       android:layout_height="match_parent"
       android:fontFamily="sans-serif-condensed-light"
       android:lineSpacingExtra="-4sp"
       android:textColor="@color/text_color"
       android:textSize="16sp"/>
</com.example.android.support.wearable.notifications.WearableListItemLayout>



Create an Adapter to Populate the List

private static final class Adapter extends WearableListView.Adapter {
   private String[] mDataset;
   private final Context mContext;
   private final LayoutInflater mInflater;

   // Provide a suitable constructor (depends on the kind of dataset)
   public Adapter(Context context, String[] dataset) {
       mContext = context;
       mInflater = LayoutInflater.from(context);
       mDataset = dataset;
   }

   // Provide a reference to the type of views you're using
   public static class ItemViewHolder extends WearableListView.ViewHolder {
       private TextView textView;
       public ItemViewHolder(View itemView) {
           super(itemView);
           // find the text view within the custom item's layout
           textView = (TextView) itemView.findViewById(R.id.name);
       }
   }

   // Create new views for list items
   // (invoked by the WearableListView's layout manager)
   @Override
   public WearableListView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                         int viewType) {
       // Inflate our custom layout for list items
       return new ItemViewHolder(mInflater.inflate(R.layout.list_item, null));
   }

   // Replace the contents of a list item
   // Instead of creating new views, the list tries to recycle existing ones
   // (invoked by the WearableListView's layout manager)
   @Override
   public void onBindViewHolder(WearableListView.ViewHolder holder,
                                int position) {
       // retrieve the text view
       ItemViewHolder itemHolder = (ItemViewHolder) holder;
       TextView view = itemHolder.textView;
       // replace text contents
       view.setText(mDataset[position]);
       // replace list item's metadata
       holder.itemView.setTag(position);
   }

   // Return the size of your dataset
   // (invoked by the WearableListView's layout manager)
   @Override
   public int getItemCount() {
       return mDataset.length;
   }
}



Associate the Adapter and Set a Click Listener

public class WearActivity extends Activity
                         implements WearableListView.ClickListener {

   // Sample dataset for the list
   String[] elements = { "List Item 1", "List Item 2", ... };

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.my_list_activity);

       // Get the list component from the layout of the activity
       WearableListView listView =
           (WearableListView) findViewById(R.id.wearable_list);

       // Assign an adapter to the list
       listView.setAdapter(new Adapter(this, elements));

       // Set a click listener
       listView.setClickListener(this);
   }

   // WearableListView click listener
   @Override
   public void onClick(WearableListView.ViewHolder v) {
       Integer tag = (Integer) v.itemView.getTag();
       // use this data to complete some action ...
   }

   @Override
   public void onTopEmptyRegionClick() {
   }
}