diff --git a/app/build.gradle b/app/build.gradle index 52f6c3b..26c4d7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,18 +1,18 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { applicationId "com.fragstack.app" minSdkVersion 15 - targetSdkVersion 27 + targetSdkVersion 28 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -28,8 +28,8 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':fragstack') - implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'androidx.appcompat:appcompat:1.0.0' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' } diff --git a/app/src/androidTest/java/com/fragstack/app/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/fragstack/app/ExampleInstrumentedTest.java index a0ae3ca..7051067 100644 --- a/app/src/androidTest/java/com/fragstack/app/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/fragstack/app/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package com.fragstack.app; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/app/src/main/java/com/fragstack/app/MainActivity.java b/app/src/main/java/com/fragstack/app/MainActivity.java index 016cd89..4e4ae61 100644 --- a/app/src/main/java/com/fragstack/app/MainActivity.java +++ b/app/src/main/java/com/fragstack/app/MainActivity.java @@ -1,11 +1,12 @@ package com.fragstack.app; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + import com.fragstack.app.fragments.FragmentTabA; import com.fragstack.app.fragments.FragmentTabB; import com.fragstack.controller.FragmentController; diff --git a/app/src/main/java/com/fragstack/app/fragments/FragmentChild1.java b/app/src/main/java/com/fragstack/app/fragments/FragmentChild1.java index 582d635..9a90861 100644 --- a/app/src/main/java/com/fragstack/app/fragments/FragmentChild1.java +++ b/app/src/main/java/com/fragstack/app/fragments/FragmentChild1.java @@ -1,14 +1,15 @@ package com.fragstack.app.fragments; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.fragstack.app.MainActivity; import com.fragstack.app.R; diff --git a/app/src/main/java/com/fragstack/app/fragments/FragmentChild2.java b/app/src/main/java/com/fragstack/app/fragments/FragmentChild2.java index c88d23f..dd2f5dd 100644 --- a/app/src/main/java/com/fragstack/app/fragments/FragmentChild2.java +++ b/app/src/main/java/com/fragstack/app/fragments/FragmentChild2.java @@ -1,14 +1,15 @@ package com.fragstack.app.fragments; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.fragstack.app.MainActivity; import com.fragstack.app.R; diff --git a/app/src/main/java/com/fragstack/app/fragments/FragmentTabA.java b/app/src/main/java/com/fragstack/app/fragments/FragmentTabA.java index c93ab34..a0f5fe7 100644 --- a/app/src/main/java/com/fragstack/app/fragments/FragmentTabA.java +++ b/app/src/main/java/com/fragstack/app/fragments/FragmentTabA.java @@ -1,14 +1,15 @@ package com.fragstack.app.fragments; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.fragstack.app.MainActivity; import com.fragstack.app.R; import com.fragstack.contracts.StackableFragment; diff --git a/app/src/main/java/com/fragstack/app/fragments/FragmentTabB.java b/app/src/main/java/com/fragstack/app/fragments/FragmentTabB.java index 8f41db8..c98145b 100644 --- a/app/src/main/java/com/fragstack/app/fragments/FragmentTabB.java +++ b/app/src/main/java/com/fragstack/app/fragments/FragmentTabB.java @@ -1,14 +1,15 @@ package com.fragstack.app.fragments; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.fragstack.app.MainActivity; import com.fragstack.app.R; import com.fragstack.contracts.StackableFragment; diff --git a/build.gradle b/build.gradle index eccff49..1d47a1c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,20 +1,27 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - + repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.1' - + classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' + // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } -} +} +plugins { + id "org.sonarqube" version "2.6" + /* to run + ./gradlew sonarqube -Dsonar.organization=abhishesh-srivastava-github -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=22ec024f21ebf81af476a4cc96caff0b5d840cccD +*/ +} allprojects { repositories { google() diff --git a/fragstack/build.gradle b/fragstack/build.gradle index c085bbe..18f41ae 100644 --- a/fragstack/build.gradle +++ b/fragstack/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { minSdkVersion 15 - targetSdkVersion 27 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + targetSdkVersion 28 + versionCode 2 + versionName "2.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -19,8 +19,9 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'androidx.appcompat:appcompat:1.0.0' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' + implementation 'androidx.fragment:fragment:1.0.0' } diff --git a/fragstack/src/androidTest/java/com/fragstack/fragmentstack/ExampleInstrumentedTest.java b/fragstack/src/androidTest/java/com/fragstack/fragmentstack/ExampleInstrumentedTest.java index e05976b..440e8c3 100644 --- a/fragstack/src/androidTest/java/com/fragstack/fragmentstack/ExampleInstrumentedTest.java +++ b/fragstack/src/androidTest/java/com/fragstack/fragmentstack/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package com.fragstack.fragmentstack; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/fragstack/src/main/java/com/fragstack/contracts/FragmentTransactionListener.java b/fragstack/src/main/java/com/fragstack/contracts/FragmentTransactionListener.java index a66a754..963b141 100644 --- a/fragstack/src/main/java/com/fragstack/contracts/FragmentTransactionListener.java +++ b/fragstack/src/main/java/com/fragstack/contracts/FragmentTransactionListener.java @@ -1,6 +1,6 @@ package com.fragstack.contracts; -import android.support.v4.app.Fragment; +import androidx.fragment.app.Fragment; public interface FragmentTransactionListener { void onCommit(Fragment f); diff --git a/fragstack/src/main/java/com/fragstack/controller/FragmentController.java b/fragstack/src/main/java/com/fragstack/controller/FragmentController.java index a2a84a8..c9df211 100644 --- a/fragstack/src/main/java/com/fragstack/controller/FragmentController.java +++ b/fragstack/src/main/java/com/fragstack/controller/FragmentController.java @@ -2,14 +2,15 @@ import android.os.Bundle; import android.os.Parcelable; -import android.support.annotation.IdRes; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; import android.text.TextUtils; +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + import com.fragstack.contracts.StackableFragment; import com.fragstack.fragments.ContainerFragment; @@ -64,7 +65,7 @@ public void displayFragment(Fragment fragment, FragmentTransactionOptions fragme if (!topFragment.isAdded()) { performTransaction(topFragment, mTagsStack.peek(), CMD_REPLACE, fragmentTransactionOptions); } - topFragment.performOps(fragment); + topFragment.performOps(fragment, fragmentTransactionOptions); } else { // uh Oh, I have no root fragment, let me create one for you performTransaction(fragment, "root", CMD_REPLACE, fragmentTransactionOptions); } diff --git a/fragstack/src/main/java/com/fragstack/controller/FragmentTransactionOptions.java b/fragstack/src/main/java/com/fragstack/controller/FragmentTransactionOptions.java index d1ec53e..d0d9aca 100644 --- a/fragstack/src/main/java/com/fragstack/controller/FragmentTransactionOptions.java +++ b/fragstack/src/main/java/com/fragstack/controller/FragmentTransactionOptions.java @@ -1,12 +1,13 @@ package com.fragstack.controller; -import android.support.annotation.AnimRes; -import android.support.annotation.AnimatorRes; -import android.support.annotation.IntDef; -import android.support.annotation.StyleRes; -import android.support.v4.app.FragmentTransaction; import android.view.View; +import androidx.annotation.AnimRes; +import androidx.annotation.AnimatorRes; +import androidx.annotation.IntDef; +import androidx.annotation.StyleRes; +import androidx.fragment.app.FragmentTransaction; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -20,30 +21,30 @@ public class FragmentTransactionOptions { } @StyleRes - int transitionStyle = 0; + public int transitionStyle = 0; @Transit - int transit = FragmentTransaction.TRANSIT_UNSET; + public int transit = FragmentTransaction.TRANSIT_UNSET; - View sharedElement; + public View sharedElement; - String name; + public String name; @AnimatorRes @AnimRes - int enter = 0; + public int enter = 0; @AnimatorRes @AnimRes - int exit = 0; + public int exit = 0; @AnimatorRes @AnimRes - int popEnter = 0; + public int popEnter = 0; @AnimatorRes @AnimRes - int popExit = 0; + public int popExit = 0; private FragmentTransactionOptions(Builder builder) { this.transitionStyle = builder.transitionStyle; diff --git a/fragstack/src/main/java/com/fragstack/fragments/ContainerFragment.java b/fragstack/src/main/java/com/fragstack/fragments/ContainerFragment.java index 383e628..03f014b 100644 --- a/fragstack/src/main/java/com/fragstack/fragments/ContainerFragment.java +++ b/fragstack/src/main/java/com/fragstack/fragments/ContainerFragment.java @@ -1,18 +1,21 @@ package com.fragstack.fragments; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; + import com.fragstack.R; import com.fragstack.contracts.FragmentTransactionListener; import com.fragstack.contracts.RootFragmentListener; +import com.fragstack.controller.FragmentTransactionOptions; import java.util.ArrayList; import java.util.List; @@ -63,6 +66,10 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat mFragmentsToAdd.clear(); } + private void performOps(Fragment fragment) { + performOps(fragment, null); + } + @Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); @@ -78,7 +85,7 @@ public String getFragmentName() { return ""; } - public void performOps(Fragment fragment) { + public void performOps(Fragment fragment, @Nullable FragmentTransactionOptions fragmentTransactionOptions) { if (isAdded() && fragment != null) { String tag = String.valueOf(getChildFragmentManager().getBackStackEntryCount()); FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); @@ -88,6 +95,9 @@ public void performOps(Fragment fragment) { if (mFragmentTransactionListener != null) { mFragmentTransactionListener.onCommit(fragment); } + if (fragmentTransactionOptions != null) { + bindFragmentTransactionOptions(fragmentTransaction, fragmentTransactionOptions); + } fragmentTransaction.commitAllowingStateLoss(); fragment.setHasOptionsMenu(true); } catch (IllegalStateException e) { @@ -103,6 +113,27 @@ public void onDetach() { mContext = null; } + @SuppressLint("WrongConstant") + private void bindFragmentTransactionOptions(@NonNull FragmentTransaction fragmentTransaction, @Nullable FragmentTransactionOptions fragmentTransactionOptions) { + if (fragmentTransactionOptions != null) { + if (fragmentTransactionOptions.sharedElement != null) { + fragmentTransaction.addSharedElement(fragmentTransactionOptions.sharedElement, + fragmentTransactionOptions.name); + } + if (fragmentTransactionOptions.transit != FragmentTransaction.TRANSIT_UNSET) { + fragmentTransaction.setTransition(fragmentTransactionOptions.transit); + } + if (fragmentTransactionOptions.transitionStyle != 0) { + fragmentTransaction.setTransitionStyle(fragmentTransactionOptions.transitionStyle); + } + fragmentTransaction.setCustomAnimations(fragmentTransactionOptions.enter, + fragmentTransactionOptions.exit, + fragmentTransactionOptions.popEnter, + fragmentTransactionOptions.popExit); + } + + } + public int getFragmentCount() { return isAdded() ? getChildFragmentManager().getBackStackEntryCount() : 0; } diff --git a/gradle.properties b/gradle.properties index 743d692..8de5058 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,8 @@ # 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. +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b0c510e..ac76014 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip