From a7aa344d9291e9e03392e17c9ad73223589f75c8 Mon Sep 17 00:00:00 2001 From: Fanhuitong <981964879@qq.com> Date: Tue, 25 Apr 2023 09:42:16 +0800 Subject: [PATCH] =?UTF-8?q?version:1.0.6=20update:=20bugfixes:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=9B=B8=E5=86=8C=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable-xhdpi/icon_play.png | Bin 0 -> 2094 bytes JZVideo/src/main/res/layout/jz_layout_std.xml | 2 +- app/build.gradle | 11 +- app/src/main/AndroidManifest.xml | 31 +- .../activity/main/MainActivity.java | 663 +++++++----------- .../activity/pic/GalleryActivity.java | 85 +++ .../activity/pic/GalleryContact.java | 20 + .../activity/pic/GalleryPresenter.java | 62 ++ .../activity/preview/PreviewActivity.java | 103 +++ .../activity/video/VideoActivity.java | 459 ++++++++++++ .../VideoContact.java} | 8 +- .../VideoPresenter.java} | 12 +- .../uiui/videoplayer/adapter/PicAdapter.java | 104 +++ .../videoplayer/adapter/PreviewAdapter.java | 43 ++ .../videoplayer/base/BGABaseAdapterUtil.java | 88 +++ .../uiui/videoplayer/base/BGAGridDivider.java | 58 ++ .../videoplayer/base/BaseLightActivity.java | 15 +- .../base/GridSpaceItemDecoration.java | 59 ++ .../base/ScaleCircleNavigator.java | 323 +++++++++ .../com/uiui/videoplayer/bean/PhotoInfo.java | 79 +++ .../videoplayer/manager/RemoteManager.java | 5 +- .../network/NetInterfaceManager.java | 120 ++++ .../uiui/videoplayer/network/UrlAddress.java | 5 +- .../videoplayer/network/api/HomePhotoApi.java | 19 + .../uiui/videoplayer/utils/VideoUtils.java | 24 +- app/src/main/res/drawable-hdpi/back.png | Bin 0 -> 1444 bytes app/src/main/res/drawable-hdpi/icon_pic.png | Bin 0 -> 8333 bytes app/src/main/res/drawable-hdpi/icon_video.png | Bin 0 -> 6149 bytes .../main/res/drawable-hdpi/no_video_data.png | Bin 0 -> 8579 bytes app/src/main/res/drawable-hdpi/play.png | Bin 0 -> 2094 bytes .../drawable-v24/ic_launcher_foreground.xml | 30 - .../main/res/layout-land/activity_main.xml | 56 -- .../main/res/layout-land/activity_video.xml | 110 +++ .../main/res/layout-port/activity_main.xml | 56 -- .../main/res/layout-port/activity_video.xml | 110 +++ app/src/main/res/layout/activity_gallery.xml | 60 ++ app/src/main/res/layout/activity_main.xml | 136 ++++ app/src/main/res/layout/activity_preview.xml | 28 + app/src/main/res/layout/item_pic.xml | 34 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 7429 -> 5143 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 7429 -> 5143 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 7429 -> 5143 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7429 -> 5143 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 7429 -> 5143 bytes app/src/main/res/values/colors.xml | 144 +++- app/src/main/res/values/styles.xml | 19 +- 46 files changed, 2573 insertions(+), 608 deletions(-) create mode 100644 JZVideo/src/main/res/drawable-xhdpi/icon_play.png create mode 100644 app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryActivity.java create mode 100644 app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryContact.java create mode 100644 app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryPresenter.java create mode 100644 app/src/main/java/com/uiui/videoplayer/activity/preview/PreviewActivity.java create mode 100644 app/src/main/java/com/uiui/videoplayer/activity/video/VideoActivity.java rename app/src/main/java/com/uiui/videoplayer/activity/{main/MainAContact.java => video/VideoContact.java} (64%) rename app/src/main/java/com/uiui/videoplayer/activity/{main/MainAPresenter.java => video/VideoPresenter.java} (81%) create mode 100644 app/src/main/java/com/uiui/videoplayer/adapter/PicAdapter.java create mode 100644 app/src/main/java/com/uiui/videoplayer/adapter/PreviewAdapter.java create mode 100644 app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java create mode 100644 app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java create mode 100644 app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java create mode 100644 app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java create mode 100644 app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java create mode 100644 app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java create mode 100644 app/src/main/res/drawable-hdpi/back.png create mode 100644 app/src/main/res/drawable-hdpi/icon_pic.png create mode 100644 app/src/main/res/drawable-hdpi/icon_video.png create mode 100644 app/src/main/res/drawable-hdpi/no_video_data.png create mode 100644 app/src/main/res/drawable-hdpi/play.png delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/layout-land/activity_main.xml create mode 100644 app/src/main/res/layout-land/activity_video.xml delete mode 100644 app/src/main/res/layout-port/activity_main.xml create mode 100644 app/src/main/res/layout-port/activity_video.xml create mode 100644 app/src/main/res/layout/activity_gallery.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_preview.xml create mode 100644 app/src/main/res/layout/item_pic.xml diff --git a/JZVideo/src/main/res/drawable-xhdpi/icon_play.png b/JZVideo/src/main/res/drawable-xhdpi/icon_play.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d33c34559cf95da13f34548956e165ddb69a9c GIT binary patch literal 2094 zcmaJ?Yg7|w8V&{Jq9AuRiW&wgK_nr8M2G|-7a~Y7ghT>@8k2#fF`1AI5TMqhfJJT+ zAzl#WRtmUcfl7r^%cYA11X+|tVV9~~iWjhSQ*E(Q?Zk@RAIr{}neTF*=Xu}neV=o_ zzJtL<#t7qQu@d>a{=GK^8PG6O0LMT{aJoor;#fWHVPHAU859=WFU+=047TnRA9cd3&2Rl zR3Mhb_GK&SphUVOQw7FkM)5?MGEtxy*dB}t(ohfqIS30e8u>wmnxdfsZ*(ch+_;Sg zFmE8Rj0*gblz`2_&>sUdM7{(9hD^p0{7GaoVGD-nOCaKXk(ca4@TZW-6yjFQ z+Xq0Rsl-VXE+g!1EM!FmBrvR`;PL6{>9}-19HdId69NMRjT%Iv4}$PfXDDEy#z&!c zUs7OzYLQB+gr$%IV^kC#fKp*9fMoi|5#-8uvI_OvG9d-SYlKQX0q1Kx(h`u({{K+9 z{2f{ibHP9J{hz{WUWO9Hb3rwfsuCfMOL8}cQc~zDPzXaR9t0g+sv<`M!H`-4DKYdI zG6owfRfwT3Tx%6eZMk~mbNMr`6lBR*;Fcl=nyg4#Ox_mBy%j&)5 zikHtNbXhJQNd|9h?0+?SX$x_War(}-$l{&xK?UM=6=Lh}x)oC>lvzzUBb29^oJ-iV zlNar{HwGBb79X#Q&e4VPR*rUt?k&P__U+qtY22;wUHt7jqbG-*G3**g=F(>)Smset~9q+{WIxe zg1+k)zeAB-k7FpU9;bBK|2le!_QTZ|mu$q_3}_;z*07t?`h^!=aaV$! z<&j&fBeZS$DgB4x#p}b;+|HFie3y%6as2?eZR{6zi{MU)=|#)7F%J%|;Ydp9{_M>b zsTY`=Q6$3OjwUL(4KMZAs>~_cm*Q3Y!Vhy2Ofw%)Ri1`|)zy-Q`OuptR6@}+Ls>7; z{?LS=K#9#1_XuwByG&n+~&EcyrRsCHo7;$9-{lv}5hicgl=wVa60Tg(}95SZ+$xL0|MgYn&G(h{ciE^&Ww zXw0Sui0g5h-ZV{LkuxY_znUHLc5I=pxbrh+SKpq);UP@T?Q{LkH|!FcJ$t(L6$P1- zY3*dY`#5Q@l2>P@J=tS!A+O-}|N6}lgIci8cU2v+JVSgiy=pE(eY-T3`%UT5WZqBu zc0r9`gNj$3w6kzs5b;}`Aj!>=|H*^QId=obU}osdG33K=8G7qPViTIx*Pm?h)OJ1n zBZtS>sa&G6fOXyc?58dp_qoB&HL;A_>Qc_i3k9}=MGLwo<|jEHxmdM%_l^8i$_aL{ zyt111u<9!yM^#W;4D6#}8KoaAv?knd_}l-U7tkN?u6M4D01&l%t=Up*SVv}wjCb+D<{R`zu^ zdsm&$bK!+!g}K}EzkXz&pouG+zmqa?+R4tcJyL;ms>@#9${}yXlP*Zrud-p09!?;Kiz?`qh;8&@|BC_#>x$m zF|nl3vc>N-;dDw}?<8}G7whYkrS$3@&v$2=98YTO^!jYULNMeR6^4E9dzY@2hd!rykzdf@&5LWxw92xZihSR!7F}S*Yjd^w&wL% z*k#!*eL{gp9M<$~!51h0f|g~R$9juoWp`xp2~*BC5$)AH+#q+-rg7wIb<-!F`g(nT zcSkC4U#nT;2`c&J67#7|QTm3jSk + android:src="@drawable/icon_play" /> diff --git a/app/build.gradle b/app/build.gradle index 2d488d8..0cafef6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,15 +16,16 @@ android { applicationId "com.uiui.videoplayer" minSdkVersion 24 targetSdkVersion 28 - versionCode 106 - versionName "1.0.5" + versionCode 107 + versionName "1.0.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { // add support lib - abiFilters /*"armeabi",*/ "armeabi-v7a", "arm64-v8a", "x86"/*, "x86_64", "mips", "mips64"*/ + abiFilters /*"armeabi",*/ "armeabi-v7a", "arm64-v8a", "x86" +/*, "x86_64", "mips", "mips64"*/ } lintOptions { @@ -158,6 +159,8 @@ dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' // implementation 'com.github.SheHuan:NiceImageView:1.0.5' - + //指示器 + implementation 'com.github.hackware1993:MagicIndicator:1.7.0' // for androidx + implementation 'com.github.Othershe:CombineBitmap:1.0.5' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 69b8637..e3d6d76 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,21 +12,30 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + - - - - - - - - paths = new ArrayList<>(); - private RecycleGridLayoutManager mManager; - - - @Override - public void initView() { - ButterKnife.bind(this); - mPresenter = new MainAPresenter(this); - mPresenter.setLifecycle(lifecycleSubject); - mPresenter.attachView(this); - - Aria.download(this).register(); - - checkSelfPermission(); - - initActionBar(); - tips = findViewById(R.id.tips); - tv_scan = findViewById(R.id.tv_scan); - refreshLayout = findViewById(R.id.swipeRefreshLayout); - refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - mPresenter.getHomeVideo(); - } - }); - refreshLayout.setRefreshing(true); - recyclerView = findViewById(R.id.recyclerView); - ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); - int orientation = getResources().getConfiguration().orientation; - if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - mManager = new RecycleGridLayoutManager(MainActivity.this, 3); - } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { - mManager = new RecycleGridLayoutManager(MainActivity.this, 2); - } - recyclerView.setLayoutManager(mManager); - recyclerView.setNestedScrollingEnabled(false); - recyclerView.addItemDecoration(new SpacesItemDecoration(getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x), - getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x))); - ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); - adapter = new VideoAdapter(MainActivity.this); - adapter.setOnLongClickListener(new VideoAdapter.onItemLongClickListener() { - @Override - public void onItemLongClick(String path, int position) { - showDialog(path, position); - } - }); - recyclerView.setAdapter(adapter); - } - - @Override - public void initData() { - mPresenter.getHomeVideo(); - } @Override public int getLayoutId() { @@ -128,204 +87,41 @@ public class MainActivity extends BaseLightActivity implements MainAContact.Main } @Override - protected void onResume() { - super.onResume(); + public void initView() { +// getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); +// //注意要清除 FLAG_TRANSLUCENT_STATUS flag +// getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); +// getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark)); + ButterKnife.bind(this); + cl_pic.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, GalleryActivity.class)); + } + }); + vl_video.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, VideoActivity.class)); + } + }); + iv_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); } @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - Configuration config = getResources().getConfiguration(); - if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { - mManager = new RecycleGridLayoutManager(MainActivity.this, 2); - recyclerView.setLayoutManager(mManager); - } - if (config.orientation == Configuration.ORIENTATION_PORTRAIT) { - mManager = new RecycleGridLayoutManager(MainActivity.this, 3); - recyclerView.setLayoutManager(mManager); - } + public void initData() { + } - private void showDialog(String path, int position) { - CustomDialog dialog = new CustomDialog(MainActivity.this); - dialog.setTitle("删除文件") - .setMessage("确定要删除文件 " + VideoUtils.getFileNameWithoutExtension(path) + "吗") - .setPositive("确定") - .setNegtive("取消") - .setOnClickBottomListener(new CustomDialog.OnClickBottomListener() { - @Override - public void onPositiveClick() { - dialog.dismiss(); - File file = new File(path); - if (file.delete()) { - adapter.removeItem(position); - ToastUtil.show("删除成功"); - } else { - ToastUtil.show("删除失败,检查权限是否开启"); - } - } - - @Override - public void onNegtiveClick() { - dialog.dismiss(); - } - }); - dialog.show(); - } - - - private void initActionBar() { - setToolbarCustomTheme(); - //显示返回按钮 - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setHomeButtonEnabled(true); - actionBar.setDisplayHomeAsUpEnabled(true); - SpannableString spannableString = new SpannableString(getString(R.string.app_name)); - ForegroundColorSpan colorSpan = new ForegroundColorSpan(getResources().getColor(R.color.defaultColor)); - spannableString.setSpan(colorSpan, 0, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - actionBar.setTitle(spannableString); - } - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - } - - //自定义颜色返回按钮 - protected void setToolbarCustomTheme() { - Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material); - if (upArrow != null) { - upArrow.setColorFilter(ContextCompat.getColor(this, R.color.defaultColor), PorterDuff.Mode.SRC_ATOP); - if (getSupportActionBar() != null) { - getSupportActionBar().setHomeAsUpIndicator(upArrow); - } - } - } - - public void traverseFolder(String path) { - int fileNum = 0, folderNum = 0; - File file = new File(path); - if (file.exists()) { - LinkedList list = new LinkedList(); - File[] files = file.listFiles(); - for (File file2 : files) { - if (file2.isDirectory()) { - Log.e("traverseFolder1", "文件夹:" + file2.getAbsolutePath()); - list.add(file2); - folderNum++; - } else { - Log.e("traverseFolder1", "文件:" + file2.getAbsolutePath()); - fileNum++; - } - } - File temp_file; - while (!list.isEmpty()) { - temp_file = list.removeFirst(); - files = temp_file.listFiles(); - for (File file2 : files) { - if (file2.isDirectory()) { - Log.e("traverseFolder2", "文件夹:" + file2.getAbsolutePath()); - list.add(file2); - folderNum++; - } else { - Log.e("traverseFolder2", "文件:" + file2.getAbsolutePath()); - fileNum++; - } - } - } - } else { - Log.e("traverseFolder1", "文件不存在!"); - } - Log.e("traverseFolder1", "文件夹共有:" + folderNum + ",文件共有:" + fileNum); - } - - - public class ScanTask extends AsyncTask> { - - @Override - protected List doInBackground(Void... voids) { - long s1 = System.currentTimeMillis(); - paths.clear(); - List fileList = new ArrayList<>(); - String rootPath = Environment.getExternalStorageDirectory().getPath() + File.separator; - File file = new File(rootPath); - if (file.exists()) { - LinkedList list = new LinkedList(); - File[] files = file.listFiles(); - if (files == null) return null; - for (File file2 : files) { - publishProgress(file2.getAbsolutePath()); - if (file2.isDirectory()) { - list.add(file2); - } else { - if (VideoUtils.isVideoFormat(file2.getAbsolutePath())) { - fileList.add(file2.getAbsolutePath()); - } - } - } - File temp_file; - while (!list.isEmpty()) { - temp_file = list.removeFirst(); - files = temp_file.listFiles(); - if (files == null) { - continue; - } - for (File file2 : files) { - publishProgress(file2.getAbsolutePath()); - if (file2.isDirectory()) { - list.add(file2); - } else { - if (VideoUtils.isVideoFormat(file2.getAbsolutePath())) { - fileList.add(file2.getAbsolutePath()); - } - } - } - } - } else { - Log.e("traverseFolder1", "文件不存在!"); - } - Log.e("ScanTask", "doInBackground: " + "Scan time = " + (System.currentTimeMillis() - s1) + "ms"); - return fileList; - } - - @Override - protected void onProgressUpdate(String... values) { - super.onProgressUpdate(values); - paths.add(values[0]); - tv_scan.setVisibility(View.VISIBLE); - tv_scan.setText("正在扫描:" + values[0]); -// adapter.setData(paths); - } - - @Override - protected void onPostExecute(List strings) { - super.onPostExecute(strings); - Log.e("ScanTask", "onPostExecute: " + strings.size()); - if (strings.size() == 0) { - tips.setVisibility(View.VISIBLE); - recyclerView.setVisibility(View.GONE); - } else { - tips.setVisibility(View.GONE); - recyclerView.setVisibility(View.VISIBLE); -// adapter.setData(strings); - } - tv_scan.setVisibility(View.GONE); - refreshLayout.setRefreshing(false); - } - } - - private void checkSelfPermission() { - List mPermissionList = new ArrayList<>(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - for (String s : permissions) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { - mPermissionList.add(s); - } else { -// mPresenter.getHomeVideo(); - } - } - if (mPermissionList.size() > 0) {//有权限没有通过,需要申请 - ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION_CODE); - } - } + @Override + protected void onResume() { + super.onResume(); + checkSelfPermission(); } @Override @@ -333,7 +129,8 @@ public class MainActivity extends BaseLightActivity implements MainAContact.Main super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.getHomeVideo(); + Log.e("TAG", "onRequestPermissionsResult: "); + getThumbnail(); } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) { if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { ToastUtil.show("需要存储空间权限才能正常使用软件"); @@ -345,151 +142,187 @@ public class MainActivity extends BaseLightActivity implements MainAContact.Main intent.setData(Uri.parse("package:" + this.getPackageName())); startActivity(intent); } - refreshLayout.setRefreshing(false); + } } } - private MenuItem refresh, single_loop, loop; - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main, menu); - refresh = menu.findItem(R.id.refresh); - single_loop = menu.findItem(R.id.single_loop); - loop = menu.findItem(R.id.loop); - updateMenuIcon(); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - //返回按钮点击事件 - switch (item.getItemId()) { - case R.id.setting: - - break; - case android.R.id.home: - if (System.currentTimeMillis() - mPreClickTime > 1000) { - ToastUtil.show("再按一次,退出"); - mPreClickTime = System.currentTimeMillis(); + private void checkSelfPermission() { + List mPermissionList = new ArrayList<>(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + for (String s : permissions) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + mPermissionList.add(s); } else { - finish(); + Log.e("TAG", "checkSelfPermission: "); +// mPresenter.getHomeVideo(); + getThumbnail(); } - break; - case R.id.refresh: - refreshLayout.setRefreshing(true); - mPresenter.getHomeVideo(); - break; - case R.id.single_loop: - if (null != single_loop) { - int singleLoop = (int) SPUtils.get(MainActivity.this, "single_loop", 0); - if (singleLoop == 0) { - SPUtils.put(MainActivity.this, "single_loop", 1); - SPUtils.put(MainActivity.this, "loop", 0); - single_loop.setIcon(R.drawable.menu_selected); - } else { - SPUtils.put(MainActivity.this, "single_loop", 0); - single_loop.setIcon(R.drawable.menu_transparent); - } - } - break; - case R.id.loop: - if (null != loop) { - int singleLoop = (int) SPUtils.get(MainActivity.this, "loop", 0); - if (singleLoop == 0) { - SPUtils.put(MainActivity.this, "single_loop", 0); - SPUtils.put(MainActivity.this, "loop", 1); - loop.setIcon(R.drawable.menu_selected); - } else { - SPUtils.put(MainActivity.this, "loop", 0); - loop.setIcon(R.drawable.menu_transparent); - } - } - break; - default: - break; - } - updateMenuIcon(); - return super.onOptionsItemSelected(item); - } - - private long mPreClickTime; - - private void updateMenuIcon() { - if (null != refresh) { - - } - if (null != single_loop) { - int singleLoop = (int) SPUtils.get(MainActivity.this, "single_loop", 0); - if (singleLoop == 0) { - single_loop.setIcon(R.drawable.menu_transparent); - } else { - single_loop.setIcon(R.drawable.menu_selected); } - } - if (null != loop) { - int singleLoop = (int) SPUtils.get(MainActivity.this, "loop", 0); - if (singleLoop == 0) { - loop.setIcon(R.drawable.menu_transparent); - } else { - loop.setIcon(R.drawable.menu_selected); + if (mPermissionList.size() > 0) {//有权限没有通过,需要申请 + ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION_CODE); } } } - @Override - public void setHomeVideo(ArrayList video) { - if (video == null || video.size() == 0) { - tips.setVisibility(View.VISIBLE); - recyclerView.setVisibility(View.GONE); + private void getThumbnail() { + long s1 = System.currentTimeMillis(); + List picFileList = new ArrayList<>(); + List videoFileList = new ArrayList<>(); + String rootPath = JGYUtils.getInstance().getDownLoadPath() + File.separator; + File file = new File(rootPath); + if (file.exists()) { + LinkedList list = new LinkedList(); + File[] files = file.listFiles(); + if (files == null) { + return; + } + for (File file2 : files) { + if (file2.isDirectory()) { + list.add(file2); + } else { + if (VideoUtils.isPicFormat(file2.getAbsolutePath())) { + picFileList.add(file2.getAbsolutePath()); + } else if (VideoUtils.isVideoFormat(file2.getAbsolutePath())) { + videoFileList.add(file2.getAbsolutePath()); + } + } + } + File temp_file; + while (!list.isEmpty()) { + temp_file = list.removeFirst(); + files = temp_file.listFiles(); + if (files == null) { + continue; + } + for (File file2 : files) { + if (file2.isDirectory()) { + list.add(file2); + } else { + if (VideoUtils.isPicFormat(file2.getAbsolutePath())) { + picFileList.add(file2.getAbsolutePath()); + } else if (VideoUtils.isVideoFormat(file2.getAbsolutePath())) { + videoFileList.add(file2.getAbsolutePath()); + } + } + } + } } else { - tips.setVisibility(View.GONE); - recyclerView.setVisibility(View.VISIBLE); - adapter.setData(video); + Log.e("traverseFolder1", "文件不存在!"); } - tv_scan.setVisibility(View.GONE); - refreshLayout.setRefreshing(false); - } + Log.e("ScanTask", "doInBackground: " + "Scan time = " + (System.currentTimeMillis() - s1) + "ms"); + Log.e("getThumbnail", "picFileList: " + picFileList); + Log.e("getThumbnail", "videoFileList: " + videoFileList); + Log.e("getThumbnail", "picFileList size = " + picFileList.size()); + Log.e("getThumbnail", "videoFileList size = " + videoFileList.size()); + if (picFileList.size() == 0) { + nv_pic.setImageDrawable(getDrawable(R.drawable.icon_pic)); + } else { + nv_pic.setImageDrawable(path2Drawable(picFileList.get(0))); + } + if (videoFileList.size() == 0) { + nv_video.setImageDrawable(getDrawable(R.drawable.icon_video)); + } else { + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever(); + mmr.setDataSource(videoFileList.get(0)); + Bitmap bitmap = mmr.getFrameAtTime();//获得视频第一帧的Bitmap对象. + mmr.release(); + emitter.onNext(bitmap); + } + }).subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("VideoResult", "onSubscribe: "); + } - @Override - public void getHomeVideoFinish() { - refreshLayout.setRefreshing(false); + @Override + public void onNext(Bitmap result) { + Log.e("VideoResult", "onNext: " + result); + nv_video.setImageBitmap(result); +// Glide.with(nv_video).load(result).error(R.drawable.icon_video).into(nv_video); + } + + @Override + public void onError(Throwable e) { + Log.e("VideoResult", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("VideoResult", "onComplete: "); + } + }); + } + Log.e("getThumbnail", "videoFileList size = " + videoFileList.size()); +// CombineBitmap.init(this) +// .setLayoutManager(new DingLayoutManager()) // 必选, 设置图片的组合形式,支持WechatLayoutManager、DingLayoutManager +// .setSize(100) // 必选,组合后Bitmap的尺寸,单位dp +// .setGap(1) // 单个图片之间的距离,单位dp,默认0dp +//// .setGapColor() // 单个图片间距的颜色,默认白色 +//// .setPlaceholder() // 单个图片加载失败的默认显示图片 +// .setUrls(picFileList.toArray(new String[picFileList.size()])) // 要加载的图片url数组 +// .setBitmaps() // 要加载的图片bitmap数组 +// .setResourceIds() // 要加载的图片资源id数组 +// .setImageView(nv_pic) // 直接设置要显示图片的ImageView +// // 设置“子图片”的点击事件,需使用setImageView(),index和图片资源数组的索引对应 +//// .setOnSubItemClickListener(new OnSubItemClickListener() { +//// @Override +//// public void onSubItemClick(int index) { +//// +//// } +//// }) +//// // 加载进度的回调函数,如果不使用setImageView()方法,可在onComplete()完成最终图片的显示 +//// .setProgressListener(new ProgressListener() { +//// @Override +//// public void onStart() { +//// +//// } +//// +//// @Override +//// public void onComplete(Bitmap bitmap) { +//// +//// } +//// }) +// .build(); + +// CombineBitmap.init(this) +// .setLayoutManager(new DingLayoutManager()) // 必选, 设置图片的组合形式,支持WechatLayoutManager、DingLayoutManager +// .setSize(100) // 必选,组合后Bitmap的尺寸,单位dp +// .setGap(1) // 单个图片之间的距离,单位dp,默认0dp +//// .setGapColor() // 单个图片间距的颜色,默认白色 +//// .setPlaceholder() // 单个图片加载失败的默认显示图片 +// .setUrls(videoFileList.toArray(new String[videoFileList.size()])) // 要加载的图片url数组 +// .setBitmaps() // 要加载的图片bitmap数组 +// .setResourceIds() // 要加载的图片资源id数组 +// .setImageView(nv_video) // 直接设置要显示图片的ImageView +// .build(); } - //在这里处理任务执行中的状态,如进度进度条的刷新 - @Download.onTaskRunning - void running(DownloadTask task) { - Log.e("aria running", "正在下载:" + task.getState() + "-" + task.getPercent() + "--" + task.getExtendField()); + /** + * 将本地图片转换为 Drawable + * + * @param file 文件路径 + * @return + */ + public Drawable path2Drawable(String file) { + if (file == null || file.isEmpty()) { + return null; + } + Drawable drawable = null; try { - String jsonString = task.getExtendField(); - JsonObject jsonObject = GsonUtils.getJsonObject(jsonString); - } catch (Exception e) { - Log.e("running", "running: " + e.getMessage()); + FileInputStream fis = new FileInputStream(file); + Bitmap bitmap = BitmapFactory.decodeStream(fis); + drawable = new BitmapDrawable(getResources(), bitmap); + } catch (FileNotFoundException e) { + e.printStackTrace(); } - } - @Download.onTaskComplete - void taskComplete(DownloadTask task) { - //在这里处理任务完成的状态 - Log.e("taskComplete", task.getExtendField()); -// Aria.download(this).load(task.getDownloadEntity().getId()).cancel(); - mPresenter.getHomeVideo(); - } - - @Download.onTaskFail - void taskFail(DownloadTask task, Exception e) { - Aria.download(this).resumeAllTask(); - final String filepath = task.getFilePath(); - final String packageName = task.getExtendField(); - try { - Aria.download(this).load(task.getDownloadEntity().getId()).cancel(true); - Log.e(TAG, "taskFail: " + "Exception: " + e.getLocalizedMessage()); - } catch (Exception ex) { - - } - Log.e(TAG, "taskFail: " + packageName + "filepath: " + filepath); - mPresenter.getHomeVideo(); + return drawable; } } diff --git a/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryActivity.java b/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryActivity.java new file mode 100644 index 0000000..9968ca1 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryActivity.java @@ -0,0 +1,85 @@ +package com.uiui.videoplayer.activity.pic; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; + +import com.uiui.videoplayer.R; +import com.uiui.videoplayer.adapter.PicAdapter; +import com.uiui.videoplayer.base.BGAGridDivider; +import com.uiui.videoplayer.base.BaseLightActivity; +import com.uiui.videoplayer.base.GridSpaceItemDecoration; +import com.uiui.videoplayer.bean.PhotoInfo; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class GalleryActivity extends BaseLightActivity implements GalleryContact.GalleryView { + + @BindView(R.id.swipeRefreshLayout) + SwipeRefreshLayout swipeRefreshLayout; + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + @BindView(R.id.iv_back) + ImageView iv_back; + + private GalleryPresenter mPresenter; + private PicAdapter mPicAdapter; + private static final int SPAN_COUNT = 3; + + @Override + public int getLayoutId() { + return R.layout.activity_gallery; + } + + @Override + public void initView() { + ButterKnife.bind(this); + mPresenter = new GalleryPresenter(this); + mPresenter.setLifecycle(lifecycleSubject); + mPresenter.attachView(this); + + GridLayoutManager layoutManager = new GridLayoutManager(this, SPAN_COUNT, LinearLayoutManager.VERTICAL, false); + mPicAdapter = new PicAdapter(layoutManager); + recyclerView.setLayoutManager(layoutManager); + recyclerView.addItemDecoration(BGAGridDivider.newInstanceWithSpaceRes(R.dimen.dp_2)); + recyclerView.setAdapter(mPicAdapter); + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + swipeRefreshLayout.setRefreshing(true); + mPresenter.getHomePhoto(); + } + }); + iv_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + mPresenter.getHomePhoto(); + } + + @Override + public void setHomePhoto(ArrayList photoInfos) { + mPicAdapter.setPhotoInfos(photoInfos); + } + + @Override + public void getHomePhotoFinish() { + swipeRefreshLayout.setRefreshing(false); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryContact.java b/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryContact.java new file mode 100644 index 0000000..40f6b83 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryContact.java @@ -0,0 +1,20 @@ +package com.uiui.videoplayer.activity.pic; + +import com.uiui.videoplayer.base.BasePresenter; +import com.uiui.videoplayer.base.BaseView; +import com.uiui.videoplayer.bean.PhotoInfo; + +import java.util.ArrayList; +import java.util.List; + +public class GalleryContact { + interface Presenter extends BasePresenter { + /*获取视频*/ + void getHomePhoto(); + } + + public interface GalleryView extends BaseView { + void setHomePhoto(ArrayList photoInfos); + void getHomePhotoFinish(); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryPresenter.java b/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryPresenter.java new file mode 100644 index 0000000..12a4418 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/activity/pic/GalleryPresenter.java @@ -0,0 +1,62 @@ +package com.uiui.videoplayer.activity.pic; + +import android.content.Context; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiui.videoplayer.bean.BaseResponse; +import com.uiui.videoplayer.bean.PhotoInfo; +import com.uiui.videoplayer.network.NetInterfaceManager; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +public class GalleryPresenter implements GalleryContact.Presenter { + + private GalleryContact.GalleryView mView; + private Context mContext; + + public GalleryPresenter(Context context) { + this.mContext = context; + } + + private BehaviorSubject lifecycle; + + public void setLifecycle(BehaviorSubject lifecycle) { + this.lifecycle = lifecycle; + } + + public BehaviorSubject getLifecycle() { + return lifecycle; + } + + @Override + public void attachView(GalleryContact.GalleryView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + @Override + public void getHomePhoto() { + NetInterfaceManager.getInstance().getHomePhoto(true, getLifecycle(), new NetInterfaceManager.onPhotoCallback() { + @Override + public void setPhotoList(ArrayList photoList) { + mView.setHomePhoto(photoList); + } + + @Override + public void onComplete() { + mView.getHomePhotoFinish(); + } + }); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/activity/preview/PreviewActivity.java b/app/src/main/java/com/uiui/videoplayer/activity/preview/PreviewActivity.java new file mode 100644 index 0000000..8c1df4c --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/activity/preview/PreviewActivity.java @@ -0,0 +1,103 @@ +package com.uiui.videoplayer.activity.preview; + +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.widget.ImageView; + +import androidx.viewpager.widget.ViewPager; + +import com.bumptech.glide.Glide; +import com.uiui.videoplayer.R; +import com.uiui.videoplayer.adapter.PreviewAdapter; +import com.uiui.videoplayer.base.BaseLightActivity; +import com.uiui.videoplayer.base.ScaleCircleNavigator; +import com.uiui.videoplayer.bean.PhotoInfo; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; + +import net.lucode.hackware.magicindicator.MagicIndicator; +import net.lucode.hackware.magicindicator.ViewPagerHelper; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class PreviewActivity extends BaseLightActivity { + + @BindView(R.id.viewPager) + ViewPager viewPager; + @BindView(R.id.magicIndicator) + MagicIndicator mMagicIndicator; + + private PreviewAdapter mPreviewAdapter; + private ScaleCircleNavigator scaleCircleNavigator; + private ArrayList mPhotoInfos; + + @Override + public int getLayoutId() { + return R.layout.activity_preview; + } + + @Override + public void initView() { + UltimateBarX.statusBar(this) + .transparent() + .fitWindow(false) + .light(true) + .apply(); + UltimateBarX.navigationBar(this) + .transparent() + .light(true) + .apply(); + + ButterKnife.bind(this); + mPreviewAdapter = new PreviewAdapter(); + viewPager.setAdapter(mPreviewAdapter); + scaleCircleNavigator = new ScaleCircleNavigator(this); + } + + @Override + public void initData() { + Intent intent = getIntent(); + Bundle bundle = intent.getExtras(); + if (bundle == null) { + finish(); + return; + } + ArrayList photoInfos = bundle.getParcelableArrayList("mPhotoInfos"); + if (photoInfos == null) { + finish(); + return; + } + int position = bundle.getInt("position"); + setImageViews(photoInfos); + viewPager.setCurrentItem(position); + + } + + private void setImageViews(List photoInfos) { + mMagicIndicator.setNavigator(scaleCircleNavigator); + scaleCircleNavigator.setCircleCount(photoInfos.size()); + scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY); + scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY); + scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() { + @Override + public void onClick(int index) { + + } + }); + ViewPagerHelper.bind(mMagicIndicator, viewPager); + List imageViews = new ArrayList<>(); + for (PhotoInfo photoInfo : photoInfos) { + ImageView image = new ImageView(this); + image.setAdjustViewBounds(true); + image.setScaleType(ImageView.ScaleType.FIT_CENTER); + Glide.with(this).load(photoInfo.getFile()).into(image); + imageViews.add(image); + } + mPreviewAdapter.setImageViews(imageViews); + mPreviewAdapter.notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/activity/video/VideoActivity.java b/app/src/main/java/com/uiui/videoplayer/activity/video/VideoActivity.java new file mode 100644 index 0000000..d859549 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/activity/video/VideoActivity.java @@ -0,0 +1,459 @@ +package com.uiui.videoplayer.activity.video; + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Environment; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.arialyy.annotations.Download; +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.task.DownloadTask; +import com.google.gson.JsonObject; +import com.uiui.videoplayer.R; +import com.uiui.videoplayer.adapter.VideoAdapter; +import com.uiui.videoplayer.base.BaseLightActivity; +import com.uiui.videoplayer.base.CustomDialog; +import com.uiui.videoplayer.base.RecycleGridLayoutManager; +import com.uiui.videoplayer.base.SpacesItemDecoration; +import com.uiui.videoplayer.bean.LocalVideoInfo; +import com.uiui.videoplayer.gson.GsonUtils; +import com.uiui.videoplayer.utils.SPUtils; +import com.uiui.videoplayer.utils.ToastUtil; +import com.uiui.videoplayer.utils.VideoUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class VideoActivity extends BaseLightActivity implements VideoContact.VideoView { + + private static final String TAG = VideoActivity.class.getSimpleName(); + + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + @BindView(R.id.cl_nodata) + ConstraintLayout cl_nodata; + @BindView(R.id.tv_scan) + TextView tv_scan; + @BindView(R.id.swipeRefreshLayout) + SwipeRefreshLayout refreshLayout; + @BindView(R.id.iv_back) + ImageView iv_back; + + private VideoPresenter mPresenter; + private List paths = new ArrayList<>(); + private RecycleGridLayoutManager mManager; + private VideoAdapter adapter; + + @Override + public void initView() { + ButterKnife.bind(this); + mPresenter = new VideoPresenter(this); + mPresenter.setLifecycle(lifecycleSubject); + mPresenter.attachView(this); + + Aria.download(this).register(); + +// initActionBar(); + refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + mPresenter.getHomeVideo(); + } + }); + refreshLayout.setRefreshing(true); + ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); + int orientation = getResources().getConfiguration().orientation; + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + mManager = new RecycleGridLayoutManager(VideoActivity.this, 3); + } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { + mManager = new RecycleGridLayoutManager(VideoActivity.this, 2); + } + recyclerView.setLayoutManager(mManager); + recyclerView.setNestedScrollingEnabled(false); + recyclerView.addItemDecoration(new SpacesItemDecoration(getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x), + getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x))); + ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); + adapter = new VideoAdapter(VideoActivity.this); + adapter.setOnLongClickListener(new VideoAdapter.onItemLongClickListener() { + @Override + public void onItemLongClick(String path, int position) { + showDialog(path, position); + } + }); + recyclerView.setAdapter(adapter); + iv_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void initData() { + mPresenter.getHomeVideo(); + } + + @Override + public int getLayoutId() { + return R.layout.activity_video; + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + Configuration config = getResources().getConfiguration(); + if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { + mManager = new RecycleGridLayoutManager(VideoActivity.this, 2); + recyclerView.setLayoutManager(mManager); + } + if (config.orientation == Configuration.ORIENTATION_PORTRAIT) { + mManager = new RecycleGridLayoutManager(VideoActivity.this, 3); + recyclerView.setLayoutManager(mManager); + } + } + + private void showDialog(String path, int position) { + CustomDialog dialog = new CustomDialog(VideoActivity.this); + dialog.setTitle("删除文件") + .setMessage("确定要删除文件 " + VideoUtils.getFileNameWithoutExtension(path) + "吗") + .setPositive("确定") + .setNegtive("取消") + .setOnClickBottomListener(new CustomDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + dialog.dismiss(); + File file = new File(path); + if (file.delete()) { + adapter.removeItem(position); + ToastUtil.show("删除成功"); + } else { + ToastUtil.show("删除失败,检查权限是否开启"); + } + } + + @Override + public void onNegtiveClick() { + dialog.dismiss(); + } + }); + dialog.show(); + } + + + private void initActionBar() { + setToolbarCustomTheme(); + //显示返回按钮 + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + SpannableString spannableString = new SpannableString(getString(R.string.app_name)); + ForegroundColorSpan colorSpan = new ForegroundColorSpan(getResources().getColor(R.color.defaultColor)); + spannableString.setSpan(colorSpan, 0, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + actionBar.setTitle(spannableString); + } + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + + //自定义颜色返回按钮 + protected void setToolbarCustomTheme() { + Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material); + if (upArrow != null) { + upArrow.setColorFilter(ContextCompat.getColor(this, R.color.defaultColor), PorterDuff.Mode.SRC_ATOP); + if (getSupportActionBar() != null) { + getSupportActionBar().setHomeAsUpIndicator(upArrow); + } + } + } + + public void traverseFolder(String path) { + int fileNum = 0, folderNum = 0; + File file = new File(path); + if (file.exists()) { + LinkedList list = new LinkedList(); + File[] files = file.listFiles(); + for (File file2 : files) { + if (file2.isDirectory()) { + Log.e("traverseFolder1", "文件夹:" + file2.getAbsolutePath()); + list.add(file2); + folderNum++; + } else { + Log.e("traverseFolder1", "文件:" + file2.getAbsolutePath()); + fileNum++; + } + } + File temp_file; + while (!list.isEmpty()) { + temp_file = list.removeFirst(); + files = temp_file.listFiles(); + for (File file2 : files) { + if (file2.isDirectory()) { + Log.e("traverseFolder2", "文件夹:" + file2.getAbsolutePath()); + list.add(file2); + folderNum++; + } else { + Log.e("traverseFolder2", "文件:" + file2.getAbsolutePath()); + fileNum++; + } + } + } + } else { + Log.e("traverseFolder1", "文件不存在!"); + } + Log.e("traverseFolder1", "文件夹共有:" + folderNum + ",文件共有:" + fileNum); + } + + + public class ScanTask extends AsyncTask> { + + @Override + protected List doInBackground(Void... voids) { + long s1 = System.currentTimeMillis(); + paths.clear(); + List fileList = new ArrayList<>(); + String rootPath = Environment.getExternalStorageDirectory().getPath() + File.separator; + File file = new File(rootPath); + if (file.exists()) { + LinkedList list = new LinkedList(); + File[] files = file.listFiles(); + if (files == null) return null; + for (File file2 : files) { + publishProgress(file2.getAbsolutePath()); + if (file2.isDirectory()) { + list.add(file2); + } else { + if (VideoUtils.isVideoFormat(file2.getAbsolutePath())) { + fileList.add(file2.getAbsolutePath()); + } + } + } + File temp_file; + while (!list.isEmpty()) { + temp_file = list.removeFirst(); + files = temp_file.listFiles(); + if (files == null) { + continue; + } + for (File file2 : files) { + publishProgress(file2.getAbsolutePath()); + if (file2.isDirectory()) { + list.add(file2); + } else { + if (VideoUtils.isVideoFormat(file2.getAbsolutePath())) { + fileList.add(file2.getAbsolutePath()); + } + } + } + } + } else { + Log.e("traverseFolder1", "文件不存在!"); + } + Log.e("ScanTask", "doInBackground: " + "Scan time = " + (System.currentTimeMillis() - s1) + "ms"); + return fileList; + } + + @Override + protected void onProgressUpdate(String... values) { + super.onProgressUpdate(values); + paths.add(values[0]); + tv_scan.setVisibility(View.VISIBLE); + tv_scan.setText("正在扫描:" + values[0]); +// adapter.setData(paths); + } + + @Override + protected void onPostExecute(List strings) { + super.onPostExecute(strings); + Log.e("ScanTask", "onPostExecute: " + strings.size()); + if (strings.size() == 0) { + cl_nodata.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + } else { + cl_nodata.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); +// adapter.setData(strings); + } + tv_scan.setVisibility(View.GONE); + refreshLayout.setRefreshing(false); + } + } + + private MenuItem refresh, single_loop, loop; + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + refresh = menu.findItem(R.id.refresh); + single_loop = menu.findItem(R.id.single_loop); + loop = menu.findItem(R.id.loop); + updateMenuIcon(); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + //返回按钮点击事件 + switch (item.getItemId()) { + case R.id.setting: + + break; + case android.R.id.home: + if (System.currentTimeMillis() - mPreClickTime > 1000) { + ToastUtil.show("再按一次,退出"); + mPreClickTime = System.currentTimeMillis(); + } else { + finish(); + } + break; + case R.id.refresh: + refreshLayout.setRefreshing(true); + mPresenter.getHomeVideo(); + break; + case R.id.single_loop: + if (null != single_loop) { + int singleLoop = (int) SPUtils.get(VideoActivity.this, "single_loop", 0); + if (singleLoop == 0) { + SPUtils.put(VideoActivity.this, "single_loop", 1); + SPUtils.put(VideoActivity.this, "loop", 0); + single_loop.setIcon(R.drawable.menu_selected); + } else { + SPUtils.put(VideoActivity.this, "single_loop", 0); + single_loop.setIcon(R.drawable.menu_transparent); + } + } + break; + case R.id.loop: + if (null != loop) { + int singleLoop = (int) SPUtils.get(VideoActivity.this, "loop", 0); + if (singleLoop == 0) { + SPUtils.put(VideoActivity.this, "single_loop", 0); + SPUtils.put(VideoActivity.this, "loop", 1); + loop.setIcon(R.drawable.menu_selected); + } else { + SPUtils.put(VideoActivity.this, "loop", 0); + loop.setIcon(R.drawable.menu_transparent); + } + } + break; + default: + break; + } + updateMenuIcon(); + return super.onOptionsItemSelected(item); + } + + private long mPreClickTime; + + private void updateMenuIcon() { + if (null != refresh) { + + } + if (null != single_loop) { + int singleLoop = (int) SPUtils.get(VideoActivity.this, "single_loop", 0); + if (singleLoop == 0) { + single_loop.setIcon(R.drawable.menu_transparent); + } else { + single_loop.setIcon(R.drawable.menu_selected); + } + } + if (null != loop) { + int singleLoop = (int) SPUtils.get(VideoActivity.this, "loop", 0); + if (singleLoop == 0) { + loop.setIcon(R.drawable.menu_transparent); + } else { + loop.setIcon(R.drawable.menu_selected); + } + } + } + + @Override + public void setHomeVideo(ArrayList video) { + if (video == null || video.size() == 0) { + cl_nodata.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + } else { + cl_nodata.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + adapter.setData(video); + } + tv_scan.setVisibility(View.GONE); + refreshLayout.setRefreshing(false); + } + + @Override + public void getHomeVideoFinish() { + refreshLayout.setRefreshing(false); + } + + + //在这里处理任务执行中的状态,如进度进度条的刷新 + @Download.onTaskRunning + void running(DownloadTask task) { + Log.e("aria running", "正在下载:" + task.getState() + "-" + task.getPercent() + "--" + task.getExtendField()); + try { + String jsonString = task.getExtendField(); + JsonObject jsonObject = GsonUtils.getJsonObject(jsonString); + } catch (Exception e) { + Log.e("running", "running: " + e.getMessage()); + } + } + + @Download.onTaskComplete + void taskComplete(DownloadTask task) { + //在这里处理任务完成的状态 + Log.e("taskComplete", task.getExtendField()); +// Aria.download(this).load(task.getDownloadEntity().getId()).cancel(); + mPresenter.getHomeVideo(); + } + + @Download.onTaskFail + void taskFail(DownloadTask task, Exception e) { + Aria.download(this).resumeAllTask(); + final String filepath = task.getFilePath(); + final String packageName = task.getExtendField(); + try { + Aria.download(this).load(task.getDownloadEntity().getId()).cancel(true); + Log.e(TAG, "taskFail: " + "Exception: " + e.getLocalizedMessage()); + } catch (Exception ex) { + + } + Log.e(TAG, "taskFail: " + packageName + "filepath: " + filepath); + mPresenter.getHomeVideo(); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/activity/main/MainAContact.java b/app/src/main/java/com/uiui/videoplayer/activity/video/VideoContact.java similarity index 64% rename from app/src/main/java/com/uiui/videoplayer/activity/main/MainAContact.java rename to app/src/main/java/com/uiui/videoplayer/activity/video/VideoContact.java index d750c73..4c90ec2 100644 --- a/app/src/main/java/com/uiui/videoplayer/activity/main/MainAContact.java +++ b/app/src/main/java/com/uiui/videoplayer/activity/video/VideoContact.java @@ -1,4 +1,4 @@ -package com.uiui.videoplayer.activity.main; +package com.uiui.videoplayer.activity.video; import com.uiui.videoplayer.base.BasePresenter; import com.uiui.videoplayer.base.BaseView; @@ -6,13 +6,13 @@ import com.uiui.videoplayer.bean.LocalVideoInfo; import java.util.ArrayList; -public class MainAContact { - interface Presenter extends BasePresenter { +public class VideoContact { + interface Presenter extends BasePresenter { /*获取视频*/ void getHomeVideo(); } - public interface MainView extends BaseView { + public interface VideoView extends BaseView { void setHomeVideo(ArrayList video); void getHomeVideoFinish(); } diff --git a/app/src/main/java/com/uiui/videoplayer/activity/main/MainAPresenter.java b/app/src/main/java/com/uiui/videoplayer/activity/video/VideoPresenter.java similarity index 81% rename from app/src/main/java/com/uiui/videoplayer/activity/main/MainAPresenter.java rename to app/src/main/java/com/uiui/videoplayer/activity/video/VideoPresenter.java index 4509559..765af2b 100644 --- a/app/src/main/java/com/uiui/videoplayer/activity/main/MainAPresenter.java +++ b/app/src/main/java/com/uiui/videoplayer/activity/video/VideoPresenter.java @@ -1,4 +1,4 @@ -package com.uiui.videoplayer.activity.main; +package com.uiui.videoplayer.activity.video; import android.content.Context; @@ -14,14 +14,14 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject; /** * @author jgy02 */ -public class MainAPresenter implements MainAContact.Presenter { - private static final String TAG = MainAPresenter.class.getSimpleName(); +public class VideoPresenter implements VideoContact.Presenter { + private static final String TAG = VideoPresenter.class.getSimpleName(); - private MainAContact.MainView mView; + private VideoContact.VideoView mView; private Context mContext; private CacheHelper mCacheHelper; - public MainAPresenter(Context context) { + public VideoPresenter(Context context) { this.mContext = context; this.mCacheHelper = new CacheHelper(context); } @@ -37,7 +37,7 @@ public class MainAPresenter implements MainAContact.Presenter { } @Override - public void attachView(MainAContact.MainView view) { + public void attachView(VideoContact.VideoView view) { this.mView = view; } diff --git a/app/src/main/java/com/uiui/videoplayer/adapter/PicAdapter.java b/app/src/main/java/com/uiui/videoplayer/adapter/PicAdapter.java new file mode 100644 index 0000000..95eb7c2 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/adapter/PicAdapter.java @@ -0,0 +1,104 @@ +package com.uiui.videoplayer.adapter; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.uiui.videoplayer.R; +import com.uiui.videoplayer.activity.preview.PreviewActivity; +import com.uiui.videoplayer.bean.PhotoInfo; +import com.uiui.videoplayer.gson.GsonUtils; +import com.uiui.videoplayer.utils.JGYUtils; +import com.uiui.videoplayer.utils.VideoUtils; + +import java.util.ArrayList; +import java.util.List; + +public class PicAdapter extends RecyclerView.Adapter { + + private Context mContext; + private GridLayoutManager mGridLayoutManager; + private ArrayList mPhotoInfos; + + public PicAdapter(GridLayoutManager gridLayoutManager) { + this.mGridLayoutManager = gridLayoutManager; + } + + @NonNull + @Override + public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + Holder holder = new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_pic, parent, false)); + ViewGroup.LayoutParams params = holder.itemView.getLayoutParams(); + ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) holder.iv_pic.getLayoutParams(); + //动态计算,设置item的宽高一致,总宽度-左右margin-左右padding /总列数-item左右margin-item左右padding + params.height = + (mGridLayoutManager.getWidth() - layoutParams.leftMargin + - layoutParams.rightMargin - holder.iv_pic.getPaddingStart() - holder.iv_pic.getPaddingEnd()) / mGridLayoutManager.getSpanCount() + - 2 * holder.itemView.getPaddingLeft() - 2 * ((ViewGroup.MarginLayoutParams) params).leftMargin; + return holder; + } + + @Override + public void onBindViewHolder(@NonNull Holder holder, int position) { + PhotoInfo photoInfo = mPhotoInfos.get(position); + String fileName = photoInfo.getFile_name(); + String fileUrl = photoInfo.getFile(); + if (TextUtils.isEmpty(fileName)) { + holder.tv_name.setText(VideoUtils.getFileNameWithoutExtension(fileUrl)); + } else { + holder.tv_name.setText(fileName); + } + if (!JGYUtils.getInstance().fileExists(photoInfo.getFile())) { + Glide.with(mContext).load(fileUrl).into(holder.iv_pic); + } else { + Glide.with(mContext).load(JGYUtils.getInstance().getUrlLocalPath(photoInfo.getFile())).into(holder.iv_pic); + } + holder.root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mContext, PreviewActivity.class); + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList("mPhotoInfos", mPhotoInfos); + bundle.putInt("position", position); + intent.putExtras(bundle); + mContext.startActivity(intent); + } + }); + } + + @Override + public int getItemCount() { + return mPhotoInfos == null ? 0 : mPhotoInfos.size(); + } + + public void setPhotoInfos(ArrayList photoInfos) { + this.mPhotoInfos = photoInfos; + notifyDataSetChanged(); + } + + class Holder extends RecyclerView.ViewHolder { + ConstraintLayout root; + ImageView iv_pic; + TextView tv_name; + + public Holder(@NonNull View itemView) { + super(itemView); + root = itemView.findViewById(R.id.root); + iv_pic = itemView.findViewById(R.id.iv_pic); + tv_name = itemView.findViewById(R.id.tv_name); + } + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/adapter/PreviewAdapter.java b/app/src/main/java/com/uiui/videoplayer/adapter/PreviewAdapter.java new file mode 100644 index 0000000..56ecc73 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/adapter/PreviewAdapter.java @@ -0,0 +1,43 @@ +package com.uiui.videoplayer.adapter; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; + +import java.util.List; + +public class PreviewAdapter extends PagerAdapter { + private List mImageViews; + + public void setImageViews(List imageViews) { + this.mImageViews = imageViews; + } + + @Override + public int getCount() { + return mImageViews == null ? 0 : mImageViews.size(); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == object; + + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + // 给 container 添加一个view + container.addView(mImageViews.get(position)); + // 返回一个和该view相对的object + return mImageViews.get(position); + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + container.removeView(mImageViews.get(position)); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java b/app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java new file mode 100644 index 0000000..813d984 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java @@ -0,0 +1,88 @@ +package com.uiui.videoplayer.base; + +import android.app.Application; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import androidx.annotation.ColorRes; +import androidx.annotation.DimenRes; +import android.util.Log; +import android.util.TypedValue; + +import java.util.List; + +/** + * 作者:王浩 邮件:bingoogolapple@gmail.com + * 创建时间:17/1/6 上午4:04 + * 描述: + */ +public class BGABaseAdapterUtil { + private static final Application sApp; + + static { + Application app = null; + try { + app = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null); + if (app == null) + throw new IllegalStateException("Static initialization of Applications must be on main thread."); + } catch (final Exception e) { + Log.e(BGABaseAdapterUtil.class.getSimpleName(), "Failed to get current application from AppGlobals." + e.getMessage()); + try { + app = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null); + } catch (final Exception ex) { + Log.e(BGABaseAdapterUtil.class.getSimpleName(), "Failed to get current application from ActivityThread." + e.getMessage()); + } + } finally { + sApp = app; + } + } + + private BGABaseAdapterUtil() { + } + + public static Application getApp() { + return sApp; + } + + public static int dp2px(float dpValue) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, getApp().getResources().getDisplayMetrics()); + } + + public static int sp2px(float dpValue) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, dpValue, getApp().getResources().getDisplayMetrics()); + } + + public static int getDimensionPixelOffset(@DimenRes int resId) { + return getApp().getResources().getDimensionPixelOffset(resId); + } + + public static int getColor(@ColorRes int resId) { + return getApp().getResources().getColor(resId); + } + + public static Drawable rotateBitmap(Bitmap inputBitmap) { + Matrix matrix = new Matrix(); + matrix.setRotate(90, (float) inputBitmap.getWidth() / 2, (float) inputBitmap.getHeight() / 2); + + float outputX = inputBitmap.getHeight(); + float outputY = 0; + + final float[] values = new float[9]; + matrix.getValues(values); + float x1 = values[Matrix.MTRANS_X]; + float y1 = values[Matrix.MTRANS_Y]; + matrix.postTranslate(outputX - x1, outputY - y1); + Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap.getHeight(), inputBitmap.getWidth(), Bitmap.Config.ARGB_8888); + Paint paint = new Paint(); + Canvas canvas = new Canvas(outputBitmap); + canvas.drawBitmap(inputBitmap, matrix, paint); + return new BitmapDrawable(null, outputBitmap); + } + + public static boolean isListNotEmpty(List list) { + return list != null && !list.isEmpty(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java b/app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java new file mode 100644 index 0000000..8a95748 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java @@ -0,0 +1,58 @@ +package com.uiui.videoplayer.base; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.DimenRes; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 作者:王浩 邮件:bingoogolapple@gmail.com + * 创建时间:17/1/9 下午11:12 + * 描述: + */ +public class BGAGridDivider extends RecyclerView.ItemDecoration { + private int mSpace; + + private BGAGridDivider(int space) { + mSpace = space; + } + + /** + * 设置间距资源 id + * + * @param resId + * @return + */ + public static BGAGridDivider newInstanceWithSpaceRes(@DimenRes int resId) { + return new BGAGridDivider(BGABaseAdapterUtil.getDimensionPixelOffset(resId)); + } + + /** + * 设置间距 + * + * @param spaceDp 单位为 dp + * @return + */ + public static BGAGridDivider newInstanceWithSpaceDp(int spaceDp) { + return new BGAGridDivider(BGABaseAdapterUtil.dp2px(spaceDp)); + } + + /** + * 设置间距 + * + * @param spacePx 单位为 px + * @return + */ + public static BGAGridDivider newInstanceWithSpacePx(int spacePx) { + return new BGAGridDivider(spacePx); + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + outRect.left = mSpace; + outRect.right = mSpace; + outRect.top = mSpace; + outRect.bottom = mSpace; + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java b/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java index bc13a53..26758b2 100644 --- a/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java +++ b/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java @@ -1,5 +1,6 @@ package com.uiui.videoplayer.base; +import android.graphics.Color; import android.os.Bundle; import androidx.annotation.CallSuper; @@ -61,17 +62,19 @@ public abstract class BaseLightActivity extends AppCompatActivity implements Lif super.onCreate(savedInstanceState); lifecycleSubject.onNext(ActivityEvent.CREATE); // StatusBarUtil.init(this); + setContentView(this.getLayoutId()); UltimateBarX.statusBar(this) - .transparent() - .colorRes(R.color.colorPrimaryDark) - .light(true) +// .transparent() + .colorRes(R.color.colorAccent) + .fitWindow(true) + .light(false) .apply(); UltimateBarX.navigationBar(this) .transparent() - .colorRes(R.color.colorPrimaryDark) - .light(true) +// .color(Color.TRANSPARENT) + .fitWindow(false) + .light(false) .apply(); - setContentView(this.getLayoutId()); initView(); initData(); } diff --git a/app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java b/app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java new file mode 100644 index 0000000..57a7aea --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java @@ -0,0 +1,59 @@ +package com.uiui.videoplayer.base; + +import android.graphics.Rect; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 描述 : RecyclerView GridLayoutManager 等间距。 + *

+ * 等间距需满足两个条件: + * 1.各个模块的大小相等,即 各列的left+right 值相等; + * 2.各列的间距相等,即 前列的right + 后列的left = 列间距; + *

+ * 在{@link #getItemOffsets(Rect, View, RecyclerView, RecyclerView.State)} 中针对 outRect 的left 和right 满足这两个条件即可 + *

+ * 作者 : shiguotao + * 版本 : V1 + * 创建时间 : 2020/3/19 4:54 PM + */ +public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration { + + private final String TAG = "GridSpaceItemDecoration"; + + private int mSpanCount;//横条目数量 + private int mRowSpacing;//行间距 + private int mColumnSpacing;// 列间距 + + /** + * @param spanCount 列数 + * @param rowSpacing 行间距 + * @param columnSpacing 列间距 + */ + public GridSpaceItemDecoration(int spanCount, int rowSpacing, int columnSpacing) { + this.mSpanCount = spanCount; + this.mRowSpacing = rowSpacing; + this.mColumnSpacing = columnSpacing; + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); // 获取view 在adapter中的位置。 + int column = position % mSpanCount; // view 所在的列 + + outRect.left = column * mColumnSpacing / mSpanCount; // column * (列间距 * (1f / 列数)) + outRect.right = mColumnSpacing - (column + 1) * mColumnSpacing / mSpanCount; // 列间距 - (column + 1) * (列间距 * (1f /列数)) + + Log.e(TAG, "position:" + position + + " columnIndex: " + column + + " left,right ->" + outRect.left + "," + outRect.right); + + // 如果position > 行数,说明不是在第一行,则不指定行高,其他行的上间距为 top=mRowSpacing + if (position >= mSpanCount) { + outRect.top = mRowSpacing; // item top + } + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java b/app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java new file mode 100644 index 0000000..53ef03b --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java @@ -0,0 +1,323 @@ +package com.uiui.videoplayer.base; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PointF; +import android.util.SparseArray; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; + +import net.lucode.hackware.magicindicator.NavigatorHelper; +import net.lucode.hackware.magicindicator.abs.IPagerNavigator; +import net.lucode.hackware.magicindicator.buildins.ArgbEvaluatorHolder; +import net.lucode.hackware.magicindicator.buildins.UIUtil; + +import java.util.ArrayList; +import java.util.List; + +// _oo0oo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// 0\ = /0 +// ___/`---'\___ +// .' \\| |// '. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' |_/ | +// \ .-\__ '-' ___/-. / +// ___'. .' /--.--\ `. .'___ +// ."" '< `.___\_<|>_/___.' >' "". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `_. \_ __\ /__ _/ .-` / / +// =====`-.____`.___ \_____/___.-`___.-'===== +// `=---=' +// +// +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// 佛祖保佑 永无BUG + +/** + * 类似CircleIndicator的效果 + * Created by hackware on 2016/9/3. + */ + +public class ScaleCircleNavigator extends View implements IPagerNavigator, NavigatorHelper.OnNavigatorScrollListener { + private int mMinRadius; + private int mMaxRadius; + private int mNormalCircleColor = Color.LTGRAY; + private int mSelectedCircleColor = Color.GRAY; + private int mCircleSpacing; + private int mCircleCount; + + private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private List mCirclePoints = new ArrayList(); + private SparseArray mCircleRadiusArray = new SparseArray(); + + // 事件回调 + private boolean mTouchable; + private ScaleCircleNavigator.OnCircleClickListener mCircleClickListener; + private float mDownX; + private float mDownY; + private int mTouchSlop; + + private boolean mFollowTouch = true; // 是否跟随手指滑动 + private NavigatorHelper mNavigatorHelper = new NavigatorHelper(); + private Interpolator mStartInterpolator = new LinearInterpolator(); + + public ScaleCircleNavigator(Context context) { + super(context); + init(context); + } + + private void init(Context context) { + mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + mMinRadius = UIUtil.dip2px(context, 3); + mMaxRadius = UIUtil.dip2px(context, 4); + mCircleSpacing = UIUtil.dip2px(context, 8); + mNavigatorHelper.setNavigatorScrollListener(this); + mNavigatorHelper.setSkimOver(true); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); + } + + private int measureWidth(int widthMeasureSpec) { + int mode = MeasureSpec.getMode(widthMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int result = 0; + switch (mode) { + case MeasureSpec.EXACTLY: + result = width; + break; + case MeasureSpec.AT_MOST: + case MeasureSpec.UNSPECIFIED: + if (mCircleCount <= 0) { + result = getPaddingLeft() + getPaddingRight(); + } else { + result = (mCircleCount - 1) * mMinRadius * 2 + mMaxRadius * 2 + (mCircleCount - 1) * mCircleSpacing + getPaddingLeft() + getPaddingRight(); + } + break; + default: + break; + } + return result; + } + + private int measureHeight(int heightMeasureSpec) { + int mode = MeasureSpec.getMode(heightMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + int result = 0; + switch (mode) { + case MeasureSpec.EXACTLY: + result = height; + break; + case MeasureSpec.AT_MOST: + case MeasureSpec.UNSPECIFIED: + result = mMaxRadius * 2 + getPaddingTop() + getPaddingBottom(); + break; + default: + break; + } + return result; + } + + @Override + protected void onDraw(Canvas canvas) { + for (int i = 0, j = mCirclePoints.size(); i < j; i++) { + PointF point = mCirclePoints.get(i); + float radius = mCircleRadiusArray.get(i, (float) mMinRadius); + mPaint.setColor(ArgbEvaluatorHolder.eval((radius - mMinRadius) / (mMaxRadius - mMinRadius), mNormalCircleColor, mSelectedCircleColor)); + canvas.drawCircle(point.x, getHeight() / 2.0f, radius, mPaint); + } + } + + private void prepareCirclePoints() { + mCirclePoints.clear(); + if (mCircleCount > 0) { + int y = Math.round(getHeight() / 2.0f); + int centerSpacing = mMinRadius * 2 + mCircleSpacing; + int startX = mMaxRadius + getPaddingLeft(); + for (int i = 0; i < mCircleCount; i++) { + PointF pointF = new PointF(startX, y); + mCirclePoints.add(pointF); + startX += centerSpacing; + } + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX(); + float y = event.getY(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + if (mTouchable) { + mDownX = x; + mDownY = y; + return true; + } + break; + case MotionEvent.ACTION_UP: + if (mCircleClickListener != null) { + if (Math.abs(x - mDownX) <= mTouchSlop && Math.abs(y - mDownY) <= mTouchSlop) { + float max = Float.MAX_VALUE; + int index = 0; + for (int i = 0; i < mCirclePoints.size(); i++) { + PointF pointF = mCirclePoints.get(i); + float offset = Math.abs(pointF.x - x); + if (offset < max) { + max = offset; + index = i; + } + } + mCircleClickListener.onClick(index); + } + } + break; + default: + break; + } + return super.onTouchEvent(event); + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + mNavigatorHelper.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + mNavigatorHelper.onPageSelected(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + mNavigatorHelper.onPageScrollStateChanged(state); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + prepareCirclePoints(); + } + + @Override + public void notifyDataSetChanged() { + prepareCirclePoints(); + requestLayout(); + } + + @Override + public void onAttachToMagicIndicator() { + } + + @Override + public void onDetachFromMagicIndicator() { + } + + public void setMinRadius(int minRadius) { + mMinRadius = minRadius; + prepareCirclePoints(); + invalidate(); + } + + public void setMaxRadius(int maxRadius) { + mMaxRadius = maxRadius; + prepareCirclePoints(); + invalidate(); + } + + public void setNormalCircleColor(int normalCircleColor) { + mNormalCircleColor = normalCircleColor; + invalidate(); + } + + public void setSelectedCircleColor(int selectedCircleColor) { + mSelectedCircleColor = selectedCircleColor; + invalidate(); + } + + public void setCircleSpacing(int circleSpacing) { + mCircleSpacing = circleSpacing; + prepareCirclePoints(); + invalidate(); + } + + public void setStartInterpolator(Interpolator startInterpolator) { + mStartInterpolator = startInterpolator; + if (mStartInterpolator == null) { + mStartInterpolator = new LinearInterpolator(); + } + } + + public void setCircleCount(int count) { + mCircleCount = count; // 此处不调用invalidate,让外部调用notifyDataSetChanged + mNavigatorHelper.setTotalCount(mCircleCount); + } + + public void setTouchable(boolean touchable) { + mTouchable = touchable; + } + + public void setFollowTouch(boolean followTouch) { + mFollowTouch = followTouch; + } + + public void setSkimOver(boolean skimOver) { + mNavigatorHelper.setSkimOver(skimOver); + } + + public void setCircleClickListener(OnCircleClickListener circleClickListener) { + if (!mTouchable) { + mTouchable = true; + } + mCircleClickListener = circleClickListener; + } + + @Override + public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) { + if (mFollowTouch) { + float radius = mMinRadius + (mMaxRadius - mMinRadius) * mStartInterpolator.getInterpolation(enterPercent); + mCircleRadiusArray.put(index, radius); + invalidate(); + } + } + + @Override + public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) { + if (mFollowTouch) { + float radius = mMaxRadius + (mMinRadius - mMaxRadius) * mStartInterpolator.getInterpolation(leavePercent); + mCircleRadiusArray.put(index, radius); + invalidate(); + } + } + + @Override + public void onSelected(int index, int totalCount) { + if (!mFollowTouch) { + mCircleRadiusArray.put(index, (float) mMaxRadius); + invalidate(); + } + } + + @Override + public void onDeselected(int index, int totalCount) { + if (!mFollowTouch) { + mCircleRadiusArray.put(index, (float) mMinRadius); + invalidate(); + } + } + + public interface OnCircleClickListener { + void onClick(int index); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java b/app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java new file mode 100644 index 0000000..77bc914 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java @@ -0,0 +1,79 @@ +package com.uiui.videoplayer.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonParser; + +import java.io.Serializable; + +public class PhotoInfo implements Serializable, Parcelable { + private static final long serialVersionUID = 4205742067664126524L; + + String file_name; + String file; + long file_size; + + protected PhotoInfo(Parcel in) { + file_name = in.readString(); + file = in.readString(); + file_size = in.readLong(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public PhotoInfo createFromParcel(Parcel in) { + return new PhotoInfo(in); + } + + @Override + public PhotoInfo[] newArray(int size) { + return new PhotoInfo[size]; + } + }; + + public String getFile_name() { + return file_name; + } + + public void setFile_name(String file_name) { + this.file_name = file_name; + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + public long getFile_size() { + return file_size; + } + + public void setFile_size(long file_size) { + this.file_size = file_size; + } + + @NonNull + @Override + public String toString() { + return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(file_name); + dest.writeString(file); + dest.writeLong(file_size); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java b/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java index 8ed474e..bd907d6 100644 --- a/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java +++ b/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java @@ -13,6 +13,7 @@ import android.util.Log; import com.tencent.mmkv.MMKV; import com.uiui.sn.IGetInfoInterface; import com.uiui.videoplayer.BuildConfig; +import com.uiui.videoplayer.config.CommonConfig; import java.util.HashSet; import java.util.Set; @@ -27,7 +28,7 @@ public class RemoteManager { @SuppressLint("StaticFieldLeak") private static RemoteManager sInstance; private Context mContext; - private MMKV mMMKV = MMKV.defaultMMKV(); + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); private IGetInfoInterface mIGetInfoInterface; private ServiceConnection mServiceConnection; @@ -117,7 +118,7 @@ public class RemoteManager { public String getSerial() { if (BuildConfig.DEBUG) { - return "T1030B128GB22435020359"; +// return "T1030B128GB22435020359"; } String sn = mMMKV.decodeString(serialKey, ""); Log.e(TAG, "sn: " + sn); diff --git a/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java index e23bbad..8061cb6 100644 --- a/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java @@ -13,6 +13,7 @@ import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiui.videoplayer.bean.BaseResponse; +import com.uiui.videoplayer.bean.PhotoInfo; import com.uiui.videoplayer.bean.VideoInfo; import com.uiui.videoplayer.bean.LocalVideoInfo; import com.uiui.videoplayer.config.CommonConfig; @@ -21,6 +22,7 @@ import com.uiui.videoplayer.gson.GsonUtils; import com.uiui.videoplayer.manager.ConnectManager; import com.uiui.videoplayer.manager.ConnectMode; import com.uiui.videoplayer.manager.RemoteManager; +import com.uiui.videoplayer.network.api.HomePhotoApi; import com.uiui.videoplayer.network.api.HomeVideoApi; import com.uiui.videoplayer.network.interceptor.RepeatRequestInterceptor; import com.uiui.videoplayer.utils.JGYUtils; @@ -156,6 +158,13 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable>> getHomePhotoControl() { + return mRetrofit.create(HomePhotoApi.class) + .getHomePhoto(RemoteManager.getInstance().getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public interface onVideoPathCallback { void setVideoList(ArrayList videoList); @@ -385,4 +394,115 @@ public class NetInterfaceManager { } }); } + + public interface onPhotoCallback { + void setPhotoList(ArrayList photoList); + + void onComplete(); + } + + public void getHomePhoto(boolean refresh, BehaviorSubject lifecycle, onPhotoCallback callback) { + ConnectMode connectMode = ConnectMode.ONE_MINUTE; + if (refresh) { + connectMode = ConnectMode.DEFAULT; + } + if (ConnectManager.getInstance().isNeedConnect(UrlAddress.HOME_PHOTO, connectMode)) { + getHomePhoto(lifecycle, callback); + } else { + String jsonString = mCacheHelper.getAsString(UrlAddress.HOME_PHOTO); + //为 "" 是已经请求成功的 + if (jsonString == null) { + getHomePhoto(lifecycle, callback); + } else { + getHomePhotoCache(jsonString, callback); + } + } + } + + + public void getHomePhotoCache(String jsonString, onPhotoCallback callback) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + try { + ArrayList photoInfoList = gson.fromJson(jsonString, type); + if (callback != null) { + callback.setPhotoList(photoInfoList); + } + } catch (Exception e) { + Log.e(TAG, "getHomePhotoCache: " + e.getMessage()); + if (callback != null) { + callback.setPhotoList(null); + } + } + if (callback != null) { + callback.onComplete(); + } + } + + public void getHomePhoto(BehaviorSubject lifecycle, onPhotoCallback callback) { + getHomePhotoControl() + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(getHomePhotoObserver(callback)); + } + + public void getHomePhoto(onPhotoCallback callback) { + getHomePhotoControl() + .subscribe(getHomePhotoObserver(callback)); + } + + public void getHomePhoto() { + getHomePhotoControl() + .subscribe(getHomePhotoObserver(null)); + } + + private Observer>> getHomePhotoObserver(onPhotoCallback callback) { + return new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getHomePhotoObserver", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getHomePhotoObserver", "onNext: " + listBaseResponse); + int code = listBaseResponse.code; + if (code == 200) { + ArrayList photoInfoList = listBaseResponse.data; + for (PhotoInfo photoInfo : photoInfoList) { + if (!JGYUtils.getInstance().fileExists(photoInfo.getFile())) { + JGYUtils.getInstance().ariaDownload(photoInfo.getFile(), GsonUtils.getJsonObject(GsonUtils.toJSONString(photoInfo))); + } + } + mCacheHelper.put(UrlAddress.HOME_PHOTO, GsonUtils.toJSONString(photoInfoList)); + if (callback != null) { + callback.setPhotoList(photoInfoList); + } + } else { + mCacheHelper.put(UrlAddress.HOME_PHOTO, ""); + if (callback != null) { + callback.setPhotoList(null); + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getHomePhotoObserver", "onError: " + e.getMessage()); + ToastUtil.show("网络连接失败"); + String jsonString = mCacheHelper.getAsString(UrlAddress.HOME_PHOTO); + getHomePhotoCache(jsonString, callback); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getHomePhotoObserver", "onComplete: "); + if (callback != null) { + callback.onComplete(); + } + } + }; + } + } diff --git a/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java b/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java index b61cc26..90bb098 100644 --- a/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java +++ b/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java @@ -4,7 +4,8 @@ public class UrlAddress { /*主页接口*/ public static final String ROOT_URL = "https://led.zuoyepad.com/android/"; - /*获取视频*/ + /*获取家庭视频*/ public static final String HOME_VIDEO ="File/getHomeVideo"; - + /*获取家庭照片*/ + public static final String HOME_PHOTO ="File/getHomePhoto"; } diff --git a/app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java b/app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java new file mode 100644 index 0000000..30a4497 --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java @@ -0,0 +1,19 @@ +package com.uiui.videoplayer.network.api; + +import com.uiui.videoplayer.bean.BaseResponse; +import com.uiui.videoplayer.bean.PhotoInfo; +import com.uiui.videoplayer.network.UrlAddress; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface HomePhotoApi { + @GET(UrlAddress.HOME_PHOTO) + Observable>> getHomePhoto( + @Query("sn") String sn + ); +} diff --git a/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java b/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java index 7d912c3..32f561c 100644 --- a/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java +++ b/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java @@ -1,14 +1,7 @@ package com.uiui.videoplayer.utils; -import android.content.Context; -import android.os.Environment; import android.util.Log; -import androidx.core.content.ContextCompat; - -import com.arialyy.aria.core.Aria; -import com.google.gson.JsonObject; - import java.io.File; import java.io.FileInputStream; import java.math.BigInteger; @@ -36,12 +29,25 @@ public class VideoUtils { return matches; } - private static final String[] extension = new String[]{ + private static final String[] video_extension = new String[]{ ".3gp", ".avi", ".flv", ".mkv", ".mov", ".mp4", ".webm" }; + private static final String[] picture_extension = new String[]{ + ".jgp", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".jpe" + }; + public static boolean isVideoFormat(String filePath) { - for (String s : extension) { + for (String s : video_extension) { + if (filePath.endsWith(s)) { + return true; + } + } + return false; + } + + public static boolean isPicFormat(String filePath) { + for (String s : picture_extension) { if (filePath.endsWith(s)) { return true; } diff --git a/app/src/main/res/drawable-hdpi/back.png b/app/src/main/res/drawable-hdpi/back.png new file mode 100644 index 0000000000000000000000000000000000000000..519aedb6a5ff4ed78d0442319a813453ac6c51fb GIT binary patch literal 1444 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 Tw&Ps_%z$*X3~yK6vXA;NJhnBE literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_video.png b/app/src/main/res/drawable-hdpi/icon_video.png new file mode 100644 index 0000000000000000000000000000000000000000..1da2e486231880fe50c91046c1efd91571d86792 GIT binary patch literal 6149 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/play.png b/app/src/main/res/drawable-hdpi/play.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d33c34559cf95da13f34548956e165ddb69a9c GIT binary patch literal 2094 zcmaJ?Yg7|w8V&{Jq9AuRiW&wgK_nr8M2G|-7a~Y7ghT>@8k2#fF`1AI5TMqhfJJT+ zAzl#WRtmUcfl7r^%cYA11X+|tVV9~~iWjhSQ*E(Q?Zk@RAIr{}neTF*=Xu}neV=o_ zzJtL<#t7qQu@d>a{=GK^8PG6O0LMT{aJoor;#fWHVPHAU859=WFU+=047TnRA9cd3&2Rl zR3Mhb_GK&SphUVOQw7FkM)5?MGEtxy*dB}t(ohfqIS30e8u>wmnxdfsZ*(ch+_;Sg zFmE8Rj0*gblz`2_&>sUdM7{(9hD^p0{7GaoVGD-nOCaKXk(ca4@TZW-6yjFQ z+Xq0Rsl-VXE+g!1EM!FmBrvR`;PL6{>9}-19HdId69NMRjT%Iv4}$PfXDDEy#z&!c zUs7OzYLQB+gr$%IV^kC#fKp*9fMoi|5#-8uvI_OvG9d-SYlKQX0q1Kx(h`u({{K+9 z{2f{ibHP9J{hz{WUWO9Hb3rwfsuCfMOL8}cQc~zDPzXaR9t0g+sv<`M!H`-4DKYdI zG6owfRfwT3Tx%6eZMk~mbNMr`6lBR*;Fcl=nyg4#Ox_mBy%j&)5 zikHtNbXhJQNd|9h?0+?SX$x_War(}-$l{&xK?UM=6=Lh}x)oC>lvzzUBb29^oJ-iV zlNar{HwGBb79X#Q&e4VPR*rUt?k&P__U+qtY22;wUHt7jqbG-*G3**g=F(>)Smset~9q+{WIxe zg1+k)zeAB-k7FpU9;bBK|2le!_QTZ|mu$q_3}_;z*07t?`h^!=aaV$! z<&j&fBeZS$DgB4x#p}b;+|HFie3y%6as2?eZR{6zi{MU)=|#)7F%J%|;Ydp9{_M>b zsTY`=Q6$3OjwUL(4KMZAs>~_cm*Q3Y!Vhy2Ofw%)Ri1`|)zy-Q`OuptR6@}+Ls>7; z{?LS=K#9#1_XuwByG&n+~&EcyrRsCHo7;$9-{lv}5hicgl=wVa60Tg(}95SZ+$xL0|MgYn&G(h{ciE^&Ww zXw0Sui0g5h-ZV{LkuxY_znUHLc5I=pxbrh+SKpq);UP@T?Q{LkH|!FcJ$t(L6$P1- zY3*dY`#5Q@l2>P@J=tS!A+O-}|N6}lgIci8cU2v+JVSgiy=pE(eY-T3`%UT5WZqBu zc0r9`gNj$3w6kzs5b;}`Aj!>=|H*^QId=obU}osdG33K=8G7qPViTIx*Pm?h)OJ1n zBZtS>sa&G6fOXyc?58dp_qoB&HL;A_>Qc_i3k9}=MGLwo<|jEHxmdM%_l^8i$_aL{ zyt111u<9!yM^#W;4D6#}8KoaAv?knd_}l-U7tkN?u6M4D01&l%t=Up*SVv}wjCb+D<{R`zu^ zdsm&$bK!+!g}K}EzkXz&pouG+zmqa?+R4tcJyL;ms>@#9${}yXlP*Zrud-p09!?;Kiz?`qh;8&@|BC_#>x$m zF|nl3vc>N-;dDw}?<8}G7whYkrS$3@&v$2=98YTO^!jYULNMeR6^4E9dzY@2hd!rykzdf@&5LWxw92xZihSR!7F}S*Yjd^w&wL% z*k#!*eL{gp9M<$~!51h0f|g~R$9juoWp`xp2~*BC5$)AH+#q+-rg7wIb<-!F`g(nT zcSkC4U#nT;2`c&J67#7|QTm3jSk - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml deleted file mode 100644 index ef24ea1..0000000 --- a/app/src/main/res/layout-land/activity_main.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_video.xml b/app/src/main/res/layout-land/activity_video.xml new file mode 100644 index 0000000..33ad4ca --- /dev/null +++ b/app/src/main/res/layout-land/activity_video.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-port/activity_main.xml b/app/src/main/res/layout-port/activity_main.xml deleted file mode 100644 index ef24ea1..0000000 --- a/app/src/main/res/layout-port/activity_main.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-port/activity_video.xml b/app/src/main/res/layout-port/activity_video.xml new file mode 100644 index 0000000..33ad4ca --- /dev/null +++ b/app/src/main/res/layout-port/activity_video.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gallery.xml b/app/src/main/res/layout/activity_gallery.xml new file mode 100644 index 0000000..888cea1 --- /dev/null +++ b/app/src/main/res/layout/activity_gallery.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..a9f7bfd --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_preview.xml b/app/src/main/res/layout/activity_preview.xml new file mode 100644 index 0000000..4fdd42f --- /dev/null +++ b/app/src/main/res/layout/activity_preview.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_pic.xml b/app/src/main/res/layout/item_pic.xml new file mode 100644 index 0000000..1379d2b --- /dev/null +++ b/app/src/main/res/layout/item_pic.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 999ee776b8f95dec6a487d34f6d245abb5695996..21397b99951e4c64ed3c906a85411c067e72f057 100644 GIT binary patch delta 4498 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 RWsdiEAXkd42!@ delta 6802 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 RWsdiEAXkd42!@ delta 6802 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 RWsdiEAXkd42!@ delta 6802 zcmZ{Ic{tSX_x{++E+!OX$<|mxB+FRGmWXL4OGbo{Le?=uuP95(lC@;t2MI+PL)NTW zlWb$(8XCqjA^Ohyx_-YuKhK}f^_TqR~tA<9ZYU=808k(w-;+ThimX=y@U)P|A?mmI$aF`_hM#;^~P3!;JUjARU zDFuwm{~tj4e?5{E4+uoK-_vsY-vBEA%Qi)c$q+c0x;_8`35S})4Um}04K&VAbS(5= zaFC+?C5w6~J*fl5DZ8&#HT~@>0uQ>shYCzext;4}Ubs>Wd^9ihYR?@y88uxCG`u$w zk!1Kf)y*&kWd3C2P4t;+OD5LyeOHoSJ~V&ao2<~2uF$i;u8E_h-LhTX&YlSvn34Zb zI7R}xeou5A%utTPXDK?w`bJ%zM}lpkDJ0Cs9VYarA)5F4z80aXgluS-7w02inlW$L zEHm221DK91-+(h$P%q;qZu2?Ct; zobMg{%Y@*Pd~!=Dxz4vZRJ$0*e}(??&ad!oIYf@`@g1%R%{-PD)Pa(j;@H&}2(coc z;f!!eyv{2!LxjcLQ!7r8`X4vYTx5+V+O)EYXu9Sx<~SEusok}CpwiMlKov(%t-m#0 z4~D#I(5NIcauC`4h%rER&h$boFfG=GJ*_C7NE26p%ujy-fhw!)vg=X;MX_)*hK{V$ z1rFla2mCXCqu&@2eo&P%pNLpaR&n&;hTP8xf2keBi3jSmZb72R3)@DL%Z{ymlh;LS z36A(+H0h)FbH+TJuy7&yR`)?&UQe*VIC#D;i-uw3@Q9;{J7z3kz!ZSttC8aPUC85$uqw|u`}DQyDhmxn^}%}qGLgPtx=hQ=n-TDsRX7rt3tEnLgw<8C3SVO0S6RvC&?|$5!04lWF5_ND7Ttfx@suG?ks@#|F=y z`jyEXq+92BMv>i>r3o+#X};0XUGumvu)C@q7b`>IOLmIw!KoPri}n?_;*<{{x5h8s z`{m>aVbrf&0!qo;ukdLOxu1!qeL)gulCF`M;(9ZVBlnDgv%~m?c_vD46%K8lez(be z=6loXY07hlyWl4$5mmr--ZC>Cii8lUaFrl#_#YN%v(0TBSk9-~Fw#k!h`G0%a9T^YB`d3pV}cD^G&y zA)+#A9jQ>6z9UFG^C0gZM$!%w;ns5mS*xl~iL%|%z;C_=Wj@sw+4DKYi^OyV!{ccN zPU%9rD+BY(x*U)vkUa7`=-vB$LDJ~*>aV!F(Howm!i%V9`%P&lIBRf}%A?I(l`0EC z9XMD*GZ|_IDPk9()LcNpmth65o4Kk&e1z)vqjlW;wPXdjF-8q@!x7I&r`Ut_JWwK9dp;TJ*Vl!J zqLUMOVZ}RvBT$Tl`>%sMIncIv%#C>qaCvWxw|TjBqo&oNWWetdwR@@vR`XBWz^j70 z_sqa?Qu(fULr9d%<*`g6n_%sQ$7Uo!Cc*TB2W*3-lS?r3Bxs9uHw0B~ZT#RqzAc4O za3N}=T#S@Z$>EANs507tD7WL1rBP*uzl*Mcov)R*Y~@U^)$eQ+}$P2JvlV7H|WhA?D?kUed}`NHe89=9RtNA+vikG8^hoSfJovp!aNB1o-#IdpD(}8a5><%V*!bC-7H>WA zUFZevbvjgXD`#uF6A$0ck(0pPyWNb{>~C7UC+F*MF6@f`26NWogts!bT=qR8DgzqX z3HY(~dwWF}On6xXxtO4k>IK!Y&=jb(T1)Olgz?_Px3Vqm=_Br3Lw{PtSf|3w!T6Dh zYN~vQ(aeu{{y7(m;{?T|ayd)7C$9l=xRSGRNSm5_oge*Qc$epI_tBVtm_z*E@=SQ3 zY}?|pLyS;6?7w#|qODT`@r+|eopg*&Yj5pYcI2&=y8wGZ9NAWL5hl&C!ZL?{;Lsm# z<=XVruZH|U4bRw#dua~tT|9mxiOLG!i$C3*()dTZvwA54mxmqIA`?q19~sQm_X=JT z_zOB6*u2Z?C@lJE?Cp0g${Xqfk2s`CFhS5t=ZMi!>ybl?F|6zhWmMU>&%~Qp8fjuL zA53EU05H+ij`@=MZ1axs8F`fB{f=v3xGYV2K|e}sYk95V@!I1R7NK>Wi^O{4+<#Kv zNskL3k#3F=MQ$NJp>#5GZ#DXRaZY}rG46_8P4>haIu8CFNHYd%3Jz>kDBEXrwxnlm z?=-2g8^t8(uP!*71A$1n|=ifl`~g!1$kH)?_^ zqch(p+=*V~gtKWqqgj90W3~Hhsy!ru3x4zESjO&e!=~YuqgDuHG6x$GP4=kVlR-u5 zG$Zpp@#_&Gen*0_H}Q-rw#Mrtta8BZ#xrry-bkGUTOAJ5X0YqU^cbpYL)B5+E2aFS zr5PNHY*z}}WMH@L&rmGFhnE3ZU{k(gg`PX5NS53sj&ln(;;i4?7yc95l3amFlsh;F zlDprn#ClfOjpxpTG0XGL11nt0IQyrny)7O?ufS!V{85(maRr)Q4a^~Tj$;7rd=KCA zS)?FPktidJo{zAvq{G}B1wD5Sx329R>WWNRa~(@>X1ci%QVz7G&%EVK!5C0sW2SD`f{ux4w@i%zn}>L5;E|dTb=a=WZY3-#(=z+~l1| zhCWMwsQPknPz3#w{H)c8^GR0;IgTmkD$&%vK`6HTmbyaPYl zD9V!KolSFYzI`;uE%*L?d=E}1b+1>keJ}=T6V%5wmoaeVD{eP&99Sb{^O7!naO^~Z ztLIkgOfWpN*yqL`vsWlR#zE%ohU|IqCZRmfpX;AtB36Yadg7-(vj2V1+~48s(0#at z9vntB)HL{E5~IR+I+%I*rUy4d1M==2`#-XSTy_&2s}M^g!$tr2?5W0qV$41;Z&fWs=oeP^|b+L63hjh&viy(Bo)-MU0>*VQ_$5dzsp>1AGrw%V9g zSW)C+06}M*C%MYIbulw8bJfj(4{F|ennkd6dwqG>Ka4^;rPGp*{~n1M4&J6PHDJLj zzKwk4Rlad9C)7S1rfaZV;py;>VEh(jTm5>ygIQ+)I+hu5D^n<`Vv>32{G7%aj^Rwu zJ$msxTkmj(0g4vk#^?Pd1V}Vm4}v%PKp{kgf6;!mjrQy^jlv-pII=aJ?bM zukr28_nQ$rz|mxWLS)(g3YotZ7x*qw&CPbdzjFuTBIMhoftOw^NTIyin-kF;<>&(b z-l6}GgD%zYJ~(3%&*(@#S>x{R^unaa{UQ|f52x{v+5u-OLmn$PgzLxTZGi18X_!&E zZtVFA>{nc(5~@tW4yqRr*sus24e8_ojqR-Ht`!14@e!W$^=G&K7Qm^HbxmH&n`t>F zZ6V>~^q2IyF>M?&*Vkv%K6E_dJ2&^`Lh|b_+Knrq@<-rr zafOA}>~IGDowFS}*}del_7fi&fVROTmRErFc$m3Y)@m0ByTx&GOn3I1XHCX~?LNjg z0CkoIH`)2CIG7+08cK|U-`JRU&eJuOsJ3Z_@HiMYU#hny9g*^HhkN%oIZuC*nZtK# z?HSEEK|>MMeNb6?&bha(C1W5oF-{(yTd{zkfJDMi#)l5GSM$H@6%uzK>!BB}fy;HA zdY47ekIsb%&%;{Sc+4IPyrw&9vhgWU_j@JC`i3IHzAV%Wfw_Ui8zQZKyekcK6m&KU z_8^)rTC)WNW`{R|2b#uN_og(A+V?H_7bOX&CLRqs-6^-;o)OSP)asdL1dOY1ItH(- z5md3l1g8n6)%`jnCh5r?U$21*a$FzI&HU$eNcXV_x~lbZ_^ILSTifz zzfEHyPqGq-RLDIMy1Kn{#WZ6vj3>`1_(MS8UL7RrIPsrsU^B4`La`}gT`&XdkoZYG z8eefqO!}J3Fh0ZJ+W~>1xP#3+`PvHOb4&Wn&2P0|v%Xnr6Ztlr7L$ZtA~+5X2i>C? z$o}XmLP}UjT7k@h@-Iiwo&W+Mx{4`bZLZ{0$9`HTRPRN+g6hA%{teWy#L>U7j;Z!H(RBj>-0^ay^K7Cz3Rg_ML)fYV>BTnvNX08+iD zCz-!E%Svd=bf9)1GY!z6a(ClH>RTKML1${cZ=TkV+IY>Dt15$9>$kjr!7XuEm2ZKX zvmqt_eMEUqf$;FDI-XIq_5wY>h_VmX5nm01dpb?no*XdbJ@_^}rmtz$zW>eI5w#*U z^>P{ZQ|6rhZY$HXaRAb--#yUy6V3^8w=VC7-2UL=uAjVGS!RoDMw6J*i`b>vYGqJz zU&#SIxM#oRzKWn9z^e~86_xcaSEu~NZc-uDa;Q_S*V?4c^_zn~ucZFQB!0AMdcxmR zS#l>U(u6$=+Z)t2YWH=&h84pDN}!cd!-U4cy-b~RFg~05JV12c@>>{w#De>6{Qpla9ZD4mb0b7t||A^+9H1Kq8(2%}T& z`f|nzVwO4cJr#-pxqUcA;G77^NDf6glG+IiKy{A5hw|QSlf=(EPCt{f6&KqV@BY3& z6lA%q?`%?T-B8sh7`?+^>rt<+=p9Kas>JyZnRp!ciVNE{)Ec}`R%dPgIC36EJ^nM~ zw;^**b!#a{2Q2NDVGf3?vJN6a%N|v6W7>L57d&(sjHN%6b>fHK6FaCmyKEV%m!-=` z069BuDIFQ@&ykAwNZTKNs~6?xhDHC>2A)j2#TW3U(A@NdHhwYqFGIE5*uEuY+m`rB zy0O8#2d>yE#j{)}CM?13AsC_!_szujhO~3Fryr`jtulPepyrq%qU?The4Wq?9=S+) zZWy++Nhsjv_=zjKJ;&Ei&A~URzPtvm1!~wvXKDZT#p~dOR-uX9h`oXdw=GD0)(jwk zbx1t#Rgk{`oA=(ayauL{*u4T1_qp_EwckafGv2YMqD)jVH-gv03dfWv47#1$g;dB( zq(twZ{mldM*BmpPdT*W+O?}r%;im>3`}HePB>t{VefmaU8HDYBm`{QEZA{z&Ot5k0 znT7JFtGtUscqf5v;71WVIAqsSZP=QiG@vV}MabLS7NaLCx1*rcY>?>5x{}au(KG(3 zu}fCHxXub?5@;DfOgOky(BkNYu_gdky%YDCg1Z!nq)3UUGvXqk6pHykwjtVr?aFdlAm)4E{ z8!#Zph>;G(s;|{c!|q;Lcn;xv0SM~bnAdz{WSeXp znl@Bti}e|Ffc#mhx^GRWYOd$Md70+AsH}CBvyiFX4@=<_+SqvYWv_NLG{ z3%&MAs>HwzGA~*Cs0Hpyb@>-3qK`6YZCNFqBXLA{VM@ZP6G!%K7%wA1{_f>~- zPw#VC^QPGeI;yNdWTKTy%2!^S595qB)$9i8?w=OE=qVjX>Twngak2FP?EN1wW zjdzaWqF`#NUi2Wh9J;l^C_8KmzK(KvLtA>beOJxo6||aYO3(Fa|3;??u0RJj|8o&fTMYctjnHIrNM0$I@r4EBpAI>f=dAw41+~7vShqbAx}>EYK0U}XvIR*?SFK>iMKD|{S6 zuB!Z5g)Q(N@k#yEVycBy1T8kFSWlj%SUo@-<-nP7c&X*oTNir)7WvY_+DoYJ7XBp9 z6a-5g%@h9Mbp-F%7?a4L!}jVv9J0z{SK+^TgroE*3dGEUakK!BSmz=vO$uTjn1Ojy zXhNc(xH2OjPRei)x_)KN{~}7R7eZa<;+aSWpf9%}35i!!w%ot>3bH~HR@QoLy9a7g z1?>caq4Wv2Os?hmhbq=)=HVcI{pIG4MYe{wh4QmR*{pD9rH#)I@oh_VVZqk?5>iXv zfzbPK=YOGKyU;YWn0Of^8rOl7jNa(@>IjaFxKvDYQ+5kcG0m{*hNRKt9BucH0SVT; z$;cRY#9XAv~3CW&iaMu(Hk&1cy-8U3K13eZ1UWnku;=BCQZt`oVWg( z8Bh~rpQm)V(k^8Vro#s+qTs8ro(w2__!4?@ZF1d%J$y`t@(5;Xt6LQ3Nt8W6un6j` z3%;)g>{a$cU5T=W-9Fw4N`Nhq&2<7pTS=vL@Js}J!RUT}*EMDQFGy$}##h9Ss=7EJ zg0=}w+`uT3ZvI4cBE@e!Zmq867y(ghm-Xh8X`eF-`##gxDyc{bD(?-q7hIp%u#rB8 z?nJhi)EqZ6a7P|;{(gc|h(u%8(W_mLYDUm}4ql2E^(FpA*uoA3cvPZwB7&|7y#dEd zo~4+VAX@_}5{*or+p>J~jS5Dv9Pb3*>%8RxP%A;j?DiQDMbgu5QiY`bl!UfP z`CM4*udvcyj>A*<$e@pen5w~VQg}wH5~@4E>*vuYDU^=sNRV#HT}xd=xlm!6pWe)g zMHZ>(a}pXBXJT*-%(}W(tAMK3Y8GS4xhUnp{-o#I?9kqeKvDXLF97l*!7qp*qNGW# z*5!bZTad*_&`WMo7?SGqE55qkNO9h6u}%slaG#$mihS3+&9c_hLNw~pYoe5!$EJZ# zUs7cNUDR9oBBZ-TuYs+_5iE0#UAiiaozrw?#ii3dE&4T83t;xOVam=>?wD;cNB}a2nq9l}y z&D7s3KO$)WK(iVnipROC5~hSU{aEK*%l2jj{XZI#lv%#xvTHb3b8m2~(rvISiEZOz z>gH}E;!!3*5)SPlX4;)T&#G+ft}eCDsw@wUwlB1vEiK-KUa)W6Ax14k({wp|HVq_W zVdDK9XnYO(qHd+Wx&+}69qQ^3dR62K!0S)1Er7I%fp0MJH zgFO8uiOiJ2q`>(4sboAAP@@nAw6ddRRW66IM85~xg2x)i)NqfLEBGyptv~q#X-V=B zM{s6I>%$aTlqDKL0?y-vIHssM^2C9^evpVE64H05!R?Uvvp<%_-Tz7#{F6X7y<)g_ zm%lI8RWxIq8hN|qWfEdY$dEJZ=fFg0zZM)1ix_t=I+X3F zqeg*%Z?o!%VwF+7guc5C9E6uD{Z+adC?b}t=9;;E@p3dyG$4yjrP~<+Rq8 zA-;BD023tsExCj00kakx5qV2y?ih@;*NF!!^iFW5Q{E@%TV!pwzz+Xb;YsOAIDz;j zCZXA)U^Z5njP*oZ;in5S7960~024UuvQ*c#JEgS{9kc#R(%7+LCOnbme%1!#wp%*t z0IMN$gg{!OS}|QPopQm@+R!x6X-pj|MS%0?GzFTg!!S4u*Z&oo3jX|$!@#eXRQur4?$SfO2HMovCpCVOSlJAR%z z{yM@)db_r@Wc3R9PIzIGp6hDE_gwt&e6_RX53%b=?36yD zXz_|3`48C*KXZwKJMzRy&n%G2{2$6bHoeb*z^haAFV5c{3k#uaPig!Qh@VgDPz#iK z|6+ZZ*)>c+94DQ0733ppe4)KQ>VOSc83pCR=X0utr{BESiSHiC@xq&9?A6#i(p{y5 z6WmIW&s+r$s(&6>v&HB392z?CswQ4XjFLQHYrJ-18-uBidXX$h(K0dQi}I|>QTpwY zljWg6t-?7Z)UsUGXQp;TC*Fv_8^sk@E+gwODWA$O7Gu=SXR<5f$XaNiGCz&cB=k@p z=#Jf4Q<%Q$#1PlOJaSS6o5x)`4V% zAAw;5&Fpxz2M=%Y~uBPA0eacS;7ev1wLOSaemO9Rs?+9;i z>yCo?oBWq9=#G=(c3BRbq8AW6V~ljBlWhc(rXs%AdaLU_?XEykb@V-YB%vQRdH91^V zk5hu9U=lUXj)Ta+hvsFw1A=f$t=|ix@hqs_1G!%ch>huG;gEcoxh-O4ATAu@7^@~~ ze9Ta@4jIT!_lYUSl>Ex}eNRM5_=AR<1mzbjw$e&~{N7HFthsoy63@&qy{f_5oEh4L zVQV_E2GcNW{Bq0!0YTY5_r#^YKLUe&tWG2%X01rwhJxSs{$MM7z&nHa0rtZT*gE`Sa2;FcO zg?q#@{d3x@gvgw4H|+XM$OmSC!B*(w8J`xy}v^6v^iyL6AhKT#mhDeW_L zp24Fp7J5D~>j+Xa1$KG=p{{M0s=Mw5;<@i(sLF)63YrJ02=GZg<2=AV*Grlh%p+c%BH-U*$dRcWWPX z?SR-T7CyP|!K??B9jWTkcV}Xs7J2iO?N9i>u{ii?!ELbn5w_YP!u42^ytksB+=0zt zq%96%pC6%7aM0Ho&Z+i9rUp(j=FO*x^A{tU$D4IbPiBw5qA{C`lt`SGjC@_XHOtr> zCObCh5tOe#K8EMP!*%1#TvIKyw%x)fcknv=*s5Hf_S@$xw7@ek?a=R+k7C1>Vw4$Y zp6b!j;Vm<{eH&=#94E8uNf()HC9F;KPFF!8fJ6S((TvC7bU_Y|7h9cEYqbu&j!|Zn z#7kEAW(RcUEbkoPZFC-sA_87{!Yv$%SHPj+IgYms6w&8cRBkC-I%6WU(>IcQz(FX$ zV-f3GOTm45Z`>s5hDjho+U9KL#Rnn*(`J|jBjw?%rDxXoL+vchK5ZP0N8?3>{TYG? zPzWT7JSA%<*=01z5NAF9=fR^J+wRGVa85>iF(Ap*0fQBH5Go90o$4u($Y8<1psrKo zVf8T|8rkb1s#IMgKEs=OM!=T)U_lzF_VVL;yFO=Sn&V^gK_D`;Y>%@~b!%FYF3ML$ zE*{^>;AA#$8)qF?t@MzQVNt)n4620y*BV{Ubax*DT|*TPTgz4L**_g6j-Z0kYuyoz z&V;D25zG99AGQ;vVd41(Crw4&zF85@wW~Jd$CG(K3iUZzt_Ud#f|;y{ug`T4goPq3 z=SUZy`Ki}$q?NQZ*K@XJ*VhR6X2`bmF2|DD*0Oyn6B>~)9?(2{_xGdv{_P0O7wf=J zEEY|L?V(>)*#_yWvpk^InHdU69Po$yhK~D}jjV)Idz6n)AxHLXS3W4;7cF;Y*6%ZB z_GM>ogd`)+8lzaRnzz&@`qqe|A^X8;?ay7UIe+tPDOX zG?nFj3nvP3mOAu~{301?_A&}#^?l0KA}IIXq?@EfN(Drrlqg^$_rYEdCU;{B4`IC# zwuBWWrr~2~Y30@6`dmZ$G-WD!7Qt3G?uiz94Bo;td6BnQW4Wybq737mltBHR}~RrwBe z&yj4)_ERaHC(v6nx;lB*>7Jil$xricZTDi=0iHb#)zYnrgH*B%T<<$Gow|*Wx`iKD ziz+mkIwm;}az;OT*7MwiljV4GL_LseJm_4|G-x3l>LlZeGqj_}6#mFv+Dw}dpB8Mj zY{zmK2vk6VEy_H~H4YJ$*A4|Wavdj_?31Huq^%)|F8r)+rhb}Zge2#4YxX3r&lTMZ z83Gk$$j1NG)rWQ@*k=WUioX9+yNJ|A96P_ff7EdEiNWS&lzUBOkH2Ykj4m@Z$#F$~H@zaY%62Xegv0&%(%4$A(jQ9f|DuY8-xCG8OCu%~?5#hT!C{p>CP%~Lii}8Qq zc_lR%K>wa+{Lfp@(5ymS3Dj4mWlv_Y3((j8t~ji0MOcVyUcsjR$gz`wLTo?I8L7A< z!DnnT{r`wT8Dg$2h7Ef+tUaNn3H9vA5x!i<+WUPQJ$fKW_wfOnGx=m-%pE;~-eS38 zcJTeO>X{T>0Fz=;zr?--yV&q(h|RlSOdqH=A9ve2s_eX!d1+y=T`J8z@nTb(^_>?| zJ3l2{x}#*_E;bhI6~OhmD542%R-ZcG7pBg&56PO~b~vV0D-fa8}kSnZG;PnNIqHzzE$V+@7Ol@)0e0W(GTHM5`W*(x19Px1f=)agZ;s z+*?bAK(yM1;?T=62lmJK^`lq5jvuvp+}Hcq%BX{@`;DlOA!&G0Y~P@}wBzj%sg`WB z)gk#~NimIl<&|3iD00)YW&Vz)&LZpB8Z%|^#BDa7)Gl=y3vDZ3XYdBg|Cyqa`wrk z?wWUMmtfoI7}6`-4a3S}t{apnigFwe{~%bHRm%f8QsecPcgO1XN|SJnzwcx6z@~W_ zzM5${gfu_8E;^$g$-3Kff5&MGcC^UKjhtQd_>Ej$JpB-}HjFrqulz`%u4C1^0`+NG zYB$}__4*R<;PYl9UaXL159sv|Lj*sW+FXvT}bVVR;a@OsCn?{i#HJFn$ zK?<<r$44flP};vbbm>vpR=;5>IT8CNR%8r_cKf>~ z&h*|lYGF8S9FLCBxsJO@;TxkVr6fv}A7mazRKi@|LxfC2Op-bo(D*eAu$0#c`EKU1j~5xEffYgZ#><@$J1kVL-_8i>&K zB70NJ(*tRoTlTg}>w3_pxnC977a^tr1u`swUxtgOSbKb4eWUFKSagxqoFy;ljX#NpVk)FS|EGMa))Nn93jtJ)3l}?n}&!WEBOEF!&Vq8+#|#iRWE^x@BU> RWsdiEAXkd42!@ delta 6802 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 RWsdiEAXkd42!@ delta 6802 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 #6200EE #3700B3 - #03DAC5 + #4880ff + #f3f3f3 + #FFFFFF #000000 #333333 @@ -11,4 +13,144 @@ #d0d0d0 #9F9F9F + + #00000000 + #FFE2C59B + #FFFFFFF0 + #FFFFFFE0 + #FFFFFF00 + #FFFFFAFA + #FFFFFAF0 + #FFFFFACD + #FFFFF8DC + #FFFFF5EE + #FFFFF0F5 + #FFFFEFD5 + #FFFFEBCD + #FFFFE4E1 + #FFFFE4C4 + #FFFFE4B5 + #FFFFDEAD + #FFFFDAB9 + #FFFFD700 + #FFFFC0CB + #FFFFB6C1 + #FFFFA500 + #FFFFA07A + #FFFF8C00 + #FFFF7F50 + #FFFF69B4 + #FFFF6347 + #FFFF4500 + #FFFF1493 + #FFFF00FF + #FFFF0000 + #FFFDF5E6 + #FFFAFAD2 + #FFFAF0E6 + #FFFAEBD7 + #FFFA8072 + #FFF8F8FF + #FFF5FFFA + #FFF5F5F5 + #FFF5F5DC + #FFF5DEB3 + #FFF4A460 + #FFF0FFFF + #FFF0F8FF + #FFF0E68C + #FFF08080 + #FFEEE8AA + #FFEE82EE + #FFE9967A + #FFE6E6FA + #FFE0FFFF + #FFDEB887 + #FFDDA0DD + #FFDCDCDC + #FFDC143C + #FFDB7093 + #FFDAA520 + #FFDA70D6 + #FFD8BFD8 + #FFD3D3D3 + #FFD2B48C + #FFD2691E + #FFCD853F + #FFCD5C5C + #FFC71585 + #FFC0C0C0 + #FFBDB76B + #FFBC8F8F + #FFBA55D3 + #FFB8860B + #FFB22222 + #FFB0E0E6 + #FFB0C4DE + #FFAFEEEE + #FFADFF2F + #FFADD8E6 + #FFA9A9A9 + #FFA52A2A + #FFA0522D + #FF9932CC + #FF98FB98 + #FF9400D3 + #FF9370DB + #FF90EE90 + #FF8FBC8F + #FF8B4513 + #FF8B008B + #FF8B0000 + #FF8A2BE2 + #FF87CEFA + #FF87CEEB + #FF808080 + #FF808000 + #FF800080 + #FF800000 + #FF7FFFD4 + #FF7FFF00 + #FF7CFC00 + #FF7B68EE + #FF778899 + #FF708090 + #FF6B8E23 + #FF6A5ACD + #FF696969 + #FF66CDAA + #FF6495ED + #FF5F9EA0 + #FF556B2F + #FF4B0082 + #FF48D1CC + #FF483D8B + #FF4682B4 + #FF4169E1 + #FF40E0D0 + #FF3CB371 + #FF32CD32 + #FF2F4F4F + #FF2E8B57 + #FF228B22 + #FF20B2AA + #FF1E90FF + #FF191970 + #FF00FFFF + #FF00FF7F + #FF00FF00 + #FF00FA9A + #FF00CED1 + #FF00BFFF + #FF008B8B + #FF008080 + #FF008000 + #FF006400 + #FF0000FF + #FF0000CD + #FF00008B + #FF000080 + #FF2B2B2B + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1d8cfb3..c8050c6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,13 +1,22 @@ - - + + + + + + + +