Skip to content

Commit 614ec2c

Browse files
committed
Merge branch 'master' of github.com:firebase/quickstart-android into compose
� Conflicts: � admob/app/build.gradle � analytics/app/build.gradle � appdistribution/app/build.gradle � auth/app/build.gradle � crash/app/build.gradle � database/app/build.gradle � dynamiclinks/app/build.gradle � inappmessaging/app/build.gradle � perf/app/build.gradle � storage/app/build.gradle
2 parents a6b178f + 214da24 commit 614ec2c

File tree

28 files changed

+157
-130
lines changed

28 files changed

+157
-130
lines changed

admob/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Getting Started
1515

1616
- [Add Firebase to your Android Project](https://firebase.google.com/docs/android/setup).
1717
- Configure your AdMob app id:
18-
- In `src/main/res/values/strings.xml` change the `admob_app_id` string to your AdMon app id.
18+
- In `src/main/res/values/strings.xml` change the `admob_app_id` string to your AdMob app id.
1919
- Note that this ID is used in two places: `AndroidManifest.xml` and `MainActivity`
2020
- Run the sample on your Android device or emulator.
2121
- The running sample displays a test banner ad and a test interstitial add.

admob/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ buildscript {
99
dependencies {
1010
classpath 'com.android.tools.build:gradle:7.3.1'
1111
classpath 'com.google.gms:google-services:4.3.14'
12-
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20'
12+
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
1313
}
1414
}
1515

analytics/app/src/main/java/com/google/firebase/quickstart/analytics/java/MainActivity.java

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,34 +21,34 @@
2121

2222
package com.google.firebase.quickstart.analytics.java;
2323

24-
import android.annotation.SuppressLint;
2524
import android.content.DialogInterface;
2625
import android.content.Intent;
2726
import android.os.Bundle;
2827
import android.util.Log;
2928
import android.view.Menu;
3029
import android.view.MenuItem;
31-
30+
import androidx.annotation.NonNull;
3231
import androidx.appcompat.app.AlertDialog;
3332
import androidx.appcompat.app.AppCompatActivity;
3433
import androidx.fragment.app.Fragment;
3534
import androidx.fragment.app.FragmentManager;
36-
import androidx.fragment.app.FragmentPagerAdapter;
35+
import androidx.lifecycle.Lifecycle;
3736
import androidx.preference.PreferenceManager;
3837
import androidx.viewpager.widget.ViewPager;
39-
38+
import androidx.viewpager2.adapter.FragmentStateAdapter;
39+
import androidx.viewpager2.widget.ViewPager2;
40+
import com.google.android.material.tabs.TabLayout;
41+
import com.google.android.material.tabs.TabLayoutMediator;
4042
import com.google.firebase.analytics.FirebaseAnalytics;
4143
import com.google.firebase.quickstart.analytics.R;
4244
import com.google.firebase.quickstart.analytics.databinding.ActivityMainBinding;
43-
4445
import java.util.Locale;
4546

4647
/**
4748
* Activity which displays numerous background images that may be viewed. These background images
4849
* are shown via {@link ImageFragment}.
4950
*/
5051
public class MainActivity extends AppCompatActivity {
51-
5252
private static final String TAG = "MainActivity";
5353
private static final String KEY_FAVORITE_FOOD = "favorite_food";
5454

@@ -63,14 +63,14 @@ public class MainActivity extends AppCompatActivity {
6363

6464
/**
6565
* The {@link androidx.viewpager.widget.PagerAdapter} that will provide fragments for each image.
66-
* This uses a {@link FragmentPagerAdapter}, which keeps every loaded fragment in memory.
66+
* This uses a {@link FragmentStateAdapter}, which keeps every loaded fragment in memory.
6767
*/
6868
private ImagePagerAdapter mImagePagerAdapter;
6969

7070
/**
7171
* The {@link ViewPager} that will host the patterns.
7272
*/
73-
private ViewPager mViewPager;
73+
private ViewPager2 mViewPager;
7474

7575
/**
7676
* The {@code FirebaseAnalytics} used to record screen views.
@@ -104,28 +104,31 @@ protected void onCreate(Bundle savedInstanceState) {
104104
setUserFavoriteFood(userFavoriteFood);
105105
}
106106

107-
108107
// Create the adapter that will return a fragment for each image.
109-
mImagePagerAdapter = new ImagePagerAdapter(getSupportFragmentManager(), IMAGE_INFOS);
108+
mImagePagerAdapter = new ImagePagerAdapter(getSupportFragmentManager(), IMAGE_INFOS, getLifecycle());
110109

111110
// Set up the ViewPager with the pattern adapter.
112111
mViewPager = binding.viewPager;
113112
mViewPager.setAdapter(mImagePagerAdapter);
114113

115-
// Workaround for AppCompat issue not showing ViewPager titles
116-
ViewPager.LayoutParams params = (ViewPager.LayoutParams)
117-
binding.pagerTabStrip.getLayoutParams();
118-
params.isDecor = true;
119-
120-
// When the visible image changes, send a screen view hit.
121-
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
114+
mViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
122115
@Override
123116
public void onPageSelected(int position) {
117+
super.onPageSelected(position);
124118
recordImageView();
125119
recordScreenView();
126120
}
127121
});
128122

123+
TabLayout tabLayout = binding.tabLayout;
124+
125+
// When the visible image changes, send a screen view hit.
126+
new TabLayoutMediator(tabLayout, mViewPager, new TabLayoutMediator.TabConfigurationStrategy() {
127+
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
128+
tab.setText(IMAGE_INFOS[position].title);
129+
}
130+
}).attach();
131+
129132
// Send initial screen screen view hit.
130133
recordImageView();
131134
}
@@ -235,7 +238,7 @@ private String getCurrentImageId() {
235238

236239
/**
237240
* Record a screen view for the visible {@link ImageFragment} displayed
238-
* inside {@link FragmentPagerAdapter}.
241+
* inside {@link FragmentStateAdapter}.
239242
*/
240243
private void recordImageView() {
241244
String id = getCurrentImageId();
@@ -267,31 +270,18 @@ private void recordScreenView() {
267270
}
268271

269272
/**
270-
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
273+
* A {@link FragmentStateAdapter} that returns a fragment corresponding to
271274
* one of the sections/tabs/pages.
272275
*/
273-
public class ImagePagerAdapter extends FragmentPagerAdapter {
276+
public class ImagePagerAdapter extends FragmentStateAdapter {
274277

275278
private final ImageInfo[] infos;
276279

277-
@SuppressLint("WrongConstant")
278-
public ImagePagerAdapter(FragmentManager fm, ImageInfo[] infos) {
279-
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
280+
public ImagePagerAdapter(FragmentManager fm, ImageInfo[] infos, Lifecycle lifecyle) {
281+
super(fm, lifecyle);
280282
this.infos = infos;
281283
}
282284

283-
@Override
284-
public Fragment getItem(int position) {
285-
ImageInfo info = infos[position];
286-
return ImageFragment.newInstance(info.image);
287-
}
288-
289-
@Override
290-
public int getCount() {
291-
return infos.length;
292-
}
293-
294-
@Override
295285
public CharSequence getPageTitle(int position) {
296286
if (position < 0 || position >= infos.length) {
297287
return null;
@@ -300,5 +290,17 @@ public CharSequence getPageTitle(int position) {
300290
ImageInfo info = infos[position];
301291
return getString(info.title).toUpperCase(l);
302292
}
293+
294+
@NonNull
295+
@Override
296+
public Fragment createFragment(int position) {
297+
ImageInfo info = infos[position];
298+
return ImageFragment.newInstance(info.image);
299+
}
300+
301+
@Override
302+
public int getItemCount() {
303+
return infos.length;
304+
}
303305
}
304306
}

analytics/app/src/main/java/com/google/firebase/quickstart/analytics/kotlin/MainActivity.kt

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,23 @@ import androidx.appcompat.app.AlertDialog
1010
import androidx.appcompat.app.AppCompatActivity
1111
import androidx.fragment.app.Fragment
1212
import androidx.fragment.app.FragmentManager
13-
import androidx.fragment.app.FragmentPagerAdapter
13+
import androidx.lifecycle.Lifecycle
1414
import androidx.preference.PreferenceManager
15-
import androidx.viewpager.widget.ViewPager
15+
import androidx.viewpager2.adapter.FragmentStateAdapter
16+
import androidx.viewpager2.widget.ViewPager2
17+
import com.google.android.material.tabs.TabLayout
18+
import com.google.android.material.tabs.TabLayoutMediator
1619
import com.google.firebase.analytics.FirebaseAnalytics
1720
import com.google.firebase.analytics.ktx.analytics
1821
import com.google.firebase.analytics.ktx.logEvent
1922
import com.google.firebase.ktx.Firebase
2023
import com.google.firebase.quickstart.analytics.R
2124
import com.google.firebase.quickstart.analytics.databinding.ActivityMainBinding
25+
import com.google.firebase.quickstart.analytics.java.MainActivity
26+
import com.google.firebase.quickstart.analytics.kotlin.MainActivity.Companion.IMAGE_INFOS
2227
import java.util.Locale
2328

29+
2430
/**
2531
* Activity which displays numerous background images that may be viewed. These background images
2632
* are shown via {@link ImageFragment}.
@@ -41,8 +47,8 @@ class MainActivity : AppCompatActivity() {
4147
private lateinit var binding: ActivityMainBinding
4248

4349
/**
44-
* The [androidx.viewpager.widget.PagerAdapter] that will provide fragments for each image.
45-
* This uses a [FragmentPagerAdapter], which keeps every loaded fragment in memory.
50+
* The [androidx.viewpager2.widget.PagerAdapter] that will provide fragments for each image.
51+
* This uses a [FragmentStateAdapter], which keeps every loaded fragment in memory.
4652
*/
4753
private lateinit var imagePagerAdapter: ImagePagerAdapter
4854

@@ -73,22 +79,24 @@ class MainActivity : AppCompatActivity() {
7379
}
7480

7581
// Create the adapter that will return a fragment for each image.
76-
imagePagerAdapter = ImagePagerAdapter(supportFragmentManager, IMAGE_INFOS)
82+
imagePagerAdapter = ImagePagerAdapter(supportFragmentManager, IMAGE_INFOS, lifecycle)
7783

7884
// Set up the ViewPager with the pattern adapter.
7985
binding.viewPager.adapter = imagePagerAdapter
8086

81-
// Workaround for AppCompat issue not showing ViewPager titles
82-
val params = binding.pagerTabStrip.layoutParams as ViewPager.LayoutParams
83-
params.isDecor = true
84-
85-
// When the visible image changes, send a screen view hit.
86-
binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
87+
val pageChangedCallback = object : ViewPager2.OnPageChangeCallback() {
8788
override fun onPageSelected(position: Int) {
8889
recordImageView()
8990
recordScreenView()
9091
}
91-
})
92+
}
93+
94+
binding.viewPager.registerOnPageChangeCallback(pageChangedCallback)
95+
96+
val tabLayout: TabLayout = binding.tabLayout
97+
TabLayoutMediator(tabLayout, binding.viewPager) { tab, position ->
98+
tab.setText(IMAGE_INFOS[position].title)
99+
}.attach()
92100

93101
// Send initial screen screen view hit.
94102
recordImageView()
@@ -192,7 +200,7 @@ class MainActivity : AppCompatActivity() {
192200

193201
/**
194202
* Record a screen view for the visible [ImageFragment] displayed
195-
* inside [FragmentPagerAdapter].
203+
* inside [FragmentStateAdapter].
196204
*/
197205
private fun recordImageView() {
198206
val id = getCurrentImageId()
@@ -224,29 +232,29 @@ class MainActivity : AppCompatActivity() {
224232
}
225233

226234
/**
227-
* A [FragmentPagerAdapter] that returns a fragment corresponding to
235+
* A [FragmentStateAdapter] that returns a fragment corresponding to
228236
* one of the sections/tabs/pages.
229237
*/
230-
@SuppressLint("WrongConstant")
231238
inner class ImagePagerAdapter(
232239
fm: FragmentManager,
233-
private val infos: Array<ImageInfo>
234-
) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
240+
private val infos: Array<ImageInfo>,
241+
lifecyle: Lifecycle
242+
) : FragmentStateAdapter(fm, lifecyle) {
235243

236-
override fun getItem(position: Int): Fragment {
237-
val info = infos[position]
238-
return ImageFragment.newInstance(info.image)
239-
}
240-
241-
override fun getCount() = infos.size
242-
243-
override fun getPageTitle(position: Int): CharSequence? {
244+
fun getPageTitle(position: Int): CharSequence? {
244245
if (position < 0 || position >= infos.size) {
245246
return null
246247
}
247248
val l = Locale.getDefault()
248249
val info = infos[position]
249-
return getString(info.title).toUpperCase(l)
250+
return getString(info.title).uppercase(l)
251+
}
252+
253+
override fun getItemCount(): Int = infos.size
254+
255+
override fun createFragment(position: Int): Fragment {
256+
val info = infos[position]
257+
return ImageFragment.newInstance(info.image)
250258
}
251259
}
252260
}

analytics/app/src/main/res/layout/activity_main.xml

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,26 @@ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
1212
CONDITIONS OF ANY KIND, either express or implied. See the License for the
1313
specific language governing permissions and limitations under the License.
1414
-->
15-
<androidx.viewpager.widget.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
15+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
16+
xmlns:app="http://schemas.android.com/apk/res-auto"
1617
xmlns:tools="http://schemas.android.com/tools"
17-
android:id="@+id/viewPager"
1818
android:layout_width="match_parent"
19-
android:layout_height="match_parent"
20-
tools:context="com.google.firebase.quickstart.analytics.java.MainActivity">
19+
android:layout_height="match_parent">
2120

22-
<androidx.viewpager.widget.PagerTabStrip
23-
android:id="@+id/pagerTabStrip"
24-
android:layout_width="match_parent"
21+
<com.google.android.material.tabs.TabLayout
22+
android:id="@+id/tab_layout"
23+
android:layout_width="0dp"
2524
android:layout_height="wrap_content"
26-
android:layout_gravity="top" />
25+
app:layout_constraintEnd_toEndOf="parent"
26+
app:layout_constraintStart_toStartOf="parent"
27+
app:layout_constraintTop_toTopOf="parent" />
2728

28-
</androidx.viewpager.widget.ViewPager>
29+
<androidx.viewpager2.widget.ViewPager2
30+
android:id="@+id/viewPager"
31+
android:layout_width="0dp"
32+
android:layout_height="0dp"
33+
app:layout_constraintBottom_toBottomOf="parent"
34+
app:layout_constraintEnd_toEndOf="parent"
35+
app:layout_constraintStart_toStartOf="parent"
36+
app:layout_constraintTop_toBottomOf="@+id/tab_layout" />
37+
</androidx.constraintlayout.widget.ConstraintLayout>

analytics/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ buildscript {
99
dependencies {
1010
classpath 'com.android.tools.build:gradle:7.3.1'
1111
classpath 'com.google.gms:google-services:4.3.14'
12-
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20'
12+
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
1313
}
1414
}
1515

appdistribution/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ buildscript {
1010
dependencies {
1111
classpath 'com.google.gms:google-services:4.3.14'
1212
classpath 'com.android.tools.build:gradle:7.3.1'
13-
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20'
13+
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
1414
}
1515
}
1616

auth/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ buildscript {
99
dependencies {
1010
classpath 'com.android.tools.build:gradle:7.3.1'
1111
classpath 'com.google.gms:google-services:4.3.14'
12-
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20'
12+
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
1313
}
1414
}
1515

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ buildscript {
99
}
1010
dependencies {
1111
classpath 'com.android.tools.build:gradle:7.3.1'
12-
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20'
12+
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21'
1313

1414
classpath 'com.google.gms:google-services:4.3.14'
1515
classpath 'com.google.firebase:perf-plugin:1.4.2'

config/app/build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ dependencies {
3939
implementation 'com.google.android.material:material:1.7.0'
4040

4141
// Import the Firebase BoM (see: https://firebase.google.com/docs/android/learn-more#bom)
42-
implementation platform('com.google.firebase:firebase-bom:31.0.2')
42+
implementation platform('com.google.firebase:firebase-bom:31.1.0')
4343

4444
// Firebase Remote Config (Java)
4545
implementation 'com.google.firebase:firebase-config'
@@ -51,8 +51,8 @@ dependencies {
5151
// for Google Analytics. This is recommended, but not required.
5252
implementation 'com.google.firebase:firebase-analytics'
5353

54-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
55-
androidTestImplementation 'androidx.test:rules:1.4.0'
56-
androidTestImplementation 'androidx.test:runner:1.4.0'
57-
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
54+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
55+
androidTestImplementation 'androidx.test:rules:1.5.0'
56+
androidTestImplementation 'androidx.test:runner:1.5.1'
57+
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
5858
}

0 commit comments

Comments
 (0)