commit 54f404ed15ad0070abb0b50da5bb4dda7915bd68 Author: zhouzhijia Date: Fri Jul 26 19:04:30 2024 +0800 V1.0.0(1) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cacbb65 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +*.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 +.idea/ +app/release/lockapp_v1.0.0(1)_07_26_16_40-release.apk +app/release/lockapp_v1.0.0(1)_07_26_16_57-release.aab 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/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..4859351 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,62 @@ +import java.util.Date +import java.text.SimpleDateFormat +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("kotlin-kapt") +} +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) +android { + namespace = "com.tool.applockpro" + compileSdk = 34 + + defaultConfig { + applicationId = "com.tool.lockapp" + minSdk = 23 + targetSdk = 34 + versionCode = 1 + versionName = "1.0.0" + setProperty("archivesBaseName", "lockapp_v" + versionName + "(${versionCode})_$timestamp") + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isShrinkResources =true + 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.7.0") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") + + val room_version = "2.6.1" + implementation("androidx.room:room-runtime:$room_version") + annotationProcessor("androidx.room:room-compiler:$room_version") + kapt("androidx.room:room-compiler:$room_version") + implementation("androidx.room:room-ktx:$room_version") + implementation("androidx.room:room-rxjava2:$room_version") + implementation("androidx.room:room-rxjava3:$room_version") + implementation("androidx.room:room-guava:$room_version") + testImplementation("androidx.room:room-testing:$room_version") + implementation("androidx.room:room-paging:$room_version") + +} \ No newline at end of file diff --git a/app/lockapp.jks b/app/lockapp.jks new file mode 100644 index 0000000..00b236e Binary files /dev/null and b/app/lockapp.jks differ diff --git a/app/lockapptest.jks b/app/lockapptest.jks new file mode 100644 index 0000000..62d8744 Binary files /dev/null and b/app/lockapptest.jks differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..71cda15 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,34 @@ +# 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.tool.applockpro.ApplockSkin{ + public static final java.lang.String DB_Name; + public static final int DB_Version; + } + -keepclassmembers class *{ + @androidx.room.Query ; + } + + -keep class com.tool.applockpro.data.MyDataBase { *; } + -keep class com.tool.applockpro.data.Mydao { *; } + -keep class com.tool.applockpro.data.Mydata { *; } + -keep class com.omicronapplications.** { *; } + -keep class net.sf.sevenzipjbinding.** { *; } diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..6123a69 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.tool.lockapp", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0.0", + "outputFile": "lockapp_v1.0.0(1)_07_26_16_40-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/tool/applockpro/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/tool/applockpro/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f1a987b --- /dev/null +++ b/app/src/androidTest/java/com/tool/applockpro/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.tool.applockpro; + +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 test, 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 test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.tool.applockpro", 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..f1c1d44 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/ApplockSkin.java b/app/src/main/java/com/tool/applockpro/ApplockSkin.java new file mode 100644 index 0000000..e3ba733 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/ApplockSkin.java @@ -0,0 +1,81 @@ +package com.tool.applockpro; + +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import com.tool.applockpro.data.MyDataBase; +import com.tool.applockpro.data.Mydata; +import com.tool.applockpro.tool.Mytools; + +import java.util.ArrayList; +import java.util.List; + +public class ApplockSkin extends Application { + public static final String DB_Name = "lock_database"; + public static final String Table_Name = "lock_table"; + public static final int DB_Version = 1; + private static Context context; + private static final String PREFS_NAME = "MyPrefs"; + private static final String KEY_PWD = "key_pwd"; + public static SharedPreferences sp; + public static SharedPreferences.Editor et; + public static final int checkpwd_0 = 0; + public static List system = new ArrayList<>(); + public static List third = new ArrayList<>(); + public static List lock = new ArrayList<>(); + + public static List getSystem() { + return system; + } + + public static List getThird() { + return third; + } + + public static List getLock() { + return lock; + } + + @Override + public void onCreate() { + super.onCreate(); + context = getApplicationContext(); + Mytools.getapplist(this); + + + sp = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); + et = sp.edit(); + + initData(); + } + + private void initData() { + +// Mytools.runIO(new Runnable() { +// @Override +// public void run() { +// system = MyDataBase.getINSTANCE().mydao().getappissystem(true); +// third = MyDataBase.getINSTANCE().mydao().getappissystem(false); +// lock = MyDataBase.getINSTANCE().mydao().getlockapp(true); +// +// } +// }); + + } + + public static void savePWD(String pwd) { + et.putString(KEY_PWD, pwd); + et.apply(); +// Log.e("zzj", "--------savepwd----------" + pwd); + } + + public static String getPWD() { + return sp.getString(KEY_PWD, ""); + } + + public static Context getContext() { + return context; + } +} diff --git a/app/src/main/java/com/tool/applockpro/activity/MainActivity.java b/app/src/main/java/com/tool/applockpro/activity/MainActivity.java new file mode 100644 index 0000000..70dc165 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/activity/MainActivity.java @@ -0,0 +1,151 @@ +package com.tool.applockpro.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.android.material.tabs.TabLayout; +import com.tool.applockpro.R; +import com.tool.applockpro.adapter.PageAdapter; +import com.tool.applockpro.databinding.ActivityMainBinding; +import com.tool.applockpro.fragment.AllFragment; +import com.tool.applockpro.tool.Myservice; + +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends AppCompatActivity { + ActivityMainBinding binding; + private String[] listtext = {"System", "Third", "Lock"}; + private List list = new ArrayList<>(); + private PageAdapter adapter; + private TypedArray imageArray; + private ImageView tabimg; + private TextView tabtext; + private ConstraintLayout imagebg; + + + @SuppressLint("MissingInflatedId") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.activity_main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + startService(new Intent(this, Myservice.class)); + initTab(); + + binding.mainSeeting.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this, SettingActivity.class); + startActivity(intent); + } + }); + + + binding.mainSearch.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this, SearchActivity.class); + startActivity(intent); + } + }); + } + + private void initTab() { + + for (String s : listtext) { + list.add(AllFragment.newInstance(s)); + } + adapter = new PageAdapter(getSupportFragmentManager(), list); + imageArray = getResources().obtainTypedArray(R.array.drawable_images); + binding.mainViewpager.setAdapter(adapter); + for (int i = 0; i < 3; i++) { + TabLayout.Tab tab = binding.mainTabLayout.newTab(); + binding.mainTabLayout.addTab(tab); + View customView = LayoutInflater.from(this).inflate(R.layout.item_tablayout, null); + tabimg = customView.findViewById(R.id.tab_image); + tabtext = customView.findViewById(R.id.tab_text); + imagebg = customView.findViewById(R.id.tab_cons); + tabtext.setText(listtext[i]); + Drawable drawable = imageArray.getDrawable(i); + tabimg.setBackground(drawable); + tab.setCustomView(customView); + final int finalI = i; + tab.view.setOnClickListener(v -> { + binding.mainViewpager.setCurrentItem(finalI); + }); + } +// binding.mainViewpager.setOffscreenPageLimit(1); + binding.mainViewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + setTabIcons(position); + if (position == 1) { + AllFragment fragment = list.get(1); + fragment.refesh(); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + private void setTabIcons(int position) { + + for (int i = 0; i < binding.mainTabLayout.getTabCount(); i++) { + TabLayout.Tab tab = binding.mainTabLayout.getTabAt(i); + if (tab != null) { + View customView = tab.getCustomView(); + if (i == position) { + customView.findViewById(R.id.custom_tablayout).setSelected(true); + customView.findViewById(R.id.tab_cons).setSelected(true); + customView.findViewById(R.id.tab_text).setSelected(true); + } else { + customView.findViewById(R.id.custom_tablayout).setSelected(false); + customView.findViewById(R.id.tab_cons).setSelected(false); + customView.findViewById(R.id.tab_text).setSelected(false); + } + } + } + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (imageArray != null) { + imageArray.recycle(); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/activity/PermissionActivity.java b/app/src/main/java/com/tool/applockpro/activity/PermissionActivity.java new file mode 100644 index 0000000..2981ae4 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/activity/PermissionActivity.java @@ -0,0 +1,77 @@ +package com.tool.applockpro.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import android.content.Intent; +import android.os.Bundle; +import android.provider.Settings; +import android.view.View; + +import com.tool.applockpro.ApplockSkin; +import com.tool.applockpro.R; +import com.tool.applockpro.databinding.ActivityPermissionBinding; +import com.tool.applockpro.tool.Myservice; +import com.tool.applockpro.tool.Mytools; + +public class PermissionActivity extends AppCompatActivity { + ActivityPermissionBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityPermissionBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.activity_Permission), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + + + binding.step2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent usageAccessIntent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); + startActivity(usageAccessIntent); + } + }); + binding.step1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent overlayIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); + startActivity(overlayIntent); + } + }); + + } + + + private void starMainactivity() { + if (Mytools.hasUsagePermission(this) && Mytools.hasOverlayPermission(this)) { + Intent intent = new Intent(PermissionActivity.this, SetPWDActivity.class); + startActivity(intent); + finish(); + } + } + + @Override + protected void onResume() { + super.onResume(); + binding.step1.setSelected(Mytools.hasOverlayPermission(this)); + binding.step2.setSelected(Mytools.hasUsagePermission(this)); + if (ApplockSkin.getPWD().isEmpty()) { + starMainactivity(); + } else { + Intent intent = new Intent(PermissionActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/activity/SearchActivity.java b/app/src/main/java/com/tool/applockpro/activity/SearchActivity.java new file mode 100644 index 0000000..d115333 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/activity/SearchActivity.java @@ -0,0 +1,121 @@ +package com.tool.applockpro.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import com.tool.applockpro.R; +import com.tool.applockpro.adapter.AppAdapter; +import com.tool.applockpro.data.MyDataBase; +import com.tool.applockpro.data.Mydata; +import com.tool.applockpro.databinding.ActivitySearchBinding; +import com.tool.applockpro.tool.Mytools; + +import java.util.ArrayList; +import java.util.List; + +public class SearchActivity extends AppCompatActivity { + ActivitySearchBinding binding; + private List searchdata = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivitySearchBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.activity_search), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initData(); + + initEvent(); + } + + private void initEvent() { + binding.cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + binding.search.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + search(binding.searchEdit.getText().toString()); + } + }); + } + + private void search(String text) { + if (TextUtils.isEmpty(text)) { + binding.searchTips.setText(R.string.text_tips); + binding.searchTips.setVisibility(View.VISIBLE); + binding.searchRv.setVisibility(View.GONE); + } else { + + binding.searchEdit.setText(text); + binding.searchTips.setVisibility(View.GONE); + binding.searchRv.setVisibility(View.VISIBLE); + + Mytools.runIO(new Runnable() { + @Override + public void run() { + searchdata = MyDataBase.getINSTANCE().mydao().getSearchDatas(text); + + runOnUiThread(new Runnable() { + @Override + public void run() { + if (searchdata.isEmpty()) { + binding.searchTips.setText(R.string.text_null); + binding.searchTips.setVisibility(View.VISIBLE); + binding.searchRv.setVisibility(View.GONE); + } else { + binding.searchTips.setVisibility(View.GONE); + binding.searchRv.setVisibility(View.VISIBLE); + binding.searchRv.setAdapter(new AppAdapter(SearchActivity.this, searchdata)); + binding.searchRv.setLayoutManager(new LinearLayoutManager(SearchActivity.this)); + } + } + }); + + } + }); + } + hideKeyView(); + } + + private void initData() { + +// binding.searchTips.setVisibility(View.GONE); +// binding.searchEdit.requestFocus(); +// InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); +// imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); + + + } + + private void hideKeyView() { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(binding.searchEdit.getWindowToken(), 0); + binding.searchEdit.clearFocus(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + hideKeyView(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/activity/SetPWDActivity.java b/app/src/main/java/com/tool/applockpro/activity/SetPWDActivity.java new file mode 100644 index 0000000..b6e5295 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/activity/SetPWDActivity.java @@ -0,0 +1,138 @@ +package com.tool.applockpro.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.Toast; + +import com.tool.applockpro.ApplockSkin; +import com.tool.applockpro.R; +import com.tool.applockpro.databinding.ActivitySetPwdactivityBinding; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class SetPWDActivity extends AppCompatActivity { + ActivitySetPwdactivityBinding binding; + private List etlis = new ArrayList<>(); + private int chewkpwd; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivitySetPwdactivityBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.activity_setpwd), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + + chewkpwd = getIntent().getIntExtra("1", 0); + +// if (chewkpwd == 0) { +// binding.setpwdBack.setVisibility(View.GONE); +// } else { +// binding.setpwdBack.setVisibility(View.VISIBLE); +// } + + etlis.add(binding.et1); + etlis.add(binding.et2); + etlis.add(binding.et3); + etlis.add(binding.et4); + setupEditTextListeners(); + initEvent(); + } + + private void initEvent() { + + binding.btnContinue.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(binding.et1.getText().toString()); + stringBuilder.append(binding.et2.getText().toString()); + stringBuilder.append(binding.et3.getText().toString()); + stringBuilder.append(binding.et4.getText().toString()); + if (stringBuilder.length() == 4) { + ApplockSkin.savePWD(stringBuilder.toString()); + if (chewkpwd == ApplockSkin.checkpwd_0) { + Intent intent = new Intent(SetPWDActivity.this, MainActivity.class); + Toast.makeText(SetPWDActivity.this, getString(R.string.setlock_tips), Toast.LENGTH_SHORT).show(); + startActivity(intent); + finish(); + } else { +// Intent intent = new Intent(SetPWDActivity.this, MainActivity.class); +// +// startActivity(intent); + Toast.makeText(SetPWDActivity.this, getString(R.string.changelock_tips), Toast.LENGTH_SHORT).show(); + finish(); + } + + } else { + Toast.makeText(SetPWDActivity.this, getString(R.string.text_hint), Toast.LENGTH_SHORT).show(); + } + } + }); + } + + + private void setupEditTextListeners() { + for (int i = 0; i < etlis.size(); i++) { + EditText currentEditText = etlis.get(i); + EditText nextEditText = (i < etlis.size() - 1) ? etlis.get(i + 1) : null; + EditText previousEditText = (i > 0) ? etlis.get(i - 1) : null; + int finalI = i; + currentEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + + if (s.length() == 1 && nextEditText != null) { + nextEditText.requestFocus(); + } else if (s.length() == 0 && previousEditText != null) { + previousEditText.requestFocus(); + } else if (finalI == 3 || finalI == 0) { + + currentEditText.clearFocus(); + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(currentEditText.getWindowToken(), 0); + } + } + }); + currentEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (currentEditText.getText().length() > 0) { + currentEditText.setBackgroundResource(R.drawable.stepwd_check); + } else { + currentEditText.setBackgroundResource(R.drawable.stepwd_uncheck); + } + } + }); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/activity/SettingActivity.java b/app/src/main/java/com/tool/applockpro/activity/SettingActivity.java new file mode 100644 index 0000000..03ef75f --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/activity/SettingActivity.java @@ -0,0 +1,58 @@ +package com.tool.applockpro.activity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; + +import com.tool.applockpro.ApplockSkin; +import com.tool.applockpro.R; +import com.tool.applockpro.databinding.ActivitySettingBinding; + + +public class SettingActivity extends AppCompatActivity { + ActivitySettingBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivitySettingBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.activity_setting), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + binding.changepwd.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(SettingActivity.this, SetPWDActivity.class); + intent.putExtra("1", 1); + startActivity(intent); + + } + }); + + binding.privacy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse("https://sites.google.com/view/privacy-policy-web-page")); + startActivity(intent); + } + }); + + binding.cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/adapter/AppAdapter.java b/app/src/main/java/com/tool/applockpro/adapter/AppAdapter.java new file mode 100644 index 0000000..69538c4 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/adapter/AppAdapter.java @@ -0,0 +1,184 @@ +package com.tool.applockpro.adapter; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.TranslateAnimation; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + + +import com.tool.applockpro.R; +import com.tool.applockpro.data.MyDataBase; +import com.tool.applockpro.data.Mydata; +import com.tool.applockpro.tool.Mytools; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import kotlin.Unit; +import kotlin.jvm.functions.Function1; + +public class AppAdapter extends RecyclerView.Adapter { + private Context mycontext; + private List mydataList = new ArrayList<>(); + private PackageManager packageManager; + private boolean mtost = true; + public static SharedPreferences keysp; + public static SharedPreferences.Editor keyeditor; + private int keyid; + private ObjectAnimator animator1, animator2; + private Activity activity; + + + @SuppressLint("NotifyDataSetChanged") + public AppAdapter(Context context, List list) { + mydataList = list; + mycontext = context; + packageManager = context.getPackageManager(); + keysp = mycontext.getSharedPreferences("key", Context.MODE_PRIVATE); + notifyDataSetChanged(); + } + + + @NonNull + @Override + public AppVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(mycontext).inflate(R.layout.item_app, parent, false); + return new AppVH(itemView); + } + + @Override + public void onBindViewHolder(@NonNull AppVH holder, @SuppressLint("RecyclerView") int position) { + Mydata mydata = mydataList.get(position); + String appname = mydata.getAppName(); + + + boolean lock = mydata.isLock(); +// Log.e("zzj", mydata.getAppName() + "------mydata.isLock-----" + lock); + holder.switchCompat.setSelected(lock); + holder.lock.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + keyid = getkey(); + keyid++; + keyeditor = keysp.edit(); + if (keyid % 5 == 0) { + keyeditor.putInt("key", keyid); + keyeditor.apply(); +// Log.e("zzj", String.valueOf(keyid)); + if (holder.switchCompat.isSelected()) { + holder.switchCompat.setSelected(false); + } else { + holder.switchCompat.setSelected(true); + } + Mytools.runIO(new Runnable() { + @Override + public void run() { + mydata.setLock(holder.switchCompat.isSelected()); + MyDataBase.getINSTANCE().mydao().update(mydata); + + } + }); + String s; + if (holder.switchCompat.isSelected()) { + s = String.format(mycontext.getString(R.string.text_locked), appname); + } else { + s = String.format(mycontext.getString(R.string.text_unlocked), appname); + } + + Toast.makeText(mycontext, s, Toast.LENGTH_SHORT).show(); + } else { + keyeditor.putInt("key", keyid); + keyeditor.apply(); + if (holder.switchCompat.isSelected()) { + holder.switchCompat.setSelected(false); + } else { + holder.switchCompat.setSelected(true); + } + Mytools.runIO(new Runnable() { + @Override + public void run() { + mydata.setLock(holder.switchCompat.isSelected()); + MyDataBase.getINSTANCE().mydao().update(mydata); + + } + }); + String s; + if (holder.switchCompat.isSelected()) { + s = String.format(mycontext.getString(R.string.text_locked), appname); + } else { + s = String.format(mycontext.getString(R.string.text_unlocked), appname); + } + + + Toast.makeText(mycontext, s, Toast.LENGTH_SHORT).show(); + } + + + } + + }); + + holder.textView.setText(mydata.getAppName()); + try { + Drawable appLogo = getLogo(mydata.getPackageName()); + holder.imageView.setImageDrawable(appLogo); + } catch (PackageManager.NameNotFoundException e) { + + } + } + + + public static int getkey() { + return keysp.getInt("key", 0); + } + + @Override + public int getItemCount() { + return mydataList.size(); + } + + private Drawable getLogo(String packageName) throws PackageManager.NameNotFoundException { + ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); + return packageManager.getApplicationIcon(appInfo); + } + + public static class AppVH extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + private AppCompatImageView switchCompat; + private ConstraintLayout lock; + + public AppVH(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.logo); + textView = itemView.findViewById(R.id.name); + switchCompat = itemView.findViewById(R.id.app_switch); + lock = itemView.findViewById(R.id.lock); + } + + } + +} diff --git a/app/src/main/java/com/tool/applockpro/adapter/NumberAdapter.java b/app/src/main/java/com/tool/applockpro/adapter/NumberAdapter.java new file mode 100644 index 0000000..14fec75 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/adapter/NumberAdapter.java @@ -0,0 +1,95 @@ +package com.tool.applockpro.adapter; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.tool.applockpro.R; +import com.tool.applockpro.tool.Staticvalue; + +public class NumberAdapter extends RecyclerView.Adapter { + private String[] numberlist = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "-0", "0", "-1"}; + private StringBuilder currentNumber = new StringBuilder(); + private PinAdapter mpinAdapter; + private Context mcontext; + + public NumberAdapter(Context context, PinAdapter pinAdapter) { + mcontext = context; + mpinAdapter = pinAdapter; + } + + @NonNull + @Override + public NumberVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.number_item, null); + return new NumberVH(view); + } + + @Override + public void onBindViewHolder(@NonNull NumberVH holder, @SuppressLint("RecyclerView") int position) { + + if (position == 9) { + holder.getImage().setVisibility(View.GONE); + holder.getNumbertext().setVisibility(View.GONE); + } else if (position == 11) { + holder.getImage().setVisibility(View.VISIBLE); +// holder.getNumbertext().setVisibility(View.GONE); + } else { + holder.getImage().setVisibility(View.GONE); + holder.getNumbertext().setText(numberlist[position]); + } + holder.getNumbertext().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (position == 11) { + if (currentNumber.length() > 0) { + currentNumber.deleteCharAt(currentNumber.length() - 1); + mpinAdapter.updateItem(currentNumber.toString()); + } + } else { + if (currentNumber.length() < 4) { + currentNumber.append(numberlist[position]); + } + } + mpinAdapter.updateItem(currentNumber.toString()); + if (currentNumber.length() == 4) { + Staticvalue.KEY_NUMBER = currentNumber.toString(); + currentNumber.setLength(0); + } + + } + }); + } + + @Override + public int getItemCount() { + return numberlist.length; + } + + public class NumberVH extends RecyclerView.ViewHolder { + private TextView numbertext; + private ConstraintLayout image; + + public ConstraintLayout getImage() { + return image; + } + + public NumberVH(@NonNull View itemView) { + super(itemView); + numbertext = itemView.findViewById(R.id.text_number); + image = itemView.findViewById(R.id.pin_cons); + } + + public TextView getNumbertext() { + return numbertext; + } + } +} diff --git a/app/src/main/java/com/tool/applockpro/adapter/PageAdapter.java b/app/src/main/java/com/tool/applockpro/adapter/PageAdapter.java new file mode 100644 index 0000000..12c7725 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/adapter/PageAdapter.java @@ -0,0 +1,30 @@ +package com.tool.applockpro.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; + +import com.tool.applockpro.fragment.AllFragment; + +import java.util.List; + +public class PageAdapter extends FragmentStatePagerAdapter { + private final List fragmentList; + + public PageAdapter(@NonNull FragmentManager fm, List list) { + super(fm); + fragmentList = list; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/tool/applockpro/adapter/PinAdapter.java b/app/src/main/java/com/tool/applockpro/adapter/PinAdapter.java new file mode 100644 index 0000000..97f140b --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/adapter/PinAdapter.java @@ -0,0 +1,64 @@ +package com.tool.applockpro.adapter; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.tool.applockpro.R; + + +public class PinAdapter extends RecyclerView.Adapter { + + private String mPin = ""; + private Context mContext; + + public PinAdapter(Context context) { + mContext = context; + } + + @NonNull + @Override + public NumberVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.number_pin, null); + return new NumberVH(view); + } + + @Override + public void onBindViewHolder(@NonNull NumberVH holder, @SuppressLint("RecyclerView") int position) { + + if (position < mPin.length()) { + holder.getImageView().setSelected(true); + } else { + holder.getImageView().setSelected(false); + } + } + + @Override + public int getItemCount() { + return 4; + } + + public void updateItem(String pin) { + mPin = pin; + notifyDataSetChanged(); + } + + public class NumberVH extends RecyclerView.ViewHolder { + private ImageView imageView; + + public NumberVH(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.im_pin); + } + + public ImageView getImageView() { + return imageView; + } + } +} diff --git a/app/src/main/java/com/tool/applockpro/data/MyDataBase.java b/app/src/main/java/com/tool/applockpro/data/MyDataBase.java new file mode 100644 index 0000000..c5157b5 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/data/MyDataBase.java @@ -0,0 +1,24 @@ +package com.tool.applockpro.data; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import com.tool.applockpro.ApplockSkin; + +@Database(entities = {Mydata.class}, version = ApplockSkin.DB_Version, exportSchema = false) +public abstract class MyDataBase extends RoomDatabase { + + public abstract Mydao mydao(); + + public static MyDataBase INSTANCE; + + public static MyDataBase getINSTANCE() { + + if (INSTANCE == null) { + INSTANCE = Room.databaseBuilder(ApplockSkin.getContext(), MyDataBase.class, ApplockSkin.DB_Name).build(); + } + + return INSTANCE; + } +} diff --git a/app/src/main/java/com/tool/applockpro/data/Mydao.java b/app/src/main/java/com/tool/applockpro/data/Mydao.java new file mode 100644 index 0000000..0482dc4 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/data/Mydao.java @@ -0,0 +1,44 @@ +package com.tool.applockpro.data; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.Query; +import androidx.room.Update; + +import java.util.List; + +@Dao +public interface Mydao { + @Insert + void insertAll(List myDataList); + + @Query("SELECT * FROM lock_table WHERE isLock = :islock") + List getlockapp(boolean islock); + + @Query("SELECT * FROM lock_table WHERE system = :issystem") + List getappissystem(boolean issystem); + + @Query("SELECT * FROM lock_table WHERE packageName = :packagename") + Mydata getappislock(String packagename); + + @Query("SELECT * FROM lock_table WHERE appName LIKE '%' || :appName || '%'") + LiveData> getSearchData(String appName); + @Query("SELECT * FROM lock_table WHERE appName LIKE '%' || :appName || '%'") + List getSearchDatas(String appName); + @Query("SELECT * FROM lock_table ") + List getAllapp(); + + @Update + void update(Mydata myData); + + @Query("SELECT * FROM lock_table WHERE isLock = :islock") + LiveData> getLockApps(boolean islock); + + @Query("SELECT * FROM lock_table WHERE system = :issystem") + LiveData> getAppsBySystem(boolean issystem); + + @Query("SELECT * FROM lock_table") + LiveData> getAllApps(); + +} diff --git a/app/src/main/java/com/tool/applockpro/data/Mydata.java b/app/src/main/java/com/tool/applockpro/data/Mydata.java new file mode 100644 index 0000000..64f4961 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/data/Mydata.java @@ -0,0 +1,53 @@ +package com.tool.applockpro.data; + +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +import com.tool.applockpro.ApplockSkin; + +@Entity(tableName = ApplockSkin.Table_Name) +public class Mydata { + @PrimaryKey(autoGenerate = true) + public int id; + private String packageName; + + private String appName; + + private boolean isLock = false; + + private boolean system = false; + + public boolean isSystem() { + return system; + } + + public void setSystem(boolean system) { + this.system = system; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public boolean isLock() { + return isLock; + } + + public void setLock(boolean lock) { + isLock = lock; + } + + +} diff --git a/app/src/main/java/com/tool/applockpro/fragment/AllFragment.java b/app/src/main/java/com/tool/applockpro/fragment/AllFragment.java new file mode 100644 index 0000000..b3a84a1 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/fragment/AllFragment.java @@ -0,0 +1,121 @@ +package com.tool.applockpro.fragment; + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.tool.applockpro.ApplockSkin; +import com.tool.applockpro.R; +import com.tool.applockpro.adapter.AppAdapter; +import com.tool.applockpro.data.MyDataBase; +import com.tool.applockpro.data.Mydao; +import com.tool.applockpro.data.Mydata; +import com.tool.applockpro.databinding.FragmentAllBinding; +import com.tool.applockpro.tool.Mytools; + +import androidx.lifecycle.Observer; +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class AllFragment extends Fragment { + FragmentAllBinding binding; + private String tabargs; + private AppAdapter thumAdapter; + private Mydao mydao; +// private List list1 = new ArrayList<>(); + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentAllBinding.inflate(inflater, container, false); + + initData(); + + + return binding.getRoot(); + } + + + public void refesh(){ + mydao.getAppsBySystem(false).observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(List mydata) { + + } + }); + Mytools.runIO(new Runnable() { + @Override + public void run() { + List list1 = MyDataBase.getINSTANCE().mydao().getappissystem(false); + requireActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + updateRecyclerView(list1); + } + }); + + } + }); + } + private void initData() { + mydao = MyDataBase.getINSTANCE().mydao(); + tabargs = getArguments().getString("tab"); + Log.e("zzj", tabargs); + if (tabargs.equals("System")) { + Mytools.runIO(new Runnable() { + @Override + public void run() { + List list = MyDataBase.getINSTANCE().mydao().getappissystem(true); + updateRecyclerView(list); + } + }); + } else if (tabargs.equals("Third")) { +// updateRecyclerView(list1); +// mydao.getAppsBySystem(false).observe(getViewLifecycleOwner(), new Observer>() { +// @Override +// public void onChanged(List mydata) { +// updateRecyclerView(mydata); +// } +// }); + Mytools.runIO(new Runnable() { + @Override + public void run() { + List list1 = MyDataBase.getINSTANCE().mydao().getappissystem(false); + updateRecyclerView(list1); + } + }); + } else if (tabargs.equals("Lock")) { + mydao.getLockApps(true).observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(@Nullable List mydataList) { + updateRecyclerView(mydataList); + } + }); + } + } + + private void updateRecyclerView(List mydataList) { + thumAdapter = new AppAdapter(requireContext(), mydataList); + binding.allRv.setLayoutManager(new LinearLayoutManager(requireContext())); + binding.allRv.setAdapter(thumAdapter); + } + + public static AllFragment newInstance(String pos) { + + Bundle args = new Bundle(); + AllFragment fragment = new AllFragment(); + args.putString("tab", pos); + fragment.setArguments(args); + return fragment; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tool/applockpro/tool/MyinputPWD.java b/app/src/main/java/com/tool/applockpro/tool/MyinputPWD.java new file mode 100644 index 0000000..5a92da3 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/tool/MyinputPWD.java @@ -0,0 +1,65 @@ +package com.tool.applockpro.tool; + +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.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.tool.applockpro.R; +import com.tool.applockpro.adapter.NumberAdapter; +import com.tool.applockpro.adapter.PinAdapter; + + +public class MyinputPWD extends FrameLayout { + private Context mcontext; + private RecyclerView numberrv; + private StringBuilder builder; + private NumberAdapter numberAdapter; + private PinAdapter pinAdapter; + private RecyclerView pinrv; + + public MyinputPWD(@NonNull Context context) { + super(context); + initView(context); + } + + public MyinputPWD(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + @SuppressLint("MissingInflatedId") + private void initView(Context context) { + mcontext = context; + View view = LayoutInflater.from(mcontext).inflate(R.layout.number_input, null); + numberrv = view.findViewById(R.id.number_rv); + pinrv = view.findViewById(R.id.pin_rv); + addView(view); + + + pinAdapter = new PinAdapter(mcontext); + pinrv.setAdapter(pinAdapter); + pinrv.setLayoutManager(new LinearLayoutManager(mcontext, RecyclerView.HORIZONTAL, false)); +// SpaceItem spaceItem1 = new SpaceItem(20, 0, 20); +// pinrv.addItemDecoration(spaceItem1); + + numberAdapter = new NumberAdapter(mcontext, pinAdapter); +// SpaceItem spaceItem = new SpaceItem(100, 90, 100); + numberrv.setAdapter(numberAdapter); + numberrv.setLayoutManager(new GridLayoutManager(mcontext, 3)); +// numberrv.addItemDecoration(spaceItem); + } + + public PinAdapter getPinAdapter() { + return pinAdapter; + } + + +} diff --git a/app/src/main/java/com/tool/applockpro/tool/Mymanager.java b/app/src/main/java/com/tool/applockpro/tool/Mymanager.java new file mode 100644 index 0000000..f5ce3e3 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/tool/Mymanager.java @@ -0,0 +1,120 @@ +package com.tool.applockpro.tool; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.PixelFormat; +import android.graphics.Point; +import android.os.Build; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.TextView; + +import com.tool.applockpro.ApplockSkin; +import com.tool.applockpro.R; +import com.tool.applockpro.adapter.PinAdapter; + + +public class Mymanager { + private static Mymanager myManager; + private Context mContext; + private View mView; + private WindowManager windowManager; + private TextView btncontinue; + private PinAdapter pinAdapter; + private WindowManager.LayoutParams layoutParams; + private MyinputPWD myinputPWD; + private StringBuilder stringBuilder = new StringBuilder(); + + public Mymanager(Context context) { + mContext = context; + + + mView = LayoutInflater.from(context).inflate(R.layout.lock_view, null, false); + windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + + myinputPWD = mView.findViewById(R.id.myinput); + pinAdapter = myinputPWD.getPinAdapter(); + + initView(); + initEvent(); + + } + + private void initEvent() { + btncontinue.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (Staticvalue.KEY_NUMBER.length() == 4) { + String pwd = Staticvalue.KEY_NUMBER; + if (pwd.equals(ApplockSkin.getPWD())) { + unLock(); + Staticvalue.KEY_NUMBER = ""; + pinAdapter.updateItem(Staticvalue.KEY_NUMBER); + } else { + showLockView(); + Staticvalue.KEY_NUMBER = ""; + pinAdapter.updateItem(Staticvalue.KEY_NUMBER); + } + } else { + Staticvalue.KEY_NUMBER = ""; + pinAdapter.updateItem(Staticvalue.KEY_NUMBER); + } + } + }); + } + + + public static synchronized Mymanager getInstance(Context context) { + if (myManager == null) { + myManager = new Mymanager(context); + } + return myManager; + } + + @SuppressLint("WrongConstant") + private void initView() { + btncontinue = mView.findViewById(R.id.lock_btn_continue); + int type = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; + } + layoutParams = new WindowManager.LayoutParams(); + layoutParams.type = type; + layoutParams.format = PixelFormat.RGBA_8888; + layoutParams.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | + WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; + layoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN; + layoutParams.gravity = Gravity.CENTER; + Point screenSize = new Point(); + windowManager.getDefaultDisplay().getRealSize(screenSize); + layoutParams.width = screenSize.x; + layoutParams.height = screenSize.y; + } + + public void showLockView() { + if (!isViewAttached()) { + stringBuilder.setLength(0); + Staticvalue.KEY_NUMBER = ""; + windowManager.addView(mView, layoutParams); + + } + } + + public void unLock() { + try { + windowManager.removeView(mView); + } catch (Exception exception) { + } + } + + private boolean isViewAttached() { + return mView.getParent() != null; + } + +} diff --git a/app/src/main/java/com/tool/applockpro/tool/Myservice.java b/app/src/main/java/com/tool/applockpro/tool/Myservice.java new file mode 100644 index 0000000..02ab36f --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/tool/Myservice.java @@ -0,0 +1,67 @@ +package com.tool.applockpro.tool; + +import android.app.IntentService; +import android.content.Intent; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.tool.applockpro.data.MyDataBase; +import com.tool.applockpro.data.Mydata; + +import java.util.Objects; + +public class Myservice extends IntentService { + private String lastLockPackName = ""; + private Mymanager myinstance; + private Handler mHandler; + + @Override + public void onCreate() { + super.onCreate(); + mHandler = new Handler(Looper.getMainLooper()); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + myinstance = Mymanager.getInstance(this); + while (true) { + String appname = Mytools.checkTopapp(this); +// Log.e("zzj","--- ----"+appname); + if (appname.isEmpty()) { + continue; + } + Mydata mydata = MyDataBase.getINSTANCE().mydao().getappislock(appname); + + if (mydata == null) { + mHandler.post(new Runnable() { + @Override + public void run() { + myinstance.unLock(); + } + }); + lastLockPackName = appname; + continue; + } + if (mydata.isLock()) { + if (!Objects.equals(lastLockPackName, appname)) { + mHandler.post(new Runnable() { + @Override + public void run() { + myinstance.showLockView(); + } + }); + } + } else { + } + + lastLockPackName = appname; + } + } + + public Myservice() { + super(""); + } +} diff --git a/app/src/main/java/com/tool/applockpro/tool/Mytools.java b/app/src/main/java/com/tool/applockpro/tool/Mytools.java new file mode 100644 index 0000000..b45b154 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/tool/Mytools.java @@ -0,0 +1,119 @@ +package com.tool.applockpro.tool; + +import android.app.AppOpsManager; +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.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Build; +import android.provider.Settings; + +import com.tool.applockpro.data.MyDataBase; +import com.tool.applockpro.data.Mydata; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class Mytools { + public static String checkTopapp(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(); + } + } + return result; + } + public static List getapplist(Context context) { + PackageManager packageManager = context.getPackageManager(); + Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + List resolveInfos = packageManager.queryIntentActivities(intent, 0); + List allapplist = new ArrayList<>(); + for (ResolveInfo resolveInfo : resolveInfos) { + String packageName = resolveInfo.activityInfo.packageName; + String appName = resolveInfo.loadLabel(packageManager).toString(); + Mydata data = new Mydata(); + data.setAppName(appName); + data.setPackageName(packageName); + if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + data.setSystem(false); + } else { + data.setSystem(true); + } + allapplist.add(data); + } + runIO(new Runnable() { + @Override + public void run() { + List existingData = MyDataBase.getINSTANCE().mydao().getAllapp(); + if (!existingData.isEmpty()) { + + } else { + List uniqueSystemList = removeDuplApp(allapplist); + MyDataBase.getINSTANCE().mydao().insertAll(uniqueSystemList); + } + } + }); + + return allapplist; + } + + private static List removeDuplApp(List appList) { + Set uniqueApps = new LinkedHashSet<>(appList); + return new ArrayList<>(uniqueApps); + } + + public static boolean hasOverlayPermission(Context context) { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return Settings.canDrawOverlays(context); + } else { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + public static boolean hasUsagePermission(Context context) { + try { + AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), context.getPackageName()); + return (mode == AppOpsManager.MODE_ALLOWED); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + private static ExecutorService executorService; + + private static ExecutorService getExecutorService() { + if (executorService == null) { + executorService = Executors.newSingleThreadExecutor(); + } + return executorService; + } + + public static void runIO(Runnable task) { + getExecutorService().execute(task); + } + + +} diff --git a/app/src/main/java/com/tool/applockpro/tool/Staticvalue.java b/app/src/main/java/com/tool/applockpro/tool/Staticvalue.java new file mode 100644 index 0000000..f546450 --- /dev/null +++ b/app/src/main/java/com/tool/applockpro/tool/Staticvalue.java @@ -0,0 +1,6 @@ +package com.tool.applockpro.tool; + +public class Staticvalue { + public static String KEY_NUMBER = "key_number"; + public static String KEY_CANCEL = "key_cancel"; +} diff --git a/app/src/main/res/drawable/all_tab_selector.xml b/app/src/main/res/drawable/all_tab_selector.xml new file mode 100644 index 0000000..03c1d90 --- /dev/null +++ b/app/src/main/res/drawable/all_tab_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/all_tabcons_selector.xml b/app/src/main/res/drawable/all_tabcons_selector.xml new file mode 100644 index 0000000..df84359 --- /dev/null +++ b/app/src/main/res/drawable/all_tabcons_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/all_tabtext_selector.xml b/app/src/main/res/drawable/all_tabtext_selector.xml new file mode 100644 index 0000000..1ee917e --- /dev/null +++ b/app/src/main/res/drawable/all_tabtext_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_main_cons.xml b/app/src/main/res/drawable/bg_main_cons.xml new file mode 100644 index 0000000..1250322 --- /dev/null +++ b/app/src/main/res/drawable/bg_main_cons.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_main_item_cons.xml b/app/src/main/res/drawable/bg_main_item_cons.xml new file mode 100644 index 0000000..939de74 --- /dev/null +++ b/app/src/main/res/drawable/bg_main_item_cons.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_main_item_icon.xml b/app/src/main/res/drawable/bg_main_item_icon.xml new file mode 100644 index 0000000..96d5758 --- /dev/null +++ b/app/src/main/res/drawable/bg_main_item_icon.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_setting_cons.xml b/app/src/main/res/drawable/bg_setting_cons.xml new file mode 100644 index 0000000..be09bab --- /dev/null +++ b/app/src/main/res/drawable/bg_setting_cons.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file 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/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_back.xml b/app/src/main/res/drawable/icon_back.xml new file mode 100644 index 0000000..f6f19d0 --- /dev/null +++ b/app/src/main/res/drawable/icon_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_cancel.xml b/app/src/main/res/drawable/icon_cancel.xml new file mode 100644 index 0000000..e2367e5 --- /dev/null +++ b/app/src/main/res/drawable/icon_cancel.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/icon_delete.xml b/app/src/main/res/drawable/icon_delete.xml new file mode 100644 index 0000000..ad8681e --- /dev/null +++ b/app/src/main/res/drawable/icon_delete.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/icon_go.xml b/app/src/main/res/drawable/icon_go.xml new file mode 100644 index 0000000..893f185 --- /dev/null +++ b/app/src/main/res/drawable/icon_go.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/icon_islock.xml b/app/src/main/res/drawable/icon_islock.xml new file mode 100644 index 0000000..3e26f05 --- /dev/null +++ b/app/src/main/res/drawable/icon_islock.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/icon_left.xml b/app/src/main/res/drawable/icon_left.xml new file mode 100644 index 0000000..45a1efd --- /dev/null +++ b/app/src/main/res/drawable/icon_left.xml @@ -0,0 +1,21 @@ + + + + diff --git a/app/src/main/res/drawable/icon_lock.xml b/app/src/main/res/drawable/icon_lock.xml new file mode 100644 index 0000000..7b34102 --- /dev/null +++ b/app/src/main/res/drawable/icon_lock.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_right.xml b/app/src/main/res/drawable/icon_right.xml new file mode 100644 index 0000000..7121514 --- /dev/null +++ b/app/src/main/res/drawable/icon_right.xml @@ -0,0 +1,21 @@ + + + + diff --git a/app/src/main/res/drawable/icon_search.xml b/app/src/main/res/drawable/icon_search.xml new file mode 100644 index 0000000..a61c5b4 --- /dev/null +++ b/app/src/main/res/drawable/icon_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_setting.xml b/app/src/main/res/drawable/icon_setting.xml new file mode 100644 index 0000000..a0a98f4 --- /dev/null +++ b/app/src/main/res/drawable/icon_setting.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_system.xml b/app/src/main/res/drawable/icon_system.xml new file mode 100644 index 0000000..c5c9a17 --- /dev/null +++ b/app/src/main/res/drawable/icon_system.xml @@ -0,0 +1,16 @@ + + + + diff --git a/app/src/main/res/drawable/icon_third.xml b/app/src/main/res/drawable/icon_third.xml new file mode 100644 index 0000000..7de6640 --- /dev/null +++ b/app/src/main/res/drawable/icon_third.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/icon_unlock.xml b/app/src/main/res/drawable/icon_unlock.xml new file mode 100644 index 0000000..e731cc3 --- /dev/null +++ b/app/src/main/res/drawable/icon_unlock.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/search_edit.xml b/app/src/main/res/drawable/search_edit.xml new file mode 100644 index 0000000..f34ee37 --- /dev/null +++ b/app/src/main/res/drawable/search_edit.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_lock.xml b/app/src/main/res/drawable/selector_lock.xml new file mode 100644 index 0000000..f8f3529 --- /dev/null +++ b/app/src/main/res/drawable/selector_lock.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/step_check.xml b/app/src/main/res/drawable/step_check.xml new file mode 100644 index 0000000..fc7df8d --- /dev/null +++ b/app/src/main/res/drawable/step_check.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/step_selector.xml b/app/src/main/res/drawable/step_selector.xml new file mode 100644 index 0000000..239b218 --- /dev/null +++ b/app/src/main/res/drawable/step_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/step_uncheck.xml b/app/src/main/res/drawable/step_uncheck.xml new file mode 100644 index 0000000..08c6721 --- /dev/null +++ b/app/src/main/res/drawable/step_uncheck.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/stepwd_check.xml b/app/src/main/res/drawable/stepwd_check.xml new file mode 100644 index 0000000..15adebe --- /dev/null +++ b/app/src/main/res/drawable/stepwd_check.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/stepwd_selector.xml b/app/src/main/res/drawable/stepwd_selector.xml new file mode 100644 index 0000000..39a8686 --- /dev/null +++ b/app/src/main/res/drawable/stepwd_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/stepwd_uncheck.xml b/app/src/main/res/drawable/stepwd_uncheck.xml new file mode 100644 index 0000000..dd2357a --- /dev/null +++ b/app/src/main/res/drawable/stepwd_uncheck.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_check.xml b/app/src/main/res/drawable/tab_check.xml new file mode 100644 index 0000000..5445bc5 --- /dev/null +++ b/app/src/main/res/drawable/tab_check.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_uncheck.xml b/app/src/main/res/drawable/tab_uncheck.xml new file mode 100644 index 0000000..0bd2317 --- /dev/null +++ b/app/src/main/res/drawable/tab_uncheck.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tabcons_check.xml b/app/src/main/res/drawable/tabcons_check.xml new file mode 100644 index 0000000..61d1f05 --- /dev/null +++ b/app/src/main/res/drawable/tabcons_check.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tabcons_uncheck.xml b/app/src/main/res/drawable/tabcons_uncheck.xml new file mode 100644 index 0000000..f61c807 --- /dev/null +++ b/app/src/main/res/drawable/tabcons_uncheck.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..726682b --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_permission.xml b/app/src/main/res/layout/activity_permission.xml new file mode 100644 index 0000000..5a8976d --- /dev/null +++ b/app/src/main/res/layout/activity_permission.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml new file mode 100644 index 0000000..6553c9f --- /dev/null +++ b/app/src/main/res/layout/activity_search.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_set_pwdactivity.xml b/app/src/main/res/layout/activity_set_pwdactivity.xml new file mode 100644 index 0000000..4e10e03 --- /dev/null +++ b/app/src/main/res/layout/activity_set_pwdactivity.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml new file mode 100644 index 0000000..cc216d5 --- /dev/null +++ b/app/src/main/res/layout/activity_setting.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_all.xml b/app/src/main/res/layout/fragment_all.xml new file mode 100644 index 0000000..021168a --- /dev/null +++ b/app/src/main/res/layout/fragment_all.xml @@ -0,0 +1,13 @@ + + + + + + \ 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..dfa2b25 --- /dev/null +++ b/app/src/main/res/layout/item_app.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tablayout.xml b/app/src/main/res/layout/item_tablayout.xml new file mode 100644 index 0000000..9fd9700 --- /dev/null +++ b/app/src/main/res/layout/item_tablayout.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/lock_view.xml b/app/src/main/res/layout/lock_view.xml new file mode 100644 index 0000000..935683a --- /dev/null +++ b/app/src/main/res/layout/lock_view.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/number_input.xml b/app/src/main/res/layout/number_input.xml new file mode 100644 index 0000000..771c75d --- /dev/null +++ b/app/src/main/res/layout/number_input.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/number_item.xml b/app/src/main/res/layout/number_item.xml new file mode 100644 index 0000000..05155b8 --- /dev/null +++ b/app/src/main/res/layout/number_item.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/number_pin.xml b/app/src/main/res/layout/number_pin.xml new file mode 100644 index 0000000..b36f712 --- /dev/null +++ b/app/src/main/res/layout/number_pin.xml @@ -0,0 +1,14 @@ + + + + + + \ 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/bg_main.png b/app/src/main/res/mipmap-xxxhdpi/bg_main.png new file mode 100644 index 0000000..eae6d28 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/bg_main.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/bg_main_title.png b/app/src/main/res/mipmap-xxxhdpi/bg_main_title.png new file mode 100644 index 0000000..8f8fa6a Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/bg_main_title.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/mipmap-xxxhdpi/icon_logo.png b/app/src/main/res/mipmap-xxxhdpi/icon_logo.png new file mode 100644 index 0000000..ea25346 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/icon_logo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/image_permission.png b/app/src/main/res/mipmap-xxxhdpi/image_permission.png new file mode 100644 index 0000000..6602176 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/image_permission.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/image_permission_title.png b/app/src/main/res/mipmap-xxxhdpi/image_permission_title.png new file mode 100644 index 0000000..25f174a Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/image_permission_title.png 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..e5aaed4 --- /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/arryays.xml b/app/src/main/res/values/arryays.xml new file mode 100644 index 0000000..902023f --- /dev/null +++ b/app/src/main/res/values/arryays.xml @@ -0,0 +1,8 @@ + + + + @drawable/icon_system + @drawable/icon_third + @drawable/icon_islock + + \ 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..192cfa4 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,18 @@ + + + #FF000000 + #FFFFFFFF + #40FFFFFF + #80FFFFFF + #50FFFFFF + #40000000 + #EBFFFC + #40FFFFFF + #50414141 + #37F3D3 + #EBFFFC + #9AA6A4 + #727272 + #909090 + + \ 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..91f5a5e --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,23 @@ + + Lock App + Permissions\n For normal use App Lock \n Please grant the following + Step 1 + Step 2 + Change password + Privacy Policy + locked: %s + Unlocked: %s + Continue + At present, there is nothing\n application are locked + Set Passcode + Create a 4-digit password + Please enter the password you want to change + Password change successful + Password set successfully + please input complete + Settings + Please enter the content + Query is empty + Confirm Your PIN + Crea un Pin de ingreso de 4 digitos + \ 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..6fd65d1 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,17 @@ + + + + + + + \ 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/tool/applockpro/ExampleUnitTest.java b/app/src/test/java/com/tool/applockpro/ExampleUnitTest.java new file mode 100644 index 0000000..2bd349b --- /dev/null +++ b/app/src/test/java/com/tool/applockpro/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.tool.applockpro; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, 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/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..1bc1d16 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,5 @@ +// 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 +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..3e927b1 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# 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. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec: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 \ 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..bf17142 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Jul 22 10:28:12 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/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..413a2c3 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "ApplockPro" +include(":app") + \ No newline at end of file