commit 717d800ba397157e29f9396852c748d102e50b55 Author: litingting Date: Fri Aug 2 17:55:57 2024 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/AppLock.jks b/app/AppLock.jks new file mode 100644 index 0000000..be6bac4 Binary files /dev/null and b/app/AppLock.jks differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..1819578 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,76 @@ +import java.util.Date +import java.text.SimpleDateFormat +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("kotlin-kapt") + id("applovin-quality-service") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") +} +applovin { + apiKey = "hHy0TRZ_kHJAhCLAt5VqWT8vs5MIFuy1ovD8xKl9_ZsgCRVgFp7wgir1hEE6w1uxluE1n4w27wUS2MVr5X8XXh" +} +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) +android { + namespace = "com.moretool.free.applock.watcher" + compileSdk = 34 + + defaultConfig { + // com.moretool.free.applock.watcher + applicationId = "com.moretool.free.applock.test" + minSdk = 23 + targetSdk = 34 + versionCode = 4 + versionName = "1.0.3" + setProperty("archivesBaseName", "AppLock_V" + versionName + "(${versionCode})_$timestamp") + testInstrumentationRunner = "androidx.watcher.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + buildFeatures { + viewBinding = true + } +} + +dependencies { + + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.legacy:legacy-support-v4:1.0.0") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.watcher.ext:junit:1.1.5") + androidTestImplementation("androidx.watcher.espresso:espresso-core:3.5.1") + + implementation("androidx.room:room-ktx:2.6.1") + implementation("androidx.room:room-runtime:2.6.1") + kapt("androidx.room:room-compiler:2.6.1") + implementation ("androidx.work:work-runtime:2.9.0") // 使用最新版本 + + + implementation("com.applovin:applovin-sdk:12.5.0") + implementation("com.applovin.mediation:vungle-adapter:7.3.2.2") + implementation("com.applovin.mediation:bytedance-adapter:5.9.0.6.0") + implementation ("com.applovin.mediation:mintegral-adapter:16.7.51.0") + + + implementation(platform("com.google.firebase:firebase-bom:32.3.1")) + implementation("com.google.firebase:firebase-analytics-ktx") + implementation("com.google.firebase:firebase-crashlytics-ktx") +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..e7eeb82 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "256027015132", + "project_id": "applock---applock-password", + "storage_bucket": "applock---applock-password.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:256027015132:android:ebe0480b13f40f85ebc119", + "android_client_info": { + "package_name": "com.moretool.free.applock.test" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyB0L_4gDRYg77W6iJ5A71p_U8ifG_xkdpA" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..9a77eba --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,32 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + -keepclassmembers class com.moretool.free.applock.watcher.utilsmanager.MyValues{ + public static final java.lang.String DBName; + public static final int DBVersion; + } + -keepclassmembers class *{ + @androidx.room.Query ; + } + + -keep class com.moretool.free.applock.watcher.room.AppDataBase { *; } + -keep class com.moretool.free.applock.watcher.room.EntityAppDao { *; } + -keep class com.moretool.free.applock.watcher.room.EntityApp { *; } \ No newline at end of file diff --git a/app/src/androidTest/java/com/moretool/free/applock/watcher/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/moretool/free/applock/watcher/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f370fdf --- /dev/null +++ b/app/src/androidTest/java/com/moretool/free/applock/watcher/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.moretool.free.applock.watcher; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented watcher, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under watcher. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.moretool.free.applock.watcher", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1441069 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/AppLockApplication.java b/app/src/main/java/com/moretool/free/applock/watcher/AppLockApplication.java new file mode 100644 index 0000000..ef8c5be --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/AppLockApplication.java @@ -0,0 +1,52 @@ +package com.moretool.free.applock.watcher; + +import android.app.Application; +import android.content.Intent; +import android.util.Log; + +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import com.applovin.sdk.AppLovinMediationProvider; +import com.applovin.sdk.AppLovinSdk; +import com.applovin.sdk.AppLovinSdkInitializationConfiguration; +import com.applovin.sdk.AppLovinSdkSettings; +import com.moretool.free.applock.watcher.room.EntityApp; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.DataSaveManager; +import com.moretool.free.applock.watcher.utilsmanager.MyValues; +import com.moretool.free.applock.watcher.utilsmanager.RoomAction; + +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class AppLockApplication extends Application { + + public static boolean isSuccess = false; + + @Override + public void onCreate() { + super.onCreate(); + Log.d("--------------","-----------onCreate="); + MyValues.lockApplication = this; + init(); + DataSaveManager.init(this); + DataSaveManager.resetOpCount(); + Set entityApps = AppManager.queryDeviceApps(this); + RoomAction.insertRoom(entityApps); + } + + + private void init() { + AppLovinSdkInitializationConfiguration.Builder initConfigBuilder = AppLovinSdkInitializationConfiguration.builder(MyValues.YOUR_SDK_KEY, this); + initConfigBuilder.setMediationProvider(AppLovinMediationProvider.MAX); + AppLovinSdk.getInstance(this).initialize(initConfigBuilder.build(), appLovinSdkConfiguration -> { + isSuccess = true; + LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(MyValues.MAX_INIT_ACTION)); + }); +// AppLovinSdk.getInstance(this).getSettings().setVerboseLogging(true); +// AppLovinSdk.getInstance(this).showMediationDebugger(); + } + + +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/ForgroundService.java b/app/src/main/java/com/moretool/free/applock/watcher/ForgroundService.java new file mode 100644 index 0000000..e05aa81 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/ForgroundService.java @@ -0,0 +1,113 @@ +package com.moretool.free.applock.watcher; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; + +import com.moretool.free.applock.watcher.room.AppDataBase; +import com.moretool.free.applock.watcher.room.EntityApp; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.RoomAction; + +import java.util.Objects; + +public class ForgroundService extends Service { + private String lastLockPackName = ""; + private LockAction lockAction; + private Boolean isTop = true; + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + + Log.d("-------","------------ForgroundService--"+Thread.currentThread().getName()); + initNotification(); + + new Thread(new Runnable() { + @Override + public void run() { + + while (true){ + lockAction = LockAction.getActionInstance(ForgroundService.this); + while (isTop) { + String packageName = AppManager.getUsage(ForgroundService.this); + Log.d("--------------", "-----------packageName=" + packageName); + if (Objects.equals(packageName, "")) { + continue; + } + EntityApp entityApp = AppDataBase.getDbInstance().getEntityAppDao().queryByPagName(packageName); + if (entityApp == null) { + lockAction.HideLockView(); + lastLockPackName = packageName; + continue; + } + if (Objects.equals(packageName, lastLockPackName)) { + continue; + } + if (entityApp.isLocked()) { + if (!Objects.equals(packageName, lastLockPackName)) { + RoomAction.onRunMain(() -> { + lockAction.showLockView(); + }); + } else { + } + } else { + RoomAction.onRunMain(() -> { + lockAction.HideLockView(); + }); + } + lastLockPackName = packageName; + } + } + + + + } + }).start(); + + } + + private void initNotification() { + String channelName = "埋点上传"; + + String channelId = "channelId"; + // 发送通知,把service置于前台 + NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); + // 从Android 8.0开始,需要注册通知通道 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH); + notificationManager.createNotificationChannel(channel); + } + Notification notification = new NotificationCompat.Builder(this, channelId) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("埋点Log上报") + .setContentText("服务正在运行,请勿关闭") +// .setAutoCancel(false) +// .setOngoing(true) + .build(); + // 注意第一个参数不能为0 + startForeground(1, notification); + } + + @Override + public void onDestroy() { + super.onDestroy(); + stopForeground(true); + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/LockAction.java b/app/src/main/java/com/moretool/free/applock/watcher/LockAction.java new file mode 100644 index 0000000..9b64923 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/LockAction.java @@ -0,0 +1,104 @@ +package com.moretool.free.applock.watcher; + +import android.content.Context; +import android.graphics.PixelFormat; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Toast; + +import com.moretool.free.applock.watcher.databinding.LockActionViewBinding; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.DataSaveManager; +import com.moretool.free.applock.watcher.utilsmanager.custome.InputListener; + +public class LockAction { + + private Context context; + + private LockActionViewBinding lockActionViewBinding; + private WindowManager manager; + + private static LockAction lockAction; + private WindowManager.LayoutParams layParams; + + public LockAction(Context context) { + this.context = context; + manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + lockActionViewBinding = LockActionViewBinding.inflate(LayoutInflater.from(context), null, false); + setLocation(); + lockActionViewBinding.inputView.setInputListener(new InputListener() { + @Override + public void onInputComplete(String pin) { + + String curPin = DataSaveManager.getCurPin(); + if (curPin.equals(pin)) { + HideLockView(); + } else { + Toast.makeText(context, context.getString(R.string.unlock_app), Toast.LENGTH_SHORT).show(); + AppManager.startVibrator(context); + lockActionViewBinding.inputView.clearPin(); + + } + } + + @Override + public void onInputUnComplete(String pin) { + + } + }); + } + + private void setLocation() { + int type = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + type = WindowManager.LayoutParams.TYPE_PHONE; + } + DisplayMetrics displayMetrics = new DisplayMetrics(); + manager.getDefaultDisplay().getMetrics(displayMetrics); + int flag = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_FULLSCREEN | + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | + WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + layParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, type, flag, PixelFormat.RGBA_8888); +// layParams.type = type; +// layParams.width = ViewGroup.LayoutParams.MATCH_PARENT; +// layParams.height = ViewGroup.LayoutParams.MATCH_PARENT; +// +// layParams.format = PixelFormat.RGBA_8888; +// layParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | +// WindowManager.LayoutParams.FLAG_FULLSCREEN | +// WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | +// WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | +// WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + + } + + public static LockAction getActionInstance(Context context) { + if (lockAction == null) { + lockAction = new LockAction(context); + } + return lockAction; + } + + public void showLockView() { + lockActionViewBinding.inputView.clearPin(); + if (lockActionViewBinding.getRoot().getWindowToken() == null) { + manager.addView(lockActionViewBinding.getRoot(), layParams); + } + + + } + + + public void HideLockView() { + if (lockActionViewBinding.getRoot().getWindowToken() != null) { + manager.removeView(lockActionViewBinding.getRoot()); + } + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/MyService.java b/app/src/main/java/com/moretool/free/applock/watcher/MyService.java new file mode 100644 index 0000000..afe40f4 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/MyService.java @@ -0,0 +1,66 @@ +package com.moretool.free.applock.watcher; + +import android.app.IntentService; +import android.content.Intent; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.moretool.free.applock.watcher.room.AppDataBase; +import com.moretool.free.applock.watcher.room.EntityApp; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.RoomAction; + +import java.util.Objects; + + +public class MyService extends IntentService { + private String lastLockPackName = ""; + private LockAction lockAction; + private Boolean isTop = true; + + public MyService() { + super("name"); + } + + @Override + public void onDestroy() { + super.onDestroy(); + + Log.d("--------------","-----------onDestroy"); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + lockAction = LockAction.getActionInstance(this); + while (isTop) { + String packageName = AppManager.getUsage(this); + Log.d("--------------","-----------packageName="+packageName); + if (Objects.equals(packageName, "")) { + continue; + } + EntityApp entityApp = AppDataBase.getDbInstance().getEntityAppDao().queryByPagName(packageName); + if (entityApp == null) { + lockAction.HideLockView(); + lastLockPackName = packageName; + continue; + } + if (Objects.equals(packageName, lastLockPackName)) { + continue; + } + if (entityApp.isLocked()) { + if (!Objects.equals(packageName, lastLockPackName)) { + RoomAction.onRunMain(() -> { + lockAction.showLockView(); + }); + } else { + } + } else { + RoomAction.onRunMain(() -> { + lockAction.HideLockView(); + }); + } + lastLockPackName = packageName; + } + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/MyWorker.java b/app/src/main/java/com/moretool/free/applock/watcher/MyWorker.java new file mode 100644 index 0000000..0aad22c --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/MyWorker.java @@ -0,0 +1,63 @@ +package com.moretool.free.applock.watcher; + +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.core.app.JobIntentService; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import com.moretool.free.applock.watcher.room.AppDataBase; +import com.moretool.free.applock.watcher.room.EntityApp; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.RoomAction; + +import java.util.Objects; + +public class MyWorker extends JobIntentService { + private String lastLockPackName = ""; + private LockAction lockAction; + private Boolean isTop = true; + + public static void enqueueWork(Context context, Intent work) { + enqueueWork(context, MyWorker.class, 23, work); + } + + @Override + protected void onHandleWork(@NonNull Intent intent) { + lockAction = LockAction.getActionInstance(this); + while (isTop) { + String packageName = AppManager.getUsage(this); + Log.d("--------------", "-----------packageName=" + packageName); + if (Objects.equals(packageName, "")) { + continue; + } + EntityApp entityApp = AppDataBase.getDbInstance().getEntityAppDao().queryByPagName(packageName); + if (entityApp == null) { + lockAction.HideLockView(); + lastLockPackName = packageName; + continue; + } + if (Objects.equals(packageName, lastLockPackName)) { + continue; + } + if (entityApp.isLocked()) { + if (!Objects.equals(packageName, lastLockPackName)) { + RoomAction.onRunMain(() -> { + lockAction.showLockView(); + }); + } else { + } + } else { + RoomAction.onRunMain(() -> { + lockAction.HideLockView(); + }); + } + lastLockPackName = packageName; + } + + + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/adapter/AppAdapter.java b/app/src/main/java/com/moretool/free/applock/watcher/adapter/AppAdapter.java new file mode 100644 index 0000000..0d58876 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/adapter/AppAdapter.java @@ -0,0 +1,161 @@ +package com.moretool.free.applock.watcher.adapter; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.databinding.ItemAppBinding; +import com.moretool.free.applock.watcher.dealad.AdTool; +import com.moretool.free.applock.watcher.listener.LockListener; +import com.moretool.free.applock.watcher.pageview.PassWordActivity; +import com.moretool.free.applock.watcher.pageview.SuccessDialog; +import com.moretool.free.applock.watcher.room.EntityApp; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.DataSaveManager; +import com.moretool.free.applock.watcher.utilsmanager.RoomAction; + +import java.util.ArrayList; +import java.util.List; + +public class AppAdapter extends RecyclerView.Adapter { + + private List entityApps = new ArrayList<>(); + + private Context mCon; + + private boolean mLockList; + + private List ads; + + + + private LockListener lockListener; + + public AppAdapter(Context context, boolean lock, List listAd) { + this.mCon = context; + this.mLockList = lock; + ads = listAd; + + } + + public void setLockListener(LockListener lockListener) { + this.lockListener = lockListener; + } + + @NonNull + @Override + public AppViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemAppBinding itemAppBinding = ItemAppBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new AppViewHolder(itemAppBinding); + } + + public void setEntityApps(List apps) { + entityApps = apps; + notifyDataSetChanged(); + + } + + @Override + public void onBindViewHolder(@NonNull AppViewHolder holder, @SuppressLint("RecyclerView") int position) { + EntityApp entityApp = entityApps.get(position); + String label = entityApp.getLabel(); + holder.itemAppBinding.appLabel.setText(label); + Drawable icon = AppManager.getIcon(mCon, entityApp.getPagName()); + if (icon != null) { + holder.itemAppBinding.appLogo.setImageDrawable(icon); + } + holder.itemAppBinding.appLocked.setSelected(entityApp.isLocked()); + holder.itemAppBinding.appLocked.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String msg = ""; + DataSaveManager.setOpCount(); + boolean selected = holder.itemAppBinding.appLocked.isSelected(); + holder.itemAppBinding.appLocked.setSelected(!selected); + boolean selectedNew = holder.itemAppBinding.appLocked.isSelected(); + entityApp.setLocked(selectedNew); + RoomAction.updateRoom(entityApp); + if (selectedNew) { + if (!mLockList) { + entityApps.remove(entityApp); + notifyItemRemoved(position); + } + msg = String.format(mCon.getString(R.string.lock_app), label); + } else { + if (mLockList) { + entityApps.remove(entityApp); + notifyItemRemoved(position); + } + msg = String.format(mCon.getString(R.string.unlock_app), label); + } + + int opCount = DataSaveManager.getOpCount(); + if (opCount % 5 == 0) { + showMyAd(msg); + Log.d("---------tt","---------showMyAd opCount="+opCount); + } else { + Log.d("---------tt","---------no showMyAd opCount="+opCount); +// Toast.makeText(mCon, msg, Toast.LENGTH_SHORT).show(); + setCallBack(msg); + + } + + } + }); + + } + + private void setCallBack(String message){ + if(lockListener!= null){ + lockListener.onSwitch(message); + } + } + + + @Override + public int getItemCount() { + + return entityApps.size(); + } + + static class AppViewHolder extends RecyclerView.ViewHolder { + private ItemAppBinding itemAppBinding; + + public AppViewHolder(@NonNull ItemAppBinding itemView) { + super(itemView.getRoot()); + itemAppBinding = itemView; + } + } + + + public void showMyAd(String msg) { + MaxInterstitialAd ad = AdTool.randomCache(ads); + if (ad != null) { + AdTool.setStatusBack(ad, new AdTool.adStatusBack() { + @Override + public void adShowFail() { + setCallBack(msg); + } + + @Override + public void adShowHide() { + setCallBack(msg); + ads = AdTool.initAdInstance(); + } + }); + ad.showAd(); + } else { + setCallBack(msg); + } + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/adapter/VpAdapter.java b/app/src/main/java/com/moretool/free/applock/watcher/adapter/VpAdapter.java new file mode 100644 index 0000000..96edbfd --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/adapter/VpAdapter.java @@ -0,0 +1,42 @@ +package com.moretool.free.applock.watcher.adapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import com.moretool.free.applock.watcher.R; + +import java.util.List; + +public class VpAdapter extends FragmentPagerAdapter { + + private List mList; + + private String[] tabTitle; + + + public VpAdapter(@NonNull FragmentManager fm, List list, String[] strings) { + super(fm); + mList = list; + tabTitle = strings; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return mList.get(position); + } + + @Override + public int getCount() { + return mList.size(); + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return tabTitle[position]; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/dealad/AdTool.java b/app/src/main/java/com/moretool/free/applock/watcher/dealad/AdTool.java new file mode 100644 index 0000000..93e4386 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/dealad/AdTool.java @@ -0,0 +1,125 @@ +package com.moretool.free.applock.watcher.dealad; + +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxAdListener; +import com.applovin.mediation.MaxError; +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.moretool.free.applock.watcher.utilsmanager.MyValues; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class AdTool { + + private static List adList = new ArrayList<>(); + + + public static MaxInterstitialAd randomCache(List list) { + Collections.shuffle(list); + for (MaxInterstitialAd ad : list) { + if (ad.isReady()) { + Log.d("-----------","------------ad="+ad.getAdUnitId()); + return ad; + } + } + return null; + + } + + + public static List initAdInstance(){ + if(adList.isEmpty()){ + MaxInterstitialAd unit1 = new MaxInterstitialAd(MyValues.MAX_UNIT1,MyValues.lockApplication); + MaxInterstitialAd unit2 = new MaxInterstitialAd(MyValues.MAX_UNIT2,MyValues.lockApplication); + MaxInterstitialAd unit3 = new MaxInterstitialAd(MyValues.MAX_UNIT3,MyValues.lockApplication); + adList.add(unit1); + adList.add(unit2); + adList.add(unit3); + } + for(MaxInterstitialAd ad:adList){ + if(!ad.isReady()){ + Log.d("---------tt","--------start-loadAd ad="+ad.getAdUnitId()); + ad.loadAd(); + ad.setListener(new MaxAdListener() { + @Override + public void onAdLoaded(@NonNull MaxAd maxAd) { + Log.d("---------tt","---------onAdLoaded= maxAd="+maxAd.getAdUnitId()); + } + + @Override + public void onAdDisplayed(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdHidden(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdClicked(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) { + Log.d("---------tt","---------onAdLoadFailed= s="+s+" getMessage->"+maxError.getMessage()+"maxError getCode->"+maxError.getCode()); + } + + @Override + public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) { + + } + }); + + } + } + return adList; + } + + + public static void setStatusBack(MaxInterstitialAd max,adStatusBack adStatusBack){ + max.setListener(new MaxAdListener() { + @Override + public void onAdLoaded(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdDisplayed(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdHidden(@NonNull MaxAd maxAd) { + adStatusBack.adShowHide(); + } + + @Override + public void onAdClicked(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) { + + } + + @Override + public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) { + adStatusBack.adShowFail(); + } + }); + + } + + public interface adStatusBack { + void adShowFail(); + void adShowHide(); + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/listener/LockListener.java b/app/src/main/java/com/moretool/free/applock/watcher/listener/LockListener.java new file mode 100644 index 0000000..72754f8 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/listener/LockListener.java @@ -0,0 +1,7 @@ +package com.moretool.free.applock.watcher.listener; + +public interface LockListener { + void onSwitch(String msg); + + +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/listener/PermissionBtnListener.java b/app/src/main/java/com/moretool/free/applock/watcher/listener/PermissionBtnListener.java new file mode 100644 index 0000000..914cd51 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/listener/PermissionBtnListener.java @@ -0,0 +1,8 @@ +package com.moretool.free.applock.watcher.listener; + +public interface PermissionBtnListener { + + void onClickUsage(); + + void onClickOverlay(); +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/listener/QueryListener.java b/app/src/main/java/com/moretool/free/applock/watcher/listener/QueryListener.java new file mode 100644 index 0000000..ef8d614 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/listener/QueryListener.java @@ -0,0 +1,13 @@ +package com.moretool.free.applock.watcher.listener; + +import com.moretool.free.applock.watcher.room.EntityApp; + +import java.util.List; + +public interface QueryListener { + + void onQueryResult(List list); + +// void onQueryResultSingle(EntityApp entityApp); + +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/LockFragment.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/LockFragment.java new file mode 100644 index 0000000..cfc2b5c --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/LockFragment.java @@ -0,0 +1,90 @@ +package com.moretool.free.applock.watcher.pageview; + +import androidx.lifecycle.ViewModelProvider; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.adapter.AppAdapter; +import com.moretool.free.applock.watcher.dealad.AdTool; +import com.moretool.free.applock.watcher.listener.LockListener; +import com.moretool.free.applock.watcher.utilsmanager.MyValues; + +import java.util.List; + +public class LockFragment extends Fragment { + + private LockViewModel mViewModel; + private boolean isLocked; + + private RecyclerView recyclerViewApp; + private AppAdapter appAdapter; + private List listAd; + private SuccessDialog successDialog; + + public static LockFragment newInstance(boolean locked) { + LockFragment lockFragment = new LockFragment(); + Bundle bundle = new Bundle(); + bundle.putBoolean(MyValues.fragment_locked_key, locked); + lockFragment.setArguments(bundle); + return lockFragment; + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_lock, container, false); + recyclerViewApp = view.findViewById(R.id.app_recycler); + listAd = AdTool.initAdInstance(); + Log.d("-----------","------------onCreateView"); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mViewModel = new ViewModelProvider(this).get(LockViewModel.class); + Bundle arguments = getArguments(); + if (arguments != null) + isLocked = getArguments().getBoolean(MyValues.fragment_locked_key); + mViewModel.updateData(isLocked); + initAppRecycle(); + mViewModel.getMutableLiveData().observe(requireActivity(), list -> { + appAdapter.setEntityApps(list); + + }); + + } + + public void refresh() { + mViewModel.updateData(isLocked); + } + + private void initAppRecycle() { + appAdapter = new AppAdapter(requireContext(), isLocked, listAd); + appAdapter.setLockListener(new LockListener() { + @Override + public void onSwitch(String msg) { + successDialog = new SuccessDialog(requireContext(),msg); + successDialog.show(getChildFragmentManager(), ""); + } + }); + recyclerViewApp.setLayoutManager(new LinearLayoutManager(requireContext())); + recyclerViewApp.setAdapter(appAdapter); + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/LockViewModel.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/LockViewModel.java new file mode 100644 index 0000000..b4853ec --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/LockViewModel.java @@ -0,0 +1,31 @@ +package com.moretool.free.applock.watcher.pageview; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.moretool.free.applock.watcher.listener.QueryListener; +import com.moretool.free.applock.watcher.room.EntityApp; +import com.moretool.free.applock.watcher.utilsmanager.RoomAction; + +import java.util.List; + +public class LockViewModel extends ViewModel { + + private MutableLiveData> mutableLiveData = new MutableLiveData<>(); + + + public MutableLiveData> getMutableLiveData() { + return mutableLiveData; + } + + public void updateData(boolean lock){ + RoomAction.queryRoom(lock, new QueryListener() { + @Override + public void onQueryResult(List list) { + mutableLiveData.setValue(list); + } + }); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/MainActivity.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/MainActivity.java new file mode 100644 index 0000000..1abdef2 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/MainActivity.java @@ -0,0 +1,247 @@ +package com.moretool.free.applock.watcher.pageview; + +import android.annotation.SuppressLint; +import android.app.NotificationManager; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; +import androidx.work.WorkManager; + +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.google.android.material.tabs.TabLayout; +import com.moretool.free.applock.watcher.MyService; +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.adapter.VpAdapter; +import com.moretool.free.applock.watcher.dealad.AdTool; +import com.moretool.free.applock.watcher.listener.PermissionBtnListener; +import com.moretool.free.applock.watcher.utilsmanager.AppManager; +import com.moretool.free.applock.watcher.utilsmanager.MyValues; +import com.moretool.free.applock.watcher.utilsmanager.Permission; + +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends AppCompatActivity implements PermissionBtnListener { + + private PermissionDialog dialog; + private TabLayout tabLayout; + + private ViewPager viewPager; + + private String[] tabTitle; + + private ImageView menu; + private DrawerLayout drawerLayout; + private RelativeLayout layoutReset; + private List listAd; + private TextView tvVersion; + + private WorkManager workManager; + + + @SuppressLint("MissingInflatedId") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //WorkManager + workManager = WorkManager.getInstance(this); + setContentView(R.layout.activity_main); + tabLayout = findViewById(R.id.tab_layout); + viewPager = findViewById(R.id.view_pager); + menu = findViewById(R.id.im_menu); + tvVersion = findViewById(R.id.tv_version); + listAd = AdTool.initAdInstance(); + + layoutReset = findViewById(R.id.re_reset); + drawerLayout = findViewById(R.id.drawer); + menu.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + drawerLayout.openDrawer(Gravity.LEFT); + } + }); + + startService(new Intent(this, MyService.class)); + +// startWork(); + initTabVp(); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { +// if (ContextCompat.checkSelfPermission(this, Manifest.permission.FOREGROUND_SERVICE) +// != PackageManager.PERMISSION_GRANTED) { +// ActivityCompat.requestPermissions(this, +// new String[]{Manifest.permission.FOREGROUND_SERVICE}, +// 12); +// } +// } +// checkPermission(); + + + getPermission(); + + layoutReset.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showMyAd(); + } + }); + + String appVersion = AppManager.getAppVersion(this); + if (appVersion == null) { + tvVersion.setText("V1.0.0"); + } else { + String format = String.format(getString(R.string.app_v), appVersion); + tvVersion.setText(format); + } + + } + + + private void checkPermission() { + NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if(manager.areNotificationsEnabled()){ + + }else { + Intent localIntent = new Intent(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0及以上 + localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); + localIntent.setData(Uri.fromParts("package", getPackageName(), null)); + } else {//5.0以上到8.0以下 + localIntent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); + localIntent.putExtra("app_package", getPackageName()); + localIntent.putExtra("app_uid", getApplicationInfo().uid); + } + + + } + } + + } + private void startWork() { + +// Intent workIntent = new Intent(this, MyWorker.class); +// MyWorker.enqueueWork(this, workIntent); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// startForegroundService(new Intent(this, ForgroundService.class)); +// } else { +// startService(new Intent(this, ForgroundService.class)); +// } + + + } + + + public void showMyAd() { + MaxInterstitialAd ad = AdTool.randomCache(listAd); + if (ad != null) { + AdTool.setStatusBack(ad, new AdTool.adStatusBack() { + @Override + public void adShowFail() { + interReset(); + + } + + @Override + public void adShowHide() { + interReset(); + listAd = AdTool.initAdInstance(); + } + }); + ad.showAd(MainActivity.this); + } else { + interReset(); + } + } + + private void interReset() { + Intent intent = new Intent(MainActivity.this, PassWordActivity.class); + intent.putExtra(MyValues.password_key, MyValues.password_type2); + startActivity(intent); + } + + @SuppressLint("MissingInflatedId") + private void initTabVp() { + tabTitle = new String[]{getString(R.string.unlocked), getString(R.string.Locked)}; + List fragmentList = new ArrayList<>(); + fragmentList.add(LockFragment.newInstance(false)); + fragmentList.add(LockFragment.newInstance(true)); + VpAdapter vpAdapter = new VpAdapter(getSupportFragmentManager(), fragmentList, tabTitle); + viewPager.setAdapter(vpAdapter); + + tabLayout.setupWithViewPager(viewPager); + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + LockFragment fragment = (LockFragment) fragmentList.get(position); + fragment.refresh(); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + private void getPermission() { + boolean getUsagePermission = Permission.isGetUsagePermission(this); + boolean overlays = Permission.isOverlays(this); + if (getUsagePermission && overlays) { + + } else { + if (dialog == null) { + dialog = new PermissionDialog(this); + dialog.setPermissionBtnListener(this); + } + dialog.show(getSupportFragmentManager(), ""); + } + } + + @Override + public void onClickUsage() { + Permission.requestUsage(this, MyValues.request_code_usage); + } + + @Override + public void onClickOverlay() { + Permission.requestOverlays(this, MyValues.request_code_overlay); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case MyValues.request_code_usage, MyValues.request_code_overlay: + hideDialog(); + break; + } + } + + private void hideDialog() { + if (Permission.allAllowPermission(this)) { + if (dialog != null) { + dialog.dismiss(); + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/PassWordActivity.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/PassWordActivity.java new file mode 100644 index 0000000..4aaaa8d --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/PassWordActivity.java @@ -0,0 +1,122 @@ +package com.moretool.free.applock.watcher.pageview; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.dealad.AdTool; +import com.moretool.free.applock.watcher.utilsmanager.DataSaveManager; +import com.moretool.free.applock.watcher.utilsmanager.MyValues; +import com.moretool.free.applock.watcher.utilsmanager.custome.InputListener; +import com.moretool.free.applock.watcher.utilsmanager.custome.InputNumberView; + +import java.util.List; +import java.util.Objects; + +public class PassWordActivity extends AppCompatActivity { + + private int mType; + private TextView tvHint; + private TextView textButton; + private InputNumberView inputNumberView; + private String curPin; + private ImageView imBack; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pass_word); + mType = getIntent().getIntExtra(MyValues.password_key, MyValues.password_type0); + tvHint = findViewById(R.id.tv_hint); + textButton = findViewById(R.id.tv_button); + imBack = findViewById(R.id.imBack); + inputNumberView = findViewById(R.id.input_view); + initView(); + + } + + private void initView() { + imBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + if (mType == MyValues.password_type0) { + tvHint.setText(getString(R.string.enter_your_pin)); + textButton.setText(getString(R.string.Continue)); + imBack.setVisibility(View.VISIBLE); + textButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(PassWordActivity.this, PassWordActivity.class); + intent.putExtra(MyValues.password_key, MyValues.password_type1); + intent.putExtra(MyValues.password_pin_key, curPin); + startActivity(intent); + } + }); + } else if (mType == MyValues.password_type1) { + imBack.setVisibility(View.VISIBLE); + tvHint.setText(getString(R.string.verify_your_pin)); + textButton.setText(getString(R.string.Save)); + String setPin = getIntent().getStringExtra(MyValues.password_pin_key); + textButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (Objects.equals(setPin, curPin)) { + DataSaveManager.setCurPin(curPin); + Intent intent = new Intent(PassWordActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } else { + Toast.makeText(PassWordActivity.this, getString(R.string.pwd_verifi_fail), Toast.LENGTH_SHORT).show(); + inputNumberView.clearPin(); + textButton.setVisibility(View.GONE); + } + + } + }); + } else if (mType == MyValues.password_type2) { + + imBack.setVisibility(View.VISIBLE); + tvHint.setText(getString(R.string.reset_your_pin)); + textButton.setText(getString(R.string.Save)); + textButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + resetPin(); + } + }); + } + + inputNumberView.setInputListener(new InputListener() { + @Override + public void onInputComplete(String pin) { + textButton.setVisibility(View.VISIBLE); + curPin = pin; + } + + @Override + public void onInputUnComplete(String pin) { + textButton.setVisibility(View.GONE); + curPin = pin; + + } + }); + } + + + private void resetPin(){ + DataSaveManager.setCurPin(curPin); + Toast.makeText(PassWordActivity.this, getString(R.string.reset_success), Toast.LENGTH_SHORT).show(); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/PermissionDialog.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/PermissionDialog.java new file mode 100644 index 0000000..fef97ba --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/PermissionDialog.java @@ -0,0 +1,88 @@ +package com.moretool.free.applock.watcher.pageview; + + +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; + +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.databinding.DialogPermissionBinding; +import com.moretool.free.applock.watcher.listener.PermissionBtnListener; +import com.moretool.free.applock.watcher.utilsmanager.Permission; + +public class PermissionDialog extends DialogFragment { + private DialogPermissionBinding dialogPermissionBinding; + private PermissionBtnListener permissionBtnListener; + private Context mContext; + + + public PermissionDialog(Context context) { + mContext = context; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + dialogPermissionBinding = DialogPermissionBinding.inflate(inflater, null, false); + init(); + return dialogPermissionBinding.getRoot(); + } + + public void setPermissionBtnListener(PermissionBtnListener permissionBtnListener) { + this.permissionBtnListener = permissionBtnListener; + } + + + @Override + public void onResume() { + super.onResume(); + refreshBtnStatus(mContext); + } + + public void refreshBtnStatus(Context context) { + boolean getUsagePermission = Permission.isGetUsagePermission(context); + boolean isOverlay = Permission.isOverlays(context); + dialogPermissionBinding.tvUsageButton.setSelected(getUsagePermission); + dialogPermissionBinding.tvOverlayButton.setSelected(isOverlay); + } + + private void init() { + + setCancelable(false); + Window window = getDialog().getWindow(); + window.setBackgroundDrawableResource(R.color.rgb_00000000); + window.getDecorView().setPadding(0, 0, 0, 0); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(wlp); + + dialogPermissionBinding.tvUsageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!dialogPermissionBinding.tvUsageButton.isSelected()) { + permissionBtnListener.onClickUsage(); + } + } + }); + + dialogPermissionBinding.tvOverlayButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!dialogPermissionBinding.tvOverlayButton.isSelected()) { + permissionBtnListener.onClickOverlay(); + } + } + }); + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/SuccessDialog.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/SuccessDialog.java new file mode 100644 index 0000000..25db0b0 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/SuccessDialog.java @@ -0,0 +1,66 @@ +package com.moretool.free.applock.watcher.pageview; + + +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; + +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.databinding.DialogSuccessBinding; +import com.moretool.free.applock.watcher.listener.PermissionBtnListener; +import com.moretool.free.applock.watcher.utilsmanager.Permission; + +public class SuccessDialog extends DialogFragment { + private DialogSuccessBinding successBinding; + private PermissionBtnListener permissionBtnListener; + private Context mContext; + private String msg; + + + public SuccessDialog(Context context,String message) { + mContext = context; + msg = message; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + successBinding = DialogSuccessBinding.inflate(inflater, null, false); + init(); + return successBinding.getRoot(); + } + + public void setPermissionBtnListener(PermissionBtnListener permissionBtnListener) { + this.permissionBtnListener = permissionBtnListener; + } + + + private void init() { + setCancelable(true); + Window window = getDialog().getWindow(); + window.setBackgroundDrawableResource(R.color.rgb_00000000); + window.getDecorView().setPadding(0, 0, 0, 0); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(wlp); + successBinding.title.setText(msg); + successBinding.okBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/pageview/WelComeActivity.java b/app/src/main/java/com/moretool/free/applock/watcher/pageview/WelComeActivity.java new file mode 100644 index 0000000..9d9949e --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/pageview/WelComeActivity.java @@ -0,0 +1,127 @@ +package com.moretool.free.applock.watcher.pageview; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; + +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.moretool.free.applock.watcher.AppLockApplication; +import com.moretool.free.applock.watcher.R; +import com.moretool.free.applock.watcher.dealad.AdTool; +import com.moretool.free.applock.watcher.utilsmanager.DataSaveManager; +import com.moretool.free.applock.watcher.utilsmanager.MyValues; + +import java.util.List; + +public class WelComeActivity extends AppCompatActivity { + + private Handler handler = new Handler(); + private Runnable runnable; + private int time = 120; + + private List list; + private boolean hasShow = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_wel_come); + Log.d("------", "---------onCreate"); + + runnable = new Runnable() { + @Override + public void run() { + Log.d("-----run time-", "---------run time=" + time); + if (time > 0) { + if (!hasShow) { + showMyAd(false); + } + time--; + handler.postDelayed(this, 100); + } else { + if (!hasShow) { + showMyAd(true); + } + } + + } + }; + + if (AppLockApplication.isSuccess) { + startLoad(); + } else { + receiver(); + } + + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + handler.removeCallbacks(runnable); + } + + + public void showMyAd(boolean doAction) { + MaxInterstitialAd ad = AdTool.randomCache(list); + if (ad != null) { + hasShow = true; + handler.removeCallbacks(runnable); + AdTool.setStatusBack(ad, new AdTool.adStatusBack() { + @Override + public void adShowFail() { + welComplete(); + + + } + + @Override + public void adShowHide() { + welComplete(); + + } + }); + ad.showAd( ); + } else { + hasShow = false; + if (doAction) { + welComplete(); + } + } + } + + private void receiver() { + LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + startLoad(); + + } + }, new IntentFilter(MyValues.MAX_INIT_ACTION)); + } + + private void startLoad() { + list = AdTool.initAdInstance(); + handler.post(runnable); + } + + private void welComplete() { + String curPin = DataSaveManager.getCurPin(); + if (curPin.isEmpty()) { + startActivity(new Intent(WelComeActivity.this, PassWordActivity.class)); + } else { + startActivity(new Intent(WelComeActivity.this, MainActivity.class)); + } + finish(); + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/moretool/free/applock/watcher/room/AppDataBase.java b/app/src/main/java/com/moretool/free/applock/watcher/room/AppDataBase.java new file mode 100644 index 0000000..f71fc77 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/room/AppDataBase.java @@ -0,0 +1,46 @@ +package com.moretool.free.applock.watcher.room; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import com.moretool.free.applock.watcher.utilsmanager.MyValues; + + +@Database( + entities = {EntityApp.class}, + version = MyValues.DBVersion, + exportSchema = false +) +public abstract class AppDataBase extends RoomDatabase { + private static AppDataBase appDataBaseInstance; + + public abstract EntityAppDao getEntityAppDao(); + public static synchronized AppDataBase getDbInstance(){ + if(appDataBaseInstance == null){ + appDataBaseInstance = Room.databaseBuilder(MyValues.lockApplication,AppDataBase.class,MyValues.DBName).build(); + } + return appDataBaseInstance; + } + + + + + + + + + + + + + + + + + + + + + +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/room/EntityApp.java b/app/src/main/java/com/moretool/free/applock/watcher/room/EntityApp.java new file mode 100644 index 0000000..752aa3b --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/room/EntityApp.java @@ -0,0 +1,53 @@ +package com.moretool.free.applock.watcher.room; + + +import androidx.room.Entity; +import androidx.room.Index; +import androidx.room.PrimaryKey; + +import com.moretool.free.applock.watcher.utilsmanager.MyValues; + +@Entity(tableName = MyValues.DB_TABLE_NAME,indices = {@Index(value = {"pagName"}, unique = true)}) +public class EntityApp { + + @PrimaryKey(autoGenerate = true) + private int id; + + private String pagName; + + private String label; + private boolean locked; + + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setPagName(String pagName) { + this.pagName = pagName; + } + + public String getPagName() { + return pagName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/room/EntityAppDao.java b/app/src/main/java/com/moretool/free/applock/watcher/room/EntityAppDao.java new file mode 100644 index 0000000..d943721 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/room/EntityAppDao.java @@ -0,0 +1,28 @@ +package com.moretool.free.applock.watcher.room; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; +import androidx.room.Update; + +import java.util.List; + +@Dao +public interface EntityAppDao { + + + + @Query("select * from app_table where pagName=:pagName") + EntityApp queryByPagName(String pagName); + + + @Update + void updateData(EntityApp entityApp); + + @Insert(onConflict = OnConflictStrategy.IGNORE) + void insertData(EntityApp entityApp); + + @Query("select * from app_table where locked=:isLock") + List findApp(boolean isLock); +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/AppManager.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/AppManager.java new file mode 100644 index 0000000..fd7af31 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/AppManager.java @@ -0,0 +1,99 @@ +package com.moretool.free.applock.watcher.utilsmanager; + +import android.app.Service; +import android.app.usage.UsageEvents; +import android.app.usage.UsageStatsManager; +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.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.os.Vibrator; +import android.text.TextUtils; +import android.util.ArraySet; + +import com.moretool.free.applock.watcher.room.EntityApp; + +import java.util.List; +import java.util.Set; + +public class AppManager { + + + public static Set queryDeviceApps(Context con) { + + Set list = new ArraySet<>(); + PackageManager packageManager = con.getPackageManager(); + + Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + List resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL); + + for (ResolveInfo info : resolveInfoList) { + String pkgName = info.activityInfo.packageName; + if (pkgName == con.getPackageName()) { + continue; + } + EntityApp entityApp = new EntityApp(); + entityApp.setPagName(pkgName); + try { + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(pkgName, PackageManager.GET_UNINSTALLED_PACKAGES); + CharSequence applicationLabel = packageManager.getApplicationLabel(applicationInfo); + entityApp.setLabel(applicationLabel.toString()); + list.add(entityApp); + } catch (PackageManager.NameNotFoundException e) { + throw new RuntimeException(e); + } + + } + return list; + + } + public static String getAppVersion(Context context) { + String versionN = ""; + try { + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + versionN = ((PackageInfo) packageInfo).versionName; + } catch (PackageManager.NameNotFoundException e) { + return null; + } + return versionN; + } + public static void startVibrator(Context context) { + Vibrator vib = (Vibrator) context.getSystemService(Service.VIBRATOR_SERVICE); + vib.vibrate(400); + } + + public static String getUsage(Context context) { + UsageStatsManager sUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); + long endTime = System.currentTimeMillis(); + long beginTime = endTime - 10000; + String result = ""; + UsageEvents.Event event = new UsageEvents.Event(); + UsageEvents usageEvents = sUsageStatsManager.queryEvents(beginTime, endTime); + while (usageEvents.hasNextEvent()) { + usageEvents.getNextEvent(event); + if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { + result = event.getPackageName(); + } + } + if (!TextUtils.isEmpty(result)) { + return result; + } else { + return ""; + } + } + + public static Drawable getIcon(Context context, String packageName) { + PackageManager manager = context.getPackageManager(); + Drawable icon; + try { + icon = manager.getApplicationIcon(manager.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES)); + } catch (PackageManager.NameNotFoundException e) { + return null; + } + return icon; + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/DataSaveManager.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/DataSaveManager.java new file mode 100644 index 0000000..c1e4a3c --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/DataSaveManager.java @@ -0,0 +1,47 @@ +package com.moretool.free.applock.watcher.utilsmanager; + +import static android.content.Context.MODE_PRIVATE; + +import android.content.Context; +import android.content.SharedPreferences; + +public class DataSaveManager { + + private static SharedPreferences sharedPreferences; + private static SharedPreferences.Editor editor; + + public static void init(Context context) { + if (sharedPreferences == null) { + sharedPreferences = context.getSharedPreferences(MyValues.SPName, MODE_PRIVATE); + } + if (editor == null) { + editor = sharedPreferences.edit(); + } + } + + public static void setCurPin(String pin) { + editor.putString(MyValues.SP_KEY_CUR_PIN, pin); + editor.apply(); + } + + public static String getCurPin() { + return sharedPreferences.getString(MyValues.SP_KEY_CUR_PIN, ""); + } + + + public static void setOpCount() { + MyValues.OP_COUNT = MyValues.OP_COUNT + 1; + editor.putInt(MyValues.SP_KEY_OP_COUNT, MyValues.OP_COUNT); + editor.apply(); + } + + public static void resetOpCount() { + MyValues.OP_COUNT = 0; + editor.putInt(MyValues.SP_KEY_OP_COUNT, MyValues.OP_COUNT); + editor.apply(); + } + + public static int getOpCount() { + return sharedPreferences.getInt(MyValues.SP_KEY_OP_COUNT, MyValues.OP_COUNT); + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/MyValues.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/MyValues.java new file mode 100644 index 0000000..313c500 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/MyValues.java @@ -0,0 +1,49 @@ +package com.moretool.free.applock.watcher.utilsmanager; + +import com.moretool.free.applock.watcher.AppLockApplication; + +public class MyValues { + public static final String DBName = "app_room"; + + public static final String SPName = "shared_name"; + public static final int DBVersion = 1; + + public static final String DB_TABLE_NAME = "app_table"; + public static AppLockApplication lockApplication; + public static String password_key = "password_key"; + public static String password_pin_key = "password_pin_key"; + public static int password_type0 = 0; + public static int password_type1 = 1; + public static int password_type2 = 2; + + public static String SP_KEY_CUR_PIN = "sp_key_cur_pin"; + + + public static String SP_KEY_OP_COUNT = "sp_key_op_count"; + + public static int OP_COUNT = 0; + + public static final int request_code_usage = 1; + public static final int request_code_overlay = 2; + + public static String fragment_locked_key = "fragment_type"; + + public static final String YOUR_SDK_KEY = "gtOv1uuZoSrXBVgJLKgwRTRrMdPLV_x0C1uFOPrTCBTyJzWJNcFniU1uxQBHoOdWAA7o5CWPlaCrm5qKqe5iHx"; + + public static final String MAX_INIT_ACTION = "ad_action"; + public static final String MAX_UNIT1 = "7909c224e62ecf91"; + + public static final String MAX_UNIT2 = "7bd117f19afcdc14"; + public static final String MAX_UNIT3 = "48f16f94dc4b5c5b"; + + +// public static final String MAX_UNIT1 = "52a884c9d906cce6"; +// public static final String MAX_UNIT2 = "f024cc276320bb25"; +// public static final String MAX_UNIT3 = "48f16f94dc4b5c5b"; + + + + + + +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/Permission.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/Permission.java new file mode 100644 index 0000000..cf60135 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/Permission.java @@ -0,0 +1,49 @@ +package com.moretool.free.applock.watcher.utilsmanager; + +import android.app.Activity; +import android.app.AppOpsManager; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.provider.Settings; + +public class Permission { + + public static boolean isGetUsagePermission(Context context) { + AppOpsManager opsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + int mode = opsManager.checkOpNoThrow("android:get_usage_stats", android.os.Process.myUid(), context.getPackageName()); + return mode == AppOpsManager.MODE_ALLOWED; + } + + public static void requestOverlays(Activity activity, int requestCode) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + activity.getPackageName())); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { +// //8.0 +// } else { +// // 6.0、7.0、9.0 +// Uri uri = Uri.fromParts("package", activity.getPackageName(), null); +// intent.setData(uri); +// } + activity.startActivityForResult(intent, requestCode); + } + + + public static void requestUsage(Activity context, int requestCode) { + Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); +// Uri uri = Uri.fromParts("package", context.getPackageName(), null); +// intent.setData(uri); + context.startActivityForResult(intent, requestCode); + } + + public static boolean isOverlays(Context context) { + return Settings.canDrawOverlays(context); + } + + + public static boolean allAllowPermission(Context context) { + boolean getUsagePermission = Permission.isGetUsagePermission(context); + boolean overlays = Permission.isOverlays(context); + return getUsagePermission && overlays; + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/RoomAction.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/RoomAction.java new file mode 100644 index 0000000..adcf704 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/RoomAction.java @@ -0,0 +1,86 @@ +package com.moretool.free.applock.watcher.utilsmanager; + +import android.os.Handler; +import android.os.Looper; + +import com.moretool.free.applock.watcher.listener.QueryListener; +import com.moretool.free.applock.watcher.room.AppDataBase; +import com.moretool.free.applock.watcher.room.EntityApp; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class RoomAction { + + private static ExecutorService uiService; + private static Handler mainHandler; + + private static ExecutorService getUiService() { + if (uiService == null) { + uiService = Executors.newSingleThreadExecutor(); + } + return uiService; + } + + private static Handler getMainHandler() { + if (mainHandler == null) { + mainHandler = new Handler(Looper.getMainLooper()); + } + return mainHandler; + } + + public static void insertRoom(Set list) { + getUiService().execute(new Runnable() { + @Override + public void run() { + for (EntityApp entityApp : list) { + AppDataBase.getDbInstance().getEntityAppDao().insertData(entityApp); + } + + } + }); + } + + + public static void queryRoom(boolean isLock, QueryListener listener) { + getUiService().execute(new Runnable() { + @Override + public void run() { + List appList = AppDataBase.getDbInstance().getEntityAppDao().findApp(isLock); + getMainHandler().post(() -> { + listener.onQueryResult(appList); + }); + + } + }); + } + + + public static void onRunMain(Runnable runnable){ + getMainHandler().post(runnable); + + } + +// public static void queryBYName(String name, QueryListener listener) { +// getUiService().execute(new Runnable() { +// @Override +// public void run() { +// EntityApp entityApp = AppDataBase.getDbInstance().getEntityAppDao().queryByPagName(name); +// getMainHandler().post(() -> { +// listener.onQueryResultSingle(entityApp); +// }); +// } +// }); +// } + + public static void updateRoom(EntityApp entityApp) { + getUiService().execute(new Runnable() { + @Override + public void run() { + AppDataBase.getDbInstance().getEntityAppDao().updateData(entityApp); + } + }); + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/InputListener.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/InputListener.java new file mode 100644 index 0000000..8556b64 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/InputListener.java @@ -0,0 +1,9 @@ +package com.moretool.free.applock.watcher.utilsmanager.custome; + +public interface InputListener { + + void onInputComplete(String pin); + + void onInputUnComplete(String pin); + +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/InputNumberView.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/InputNumberView.java new file mode 100644 index 0000000..a046954 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/InputNumberView.java @@ -0,0 +1,96 @@ +package com.moretool.free.applock.watcher.utilsmanager.custome; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.moretool.free.applock.watcher.R; + +public class InputNumberView extends FrameLayout { + + private RecyclerView recyclerViewNumber; + private RecyclerView recyclerViewPin; + + private Context mContext; + + private StringBuilder myPin; + private int pinLength = 4; + + private InputListener inputListener; + private PinAdapter pinAdapter; + + @SuppressLint("MissingInflatedId") + public InputNumberView(Context context) { + super(context); + initView(context); + } + + public void setInputListener(InputListener inputListener) { + this.inputListener = inputListener; + } + + public InputNumberView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + + private void initView(Context context) { + myPin = new StringBuilder(); + mContext = context; + View inflate = LayoutInflater.from(context).inflate(R.layout.input_view, null); + recyclerViewNumber = inflate.findViewById(R.id.recycler_view_number); + recyclerViewPin = inflate.findViewById(R.id.recycler_view_pin); + addView(inflate); + + + NumberAdapter numberAdapter = new NumberAdapter(); + recyclerViewNumber.setAdapter(numberAdapter); + recyclerViewNumber.setLayoutManager(new GridLayoutManager(mContext, 3)); + + + pinAdapter = new PinAdapter(); + recyclerViewPin.setAdapter(pinAdapter); + recyclerViewPin.setLayoutManager(new LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false)); + + + numberAdapter.setNumberClick(new NumberClick() { + @Override + public void onNumber(String number) { + if (myPin.length() >= pinLength) { + myPin.delete(0, myPin.length()); + } + myPin.append(number); + pinAdapter.updateItem(myPin.toString()); + if (myPin.length() == pinLength) { + inputListener.onInputComplete(myPin.toString()); + }else { + inputListener.onInputUnComplete(myPin.toString()); + } + } + + @Override + public void onDelete() { + if (myPin.length() >= 1) { + myPin.deleteCharAt(myPin.length() - 1); + } + pinAdapter.updateItem(myPin.toString()); + if (myPin.length() < pinLength) { + inputListener.onInputUnComplete(myPin.toString()); + } + } + }); + } + + public void clearPin(){ + myPin.delete(0, myPin.length()); + pinAdapter.updateItem(myPin.toString()); + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/NumberAdapter.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/NumberAdapter.java new file mode 100644 index 0000000..304c673 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/NumberAdapter.java @@ -0,0 +1,78 @@ +package com.moretool.free.applock.watcher.utilsmanager.custome; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.moretool.free.applock.watcher.databinding.ItemNumberViewBinding; + +import java.util.Objects; + +public class NumberAdapter extends RecyclerView.Adapter { + private NumberClick numberClick; + + public void setNumberClick(NumberClick numberClick) { + this.numberClick = numberClick; + } + + private String[] numbers = new String[]{"1","2","3","4","5","6","7","8","9","-1","0","-2"}; + + + @NonNull + @Override + public NumberVh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemNumberViewBinding numberViewBinding = ItemNumberViewBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + + return new NumberVh(numberViewBinding); + } + + @Override + public void onBindViewHolder(@NonNull NumberVh holder, int position) { + String number = numbers[position]; + if(position == 9&& Objects.equals(number, "-1")){ + holder.numberViewBinding.linear.setVisibility(View.GONE); + }else if(position == 11&&Objects.equals(number, "-2")){ + holder.numberViewBinding.linear.setVisibility(View.VISIBLE); + holder.numberViewBinding.textNumber.setVisibility(View.GONE); + holder.numberViewBinding.imDelete.setVisibility(View.VISIBLE); + }else { + holder.numberViewBinding.linear.setVisibility(View.VISIBLE); + holder.numberViewBinding.textNumber.setText(numbers[position]); + holder.numberViewBinding.imDelete.setVisibility(View.GONE); + } + + holder.numberViewBinding.textNumber.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + numberClick.onNumber(number); + } + }); + + holder.numberViewBinding.imDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + numberClick.onDelete(); + } + }); + + + + } + + @Override + public int getItemCount() { + return 12; + } + + public static class NumberVh extends RecyclerView.ViewHolder{ + + private ItemNumberViewBinding numberViewBinding; + public NumberVh(@NonNull ItemNumberViewBinding binding) { + super(binding.getRoot()); + numberViewBinding = binding; + } + } +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/NumberClick.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/NumberClick.java new file mode 100644 index 0000000..855d511 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/NumberClick.java @@ -0,0 +1,8 @@ +package com.moretool.free.applock.watcher.utilsmanager.custome; + +public interface NumberClick { + + void onNumber(String number); + + void onDelete(); +} diff --git a/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/PinAdapter.java b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/PinAdapter.java new file mode 100644 index 0000000..83798d3 --- /dev/null +++ b/app/src/main/java/com/moretool/free/applock/watcher/utilsmanager/custome/PinAdapter.java @@ -0,0 +1,59 @@ +package com.moretool.free.applock.watcher.utilsmanager.custome; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.moretool.free.applock.watcher.databinding.ItemNumberViewBinding; +import com.moretool.free.applock.watcher.databinding.ItemPinViewBinding; + +public class PinAdapter extends RecyclerView.Adapter { + + private String mPin = ""; + + + @NonNull + @Override + public NumberVh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemPinViewBinding binding = ItemPinViewBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + + return new NumberVh(binding); + } + + @Override + public void onBindViewHolder(@NonNull NumberVh holder, int position) { + if (position == 0) { + holder.pinViewBinding.viewSpace.setVisibility(View.GONE); + } else { + holder.pinViewBinding.viewSpace.setVisibility(View.VISIBLE); + } + if (position > mPin.length()-1) { + holder.pinViewBinding.imPin.setSelected(false); + }else { + holder.pinViewBinding.imPin.setSelected(true); + } + } + + public void updateItem(String pin) { + mPin = pin; + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return 4; + } + + public static class NumberVh extends RecyclerView.ViewHolder { + + private ItemPinViewBinding pinViewBinding; + + public NumberVh(@NonNull ItemPinViewBinding binding) { + super(binding.getRoot()); + pinViewBinding = binding; + } + } +} diff --git a/app/src/main/res/color/selector_tab_color.xml b/app/src/main/res/color/selector_tab_color.xml new file mode 100644 index 0000000..97484ca --- /dev/null +++ b/app/src/main/res/color/selector_tab_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml new file mode 100644 index 0000000..917dc9c --- /dev/null +++ b/app/src/main/res/drawable/back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/back_white.xml b/app/src/main/res/drawable/back_white.xml new file mode 100644 index 0000000..c5c14f5 --- /dev/null +++ b/app/src/main/res/drawable/back_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..7f83e7e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_drawer_menu.xml b/app/src/main/res/drawable/bg_drawer_menu.xml new file mode 100644 index 0000000..2c61932 --- /dev/null +++ b/app/src/main/res/drawable/bg_drawer_menu.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_item_number.xml b/app/src/main/res/drawable/bg_item_number.xml new file mode 100644 index 0000000..c67e844 --- /dev/null +++ b/app/src/main/res/drawable/bg_item_number.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_permiasion_dialog.xml b/app/src/main/res/drawable/bg_permiasion_dialog.xml new file mode 100644 index 0000000..0221b83 --- /dev/null +++ b/app/src/main/res/drawable/bg_permiasion_dialog.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/delete.xml b/app/src/main/res/drawable/delete.xml new file mode 100644 index 0000000..417ea52 --- /dev/null +++ b/app/src/main/res/drawable/delete.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/go_icon.xml b/app/src/main/res/drawable/go_icon.xml new file mode 100644 index 0000000..89661db --- /dev/null +++ b/app/src/main/res/drawable/go_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/item_pin_normal.xml b/app/src/main/res/drawable/item_pin_normal.xml new file mode 100644 index 0000000..1ea0167 --- /dev/null +++ b/app/src/main/res/drawable/item_pin_normal.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/item_pin_selected.xml b/app/src/main/res/drawable/item_pin_selected.xml new file mode 100644 index 0000000..cd1caf8 --- /dev/null +++ b/app/src/main/res/drawable/item_pin_selected.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/lock.xml b/app/src/main/res/drawable/lock.xml new file mode 100644 index 0000000..397b8f1 --- /dev/null +++ b/app/src/main/res/drawable/lock.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/menu.xml b/app/src/main/res/drawable/menu.xml new file mode 100644 index 0000000..1853387 --- /dev/null +++ b/app/src/main/res/drawable/menu.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/permssion_normal.xml b/app/src/main/res/drawable/permssion_normal.xml new file mode 100644 index 0000000..2bed610 --- /dev/null +++ b/app/src/main/res/drawable/permssion_normal.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/permssion_selected.xml b/app/src/main/res/drawable/permssion_selected.xml new file mode 100644 index 0000000..82c84b9 --- /dev/null +++ b/app/src/main/res/drawable/permssion_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_app_lock.xml b/app/src/main/res/drawable/selector_app_lock.xml new file mode 100644 index 0000000..e5d6aac --- /dev/null +++ b/app/src/main/res/drawable/selector_app_lock.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_permssion.xml b/app/src/main/res/drawable/selector_permssion.xml new file mode 100644 index 0000000..aba777e --- /dev/null +++ b/app/src/main/res/drawable/selector_permssion.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pin.xml b/app/src/main/res/drawable/selector_pin.xml new file mode 100644 index 0000000..9eef261 --- /dev/null +++ b/app/src/main/res/drawable/selector_pin.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/unlock.xml b/app/src/main/res/drawable/unlock.xml new file mode 100644 index 0000000..411241b --- /dev/null +++ b/app/src/main/res/drawable/unlock.xml @@ -0,0 +1,12 @@ + + + + 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..46edb82 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pass_word.xml b/app/src/main/res/layout/activity_pass_word.xml new file mode 100644 index 0000000..5c41225 --- /dev/null +++ b/app/src/main/res/layout/activity_pass_word.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_wel_come.xml b/app/src/main/res/layout/activity_wel_come.xml new file mode 100644 index 0000000..f1e7aab --- /dev/null +++ b/app/src/main/res/layout/activity_wel_come.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_permission.xml b/app/src/main/res/layout/dialog_permission.xml new file mode 100644 index 0000000..85f0328 --- /dev/null +++ b/app/src/main/res/layout/dialog_permission.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_success.xml b/app/src/main/res/layout/dialog_success.xml new file mode 100644 index 0000000..7fdcc26 --- /dev/null +++ b/app/src/main/res/layout/dialog_success.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_lock.xml b/app/src/main/res/layout/fragment_lock.xml new file mode 100644 index 0000000..e93c064 --- /dev/null +++ b/app/src/main/res/layout/fragment_lock.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/input_view.xml b/app/src/main/res/layout/input_view.xml new file mode 100644 index 0000000..815d014 --- /dev/null +++ b/app/src/main/res/layout/input_view.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_app.xml b/app/src/main/res/layout/item_app.xml new file mode 100644 index 0000000..8bff737 --- /dev/null +++ b/app/src/main/res/layout/item_app.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_number_view.xml b/app/src/main/res/layout/item_number_view.xml new file mode 100644 index 0000000..d24f0be --- /dev/null +++ b/app/src/main/res/layout/item_number_view.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_pin_view.xml b/app/src/main/res/layout/item_pin_view.xml new file mode 100644 index 0000000..47bd019 --- /dev/null +++ b/app/src/main/res/layout/item_pin_view.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/lock_action_view.xml b/app/src/main/res/layout/lock_action_view.xml new file mode 100644 index 0000000..01b4b54 --- /dev/null +++ b/app/src/main/res/layout/lock_action_view.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_view.xml b/app/src/main/res/layout/tab_view.xml new file mode 100644 index 0000000..956fc05 --- /dev/null +++ b/app/src/main/res/layout/tab_view.xml @@ -0,0 +1,24 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/applock.png b/app/src/main/res/mipmap-xxxhdpi/applock.png new file mode 100644 index 0000000..7b12a20 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/applock.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..cf58ff1 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..33204c0 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + #FF000000 + #FFFFFFFF + #67b19c + #6dbdef + #5571ec + #DCDCDC + #00000000 + #805571EC + #a2b4b0 + \ No newline at end of file diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml new file mode 100644 index 0000000..e191e4e --- /dev/null +++ b/app/src/main/res/values/dimen.xml @@ -0,0 +1,4 @@ + + + 17sp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..18239b3 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,23 @@ + + AppLock + Enter your pin + Verify your pin + Reset your pin + Continue + Save + Permissions Required + Detect Launched App + Show Over Other Apps + Permit + Permitted + Password verification failed + Unlocked + Locked + Reset Pin + Version + Lock %s + UnLock %s + Password reset successful + V%s + OK + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..1c53d0f --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/moretool/free/applock/watcher/ExampleUnitTest.java b/app/src/test/java/com/moretool/free/applock/watcher/ExampleUnitTest.java new file mode 100644 index 0000000..34ef526 --- /dev/null +++ b/app/src/test/java/com/moretool/free/applock/watcher/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.moretool.free.applock.watcher; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit watcher, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/app/testAppLock.jks b/app/testAppLock.jks new file mode 100644 index 0000000..d65bb42 Binary files /dev/null and b/app/testAppLock.jks differ diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..b9ea2a2 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,12 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("com.android.application") version "8.1.3" apply false + id("org.jetbrains.kotlin.android") version "1.9.0" apply false + id("com.google.gms.google-services") version "4.3.15" apply false + id ("com.google.firebase.crashlytics") version "2.9.2" apply false +} +buildscript{ + dependencies{ + classpath("com.applovin.quality:AppLovinQualityServiceGradlePlugin:+") + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..00d252e --- /dev/null +++ b/gradle.properties @@ -0,0 +1,22 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +android.nonFinalResIds=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..d6a0c44 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 14 16:27:06 CST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..2dce941 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,21 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + maven{url = uri("https://artifacts.applovin.com/android")} + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url = uri("https://artifact.bytedance.com/repository/pangle") } + maven { url = uri("https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea") } + } +} + +rootProject.name = "AppLock" +include(":app") + \ No newline at end of file