Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8a043d5 authored by Hasib Prince's avatar Hasib Prince
Browse files

login page in compose

parent efc577d1
Loading
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ plugins {
    id 'androidx.navigation.safeargs.kotlin'
    id 'com.google.dagger.hilt.android'
    id 'kotlin-allopen'
    id 'org.jetbrains.kotlin.android'
}

def versionMajor = 2
@@ -42,7 +43,7 @@ def getSentryDsn = { ->
}

android {
    compileSdk 33
    compileSdk 34

    defaultConfig {
        applicationId "foundation.e.apps"
@@ -121,6 +122,12 @@ android {
        viewBinding true
        aidl true
    }
    buildFeatures {
        compose true
    }
    composeOptions {
        kotlinCompilerExtensionVersion "1.4.1"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
@@ -218,6 +225,16 @@ dependencies {
    implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"

    // Compose
    def composeBom = platform('androidx.compose:compose-bom:2023.01.00')
    implementation(composeBom)
    androidTestImplementation(composeBom)
    implementation "androidx.compose.ui:ui"
    implementation "androidx.compose.ui:ui-tooling-preview"
    implementation 'androidx.compose.material3:material3'
    implementation "androidx.compose.material:material-icons-extended"
    implementation 'androidx.activity:activity-compose:1.8.2'

    // Hilt
    def hilt_version = '2.40.5'
    kapt "com.google.dagger:hilt-compiler:2.44.2"
+175 −1
Original line number Diff line number Diff line
package foundation.e.apps.ui.setup.signin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.ExperimentalTextApi
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.DeviceFontFamilyName
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.ExperimentalUnitApi
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.TextUnitType
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController
@@ -11,6 +49,7 @@ import foundation.e.apps.data.login.LoginViewModel
import foundation.e.apps.databinding.FragmentSignInBinding
import foundation.e.apps.di.CommonUtilsModule.safeNavigate
import foundation.e.apps.utils.showGoogleSignInAlertDialog
import timber.log.Timber

@AndroidEntryPoint
class SignInFragment : Fragment(R.layout.fragment_sign_in) {
@@ -21,9 +60,27 @@ class SignInFragment : Fragment(R.layout.fragment_sign_in) {
        ViewModelProvider(requireActivity())[LoginViewModel::class.java]
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentSignInBinding.inflate(inflater, container, false)
        val view = binding.root
        _binding!!.composeView.apply {
            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
            setContent {
                MaterialTheme {
                    Login(Modifier.fillMaxSize())
                }
            }
        }

        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        _binding = FragmentSignInBinding.bind(view)

        binding.googleBT.setOnClickListener {
            context?.showGoogleSignInAlertDialog(
@@ -47,6 +104,123 @@ class SignInFragment : Fragment(R.layout.fragment_sign_in) {
        }
    }

    @Composable
    private fun Login(modifier: Modifier) {
        Column(
            modifier = modifier.fillMaxSize(),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Box(modifier = Modifier.Companion.weight(1f).fillMaxWidth()) {
                Column(modifier = Modifier.align(Alignment.Center)) {
                    Image(
                        imageVector = ImageVector.vectorResource(R.drawable.ic_launcher),
                        contentDescription = "",
                        contentScale = ContentScale.FillBounds,
                        modifier = Modifier.width(108.dp).height(108.dp)
                    )
                    Text(
                        modifier = Modifier.align(Alignment.CenterHorizontally),
                        text = "App Lounge",
                        fontSize = 16.sp,
                        style = TextStyle(color = Color.DarkGray, fontWeight = FontWeight.Bold)
                    )
                }
            }
            Column(
                modifier = Modifier.weight(1f),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                WelcomeText()
                SigninButtons()
                Text(stringResource(R.string.or), modifier = Modifier.padding(top = 10.dp))
                OutlinedButton(
                    modifier = Modifier.padding(start = 40.dp, end = 40.dp, top = 20.dp)
                        .fillMaxWidth(),
                    border = BorderStroke(1.dp, colorResource(R.color.colorAccent)),
                    onClick = {
                        navigateToGoogleSignInFragment()
                    },
                    shape = RoundedCornerShape(5.dp)
                ) {
                    SiginInButtonText(stringResource(R.string.pwa_and_open_source_apps))
                }
            }
        }
    }

    @OptIn(ExperimentalTextApi::class, ExperimentalUnitApi::class)
    @Composable
    private fun SigninButtons() {
        OutlinedButton(
            modifier = Modifier.padding(start = 40.dp, end = 40.dp, top = 20.dp).fillMaxWidth(),
            border = BorderStroke(1.dp, colorResource(R.color.colorAccent)),
            onClick = {
                navigateToGoogleSignInFragment()
            },
            shape = RoundedCornerShape(5.dp)
        ) {
            SiginInButtonText("Sign in with Google")
        }
        OutlinedButton(
            modifier = Modifier.padding(horizontal = 40.dp, vertical = 5.dp).fillMaxWidth(),
            border = BorderStroke(1.dp, colorResource(R.color.colorAccent)),
            onClick = {
                viewModel.initialAnonymousLogin {
                    Timber.d("On user saved...")
                    view?.findNavController()
                        ?.safeNavigate(
                            R.id.signInFragment,
                            R.id.action_signInFragment_to_homeFragment
                        )
                }
            },
            shape = RoundedCornerShape(5.dp)
        ) {
            Row {
                Image(
                    imageVector = ImageVector.vectorResource(R.drawable.ic_incognito),
                    contentDescription = "",
                    modifier = Modifier.padding(end = 10.dp)
                )
                SiginInButtonText("Anonymous login")
            }
        }
    }

    @OptIn(ExperimentalTextApi::class, ExperimentalUnitApi::class)
    @Composable
    private fun SiginInButtonText(text: String) {
        Text(
            text.uppercase(),
            color = colorResource(R.color.colorAccent),
            fontFamily = FontFamily(
                Font(familyName = DeviceFontFamilyName("sans-serif"))
            ),
            style = TextStyle(letterSpacing = TextUnit(1.7f, TextUnitType.Sp)),
            fontWeight = FontWeight.SemiBold
        )
    }

    @Composable
    private fun WelcomeText() {
        Text(
            "Welcome",
            style = TextStyle(
                fontSize = 25.sp,
                fontWeight = FontWeight.Bold
            )
        )
        Text(
            stringResource(R.string.sign_in_desc),
            modifier = Modifier.padding(horizontal = 70.dp),
            style = TextStyle(
                color = Color.Black,
                fontSize = 15.sp,
                textAlign = TextAlign.Center
            )
        )
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
+91 −0
Original line number Diff line number Diff line
<!--
  ~ Apps  Quickly and easily install Android apps onto your device!
  ~ Copyright (C) 2021  E FOUNDATION
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  -->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
  <group android:scaleX="0.16913024"
      android:scaleY="0.17913024"
      android:translateX="-21.731352"
      android:translateY="-22.328918">
    <group>
      <clip-path
          android:pathData="M0,0h933.561v933.561h-933.561z"/>
      <path
          android:pathData="M296.81,491.609h298.61v117.272h-298.61z">
        <aapt:attr name="android:fillColor">
          <gradient 
              android:startY="575.8292"
              android:startX="482.6315"
              android:endY="568.4257"
              android:endX="576.5685"
              android:type="linear">
            <item android:offset="0" android:color="#FFF54057"/>
            <item android:offset="1" android:color="#FF9C314E"/>
          </gradient>
        </aapt:attr>
      </path>
      <path
          android:pathData="M408.23,203.551C397.68,203.551 385.543,211.218 381.019,220.749L374.86,233.707L153.026,701.09C152.46,702.281 152.041,703.434 151.761,704.556C151.76,704.559 151.762,704.568 151.761,704.571C151.504,705.609 151.384,706.616 151.36,707.576C151.357,707.716 151.358,707.854 151.36,707.992C151.368,708.95 151.469,709.859 151.702,710.715C151.951,711.63 152.326,712.482 152.818,713.259C153.309,714.036 153.913,714.74 154.633,715.357C155.353,715.974 156.183,716.5 157.117,716.934C158.051,717.368 159.093,717.717 160.227,717.945C161.36,718.174 162.582,718.287 163.901,718.287L277.846,718.287C279.155,718.287 280.478,718.171 281.818,717.945C281.827,717.944 281.838,717.947 281.848,717.945C281.882,717.94 281.918,717.937 281.952,717.931C283.269,717.703 284.597,717.357 285.909,716.934C287.255,716.5 288.591,715.974 289.896,715.357C291.202,714.74 292.476,714.037 293.705,713.259C294.856,712.532 295.954,711.728 297.008,710.879C297.162,710.755 297.317,710.634 297.469,710.507C298.413,709.719 299.31,708.894 300.147,708.023C300.22,707.947 300.298,707.876 300.37,707.8C300.444,707.721 300.505,707.641 300.578,707.562C301.404,706.666 302.18,705.729 302.869,704.765C302.918,704.696 302.969,704.626 303.018,704.557C303.052,704.508 303.074,704.456 303.107,704.408C303.851,703.33 304.515,702.231 305.056,701.09L466.876,360.134L533.035,220.749C537.559,211.218 532.709,203.551 522.16,203.551L408.23,203.551Z">
        <aapt:attr name="android:fillColor">
          <gradient 
              android:startY="351.15564"
              android:startX="333.27975"
              android:endY="212.06798"
              android:endX="440.9688"
              android:type="linear">
            <item android:offset="0" android:color="#FF1EC296"/>
            <item android:offset="1" android:color="#FF22853E"/>
          </gradient>
        </aapt:attr>
      </path>
      <path
          android:pathData="M523.478,203.549L407.658,203.549C397.668,203.549 393.036,210.876 397.319,219.901L626.115,701.937C630.398,710.961 641.986,718.288 651.975,718.288L767.795,718.288C777.785,718.288 782.418,710.961 778.134,701.937L549.339,219.901C545.056,210.876 533.468,203.549 523.478,203.549Z"
          android:strokeColor="#00000000">
        <aapt:attr name="android:fillColor">
          <gradient 
              android:startY="477.08734"
              android:startX="694.314"
              android:endY="326.03583"
              android:endX="688.7257"
              android:type="linear">
            <item android:offset="0" android:color="#FFF5CA2F"/>
            <item android:offset="1" android:color="#FFF8D037"/>
          </gradient>
        </aapt:attr>
      </path>
      <path
          android:pathData="M408.601,203.549C408.59,203.549 408.58,203.551 408.569,203.551L408.231,203.551C407.901,203.551 407.569,203.558 407.236,203.573C406.904,203.588 406.57,203.609 406.236,203.639C405.901,203.668 405.564,203.705 405.228,203.749C404.891,203.792 404.555,203.842 404.217,203.899C403.879,203.956 403.541,204.019 403.203,204.09C402.865,204.16 402.528,204.238 402.189,204.322C401.851,204.405 401.513,204.495 401.176,204.591C400.838,204.687 400.5,204.789 400.163,204.898C399.827,205.006 399.492,205.121 399.157,205.242C398.822,205.362 398.488,205.488 398.155,205.62C397.823,205.752 397.492,205.889 397.162,206.032C396.832,206.176 396.503,206.325 396.177,206.479C395.85,206.633 395.526,206.794 395.203,206.958C394.881,207.123 394.561,207.292 394.243,207.467C393.925,207.642 393.609,207.823 393.296,208.008C392.983,208.193 392.672,208.382 392.364,208.576C392.256,208.645 392.15,208.717 392.043,208.786C391.845,208.914 391.647,209.04 391.452,209.172C391.15,209.375 390.853,209.584 390.558,209.796C390.264,210.008 389.973,210.224 389.686,210.445C389.399,210.665 389.115,210.891 388.836,211.119C388.557,211.348 388.281,211.579 388.01,211.816C387.739,212.052 387.472,212.293 387.21,212.536C386.948,212.78 386.69,213.029 386.438,213.279C386.185,213.53 385.939,213.784 385.696,214.041C385.454,214.299 385.216,214.559 384.985,214.823C384.753,215.087 384.526,215.353 384.306,215.622C384.085,215.892 383.871,216.165 383.663,216.44C383.454,216.715 383.252,216.993 383.055,217.273C382.859,217.554 382.669,217.837 382.485,218.122C382.302,218.407 382.125,218.696 381.955,218.985C381.785,219.275 381.621,219.567 381.465,219.861C381.31,220.155 381.16,220.452 381.019,220.749L376.252,230.777L376.26,230.82C376.26,230.82 388.455,201.475 403.89,233.869L419.324,266.262L419.324,266.263L465.573,363.701L539.006,208.987C538.802,208.853 538.605,208.707 538.399,208.576C537.784,208.188 537.157,207.817 536.521,207.467C535.885,207.117 535.24,206.787 534.588,206.479C533.935,206.17 533.274,205.884 532.609,205.62C531.944,205.356 531.274,205.114 530.601,204.896C529.928,204.679 529.253,204.487 528.576,204.32C527.9,204.153 527.222,204.012 526.547,203.898C525.872,203.783 525.199,203.696 524.53,203.637C523.86,203.578 523.194,203.549 522.535,203.549L408.601,203.549Z">
        <aapt:attr name="android:fillColor">
          <gradient 
              android:startY="230.80634"
              android:startX="459.2523"
              android:endY="293.8574"
              android:endX="596.1042"
              android:type="linear">
            <item android:offset="0" android:color="#FF48D0F5"/>
            <item android:offset="1" android:color="#FF4677C3"/>
          </gradient>
        </aapt:attr>
      </path>
    </group>
  </group>
</vector>
+6 −1
Original line number Diff line number Diff line
@@ -12,7 +12,8 @@
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        android:orientation="vertical"
        android:visibility="visible">

        <ImageView
            android:id="@+id/imageView"
@@ -149,5 +150,9 @@
            app:strokeColor="@color/colorAccent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
    <androidx.compose.ui.platform.ComposeView
        android:id="@+id/compose_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
 No newline at end of file