Commit 11c0e2d4 authored by leichao.gao's avatar leichao.gao

parent 1d899f4e
...@@ -21,6 +21,7 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe ...@@ -21,6 +21,7 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe
private val bottomSheetBehavior: BottomSheetBehavior<LinearLayout> private val bottomSheetBehavior: BottomSheetBehavior<LinearLayout>
private val listener: AlbumsSelectListener private val listener: AlbumsSelectListener
private val mNoText: TextView
constructor(mContext: Activity, listener: AlbumsSelectListener) { constructor(mContext: Activity, listener: AlbumsSelectListener) {
this.mContext = mContext this.mContext = mContext
...@@ -30,6 +31,8 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe ...@@ -30,6 +31,8 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe
val bottomSheet = mContext.findViewById<LinearLayout>(R.id.bottom_sheet) val bottomSheet = mContext.findViewById<LinearLayout>(R.id.bottom_sheet)
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet) bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
mAlbumName = mContext.findViewById(R.id.albumname) mAlbumName = mContext.findViewById(R.id.albumname)
mNoText = mContext.findViewById(R.id.no_data)
init() init()
} }
...@@ -44,6 +47,9 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe ...@@ -44,6 +47,9 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe
mRecycleView.adapter = mAdapter mRecycleView.adapter = mAdapter
if (mList.isNotEmpty()) { if (mList.isNotEmpty()) {
onItemClick(0, mList[0]) onItemClick(0, mList[0])
mNoText.visibility = View.GONE
}else{
mNoText.visibility = View.VISIBLE
} }
} }
......
...@@ -20,6 +20,7 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span ...@@ -20,6 +20,7 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span
private var mBtnContinue: TextView? = null private var mBtnContinue: TextView? = null
private val mSelectAll: TextView private val mSelectAll: TextView
private val mNoText: TextView
private val mContext: Context = context private val mContext: Context = context
...@@ -30,6 +31,7 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span ...@@ -30,6 +31,7 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span
mRecycleView = context.findViewById(R.id.content) mRecycleView = context.findViewById(R.id.content)
mBtnContinue = context.findViewById(R.id.btn_continue) mBtnContinue = context.findViewById(R.id.btn_continue)
mSelectAll = context.findViewById(R.id.selectAll) mSelectAll = context.findViewById(R.id.selectAll)
mNoText = context.findViewById(R.id.no_data)
init() init()
} }
...@@ -62,6 +64,7 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span ...@@ -62,6 +64,7 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span
} }
override fun onItemClick(position: Int, entity: PhotoBean) { override fun onItemClick(position: Int, entity: PhotoBean) {
} }
fun onSelectAlbum(album: AlbumBean) { fun onSelectAlbum(album: AlbumBean) {
...@@ -70,6 +73,9 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span ...@@ -70,6 +73,9 @@ class PhotoListManager(context: Activity) : OnItemClickListener<PhotoBean>, Span
PhotoCache.getInstance().clearCache() PhotoCache.getInstance().clearCache()
mCompressionPhotoListAdapter?.updateData(list) mCompressionPhotoListAdapter?.updateData(list)
updateBtnContinue() updateBtnContinue()
mNoText.visibility = View.GONE
}else{
mNoText.visibility = View.VISIBLE
} }
} }
......
...@@ -60,7 +60,8 @@ class StartCompressionPhotoActivity : BaseActivity<ActivityStartCompressionPhoto ...@@ -60,7 +60,8 @@ class StartCompressionPhotoActivity : BaseActivity<ActivityStartCompressionPhoto
startActivity(Intent(this, CompressionPhotoListActivity::class.java)) startActivity(Intent(this, CompressionPhotoListActivity::class.java))
finish() finish()
} else { } else {
Toast.makeText(this, "Album photos not detected, no compression required.", Toast.LENGTH_SHORT).show() startActivity(Intent(this, CompressionPhotoListActivity::class.java))
finish()
} }
} }
}, Random.nextLong(2500, 4000)) }, Random.nextLong(2500, 4000))
......
...@@ -20,82 +20,8 @@ import com.test.easy.easycleanerjunk.service.FlashlightService ...@@ -20,82 +20,8 @@ import com.test.easy.easycleanerjunk.service.FlashlightService
object NotificationUtils { object NotificationUtils {
private val TAG = "NotificationUtils"
const val NOTIFICATION_TAG = "SmartCleanNotification" const val NOTIFICATION_TAG = "SmartCleanNotification"
private const val CHANNEL_ID = "Misc"
fun showNotification(
context: Context,
notificationId: Int,
remoteViews: RemoteViews,
closeViewId: Int,
pendingIntent: PendingIntent,
pushStayTime: Long
) {
if (closeViewId != 0) {
val closeIntent = Intent(context, CloseNotificationReceiver::class.java).apply {
putExtra("notificationId", notificationId)
}
val closePendingIntent =
PendingIntent.getBroadcast(context, 0, closeIntent, PendingIntent.FLAG_MUTABLE)
remoteViews.setOnClickPendingIntent(closeViewId, closePendingIntent)
}
val builder = createNotificationBuilder(context, remoteViews, pendingIntent, pushStayTime)
sendNotification(context, notificationId, builder)
}
private fun createNotificationBuilder(
context: Context,
remoteViews: RemoteViews,
pendingIntent: PendingIntent,
pushStayTime: Long
): NotificationCompat.Builder {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel =
NotificationChannel(CHANNEL_ID, CHANNEL_ID, NotificationManager.IMPORTANCE_HIGH)
channel.lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC
notificationManager.createNotificationChannel(channel)
}
val deleteIntent = Intent(context, CloseNotificationReceiver::class.java).apply {
action = "DELETE_NOTIFICATION"
}
val deletePendingIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, PendingIntent.FLAG_MUTABLE)
return NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.mipmap.logo)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setDeleteIntent(deletePendingIntent)
.setContentIntent(pendingIntent)
.setContent(remoteViews)
.setCustomHeadsUpContentView(remoteViews)
.setCustomBigContentView(remoteViews)
.setCustomContentView(remoteViews)
.setStyle(NotificationCompat.BigTextStyle())
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setTimeoutAfter(pushStayTime)
.setSound(null)
.setLights(0, 0, 0)
.setVibrate(null)
.setAllowSystemGeneratedContextualActions(true)
.setBubbleMetadata(null)
}
private fun sendNotification(
context: Context,
notificationId: Int,
builder: NotificationCompat.Builder
) {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val notification = builder.build()
notificationManager.notify(NOTIFICATION_TAG, notificationId, notification)
}
fun createPermanentNotification(context: Context): Notification { fun createPermanentNotification(context: Context): Notification {
......
package com.test.easy.easycleanerjunk.utils;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.Settings;
import android.util.Log;
import com.test.easy.easycleanerjunk.MyApplication;
import com.test.easy.easycleanerjunk.bean.AppInfo;
import java.util.ArrayList;
import java.util.List;
public class AppUtils {
public static List<AppInfo> getAppsInfo() {
List<AppInfo> list = new ArrayList<>();
PackageManager pm = MyApplication.context.getPackageManager();
if (pm == null) return list;
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
for (PackageInfo pi : installedPackages) {
AppInfo ai = getBean(pm, pi);
list.add(ai);
}
return list;
}
private static AppInfo getBean(final PackageManager pm, final PackageInfo pi) {
if (pi == null) return null;
String versionName = pi.versionName;
int versionCode = pi.versionCode;
String packageName = pi.packageName;
ApplicationInfo ai = pi.applicationInfo;
if (ai == null) {
return new AppInfo(packageName, "", null, "", versionName, versionCode, -1, -1, false);
}
String name = ai.loadLabel(pm).toString();
Drawable icon = ai.loadIcon(pm);
String packagePath = ai.sourceDir;
int minSdkVersion = -1;
minSdkVersion = ai.minSdkVersion;
int targetSdkVersion = ai.targetSdkVersion;
boolean isSystem = (ApplicationInfo.FLAG_SYSTEM & ai.flags) != 0;
return new AppInfo(packageName, name, icon, packagePath, versionName, versionCode, minSdkVersion, targetSdkVersion, isSystem);
}
public static void jumpToAppSettings(Context context, String packageName) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", packageName, null);
intent.setData(uri);
context.startActivity(intent);
}
public static String getAppVersionName(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(packageName, 0);
return pi.versionName;
} catch (PackageManager.NameNotFoundException e) {
Log.e("TAG", "getAppVersionName: ", e);
}
return null;
}
public static int getAppVersionCode(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(packageName, 0);
return pi.versionCode;
} catch (PackageManager.NameNotFoundException e) {
Log.e("TAG", "getAppVersionCode: ", e);
}
return -1;
}
}
package com.test.easy.easycleanerjunk.view
import android.app.Activity
import android.view.Gravity
import android.view.ViewGroup
import android.widget.PopupWindow
import androidx.core.view.updatePadding
import com.test.easy.easycleanerjunk.databinding.PopupLayoutAdPreparBinding
import com.test.easy.easycleanerjunk.utils.BarUtils
import kotlin.random.Random
class AdPreparationPop(private val activity: Activity, val onDismiss: () -> Unit) : PopupWindow() {
init {
width = ViewGroup.LayoutParams.MATCH_PARENT
height = ViewGroup.LayoutParams.MATCH_PARENT
isOutsideTouchable = false
isFocusable = true
isClippingEnabled = false
}
private val binding by lazy {
PopupLayoutAdPreparBinding.inflate(activity.layoutInflater)
}
fun show() {
contentView = binding.root
activity.window.decorView.post {
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
BarUtils.setStatusBarLightMode(activity, false)
showAtLocation(activity.window.decorView, Gravity.CENTER, 0, 0)
}
binding.root.postDelayed({
dismiss()
onDismiss.invoke()
}, Random.nextLong(2500, 4000))
}
override fun dismiss() {
super.dismiss()
BarUtils.setStatusBarLightMode(activity, true)
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.view
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.provider.Settings
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.bean.AppBean
import com.test.easy.easycleanerjunk.bean.AppBean.Companion.appBeanGson
import com.test.easy.easycleanerjunk.databinding.DialogAppDetailBinding
import com.test.easy.easycleanerjunk.helps.ActivityLauncher
import com.test.easy.easycleanerjunk.helps.BaseApplication
import com.test.easy.easycleanerjunk.utils.AppUtils
import java.text.SimpleDateFormat
object AppDetailDialog {
private val TAG = "AppDetailDialog"
@SuppressLint("SimpleDateFormat")
fun Activity.showAppDetailDialog(
appBean: AppBean,
launcher: ActivityLauncher,
unInstallAction: ((unInstalled: Boolean) -> Unit)? = null
) {
val dialog = BottomSheetDialog(this)
val binding = DialogAppDetailBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
binding.tvAppName.text = appBean.appName
binding.tvPkg.text = appBean.pkg
binding.ivIcon.setImageDrawable(appBean.icIcon)
binding.tvVersion.text = AppUtils.getAppVersionName(BaseApplication.context,appBean.pkg)
val size = Formatter.formatFileSize(this, appBean.appSize)
binding.tvSize.text = size
val dateFormat = SimpleDateFormat("MM-dd")
val installTime = dateFormat.format(appBean.installTime)
binding.tvInstall.text = installTime
//应用来源逻辑
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val installSourceInfo = packageManager.getInstallSourceInfo(appBean.pkg)
// binding.tvInstaller.text = installSourceInfo.installingPackageName
if ("com.android.vending" == installSourceInfo.installingPackageName) {
binding.tvInstaller.text = getString(R.string.google_play)
} else {
binding.llInstaller.visibility = View.GONE
}
} else {
binding.llInstaller.visibility = View.GONE
}
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
//修改dialog的尺寸
val lp = dialog.window?.attributes
lp?.width = ViewGroup.LayoutParams.MATCH_PARENT
lp?.height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog.window?.attributes = lp
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
binding.tvDetail.setOnClickListener {
val intent = Intent()
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.setData(Uri.parse("package:" + appBean.pkg))
startActivity(intent)
dialog.dismiss()
}
binding.tvShare.setOnClickListener {
dialog.dismiss()
val uri = "https://play.google.com/store/apps/details?id=${appBean.pkg}&referrer=share"
//浏览器
val intentView = Intent(Intent.ACTION_VIEW)
intentView.setData(Uri.parse(uri))
// 检查是否有可以处理Intent的应用
if (intentView.resolveActivity(packageManager) != null) {
// 启动Intent,打开浏览器
startActivity(intentView)
} else {
//分享文本
val intent = Intent()
intent.setAction(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_TEXT, uri)
intent.setType("text/plain")
startActivity(intent)
}
}
binding.tvUninstall.setOnClickListener {
dialog.dismiss()
val intent = Intent(Intent.ACTION_DELETE, Uri.parse("package:${appBean.pkg}"))
launcher.launch(intent) {
unInstallAction?.invoke(!isInstalled(this, appBean.pkg))
}
}
}
private fun isInstalled(context: Context, pkg: String, error: (() -> Unit)? = null): Boolean {
return try {
context.packageManager.getPackageInfo(pkg, 0)
true
} catch (e: Exception) {
error?.invoke()
false
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.view
import android.content.Context
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
import com.test.easy.easycleanerjunk.databinding.DialogNotificationOpenAlertBinding
object NotificationOpenDialog {
fun Context.showNotificationOpenDialog() {
val binding = DialogNotificationOpenAlertBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).setView(binding.root).create()
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.view
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.databinding.DialogPermissionFilterBinding
object PermissionFilterDialog {
fun Context.showPermissionFilterDialog(
allClick: () -> Unit,
authorizedClick: () -> Unit,
) {
val binding = DialogPermissionFilterBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).setView(binding.root).create()
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
//修改dialog的尺寸
val lp = dialog.window?.attributes
lp?.width = resources.getDimensionPixelOffset(R.dimen.dp_360)
lp?.height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog.window?.attributes = lp
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
binding.tvAll.setOnClickListener {
dialog.dismiss()
allClick.invoke()
}
binding.tvAuthorized.setOnClickListener {
dialog.dismiss()
authorizedClick.invoke()
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.view
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.test.easy.easycleanerjunk.databinding.DialogTimeSelectBinding
import com.test.easy.easycleanerjunk.helps.TimeUtils.PAST_60_MINUS_QUERY
import com.test.easy.easycleanerjunk.helps.TimeUtils.SEVEN_DAYS_QUERY
import com.test.easy.easycleanerjunk.helps.TimeUtils.TODAY_QUERY
import com.test.easy.easycleanerjunk.helps.TimeUtils.YESTERDAY_QUERY
import java.text.SimpleDateFormat
import kotlin.time.Duration.Companion.days
import kotlin.time.DurationUnit
object TimeSelectDialog {
@SuppressLint("SimpleDateFormat", "SetTextI18n")
fun Context.showTimeSelectDialog(click: (mode: Int) -> Unit) {
val dialog = BottomSheetDialog(this)
val binding = DialogTimeSelectBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
//修改dialog的尺寸
val lp = dialog.window?.attributes
lp?.width = ViewGroup.LayoutParams.MATCH_PARENT
lp?.height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog.window?.attributes = lp
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
val simpleDateFormat2 = SimpleDateFormat("(yyyy/MM/dd)")
binding.tvToday.text = "Today " + simpleDateFormat2.format(System.currentTimeMillis())
binding.tvYesterday.text =
"Yesterday " + simpleDateFormat2.format(System.currentTimeMillis() - 1.days.toLong(DurationUnit.MILLISECONDS))
binding.tv60.setOnClickListener {
dialog.dismiss()
click.invoke(PAST_60_MINUS_QUERY)
}
binding.tvToday.setOnClickListener {
dialog.dismiss()
click.invoke(TODAY_QUERY)
}
binding.tvYesterday.setOnClickListener {
dialog.dismiss()
click.invoke(YESTERDAY_QUERY)
}
binding.tv7Days.setOnClickListener {
dialog.dismiss()
click.invoke(SEVEN_DAYS_QUERY)
}
}
}
\ No newline at end of file
...@@ -50,6 +50,19 @@ ...@@ -50,6 +50,19 @@
android:layout_marginLeft="14dp" android:layout_marginLeft="14dp"
android:layout_marginRight="14dp" /> android:layout_marginRight="14dp" />
<TextView
android:id="@+id/no_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:drawableTop="@mipmap/sada"
android:layout_centerVertical="true"
android:drawablePadding="10dp"
android:visibility="gone"
android:gravity="center"
android:text="No photos found"
android:textColor="#666666"
android:textSize="13sp"/>
<LinearLayout <LinearLayout
android:id="@+id/btn_continue_layout" android:id="@+id/btn_continue_layout"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment