Initial commit
							
								
								
									
										1
									
								
								app/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| /build | ||||
							
								
								
									
										67
									
								
								app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,67 @@ | ||||
| plugins { | ||||
|     id 'com.android.application' | ||||
|     id 'org.jetbrains.kotlin.android' | ||||
| } | ||||
|  | ||||
| android { | ||||
|     compileSdk 32 | ||||
|  | ||||
|     defaultConfig { | ||||
|         applicationId "ru.myitschool.lab23" | ||||
|         minSdk 26 | ||||
|         targetSdk 32 | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|  | ||||
|         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
|     } | ||||
|  | ||||
|     buildTypes { | ||||
|         release { | ||||
|             minifyEnabled false | ||||
|             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | ||||
|         } | ||||
|     } | ||||
|     compileOptions { | ||||
|         sourceCompatibility JavaVersion.VERSION_11 | ||||
|         targetCompatibility JavaVersion.VERSION_11 | ||||
|     } | ||||
|     testOptions { | ||||
|         animationsDisabled true | ||||
|     } | ||||
|     buildFeatures { | ||||
|         viewBinding true | ||||
|     } | ||||
|     kotlinOptions { | ||||
|         jvmTarget = '11' | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|  | ||||
|     implementation 'androidx.core:core-ktx:1.7.0' | ||||
|  | ||||
|     implementation "androidx.appcompat:appcompat:1.4.1" | ||||
|     implementation "com.google.android.material:material:1.6.0" | ||||
|     implementation "androidx.constraintlayout:constraintlayout:2.1.3" | ||||
|  | ||||
|     implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0' | ||||
|     implementation "androidx.navigation:navigation-fragment-ktx:$jetpack_version" | ||||
|  | ||||
|     implementation "androidx.navigation:navigation-fragment:$jetpack_version" | ||||
|     implementation "androidx.navigation:navigation-ui:$jetpack_version" | ||||
|  | ||||
|     androidTestImplementation "io.github.kakaocup:kakao:$kakao_version" | ||||
|  | ||||
|     implementation 'androidx.test.uiautomator:uiautomator:2.2.0' | ||||
|     testImplementation 'junit:junit:4.13.2' | ||||
|     androidTestImplementation 'androidx.test.ext:junit:1.1.3' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-accessibility:3.5.0-alpha05' | ||||
|  | ||||
|     androidTestImplementation 'androidx.test:runner:1.4.0' | ||||
|     androidTestImplementation 'androidx.test:rules:1.4.0' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-intents:3.4.0' | ||||
|     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' | ||||
|  | ||||
| } | ||||
							
								
								
									
										21
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,21 @@ | ||||
| # Add project specific ProGuard rules here. | ||||
| # You can control the set of applied configuration files using the | ||||
| # proguardFiles setting in build.gradle. | ||||
| # | ||||
| # For more details, see | ||||
| #   http://developer.android.com/guide/developing/tools/proguard.html | ||||
|  | ||||
| # If your project uses WebView with JS, uncomment the following | ||||
| # and specify the fully qualified class name to the JavaScript interface | ||||
| # class: | ||||
| #-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||||
| #   public *; | ||||
| #} | ||||
|  | ||||
| # Uncomment this to preserve the line number information for | ||||
| # debugging stack traces. | ||||
| #-keepattributes SourceFile,LineNumberTable | ||||
|  | ||||
| # If you keep the line number information, uncomment this to | ||||
| # hide the original source file name. | ||||
| #-renamesourcefileattribute SourceFile | ||||
| @@ -0,0 +1,14 @@ | ||||
| package ru.myitschool.lab23 | ||||
|  | ||||
| import androidx.test.ext.junit.runners.AndroidJUnit4 | ||||
| import androidx.test.filters.LargeTest | ||||
| import org.junit.FixMethodOrder | ||||
| import org.junit.runner.RunWith | ||||
| import org.junit.runners.MethodSorters | ||||
|  | ||||
|  | ||||
| @RunWith(AndroidJUnit4::class) | ||||
| @FixMethodOrder(MethodSorters.NAME_ASCENDING) | ||||
| @LargeTest | ||||
| class InstrumentedTestTrickyHexahedron { | ||||
| } | ||||
							
								
								
									
										43
									
								
								app/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,43 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="ru.myitschool.lab23"> | ||||
|  | ||||
|     <uses-feature | ||||
|         android:name="android.hardware.camera" | ||||
|         android:required="true" /> | ||||
|     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | ||||
|  | ||||
|  | ||||
|     <application | ||||
|         android:allowBackup="true" | ||||
|         android:icon="@mipmap/ic_launcher" | ||||
|         android:label="@string/app_name" | ||||
|         android:requestLegacyExternalStorage="true" | ||||
|         android:roundIcon="@mipmap/ic_launcher_round" | ||||
|         android:supportsRtl="true" | ||||
|         android:theme="@style/Theme.Lab23"> | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:exported="true" | ||||
|             android:theme="@style/Theme.Lab23.NoActionBar"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN" /> | ||||
|  | ||||
|                 <category android:name="android.intent.category.LAUNCHER" /> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|  | ||||
|         <provider | ||||
|             android:name="androidx.core.content.FileProvider" | ||||
|             android:authorities="${applicationId}.provider" | ||||
|             android:exported="false" | ||||
|             android:grantUriPermissions="true"> | ||||
|  | ||||
|             <meta-data | ||||
|                 android:name="android.support.FILE_PROVIDER_PATHS" | ||||
|                 android:resource="@xml/file_paths" /> | ||||
|  | ||||
|         </provider> | ||||
|     </application> | ||||
|  | ||||
| </manifest> | ||||
							
								
								
									
										171
									
								
								app/src/main/java/ru/myitschool/lab23/MainActivity.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,171 @@ | ||||
| package ru.myitschool.lab23; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.content.Intent; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.os.Environment; | ||||
| import android.provider.MediaStore; | ||||
| import android.widget.Button; | ||||
|  | ||||
| import androidx.activity.ComponentActivity; | ||||
| import androidx.activity.result.ActivityResultLauncher; | ||||
| import androidx.activity.result.contract.ActivityResultContracts; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.core.content.FileProvider; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.nio.file.NotDirectoryException; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| import java.util.Locale; | ||||
|  | ||||
| public class MainActivity extends AppCompatActivity { | ||||
|  | ||||
|     private final long mTimeLimitSec = 60; | ||||
|     private final long mFileSizeLimitBytes = 1920 * 1080 * 10L; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_main); | ||||
|  | ||||
|         ActivityResultLauncher<Intent> photoResultLauncher = registerForActivityResult( | ||||
|                 new ActivityResultContracts.StartActivityForResult(), | ||||
|                 result -> { | ||||
|                     if (result.getResultCode() == Activity.RESULT_OK) { | ||||
|                         Intent data = result.getData(); | ||||
|                         setImage(data); | ||||
|                     } else if (result.getResultCode() == Activity.RESULT_CANCELED) { | ||||
|                         // TODO handle cancelled status | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|         ((Button) findViewById(R.id.capture_video)).setOnClickListener(v -> | ||||
|                 SystemCameraCall.callSystemCameraPhoto(this, | ||||
|                         Directories.PICTURE, | ||||
|                         "", | ||||
|                         getPackageName(), | ||||
|                         mTimeLimitSec, | ||||
|                         mFileSizeLimitBytes, | ||||
|                         photoCallback, | ||||
|                         photoResultLauncher | ||||
|                 ) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     private final SystemCameraCall.CallbackVideo photoCallback = new SystemCameraCall.CallbackVideo() { | ||||
|         private File mTempFile; | ||||
|  | ||||
|         @Override | ||||
|         public File getCurrentFile() { | ||||
|             return mTempFile; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void setCurrentFile(File tempFile) { | ||||
|             mTempFile = tempFile; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void noCameraHandler() { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void noCameraPermission() { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void noStoragePermission() { | ||||
|  | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     private void setImage(Intent data) { | ||||
|         // TODO set image | ||||
|     } | ||||
| } | ||||
|  | ||||
| enum Directories { | ||||
|     PICTURE, | ||||
|     MOVIE, | ||||
|     OTHER | ||||
| } | ||||
|  | ||||
| class SystemCameraCall { | ||||
|  | ||||
|     public interface CallbackVideo { | ||||
|         // A callback interface for states | ||||
|         File getCurrentFile(); | ||||
|  | ||||
|         void setCurrentFile(File tempFile); | ||||
|  | ||||
|         void noCameraHandler(); | ||||
|  | ||||
|         void noCameraPermission(); | ||||
|  | ||||
|         void noStoragePermission(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param mContext          A Context (Activity) for the current component. | ||||
|      * @param directory         Directory enum | ||||
|      * @param fileName          The filename with prefix | ||||
|      * @param authority         The authority of a FileProvider (applicationId) defined in the manifest | ||||
|      * @param videoTimeLimitSec A limit for video in seconds (not applicable to photos) | ||||
|      * @param sizeBytes         The maximum file size | ||||
|      * @param callback          A callback for photos and videos | ||||
|      * @param launcher          A launcher | ||||
|      */ | ||||
|     public static void callSystemCameraPhoto(@NonNull ComponentActivity mContext, | ||||
|                                              Directories directory, | ||||
|                                              String fileName, | ||||
|                                              String authority, | ||||
|                                              Long videoTimeLimitSec, | ||||
|                                              Long sizeBytes, | ||||
|                                              CallbackVideo callback, | ||||
|                                              @NonNull ActivityResultLauncher<Intent> launcher) { | ||||
|         // TODO check permissions | ||||
|         Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); | ||||
|         /*if (videoTimeLimitSec != null && videoTimeLimitSec > 0) { | ||||
|             pictureIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, videoTimeLimitSec); | ||||
|         }*/ | ||||
|         if (sizeBytes != null && sizeBytes > 0) { | ||||
|             pictureIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, sizeBytes); | ||||
|         } | ||||
|         if (pictureIntent.resolveActivity(mContext.getPackageManager()) != null) { | ||||
|             File photoFile; | ||||
|             try { | ||||
|                 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", | ||||
|                         Locale.getDefault()).format(new Date()); | ||||
|                 String imageFileName = "IMG_" + timeStamp + "_"; | ||||
|                 File storageDir; | ||||
|                 if (directory.equals(Directories.PICTURE)) { | ||||
|                     storageDir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES); | ||||
|                 } else if (directory.equals(Directories.MOVIE)) { | ||||
|                     storageDir = mContext.getExternalFilesDir(Environment.DIRECTORY_MOVIES); | ||||
|                 } else { | ||||
|                     throw new NotDirectoryException("unsupported directory type"); | ||||
|                 } | ||||
|                 photoFile = File.createTempFile(imageFileName, ".jpg", storageDir); | ||||
|                 String imageFilePath = photoFile.getAbsolutePath(); | ||||
|                 callback.setCurrentFile(photoFile); | ||||
|             } catch (IOException e) { | ||||
|                 callback.noStoragePermission(); | ||||
|                 return; | ||||
|             } | ||||
|             Uri photoUri = FileProvider.getUriForFile(mContext, authority + ".provider", photoFile); | ||||
|             pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); | ||||
|             launcher.launch(pictureIntent); | ||||
|         } else { | ||||
|             if (callback != null) callback.noCameraHandler(); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										30
									
								
								app/src/main/res/drawable-v24/ic_launcher_foreground.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | ||||
| <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"> | ||||
|     <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> | ||||
|         <aapt:attr name="android:fillColor"> | ||||
|             <gradient | ||||
|                 android:endX="85.84757" | ||||
|                 android:endY="92.4963" | ||||
|                 android:startX="42.9492" | ||||
|                 android:startY="49.59793" | ||||
|                 android:type="linear"> | ||||
|                 <item | ||||
|                     android:color="#44000000" | ||||
|                     android:offset="0.0" /> | ||||
|                 <item | ||||
|                     android:color="#00000000" | ||||
|                     android:offset="1.0" /> | ||||
|             </gradient> | ||||
|         </aapt:attr> | ||||
|     </path> | ||||
|     <path | ||||
|         android:fillColor="#FFFFFF" | ||||
|         android:fillType="nonZero" | ||||
|         android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" | ||||
|         android:strokeWidth="1" | ||||
|         android:strokeColor="#00000000" /> | ||||
| </vector> | ||||
							
								
								
									
										170
									
								
								app/src/main/res/drawable/ic_launcher_background.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,170 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:width="108dp" | ||||
|     android:height="108dp" | ||||
|     android:viewportWidth="108" | ||||
|     android:viewportHeight="108"> | ||||
|     <path | ||||
|         android:fillColor="#3DDC84" | ||||
|         android:pathData="M0,0h108v108h-108z" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M9,0L9,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,0L19,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M29,0L29,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M39,0L39,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M49,0L49,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M59,0L59,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M69,0L69,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M79,0L79,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M89,0L89,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M99,0L99,108" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,9L108,9" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,19L108,19" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,29L108,29" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,39L108,39" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,49L108,49" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,59L108,59" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,69L108,69" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,79L108,79" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,89L108,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,99L108,99" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,29L89,29" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,39L89,39" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,49L89,49" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,59L89,59" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,69L89,69" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,79L89,79" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M29,19L29,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M39,19L39,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M49,19L49,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M59,19L59,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M69,19L69,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M79,19L79,89" | ||||
|         android:strokeWidth="0.8" | ||||
|         android:strokeColor="#33FFFFFF" /> | ||||
| </vector> | ||||
							
								
								
									
										15
									
								
								app/src/main/res/layout/activity_main.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | ||||
| <?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" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     tools:context=".MainActivity"> | ||||
|  | ||||
|  | ||||
|     <include | ||||
|         android:id="@+id/container" | ||||
|         layout="@layout/content_main" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" /> | ||||
|  | ||||
| </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
							
								
								
									
										45
									
								
								app/src/main/res/layout/content_main.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,45 @@ | ||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:padding="24dp" | ||||
|     tools:context=".MainActivity"> | ||||
|  | ||||
|  | ||||
|     <VideoView | ||||
|  | ||||
|         android:id="@+id/video_view" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="320dp" | ||||
|         android:layout_centerInParent="true" | ||||
|  | ||||
|         app:layout_constraintBottom_toBottomOf="parent" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="parent" /> | ||||
|  | ||||
|  | ||||
|     <Button | ||||
|         android:id="@+id/capture_video" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_centerHorizontal="true" | ||||
|         android:text="@string/get_video" | ||||
|         app:layout_constraintBottom_toBottomOf="@id/video_view" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toBottomOf="@id/video_view" /> | ||||
|  | ||||
|  | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										5
									
								
								app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <background android:drawable="@drawable/ic_launcher_background" /> | ||||
|     <foreground android:drawable="@drawable/ic_launcher_foreground" /> | ||||
| </adaptive-icon> | ||||
							
								
								
									
										5
									
								
								app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <background android:drawable="@drawable/ic_launcher_background" /> | ||||
|     <foreground android:drawable="@drawable/ic_launcher_foreground" /> | ||||
| </adaptive-icon> | ||||
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-hdpi/ic_launcher.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-mdpi/ic_launcher.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 982 B | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xhdpi/ic_launcher.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 7.6 KiB | 
							
								
								
									
										10
									
								
								app/src/main/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <color name="purple_200">#FFBB86FC</color> | ||||
|     <color name="purple_500">#FF6200EE</color> | ||||
|     <color name="purple_700">#FF3700B3</color> | ||||
|     <color name="teal_200">#FF03DAC5</color> | ||||
|     <color name="teal_700">#FF018786</color> | ||||
|     <color name="black">#FF000000</color> | ||||
|     <color name="white">#FFFFFFFF</color> | ||||
| </resources> | ||||
							
								
								
									
										3
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| <resources> | ||||
|     <dimen name="fab_margin">16dp</dimen> | ||||
| </resources> | ||||
							
								
								
									
										4
									
								
								app/src/main/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| <resources> | ||||
|     <string name="app_name">Video capture</string> | ||||
|     <string name="get_video">Capture</string> | ||||
| </resources> | ||||
							
								
								
									
										26
									
								
								app/src/main/res/values/themes.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,26 @@ | ||||
| <resources xmlns:tools="http://schemas.android.com/tools"> | ||||
|     <!-- Base application theme. --> | ||||
|     <style name="Theme.Lab23" parent="Theme.Material3.DayNight"> | ||||
|         <!-- Primary brand color. --> | ||||
|         <item name="colorPrimary">@color/purple_500</item> | ||||
|         <item name="colorPrimaryVariant">@color/purple_700</item> | ||||
|         <item name="colorOnPrimary">@color/white</item> | ||||
|         <!-- Secondary brand color. --> | ||||
|         <item name="colorSecondary">@color/teal_200</item> | ||||
|         <item name="colorSecondaryVariant">@color/teal_700</item> | ||||
|         <item name="colorOnSecondary">@color/black</item> | ||||
|         <!-- Status bar color. --> | ||||
|         <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> | ||||
|         <!-- Customize your theme here. --> | ||||
|     </style> | ||||
|  | ||||
|     <style name="Theme.Lab23.NoActionBar"> | ||||
|         <item name="windowActionBar">false</item> | ||||
|         <item name="windowNoTitle">true</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="Theme.Lab23.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> | ||||
|  | ||||
|     <style name="Theme.Lab23.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> | ||||
|  | ||||
| </resources> | ||||
							
								
								
									
										6
									
								
								app/src/main/res/xml/file_paths.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <paths> | ||||
|     <external-path | ||||
|         name="captured_video" | ||||
|         path="Android/data/ru.myitschool.lab23/files/Movies" /> | ||||
| </paths> | ||||
							
								
								
									
										17
									
								
								app/src/test/java/ru/myitschool/lab23/ExampleUnitTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| package ru.myitschool.lab23; | ||||
|  | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| /** | ||||
|  * Example local unit test, which will execute on the development machine (host). | ||||
|  * | ||||
|  * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||||
|  */ | ||||
| public class ExampleUnitTest { | ||||
|     @Test | ||||
|     public void addition_isCorrect() { | ||||
|         assertEquals(4, 2 + 2); | ||||
|     } | ||||
| } | ||||