1c134b29628280a680fdf2696480166de56074b1eKevin Jin/*
2c134b29628280a680fdf2696480166de56074b1eKevin Jin * Copyright (C) 2013 DroidDriver committers
3c134b29628280a680fdf2696480166de56074b1eKevin Jin *
4c134b29628280a680fdf2696480166de56074b1eKevin Jin * Licensed under the Apache License, Version 2.0 (the "License");
5c134b29628280a680fdf2696480166de56074b1eKevin Jin * you may not use this file except in compliance with the License.
6c134b29628280a680fdf2696480166de56074b1eKevin Jin * You may obtain a copy of the License at
7c134b29628280a680fdf2696480166de56074b1eKevin Jin *
8c134b29628280a680fdf2696480166de56074b1eKevin Jin *      http://www.apache.org/licenses/LICENSE-2.0
9c134b29628280a680fdf2696480166de56074b1eKevin Jin *
10c134b29628280a680fdf2696480166de56074b1eKevin Jin * Unless required by applicable law or agreed to in writing, software
11c134b29628280a680fdf2696480166de56074b1eKevin Jin * distributed under the License is distributed on an "AS IS" BASIS,
12c134b29628280a680fdf2696480166de56074b1eKevin Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c134b29628280a680fdf2696480166de56074b1eKevin Jin * See the License for the specific language governing permissions and
14c134b29628280a680fdf2696480166de56074b1eKevin Jin * limitations under the License.
15c134b29628280a680fdf2696480166de56074b1eKevin Jin */
16c134b29628280a680fdf2696480166de56074b1eKevin Jin
177576fbbba2bf515908b45293b7156b5bfe088938Kevin Jinpackage com.google.android.droiddriver.finders;
18c134b29628280a680fdf2696480166de56074b1eKevin Jin
190858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jinimport android.graphics.Rect;
200858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin
212acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jinimport com.google.android.droiddriver.UiElement;
222acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin
23c134b29628280a680fdf2696480166de56074b1eKevin Jinpublic enum Attribute {
242acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  CHECKABLE("checkable") {
252acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
262acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
272acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
282acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isCheckable();
292acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
302acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
312acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  CHECKED("checked") {
322acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
332acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
342acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
352acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isChecked();
362acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
372acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
382acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  CLASS("class") {
392acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
402acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
412acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public String getValue(UiElement element) {
422acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.getClassName();
432acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
442acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
452acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  CLICKABLE("clickable") {
462acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
472acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
482acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
492acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isClickable();
502acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
512acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
522acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  CONTENT_DESC("content-desc") {
532acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
542acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
552acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public String getValue(UiElement element) {
562acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.getContentDescription();
572acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
582acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
592acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  ENABLED("enabled") {
602acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
612acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
622acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
632acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isEnabled();
642acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
652acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
662acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  FOCUSABLE("focusable") {
672acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
682acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
692acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
702acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isFocusable();
712acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
722acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
732acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  FOCUSED("focused") {
742acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
752acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
762acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
772acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isFocused();
782acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
792acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
802acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  LONG_CLICKABLE("long-clickable") {
812acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
822acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
832acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
842acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isLongClickable();
852acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
862acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
872acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  PACKAGE("package") {
882acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
892acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
902acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public String getValue(UiElement element) {
912acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.getPackageName();
922acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
932acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
942acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  PASSWORD("password") {
952acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
962acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
972acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
982acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isPassword();
992acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
1002acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
1012acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  RESOURCE_ID("resource-id") {
1022acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
1032acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
1042acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public String getValue(UiElement element) {
1052acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.getResourceId();
1062acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
1072acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
1082acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  SCROLLABLE("scrollable") {
1092acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
1102acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
1112acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
1122acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isScrollable();
1132acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
1142acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
1152acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  SELECTED("selected") {
1162acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
1172acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
1182acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public Boolean getValue(UiElement element) {
1192acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.isSelected();
1202acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
1212acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  },
1222acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  TEXT("text") {
1232acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @SuppressWarnings("unchecked")
1242acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    @Override
1252acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    public String getValue(UiElement element) {
1262acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin      return element.getText();
1272acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    }
1280858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin  },
1290858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin  BOUNDS("bounds") {
1300858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin    @SuppressWarnings("unchecked")
1310858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin    @Override
1320858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin    public Rect getValue(UiElement element) {
1330858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin      // TODO: clip by boundsInParent?
1340858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin      return element.getBounds();
1350858f7292b7e7f32c25662d853c9d8ed8db1403fKevin Jin    }
1362acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  };
137c134b29628280a680fdf2696480166de56074b1eKevin Jin
138c134b29628280a680fdf2696480166de56074b1eKevin Jin  private final String name;
139c134b29628280a680fdf2696480166de56074b1eKevin Jin
140c134b29628280a680fdf2696480166de56074b1eKevin Jin  private Attribute(String name) {
141c134b29628280a680fdf2696480166de56074b1eKevin Jin    this.name = name;
142c134b29628280a680fdf2696480166de56074b1eKevin Jin  }
143c134b29628280a680fdf2696480166de56074b1eKevin Jin
144c134b29628280a680fdf2696480166de56074b1eKevin Jin  public String getName() {
145c134b29628280a680fdf2696480166de56074b1eKevin Jin    return name;
146c134b29628280a680fdf2696480166de56074b1eKevin Jin  }
147c134b29628280a680fdf2696480166de56074b1eKevin Jin
1482acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  public abstract <T> T getValue(UiElement element);
1492acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin
1502acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  @Override
1512acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  public String toString() {
1522acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin    return name;
1532acc13e041cb065f90ab7882e095f05cb275dc68Kevin Jin  }
154c134b29628280a680fdf2696480166de56074b1eKevin Jin}
155