From 3de7eb9aa025bd51eed963efcd121d3fbf891d33 Mon Sep 17 00:00:00 2001 From: Adrian Pena Date: Wed, 6 Jan 2016 22:45:10 -0500 Subject: [PATCH] Migrated projects to Android Studio / Gradle --- wheel-demo/.classpath | 9 - wheel-demo/.gitignore | 105 + wheel-demo/.project | 40 - wheel-demo/app/.gitignore | 1 + wheel-demo/app/build.gradle | 26 + wheel-demo/app/proguard-rules.pro | 17 + .../wheel/demo/extended/ApplicationTest.java | 13 + .../{ => app/src/main}/AndroidManifest.xml | 43 +- .../wheel/demo/extended/CitiesActivity.java | 227 +- .../wheel/demo/extended/DateActivity.java | 0 .../demo/extended/HoloWheelActivity.java | 0 .../wheel/demo/extended/PasswActivity.java | 268 +-- .../demo/extended/SlotMachineActivity.java | 0 .../wheel/demo/extended/SpeedActivity.java | 0 .../wheel/demo/extended/Time2Activity.java | 0 .../wheel/demo/extended/TimeActivity.java | 238 +-- .../kankan/wheel/demo/extended/WheelDemo.java | 256 +-- .../src/main}/res/drawable/canada.png | Bin .../src/main}/res/drawable/france.png | Bin .../src/main}/res/drawable/layout_bg.xml | 54 +- .../src/main}/res/drawable/layout_bg_holo.xml | 54 +- .../src/main}/res/drawable/ukraine.png | Bin .../{ => app/src/main}/res/drawable/usa.png | Bin .../src/main}/res/drawable/wheel_bg_holo.xml | 60 +- .../src/main}/res/drawable/wheel_val_holo.xml | 0 .../main}/res/layout/cities_holo_layout.xml | 0 .../src/main}/res/layout/cities_layout.xml | 0 .../src/main}/res/layout/city_holo_layout.xml | 0 .../src/main}/res/layout/country_layout.xml | 0 .../src/main}/res/layout/date_layout.xml | 0 .../src/main}/res/layout/passw_layout.xml | 0 .../src/main}/res/layout/slot_item.xml | 0 .../main}/res/layout/slot_machine_layout.xml | 0 .../src/main}/res/layout/speed1_layout.xml | 0 .../src/main}/res/layout/time2_day.xml | 0 .../src/main}/res/layout/time2_layout.xml | 0 .../src/main}/res/layout/time_layout.xml | 0 .../src/main}/res/layout/units_item.xml | 0 .../src/main}/res/layout/wheel_text_item.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes wheel-demo/app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 3 + wheel-demo/app/src/main/res/values/styles.xml | 3 + .../wheel/demo/extended/ExampleUnitTest.java | 15 + wheel-demo/build.gradle | 23 + wheel-demo/gradle.properties | 18 + wheel-demo/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53637 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + wheel-demo/gradlew | 160 ++ wheel-demo/gradlew.bat | 90 + wheel-demo/project.properties | 17 - wheel-demo/res/drawable-hdpi/icon.png | Bin 4147 -> 0 bytes wheel-demo/res/drawable-hdpi/my_icon.png | Bin 13834 -> 0 bytes wheel-demo/res/drawable-hdpi/wheel.png | Bin 4763 -> 0 bytes wheel-demo/res/drawable-ldpi/icon.png | Bin 1723 -> 0 bytes wheel-demo/res/drawable-mdpi/icon.png | Bin 2574 -> 0 bytes wheel-demo/settings.gradle | 1 + wheel-demo/wheel-release/build.gradle | 2 + wheel-demo/wheel-release/wheel-release.aar | Bin 0 -> 25662 bytes wheel/.classpath | 8 - wheel/.gitignore | 105 + wheel/.project | 33 - wheel/AndroidManifest.xml | 7 - wheel/build.gradle | 23 + wheel/gradle.properties | 18 + wheel/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53637 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + wheel/gradlew | 160 ++ wheel/gradlew.bat | 90 + wheel/project.properties | 17 - wheel/settings.gradle | 1 + wheel/wheel/.gitignore | 1 + wheel/wheel/build.gradle | 24 + wheel/wheel/proguard-rules.pro | 17 + .../kankan/wheel/widget/ApplicationTest.java | 13 + wheel/wheel/src/main/AndroidManifest.xml | 11 + .../java}/kankan/wheel/widget/ItemsRange.java | 0 .../wheel/widget/OnWheelChangedListener.java | 0 .../wheel/widget/OnWheelClickedListener.java | 0 .../wheel/widget/OnWheelScrollListener.java | 0 .../kankan/wheel/widget/WheelAdapter.java | 92 +- .../kankan/wheel/widget/WheelRecycle.java | 6 +- .../kankan/wheel/widget/WheelScroller.java | 0 .../java}/kankan/wheel/widget/WheelView.java | 1876 ++++++++--------- .../widget/adapters/AbstractWheelAdapter.java | 6 +- .../adapters/AbstractWheelTextAdapter.java | 0 .../wheel/widget/adapters/AdapterWheel.java | 3 +- .../widget/adapters/ArrayWheelAdapter.java | 0 .../widget/adapters/NumericWheelAdapter.java | 0 .../widget/adapters/WheelViewAdapter.java | 2 +- .../src/main}/res/drawable/wheel_bg.xml | 82 +- .../src/main}/res/drawable/wheel_val.xml | 58 +- wheel/wheel/src/main/res/values/strings.xml | 3 + .../kankan/wheel/widget/ExampleUnitTest.java | 15 + 98 files changed, 2637 insertions(+), 1795 deletions(-) delete mode 100644 wheel-demo/.classpath create mode 100644 wheel-demo/.gitignore delete mode 100644 wheel-demo/.project create mode 100644 wheel-demo/app/.gitignore create mode 100644 wheel-demo/app/build.gradle create mode 100644 wheel-demo/app/proguard-rules.pro create mode 100644 wheel-demo/app/src/androidTest/java/kankan/wheel/demo/extended/ApplicationTest.java rename wheel-demo/{ => app/src/main}/AndroidManifest.xml (77%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/CitiesActivity.java (95%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/DateActivity.java (100%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/HoloWheelActivity.java (100%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/PasswActivity.java (96%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/SlotMachineActivity.java (100%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/SpeedActivity.java (100%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/Time2Activity.java (100%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/TimeActivity.java (96%) rename wheel-demo/{src => app/src/main/java}/kankan/wheel/demo/extended/WheelDemo.java (96%) rename wheel-demo/{ => app/src/main}/res/drawable/canada.png (100%) rename wheel-demo/{ => app/src/main}/res/drawable/france.png (100%) rename wheel-demo/{ => app/src/main}/res/drawable/layout_bg.xml (97%) rename wheel-demo/{ => app/src/main}/res/drawable/layout_bg_holo.xml (97%) rename wheel-demo/{ => app/src/main}/res/drawable/ukraine.png (100%) rename wheel-demo/{ => app/src/main}/res/drawable/usa.png (100%) rename wheel-demo/{ => app/src/main}/res/drawable/wheel_bg_holo.xml (97%) rename wheel-demo/{ => app/src/main}/res/drawable/wheel_val_holo.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/cities_holo_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/cities_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/city_holo_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/country_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/date_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/passw_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/slot_item.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/slot_machine_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/speed1_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/time2_day.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/time2_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/time_layout.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/units_item.xml (100%) rename wheel-demo/{ => app/src/main}/res/layout/wheel_text_item.xml (100%) create mode 100644 wheel-demo/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 wheel-demo/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 wheel-demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 wheel-demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 wheel-demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 wheel-demo/app/src/main/res/values/colors.xml create mode 100644 wheel-demo/app/src/main/res/values/strings.xml create mode 100644 wheel-demo/app/src/main/res/values/styles.xml create mode 100644 wheel-demo/app/src/test/java/kankan/wheel/demo/extended/ExampleUnitTest.java create mode 100644 wheel-demo/build.gradle create mode 100644 wheel-demo/gradle.properties create mode 100644 wheel-demo/gradle/wrapper/gradle-wrapper.jar create mode 100644 wheel-demo/gradle/wrapper/gradle-wrapper.properties create mode 100755 wheel-demo/gradlew create mode 100644 wheel-demo/gradlew.bat delete mode 100644 wheel-demo/project.properties delete mode 100644 wheel-demo/res/drawable-hdpi/icon.png delete mode 100644 wheel-demo/res/drawable-hdpi/my_icon.png delete mode 100644 wheel-demo/res/drawable-hdpi/wheel.png delete mode 100644 wheel-demo/res/drawable-ldpi/icon.png delete mode 100644 wheel-demo/res/drawable-mdpi/icon.png create mode 100644 wheel-demo/settings.gradle create mode 100644 wheel-demo/wheel-release/build.gradle create mode 100644 wheel-demo/wheel-release/wheel-release.aar delete mode 100644 wheel/.classpath create mode 100644 wheel/.gitignore delete mode 100644 wheel/.project delete mode 100644 wheel/AndroidManifest.xml create mode 100644 wheel/build.gradle create mode 100644 wheel/gradle.properties create mode 100644 wheel/gradle/wrapper/gradle-wrapper.jar create mode 100644 wheel/gradle/wrapper/gradle-wrapper.properties create mode 100755 wheel/gradlew create mode 100644 wheel/gradlew.bat delete mode 100644 wheel/project.properties create mode 100644 wheel/settings.gradle create mode 100644 wheel/wheel/.gitignore create mode 100644 wheel/wheel/build.gradle create mode 100644 wheel/wheel/proguard-rules.pro create mode 100644 wheel/wheel/src/androidTest/java/kankan/wheel/widget/ApplicationTest.java create mode 100644 wheel/wheel/src/main/AndroidManifest.xml rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/ItemsRange.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/OnWheelChangedListener.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/OnWheelClickedListener.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/OnWheelScrollListener.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/WheelAdapter.java (96%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/WheelRecycle.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/WheelScroller.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/WheelView.java (95%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/adapters/AbstractWheelAdapter.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/adapters/AbstractWheelTextAdapter.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/adapters/AdapterWheel.java (99%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/adapters/ArrayWheelAdapter.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/adapters/NumericWheelAdapter.java (100%) rename wheel/{src => wheel/src/main/java}/kankan/wheel/widget/adapters/WheelViewAdapter.java (97%) rename wheel/{ => wheel/src/main}/res/drawable/wheel_bg.xml (97%) rename wheel/{ => wheel/src/main}/res/drawable/wheel_val.xml (97%) create mode 100644 wheel/wheel/src/main/res/values/strings.xml create mode 100644 wheel/wheel/src/test/java/kankan/wheel/widget/ExampleUnitTest.java diff --git a/wheel-demo/.classpath b/wheel-demo/.classpath deleted file mode 100644 index 00b0209..0000000 --- a/wheel-demo/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/wheel-demo/.gitignore b/wheel-demo/.gitignore new file mode 100644 index 0000000..17c1fe6 --- /dev/null +++ b/wheel-demo/.gitignore @@ -0,0 +1,105 @@ +# Created by https://www.gitignore.io/api/android,intellij,gradle + +.DS_Store + +### Android ### +# Built application files +*.apk +*.ap_ + +# Files for the Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +### Android Patch ### +gen-external-apklibs + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +.idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries +# .idea/shelf + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + + +### Gradle ### +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache diff --git a/wheel-demo/.project b/wheel-demo/.project deleted file mode 100644 index 6906965..0000000 --- a/wheel-demo/.project +++ /dev/null @@ -1,40 +0,0 @@ - - - wheel-demo - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - - - wheel_src - 2 - _android_wheel_6bdbb5b/src - - - diff --git a/wheel-demo/app/.gitignore b/wheel-demo/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/wheel-demo/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/wheel-demo/app/build.gradle b/wheel-demo/app/build.gradle new file mode 100644 index 0000000..a8c2b53 --- /dev/null +++ b/wheel-demo/app/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "kankan.wheel.demo.extended" + minSdkVersion 5 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile project(':wheel-release') + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' +} diff --git a/wheel-demo/app/proguard-rules.pro b/wheel-demo/app/proguard-rules.pro new file mode 100644 index 0000000..0b3ef79 --- /dev/null +++ b/wheel-demo/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/penaa/.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/wheel-demo/app/src/androidTest/java/kankan/wheel/demo/extended/ApplicationTest.java b/wheel-demo/app/src/androidTest/java/kankan/wheel/demo/extended/ApplicationTest.java new file mode 100644 index 0000000..6920669 --- /dev/null +++ b/wheel-demo/app/src/androidTest/java/kankan/wheel/demo/extended/ApplicationTest.java @@ -0,0 +1,13 @@ +package kankan.wheel.demo.extended; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/wheel-demo/AndroidManifest.xml b/wheel-demo/app/src/main/AndroidManifest.xml similarity index 77% rename from wheel-demo/AndroidManifest.xml rename to wheel-demo/app/src/main/AndroidManifest.xml index 3eda0ea..6f1b7ce 100644 --- a/wheel-demo/AndroidManifest.xml +++ b/wheel-demo/app/src/main/AndroidManifest.xml @@ -1,25 +1,24 @@ - - - - - + package="kankan.wheel.demo.extended"> + + - - + + - - - + + + - + @@ -32,24 +31,24 @@ - - + + - + - - + + - + @@ -62,8 +61,6 @@ - - - \ No newline at end of file + diff --git a/wheel-demo/src/kankan/wheel/demo/extended/CitiesActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/CitiesActivity.java similarity index 95% rename from wheel-demo/src/kankan/wheel/demo/extended/CitiesActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/CitiesActivity.java index 250f721..2389639 100644 --- a/wheel-demo/src/kankan/wheel/demo/extended/CitiesActivity.java +++ b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/CitiesActivity.java @@ -1,114 +1,113 @@ -package kankan.wheel.demo.extended; - -import kankan.wheel.demo.extended.R; -import kankan.wheel.widget.OnWheelChangedListener; -import kankan.wheel.widget.OnWheelScrollListener; -import kankan.wheel.widget.WheelView; -import kankan.wheel.widget.adapters.AbstractWheelTextAdapter; -import kankan.wheel.widget.adapters.ArrayWheelAdapter; - -import android.app.Activity; -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -public class CitiesActivity extends Activity { - // Scrolling flag - private boolean scrolling = false; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.cities_layout); - - final WheelView country = (WheelView) findViewById(R.id.country); - country.setVisibleItems(3); - country.setViewAdapter(new CountryAdapter(this)); - - final String cities[][] = new String[][] { - new String[] {"New York", "Washington", "Chicago", "Atlanta", "Orlando"}, - new String[] {"Ottawa", "Vancouver", "Toronto", "Windsor", "Montreal"}, - new String[] {"Kiev", "Dnipro", "Lviv", "Kharkiv"}, - new String[] {"Paris", "Bordeaux"}, - }; - - final WheelView city = (WheelView) findViewById(R.id.city); - city.setVisibleItems(5); - - country.addChangingListener(new OnWheelChangedListener() { - @Override - public void onChanged(WheelView wheel, int oldValue, int newValue) { - if (!scrolling) { - updateCities(city, cities, newValue); - } - } - }); - - country.addScrollingListener( new OnWheelScrollListener() { - @Override - public void onScrollingStarted(WheelView wheel) { - scrolling = true; - } - @Override - public void onScrollingFinished(WheelView wheel) { - scrolling = false; - updateCities(city, cities, country.getCurrentItem()); - } - }); - - country.setCurrentItem(1); - } - - /** - * Updates the city wheel - */ - private void updateCities(WheelView city, String cities[][], int index) { - ArrayWheelAdapter adapter = - new ArrayWheelAdapter(this, cities[index]); - adapter.setTextSize(18); - city.setViewAdapter(adapter); - city.setCurrentItem(cities[index].length / 2); - } - - /** - * Adapter for countries - */ - private class CountryAdapter extends AbstractWheelTextAdapter { - // Countries names - private String countries[] = - new String[] {"USA", "Canada", "Ukraine", "France"}; - // Countries flags - private int flags[] = - new int[] {R.drawable.usa, R.drawable.canada, R.drawable.ukraine, R.drawable.france}; - - /** - * Constructor - */ - protected CountryAdapter(Context context) { - super(context, R.layout.country_layout, NO_RESOURCE); - - setItemTextResource(R.id.country_name); - } - - @Override - public View getItem(int index, View cachedView, ViewGroup parent) { - View view = super.getItem(index, cachedView, parent); - ImageView img = (ImageView) view.findViewById(R.id.flag); - img.setImageResource(flags[index]); - return view; - } - - @Override - public int getItemsCount() { - return countries.length; - } - - @Override - protected CharSequence getItemText(int index) { - return countries[index]; - } - } -} +package kankan.wheel.demo.extended; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import kankan.wheel.widget.OnWheelChangedListener; +import kankan.wheel.widget.OnWheelScrollListener; +import kankan.wheel.widget.WheelView; +import kankan.wheel.widget.adapters.AbstractWheelTextAdapter; +import kankan.wheel.widget.adapters.ArrayWheelAdapter; + +public class CitiesActivity extends Activity { + // Scrolling flag + private boolean scrolling = false; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.cities_layout); + + final WheelView country = (WheelView) findViewById(R.id.country); + country.setVisibleItems(3); + country.setViewAdapter(new CountryAdapter(this)); + + final String cities[][] = new String[][] { + new String[] {"New York", "Washington", "Chicago", "Atlanta", "Orlando"}, + new String[] {"Ottawa", "Vancouver", "Toronto", "Windsor", "Montreal"}, + new String[] {"Kiev", "Dnipro", "Lviv", "Kharkiv"}, + new String[] {"Paris", "Bordeaux"}, + }; + + final WheelView city = (WheelView) findViewById(R.id.city); + city.setVisibleItems(5); + + country.addChangingListener(new OnWheelChangedListener() { + @Override + public void onChanged(WheelView wheel, int oldValue, int newValue) { + if (!scrolling) { + updateCities(city, cities, newValue); + } + } + }); + + country.addScrollingListener( new OnWheelScrollListener() { + @Override + public void onScrollingStarted(WheelView wheel) { + scrolling = true; + } + @Override + public void onScrollingFinished(WheelView wheel) { + scrolling = false; + updateCities(city, cities, country.getCurrentItem()); + } + }); + + country.setCurrentItem(1); + } + + /** + * Updates the city wheel + */ + private void updateCities(WheelView city, String cities[][], int index) { + ArrayWheelAdapter adapter = + new ArrayWheelAdapter(this, cities[index]); + adapter.setTextSize(18); + city.setViewAdapter(adapter); + city.setCurrentItem(cities[index].length / 2); + } + + /** + * Adapter for countries + */ + private class CountryAdapter extends AbstractWheelTextAdapter { + // Countries names + private String countries[] = + new String[] {"USA", "Canada", "Ukraine", "France"}; + // Countries flags + private int flags[] = + new int[] {R.drawable.usa, R.drawable.canada, R.drawable.ukraine, R.drawable.france}; + + /** + * Constructor + */ + protected CountryAdapter(Context context) { + super(context, R.layout.country_layout, NO_RESOURCE); + + setItemTextResource(R.id.country_name); + } + + @Override + public View getItem(int index, View cachedView, ViewGroup parent) { + View view = super.getItem(index, cachedView, parent); + ImageView img = (ImageView) view.findViewById(R.id.flag); + img.setImageResource(flags[index]); + return view; + } + + @Override + public int getItemsCount() { + return countries.length; + } + + @Override + protected CharSequence getItemText(int index) { + return countries[index]; + } + } +} diff --git a/wheel-demo/src/kankan/wheel/demo/extended/DateActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/DateActivity.java similarity index 100% rename from wheel-demo/src/kankan/wheel/demo/extended/DateActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/DateActivity.java diff --git a/wheel-demo/src/kankan/wheel/demo/extended/HoloWheelActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/HoloWheelActivity.java similarity index 100% rename from wheel-demo/src/kankan/wheel/demo/extended/HoloWheelActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/HoloWheelActivity.java diff --git a/wheel-demo/src/kankan/wheel/demo/extended/PasswActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/PasswActivity.java similarity index 96% rename from wheel-demo/src/kankan/wheel/demo/extended/PasswActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/PasswActivity.java index 75e4dc2..6ddd0c8 100644 --- a/wheel-demo/src/kankan/wheel/demo/extended/PasswActivity.java +++ b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/PasswActivity.java @@ -1,134 +1,134 @@ -package kankan.wheel.demo.extended; - -import kankan.wheel.demo.extended.R; -import kankan.wheel.widget.OnWheelChangedListener; -import kankan.wheel.widget.OnWheelScrollListener; -import kankan.wheel.widget.WheelView; -import kankan.wheel.widget.adapters.NumericWheelAdapter; -import android.app.Activity; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.animation.AnticipateOvershootInterpolator; -import android.widget.Button; -import android.widget.TextView; - -public class PasswActivity extends Activity { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.passw_layout); - initWheel(R.id.passw_1); - initWheel(R.id.passw_2); - initWheel(R.id.passw_3); - initWheel(R.id.passw_4); - - Button mix = (Button)findViewById(R.id.btn_mix); - mix.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mixWheel(R.id.passw_1); - mixWheel(R.id.passw_2); - mixWheel(R.id.passw_3); - mixWheel(R.id.passw_4); - } - }); - - updateStatus(); - } - - // Wheel scrolled flag - private boolean wheelScrolled = false; - - // Wheel scrolled listener - OnWheelScrollListener scrolledListener = new OnWheelScrollListener() { - @Override - public void onScrollingStarted(WheelView wheel) { - wheelScrolled = true; - } - @Override - public void onScrollingFinished(WheelView wheel) { - wheelScrolled = false; - updateStatus(); - } - }; - - // Wheel changed listener - private OnWheelChangedListener changedListener = new OnWheelChangedListener() { - @Override - public void onChanged(WheelView wheel, int oldValue, int newValue) { - if (!wheelScrolled) { - updateStatus(); - } - } - }; - - /** - * Updates entered PIN status - */ - private void updateStatus() { - TextView text = (TextView) findViewById(R.id.pwd_status); - if (testPin(2, 4, 6, 1)) { - text.setText("Congratulation!"); - } else { - text.setText("Invalid PIN"); - } - } - - /** - * Initializes wheel - * @param id the wheel widget Id - */ - private void initWheel(int id) { - WheelView wheel = getWheel(id); - wheel.setViewAdapter(new NumericWheelAdapter(this, 0, 9)); - wheel.setCurrentItem((int)(Math.random() * 10)); - - wheel.addChangingListener(changedListener); - wheel.addScrollingListener(scrolledListener); - wheel.setCyclic(true); - wheel.setInterpolator(new AnticipateOvershootInterpolator()); - } - - /** - * Returns wheel by Id - * @param id the wheel Id - * @return the wheel with passed Id - */ - private WheelView getWheel(int id) { - return (WheelView) findViewById(id); - } - - /** - * Tests entered PIN - * @param v1 - * @param v2 - * @param v3 - * @param v4 - * @return true - */ - private boolean testPin(int v1, int v2, int v3, int v4) { - return testWheelValue(R.id.passw_1, v1) && testWheelValue(R.id.passw_2, v2) && - testWheelValue(R.id.passw_3, v3) && testWheelValue(R.id.passw_4, v4); - } - - /** - * Tests wheel value - * @param id the wheel Id - * @param value the value to test - * @return true if wheel value is equal to passed value - */ - private boolean testWheelValue(int id, int value) { - return getWheel(id).getCurrentItem() == value; - } - - /** - * Mixes wheel - * @param id the wheel id - */ - private void mixWheel(int id) { - WheelView wheel = getWheel(id); - wheel.scroll(-25 + (int)(Math.random() * 50), 2000); - } -} +package kankan.wheel.demo.extended; + +import kankan.wheel.demo.extended.R; +import kankan.wheel.widget.OnWheelChangedListener; +import kankan.wheel.widget.OnWheelScrollListener; +import kankan.wheel.widget.WheelView; +import kankan.wheel.widget.adapters.NumericWheelAdapter; +import android.app.Activity; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.animation.AnticipateOvershootInterpolator; +import android.widget.Button; +import android.widget.TextView; + +public class PasswActivity extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.passw_layout); + initWheel(R.id.passw_1); + initWheel(R.id.passw_2); + initWheel(R.id.passw_3); + initWheel(R.id.passw_4); + + Button mix = (Button)findViewById(R.id.btn_mix); + mix.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + mixWheel(R.id.passw_1); + mixWheel(R.id.passw_2); + mixWheel(R.id.passw_3); + mixWheel(R.id.passw_4); + } + }); + + updateStatus(); + } + + // Wheel scrolled flag + private boolean wheelScrolled = false; + + // Wheel scrolled listener + OnWheelScrollListener scrolledListener = new OnWheelScrollListener() { + @Override + public void onScrollingStarted(WheelView wheel) { + wheelScrolled = true; + } + @Override + public void onScrollingFinished(WheelView wheel) { + wheelScrolled = false; + updateStatus(); + } + }; + + // Wheel changed listener + private OnWheelChangedListener changedListener = new OnWheelChangedListener() { + @Override + public void onChanged(WheelView wheel, int oldValue, int newValue) { + if (!wheelScrolled) { + updateStatus(); + } + } + }; + + /** + * Updates entered PIN status + */ + private void updateStatus() { + TextView text = (TextView) findViewById(R.id.pwd_status); + if (testPin(2, 4, 6, 1)) { + text.setText("Congratulation!"); + } else { + text.setText("Invalid PIN"); + } + } + + /** + * Initializes wheel + * @param id the wheel widget Id + */ + private void initWheel(int id) { + WheelView wheel = getWheel(id); + wheel.setViewAdapter(new NumericWheelAdapter(this, 0, 9)); + wheel.setCurrentItem((int)(Math.random() * 10)); + + wheel.addChangingListener(changedListener); + wheel.addScrollingListener(scrolledListener); + wheel.setCyclic(true); + wheel.setInterpolator(new AnticipateOvershootInterpolator()); + } + + /** + * Returns wheel by Id + * @param id the wheel Id + * @return the wheel with passed Id + */ + private WheelView getWheel(int id) { + return (WheelView) findViewById(id); + } + + /** + * Tests entered PIN + * @param v1 + * @param v2 + * @param v3 + * @param v4 + * @return true + */ + private boolean testPin(int v1, int v2, int v3, int v4) { + return testWheelValue(R.id.passw_1, v1) && testWheelValue(R.id.passw_2, v2) && + testWheelValue(R.id.passw_3, v3) && testWheelValue(R.id.passw_4, v4); + } + + /** + * Tests wheel value + * @param id the wheel Id + * @param value the value to test + * @return true if wheel value is equal to passed value + */ + private boolean testWheelValue(int id, int value) { + return getWheel(id).getCurrentItem() == value; + } + + /** + * Mixes wheel + * @param id the wheel id + */ + private void mixWheel(int id) { + WheelView wheel = getWheel(id); + wheel.scroll(-25 + (int)(Math.random() * 50), 2000); + } +} diff --git a/wheel-demo/src/kankan/wheel/demo/extended/SlotMachineActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/SlotMachineActivity.java similarity index 100% rename from wheel-demo/src/kankan/wheel/demo/extended/SlotMachineActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/SlotMachineActivity.java diff --git a/wheel-demo/src/kankan/wheel/demo/extended/SpeedActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/SpeedActivity.java similarity index 100% rename from wheel-demo/src/kankan/wheel/demo/extended/SpeedActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/SpeedActivity.java diff --git a/wheel-demo/src/kankan/wheel/demo/extended/Time2Activity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/Time2Activity.java similarity index 100% rename from wheel-demo/src/kankan/wheel/demo/extended/Time2Activity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/Time2Activity.java diff --git a/wheel-demo/src/kankan/wheel/demo/extended/TimeActivity.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/TimeActivity.java similarity index 96% rename from wheel-demo/src/kankan/wheel/demo/extended/TimeActivity.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/TimeActivity.java index 27753fb..397e12a 100644 --- a/wheel-demo/src/kankan/wheel/demo/extended/TimeActivity.java +++ b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/TimeActivity.java @@ -1,119 +1,119 @@ -package kankan.wheel.demo.extended; - -import java.util.Calendar; - -import kankan.wheel.demo.extended.R; -import kankan.wheel.widget.OnWheelChangedListener; -import kankan.wheel.widget.OnWheelClickedListener; -import kankan.wheel.widget.OnWheelScrollListener; -import kankan.wheel.widget.WheelView; -import kankan.wheel.widget.adapters.NumericWheelAdapter; - -import android.app.Activity; -import android.os.Bundle; -import android.widget.TimePicker; - -public class TimeActivity extends Activity { - // Time changed flag - private boolean timeChanged = false; - - // Time scrolled flag - private boolean timeScrolled = false; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.time_layout); - - final WheelView hours = (WheelView) findViewById(R.id.hour); - hours.setViewAdapter(new NumericWheelAdapter(this, 0, 23)); - - final WheelView mins = (WheelView) findViewById(R.id.mins); - mins.setViewAdapter(new NumericWheelAdapter(this, 0, 59, "%02d")); - mins.setCyclic(true); - - final TimePicker picker = (TimePicker) findViewById(R.id.time); - picker.setIs24HourView(true); - - // set current time - Calendar c = Calendar.getInstance(); - int curHours = c.get(Calendar.HOUR_OF_DAY); - int curMinutes = c.get(Calendar.MINUTE); - - hours.setCurrentItem(curHours); - mins.setCurrentItem(curMinutes); - - picker.setCurrentHour(curHours); - picker.setCurrentMinute(curMinutes); - - // add listeners - addChangingListener(mins, "min"); - addChangingListener(hours, "hour"); - - OnWheelChangedListener wheelListener = new OnWheelChangedListener() { - @Override - public void onChanged(WheelView wheel, int oldValue, int newValue) { - if (!timeScrolled) { - timeChanged = true; - picker.setCurrentHour(hours.getCurrentItem()); - picker.setCurrentMinute(mins.getCurrentItem()); - timeChanged = false; - } - } - }; - hours.addChangingListener(wheelListener); - mins.addChangingListener(wheelListener); - - OnWheelClickedListener click = new OnWheelClickedListener() { - @Override - public void onItemClicked(WheelView wheel, int itemIndex) { - wheel.setCurrentItem(itemIndex, true); - } - }; - hours.addClickingListener(click); - mins.addClickingListener(click); - - OnWheelScrollListener scrollListener = new OnWheelScrollListener() { - @Override - public void onScrollingStarted(WheelView wheel) { - timeScrolled = true; - } - @Override - public void onScrollingFinished(WheelView wheel) { - timeScrolled = false; - timeChanged = true; - picker.setCurrentHour(hours.getCurrentItem()); - picker.setCurrentMinute(mins.getCurrentItem()); - timeChanged = false; - } - }; - - hours.addScrollingListener(scrollListener); - mins.addScrollingListener(scrollListener); - - picker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { - @Override - public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { - if (!timeChanged) { - hours.setCurrentItem(hourOfDay, true); - mins.setCurrentItem(minute, true); - } - } - }); - } - - /** - * Adds changing listener for wheel that updates the wheel label - * @param wheel the wheel - * @param label the wheel label - */ - private void addChangingListener(final WheelView wheel, final String label) { - wheel.addChangingListener(new OnWheelChangedListener() { - @Override - public void onChanged(WheelView wheel, int oldValue, int newValue) { - //wheel.setLabel(newValue != 1 ? label + "s" : label); - } - }); - } -} +package kankan.wheel.demo.extended; + +import java.util.Calendar; + +import kankan.wheel.demo.extended.R; +import kankan.wheel.widget.OnWheelChangedListener; +import kankan.wheel.widget.OnWheelClickedListener; +import kankan.wheel.widget.OnWheelScrollListener; +import kankan.wheel.widget.WheelView; +import kankan.wheel.widget.adapters.NumericWheelAdapter; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.TimePicker; + +public class TimeActivity extends Activity { + // Time changed flag + private boolean timeChanged = false; + + // Time scrolled flag + private boolean timeScrolled = false; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.time_layout); + + final WheelView hours = (WheelView) findViewById(R.id.hour); + hours.setViewAdapter(new NumericWheelAdapter(this, 0, 23)); + + final WheelView mins = (WheelView) findViewById(R.id.mins); + mins.setViewAdapter(new NumericWheelAdapter(this, 0, 59, "%02d")); + mins.setCyclic(true); + + final TimePicker picker = (TimePicker) findViewById(R.id.time); + picker.setIs24HourView(true); + + // set current time + Calendar c = Calendar.getInstance(); + int curHours = c.get(Calendar.HOUR_OF_DAY); + int curMinutes = c.get(Calendar.MINUTE); + + hours.setCurrentItem(curHours); + mins.setCurrentItem(curMinutes); + + picker.setCurrentHour(curHours); + picker.setCurrentMinute(curMinutes); + + // add listeners + addChangingListener(mins, "min"); + addChangingListener(hours, "hour"); + + OnWheelChangedListener wheelListener = new OnWheelChangedListener() { + @Override + public void onChanged(WheelView wheel, int oldValue, int newValue) { + if (!timeScrolled) { + timeChanged = true; + picker.setCurrentHour(hours.getCurrentItem()); + picker.setCurrentMinute(mins.getCurrentItem()); + timeChanged = false; + } + } + }; + hours.addChangingListener(wheelListener); + mins.addChangingListener(wheelListener); + + OnWheelClickedListener click = new OnWheelClickedListener() { + @Override + public void onItemClicked(WheelView wheel, int itemIndex) { + wheel.setCurrentItem(itemIndex, true); + } + }; + hours.addClickingListener(click); + mins.addClickingListener(click); + + OnWheelScrollListener scrollListener = new OnWheelScrollListener() { + @Override + public void onScrollingStarted(WheelView wheel) { + timeScrolled = true; + } + @Override + public void onScrollingFinished(WheelView wheel) { + timeScrolled = false; + timeChanged = true; + picker.setCurrentHour(hours.getCurrentItem()); + picker.setCurrentMinute(mins.getCurrentItem()); + timeChanged = false; + } + }; + + hours.addScrollingListener(scrollListener); + mins.addScrollingListener(scrollListener); + + picker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { + @Override + public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { + if (!timeChanged) { + hours.setCurrentItem(hourOfDay, true); + mins.setCurrentItem(minute, true); + } + } + }); + } + + /** + * Adds changing listener for wheel that updates the wheel label + * @param wheel the wheel + * @param label the wheel label + */ + private void addChangingListener(final WheelView wheel, final String label) { + wheel.addChangingListener(new OnWheelChangedListener() { + @Override + public void onChanged(WheelView wheel, int oldValue, int newValue) { + //wheel.setLabel(newValue != 1 ? label + "s" : label); + } + }); + } +} diff --git a/wheel-demo/src/kankan/wheel/demo/extended/WheelDemo.java b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/WheelDemo.java similarity index 96% rename from wheel-demo/src/kankan/wheel/demo/extended/WheelDemo.java rename to wheel-demo/app/src/main/java/kankan/wheel/demo/extended/WheelDemo.java index 822e4ee..85ccb3f 100644 --- a/wheel-demo/src/kankan/wheel/demo/extended/WheelDemo.java +++ b/wheel-demo/app/src/main/java/kankan/wheel/demo/extended/WheelDemo.java @@ -1,128 +1,128 @@ -package kankan.wheel.demo.extended; - -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import android.app.ListActivity; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.view.View; -import android.widget.ListView; -import android.widget.SimpleAdapter; - -public class WheelDemo extends ListActivity { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - String path = intent.getStringExtra("com.example.android.apis.Path"); - - if (path == null) { - path = ""; - } - - setListAdapter(new SimpleAdapter(this, getData(path), - android.R.layout.simple_list_item_1, new String[] { "title" }, - new int[] { android.R.id.text1 })); - } - - protected List getData(String prefix) { - List myData = new ArrayList(); - - Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); - mainIntent.addCategory("kankan.wheel.extended.WHEEL_SAMPLE"); - - PackageManager pm = getPackageManager(); - List list = pm.queryIntentActivities(mainIntent, 0); - - if (null == list) - return myData; - - String[] prefixPath; - - if (prefix.equals("")) { - prefixPath = null; - } else { - prefixPath = prefix.split("/"); - } - - int len = list.size(); - - Map entries = new HashMap(); - - for (int i = 0; i < len; i++) { - ResolveInfo info = list.get(i); - CharSequence labelSeq = info.loadLabel(pm); - String label = labelSeq != null - ? labelSeq.toString() - : info.activityInfo.name; - - if (prefix.length() == 0 || label.startsWith(prefix)) { - - String[] labelPath = label.split("/"); - - String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length]; - - if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) { - addItem(myData, nextLabel, activityIntent( - info.activityInfo.applicationInfo.packageName, - info.activityInfo.name)); - } else { - if (entries.get(nextLabel) == null) { - addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel)); - entries.put(nextLabel, true); - } - } - } - } - - Collections.sort(myData, sDisplayNameComparator); - - return myData; - } - - private final static Comparator sDisplayNameComparator = new Comparator() { - private final Collator collator = Collator.getInstance(); - - @Override - public int compare(Map map1, Map map2) { - return collator.compare(map1.get("title"), map2.get("title")); - } - }; - - protected Intent activityIntent(String pkg, String componentName) { - Intent result = new Intent(); - result.setClassName(pkg, componentName); - return result; - } - - protected Intent browseIntent(String path) { - Intent result = new Intent(); - result.setClass(this, WheelDemo.class); - result.putExtra("com.example.android.apis.Path", path); - return result; - } - - protected void addItem(List data, String name, Intent intent) { - Map temp = new HashMap(); - temp.put("title", name); - temp.put("intent", intent); - data.add(temp); - } - - @Override - protected void onListItemClick(ListView l, View v, int position, long id) { - Map map = (Map) l.getItemAtPosition(position); - - Intent intent = (Intent) map.get("intent"); - startActivity(intent); - } -} +package kankan.wheel.demo.extended; + +import android.app.ListActivity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Bundle; +import android.view.View; +import android.widget.ListView; +import android.widget.SimpleAdapter; + +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class WheelDemo extends ListActivity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + String path = intent.getStringExtra("com.example.android.apis.Path"); + + if (path == null) { + path = ""; + } + + setListAdapter(new SimpleAdapter(this, getData(path), + android.R.layout.simple_list_item_1, new String[] { "title" }, + new int[] { android.R.id.text1 })); + } + + protected List getData(String prefix) { + List myData = new ArrayList(); + + Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); + mainIntent.addCategory("kankan.wheel.extended.WHEEL_SAMPLE"); + + PackageManager pm = getPackageManager(); + List list = pm.queryIntentActivities(mainIntent, 0); + + if (null == list) + return myData; + + String[] prefixPath; + + if (prefix.equals("")) { + prefixPath = null; + } else { + prefixPath = prefix.split("/"); + } + + int len = list.size(); + + Map entries = new HashMap(); + + for (int i = 0; i < len; i++) { + ResolveInfo info = list.get(i); + CharSequence labelSeq = info.loadLabel(pm); + String label = labelSeq != null + ? labelSeq.toString() + : info.activityInfo.name; + + if (prefix.length() == 0 || label.startsWith(prefix)) { + + String[] labelPath = label.split("/"); + + String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length]; + + if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) { + addItem(myData, nextLabel, activityIntent( + info.activityInfo.applicationInfo.packageName, + info.activityInfo.name)); + } else { + if (entries.get(nextLabel) == null) { + addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel)); + entries.put(nextLabel, true); + } + } + } + } + + Collections.sort(myData, sDisplayNameComparator); + + return myData; + } + + private final static Comparator sDisplayNameComparator = new Comparator() { + private final Collator collator = Collator.getInstance(); + + @Override + public int compare(Map map1, Map map2) { + return collator.compare(map1.get("title"), map2.get("title")); + } + }; + + protected Intent activityIntent(String pkg, String componentName) { + Intent result = new Intent(); + result.setClassName(pkg, componentName); + return result; + } + + protected Intent browseIntent(String path) { + Intent result = new Intent(); + result.setClass(this, WheelDemo.class); + result.putExtra("com.example.android.apis.Path", path); + return result; + } + + protected void addItem(List data, String name, Intent intent) { + Map temp = new HashMap(); + temp.put("title", name); + temp.put("intent", intent); + data.add(temp); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + Map map = (Map) l.getItemAtPosition(position); + + Intent intent = (Intent) map.get("intent"); + startActivity(intent); + } +} diff --git a/wheel-demo/res/drawable/canada.png b/wheel-demo/app/src/main/res/drawable/canada.png similarity index 100% rename from wheel-demo/res/drawable/canada.png rename to wheel-demo/app/src/main/res/drawable/canada.png diff --git a/wheel-demo/res/drawable/france.png b/wheel-demo/app/src/main/res/drawable/france.png similarity index 100% rename from wheel-demo/res/drawable/france.png rename to wheel-demo/app/src/main/res/drawable/france.png diff --git a/wheel-demo/res/drawable/layout_bg.xml b/wheel-demo/app/src/main/res/drawable/layout_bg.xml similarity index 97% rename from wheel-demo/res/drawable/layout_bg.xml rename to wheel-demo/app/src/main/res/drawable/layout_bg.xml index 6c53b9b..95de773 100644 --- a/wheel-demo/res/drawable/layout_bg.xml +++ b/wheel-demo/app/src/main/res/drawable/layout_bg.xml @@ -1,27 +1,27 @@ - - - - - - - + + + + + + + diff --git a/wheel-demo/res/drawable/layout_bg_holo.xml b/wheel-demo/app/src/main/res/drawable/layout_bg_holo.xml similarity index 97% rename from wheel-demo/res/drawable/layout_bg_holo.xml rename to wheel-demo/app/src/main/res/drawable/layout_bg_holo.xml index e0edad5..7a7194d 100644 --- a/wheel-demo/res/drawable/layout_bg_holo.xml +++ b/wheel-demo/app/src/main/res/drawable/layout_bg_holo.xml @@ -1,27 +1,27 @@ - - - - - - - + + + + + + + diff --git a/wheel-demo/res/drawable/ukraine.png b/wheel-demo/app/src/main/res/drawable/ukraine.png similarity index 100% rename from wheel-demo/res/drawable/ukraine.png rename to wheel-demo/app/src/main/res/drawable/ukraine.png diff --git a/wheel-demo/res/drawable/usa.png b/wheel-demo/app/src/main/res/drawable/usa.png similarity index 100% rename from wheel-demo/res/drawable/usa.png rename to wheel-demo/app/src/main/res/drawable/usa.png diff --git a/wheel-demo/res/drawable/wheel_bg_holo.xml b/wheel-demo/app/src/main/res/drawable/wheel_bg_holo.xml similarity index 97% rename from wheel-demo/res/drawable/wheel_bg_holo.xml rename to wheel-demo/app/src/main/res/drawable/wheel_bg_holo.xml index 02a54ac..5282e2a 100644 --- a/wheel-demo/res/drawable/wheel_bg_holo.xml +++ b/wheel-demo/app/src/main/res/drawable/wheel_bg_holo.xml @@ -1,31 +1,31 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/wheel-demo/res/drawable/wheel_val_holo.xml b/wheel-demo/app/src/main/res/drawable/wheel_val_holo.xml similarity index 100% rename from wheel-demo/res/drawable/wheel_val_holo.xml rename to wheel-demo/app/src/main/res/drawable/wheel_val_holo.xml diff --git a/wheel-demo/res/layout/cities_holo_layout.xml b/wheel-demo/app/src/main/res/layout/cities_holo_layout.xml similarity index 100% rename from wheel-demo/res/layout/cities_holo_layout.xml rename to wheel-demo/app/src/main/res/layout/cities_holo_layout.xml diff --git a/wheel-demo/res/layout/cities_layout.xml b/wheel-demo/app/src/main/res/layout/cities_layout.xml similarity index 100% rename from wheel-demo/res/layout/cities_layout.xml rename to wheel-demo/app/src/main/res/layout/cities_layout.xml diff --git a/wheel-demo/res/layout/city_holo_layout.xml b/wheel-demo/app/src/main/res/layout/city_holo_layout.xml similarity index 100% rename from wheel-demo/res/layout/city_holo_layout.xml rename to wheel-demo/app/src/main/res/layout/city_holo_layout.xml diff --git a/wheel-demo/res/layout/country_layout.xml b/wheel-demo/app/src/main/res/layout/country_layout.xml similarity index 100% rename from wheel-demo/res/layout/country_layout.xml rename to wheel-demo/app/src/main/res/layout/country_layout.xml diff --git a/wheel-demo/res/layout/date_layout.xml b/wheel-demo/app/src/main/res/layout/date_layout.xml similarity index 100% rename from wheel-demo/res/layout/date_layout.xml rename to wheel-demo/app/src/main/res/layout/date_layout.xml diff --git a/wheel-demo/res/layout/passw_layout.xml b/wheel-demo/app/src/main/res/layout/passw_layout.xml similarity index 100% rename from wheel-demo/res/layout/passw_layout.xml rename to wheel-demo/app/src/main/res/layout/passw_layout.xml diff --git a/wheel-demo/res/layout/slot_item.xml b/wheel-demo/app/src/main/res/layout/slot_item.xml similarity index 100% rename from wheel-demo/res/layout/slot_item.xml rename to wheel-demo/app/src/main/res/layout/slot_item.xml diff --git a/wheel-demo/res/layout/slot_machine_layout.xml b/wheel-demo/app/src/main/res/layout/slot_machine_layout.xml similarity index 100% rename from wheel-demo/res/layout/slot_machine_layout.xml rename to wheel-demo/app/src/main/res/layout/slot_machine_layout.xml diff --git a/wheel-demo/res/layout/speed1_layout.xml b/wheel-demo/app/src/main/res/layout/speed1_layout.xml similarity index 100% rename from wheel-demo/res/layout/speed1_layout.xml rename to wheel-demo/app/src/main/res/layout/speed1_layout.xml diff --git a/wheel-demo/res/layout/time2_day.xml b/wheel-demo/app/src/main/res/layout/time2_day.xml similarity index 100% rename from wheel-demo/res/layout/time2_day.xml rename to wheel-demo/app/src/main/res/layout/time2_day.xml diff --git a/wheel-demo/res/layout/time2_layout.xml b/wheel-demo/app/src/main/res/layout/time2_layout.xml similarity index 100% rename from wheel-demo/res/layout/time2_layout.xml rename to wheel-demo/app/src/main/res/layout/time2_layout.xml diff --git a/wheel-demo/res/layout/time_layout.xml b/wheel-demo/app/src/main/res/layout/time_layout.xml similarity index 100% rename from wheel-demo/res/layout/time_layout.xml rename to wheel-demo/app/src/main/res/layout/time_layout.xml diff --git a/wheel-demo/res/layout/units_item.xml b/wheel-demo/app/src/main/res/layout/units_item.xml similarity index 100% rename from wheel-demo/res/layout/units_item.xml rename to wheel-demo/app/src/main/res/layout/units_item.xml diff --git a/wheel-demo/res/layout/wheel_text_item.xml b/wheel-demo/app/src/main/res/layout/wheel_text_item.xml similarity index 100% rename from wheel-demo/res/layout/wheel_text_item.xml rename to wheel-demo/app/src/main/res/layout/wheel_text_item.xml diff --git a/wheel-demo/app/src/main/res/mipmap-hdpi/ic_launcher.png b/wheel-demo/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/wheel-demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/wheel-demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d GIT binary patch literal 4842 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 literal 0 HcmV?d00001 diff --git a/wheel-demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/wheel-demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/wheel-demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/wheel-demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..aee44e138434630332d88b1680f33c4b24c70ab3 GIT binary patch literal 10486 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 + + #3F51B5 + #303F9F + #FF4081 + diff --git a/wheel-demo/app/src/main/res/values/strings.xml b/wheel-demo/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..f9768ba --- /dev/null +++ b/wheel-demo/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Android Wheel Demo + diff --git a/wheel-demo/app/src/main/res/values/styles.xml b/wheel-demo/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..f11f745 --- /dev/null +++ b/wheel-demo/app/src/main/res/values/styles.xml @@ -0,0 +1,3 @@ + + + diff --git a/wheel-demo/app/src/test/java/kankan/wheel/demo/extended/ExampleUnitTest.java b/wheel-demo/app/src/test/java/kankan/wheel/demo/extended/ExampleUnitTest.java new file mode 100644 index 0000000..829645e --- /dev/null +++ b/wheel-demo/app/src/test/java/kankan/wheel/demo/extended/ExampleUnitTest.java @@ -0,0 +1,15 @@ +package kankan.wheel.demo.extended; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * To work on unit tests, switch the Test Artifact in the Build Variants view. + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/wheel-demo/build.gradle b/wheel-demo/build.gradle new file mode 100644 index 0000000..e0b366a --- /dev/null +++ b/wheel-demo/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.5.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/wheel-demo/gradle.properties b/wheel-demo/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/wheel-demo/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/wheel-demo/gradle/wrapper/gradle-wrapper.jar b/wheel-demo/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..05ef575b0cd0173fc735f2857ce4bd594ce4f6bd GIT binary patch literal 53637 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 t9m@SZ!E*7&jsr?!t7TL-WYI4eM@gAug8 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/wheel-demo/gradlew.bat b/wheel-demo/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/wheel-demo/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/wheel-demo/project.properties b/wheel-demo/project.properties deleted file mode 100644 index a0302a8..0000000 --- a/wheel-demo/project.properties +++ /dev/null @@ -1,17 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Indicates whether an apk should be generated for each density. -split.density=false -android.library.reference.1=../wheel -# Project target. -target=Google Inc.:Google APIs:4 diff --git a/wheel-demo/res/drawable-hdpi/icon.png b/wheel-demo/res/drawable-hdpi/icon.png deleted file mode 100644 index 8074c4c571b8cd19e27f4ee5545df367420686d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4147 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 diff --git a/wheel-demo/res/drawable-hdpi/my_icon.png b/wheel-demo/res/drawable-hdpi/my_icon.png deleted file mode 100644 index 549a48591acda00cffd6fbcfcf47986267bf07b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13834 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

QHT)O|Dy+7EpPLxb_f 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 M07*qoM6N<$f;oc)WB>pF diff --git a/wheel-demo/res/drawable-hdpi/wheel.png b/wheel-demo/res/drawable-hdpi/wheel.png deleted file mode 100644 index efdeb5f664b4bda08aafc65e03ecd3ad09431fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4763 zcmV;M5@hX(P)2n*|b;WNtb^;{0h>Ijj6t&oLCZ4Hs;!2gj=1qaty{OIbow1Y?e6Xd4p4v4w`deuHk-9D z{IZp56pd^&99fu2aBzU~xx5uB`V@+m&H1Hw;Q3`-LRkjAzIA&&7ueCrWHUBfnX~GA z)n-aFUj`EIk+RipS>vQ(qfz}Fpj96_)f&bAX7YZ&ADE`YI|HEFr=~$^)uy(sAUNEpiE@Lajto>a!vblHhNdW)^ zQ9f&#+sn54_rJC|neAXOuwK9CcAd>+ZK(Irn8r(uU?6|kZnvGRl}aTm z=>1{vu9x``Kl>jr$S|*Tj=X^tD@c2C`J810!az5-_iDCvoVV2*c{{B2^y%9CY{_Pp z@^*V;!Pd)(X1qN^tgmH5J5)3n4EqjB^R#KZd%Gf{1*=x8c6@Z?z~J)^50C6f-?{$i z!9y|FjQ#b=U+wht)HXLa?cUvcmMiAoe$6NQ4hC4#B_G7wn0zjm)2iky)M{FgvnVR4 zYF)A*s}&FX7GzMrk}a02wpP`3Js0~Q^d>n6>_#-OPIlnq1ew49=*89xQHhHCx0gGw zTub==^5si|y*|AEP{)BaYsdEe_upH+o)ERw)m7(c%<*%yoHB{jE$}|~L7Wr?P~HK` z8fK7{!^vpEom#`J)3>s;Jg4t*t8Ig$nsvn$@WW{v50a%T(0U!O)R&{`UQN;SV5<$x*ChUnUjFNuxcCd*j9pTf4btKm6qf zJ9$>ON@dp8*47Mq0WbiEKcYXm;KtV*o)>OyZTU;+hpB#!QVb*!Q%~C&K>4C<4?a)n+2)DDd?VM~*5$|KE$47(O!fcMcGMWXPZNAy*oRvosIh zSlDbPv*o$~G({YBN*t1&IRgwZr75upp)Qg`SVlgisQMDok;XgH59*tK{N_jgp|FKZ zK$xFnJf;y!5wen(xzZdUY`b-;G(TJL5L*}Z-}$$Hwb^ISUEV;PB~%&^Y;KxJk}0v$ zM>Si#JvHoh$0Bi==*biHS1zWUDt_?5=70OOM8qRa1YL0Hhrad<9%(FdT@S9oW&+Csz6IKP3;(R#bAV zSg?LuAxhe^zi-jup@p|^S)k|>D-kv2TJeAVrvucN_Ozr(gIl*e3H9oLicrpJq@7eR zmsPo}XiU}#kZ_DNl0+tlu!MaW^`&d-2jGPM=P#Z++rEAKwo?hl;T|07qNDYJulNTX zP?pO8p+W6apAZ1SOM2?06Bjs!1$Vm^lOM_Kq8BeLe*Iean-+)-%XuXlrT(!dInt-c zx$f7ceYM(=J%27?wBm$sP=VJRDer1DmCC5We-I9>U=A!6L=sJ7RhxP*<_f_iZSnk0 z0I~akL+$puUPtaoo0pcBd;ur|Ubl5rNoXre_$ffTn9(*_Uz76*3CV^&xD*_8C~(3T z&tyu^EPl0Zu~=_#BrSUL#)7+dED{)z`U6l`fHrlW7f3|M*XpygwUSO8G~mA~t{X4e+LZS8E}+i0%WtQ@w?%ZBmLU)Je$tfg!Clt3#K>U*e_i_joV z7(W!$YHnhoK#kOQM1Kj^RsXj754$ZZwhMMD?WD$o){xzg;*p(5sC@y1kZ1>50RT+_ zUloYGPS;+`bkU}kb{Gz2($qNFmH}LnYfOrIQoT`^$*G^-0Z2WK1yiSVk!}FGv{(4k zm8G;a@3+bwNw&=-GZK)U#UUU34FKr~feII726Dc!1d-P@c}5F2?^&b>7qKI$e(oPM zX@m&%;aVmjO~{BvH*EXWD+R-{fN0wOn|-M>0uLOZSf-B9k;y?oW=^Gz{)D)E-B=*x@6~FX$OTQ z&(-9kO7b&v&OI{HjDh!u-9tO5CJggh48;ke9=>WMfN=c7P)V^gsgy5SH{W%~O-+49 z5sk59y&ur7(*QVKXr4<#hfdNPfD=kXGAqm0>})1JNWLRbo)l_DJ8)nG(WnFWPl4f70L68|YZD#-tRip-_$h5;zD%jHF$4WTY zlYSC3pk6Ei9hA3%L##>KLz$j3c5hm}P$9gaaqu_%mbO$*>dV+R&KQ;r$o^fxU|Pv) zptPWjsM0|FqYvxBb%-3zqs;gkW0hk8GIp%=!yF^teLV$ow}LgL?F=AR3ERW55s6BQ zAPNKHewvi7`NWg?rOzivCQ*>zka{O=41k0qTff{AGsNGdeGxt}g?CAFel77a=ihnW zpVPu#Y+Q?^fgjVrfD&-p93V;zOG}HY+1#{+g;dD2%a?VmDXKa_6(%$X2(Cc+^Zxz& z3XeC%I~w-gpP$+8(c7zk1+b)H#e8V%s}*~siX^<}m(=$5_AHkXJ-`L1otYThJvcjl z26J#&w?BUW+W!5eSno9(E}}XU*&iN9wz;l!qCD%Q4(5x~#sNd}paF0Wcn}e8eSJNt zCQNuAOnXB)>OPK{eKj070f(05nzX_D$R|!}eeLDJqtbQ; z5YCB^%LkAG)uW5W>ya!5W$z*{6AJ_sT0%HxcVg@1mgivzvAvz_ivd_oDa^}l?Tu-1 z_+C{Sa&U0qAn-#9QVVu^xklx@lAoYZ=QBv_^W&H(Cmk{bwR+W5OW|Hf8VlSDG@eAOd^uFX{h^rEK<9vK8w zub1~oNyH=_fD6HrfB5sUv~15Fi&~H}eEaRUo>F}C%{TtD9Ly7dUnoglQ9YZC8$w7W zlr5vI+yjX(M3lVjyYIep?c}{^8&!i_H&t2C;!J8V>0bA(D8@sH5Pc_S%Ej%gwdeMS z->SZI%@&C%HaivDJNa5;J#sB#C7qoMB$7)1(WtHwj>*GzWPUvAEP+5gT}md`x|zubOd3Nx=zO4DEDefV9F_r z3rkx0oC{G^31g&w+-HwIBce%JBd?8w?N{5bT`V91lP9J=2A0i-8Zz58jEj~49%Yi7 zqAk>l_#O?#yHe`)0cl)=goX1f^*c8)IaK@)CdQ}T9oqiU^~n|*RBKTYP_kPZIvd7s ztZSlVm zvimkqS(LZk+t?J41$+H^&z)^rwL~j@bMph>a0~6Gwv@JWfON6n2OK4#nY?x4`}Xbg zb5%5hdA+BRAvuB$9nt0_I1(DQ#x}F*r9F zs5~=gckchQR`{RNepfycDf9~)D})uLEfpIIbQ&OG3V^~y3BBZ6@S-%jr1#PsjDA!C zW{OGT=>m=eQTj|pX+GzwO8eN1Tg(@IrPRRFn9y83|4(vHi5i#k*HIXT%SWl9I%$ zjFy0W-t%2DoZr3P8Mx@9s*O&j?fnRx*B0O3=Zn5G1!%(ZPXU?&Gy#DLx2GC31!w{S p6K+p6XbR8-1SZ^`YS09L{ue*0?8#HE^>hFL002ovPDHLkV1f+dH3|R# diff --git a/wheel-demo/res/drawable-ldpi/icon.png b/wheel-demo/res/drawable-ldpi/icon.png deleted file mode 100644 index 1095584ec21f71cd0afc9e0993aa2209671b590c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1723 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 literal 0 HcmV?d00001 diff --git a/wheel/.classpath b/wheel/.classpath deleted file mode 100644 index 4160c21..0000000 --- a/wheel/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/wheel/.gitignore b/wheel/.gitignore new file mode 100644 index 0000000..17c1fe6 --- /dev/null +++ b/wheel/.gitignore @@ -0,0 +1,105 @@ +# Created by https://www.gitignore.io/api/android,intellij,gradle + +.DS_Store + +### Android ### +# Built application files +*.apk +*.ap_ + +# Files for the Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +### Android Patch ### +gen-external-apklibs + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +.idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries +# .idea/shelf + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + + +### Gradle ### +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache diff --git a/wheel/.project b/wheel/.project deleted file mode 100644 index 7ff0e44..0000000 --- a/wheel/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - wheel - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/wheel/AndroidManifest.xml b/wheel/AndroidManifest.xml deleted file mode 100644 index a71e25e..0000000 --- a/wheel/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/wheel/build.gradle b/wheel/build.gradle new file mode 100644 index 0000000..e0b366a --- /dev/null +++ b/wheel/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.5.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/wheel/gradle.properties b/wheel/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/wheel/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/wheel/gradle/wrapper/gradle-wrapper.jar b/wheel/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..05ef575b0cd0173fc735f2857ce4bd594ce4f6bd GIT binary patch literal 53637 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 t9m@SZ!E*7&jsr?!t7TL-WYI4eM@gAug8 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/wheel/gradlew.bat b/wheel/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/wheel/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/wheel/project.properties b/wheel/project.properties deleted file mode 100644 index 5d433a1..0000000 --- a/wheel/project.properties +++ /dev/null @@ -1,17 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -android.library=true -# Indicates whether an apk should be generated for each density. -split.density=false -# Project target. -target=android-7 diff --git a/wheel/settings.gradle b/wheel/settings.gradle new file mode 100644 index 0000000..b600c00 --- /dev/null +++ b/wheel/settings.gradle @@ -0,0 +1 @@ +include ':wheel' diff --git a/wheel/wheel/.gitignore b/wheel/wheel/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/wheel/wheel/.gitignore @@ -0,0 +1 @@ +/build diff --git a/wheel/wheel/build.gradle b/wheel/wheel/build.gradle new file mode 100644 index 0000000..6d3e598 --- /dev/null +++ b/wheel/wheel/build.gradle @@ -0,0 +1,24 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + minSdkVersion 5 + targetSdkVersion 23 + versionCode 3 + versionName "2.2" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' +} diff --git a/wheel/wheel/proguard-rules.pro b/wheel/wheel/proguard-rules.pro new file mode 100644 index 0000000..0b3ef79 --- /dev/null +++ b/wheel/wheel/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/penaa/.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/wheel/wheel/src/androidTest/java/kankan/wheel/widget/ApplicationTest.java b/wheel/wheel/src/androidTest/java/kankan/wheel/widget/ApplicationTest.java new file mode 100644 index 0000000..27c3284 --- /dev/null +++ b/wheel/wheel/src/androidTest/java/kankan/wheel/widget/ApplicationTest.java @@ -0,0 +1,13 @@ +package kankan.wheel.widget; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/wheel/wheel/src/main/AndroidManifest.xml b/wheel/wheel/src/main/AndroidManifest.xml new file mode 100644 index 0000000..19367cf --- /dev/null +++ b/wheel/wheel/src/main/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/wheel/src/kankan/wheel/widget/ItemsRange.java b/wheel/wheel/src/main/java/kankan/wheel/widget/ItemsRange.java similarity index 100% rename from wheel/src/kankan/wheel/widget/ItemsRange.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/ItemsRange.java diff --git a/wheel/src/kankan/wheel/widget/OnWheelChangedListener.java b/wheel/wheel/src/main/java/kankan/wheel/widget/OnWheelChangedListener.java similarity index 100% rename from wheel/src/kankan/wheel/widget/OnWheelChangedListener.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/OnWheelChangedListener.java diff --git a/wheel/src/kankan/wheel/widget/OnWheelClickedListener.java b/wheel/wheel/src/main/java/kankan/wheel/widget/OnWheelClickedListener.java similarity index 100% rename from wheel/src/kankan/wheel/widget/OnWheelClickedListener.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/OnWheelClickedListener.java diff --git a/wheel/src/kankan/wheel/widget/OnWheelScrollListener.java b/wheel/wheel/src/main/java/kankan/wheel/widget/OnWheelScrollListener.java similarity index 100% rename from wheel/src/kankan/wheel/widget/OnWheelScrollListener.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/OnWheelScrollListener.java diff --git a/wheel/src/kankan/wheel/widget/WheelAdapter.java b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelAdapter.java similarity index 96% rename from wheel/src/kankan/wheel/widget/WheelAdapter.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/WheelAdapter.java index 5705bb0..efd6191 100644 --- a/wheel/src/kankan/wheel/widget/WheelAdapter.java +++ b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelAdapter.java @@ -1,46 +1,46 @@ -/* - * Copyright 2010 Yuri Kanivets - * - * 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 kankan.wheel.widget; - -/** - * Wheel adapter interface - * - * @deprecated Use WheelViewAdapter - */ -public interface WheelAdapter { - /** - * Gets items count - * @return the count of wheel items - */ - public int getItemsCount(); - - /** - * Gets a wheel item by index. - * - * @param index the item index - * @return the wheel item text or null - */ - public String getItem(int index); - - /** - * Gets maximum item length. It is used to determine the wheel width. - * If -1 is returned there will be used the default wheel width. - * - * @return the maximum item length or -1 - */ - public int getMaximumLength(); -} +/* + * Copyright 2010 Yuri Kanivets + * + * 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 kankan.wheel.widget; + +/** + * Wheel adapter interface + * + * @deprecated Use WheelViewAdapter + */ +public interface WheelAdapter { + /** + * Gets items count + * @return the count of wheel items + */ + public int getItemsCount(); + + /** + * Gets a wheel item by index. + * + * @param index the item index + * @return the wheel item text or null + */ + public String getItem(int index); + + /** + * Gets maximum item length. It is used to determine the wheel width. + * If -1 is returned there will be used the default wheel width. + * + * @return the maximum item length or -1 + */ + public int getMaximumLength(); +} diff --git a/wheel/src/kankan/wheel/widget/WheelRecycle.java b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelRecycle.java similarity index 100% rename from wheel/src/kankan/wheel/widget/WheelRecycle.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/WheelRecycle.java index 45c050b..817fc2e 100644 --- a/wheel/src/kankan/wheel/widget/WheelRecycle.java +++ b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelRecycle.java @@ -19,12 +19,12 @@ package kankan.wheel.widget; -import java.util.LinkedList; -import java.util.List; - import android.view.View; import android.widget.LinearLayout; +import java.util.LinkedList; +import java.util.List; + /** * Recycle stores wheel items to reuse. */ diff --git a/wheel/src/kankan/wheel/widget/WheelScroller.java b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelScroller.java similarity index 100% rename from wheel/src/kankan/wheel/widget/WheelScroller.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/WheelScroller.java diff --git a/wheel/src/kankan/wheel/widget/WheelView.java b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelView.java similarity index 95% rename from wheel/src/kankan/wheel/widget/WheelView.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/WheelView.java index 49851db..e1fbf36 100644 --- a/wheel/src/kankan/wheel/widget/WheelView.java +++ b/wheel/wheel/src/main/java/kankan/wheel/widget/WheelView.java @@ -1,938 +1,938 @@ -/* - * Android Wheel Control. - * https://code.google.com/p/android-wheel/ - * - * Copyright 2011 Yuri Kanivets - * - * 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 kankan.wheel.widget; - -import java.util.LinkedList; -import java.util.List; - -import kankan.wheel.R; -import kankan.wheel.widget.adapters.WheelViewAdapter; -import android.content.Context; -import android.database.DataSetObserver; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.GradientDrawable; -import android.graphics.drawable.GradientDrawable.Orientation; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.view.animation.Interpolator; -import android.widget.LinearLayout; - -/** - * Numeric wheel view. - * - * @author Yuri Kanivets - */ -public class WheelView extends View { - - /** Top and bottom shadows colors */ - private int[] SHADOWS_COLORS = new int[] { 0xFF111111, - 0x00AAAAAA, 0x00AAAAAA }; - - /** Top and bottom items offset (to hide that) */ - private static final int ITEM_OFFSET_PERCENT = 0; - - /** Left and right padding value */ - private static final int PADDING = 10; - - /** Default count of visible items */ - private static final int DEF_VISIBLE_ITEMS = 5; - - // Wheel Values - private int currentItem = 0; - - // Count of visible items - private int visibleItems = DEF_VISIBLE_ITEMS; - - // Item height - private int itemHeight = 0; - - // Center Line - private Drawable centerDrawable; - - // Wheel drawables - private int wheelBackground = R.drawable.wheel_bg; - private int wheelForeground = R.drawable.wheel_val; - - // Shadows drawables - private GradientDrawable topShadow; - private GradientDrawable bottomShadow; - - // Draw Shadows - private boolean drawShadows = true; - - // Scrolling - private WheelScroller scroller; - private boolean isScrollingPerformed; - private int scrollingOffset; - - // Cyclic - boolean isCyclic = false; - - // Items layout - private LinearLayout itemsLayout; - - // The number of first item in layout - private int firstItem; - - // View adapter - private WheelViewAdapter viewAdapter; - - // Recycle - private WheelRecycle recycle = new WheelRecycle(this); - - // Listeners - private List changingListeners = new LinkedList(); - private List scrollingListeners = new LinkedList(); - private List clickingListeners = new LinkedList(); - - /** - * Constructor - */ - public WheelView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - initData(context); - } - - /** - * Constructor - */ - public WheelView(Context context, AttributeSet attrs) { - super(context, attrs); - initData(context); - } - - /** - * Constructor - */ - public WheelView(Context context) { - super(context); - initData(context); - } - - /** - * Initializes class data - * @param context the context - */ - private void initData(Context context) { - scroller = new WheelScroller(getContext(), scrollingListener); - } - - // Scrolling listener - WheelScroller.ScrollingListener scrollingListener = new WheelScroller.ScrollingListener() { - @Override - public void onStarted() { - isScrollingPerformed = true; - notifyScrollingListenersAboutStart(); - } - - @Override - public void onScroll(int distance) { - doScroll(distance); - - int height = getHeight(); - if (scrollingOffset > height) { - scrollingOffset = height; - scroller.stopScrolling(); - } else if (scrollingOffset < -height) { - scrollingOffset = -height; - scroller.stopScrolling(); - } - } - - @Override - public void onFinished() { - if (isScrollingPerformed) { - notifyScrollingListenersAboutEnd(); - isScrollingPerformed = false; - } - - scrollingOffset = 0; - invalidate(); - } - - @Override - public void onJustify() { - if (Math.abs(scrollingOffset) > WheelScroller.MIN_DELTA_FOR_SCROLLING) { - scroller.scroll(scrollingOffset, 0); - } - } - }; - - /** - * Set the the specified scrolling interpolator - * @param interpolator the interpolator - */ - public void setInterpolator(Interpolator interpolator) { - scroller.setInterpolator(interpolator); - } - - /** - * Gets count of visible items - * - * @return the count of visible items - */ - public int getVisibleItems() { - return visibleItems; - } - - /** - * Sets the desired count of visible items. - * Actual amount of visible items depends on wheel layout parameters. - * To apply changes and rebuild view call measure(). - * - * @param count the desired count for visible items - */ - public void setVisibleItems(int count) { - visibleItems = count; - } - - /** - * Gets view adapter - * @return the view adapter - */ - public WheelViewAdapter getViewAdapter() { - return viewAdapter; - } - - // Adapter listener - private DataSetObserver dataObserver = new DataSetObserver() { - @Override - public void onChanged() { - invalidateWheel(false); - } - - @Override - public void onInvalidated() { - invalidateWheel(true); - } - }; - - /** - * Sets view adapter. Usually new adapters contain different views, so - * it needs to rebuild view by calling measure(). - * - * @param viewAdapter the view adapter - */ - public void setViewAdapter(WheelViewAdapter viewAdapter) { - if (this.viewAdapter != null) { - this.viewAdapter.unregisterDataSetObserver(dataObserver); - } - this.viewAdapter = viewAdapter; - if (this.viewAdapter != null) { - this.viewAdapter.registerDataSetObserver(dataObserver); - } - - invalidateWheel(true); - } - - /** - * Adds wheel changing listener - * @param listener the listener - */ - public void addChangingListener(OnWheelChangedListener listener) { - changingListeners.add(listener); - } - - /** - * Removes wheel changing listener - * @param listener the listener - */ - public void removeChangingListener(OnWheelChangedListener listener) { - changingListeners.remove(listener); - } - - /** - * Notifies changing listeners - * @param oldValue the old wheel value - * @param newValue the new wheel value - */ - protected void notifyChangingListeners(int oldValue, int newValue) { - for (OnWheelChangedListener listener : changingListeners) { - listener.onChanged(this, oldValue, newValue); - } - } - - /** - * Adds wheel scrolling listener - * @param listener the listener - */ - public void addScrollingListener(OnWheelScrollListener listener) { - scrollingListeners.add(listener); - } - - /** - * Removes wheel scrolling listener - * @param listener the listener - */ - public void removeScrollingListener(OnWheelScrollListener listener) { - scrollingListeners.remove(listener); - } - - /** - * Notifies listeners about starting scrolling - */ - protected void notifyScrollingListenersAboutStart() { - for (OnWheelScrollListener listener : scrollingListeners) { - listener.onScrollingStarted(this); - } - } - - /** - * Notifies listeners about ending scrolling - */ - protected void notifyScrollingListenersAboutEnd() { - for (OnWheelScrollListener listener : scrollingListeners) { - listener.onScrollingFinished(this); - } - } - - /** - * Adds wheel clicking listener - * @param listener the listener - */ - public void addClickingListener(OnWheelClickedListener listener) { - clickingListeners.add(listener); - } - - /** - * Removes wheel clicking listener - * @param listener the listener - */ - public void removeClickingListener(OnWheelClickedListener listener) { - clickingListeners.remove(listener); - } - - /** - * Notifies listeners about clicking - */ - protected void notifyClickListenersAboutClick(int item) { - for (OnWheelClickedListener listener : clickingListeners) { - listener.onItemClicked(this, item); - } - } - - /** - * Gets current value - * - * @return the current value - */ - public int getCurrentItem() { - return currentItem; - } - - /** - * Sets the current item. Does nothing when index is wrong. - * - * @param index the item index - * @param animated the animation flag - */ - public void setCurrentItem(int index, boolean animated) { - if (viewAdapter == null || viewAdapter.getItemsCount() == 0) { - return; // throw? - } - - int itemCount = viewAdapter.getItemsCount(); - if (index < 0 || index >= itemCount) { - if (isCyclic) { - while (index < 0) { - index += itemCount; - } - index %= itemCount; - } else{ - return; // throw? - } - } - if (index != currentItem) { - if (animated) { - int itemsToScroll = index - currentItem; - if (isCyclic) { - int scroll = itemCount + Math.min(index, currentItem) - Math.max(index, currentItem); - if (scroll < Math.abs(itemsToScroll)) { - itemsToScroll = itemsToScroll < 0 ? scroll : -scroll; - } - } - scroll(itemsToScroll, 0); - } else { - scrollingOffset = 0; - - int old = currentItem; - currentItem = index; - - notifyChangingListeners(old, currentItem); - - invalidate(); - } - } - } - - /** - * Sets the current item w/o animation. Does nothing when index is wrong. - * - * @param index the item index - */ - public void setCurrentItem(int index) { - setCurrentItem(index, false); - } - - /** - * Tests if wheel is cyclic. That means before the 1st item there is shown the last one - * @return true if wheel is cyclic - */ - public boolean isCyclic() { - return isCyclic; - } - - /** - * Set wheel cyclic flag - * @param isCyclic the flag to set - */ - public void setCyclic(boolean isCyclic) { - this.isCyclic = isCyclic; - invalidateWheel(false); - } - - /** - * Determine whether shadows are drawn - * @return true is shadows are drawn - */ - public boolean drawShadows() { - return drawShadows; - } - - /** - * Set whether shadows should be drawn - * @param drawShadows flag as true or false - */ - public void setDrawShadows(boolean drawShadows) { - this.drawShadows = drawShadows; - } - - /** - * Set the shadow gradient color - * @param start - * @param middle - * @param end - */ - public void setShadowColor(int start, int middle, int end) { - SHADOWS_COLORS = new int[] {start, middle, end}; - } - - /** - * Sets the drawable for the wheel background - * @param resource - */ - public void setWheelBackground(int resource) { - wheelBackground = resource; - setBackgroundResource(wheelBackground); - } - - /** - * Sets the drawable for the wheel foreground - * @param resource - */ - public void setWheelForeground(int resource) { - wheelForeground = resource; - centerDrawable = getContext().getResources().getDrawable(wheelForeground); - } - - /** - * Invalidates wheel - * @param clearCaches if true then cached views will be clear - */ - public void invalidateWheel(boolean clearCaches) { - if (clearCaches) { - recycle.clearAll(); - if (itemsLayout != null) { - itemsLayout.removeAllViews(); - } - scrollingOffset = 0; - } else if (itemsLayout != null) { - // cache all items - recycle.recycleItems(itemsLayout, firstItem, new ItemsRange()); - } - - invalidate(); - } - - /** - * Initializes resources - */ - private void initResourcesIfNecessary() { - if (centerDrawable == null) { - centerDrawable = getContext().getResources().getDrawable(wheelForeground); - } - - if (topShadow == null) { - topShadow = new GradientDrawable(Orientation.TOP_BOTTOM, SHADOWS_COLORS); - } - - if (bottomShadow == null) { - bottomShadow = new GradientDrawable(Orientation.BOTTOM_TOP, SHADOWS_COLORS); - } - - setBackgroundResource(wheelBackground); - } - - /** - * Calculates desired height for layout - * - * @param layout - * the source layout - * @return the desired layout height - */ - private int getDesiredHeight(LinearLayout layout) { - if (layout != null && layout.getChildAt(0) != null) { - itemHeight = layout.getChildAt(0).getMeasuredHeight(); - } - - int desired = itemHeight * visibleItems - itemHeight * ITEM_OFFSET_PERCENT / 50; - - return Math.max(desired, getSuggestedMinimumHeight()); - } - - /** - * Returns height of wheel item - * @return the item height - */ - private int getItemHeight() { - if (itemHeight != 0) { - return itemHeight; - } - - if (itemsLayout != null && itemsLayout.getChildAt(0) != null) { - itemHeight = itemsLayout.getChildAt(0).getHeight(); - return itemHeight; - } - - return getHeight() / visibleItems; - } - - /** - * Calculates control width and creates text layouts - * @param widthSize the input layout width - * @param mode the layout mode - * @return the calculated control width - */ - private int calculateLayoutWidth(int widthSize, int mode) { - initResourcesIfNecessary(); - - // TODO: make it static - itemsLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); - itemsLayout.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.UNSPECIFIED), - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - int width = itemsLayout.getMeasuredWidth(); - - if (mode == MeasureSpec.EXACTLY) { - width = widthSize; - } else { - width += 2 * PADDING; - - // Check against our minimum width - width = Math.max(width, getSuggestedMinimumWidth()); - - if (mode == MeasureSpec.AT_MOST && widthSize < width) { - width = widthSize; - } - } - - itemsLayout.measure(MeasureSpec.makeMeasureSpec(width - 2 * PADDING, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - - return width; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - int widthSize = MeasureSpec.getSize(widthMeasureSpec); - int heightSize = MeasureSpec.getSize(heightMeasureSpec); - - buildViewForMeasuring(); - - int width = calculateLayoutWidth(widthSize, widthMode); - - int height; - if (heightMode == MeasureSpec.EXACTLY) { - height = heightSize; - } else { - height = getDesiredHeight(itemsLayout); - - if (heightMode == MeasureSpec.AT_MOST) { - height = Math.min(height, heightSize); - } - } - - setMeasuredDimension(width, height); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - layout(r - l, b - t); - } - - /** - * Sets layouts width and height - * @param width the layout width - * @param height the layout height - */ - private void layout(int width, int height) { - int itemsWidth = width - 2 * PADDING; - - itemsLayout.layout(0, 0, itemsWidth, height); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (viewAdapter != null && viewAdapter.getItemsCount() > 0) { - updateView(); - - drawItems(canvas); - drawCenterRect(canvas); - } - - if (drawShadows) drawShadows(canvas); - } - - /** - * Draws shadows on top and bottom of control - * @param canvas the canvas for drawing - */ - private void drawShadows(Canvas canvas) { - int height = (int)(1.5 * getItemHeight()); - topShadow.setBounds(0, 0, getWidth(), height); - topShadow.draw(canvas); - - bottomShadow.setBounds(0, getHeight() - height, getWidth(), getHeight()); - bottomShadow.draw(canvas); - } - - /** - * Draws items - * @param canvas the canvas for drawing - */ - private void drawItems(Canvas canvas) { - canvas.save(); - - int top = (currentItem - firstItem) * getItemHeight() + (getItemHeight() - getHeight()) / 2; - canvas.translate(PADDING, - top + scrollingOffset); - - itemsLayout.draw(canvas); - - canvas.restore(); - } - - /** - * Draws rect for current value - * @param canvas the canvas for drawing - */ - private void drawCenterRect(Canvas canvas) { - int center = getHeight() / 2; - int offset = (int) (getItemHeight() / 2 * 1.2); - centerDrawable.setBounds(0, center - offset, getWidth(), center + offset); - centerDrawable.draw(canvas); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if (!isEnabled() || getViewAdapter() == null) { - return true; - } - - switch (event.getAction()) { - case MotionEvent.ACTION_MOVE: - if (getParent() != null) { - getParent().requestDisallowInterceptTouchEvent(true); - } - break; - - case MotionEvent.ACTION_UP: - if (!isScrollingPerformed) { - int distance = (int) event.getY() - getHeight() / 2; - if (distance > 0) { - distance += getItemHeight() / 2; - } else { - distance -= getItemHeight() / 2; - } - int items = distance / getItemHeight(); - if (items != 0 && isValidItemIndex(currentItem + items)) { - notifyClickListenersAboutClick(currentItem + items); - } - } - break; - } - - return scroller.onTouchEvent(event); - } - - /** - * Scrolls the wheel - * @param delta the scrolling value - */ - private void doScroll(int delta) { - scrollingOffset += delta; - - int itemHeight = getItemHeight(); - int count = scrollingOffset / itemHeight; - - int pos = currentItem - count; - int itemCount = viewAdapter.getItemsCount(); - - int fixPos = scrollingOffset % itemHeight; - if (Math.abs(fixPos) <= itemHeight / 2) { - fixPos = 0; - } - if (isCyclic && itemCount > 0) { - if (fixPos > 0) { - pos--; - count++; - } else if (fixPos < 0) { - pos++; - count--; - } - // fix position by rotating - while (pos < 0) { - pos += itemCount; - } - pos %= itemCount; - } else { - // - if (pos < 0) { - count = currentItem; - pos = 0; - } else if (pos >= itemCount) { - count = currentItem - itemCount + 1; - pos = itemCount - 1; - } else if (pos > 0 && fixPos > 0) { - pos--; - count++; - } else if (pos < itemCount - 1 && fixPos < 0) { - pos++; - count--; - } - } - - int offset = scrollingOffset; - if (pos != currentItem) { - setCurrentItem(pos, false); - } else { - invalidate(); - } - - // update offset - scrollingOffset = offset - count * itemHeight; - if (scrollingOffset > getHeight()) { - if(getHeight() <= 0){ - scrollingOffset = 0; - }else { - scrollingOffset = scrollingOffset % getHeight() + getHeight(); - } - } - } - - /** - * Scroll the wheel - * @param itemsToSkip items to scroll - * @param time scrolling duration - */ - public void scroll(int itemsToScroll, int time) { - int distance = itemsToScroll * getItemHeight() - scrollingOffset; - scroller.scroll(distance, time); - } - - /** - * Calculates range for wheel items - * @return the items range - */ - private ItemsRange getItemsRange() { - if (getItemHeight() == 0) { - return null; - } - - int first = currentItem; - int count = 1; - - while (count * getItemHeight() < getHeight()) { - first--; - count += 2; // top + bottom items - } - - if (scrollingOffset != 0) { - if (scrollingOffset > 0) { - first--; - } - count++; - - // process empty items above the first or below the second - int emptyItems = scrollingOffset / getItemHeight(); - first -= emptyItems; - count += Math.asin(emptyItems); - } - return new ItemsRange(first, count); - } - - /** - * Rebuilds wheel items if necessary. Caches all unused items. - * - * @return true if items are rebuilt - */ - private boolean rebuildItems() { - boolean updated = false; - ItemsRange range = getItemsRange(); - if (itemsLayout != null) { - int first = recycle.recycleItems(itemsLayout, firstItem, range); - updated = firstItem != first; - firstItem = first; - } else { - createItemsLayout(); - updated = true; - } - - if (!updated) { - updated = firstItem != range.getFirst() || itemsLayout.getChildCount() != range.getCount(); - } - - if (firstItem > range.getFirst() && firstItem <= range.getLast()) { - for (int i = firstItem - 1; i >= range.getFirst(); i--) { - if (!addViewItem(i, true)) { - break; - } - firstItem = i; - } - } else { - firstItem = range.getFirst(); - } - - int first = firstItem; - for (int i = itemsLayout.getChildCount(); i < range.getCount(); i++) { - if (!addViewItem(firstItem + i, false) && itemsLayout.getChildCount() == 0) { - first++; - } - } - firstItem = first; - - return updated; - } - - /** - * Updates view. Rebuilds items and label if necessary, recalculate items sizes. - */ - private void updateView() { - if (rebuildItems()) { - calculateLayoutWidth(getWidth(), MeasureSpec.EXACTLY); - layout(getWidth(), getHeight()); - } - } - - /** - * Creates item layouts if necessary - */ - private void createItemsLayout() { - if (itemsLayout == null) { - itemsLayout = new LinearLayout(getContext()); - itemsLayout.setOrientation(LinearLayout.VERTICAL); - } - } - - /** - * Builds view for measuring - */ - private void buildViewForMeasuring() { - // clear all items - if (itemsLayout != null) { - recycle.recycleItems(itemsLayout, firstItem, new ItemsRange()); - } else { - createItemsLayout(); - } - - // add views - // all items must be included to measure width correctly - for (int i = viewAdapter.getItemsCount()-1; i >= 0; i--){ - if (addViewItem(i, true)) { - firstItem = i; - } - } - } - - /** - * Adds view for item to items layout - * @param index the item index - * @param first the flag indicates if view should be first - * @return true if corresponding item exists and is added - */ - private boolean addViewItem(int index, boolean first) { - View view = getItemView(index); - if (view != null) { - if (first) { - itemsLayout.addView(view, 0); - } else { - itemsLayout.addView(view); - } - - return true; - } - - return false; - } - - /** - * Checks whether intem index is valid - * @param index the item index - * @return true if item index is not out of bounds or the wheel is cyclic - */ - private boolean isValidItemIndex(int index) { - return viewAdapter != null && viewAdapter.getItemsCount() > 0 && - (isCyclic || index >= 0 && index < viewAdapter.getItemsCount()); - } - - /** - * Returns view for specified item - * @param index the item index - * @return item view or empty view if index is out of bounds - */ - private View getItemView(int index) { - if (viewAdapter == null || viewAdapter.getItemsCount() == 0) { - return null; - } - int count = viewAdapter.getItemsCount(); - if (!isValidItemIndex(index)) { - return viewAdapter.getEmptyItem(recycle.getEmptyItem(), itemsLayout); - } else { - while (index < 0) { - index = count + index; - } - } - - index %= count; - return viewAdapter.getItem(index, recycle.getItem(), itemsLayout); - } - - /** - * Stops scrolling - */ - public void stopScrolling() { - scroller.stopScrolling(); - } -} +/* + * Android Wheel Control. + * https://code.google.com/p/android-wheel/ + * + * Copyright 2011 Yuri Kanivets + * + * 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 kankan.wheel.widget; + +import android.content.Context; +import android.database.DataSetObserver; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.GradientDrawable.Orientation; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.animation.Interpolator; +import android.widget.LinearLayout; + +import java.util.LinkedList; +import java.util.List; + +import kankan.wheel.widget.adapters.WheelViewAdapter; + +/** + * Numeric wheel view. + * + * @author Yuri Kanivets + */ +public class WheelView extends View { + + /** Top and bottom shadows colors */ + private int[] SHADOWS_COLORS = new int[] { 0xFF111111, + 0x00AAAAAA, 0x00AAAAAA }; + + /** Top and bottom items offset (to hide that) */ + private static final int ITEM_OFFSET_PERCENT = 0; + + /** Left and right padding value */ + private static final int PADDING = 10; + + /** Default count of visible items */ + private static final int DEF_VISIBLE_ITEMS = 5; + + // Wheel Values + private int currentItem = 0; + + // Count of visible items + private int visibleItems = DEF_VISIBLE_ITEMS; + + // Item height + private int itemHeight = 0; + + // Center Line + private Drawable centerDrawable; + + // Wheel drawables + private int wheelBackground = R.drawable.wheel_bg; + private int wheelForeground = R.drawable.wheel_val; + + // Shadows drawables + private GradientDrawable topShadow; + private GradientDrawable bottomShadow; + + // Draw Shadows + private boolean drawShadows = true; + + // Scrolling + private WheelScroller scroller; + private boolean isScrollingPerformed; + private int scrollingOffset; + + // Cyclic + boolean isCyclic = false; + + // Items layout + private LinearLayout itemsLayout; + + // The number of first item in layout + private int firstItem; + + // View adapter + private WheelViewAdapter viewAdapter; + + // Recycle + private WheelRecycle recycle = new WheelRecycle(this); + + // Listeners + private List changingListeners = new LinkedList(); + private List scrollingListeners = new LinkedList(); + private List clickingListeners = new LinkedList(); + + /** + * Constructor + */ + public WheelView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initData(context); + } + + /** + * Constructor + */ + public WheelView(Context context, AttributeSet attrs) { + super(context, attrs); + initData(context); + } + + /** + * Constructor + */ + public WheelView(Context context) { + super(context); + initData(context); + } + + /** + * Initializes class data + * @param context the context + */ + private void initData(Context context) { + scroller = new WheelScroller(getContext(), scrollingListener); + } + + // Scrolling listener + WheelScroller.ScrollingListener scrollingListener = new WheelScroller.ScrollingListener() { + @Override + public void onStarted() { + isScrollingPerformed = true; + notifyScrollingListenersAboutStart(); + } + + @Override + public void onScroll(int distance) { + doScroll(distance); + + int height = getHeight(); + if (scrollingOffset > height) { + scrollingOffset = height; + scroller.stopScrolling(); + } else if (scrollingOffset < -height) { + scrollingOffset = -height; + scroller.stopScrolling(); + } + } + + @Override + public void onFinished() { + if (isScrollingPerformed) { + notifyScrollingListenersAboutEnd(); + isScrollingPerformed = false; + } + + scrollingOffset = 0; + invalidate(); + } + + @Override + public void onJustify() { + if (Math.abs(scrollingOffset) > WheelScroller.MIN_DELTA_FOR_SCROLLING) { + scroller.scroll(scrollingOffset, 0); + } + } + }; + + /** + * Set the the specified scrolling interpolator + * @param interpolator the interpolator + */ + public void setInterpolator(Interpolator interpolator) { + scroller.setInterpolator(interpolator); + } + + /** + * Gets count of visible items + * + * @return the count of visible items + */ + public int getVisibleItems() { + return visibleItems; + } + + /** + * Sets the desired count of visible items. + * Actual amount of visible items depends on wheel layout parameters. + * To apply changes and rebuild view call measure(). + * + * @param count the desired count for visible items + */ + public void setVisibleItems(int count) { + visibleItems = count; + } + + /** + * Gets view adapter + * @return the view adapter + */ + public WheelViewAdapter getViewAdapter() { + return viewAdapter; + } + + // Adapter listener + private DataSetObserver dataObserver = new DataSetObserver() { + @Override + public void onChanged() { + invalidateWheel(false); + } + + @Override + public void onInvalidated() { + invalidateWheel(true); + } + }; + + /** + * Sets view adapter. Usually new adapters contain different views, so + * it needs to rebuild view by calling measure(). + * + * @param viewAdapter the view adapter + */ + public void setViewAdapter(WheelViewAdapter viewAdapter) { + if (this.viewAdapter != null) { + this.viewAdapter.unregisterDataSetObserver(dataObserver); + } + this.viewAdapter = viewAdapter; + if (this.viewAdapter != null) { + this.viewAdapter.registerDataSetObserver(dataObserver); + } + + invalidateWheel(true); + } + + /** + * Adds wheel changing listener + * @param listener the listener + */ + public void addChangingListener(OnWheelChangedListener listener) { + changingListeners.add(listener); + } + + /** + * Removes wheel changing listener + * @param listener the listener + */ + public void removeChangingListener(OnWheelChangedListener listener) { + changingListeners.remove(listener); + } + + /** + * Notifies changing listeners + * @param oldValue the old wheel value + * @param newValue the new wheel value + */ + protected void notifyChangingListeners(int oldValue, int newValue) { + for (OnWheelChangedListener listener : changingListeners) { + listener.onChanged(this, oldValue, newValue); + } + } + + /** + * Adds wheel scrolling listener + * @param listener the listener + */ + public void addScrollingListener(OnWheelScrollListener listener) { + scrollingListeners.add(listener); + } + + /** + * Removes wheel scrolling listener + * @param listener the listener + */ + public void removeScrollingListener(OnWheelScrollListener listener) { + scrollingListeners.remove(listener); + } + + /** + * Notifies listeners about starting scrolling + */ + protected void notifyScrollingListenersAboutStart() { + for (OnWheelScrollListener listener : scrollingListeners) { + listener.onScrollingStarted(this); + } + } + + /** + * Notifies listeners about ending scrolling + */ + protected void notifyScrollingListenersAboutEnd() { + for (OnWheelScrollListener listener : scrollingListeners) { + listener.onScrollingFinished(this); + } + } + + /** + * Adds wheel clicking listener + * @param listener the listener + */ + public void addClickingListener(OnWheelClickedListener listener) { + clickingListeners.add(listener); + } + + /** + * Removes wheel clicking listener + * @param listener the listener + */ + public void removeClickingListener(OnWheelClickedListener listener) { + clickingListeners.remove(listener); + } + + /** + * Notifies listeners about clicking + */ + protected void notifyClickListenersAboutClick(int item) { + for (OnWheelClickedListener listener : clickingListeners) { + listener.onItemClicked(this, item); + } + } + + /** + * Gets current value + * + * @return the current value + */ + public int getCurrentItem() { + return currentItem; + } + + /** + * Sets the current item. Does nothing when index is wrong. + * + * @param index the item index + * @param animated the animation flag + */ + public void setCurrentItem(int index, boolean animated) { + if (viewAdapter == null || viewAdapter.getItemsCount() == 0) { + return; // throw? + } + + int itemCount = viewAdapter.getItemsCount(); + if (index < 0 || index >= itemCount) { + if (isCyclic) { + while (index < 0) { + index += itemCount; + } + index %= itemCount; + } else{ + return; // throw? + } + } + if (index != currentItem) { + if (animated) { + int itemsToScroll = index - currentItem; + if (isCyclic) { + int scroll = itemCount + Math.min(index, currentItem) - Math.max(index, currentItem); + if (scroll < Math.abs(itemsToScroll)) { + itemsToScroll = itemsToScroll < 0 ? scroll : -scroll; + } + } + scroll(itemsToScroll, 0); + } else { + scrollingOffset = 0; + + int old = currentItem; + currentItem = index; + + notifyChangingListeners(old, currentItem); + + invalidate(); + } + } + } + + /** + * Sets the current item w/o animation. Does nothing when index is wrong. + * + * @param index the item index + */ + public void setCurrentItem(int index) { + setCurrentItem(index, false); + } + + /** + * Tests if wheel is cyclic. That means before the 1st item there is shown the last one + * @return true if wheel is cyclic + */ + public boolean isCyclic() { + return isCyclic; + } + + /** + * Set wheel cyclic flag + * @param isCyclic the flag to set + */ + public void setCyclic(boolean isCyclic) { + this.isCyclic = isCyclic; + invalidateWheel(false); + } + + /** + * Determine whether shadows are drawn + * @return true is shadows are drawn + */ + public boolean drawShadows() { + return drawShadows; + } + + /** + * Set whether shadows should be drawn + * @param drawShadows flag as true or false + */ + public void setDrawShadows(boolean drawShadows) { + this.drawShadows = drawShadows; + } + + /** + * Set the shadow gradient color + * @param start + * @param middle + * @param end + */ + public void setShadowColor(int start, int middle, int end) { + SHADOWS_COLORS = new int[] {start, middle, end}; + } + + /** + * Sets the drawable for the wheel background + * @param resource + */ + public void setWheelBackground(int resource) { + wheelBackground = resource; + setBackgroundResource(wheelBackground); + } + + /** + * Sets the drawable for the wheel foreground + * @param resource + */ + public void setWheelForeground(int resource) { + wheelForeground = resource; + centerDrawable = getContext().getResources().getDrawable(wheelForeground); + } + + /** + * Invalidates wheel + * @param clearCaches if true then cached views will be clear + */ + public void invalidateWheel(boolean clearCaches) { + if (clearCaches) { + recycle.clearAll(); + if (itemsLayout != null) { + itemsLayout.removeAllViews(); + } + scrollingOffset = 0; + } else if (itemsLayout != null) { + // cache all items + recycle.recycleItems(itemsLayout, firstItem, new ItemsRange()); + } + + invalidate(); + } + + /** + * Initializes resources + */ + private void initResourcesIfNecessary() { + if (centerDrawable == null) { + centerDrawable = getContext().getResources().getDrawable(wheelForeground); + } + + if (topShadow == null) { + topShadow = new GradientDrawable(Orientation.TOP_BOTTOM, SHADOWS_COLORS); + } + + if (bottomShadow == null) { + bottomShadow = new GradientDrawable(Orientation.BOTTOM_TOP, SHADOWS_COLORS); + } + + setBackgroundResource(wheelBackground); + } + + /** + * Calculates desired height for layout + * + * @param layout + * the source layout + * @return the desired layout height + */ + private int getDesiredHeight(LinearLayout layout) { + if (layout != null && layout.getChildAt(0) != null) { + itemHeight = layout.getChildAt(0).getMeasuredHeight(); + } + + int desired = itemHeight * visibleItems - itemHeight * ITEM_OFFSET_PERCENT / 50; + + return Math.max(desired, getSuggestedMinimumHeight()); + } + + /** + * Returns height of wheel item + * @return the item height + */ + private int getItemHeight() { + if (itemHeight != 0) { + return itemHeight; + } + + if (itemsLayout != null && itemsLayout.getChildAt(0) != null) { + itemHeight = itemsLayout.getChildAt(0).getHeight(); + return itemHeight; + } + + return getHeight() / visibleItems; + } + + /** + * Calculates control width and creates text layouts + * @param widthSize the input layout width + * @param mode the layout mode + * @return the calculated control width + */ + private int calculateLayoutWidth(int widthSize, int mode) { + initResourcesIfNecessary(); + + // TODO: make it static + itemsLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + itemsLayout.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + int width = itemsLayout.getMeasuredWidth(); + + if (mode == MeasureSpec.EXACTLY) { + width = widthSize; + } else { + width += 2 * PADDING; + + // Check against our minimum width + width = Math.max(width, getSuggestedMinimumWidth()); + + if (mode == MeasureSpec.AT_MOST && widthSize < width) { + width = widthSize; + } + } + + itemsLayout.measure(MeasureSpec.makeMeasureSpec(width - 2 * PADDING, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + + return width; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + buildViewForMeasuring(); + + int width = calculateLayoutWidth(widthSize, widthMode); + + int height; + if (heightMode == MeasureSpec.EXACTLY) { + height = heightSize; + } else { + height = getDesiredHeight(itemsLayout); + + if (heightMode == MeasureSpec.AT_MOST) { + height = Math.min(height, heightSize); + } + } + + setMeasuredDimension(width, height); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + layout(r - l, b - t); + } + + /** + * Sets layouts width and height + * @param width the layout width + * @param height the layout height + */ + private void layout(int width, int height) { + int itemsWidth = width - 2 * PADDING; + + itemsLayout.layout(0, 0, itemsWidth, height); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + if (viewAdapter != null && viewAdapter.getItemsCount() > 0) { + updateView(); + + drawItems(canvas); + drawCenterRect(canvas); + } + + if (drawShadows) drawShadows(canvas); + } + + /** + * Draws shadows on top and bottom of control + * @param canvas the canvas for drawing + */ + private void drawShadows(Canvas canvas) { + int height = (int)(1.5 * getItemHeight()); + topShadow.setBounds(0, 0, getWidth(), height); + topShadow.draw(canvas); + + bottomShadow.setBounds(0, getHeight() - height, getWidth(), getHeight()); + bottomShadow.draw(canvas); + } + + /** + * Draws items + * @param canvas the canvas for drawing + */ + private void drawItems(Canvas canvas) { + canvas.save(); + + int top = (currentItem - firstItem) * getItemHeight() + (getItemHeight() - getHeight()) / 2; + canvas.translate(PADDING, - top + scrollingOffset); + + itemsLayout.draw(canvas); + + canvas.restore(); + } + + /** + * Draws rect for current value + * @param canvas the canvas for drawing + */ + private void drawCenterRect(Canvas canvas) { + int center = getHeight() / 2; + int offset = (int) (getItemHeight() / 2 * 1.2); + centerDrawable.setBounds(0, center - offset, getWidth(), center + offset); + centerDrawable.draw(canvas); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isEnabled() || getViewAdapter() == null) { + return true; + } + + switch (event.getAction()) { + case MotionEvent.ACTION_MOVE: + if (getParent() != null) { + getParent().requestDisallowInterceptTouchEvent(true); + } + break; + + case MotionEvent.ACTION_UP: + if (!isScrollingPerformed) { + int distance = (int) event.getY() - getHeight() / 2; + if (distance > 0) { + distance += getItemHeight() / 2; + } else { + distance -= getItemHeight() / 2; + } + int items = distance / getItemHeight(); + if (items != 0 && isValidItemIndex(currentItem + items)) { + notifyClickListenersAboutClick(currentItem + items); + } + } + break; + } + + return scroller.onTouchEvent(event); + } + + /** + * Scrolls the wheel + * @param delta the scrolling value + */ + private void doScroll(int delta) { + scrollingOffset += delta; + + int itemHeight = getItemHeight(); + int count = scrollingOffset / itemHeight; + + int pos = currentItem - count; + int itemCount = viewAdapter.getItemsCount(); + + int fixPos = scrollingOffset % itemHeight; + if (Math.abs(fixPos) <= itemHeight / 2) { + fixPos = 0; + } + if (isCyclic && itemCount > 0) { + if (fixPos > 0) { + pos--; + count++; + } else if (fixPos < 0) { + pos++; + count--; + } + // fix position by rotating + while (pos < 0) { + pos += itemCount; + } + pos %= itemCount; + } else { + // + if (pos < 0) { + count = currentItem; + pos = 0; + } else if (pos >= itemCount) { + count = currentItem - itemCount + 1; + pos = itemCount - 1; + } else if (pos > 0 && fixPos > 0) { + pos--; + count++; + } else if (pos < itemCount - 1 && fixPos < 0) { + pos++; + count--; + } + } + + int offset = scrollingOffset; + if (pos != currentItem) { + setCurrentItem(pos, false); + } else { + invalidate(); + } + + // update offset + scrollingOffset = offset - count * itemHeight; + if (scrollingOffset > getHeight()) { + if(getHeight() <= 0){ + scrollingOffset = 0; + }else { + scrollingOffset = scrollingOffset % getHeight() + getHeight(); + } + } + } + + /** + * Scroll the wheel + * @param itemsToSkip items to scroll + * @param time scrolling duration + */ + public void scroll(int itemsToScroll, int time) { + int distance = itemsToScroll * getItemHeight() - scrollingOffset; + scroller.scroll(distance, time); + } + + /** + * Calculates range for wheel items + * @return the items range + */ + private ItemsRange getItemsRange() { + if (getItemHeight() == 0) { + return null; + } + + int first = currentItem; + int count = 1; + + while (count * getItemHeight() < getHeight()) { + first--; + count += 2; // top + bottom items + } + + if (scrollingOffset != 0) { + if (scrollingOffset > 0) { + first--; + } + count++; + + // process empty items above the first or below the second + int emptyItems = scrollingOffset / getItemHeight(); + first -= emptyItems; + count += Math.asin(emptyItems); + } + return new ItemsRange(first, count); + } + + /** + * Rebuilds wheel items if necessary. Caches all unused items. + * + * @return true if items are rebuilt + */ + private boolean rebuildItems() { + boolean updated = false; + ItemsRange range = getItemsRange(); + if (itemsLayout != null) { + int first = recycle.recycleItems(itemsLayout, firstItem, range); + updated = firstItem != first; + firstItem = first; + } else { + createItemsLayout(); + updated = true; + } + + if (!updated) { + updated = firstItem != range.getFirst() || itemsLayout.getChildCount() != range.getCount(); + } + + if (firstItem > range.getFirst() && firstItem <= range.getLast()) { + for (int i = firstItem - 1; i >= range.getFirst(); i--) { + if (!addViewItem(i, true)) { + break; + } + firstItem = i; + } + } else { + firstItem = range.getFirst(); + } + + int first = firstItem; + for (int i = itemsLayout.getChildCount(); i < range.getCount(); i++) { + if (!addViewItem(firstItem + i, false) && itemsLayout.getChildCount() == 0) { + first++; + } + } + firstItem = first; + + return updated; + } + + /** + * Updates view. Rebuilds items and label if necessary, recalculate items sizes. + */ + private void updateView() { + if (rebuildItems()) { + calculateLayoutWidth(getWidth(), MeasureSpec.EXACTLY); + layout(getWidth(), getHeight()); + } + } + + /** + * Creates item layouts if necessary + */ + private void createItemsLayout() { + if (itemsLayout == null) { + itemsLayout = new LinearLayout(getContext()); + itemsLayout.setOrientation(LinearLayout.VERTICAL); + } + } + + /** + * Builds view for measuring + */ + private void buildViewForMeasuring() { + // clear all items + if (itemsLayout != null) { + recycle.recycleItems(itemsLayout, firstItem, new ItemsRange()); + } else { + createItemsLayout(); + } + + // add views + // all items must be included to measure width correctly + for (int i = viewAdapter.getItemsCount()-1; i >= 0; i--){ + if (addViewItem(i, true)) { + firstItem = i; + } + } + } + + /** + * Adds view for item to items layout + * @param index the item index + * @param first the flag indicates if view should be first + * @return true if corresponding item exists and is added + */ + private boolean addViewItem(int index, boolean first) { + View view = getItemView(index); + if (view != null) { + if (first) { + itemsLayout.addView(view, 0); + } else { + itemsLayout.addView(view); + } + + return true; + } + + return false; + } + + /** + * Checks whether intem index is valid + * @param index the item index + * @return true if item index is not out of bounds or the wheel is cyclic + */ + private boolean isValidItemIndex(int index) { + return viewAdapter != null && viewAdapter.getItemsCount() > 0 && + (isCyclic || index >= 0 && index < viewAdapter.getItemsCount()); + } + + /** + * Returns view for specified item + * @param index the item index + * @return item view or empty view if index is out of bounds + */ + private View getItemView(int index) { + if (viewAdapter == null || viewAdapter.getItemsCount() == 0) { + return null; + } + int count = viewAdapter.getItemsCount(); + if (!isValidItemIndex(index)) { + return viewAdapter.getEmptyItem(recycle.getEmptyItem(), itemsLayout); + } else { + while (index < 0) { + index = count + index; + } + } + + index %= count; + return viewAdapter.getItem(index, recycle.getItem(), itemsLayout); + } + + /** + * Stops scrolling + */ + public void stopScrolling() { + scroller.stopScrolling(); + } +} diff --git a/wheel/src/kankan/wheel/widget/adapters/AbstractWheelAdapter.java b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AbstractWheelAdapter.java similarity index 100% rename from wheel/src/kankan/wheel/widget/adapters/AbstractWheelAdapter.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AbstractWheelAdapter.java index aa30f3e..600650b 100644 --- a/wheel/src/kankan/wheel/widget/adapters/AbstractWheelAdapter.java +++ b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AbstractWheelAdapter.java @@ -16,13 +16,13 @@ package kankan.wheel.widget.adapters; -import java.util.LinkedList; -import java.util.List; - import android.database.DataSetObserver; import android.view.View; import android.view.ViewGroup; +import java.util.LinkedList; +import java.util.List; + /** * Abstract Wheel adapter. */ diff --git a/wheel/src/kankan/wheel/widget/adapters/AbstractWheelTextAdapter.java b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AbstractWheelTextAdapter.java similarity index 100% rename from wheel/src/kankan/wheel/widget/adapters/AbstractWheelTextAdapter.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AbstractWheelTextAdapter.java diff --git a/wheel/src/kankan/wheel/widget/adapters/AdapterWheel.java b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AdapterWheel.java similarity index 99% rename from wheel/src/kankan/wheel/widget/adapters/AdapterWheel.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AdapterWheel.java index ed5f275..3c80755 100644 --- a/wheel/src/kankan/wheel/widget/adapters/AdapterWheel.java +++ b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/AdapterWheel.java @@ -16,9 +16,10 @@ package kankan.wheel.widget.adapters; -import kankan.wheel.widget.WheelAdapter; import android.content.Context; +import kankan.wheel.widget.WheelAdapter; + /** * Adapter class for old wheel adapter (deprecated WheelAdapter class). * diff --git a/wheel/src/kankan/wheel/widget/adapters/ArrayWheelAdapter.java b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/ArrayWheelAdapter.java similarity index 100% rename from wheel/src/kankan/wheel/widget/adapters/ArrayWheelAdapter.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/adapters/ArrayWheelAdapter.java diff --git a/wheel/src/kankan/wheel/widget/adapters/NumericWheelAdapter.java b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/NumericWheelAdapter.java similarity index 100% rename from wheel/src/kankan/wheel/widget/adapters/NumericWheelAdapter.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/adapters/NumericWheelAdapter.java diff --git a/wheel/src/kankan/wheel/widget/adapters/WheelViewAdapter.java b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/WheelViewAdapter.java similarity index 97% rename from wheel/src/kankan/wheel/widget/adapters/WheelViewAdapter.java rename to wheel/wheel/src/main/java/kankan/wheel/widget/adapters/WheelViewAdapter.java index 6d9f7b3..88adb46 100644 --- a/wheel/src/kankan/wheel/widget/adapters/WheelViewAdapter.java +++ b/wheel/wheel/src/main/java/kankan/wheel/widget/adapters/WheelViewAdapter.java @@ -60,5 +60,5 @@ public interface WheelViewAdapter { * Unregister an observer that has previously been registered * @param observer the observer to be unregistered */ - void unregisterDataSetObserver (DataSetObserver observer); + void unregisterDataSetObserver(DataSetObserver observer); } diff --git a/wheel/res/drawable/wheel_bg.xml b/wheel/wheel/src/main/res/drawable/wheel_bg.xml similarity index 97% rename from wheel/res/drawable/wheel_bg.xml rename to wheel/wheel/src/main/res/drawable/wheel_bg.xml index c7956b4..5ecd6ad 100644 --- a/wheel/res/drawable/wheel_bg.xml +++ b/wheel/wheel/src/main/res/drawable/wheel_bg.xml @@ -1,42 +1,42 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wheel/res/drawable/wheel_val.xml b/wheel/wheel/src/main/res/drawable/wheel_val.xml similarity index 97% rename from wheel/res/drawable/wheel_val.xml rename to wheel/wheel/src/main/res/drawable/wheel_val.xml index c284bfa..8e7538d 100644 --- a/wheel/res/drawable/wheel_val.xml +++ b/wheel/wheel/src/main/res/drawable/wheel_val.xml @@ -1,29 +1,29 @@ - - - - - - - - - + + + + + + + + + diff --git a/wheel/wheel/src/main/res/values/strings.xml b/wheel/wheel/src/main/res/values/strings.xml new file mode 100644 index 0000000..bf74f80 --- /dev/null +++ b/wheel/wheel/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Android Wheel Widget + diff --git a/wheel/wheel/src/test/java/kankan/wheel/widget/ExampleUnitTest.java b/wheel/wheel/src/test/java/kankan/wheel/widget/ExampleUnitTest.java new file mode 100644 index 0000000..83fb235 --- /dev/null +++ b/wheel/wheel/src/test/java/kankan/wheel/widget/ExampleUnitTest.java @@ -0,0 +1,15 @@ +package kankan.wheel.widget; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * To work on unit tests, switch the Test Artifact in the Build Variants view. + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file