sforkowany z mirror/meshtastic-android
				
			wip - view layout kinda works
							rodzic
							
								
									d11cf34b3f
								
							
						
					
					
						commit
						9491a74fc6
					
				|  | @ -73,11 +73,12 @@ protobuf { | |||
| 
 | ||||
| dependencies { | ||||
|     implementation fileTree(dir: 'libs', include: ['*.jar']) | ||||
|     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" | ||||
|     implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" | ||||
|     implementation 'androidx.appcompat:appcompat:1.1.0' | ||||
|     implementation 'androidx.core:core-ktx:1.2.0' | ||||
|     implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | ||||
|     implementation 'com.google.android.material:material:1.0.0' | ||||
|     implementation 'com.google.android.material:material:1.1.0' | ||||
|     implementation 'androidx.viewpager2:viewpager2:1.0.0' | ||||
|     testImplementation 'junit:junit:4.12' | ||||
|     androidTestImplementation 'androidx.test.ext:junit:1.1.1' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| package com.geeksville.mesh | ||||
| 
 | ||||
| // import kotlinx.android.synthetic.main.tabs.* | ||||
| import android.Manifest | ||||
| import android.bluetooth.BluetoothAdapter | ||||
| import android.bluetooth.BluetoothManager | ||||
|  | @ -11,14 +12,18 @@ import android.content.pm.PackageManager | |||
| import android.net.Uri | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.view.Menu | ||||
| import android.view.MenuItem | ||||
| import android.view.MotionEvent | ||||
| import android.view.* | ||||
| import android.widget.FrameLayout | ||||
| import android.widget.Toast | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.compose.Composable | ||||
| import androidx.core.app.ActivityCompat | ||||
| import androidx.core.content.ContextCompat | ||||
| import androidx.fragment.app.Fragment | ||||
| import androidx.ui.core.setContent | ||||
| import androidx.ui.foundation.Text | ||||
| import androidx.viewpager2.adapter.FragmentStateAdapter | ||||
| import androidx.viewpager2.widget.ViewPager2 | ||||
| import com.geeksville.android.Logging | ||||
| import com.geeksville.android.ServiceClient | ||||
| import com.geeksville.mesh.model.MessagesState | ||||
|  | @ -26,18 +31,16 @@ import com.geeksville.mesh.model.NodeDB | |||
| import com.geeksville.mesh.model.TextMessage | ||||
| import com.geeksville.mesh.model.UIState | ||||
| import com.geeksville.mesh.service.* | ||||
| import com.geeksville.mesh.ui.AppStatus | ||||
| import com.geeksville.mesh.ui.MeshApp | ||||
| import com.geeksville.mesh.ui.ScanState | ||||
| import com.geeksville.mesh.ui.Screen | ||||
| import com.geeksville.util.Exceptions | ||||
| import com.geeksville.util.exceptionReporter | ||||
| import com.google.android.gms.auth.api.signin.GoogleSignIn | ||||
| import com.google.android.gms.auth.api.signin.GoogleSignInAccount | ||||
| import com.google.android.gms.tasks.Task | ||||
| import com.google.android.material.tabs.TabLayout | ||||
| import com.google.android.material.tabs.TabLayoutMediator | ||||
| import java.nio.charset.Charset | ||||
| 
 | ||||
| 
 | ||||
| /* | ||||
| UI design | ||||
| 
 | ||||
|  | @ -89,6 +92,42 @@ eventually: | |||
| 
 | ||||
| val utf8 = Charset.forName("UTF-8") | ||||
| 
 | ||||
| fun androidx.fragment.app.Fragment.setComposable( | ||||
|     id: Int, | ||||
|     content: @Composable() () -> Unit | ||||
| ): View? = | ||||
|     context?.let { | ||||
|         FrameLayout(it).apply { | ||||
|             this.id = | ||||
|                 id // Compose requires a unique ID for the containing view to make savedInstanceState work | ||||
| 
 | ||||
|             layoutParams = ViewGroup.LayoutParams( | ||||
|                 ViewGroup.LayoutParams.MATCH_PARENT, | ||||
|                 ViewGroup.LayoutParams.MATCH_PARENT | ||||
|             ) | ||||
|             setContent(content) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| class ComposeFragment(id: Int, private val content: @Composable() () -> Unit) : Fragment(), | ||||
|     Logging { | ||||
|     override fun onCreateView( | ||||
|         inflater: LayoutInflater, container: ViewGroup?, | ||||
|         savedInstanceState: Bundle? | ||||
|     ): View? = | ||||
|         setComposable(id, content) | ||||
| 
 | ||||
|     override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||||
|         super.onViewCreated(view, savedInstanceState) | ||||
|         debug("view w=${view.width}, h=${view.height}") | ||||
|     } | ||||
| 
 | ||||
|     override fun onStart() { | ||||
|         super.onStart() | ||||
|         debug("view w=${view?.width}, h=${view?.height}") | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| class MainActivity : AppCompatActivity(), Logging, | ||||
|     ActivityCompat.OnRequestPermissionsResultCallback { | ||||
|  | @ -105,6 +144,23 @@ class MainActivity : AppCompatActivity(), Logging, | |||
|         bluetoothManager.adapter | ||||
|     } | ||||
| 
 | ||||
|     private val tabsAdapter = object : FragmentStateAdapter(this) { | ||||
| 
 | ||||
|         override fun getItemCount(): Int = 2 | ||||
| 
 | ||||
|         override fun createFragment(position: Int): Fragment { | ||||
|             // Return a NEW fragment instance in createFragment(int) | ||||
|             /* | ||||
|             fragment.arguments = Bundle().apply { | ||||
|                 // Our object is just an integer :-P | ||||
|                 putInt(ARG_OBJECT, position + 1) | ||||
|             } */ | ||||
|             return ComposeFragment(position + 1) { | ||||
|                 Text("Jetpack Compose") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private fun requestPermission() { | ||||
|         debug("Checking permissions") | ||||
| 
 | ||||
|  | @ -139,7 +195,11 @@ class MainActivity : AppCompatActivity(), Logging, | |||
|             } | ||||
| 
 | ||||
|             // Ask for all the missing perms | ||||
|             ActivityCompat.requestPermissions(this, missingPerms.toTypedArray(), DID_REQUEST_PERM) | ||||
|             ActivityCompat.requestPermissions( | ||||
|                 this, | ||||
|                 missingPerms.toTypedArray(), | ||||
|                 DID_REQUEST_PERM | ||||
|             ) | ||||
| 
 | ||||
|             // DID_REQUEST_PERM is an | ||||
|             // app-defined int constant. The callback method gets the | ||||
|  | @ -220,11 +280,20 @@ class MainActivity : AppCompatActivity(), Logging, | |||
|         // Handle any intent | ||||
|         handleIntent(intent) | ||||
| 
 | ||||
|         setContent { | ||||
|         /* setContent { | ||||
|             MeshApp() | ||||
|         } | ||||
|         } */ | ||||
|         setContentView(R.layout.activity_main) | ||||
| 
 | ||||
|         val tab_layout = findViewById<TabLayout>(R.id.tab_layout) | ||||
|         val pager = findViewById<ViewPager2>(R.id.pager) | ||||
|         pager.adapter = tabsAdapter | ||||
|         TabLayoutMediator(tab_layout, pager) { tab, position -> | ||||
|             tab.text = "OBJECT ${(position + 1)}" | ||||
|         }.attach() | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     override fun onNewIntent(intent: Intent) { | ||||
|         super.onNewIntent(intent) | ||||
|         handleIntent(intent) | ||||
|  | @ -384,7 +453,11 @@ class MainActivity : AppCompatActivity(), Logging, | |||
|                 } | ||||
|                 MeshService.ACTION_MESH_CONNECTED -> { | ||||
|                     val connected = | ||||
|                         MeshService.ConnectionState.valueOf(intent.getStringExtra(EXTRA_CONNECTED)!!) | ||||
|                         MeshService.ConnectionState.valueOf( | ||||
|                             intent.getStringExtra( | ||||
|                                 EXTRA_CONNECTED | ||||
|                             )!! | ||||
|                         ) | ||||
|                     onMeshConnectionChanged(connected) | ||||
|                 } | ||||
|                 else -> TODO() | ||||
|  | @ -450,8 +523,10 @@ class MainActivity : AppCompatActivity(), Logging, | |||
|         bindMeshService() | ||||
| 
 | ||||
|         val bonded = RadioInterfaceService.getBondedDeviceAddress(this) != null | ||||
|         /* FIXME - not yet working | ||||
|         if (!bonded) | ||||
|             AppStatus.currentScreen = Screen.settings | ||||
|         */ | ||||
|     } | ||||
| 
 | ||||
|     override fun onCreateOptionsMenu(menu: Menu): Boolean { | ||||
|  |  | |||
|  | @ -0,0 +1,57 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     tools:context=".MainActivity"> | ||||
| 
 | ||||
|     <com.google.android.material.appbar.AppBarLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:theme="@style/AppTheme.AppBarOverlay"> | ||||
| 
 | ||||
|         <TextView | ||||
|             android:id="@+id/title" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:gravity="center" | ||||
|             android:minHeight="?actionBarSize" | ||||
|             android:padding="16dp" | ||||
|             android:text="@string/app_name" | ||||
|             android:textAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" /> | ||||
| 
 | ||||
|         <com.google.android.material.tabs.TabLayout | ||||
|             android:id="@+id/tab_layout" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content"> | ||||
| 
 | ||||
|             <!--             Screen.messages -> MessagesContent() | ||||
|                 Screen.settings -> SettingsContent() | ||||
|                 Screen.users -> UsersContent() | ||||
|                 Screen.channel -> ChannelContent(UIState.getChannel()) | ||||
|                 Screen.map -> MapContent() --> | ||||
| 
 | ||||
|             <com.google.android.material.tabs.TabItem | ||||
|                 android:icon="@drawable/ic_twotone_message_24" | ||||
|                 android:text="Messages" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_width="wrap_content" /> | ||||
| 
 | ||||
|             <com.google.android.material.tabs.TabItem | ||||
|                 android:icon="@drawable/ic_twotone_settings_applications_24" | ||||
|                 android:text="Settings" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_width="wrap_content" /> | ||||
| 
 | ||||
|         </com.google.android.material.tabs.TabLayout> | ||||
| 
 | ||||
|     </com.google.android.material.appbar.AppBarLayout> | ||||
| 
 | ||||
|     <androidx.viewpager2.widget.ViewPager2 | ||||
|         android:id="@+id/pager" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> | ||||
| 
 | ||||
| </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
|  | @ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:id="@+id/constraintLayout" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent"> | ||||
| 
 | ||||
| </FrameLayout> | ||||
		Ładowanie…
	
		Reference in New Issue
	
	 geeksville
						geeksville