public
Last active

What's Really New: Glass XE7

  • Download Gist
glassxe7_teardown.md
Markdown

Google Glass XE7 was released this week. This time, Google also released a changelog of all the changes. However, I'm a reader of Ron Amadeo's APK Teardown series, and that column taught me to always hunt for hidden changes in updates.

So without further ado, I present:

What's Really New: Glass XE7

Volume change

<string name="volume_settings_header">Volume</string>

This is actually a Lab, which can be enabled through the system property persist.lab.volume_slider. It does what it says on the tin when enabled: a new option in the Settings bundle appears, labelled "Volume", and you can change the volume of the Glass by tapping on the card.

Volume control

Music player


    <string name="musicplayer_menu_play">Play</string>
    <string name="musicplayer_menu_pause">Pause</string>
    <string name="musicplayer_menu_next">Next song</string>
    <string name="musicplayer_menu_previous">Previous song</string>
    <string name="slash">/</string>
    <string name="unknown_album">Unknown album.</string>
    <string name="unknown_artist">Unknown artist.</string>
 <string name="provider_label_audio">Glass Audio</string>

com/google/glass/home/timeline/active/MusicPlayerView.smali

Active-type cards are cards for ongoing events that appear to the left of the homescreen, for example, the navigation card. It seems that this view is for the music player to show its "Now Playing" section.

This card isn't used in any APK I looked at, so the APK for this feature is probably only installed on internal dogfood builds.

Here's my mockup of the playing interface, as interpreted from res/layout/musicplayer.xml: (Sorry about choice of music)

The music player card mockup

Video player

There's a new Lab option called VIDEO_PLAYER, no idea what that does.

Lock screen

There's been work done on a Lock Screen for Glass: This was added to glass-services.odex:

com/google/android/glass/security$ ls *
KnobView$1.smali                        PatternElement.smali
KnobView$Position.smali                 PatternKeeper.smali
KnobView.smali                          SafeImpl$1.smali
LockScreenDialog$1.smali                SafeImpl.smali
LockScreenDialog$IndexedListener.smali  Safe.smali
LockScreenDialog.smali                  SlidingLockView$1.smali
LockStateManager.smali                  SlidingLockView$Listener.smali
PatternElement$Modifier.smali           SlidingLockView.smali
PatternElement$Signal.smali             SlidingLockView$TouchListener.smali

And these was in glass-framework-res.apk:

lockscreen_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:gravity="center" android:orientation="vertical" android:padding="20.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <com.google.android.glass.security.impl.SlidingLockView android:id="@id/lock_1" android:background="#fff90101" android:padding="5.0dip" android:layout_width="fill_parent" android:layout_height="40.0dip" android:layout_margin="5.0dip" />
    <com.google.android.glass.security.impl.SlidingLockView android:id="@id/lock_2" android:background="#ff0266c8" android:padding="5.0dip" android:layout_width="fill_parent" android:layout_height="40.0dip" android:layout_margin="5.0dip" />
    <com.google.android.glass.security.impl.SlidingLockView android:id="@id/lock_3" android:background="#fff2b50f" android:padding="5.0dip" android:layout_width="fill_parent" android:layout_height="40.0dip" android:layout_margin="5.0dip" />
    <com.google.android.glass.security.impl.SlidingLockView android:id="@id/lock_4" android:background="#ff00933b" android:padding="5.0dip" android:layout_width="fill_parent" android:layout_height="40.0dip" android:layout_margin="5.0dip" />
</LinearLayout>

It seems that the Lock Screen is a swiping lock: you would probably swipe up and down to select the knob, and then swipe left or right to enter your lock pattern.

Each lock can take on one Signal and one Modifier, which must be matched to the stored lock pattern to unlock. Here's a list:

.field public static final enum CENTER:Lcom/google/android/glass/security/PatternElement$Signal;

.field public static final enum LEFT:Lcom/google/android/glass/security/PatternElement$Signal;

.field public static final enum REVERSED_LEFT:Lcom/google/android/glass/security/PatternElement$Signal;

.field public static final enum REVERSED_RIGHT:Lcom/google/android/glass/security/PatternElement$Signal;

.field public static final enum RIGHT:Lcom/google/android/glass/security/PatternElement$Signal;
.field public static final enum DOUBLE:Lcom/google/android/glass/security/PatternElement$Modifier;

.field public static final enum SINGLE:Lcom/google/android/glass/security/PatternElement$Modifier;

I might need a Glass Explorer's help for trying to get this to show up. If you have a rooted glass, yell at me. I'll really appreciate it.

Boutique: the Glass Market

public class Boutique {

   public static final String ACTION_SYNC_GLASSWARE = "com.google.glass.boutique.SYNC_GLASSWARE";


}
         else if("glassware_sync".equals(var4)) {
            this.startService(new Intent("com.google.glass.boutique.SYNC_GLASSWARE"));
         }
      Descriptor var0 = internal_static_googlex_glass_common_proto_InstalledGlassware_descriptor;
      String[] var1 = new String[]{"GlasswareId", "ApkMetadata", "IsEnabled"};
      internal_static_googlex_glass_common_proto_InstalledGlassware_fieldAccessorTable = new FieldAccessorTable(var0, var1);
      internal_static_googlex_glass_common_proto_InstalledGlassware_ApkMetadata_descriptor = (Descriptor)internal_static_googlex_glass_common_proto_InstalledGlassware_descriptor.getNestedTypes().get(0);
      Descriptor var2 = internal_static_googlex_glass_common_proto_InstalledGlassware_ApkMetadata_descriptor;
      String[] var3 = new String[]{"VersionLabel", "PackageName"};
      internal_static_googlex_glass_common_proto_InstalledGlassware_ApkMetadata_fieldAccessorTable = new FieldAccessorTable(var2, var3);
      internal_static_googlex_glass_common_proto_GlasswareSyncRequest_descriptor = (Descriptor)getDescriptor().getMessageTypes().get(1);
      internal_static_googlex_glass_common_proto_GlasswareSyncRequest_fieldAccessorTable = new FieldAccessorTable(internal_static_googlex_glass_common_proto_GlasswareSyncRequest_descriptor, new String[0]);
      internal_static_googlex_glass_common_proto_GlasswareSyncResponse_descriptor = (Descriptor)getDescriptor().getMessageTypes().get(2);
      Descriptor var4 = internal_static_googlex_glass_common_proto_GlasswareSyncResponse_descriptor;
      String[] var5 = new String[]{"InstalledGlassware"};
      internal_static_googlex_glass_common_proto_GlasswareSyncResponse_fieldAccessorTable = new FieldAccessorTable(var4, var5);

This is easily the coolest hidden feature of the Glass update: there's signs of work on an application market for Glass applications.

Currently, there is no central repository for Google Glass applications. It seems that Boutique will fix this problem, by allowing Glassware and APKs to sync down to the Glass. There's code to sync the installed list of Glassware and to send currently installed native APKs.

The mention of APKs also suggest that a native app SDK for Glass is in the works. Currently, the only supported way of developing applications to Glass is via the Mirror API, which allows you to push messages to the Glass via the Internet. Updating cards using a data connection is, of course, slow, so a native application will reduce the latency and make certain use cases, such as augmented reality, possible.

Sadly, like Music, it seems the APK for this feature is removed for the public builds, so we don't know what it looks like.

Random stuff

There's a new drawable for a red microphone icon. Is this used anywhere?

There's a new action called "com.google.android.glass.action.CLUTCH", which launches the PEOPLE_GRID lab, currently disabled. It seems it's a head-scrolling version of the released contact list. I have no idea how to activate that - anybody have any guesses?

There's a filtered timeline activity that seems to be for showing timeline cards from only a certain contact. I haven't gotten this to work.

PackageInstaller is now included, but, sadly, the Glass Browser doesn't support downloads as far as I can tell, so you still need to install APKs via ADB.

There's been work done on pushing cards from native APKs. A lot of changes were made to the LiveCards in the TimelineManager in the glass-services framework.

Glass has some sort of volume control which works when you pair it with a smartphone. While making a call you can change the Glass volume by decreasing volume on the smartphone.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.