• Breaking News

    Friday, December 24, 2021

    Android Dev - Explore LiveData & StateFlow Value Emitting Behavior

    Android Dev - Explore LiveData & StateFlow Value Emitting Behavior


    Explore LiveData & StateFlow Value Emitting Behavior

    Posted: 23 Dec 2021 08:05 PM PST

    Approximate vs Precise location update frequencies

    Posted: 23 Dec 2021 07:00 PM PST

    TL;DR Approximate (ACCESS_COARSE_LOCATION) may provide slower updates than Precise (ACCESS_FINE_LOCATION) location updates, regardless of your LocationRequest.interval() or LocationRequest.maxWaitTime().

    https://medium.com/@jfunkekupper/approximate-vs-precise-location-update-frequencies-f5d74d59c3a8

    submitted by /u/jaytothefunk
    [link] [comments]

    Can anyone suggest me some good repos on GitHub. I want to contribute to open source more. Currently I am contributing to Oppia-Android. I am so targeting for GSoC. Any recommendations are appreciated.

    Posted: 23 Dec 2021 11:04 PM PST

    A company wants to buy my app, but it feels like I am selling my child!

    Posted: 23 Dec 2021 02:47 AM PST

    A company recently reached out to me, inquiring about buying my app. The app is my first app I developed (and the only one) and I developed it totally on my own. I even learned coding by developing it.

    The offer is legit, but I simply do not want to sell the app. I have put so much effort and work into it, it feels like I would sell my own child to them.

    Anyone experiencing the same when developing their own apps?

    submitted by /u/greenBlueChameleon
    [link] [comments]

    How to do heavy processing in a background thread immediately?

    Posted: 23 Dec 2021 08:57 PM PST

    Hello,

    I am developing an Android app which uses the accessibility service. It has some processing which needs to be executed immediately. But this process freezes the main thread and leads to the app not responding. So, I used kotlin coroutines to do the heavy processing in the background threads. But the problem is that , while it does not freeze the UI, it takes some time to complete. It is not immediate.

    How can I do the processing immediately without freezing the UI ?

    My code :

    class CustomAccessibilityService : AccessibilityService() {

    private val accessibilityScope = CoroutineScope(IO)

    val accessibilityScopeExceptionhandler = CoroutineExceptionHandler {

    context, exception -> Log.wtf(this::class.java.simpleName,"Caught exception. ${exception.message}")

    }

    override fun onAccessibilityEvent(event: AccessibilityEvent?) {

    accessibilityScope.launch(accessibilityScopeExceptionhandler) {

    // Some heavy processing.

    withContext(Main){

    // Take UI actions

    }

    }

    }

    }

    Every time an event happens, I get multiple onAccessibilityEvent() callbacks and a coroutine launch happens. So, it takes time to complete.I want to complete the heavy processing immediately.

    Are coroutines the best option to achieve my goal ?

    submitted by /u/binishmatheww
    [link] [comments]

    Is there a way to receive Instagram app notifications without installing app?

    Posted: 24 Dec 2021 12:00 AM PST

    Is there a way to receive notifications like "x requested to follow you" , "x posted a story" without installing the app, like send to my email?

    submitted by /u/janalpadi
    [link] [comments]

    Check the first look of Android 13 and the features

    Posted: 23 Dec 2021 09:51 PM PST

    App removed because of draft release

    Posted: 23 Dec 2021 01:38 AM PST

    App removed because of draft release

    This is not "help me" post.

    Yesterday got email from Google that my app because of policy violation. The application is over 6 years old and haven't made update to the play store in years. I'm currently rewriting it in flutter, so my focus is mostly there.

    Christmas letter from Google

    According to Google:

    Your app is uploading users' Installed Application information without a prominent disclosure.

    That part is not true, the application is a reminders app.
    The reminders are shown as notifications in the notification drawer and has a feature where you can set an application to your reminder as action and that application will open when you tap on the reminder notification.

    The current version on the Play Store is 1040100 and it was published few years ago.
    The version in the takedown notice is 1010233, which was just sitting in draft for 3+ years and also does not upload installed applications anywhere, there is no accounts or synchronization.

    Your app was removed from Google Play and won't be available to users until you submit a policy compliant update.

    My app was removed because I did not select checkbox in the Play Console, especially for draft release. No warning or notifying me that my app will be removed if I don't update the privacy policy in the Play Console.

    What I don't understand is why Google is treating developers in this way. If it wasn't for developers, Android would not be there were it is now. Google Maps wouldn't had accurate traffic information, AdMob and all other Google services that grew because Android devices are everywhere.

    Some of you already started with the holiday break, but it is the best time to check and clean up the Play Console.

    Thank you for your time and happy holidays.

    submitted by /u/drashmk
    [link] [comments]

    Android 13 is developing Panlingual feature

    Posted: 23 Dec 2021 07:51 PM PST

    RTSP stream parse exception with Exoplayer

    Posted: 23 Dec 2021 11:14 AM PST

    I'm having trouble playing an RTSP stream with Exoplayer. The stream works fine in VLC player but I'm getting a parse exception with Exoplayer. I obfuscated the username/password, obviously.

    @Composable fun Player() { val sampleVideo = "rtsp://username:password@xx.xx.xx.xx:xxx" val mediaSource: MediaSource = RtspMediaSource.Factory().setDebugLoggingEnabled(true).setForceUseRtpTcp(true) .createMediaSource(MediaItem.fromUri(sampleVideo)) val context = LocalContext.current val player = ExoPlayer.Builder(context).build() val playerView = PlayerView(context) val playWhenReady by rememberSaveable { mutableStateOf(true) } player.setMediaSource(mediaSource) playerView.player = player LaunchedEffect(player) { player.prepare() player.playWhenReady = playWhenReady } AndroidView(factory = { playerView }) } 

    Exception:

    E/ExoPlayerImplInternal: Playback error com.google.android.exoplayer2.ExoPlaybackException: Source error at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:628) at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:604) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:246) at android.os.HandlerThread.run(HandlerThread.java:67) Caused by: com.google.android.exoplayer2.source.rtsp.RtspMediaSource$RtspPlaybackException: com.google.android.exoplayer2.ParserException: ssrc=1ce9adb3 at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:627) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:494) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$com-google-android-exoplayer2-source-rtsp-RtspClient$MessageListener(RtspClient.java:487) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.os.HandlerThread.run(HandlerThread.java:67) Caused by: com.google.android.exoplayer2.ParserException: ssrc=1ce9adb3 at com.google.android.exoplayer2.source.rtsp.RtspTrackTiming.parseTrackTiming(RtspTrackTiming.java:90) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:606) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:494) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$com-google-android-exoplayer2-source-rtsp-RtspClient$MessageListener(RtspClient.java:487) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.os.HandlerThread.run(HandlerThread.java:67) Caused by: com.google.android.exoplayer2.ParserException: ssrc at com.google.android.exoplayer2.source.rtsp.RtspTrackTiming.parseTrackTiming(RtspTrackTiming.java:87) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:606) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:494) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$com-google-android-exoplayer2-source-rtsp-RtspClient$MessageListener(RtspClient.java:487) at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.os.HandlerThread.run(HandlerThread.java:67) 
    submitted by /u/DisregardAccount
    [link] [comments]

    Did you consider or are you considering the integration of Huawei Mobile Services ?

    Posted: 23 Dec 2021 02:49 PM PST

    Now that we have a little perspective on the Huawei ban. What are the most important services for your? (Push, Billing, …)

    View Poll

    submitted by /u/Muffin-5412
    [link] [comments]

    Compose rememberScoped: Scoping objects to a Composable' lifecycle

    Posted: 23 Dec 2021 06:23 AM PST

    With Compose we can build reusable UI components and now we finally have the chance to build really reusable components made of UI and business logic, we just need to connect them properly.

    That's why I've built this tiny library, to have ViewModels or any business logic object scoped to the lifecycle of a Composable (instead of scoped to the whole screen), even when the Composable goes into the backstack or the app goes through a configuration change (something remember does not handle).

    @Composable fun DemoViewModelWithIdComposable() { // VMs survive config changes and are disposed with this Composable val scopedVMWithFirstId = rememberScoped("myFirstId") { MyViewModel("myFirstId") } val scopedVMWithSecondId = rememberScoped("mySecondId") { MyViewModel("mySecondId") } // 2 VMs of the same type with different data inside the same Composable scope DemoComposable(inputObject = scopedVMWithFirstId) DemoComposable(inputObject = scopedVMWithSecondId) } 

    https://github.com/sebaslogen/resaca

    PS: If you have a use case for this type of scoping in your app I'm very curious to hear about it! Please leave a comment or DM me

    submitted by /u/sebaslogen
    [link] [comments]

    Hey Google, it's time to make gradle.kts the default on new project.

    Posted: 22 Dec 2021 07:27 PM PST

    Not that I hate Groovy or anything, but why not make Android project all kotlin since we are adopting Compose now? Companies just feel reluctant to do the migration as Groovy is still default on new project..

    What do you think?

    submitted by /u/LightYearsBehind
    [link] [comments]

    How come VLC is allowed to use MANAGE_EXTERNAL_STORAGE permission?

    Posted: 22 Dec 2021 02:21 PM PST

    The latest version of VLC (already available in the testing channel on Google Play) uses the MANAGE_EXTERNAL_STORAGE permission. While other open source media player (Nova Video Player) was denied that permission.

    Both apps core functionality is media playback. I don't know the details in case of VLC but from my end, it doesn't seem like a fair treatment.

    submitted by /u/moneytoo
    [link] [comments]

    How to create this collapsing toolbar?

    Posted: 23 Dec 2021 12:03 PM PST

    Resources for android development

    Posted: 23 Dec 2021 08:58 AM PST

    Hi i want to start android development what are some resources like youtube tutorials,udemy course that you guys suggest. And some tips if you want to give also. Thanks

    submitted by /u/R_sharma10
    [link] [comments]

    Do Ad impressions pay on google Admob?

    Posted: 23 Dec 2021 07:43 AM PST

    like hypothetically if someone watches a Video Ad all the way through i would be payed for that right?

    Cause ive heard that Admob only pays for whenever anyone actually taps on an Ad. In which case i would literally make no money at all because unless its an accident who the hell actually ever taps on an ad lol.

    submitted by /u/CHRISPEROS
    [link] [comments]

    Android app bundle vs apk. How to get APK after cordova 10 release.

    Posted: 23 Dec 2021 07:16 AM PST

    After the release of cordova-android 10.0.0, hybrid frameworks are getting .aab file on production or release builds of app. (Android app bundle file). In recent PlayStore asking users to opt in the .aab file upload to reduce the app size while downloading in phones. Here is a demonstration, how I managed to get the .apk file for my phone before releasing the app to playstore.

    https://www.youtube.com/watch?v=f3-T02cpsNc

    submitted by /u/fanaticusofficials
    [link] [comments]

    How to properly handle conditional navigation with dynamic starting destination whhen using navigation component?

    Posted: 23 Dec 2021 05:12 AM PST

    Please read my whole post before redirecting me to the official doumentation on conditional navigation. I've already read that and couldn't figure it out. I'll explain what is confusing me, but first I'll explain my goals and include some snippets of what I have so far and what are the issues with it.

    My goal is to have the following login flows:

    1. Unauthorized - That's when the user installs the app for first time or had used the logout. After the splashcreen, which is implemented with the new api, the user is redirected to LoginFragment. It has a login button that will sign the user with email, fetch data and redirect to HomeFragment.
    2. Authorized - When the user comes back to the app after closing it. After the splashscreen, the user is redirected to HomeFragment. However, in this case the splashscreen must stay until the data from firebase is being fetched and only when it's ready to navigate to HomeFragment.

    My first problem with conditional navigation guide is that they use a main fragment, which I don't have at all. Please don't suggest me to make splashfragment, I'm using the new api, so I can't do that.

    I believe that, my start destination should be my HomeFragment instead.

    However, this snippet they have provided:

    userViewModel.user.observe(viewLifecycleOwner, Observer { user -> if (user != null) { showWelcomeMessage() } else { navController.navigate(R.id.login_fragment) } }) 

    Basically the showWelcomeMessage() is equivalent of initing/fetching user data in my case. However that wouldn't exactly be a good place to do, because as I said earlier, the splashscreen should stay while data is being fetched, so I can't do the fetching here. I don't want to be showing an empty fragment.

    Also another problem with their snippets (when adapting for my case):

    savedStateHandle.getLiveData<Boolean>(LoginFragment.LOGIN_SUCCESSFUL) .observe(currentBackStackEntry, Observer { success -> if (!success) { val startDestination = navController.graph.startDestination val navOptions = NavOptions.Builder() .setPopUpTo(startDestination, true) .build() navController.navigate(startDestination, null, navOptions) } }) 

    I can't pop to startDestination, because my start should be ProfileFragment/HomeFragment and it wouldn't make any sense.

    If my startDestination is LoginFragment instead, then it will flash on screen after the splashscreen and before going to home, due to the load time of the data, which looks ugly.

    I guess I should be doing something completely different. Like using MainActivity as the supposedly non-existant main fragment. So I tried to gather more info.

    Introducing - android template by u/skyyoo_

    I did like how he changes the graph's startDestination based on authentication state and I did something simillar, here are my snippets, as simplified as I could (removed exception handling etc).

    In MainActivity.kt :

     private lateinit var navController: NavController private var readyToDismissSplash = false private var isNameSet = false @Inject lateinit var userManager: UserManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) installSplashScreen() observeSplashScreenVisibility() _binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) lifecycleScope.apply { launch { withContext(Dispatchers.IO) { val startDestination = provideStartDestination() withContext(Dispatchers.Main) { initNavigation(startDestination) } } } } } ... private fun observeSplashScreenVisibility() { val content: View = findViewById(android.R.id.content) content.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { return if (readyToDismissSplash) { // The content is ready; start drawing. content.viewTreeObserver.removeOnPreDrawListener(this) true } else { // The content is not ready; suspend. false } } }) } ... private fun provideStartDestination(): Int { val currentUser = FirebaseAuth.getInstance().currentUser return if (currentUser == null) { R.id.nav_login } else { initUser() R.id.nav_home } } ... fun initNavigation(startDestination: Int) { (supportFragmentManager.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment).also { navHost -> val navInflater = navHost.navController.navInflater val navGraph = navInflater.inflate(R.navigation.nav_graph) navGraph.setStartDestination(startDestination) navHost.navController.graph = navGraph navController = navHost.navController setSupportActionBar(binding.appBarMain.toolbar) setupActionBarWithNavController(navController, drawerLayout) navigationView.setupWithNavController(navController) setupOnDestinationChangeListener(drawerLayout) if (startDestination == R.id.nav_login) { readyToDismissSplash = true } } } ... fun initUser(shouldInitNavigation: Boolean = false) { job = lifecycleScope.launch { userManager.userData .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED) .collect { result -> when (result) { is Resource.Success -> { if (!isNameSet) { val user = result.data!! val displayName = "${user.firstName} ${user.lastName}" setupDisplayName(displayName) readyToDismissSplash = true isNameSet = true } if (shouldInitNav) { withContext(Dispatchers.Main) { initNavigation(R.id.nav_home) } } } //handle sad paths } } } } override fun onDestroy() { super.onDestroy() _binding = null job?.cancel() job = null } 

    In UserManager.kt. The flow I'm observing from MainActivity.kt and from my UserRepository™ (I might need better names/implementation for these, open to suggestions, might not even need a repository and only use-cases, but not sure how that works and it's out of scope of this post I guess) which VMs use:

     val userData: Flow<Resource<User>> get() = _userData private val _userData = callbackFlow<Resource<User>> { trySend(Resource.Loading()) val currentUser = FirebaseAuth.getInstance().currentUser val email = currentUser?.email!! try { documentRef = db.collection(USERS_COLLECTION) .whereEqualTo(USER_EMAIL, email) queryRef = documentRef?.limit(1)?.get()?.await() listener = documentRef?.addSnapshotListener { snapshot, error -> //handle errors if(error){ trySend(Resource.Error(...)) return@addSnapshotListener } queryRef = snapshot val data = snapshot.documents[0].toUser() if (data != null) { trySend(Resource.Success(data)) } else { trySend(Resource.Error(...)) } }!! } catch (e: FirebaseFirestoreException) { trySend(Resource.Error(...)) } awaitClose { listener?.remove() } }.shareIn( externalScope, replay = 1, started = SharingStarted.WhileSubscribed( stopTimeoutMillis = 5000L ) ) 

    HomeFragment.kt just observes the LiveData/Flows coming from UserManager -> UserRepositry -> HomeViewModel -> HomeFragment. Nothing special, so I won't be including snippets for now, but if someone requires I'll.

    In LoginFragment.kt:

     private var googleLoginLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { activityResult -> collectResult(activityResult) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = FragmentLoginBinding.bind(view) binding.loginButton.setOnClickListener { val signInIntent = loginViewModel.getSignInIntent() googleLoginLauncher.launch(signInIntent) } } private fun collectResult(activityResult: ActivityResult?) { lifecycleScope.launch(Dispatchers.Main) { val data: Intent? = activityResult?.data val task = GoogleSignIn.getSignedInAccountFromIntent(data) loginViewModel.signIn(task) .flowWithLifecycle(lifecycle) .collect { signInResult -> when (signInResult) { is SignInResult.Success -> { (activity as MainActivity).initUser(true) binding.progressBar.hide() } is SignInResult.Error -> { binding.progressBar.hide() // handle sad path } is SignInResult.Loading -> binding.progressBar.show() } } } } 

    loginViewModel.signIn:

    fun signIn(task: Task<GoogleSignInAccount>) = authService.signInWithGoogle(task) 

    authService.signInWithGoogle:

    fun signInWithGoogle(task: Task<GoogleSignInAccount>) = flow { emit(SignInResult.Loading) try { val account: GoogleSignInAccount = task.getResult(ApiException::class.java) val credential = GoogleAuthProvider .getCredential(account.idToken, null) val result = firebaseAuth.signInWithCredential(credential).await() val user = SignInResult.Success(result.user) if (user.data != null) { emit(user) // return } else { signOut() emit(SignInResult.Error()) } } catch (e: ApiException) { // handle sad path } } 

    What happens now is when user logs in, goes to FragmentB.kt, (which contains a recyclerview populated with data from FragmentBViewModel, this VM uses the same UserRepository that exposes UserManager's userData , but mapped in different ways, as does the HomeViewModel), interacts with RV's data - for example deletes or edits a row, the operation is successfull, it does send a proper query to Firebase, the data gets updated, all that good stuff, but the user gets redirected to the home screen. That shouldn't happen. Must stay on FragmentB , but instead it gets destoyed for some reason, I've put a breakpoint in onDestroyView _binding = null and it indeed goes there.

    If user closes and reopens the app this will no longer happen. Even if they restart the app immediatelly after first time login, the issue is gone. My theory is that something goes wrong when going from login flow 1 to 2, because I'm using my initNavigation method twice - in onCreate when initing start destination as R.id.nav_login and then a second time from LoginFragment calling activity.initUser(true).

    The "fix" I've came up with is really bad and not something I want to do. It's also really slow, but basically replacing:

    (activity as MainActivity).initUser(true) 

    with

    findNavController().popBackStack() (activity as MainActivity).recreate() 

    This basically makes it like the user is coming back to the app after restart, going straight to Authorized login flow.

    So how do I properly handle conditional navigation while waiting user data? Maybe I can make the data load faster with saveStateHandle, but I don't get how to use it. I don't really understand the documentation about it - where/when exactly to use it. Also I tested the app offline, because firebase supports caching and handles that type of stuff and weird enough the splashscreen stayed for the same amount of time as with online (when fetching). How is that even possible, shouldn't loading from cache be so much faster?

    submitted by /u/steve6174
    [link] [comments]

    Looking to diagnose a potentially broken SD card slot

    Posted: 23 Dec 2021 10:45 AM PST

    Hi, I have an old S7 (W8 Canadian model) and still quite like the phone as it mostly does what I need. I do have a major issue with it however which is that I am running out of space.

    Originally one of the selling points of this phone was the sim card expansion slot however I have tried multiple SD cards that all work on a computer with this phone all with no avail. Originally, when I put a SD card inside the phone I would get a toast saying something along the lines of unable to format. However, now that I once again have tried to get this working I get no alert from the phone that it even knows that a SD card was inserted. I was considering that maybe there was a hardware issue earlier, but it still could detect that an SD card was inserted but now that it can no longer do that I increasingly suspect an issue with the physical SD/Sim card slot which is soldered to the main board. However, my SIM card still works fine which on the S7 use the same port as the SD card.

    For that reason I want to finally rule out a software issue with android and therefore am looking for tools that could diagnose a faulty SD card slot. I have very little experience dealing with androids Linux but assume that there are some soft of kernel logs that I could check to see if it is dumping anything related to an SD card being detected. If such logs exist where could I find them, or are there any developer oriented tools that could be used to finally come to a diagnosis of my SD card issue.

    submitted by /u/lurkingInTheShadows9
    [link] [comments]

    Getting such large API response

    Posted: 23 Dec 2021 03:41 AM PST

    API Response Img

    So, I am getting a large API response, and I am using retrofit to get the api response. However I am getting OutOfMemoryException while getting the response. The goal is to parse the json and write in sqlite database. Any help or guidance in order to do this? Thank you.

    Yes, I have gone through all basic steps like setting largeHeap to true, writing dexOption in gradle file and having maxJavaHeapSize as 4g (also in local.properties).

    submitted by /u/Samalvii
    [link] [comments]

    I need to give a presentation on coroutines and connecting to the internet to novice students. What's some easy way to do that. I found the official course to be a bit hard for them. Any suggestions?

    Posted: 22 Dec 2021 10:13 PM PST

    Something off my chest on Proguard and Gson

    Posted: 23 Dec 2021 12:43 AM PST

    Proguard has always been a pain in the butt when you had some JSON to parse or using the old Webrtc.

    So I avoided all JSON parsing libraries except Gson and I was baffled how it didn't even require me writing any rule, unbelievably easy, the apk with half of its pre-proguard size was produced, and no crash because of renaming POJO files by proguard.

    Thanks G

    submitted by /u/inAbigworld
    [link] [comments]

    How to use UnboudID in my android app?

    Posted: 22 Dec 2021 10:37 PM PST

    As mentioned in the heading, I want access to the ldap servers and this can be done by using the unboundID sdk for java. Can anyone tell me how to use it in my android studio project?

    submitted by /u/aditya7682
    [link] [comments]

    Handling null responses from API?

    Posted: 22 Dec 2021 10:23 PM PST

    Is there any proper way to set default value from string resource for the null values from JSON response. currently using by this method.

    textView.text = someValue ?: getString(stringResId)

    submitted by /u/nabeel527
    [link] [comments]

    No comments:

    Post a Comment