diff --git a/README.md b/README.md index f61e56662..204072e90 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ take a look at our [Getting Started](docs/getting-started.md) guide. - [All Components](https://github.com/material-components/material-components-android/tree/master/lib/) - [Getting Started](docs/getting-started.md) - [Contributing](docs/contributing.md) +- [Building From Source](building-from-source.md) +- [Catalog App](catalog-app.md) - [Class documentation](https://developer.android.com/reference/com/google/android/material/classes) (external site) diff --git a/catalog/build.gradle b/catalog/build.gradle new file mode 100644 index 000000000..19bfe7828 --- /dev/null +++ b/catalog/build.gradle @@ -0,0 +1,69 @@ +apply plugin: 'com.android.application' + +dependencies { + api 'com.google.dagger:dagger:2.15' + annotationProcessor 'com.google.dagger:dagger-compiler:2.15' + + api 'com.google.dagger:dagger-android:2.15' + api 'com.google.dagger:dagger-android-support:2.15' + annotationProcessor 'com.google.dagger:dagger-android-processor:2.15' + + api 'com.android.support:multidex:1.0.3' + + api project(':lib') +} + +def srcDirs = [ + 'application', + 'application/attrs', + 'application/legacymultidex', + 'application/scope', + 'application/theme', + 'assets', + 'bottomappbar', + 'bottomnav', + 'button', + 'card', + 'chip', + 'draggable', + 'fab', + 'feature', + 'font', + 'main', + 'tableofcontents', + 'tabs', + 'textfield', + 'themeswitcher', + 'topappbar', + 'transformation' +] + +android { + defaultConfig { + manifestPlaceholders = [ + application_name : 'CatalogApplication', + application_theme : 'Catalog', + catalog_application_component: 'io.material.catalog.application.DaggerCatalogApplicationComponent' + ] + } + + sourceSets { + main { + manifest.srcFile 'java/io/material/catalog/AndroidManifest.xml' + java.srcDir 'java' + java.includes = srcDirs.collect { 'io/material/catalog/' + it + '/**/*.java' } + java.excludes = [ + '**/build/**', + ] + res.srcDirs = ['java/io/material/catalog/res'] + srcDirs.forEach { + res.srcDirs += 'java/io/material/catalog/' + it + '/res' + } + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} diff --git a/catalog/java/io/material/catalog/AndroidManifest.xml b/catalog/java/io/material/catalog/AndroidManifest.xml new file mode 100644 index 000000000..b1bcf4ea5 --- /dev/null +++ b/catalog/java/io/material/catalog/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + diff --git a/catalog/java/io/material/catalog/README.md b/catalog/java/io/material/catalog/README.md new file mode 100644 index 000000000..a5ae5bb27 --- /dev/null +++ b/catalog/java/io/material/catalog/README.md @@ -0,0 +1,2 @@ +# Catalog + diff --git a/catalog/java/io/material/catalog/application/CatalogApplication.java b/catalog/java/io/material/catalog/application/CatalogApplication.java new file mode 100644 index 000000000..dc50ab876 --- /dev/null +++ b/catalog/java/io/material/catalog/application/CatalogApplication.java @@ -0,0 +1,97 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.application; + +import android.app.Activity; +import android.app.Application; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.util.Log; +import dagger.android.AndroidInjector; +import dagger.android.DispatchingAndroidInjector; +import dagger.android.HasActivityInjector; +import java.lang.reflect.InvocationTargetException; +import javax.inject.Inject; + +/** Catalog application class that provides support for using dispatching Dagger injectors. */ +public class CatalogApplication extends Application implements HasActivityInjector { + + /** Logging tag */ + public static final String TAG = "CatalogApplication"; + /** Key that contains the class name to replace the default application component. */ + public static final String COMPONENT_OVERRIDE_KEY = + "io.material.catalog.application.componentOverride"; + + @Inject DispatchingAndroidInjector activityInjector; + + @Override + public void onCreate() { + super.onCreate(); + if (!overrideApplicationComponent(this)) { + DaggerCatalogApplicationComponent.builder().application(this).build().inject(this); + } + } + + /** + * Replaces the application component by the one specified in AndroidManifest.xml metadata with + * key {@link #COMPONENT_OVERRIDE_KEY}. Returns {@code true} if the component was properly + * initialized and replaced, otherwise returns {@code false}. + * + *

This assumes that the replacement component can be initialized exactly the same way as the + * default component. + * + *

Suppressing unchecked warnings because there is no way we have a statically typed class + * argument for instances of Class in this method. + */ + @SuppressWarnings("unchecked") + private boolean overrideApplicationComponent(CatalogApplication catalogApplication) { + try { + ApplicationInfo applicationInfo = + getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); + String className = applicationInfo.metaData.getString(COMPONENT_OVERRIDE_KEY); + if (className == null) { + // Fail early + Log.i(TAG, "Component override metadata not found, using default component."); + return false; + } + Log.i(TAG, className); + Object builderObject = Class.forName(className).getMethod("builder").invoke(null); + Class builderClass = builderObject.getClass(); + builderClass + .getMethod("application", Application.class) + .invoke(builderObject, catalogApplication); + Object component = builderClass.getMethod("build").invoke(builderObject); + component + .getClass() + .getMethod("inject", CatalogApplication.class) + .invoke(component, catalogApplication); + return true; + } catch (PackageManager.NameNotFoundException + | ClassNotFoundException + | NoSuchMethodException + | InvocationTargetException + | IllegalAccessException e) { + Log.e(TAG, "Component override failed with exception:", e); + } + return false; + } + + @Override + public AndroidInjector activityInjector() { + return activityInjector; + } +} diff --git a/catalog/java/io/material/catalog/application/CatalogApplicationComponent.java b/catalog/java/io/material/catalog/application/CatalogApplicationComponent.java new file mode 100644 index 000000000..fd253b750 --- /dev/null +++ b/catalog/java/io/material/catalog/application/CatalogApplicationComponent.java @@ -0,0 +1,44 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.application; + +import android.app.Application; +import dagger.BindsInstance; +import dagger.android.support.AndroidSupportInjectionModule; +import io.material.catalog.application.scope.ApplicationScope; +import io.material.catalog.main.MainActivity; + +/** The Application's root component. */ +@ApplicationScope +@dagger.Component( + modules = { + AndroidSupportInjectionModule.class, + MainActivity.Module.class, + } +) +public interface CatalogApplicationComponent { + void inject(CatalogApplication app); + + /** The root component's builder. */ + @dagger.Component.Builder + interface Builder { + @BindsInstance + CatalogApplicationComponent.Builder application(Application application); + + CatalogApplicationComponent build(); + } +} diff --git a/catalog/java/io/material/catalog/application/attrs/res/values/attrs.xml b/catalog/java/io/material/catalog/application/attrs/res/values/attrs.xml new file mode 100644 index 000000000..768109a67 --- /dev/null +++ b/catalog/java/io/material/catalog/application/attrs/res/values/attrs.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/catalog/java/io/material/catalog/application/legacymultidex/LegacyMultidexCatalogApplication.java b/catalog/java/io/material/catalog/application/legacymultidex/LegacyMultidexCatalogApplication.java new file mode 100644 index 000000000..a84d644c3 --- /dev/null +++ b/catalog/java/io/material/catalog/application/legacymultidex/LegacyMultidexCatalogApplication.java @@ -0,0 +1,33 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.application.legacymultidex; + +import android.content.Context; +import android.support.multidex.MultiDex; +import io.material.catalog.application.CatalogApplication; + +/** + * A version of {@link CatalogApplication} for development builds on older phones that uses the + * multidex support library for allowing multiple dex files. + */ +public class LegacyMultidexCatalogApplication extends CatalogApplication { + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } +} diff --git a/catalog/java/io/material/catalog/application/scope/ActivityScope.java b/catalog/java/io/material/catalog/application/scope/ActivityScope.java new file mode 100644 index 000000000..3fae3234f --- /dev/null +++ b/catalog/java/io/material/catalog/application/scope/ActivityScope.java @@ -0,0 +1,25 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.application.scope; + +import java.lang.annotation.Documented; +import javax.inject.Scope; + +/** Dagger scope for dependencies that should only have a single instance created per activity. */ +@Scope +@Documented +public @interface ActivityScope {} diff --git a/catalog/java/io/material/catalog/application/scope/ApplicationScope.java b/catalog/java/io/material/catalog/application/scope/ApplicationScope.java new file mode 100644 index 000000000..25bdaf1c6 --- /dev/null +++ b/catalog/java/io/material/catalog/application/scope/ApplicationScope.java @@ -0,0 +1,28 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.application.scope; + +import java.lang.annotation.Documented; +import javax.inject.Scope; + +/** + * Dagger scope for dependencies that should only have a single instance created for the entire + * application. + */ +@Scope +@Documented +public @interface ApplicationScope {} diff --git a/catalog/java/io/material/catalog/application/scope/FragmentScope.java b/catalog/java/io/material/catalog/application/scope/FragmentScope.java new file mode 100644 index 000000000..a98a60c5a --- /dev/null +++ b/catalog/java/io/material/catalog/application/scope/FragmentScope.java @@ -0,0 +1,25 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.application.scope; + +import java.lang.annotation.Documented; +import javax.inject.Scope; + +/** Dagger scope for dependencies that should only have a single instance created per fragment. */ +@Scope +@Documented +public @interface FragmentScope {} diff --git a/catalog/java/io/material/catalog/application/theme/res/values/colors.xml b/catalog/java/io/material/catalog/application/theme/res/values/colors.xml new file mode 100644 index 000000000..1bd51d7d9 --- /dev/null +++ b/catalog/java/io/material/catalog/application/theme/res/values/colors.xml @@ -0,0 +1,28 @@ + + + + #FFFFFF + #FFFFFF + + #212121 + #535353 + #000000 + + #30E57E + #33F286 + #25B363 + diff --git a/catalog/java/io/material/catalog/application/theme/res/values/strings.xml b/catalog/java/io/material/catalog/application/theme/res/values/strings.xml new file mode 100644 index 000000000..0a6a85a10 --- /dev/null +++ b/catalog/java/io/material/catalog/application/theme/res/values/strings.xml @@ -0,0 +1,19 @@ + + + + Close demo + diff --git a/catalog/java/io/material/catalog/application/theme/res/values/styles.xml b/catalog/java/io/material/catalog/application/theme/res/values/styles.xml new file mode 100644 index 000000000..591443805 --- /dev/null +++ b/catalog/java/io/material/catalog/application/theme/res/values/styles.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable-xxxhdpi/ic_placeholder_circle_24.png b/catalog/java/io/material/catalog/assets/res/drawable-xxxhdpi/ic_placeholder_circle_24.png new file mode 100644 index 000000000..097463494 Binary files /dev/null and b/catalog/java/io/material/catalog/assets/res/drawable-xxxhdpi/ic_placeholder_circle_24.png differ diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_add_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_add_24px.xml new file mode 100644 index 000000000..3a21aec8c --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_add_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_animation_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_animation_24px.xml new file mode 100644 index 000000000..c426ba1c2 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_animation_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_bottom_nav_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_bottom_nav_24px.xml new file mode 100644 index 000000000..6ff099132 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_bottom_nav_24px.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_bottom_sheets_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_bottom_sheets_24px.xml new file mode 100644 index 000000000..c9ebe1564 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_bottom_sheets_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_bottomappbar_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_bottomappbar_24px.xml new file mode 100644 index 000000000..efde207da --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_bottomappbar_24px.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_buttons_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_buttons_24px.xml new file mode 100644 index 000000000..c938a4e68 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_buttons_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_card_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_card_24px.xml new file mode 100644 index 000000000..6e5d31795 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_card_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_chips_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_chips_24px.xml new file mode 100644 index 000000000..b6a0979bb --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_chips_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_close_vd_theme_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_close_vd_theme_24px.xml new file mode 100644 index 000000000..b184e46cd --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_close_vd_theme_24px.xml @@ -0,0 +1,25 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_colors_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_colors_24px.xml new file mode 100644 index 000000000..8b2ab1cdd --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_colors_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_colors_vd_theme_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_colors_vd_theme_24px.xml new file mode 100644 index 000000000..03e066d45 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_colors_vd_theme_24px.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_components_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_components_24px.xml new file mode 100644 index 000000000..6970d287c --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_components_24px.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_data_table_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_data_table_24px.xml new file mode 100644 index 000000000..263f4ec2e --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_data_table_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_demo_play_circle_outline_vd_theme_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_demo_play_circle_outline_vd_theme_24px.xml new file mode 100644 index 000000000..ce320e6f2 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_demo_play_circle_outline_vd_theme_24px.xml @@ -0,0 +1,32 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_developer_guide_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_developer_guide_24px.xml new file mode 100644 index 000000000..0ccc6d899 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_developer_guide_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_dialogs_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_dialogs_24px.xml new file mode 100644 index 000000000..48ba85484 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_dialogs_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_expension_panels_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_expension_panels_24px.xml new file mode 100644 index 000000000..a39f6e83e --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_expension_panels_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_fab_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_fab_24px.xml new file mode 100644 index 000000000..cfc050ebf --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_fab_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_favorite_vd_theme_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_favorite_vd_theme_24px.xml new file mode 100644 index 000000000..b892bf2a5 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_favorite_vd_theme_24px.xml @@ -0,0 +1,25 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_feature_highlight_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_feature_highlight_24px.xml new file mode 100644 index 000000000..1461e0be3 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_feature_highlight_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_github_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_github_24px.xml new file mode 100644 index 000000000..393e57a6d --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_github_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_info_outline_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_info_outline_24px.xml new file mode 100644 index 000000000..77eb4ab9a --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_info_outline_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_lists_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_lists_24px.xml new file mode 100644 index 000000000..9399db86d --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_lists_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_logo_components_48px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_logo_components_48px.xml new file mode 100644 index 000000000..54b956725 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_logo_components_48px.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_menu_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_menu_24px.xml new file mode 100644 index 000000000..4b5cb2f94 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_menu_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_progress_activity_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_progress_activity_24px.xml new file mode 100644 index 000000000..63bdc8ddd --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_progress_activity_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_responsive_layout_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_responsive_layout_24px.xml new file mode 100644 index 000000000..b90d0bedf --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_responsive_layout_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_ripples_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_ripples_24px.xml new file mode 100644 index 000000000..052775cf7 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_ripples_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_scrollable_header_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_scrollable_header_24px.xml new file mode 100644 index 000000000..3599fa904 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_scrollable_header_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_search_vd_theme_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_search_vd_theme_24px.xml new file mode 100644 index 000000000..97d3d2d71 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_search_vd_theme_24px.xml @@ -0,0 +1,25 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_selection_controls_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_selection_controls_24px.xml new file mode 100644 index 000000000..90e1837de --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_selection_controls_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_shadow_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_shadow_24px.xml new file mode 100644 index 000000000..d66eccc62 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_shadow_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_side_navigation_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_side_navigation_24px.xml new file mode 100644 index 000000000..e5d6123f9 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_side_navigation_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_sliders_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_sliders_24px.xml new file mode 100644 index 000000000..1afbfc303 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_sliders_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_steppers_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_steppers_24px.xml new file mode 100644 index 000000000..f090b9d4a --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_steppers_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_subheader_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_subheader_24px.xml new file mode 100644 index 000000000..e0aca2709 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_subheader_24px.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_switches_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_switches_24px.xml new file mode 100644 index 000000000..99a3b7ab4 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_switches_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_tabs_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_tabs_24px.xml new file mode 100644 index 000000000..f8535c45b --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_tabs_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_text_field_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_text_field_24px.xml new file mode 100644 index 000000000..e4e706f47 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_text_field_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_toast_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_toast_24px.xml new file mode 100644 index 000000000..d194f4615 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_toast_24px.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_tooltip_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_tooltip_24px.xml new file mode 100644 index 000000000..7a6f097f4 --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_tooltip_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/assets/res/drawable/ic_topappbar_24px.xml b/catalog/java/io/material/catalog/assets/res/drawable/ic_topappbar_24px.xml new file mode 100644 index 000000000..34e6f461c --- /dev/null +++ b/catalog/java/io/material/catalog/assets/res/drawable/ic_topappbar_24px.xml @@ -0,0 +1,24 @@ + + + + diff --git a/catalog/java/io/material/catalog/bottomappbar/BottomAppBarFragment.java b/catalog/java/io/material/catalog/bottomappbar/BottomAppBarFragment.java new file mode 100644 index 000000000..ca05fb8bc --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/BottomAppBarFragment.java @@ -0,0 +1,74 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.bottomappbar; + +import io.material.catalog.R; + +import android.support.v4.app.Fragment; +import dagger.Provides; +import dagger.android.ContributesAndroidInjector; +import dagger.multibindings.IntoSet; +import io.material.catalog.application.scope.ActivityScope; +import io.material.catalog.application.scope.FragmentScope; +import io.material.catalog.feature.Demo; +import io.material.catalog.feature.DemoLandingFragment; +import io.material.catalog.feature.FeatureDemo; + +/** A landing fragment that links to Bottom App Bar demos for the Catalog app. */ +public class BottomAppBarFragment extends DemoLandingFragment { + + @Override + public int getTitleResId() { + return R.string.cat_bottomappbar_title; + } + + @Override + public int getDescriptionResId() { + return R.string.cat_bottomappbar_description; + } + + @Override + public Demo getMainDemo() { + return new Demo() { + @Override + public Fragment createFragment() { + return new BottomAppBarMainDemoFragment(); + } + }; + } + + /** The Dagger module for {@link BottomAppBarFragment} dependencies. */ + @dagger.Module + public abstract static class Module { + + @FragmentScope + @ContributesAndroidInjector + abstract BottomAppBarFragment contributeInjector(); + + @IntoSet + @Provides + @ActivityScope + static FeatureDemo provideFeatureDemo() { + return new FeatureDemo(R.string.cat_bottomappbar_title, R.drawable.ic_bottomappbar_24px) { + @Override + public Fragment createFragment() { + return new BottomAppBarFragment(); + } + }; + } + } +} diff --git a/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java b/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java new file mode 100644 index 000000000..edd221878 --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java @@ -0,0 +1,146 @@ +/* + * Copyright 2017 The Android Open Source Project + * + * 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 io.material.catalog.bottomappbar; + +import io.material.catalog.R; + +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; +import com.google.android.material.bottomappbar.BottomAppBar; +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.navigation.NavigationView; +import com.google.android.material.snackbar.Snackbar; +import android.support.design.widget.CoordinatorLayout; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.ToggleButton; +import io.material.catalog.feature.DemoFragment; +import io.material.catalog.feature.OnBackPressedHandler; +import io.material.catalog.themeswitcher.ThemeSwitcherHelper; + +/** A fragment that displays the main Bottom App Bar demos for the Catalog app. */ +public class BottomAppBarMainDemoFragment extends DemoFragment implements OnBackPressedHandler { + + protected BottomAppBar bar; + protected CoordinatorLayout coordinatorLayout; + + @Nullable private ThemeSwitcherHelper themeSwitcherHelper; + private BottomSheetBehavior bottomDrawerBehavior; + + @Override + public void onCreate(@Nullable Bundle bundle) { + super.onCreate(bundle); + setHasOptionsMenu(true); + + // The theme switcher helper is used in an adhoc way with the toolbar since the BottomAppBar is + // set as the action bar. + themeSwitcherHelper = new ThemeSwitcherHelper(getFragmentManager()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { + menuInflater.inflate(R.menu.demo_primary, menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem menuItem) { + Snackbar.make(getView(), menuItem.getTitle(), Snackbar.LENGTH_SHORT).show(); + return true; + } + + @LayoutRes + public int getBottomAppBarContent() { + return R.layout.cat_bottomappbar_fragment; + } + + @Override + public View onCreateDemoView( + LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) { + View view = layoutInflater.inflate(getBottomAppBarContent(), viewGroup, false); + + Toolbar toolbar = view.findViewById(R.id.toolbar); + toolbar.setTitle(getDefaultDemoTitle()); + themeSwitcherHelper.onCreateOptionsMenu(toolbar.getMenu(), getActivity().getMenuInflater()); + toolbar.setOnMenuItemClickListener(themeSwitcherHelper::onOptionsItemSelected); + toolbar.setNavigationOnClickListener( + v -> { + getActivity().onBackPressed(); + }); + + coordinatorLayout = view.findViewById(R.id.coordinator_layout); + bar = view.findViewById(R.id.bar); + ((AppCompatActivity) getActivity()).setSupportActionBar(bar); + + setUpBottomDrawer(view); + + ImageButton fab = view.findViewById(R.id.fab); + fab.setOnClickListener( + v -> Snackbar.make(getView(), fab.getContentDescription(), Snackbar.LENGTH_SHORT).show()); + NavigationView navigationView = view.findViewById(R.id.navigation_view); + navigationView.setNavigationItemSelectedListener( + item -> { + Snackbar.make(getView(), item.getTitle(), Snackbar.LENGTH_SHORT).show(); + return false; + }); + + Button centerButton = view.findViewById(R.id.center); + Button endButton = view.findViewById(R.id.end); + ToggleButton attachToggle = view.findViewById(R.id.attach_toggle); + attachToggle.setChecked(bar.isFabAttached()); + centerButton.setOnClickListener( + v -> bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_CENTER)); + endButton.setOnClickListener(v -> bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END)); + attachToggle.setOnCheckedChangeListener( + (buttonView, isChecked) -> bar.setFabAttached(isChecked)); + + return view; + } + + @Override + public boolean onBackPressed() { + if (bottomDrawerBehavior.getState() != BottomSheetBehavior.STATE_HIDDEN) { + bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + return true; + } + return false; + } + + @Override + public boolean shouldShowDefaultDemoActionBar() { + return false; + } + + protected void setUpBottomDrawer(View view) { + View bottomDrawer = coordinatorLayout.findViewById(R.id.bottom_drawer); + bottomDrawerBehavior = BottomSheetBehavior.from(bottomDrawer); + bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + + bar.setNavigationOnClickListener( + v -> bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HALF_EXPANDED)); + bar.setNavigationIcon(R.drawable.ic_menu_24); + bar.replaceMenu(R.menu.demo_primary); + } +} diff --git a/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_3d_rotation_24.xml b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_3d_rotation_24.xml new file mode 100644 index 000000000..90822b37d --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_3d_rotation_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_accelerator_24.xml b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_accelerator_24.xml new file mode 100644 index 000000000..6702fafe2 --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_accelerator_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_dashboard_24.xml b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_dashboard_24.xml new file mode 100644 index 000000000..2c9f661b4 --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_dashboard_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_menu_24.xml b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_menu_24.xml new file mode 100644 index 000000000..3ab5062f5 --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_menu_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_search_24.xml b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_search_24.xml new file mode 100644 index 000000000..0ba7f6505 --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/res/drawable/ic_search_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/catalog/java/io/material/catalog/bottomappbar/res/layout/cat_bottomappbar_content.xml b/catalog/java/io/material/catalog/bottomappbar/res/layout/cat_bottomappbar_content.xml new file mode 100644 index 000000000..57512656f --- /dev/null +++ b/catalog/java/io/material/catalog/bottomappbar/res/layout/cat_bottomappbar_content.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + +