diff --git a/tools/data-binding/BindingDemo/.gitignore b/tools/data-binding/BindingDemo/.gitignore new file mode 100644 index 0000000000000..afbdab33e9e79 --- /dev/null +++ b/tools/data-binding/BindingDemo/.gitignore @@ -0,0 +1,6 @@ +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build diff --git a/tools/data-binding/BindingDemo/app/.gitignore b/tools/data-binding/BindingDemo/app/.gitignore new file mode 100644 index 0000000000000..796b96d1c4023 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tools/data-binding/BindingDemo/app/build.gradle b/tools/data-binding/BindingDemo/app/build.gradle new file mode 100644 index 0000000000000..c5e740a283a74 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.birbit.android.databinding' + +android { + compileSdkVersion 21 + buildToolsVersion "21.1.1" + + defaultConfig { + applicationId "com.birbit.android.bindingdemo" + minSdkVersion 15 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:21+' + compile 'com.birbit.android.databinding:library:0.1-SNAPSHOT@aar' + compile 'com.android.support:recyclerview-v7:21+' + compile 'com.android.support:gridlayout-v7:21+' + compile 'com.android.support:cardview-v7:21+' +} diff --git a/tools/data-binding/BindingDemo/app/proguard-rules.pro b/tools/data-binding/BindingDemo/app/proguard-rules.pro new file mode 100644 index 0000000000000..b7210d1d4c973 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/yboyar/android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/tools/data-binding/BindingDemo/app/src/main/AndroidManifest.xml b/tools/data-binding/BindingDemo/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000000..15e9dd0872d10 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/DataBoundAdapter.java b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/DataBoundAdapter.java new file mode 100644 index 0000000000000..35397953d586c --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/DataBoundAdapter.java @@ -0,0 +1,31 @@ +package com.birbit.android.bindingdemo; + +import android.support.v7.widget.RecyclerView; +import android.view.ViewGroup; + +import com.birbit.android.databinding.library.DataBinder; +import com.birbit.android.databinding.library.IViewDataBinder; + +abstract public class DataBoundAdapter + extends RecyclerView.Adapter> { + final int mLayoutId; + final Class mBinderInterface; + public DataBoundAdapter(int mLayoutId, Class mBinderInterface) { + this.mLayoutId = mLayoutId; + this.mBinderInterface = mBinderInterface; + } + + @Override + public DataBoundAdapter.DataBoundViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { + T binder = DataBinder.createBinder(mBinderInterface, viewGroup.getContext(), mLayoutId, viewGroup); + return new DataBoundViewHolder(binder); + } + + static class DataBoundViewHolder extends RecyclerView.ViewHolder { + public final T dataBinder; + public DataBoundViewHolder(T mViewBinder) { + super(mViewBinder.getRoot()); + this.dataBinder = mViewBinder; + } + } +} diff --git a/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/MainActivity.java b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/MainActivity.java new file mode 100644 index 0000000000000..234fbc04860b4 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/MainActivity.java @@ -0,0 +1,208 @@ +package com.birbit.android.bindingdemo; + +import android.support.v7.app.ActionBarActivity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.birbit.android.bindingdemo.generated.BR; +import com.birbit.android.bindingdemo.generated.ListItemBinder; +import com.birbit.android.bindingdemo.generated.MainActivityBinder; +import com.birbit.android.bindingdemo.vo.User; +import com.birbit.android.bindingdemo.vo.Users; +import com.birbit.android.databinding.library.DataBinder; +import com.birbit.android.databinding.library.Observable; +import com.birbit.android.databinding.library.ObservableHelper; +import com.birbit.android.databinding.library.ObservableListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class MainActivity extends ActionBarActivity implements Observable { + UserAdapter tkAdapter; + UserAdapter robotAdapter; + MainActivityBinder dataBinder; + User selected; + ObservableHelper helper; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + helper = new ObservableHelper(this); + dataBinder = DataBinder.createBinder(MainActivityBinder.class, this, R.layout.main_activity, null); + setContentView(dataBinder.getRoot()); + tkAdapter = new UserAdapter(Users.toolkities); + robotAdapter = new UserAdapter(Users.robots); + dataBinder.getToolkittyList().setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + dataBinder.getRobotList().setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + dataBinder.setActivity(this); + dataBinder.rebindDirty(); + } + + public UserAdapter getTkAdapter() { + return tkAdapter; + } + + public UserAdapter getRobotAdapter() { + return robotAdapter; + } + + public User getSelected() { + return selected; + } + + private void setSelected(User selected) { + if (selected == this.selected) { + return; + } + this.selected = selected; + helper.fireChange(BR.selected); + } + + public View.OnClickListener onSave = new View.OnClickListener() { + @Override + public void onClick(View v) { + if (selected == null) { + return; + } + selected.setName(dataBinder.getSelectedName().getText().toString()); + selected.setLastName(dataBinder.getSelectedLastname().getText().toString()); + } + }; + + public View.OnClickListener onUnselect = new View.OnClickListener() { + + @Override + public void onClick(View v) { + setSelected(null); + } + }; + + public View.OnClickListener onDelete = new View.OnClickListener() { + @Override + public void onClick(View v) { + if (selected == null) { + return; + } + if (selected.getGroup() == User.TOOLKITTY) { + tkAdapter.remove(selected); + selected.setGroup(User.ROBOT); + robotAdapter.add(selected); + dataBinder.getRobotList().smoothScrollToPosition(robotAdapter.getItemCount() - 1); + } else { + tkAdapter.add(selected); + dataBinder.getToolkittyList().smoothScrollToPosition(tkAdapter.getItemCount() - 1); + selected.setGroup(User.TOOLKITTY); + robotAdapter.remove(selected); + } + } + }; + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void register(ObservableListener observableListener) { + helper.register(observableListener); + } + + @Override + public void unRegister(ObservableListener observableListener) { + helper.unRegister(observableListener); + } + + public class UserAdapter extends DataBoundAdapter implements View.OnClickListener, Observable { + List userList = new ArrayList<>(); + ObservableHelper mHelper; + public UserAdapter(User[] toolkities) { + super(R.layout.list_item, ListItemBinder.class); + mHelper = new ObservableHelper(this); + userList.addAll(Arrays.asList(toolkities)); + } + + @Override + public DataBoundViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { + DataBoundViewHolder vh = super.onCreateViewHolder(viewGroup, type); + vh.dataBinder.setClickListener(this); + return vh; + } + + @Override + public void onBindViewHolder(DataBoundViewHolder vh, int index) { + vh.dataBinder.setUser(userList.get(index)); + vh.dataBinder.rebindDirty(); + } + + @Override + public int getItemCount() { + return userList.size(); + } + + public void add(User user) { + if (userList.contains(user)) { + return; + } + userList.add(user); + notifyItemInserted(userList.size() - 1); + mHelper.fireChange("itemCount"); + } + + public void remove(User user) { + int i = userList.indexOf(user); + if (i < 0) { + return; + } + userList.remove(i); + notifyItemRemoved(i); + mHelper.fireChange("itemCount"); + } + + @Override + public void onClick(View v) { + RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams(); + final int pos = lp.getViewPosition(); + if (pos > -1 && pos < userList.size()) { + v.requestFocus(); + setSelected(userList.get(pos)); + } else { + setSelected(null); + } + } + + @Override + public void register(ObservableListener observableListener) { + mHelper.register(observableListener); + } + + @Override + public void unRegister(ObservableListener observableListener) { + mHelper.unRegister(observableListener); + } + } +} diff --git a/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/vo/User.java b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/vo/User.java new file mode 100644 index 0000000000000..a805c779bc188 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/vo/User.java @@ -0,0 +1,76 @@ +package com.birbit.android.bindingdemo.vo; + +import android.graphics.Color; + +import com.birbit.android.databinding.library.BaseObservable; + +import java.util.Objects; + +public class User extends BaseObservable { + private String name; + private String lastName; + private int photoResource = 0; + private int favoriteColor = Color.RED; + private int group; + public static final int TOOLKITTY = 1; + public static final int ROBOT = 2; + + public User(String name, String lastName, int photoResource, int group) { + this.name = name; + this.lastName = lastName; + this.photoResource = photoResource; + this.group = group; + } + + public void setGroup(int group) { + if (this.group == group) { + return; + } + this.group = group; + fireChange("group"); + } + + public int getGroup() { + return group; + } + + public String getName() { + return name; + } + + public void setName(String name) { + if (Objects.equals(name, this.name)) { + return; + } + this.name = name; + fireChange("name"); + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + if (Objects.equals(lastName, this.lastName)) { + return; + } + this.lastName = lastName; + fireChange("lastName"); + } + + public int getPhotoResource() { + return photoResource; + } + + public void setPhotoResource(int photoResource) { + if (this.photoResource == photoResource) { + return; + } + this.photoResource = photoResource; + fireChange("photoResource"); + } + + public int getFavoriteColor() { + return favoriteColor; + } +} diff --git a/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/vo/Users.java b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/vo/Users.java new file mode 100644 index 0000000000000..c7b6647506a06 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/java/com/birbit/android/bindingdemo/vo/Users.java @@ -0,0 +1,25 @@ +package com.birbit.android.bindingdemo.vo; + +import com.birbit.android.bindingdemo.R; + +/** + * Created by yboyar on 11/19/14. + */ +public class Users { + public static final User[] robots = new User[]{ + new User("romain", "guy", R.drawable.romain, User.ROBOT), + }; + public static final User[] toolkities = new User[]{ + new User("chet", "haase", R.drawable.chet, User.TOOLKITTY), + new User("adam", "powell", R.drawable.adam, User.TOOLKITTY), + new User("alan", "viverette", R.drawable.alan, User.TOOLKITTY), + new User("chris", "craik", R.drawable.chris, User.TOOLKITTY), + new User("george", "mount", R.drawable.george, User.TOOLKITTY), + new User("john", "reck", R.drawable.john, User.TOOLKITTY), + new User("rob", "tsuk", R.drawable.rob, User.TOOLKITTY), + new User("Teng-Hui", "Zhu", R.drawable.tenghui, User.TOOLKITTY), + new User("yigit", "boyar", R.drawable.yigit, User.TOOLKITTY), + + + }; +} diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable-hdpi/ic_launcher.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000..96a442e5b8e93 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable-mdpi/ic_launcher.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000..359047dfa4ed2 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable-mdpi/ic_launcher.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable-xhdpi/ic_launcher.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000..71c6d760f0518 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000..4df18946442ed Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/adam.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/adam.png new file mode 100644 index 0000000000000..583a06549a7bf Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/adam.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/alan.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/alan.png new file mode 100644 index 0000000000000..c0c91615539cd Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/alan.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/chet.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/chet.png new file mode 100644 index 0000000000000..06cc751c24869 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/chet.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/chris.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/chris.png new file mode 100644 index 0000000000000..11686c556c2da Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/chris.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/george.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/george.png new file mode 100644 index 0000000000000..fe744e04fc02d Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/george.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/john.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/john.png new file mode 100644 index 0000000000000..7bd01080169e7 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/john.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/rob.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/rob.png new file mode 100644 index 0000000000000..fd41cb07bd53f Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/rob.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/romain.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/romain.png new file mode 100644 index 0000000000000..7a9af15b9dcd4 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/romain.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/tenghui.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/tenghui.png new file mode 100644 index 0000000000000..13442b0544a46 Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/tenghui.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/drawable/yigit.png b/tools/data-binding/BindingDemo/app/src/main/res/drawable/yigit.png new file mode 100644 index 0000000000000..57e9bafcdfb5c Binary files /dev/null and b/tools/data-binding/BindingDemo/app/src/main/res/drawable/yigit.png differ diff --git a/tools/data-binding/BindingDemo/app/src/main/res/layout/list_item.xml b/tools/data-binding/BindingDemo/app/src/main/res/layout/list_item.xml new file mode 100644 index 0000000000000..351db09dcb05d --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/res/layout/list_item.xml @@ -0,0 +1,30 @@ + + + + + + \ No newline at end of file diff --git a/tools/data-binding/BindingDemo/app/src/main/res/layout/main_activity.xml b/tools/data-binding/BindingDemo/app/src/main/res/layout/main_activity.xml new file mode 100644 index 0000000000000..02513efd19c19 --- /dev/null +++ b/tools/data-binding/BindingDemo/app/src/main/res/layout/main_activity.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + +