From 1a47bb1d44204f6f7bd602eee5bfb716ef4db4ae Mon Sep 17 00:00:00 2001 From: Conny Duck Date: Mon, 11 Mar 2024 21:06:10 +0100 Subject: [PATCH] migrate demo app to Compose --- app/build.gradle.kts | 18 ++- .../sparkbutton/sample/DemoActivityTest.java | 101 ------------- .../matchers/CheckedSparkButtonMatcher.java | 44 ------ .../matchers/UncheckedSparkButtonMatcher.java | 43 ------ app/src/main/AndroidManifest.xml | 2 +- .../sparkbutton/sample/ComposeDemo.kt | 141 ++++++++++++------ .../sparkbutton/sample/DemoActivity.java | 124 --------------- .../sparkbutton/sample/DemoActivity.kt | 106 +++++++++++++ .../sample/ScreenSlidePagerAdapter.kt | 132 ---------------- .../connyduck/sparkbutton/sample/ViewsDemo.kt | 31 ++++ .../sparkbutton/sample/theme/Color.kt | 11 ++ .../sparkbutton/sample/theme/Theme.kt | 60 ++++++++ app/src/main/res/drawable/bottom_shadow.9.png | Bin 190 -> 0 bytes app/src/main/res/drawable/button_shape.xml | 20 --- app/src/main/res/drawable/empty.xml | 7 - app/src/main/res/drawable/ic_github.png | Bin 4268 -> 0 bytes app/src/main/res/drawable/ic_twitter.png | Bin 5021 -> 0 bytes app/src/main/res/layout/activity_demo.xml | 69 --------- app/src/main/res/layout/demo.xml | 71 +++++++++ app/src/main/res/layout/demo_compose.xml | 27 ---- app/src/main/res/layout/demo_facebook.xml | 61 -------- app/src/main/res/layout/demo_heart.xml | 87 ----------- app/src/main/res/layout/demo_star.xml | 107 ------------- app/src/main/res/layout/demo_twitter.xml | 76 ---------- app/src/main/res/layout/github_button.xml | 32 ---- app/src/main/res/values-w820dp/dimens.xml | 6 - app/src/main/res/values/colors.xml | 11 +- app/src/main/res/values/dimens.xml | 6 - app/src/main/res/values/strings.xml | 20 +-- app/src/main/res/values/styles.xml | 11 -- app/src/main/res/values/themes.xml | 4 + gradle/libs.versions.toml | 28 ++-- 32 files changed, 413 insertions(+), 1043 deletions(-) delete mode 100644 app/src/androidTest/java/at/connyduck/sparkbutton/sample/DemoActivityTest.java delete mode 100644 app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/CheckedSparkButtonMatcher.java delete mode 100644 app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/UncheckedSparkButtonMatcher.java delete mode 100644 app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.java create mode 100644 app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.kt delete mode 100644 app/src/main/java/at/connyduck/sparkbutton/sample/ScreenSlidePagerAdapter.kt create mode 100644 app/src/main/java/at/connyduck/sparkbutton/sample/ViewsDemo.kt create mode 100644 app/src/main/java/at/connyduck/sparkbutton/sample/theme/Color.kt create mode 100644 app/src/main/java/at/connyduck/sparkbutton/sample/theme/Theme.kt delete mode 100644 app/src/main/res/drawable/bottom_shadow.9.png delete mode 100644 app/src/main/res/drawable/button_shape.xml delete mode 100644 app/src/main/res/drawable/empty.xml delete mode 100644 app/src/main/res/drawable/ic_github.png delete mode 100644 app/src/main/res/drawable/ic_twitter.png delete mode 100644 app/src/main/res/layout/activity_demo.xml create mode 100644 app/src/main/res/layout/demo.xml delete mode 100644 app/src/main/res/layout/demo_compose.xml delete mode 100644 app/src/main/res/layout/demo_facebook.xml delete mode 100644 app/src/main/res/layout/demo_heart.xml delete mode 100644 app/src/main/res/layout/demo_star.xml delete mode 100644 app/src/main/res/layout/demo_twitter.xml delete mode 100644 app/src/main/res/layout/github_button.xml delete mode 100644 app/src/main/res/values-w820dp/dimens.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 812bebb..6ef561a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -33,13 +33,15 @@ dependencies { implementation(project(":sparkbutton")) implementation(project(":sparkbutton-compose")) - implementation(libs.material) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.cardview) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) - implementation(libs.androidx.compose.foundation) - - androidTestImplementation(libs.espresso.core) - androidTestImplementation(libs.androidx.test.junit) - androidTestImplementation(libs.androidx.test.rules) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) } diff --git a/app/src/androidTest/java/at/connyduck/sparkbutton/sample/DemoActivityTest.java b/app/src/androidTest/java/at/connyduck/sparkbutton/sample/DemoActivityTest.java deleted file mode 100644 index a998b36..0000000 --- a/app/src/androidTest/java/at/connyduck/sparkbutton/sample/DemoActivityTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright 2017 Varun, 2018 Conny Duck - * - * 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 at.connyduck.sparkbutton.sample; - -import android.os.SystemClock; -import androidx.test.espresso.ViewInteraction; -import androidx.test.ext.junit.runners.AndroidJUnit4; - - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.action.ViewActions.longClick; -import static androidx.test.espresso.action.ViewActions.swipeLeft; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import androidx.test.rule.ActivityTestRule; -import static at.connyduck.sparkbutton.sample.matchers.CheckedSparkButtonMatcher.isCheckedSparkButton; -import static at.connyduck.sparkbutton.sample.matchers.UncheckedSparkButtonMatcher.isUncheckedSparkButton; -import static org.hamcrest.Matchers.allOf; - -@RunWith(AndroidJUnit4.class) -public class DemoActivityTest { - - @Rule - public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(DemoActivity.class); - - @Test - public void demoActivityTest() { - - SystemClock.sleep(1000); // Wait for buttons to be checked by listener's animation - - ViewInteraction starButton1 = onView(allOf( - withId(R.id.star_button1), - isDisplayed())); - starButton1.check(matches(isUncheckedSparkButton())); - - ViewInteraction starButton2 = onView(allOf( - withId(R.id.star_button2), - isDisplayed())); - starButton2.check(matches(isCheckedSparkButton())); - - starButton1.perform(click()); - starButton1.check(matches(isCheckedSparkButton())); - - ViewInteraction appCompatTextView = onView(allOf( - withText("Heart"), - isDisplayed())); - appCompatTextView.perform(click()); - - ViewInteraction heartButton = onView(allOf( - withId(R.id.heart_button), - isDisplayed())); - SystemClock.sleep(1000); // Wait for buttons to be checked by listener's animation - heartButton.check(matches(isCheckedSparkButton())); - - heartButton.perform(longClick()); - heartButton.check(matches(isUncheckedSparkButton())); - - ViewInteraction heartRoot = onView(allOf( - withId(R.id.background), - isDisplayed())); - heartRoot.perform(swipeLeft()); - - ViewInteraction facebookButton = onView(allOf( - withId(R.id.facebook_button), - isDisplayed())); - SystemClock.sleep(1000); // Wait for buttons to be checked by listener's animation - facebookButton.check(matches(isUncheckedSparkButton())); - facebookButton.perform(longClick()); - facebookButton.check(matches(isUncheckedSparkButton())); //Facebook button is not checkable - - ViewInteraction facebookRoot = onView(allOf( - withId(R.id.background), - isDisplayed())); - facebookRoot.perform(swipeLeft()); - - ViewInteraction twitterButton = onView(allOf( - withId(R.id.twitter_button), - isDisplayed())); - SystemClock.sleep(1000); // Wait for buttons to be checked by listener's animation - twitterButton.check(matches(isUncheckedSparkButton())); - } -} diff --git a/app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/CheckedSparkButtonMatcher.java b/app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/CheckedSparkButtonMatcher.java deleted file mode 100644 index 5438bb1..0000000 --- a/app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/CheckedSparkButtonMatcher.java +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright 2017 Varun, 2018 Conny Duck - * - * 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 at.connyduck.sparkbutton.sample.matchers; - -import android.view.View; - -import at.connyduck.sparkbutton.SparkButton; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; - -/** - * Created by skaggsm on 1/26/17. - */ - -public class CheckedSparkButtonMatcher extends BaseMatcher { - - public static CheckedSparkButtonMatcher isCheckedSparkButton() { - return new CheckedSparkButtonMatcher(); - } - - @Override - public boolean matches(Object item) { - return item instanceof SparkButton && - ((SparkButton) item).isChecked(); - } - - @Override - public void describeTo(Description description) { - description.appendText("is a checked SparkButton"); - } -} diff --git a/app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/UncheckedSparkButtonMatcher.java b/app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/UncheckedSparkButtonMatcher.java deleted file mode 100644 index 60570f3..0000000 --- a/app/src/androidTest/java/at/connyduck/sparkbutton/sample/matchers/UncheckedSparkButtonMatcher.java +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright 2017 Varun, 2018 Conny Duck - * - * 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 at.connyduck.sparkbutton.sample.matchers; - -import android.view.View; - -import at.connyduck.sparkbutton.SparkButton; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; - -/** - * Created by skaggsm on 1/26/17. - */ - -public class UncheckedSparkButtonMatcher extends BaseMatcher { - public static UncheckedSparkButtonMatcher isUncheckedSparkButton() { - return new UncheckedSparkButtonMatcher(); - } - - @Override - public boolean matches(Object item) { - return item instanceof SparkButton && - !((SparkButton) item).isChecked(); - } - - @Override - public void describeTo(Description description) { - description.appendText("is an unchecked SparkButton"); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0990b09..9ba7606 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/Theme.SparkButton"> diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/ComposeDemo.kt b/app/src/main/java/at/connyduck/sparkbutton/sample/ComposeDemo.kt index 6ee910e..e4ef365 100644 --- a/app/src/main/java/at/connyduck/sparkbutton/sample/ComposeDemo.kt +++ b/app/src/main/java/at/connyduck/sparkbutton/sample/ComposeDemo.kt @@ -1,12 +1,28 @@ +/* Copyright 2024 Conny Duck + * + * 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 at.connyduck.sparkbutton.sample +import androidx.annotation.StringRes import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -16,64 +32,93 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import at.connyduck.sparkbutton.compose.SparkButton @Composable fun ComposeDemo() { - Column(Modifier.fillMaxWidth()) { - var checked1 by remember { mutableStateOf(false) } + Column( + Modifier.fillMaxWidth() + ) { + DemoRow(R.string.heart_standard_description) { + var checked1 by remember { mutableStateOf(false) } - SparkButton( - checked = checked1, - onCheckedChange = { - checked1 = it - }, - animationSpeed = 0.1f, - modifier = - Modifier - .padding(64.dp) - .size(128.dp) - .align(Alignment.CenterHorizontally) - ) { - if (checked1) { - Image(painterResource(R.drawable.ic_heart_on), null) - } else { - Image(painterResource(R.drawable.ic_heart_off), null) + SparkButton( + checked = checked1, + onCheckedChange = { + checked1 = it + }, + modifier = Modifier + .padding(16.dp) + .size(32.dp) + ) { + if (checked1) { + Image(painterResource(R.drawable.ic_heart_on), stringResource(R.string.unlike)) + } else { + Image(painterResource(R.drawable.ic_heart_off), stringResource(R.string.like)) + } } } - Spacer(modifier = Modifier.height(16.dp)) - - SparkButton( - checked = true, - onCheckedChange = {}, - enabled = false, - modifier = - Modifier - .padding(32.dp) - .size(32.dp) - .align(Alignment.CenterHorizontally) - ) { - Image(painterResource(R.drawable.ic_heart_on), null) + DemoRow(R.string.heart_disabled_description) { + SparkButton( + checked = true, + onCheckedChange = {}, + enabled = false, + modifier = Modifier + .padding(16.dp) + .size(32.dp) + ) { + Image(painterResource(R.drawable.ic_heart_on), null) + } } - Spacer(modifier = Modifier.height(16.dp)) - - var checked2 by remember { mutableStateOf(true) } + DemoRow(R.string.thumbs_description) { + var checked2 by remember { mutableStateOf(true) } - SparkButton( - checked = checked2, - onCheckedChange = { checked2 = it }, - modifier = - Modifier - .padding(32.dp) - .size(80.dp) - .align(Alignment.CenterHorizontally), - primaryColor = colorResource(id = R.color.facebook_primary_color), - secondaryColor = colorResource(id = R.color.facebook_secondary_color), - ) { - Image(painter = painterResource(R.drawable.ic_thumb), contentDescription = "") + SparkButton( + checked = true, + onCheckedChange = { checked2 = it }, + modifier = Modifier + .padding(32.dp) + .size(64.dp) + .align(Alignment.CenterHorizontally), + primaryColor = colorResource(id = R.color.thumb_primary_color), + secondaryColor = colorResource(id = R.color.thumb_secondary_color), + animationSpeed = 0.5f + ) { + Image(painter = painterResource(R.drawable.ic_thumb), contentDescription = stringResource(R.string.thumbs_up)) + } } } } + +@Composable +fun DemoRow( + @StringRes text: Int, + content: @Composable () -> Unit +) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 32.dp, vertical = 16.dp) + ) { + Text( + text = stringResource(id = text), + fontSize = 16.sp, + modifier = Modifier.weight(1f) + ) + content() + } +} + +@Preview +@Composable +fun ComposeDemoPreview() { + ComposeDemo() +} diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.java b/app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.java deleted file mode 100644 index 2994ffb..0000000 --- a/app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.java +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright 2017 Varun, 2018 Conny Duck - * - * 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 at.connyduck.sparkbutton.sample; - -import android.os.Bundle; -import android.os.Handler; -import androidx.annotation.NonNull; -import com.google.android.material.tabs.TabLayout; -import androidx.viewpager.widget.PagerAdapter; -import androidx.viewpager.widget.ViewPager; -import androidx.appcompat.app.AppCompatActivity; -import android.view.View; - -import at.connyduck.sparkbutton.SparkButton; - -public class DemoActivity extends AppCompatActivity { - private ViewPager showcaseViewpager; - private PagerAdapter pagerAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_demo); - initWidgets(); - initAnimation(); - } - - private void initAnimation() { - showcaseViewpager.postDelayed(new Runnable() { - @Override - public void run() { - View starLayout = getViewFromPosition(0); - if (starLayout != null) { - playStarAnimation(starLayout); - } - } - }, 500); - } - - private void initWidgets() { - showcaseViewpager = findViewById(R.id.showcase_viewpager); - pagerAdapter = new ScreenSlidePagerAdapter(DemoActivity.this); - showcaseViewpager.setAdapter(pagerAdapter); - showcaseViewpager.addOnPageChangeListener(getOnPageChangeListener()); - TabLayout tabLayout = findViewById(R.id.tabs); - tabLayout.setupWithViewPager(showcaseViewpager); - } - - @NonNull - private ViewPager.OnPageChangeListener getOnPageChangeListener() { - return new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - View view = getViewFromPosition(position); - if (view != null) { - switch (position) { - case 0 -> playStarAnimation(view); - case 1 -> playHeartAnimation(view); - case 2 -> playFacebookAnimation(view); - case 3 -> playTwitterAnimation(view); - } - } - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - }; - } - - private View getViewFromPosition(int position) { - View view = null; - for (int i = 0; i < pagerAdapter.getCount(); i++) { - view = showcaseViewpager.findViewWithTag(String.valueOf(position)); - if (view != null) { - break; - } - } - return view; - } - - private void playHeartAnimation(final View heartLayout) { - ((SparkButton) heartLayout.findViewById(R.id.heart_button)).setChecked(false); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - ((SparkButton) heartLayout.findViewById(R.id.heart_button)).setChecked(true); - ((SparkButton) heartLayout.findViewById(R.id.heart_button)).playAnimation(); - } - }, 300); - } - - private void playStarAnimation(final View starLayout) { - ((SparkButton) starLayout.findViewById(R.id.star_button1)).setChecked(false); - ((SparkButton) starLayout.findViewById(R.id.star_button2)).setChecked(true); - ((SparkButton) starLayout.findViewById(R.id.star_button2)).playAnimation(); - } - - private void playFacebookAnimation(View facebookLayout) { - ((SparkButton) facebookLayout.findViewById(R.id.facebook_button)).playAnimation(); - } - - private void playTwitterAnimation(View twitterLayout) { - ((SparkButton) twitterLayout.findViewById(R.id.twitter_button)).playAnimation(); - } -} diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.kt b/app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.kt new file mode 100644 index 0000000..68178e8 --- /dev/null +++ b/app/src/main/java/at/connyduck/sparkbutton/sample/DemoActivity.kt @@ -0,0 +1,106 @@ +/* Copyright 2024 Conny Duck + * + * 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 at.connyduck.sparkbutton.sample + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Tab +import androidx.compose.material3.TabRow +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import at.connyduck.sparkbutton.sample.theme.SparkButtonTheme + +class DemoActivity : ComponentActivity() { + @OptIn(ExperimentalMaterial3Api::class) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + var selectedTab by remember { + mutableIntStateOf(0) + } + + SparkButtonTheme { + Scaffold( + topBar = { + TopAppBar( + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + titleContentColor = MaterialTheme.colorScheme.primary, + ), + title = { + Text("SparkButton Demo") + } + ) + }, + ) { innerPadding -> + Column { + TabRow( + selectedTabIndex = selectedTab, + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.onPrimaryContainer, + modifier = Modifier.padding(innerPadding) + ) { + Tab( + text = { Text(text = "Compose") }, + selected = selectedTab == 0, + onClick = { selectedTab = 0 } + ) + Tab( + text = { Text(text = "Views") }, + selected = selectedTab == 1, + onClick = { selectedTab = 1 } + ) + } + if (selectedTab == 0) { + ComposeDemo() + } else { + ViewsDemo() + } + } + } + } + } + } +} + +@Composable +fun Greeting(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + SparkButtonTheme { + Greeting("Android") + } +} diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/ScreenSlidePagerAdapter.kt b/app/src/main/java/at/connyduck/sparkbutton/sample/ScreenSlidePagerAdapter.kt deleted file mode 100644 index 84c22e0..0000000 --- a/app/src/main/java/at/connyduck/sparkbutton/sample/ScreenSlidePagerAdapter.kt +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright 2017 Varun, 2018 Conny Duck - * - * 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 at.connyduck.sparkbutton.sample - -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Handler -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.compose.ui.platform.ComposeView -import androidx.viewpager.widget.PagerAdapter -import at.connyduck.sparkbutton.SparkButton - -class ScreenSlidePagerAdapter constructor(private val context: Context) : PagerAdapter() { - override fun instantiateItem(container: ViewGroup, position: Int): Any { - val view: View - when (position) { - 0 -> { - view = LayoutInflater.from(context).inflate(R.layout.demo_star, container, false) - setupStarLayoutClickEvents(view) - } - - 1 -> { - view = LayoutInflater.from(context).inflate(R.layout.demo_heart, container, false) - setupHeartLayoutClickEvents(view) - } - - 2 -> { - view = - LayoutInflater.from(context).inflate(R.layout.demo_facebook, container, false) - setupFacebookLayoutClickEvents(view) - } - - 3 -> { - view = LayoutInflater.from(context).inflate(R.layout.demo_twitter, container, false) - setupTwitterLayoutClickEvents(view) - } - 4 -> { - view = - ComposeView(container.context).apply { - setContent { - ComposeDemo() - } - } - } - - else -> throw IllegalStateException() - } - view.tag = position.toString() - container.addView(view) - return view - } - - override fun getCount(): Int { - return 5 - } - - override fun isViewFromObject(view: View, `object`: Any): Boolean { - return view === `object` - } - - override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { - container.removeView(`object` as View) - } - - override fun getPageTitle(position: Int): CharSequence? { - var title = "" - when (position) { - 0 -> title = context.getString(R.string.star) - 1 -> title = context.getString(R.string.heart) - 2 -> title = context.getString(R.string.facebook) - 3 -> title = context.getString(R.string.twitter) - 4 -> title = context.getString(R.string.compose) - } - return title - } - - private fun setupStarLayoutClickEvents(view: View) { - view.findViewById(R.id.cardview_1) - .setOnClickListener { view.findViewById(R.id.star_button1).performClick() } - view.findViewById(R.id.cardview_2) - .setOnClickListener { view.findViewById(R.id.star_button2).performClick() } - view.findViewById(R.id.github_page).setOnClickListener { openGithubPage() } - } - - private fun setupHeartLayoutClickEvents(view: View) { - view.findViewById(R.id.github_page).setOnClickListener { openGithubPage() } - } - - private fun setupFacebookLayoutClickEvents(view: View) { - view.findViewById(R.id.github_page).setOnClickListener { openGithubPage() } - } - - private fun setupTwitterLayoutClickEvents(view: View) { - view.findViewById(R.id.github_page).setOnClickListener { openGithubPage() } - view.findViewById(R.id.twitter_card).setOnClickListener { - (view.findViewById(R.id.twitter_button) as SparkButton).playAnimation() - Handler().postDelayed({ openTwitterPage() }, 500) - } - } - - private fun openGithubPage() { - val browserIntent = - Intent(Intent.ACTION_VIEW, Uri.parse("http://www.github.com/connyduck/SparkButton")) - context.startActivity(browserIntent) - } - - private fun openTwitterPage() { - var intent: Intent - try { - context.packageManager.getPackageInfo("com.twitter.android", 0) - intent = Intent(Intent.ACTION_VIEW, Uri.parse("twitter://user?user_id=517550916")) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } catch (e: Exception) { - intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com/ConnyDuck")) - } - context.startActivity(intent) - } -} diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/ViewsDemo.kt b/app/src/main/java/at/connyduck/sparkbutton/sample/ViewsDemo.kt new file mode 100644 index 0000000..0b9d960 --- /dev/null +++ b/app/src/main/java/at/connyduck/sparkbutton/sample/ViewsDemo.kt @@ -0,0 +1,31 @@ +/* Copyright 2024 Conny Duck + * + * 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 at.connyduck.sparkbutton.sample + +import android.view.LayoutInflater +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView + +@Composable +fun ViewsDemo() { + AndroidView( + factory = { context -> + LayoutInflater.from(context).inflate(R.layout.demo, null) + }, + modifier = Modifier.fillMaxWidth() + ) +} diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/theme/Color.kt b/app/src/main/java/at/connyduck/sparkbutton/sample/theme/Color.kt new file mode 100644 index 0000000..428b9b1 --- /dev/null +++ b/app/src/main/java/at/connyduck/sparkbutton/sample/theme/Color.kt @@ -0,0 +1,11 @@ +package at.connyduck.sparkbutton.sample.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) diff --git a/app/src/main/java/at/connyduck/sparkbutton/sample/theme/Theme.kt b/app/src/main/java/at/connyduck/sparkbutton/sample/theme/Theme.kt new file mode 100644 index 0000000..36d6257 --- /dev/null +++ b/app/src/main/java/at/connyduck/sparkbutton/sample/theme/Theme.kt @@ -0,0 +1,60 @@ +package at.connyduck.sparkbutton.sample.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 +) + +@Composable +fun SparkButtonTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() + window.navigationBarColor = colorScheme.background.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + content = content + ) +} diff --git a/app/src/main/res/drawable/bottom_shadow.9.png b/app/src/main/res/drawable/bottom_shadow.9.png deleted file mode 100644 index 639153340b996a97bab8678ea45df25f7bbd638c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g!!3HGbRrPd%RI8_pV@SoVtyc{B4jBlz1h(sR zda{0*Fh{XPDx=|dyoN_ggxgDdC|N%505-te1P$r%sZpE9#0BlY?pN`VddY>#QU*ea^~(wiNc=?be}!! pozbqn@n`wXuGXvC(t1TN>?7_4-Z0?kR0leU!PC{xWt~$(697#2O85W( diff --git a/app/src/main/res/drawable/button_shape.xml b/app/src/main/res/drawable/button_shape.xml deleted file mode 100644 index 7038d83..0000000 --- a/app/src/main/res/drawable/button_shape.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/empty.xml b/app/src/main/res/drawable/empty.xml deleted file mode 100644 index 4e8abf9..0000000 --- a/app/src/main/res/drawable/empty.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_github.png b/app/src/main/res/drawable/ic_github.png deleted file mode 100644 index ea6ff545a246caa64074ba809bbc86fcb8589071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4268 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 XLyRvu{aX3a{{tgEGu={c*U0|?Dtn-9 diff --git a/app/src/main/res/drawable/ic_twitter.png b/app/src/main/res/drawable/ic_twitter.png deleted file mode 100644 index 40551b0bfeb634c52d8c9c016b062010a204d9ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5021 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 - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/demo.xml b/app/src/main/res/layout/demo.xml new file mode 100644 index 0000000..0322f1d --- /dev/null +++ b/app/src/main/res/layout/demo.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/demo_compose.xml b/app/src/main/res/layout/demo_compose.xml deleted file mode 100644 index 9d6d0ce..0000000 --- a/app/src/main/res/layout/demo_compose.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/demo_facebook.xml b/app/src/main/res/layout/demo_facebook.xml deleted file mode 100644 index dc04638..0000000 --- a/app/src/main/res/layout/demo_facebook.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/demo_heart.xml b/app/src/main/res/layout/demo_heart.xml deleted file mode 100644 index ea3b02f..0000000 --- a/app/src/main/res/layout/demo_heart.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/demo_star.xml b/app/src/main/res/layout/demo_star.xml deleted file mode 100644 index ae86feb..0000000 --- a/app/src/main/res/layout/demo_star.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/demo_twitter.xml b/app/src/main/res/layout/demo_twitter.xml deleted file mode 100644 index 5ad7334..0000000 --- a/app/src/main/res/layout/demo_twitter.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/github_button.xml b/app/src/main/res/layout/github_button.xml deleted file mode 100644 index 234e8df..0000000 --- a/app/src/main/res/layout/github_button.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index 63fc816..0000000 --- a/app/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 64dp - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1e72bdd..915f445 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,14 +1,7 @@ - #3F51B5 - #303F9F - #FF4081 - #da4439 - #8a098c - #3b5998 - #dfe3ee - #667580 - #CCD6DD + #3b5998 + #dfe3ee #0C295E diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml deleted file mode 100644 index aad678b..0000000 --- a/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 16dp - 16dp - 80dp - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98d4208..3b758c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,15 +1,11 @@ - SparkButton Showcase App - Star - Heart - Facebook - Twitter + SparkButton Demo App + Like + Unlike + Tumbs up! + Views Compose - Highly customizable and lightweight library that allows you to create a button with animation effect similar to Twitter\'s heart. - Tap on this card to check out the sleek animation!! Any custom icon of choice can be used with this library very easily. Checkout more examples by switching views from the tab above. - Increase user engagement and social activities in your App with the help of these buttons. - Increase clicks where it matters the most to you, by attracting user attention. - Follow me on Twitter - Thank You :) - Source Code + Standard Heart Button + Disabled Heart Button + Thumbs-Up Button with modified colors and animation speed diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index 0eb88fe..0000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..73a069f --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,4 @@ + + +