diff --git a/app/VibeKeyboard.jks b/app/VibeKeyboard.jks new file mode 100644 index 0000000..65fcc44 Binary files /dev/null and b/app/VibeKeyboard.jks differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ef2f22f..e534f39 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,7 +1,10 @@ +import java.text.SimpleDateFormat +import java.util.Date + plugins { alias(libs.plugins.android.application) } - +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) android { namespace = "com.key.vibekeyboard" compileSdk = 34 @@ -16,7 +19,7 @@ android { targetSdk = 34 versionCode = 1 versionName = "1.0.0" - + setProperty("archivesBaseName", "Mobile Keyboard" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/keystore.properties b/app/keystore.properties new file mode 100644 index 0000000..8e653f8 --- /dev/null +++ b/app/keystore.properties @@ -0,0 +1,6 @@ +app_name=Vibe Keyboard +package_name=com.key.vibekeyboard +keystoreFile=app/VibeKeyboard.jks +key_alias=VibeKeyboardkey0 +key_store_password=VibeKeyboard +key_password=VibeKeyboard diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..d622151 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,19 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keepclassmembers class com.key.vibekeyboard.AppApplication { + public static final java.lang.String DB_Name; + public static final int DB_Version; +} + +-keepclassmembers class * { + @androidx.room.Query ; +} +-keep class com.key.vibekeyboard.Room.MyDatabase { *; } +-keep class com.key.vibekeyboard.Room.WallpaperInfo { *; } +-keep class com.key.vibekeyboard.Room.WallpaperInfoDao { *; } +-keep class com.key.vibekeyboard.Room.Category { *; } +-keep class com.omicronapplications.** { *; } +-keep class net.sf.sevenzipjbinding.** { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4feab5b..9f463e3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,10 +16,12 @@ android:supportsRtl="true" android:theme="@style/Theme.KeyboardDemo" tools:targetApi="31"> + - + android:exported="false" /> diff --git a/app/src/main/java/com/key/vibekeyboard/Activity/CategoryActivity.java b/app/src/main/java/com/key/vibekeyboard/Activity/CategoryActivity.java index dfd6eca..589e42e 100644 --- a/app/src/main/java/com/key/vibekeyboard/Activity/CategoryActivity.java +++ b/app/src/main/java/com/key/vibekeyboard/Activity/CategoryActivity.java @@ -54,7 +54,10 @@ public class CategoryActivity extends AppCompatActivity { TextView textView = customView.findViewById(R.id.category_tab_custom_title); Category category = categories.get(position); String dir = category.getClassName(); - textView.setText(dir.substring(dir.lastIndexOf("_") + 1)); + String text = dir.substring(dir.lastIndexOf("_") + 1); + text = text.substring(0, 1).toUpperCase() + text.substring(1); // 首字母大写 + textView.setText(text); + }).attach(); diff --git a/app/src/main/java/com/key/vibekeyboard/Activity/DownloadActivity.java b/app/src/main/java/com/key/vibekeyboard/Activity/DownloadActivity.java index fff7922..7c467d5 100644 --- a/app/src/main/java/com/key/vibekeyboard/Activity/DownloadActivity.java +++ b/app/src/main/java/com/key/vibekeyboard/Activity/DownloadActivity.java @@ -1,6 +1,7 @@ package com.key.vibekeyboard.Activity; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -61,7 +62,6 @@ public class DownloadActivity extends AppCompatActivity { binding = null; } - private void initData() { Intent intent = getIntent(); WallpaperInfo wallpaperInfo = intent.getParcelableExtra("wallpaperInfo"); @@ -79,6 +79,8 @@ public class DownloadActivity extends AppCompatActivity { Log.d("DownloadActivity", "wallpaperInfo: " + wallpaperInfo); + binding.downloadTitle.setText(wallpaperInfo.title); + DownlaodRecyclerViewAdapter adapter = new DownlaodRecyclerViewAdapter(this, wallpaperInfo, list); binding.downloadRecycler.setAdapter(adapter); binding.downloadRecycler.setLayoutManager(new GridLayoutManager(this, 2)); @@ -114,8 +116,8 @@ public class DownloadActivity extends AppCompatActivity { if (wallpaperInfo.getPreview() != null) { // 应用圆角变换 RequestOptions options = new RequestOptions() - .placeholder(R.drawable.ic_launcher_background) - .error(R.drawable.ic_launcher_background) + .placeholder(R.mipmap.splash) + .error(R.mipmap.splash) .transform(new CenterCrop()) .transform(new RoundedCorners(16)); // 设置圆角度数 @@ -124,7 +126,7 @@ public class DownloadActivity extends AppCompatActivity { .apply(options) .into(binding.downloadImage); } else { - binding.downloadImage.setImageResource(R.drawable.ic_launcher_foreground); + binding.downloadImage.setImageResource(R.mipmap.splash); } unzipPath = getCacheDir() + "/" + name; @@ -170,7 +172,14 @@ public class DownloadActivity extends AppCompatActivity { if (successful) { Mytool.unZip(this, unzipPath, resource, (successful1, resDirPath) -> { if (successful1) { + // 将路径存储到 SharedPreferences + SharedPreferences sharedPreferences = getSharedPreferences("keyboard_prefs", MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString("wallpaper_path", resDirPath); + editor.apply(); // 使用 apply() 异步保存 + StaticValue.PATH = resDirPath; + if (otherdata != null) { otherdata.setPath(resDirPath); otherdata.setDownloaded(true); @@ -182,10 +191,13 @@ public class DownloadActivity extends AppCompatActivity { Toast.makeText(DownloadActivity.this, "Decompression failure", Toast.LENGTH_SHORT).show(); }); } + // 解压完成,隐藏进度条 runOnUiThread(() -> { progressBar.setVisibility(View.GONE); view.setVisibility(View.GONE); + Intent intent = new Intent(DownloadActivity.this, WriteActivity.class); + startActivity(intent); }); }); } else { diff --git a/app/src/main/java/com/key/vibekeyboard/Activity/MainActivity.java b/app/src/main/java/com/key/vibekeyboard/Activity/MainActivity.java index c79e952..3b05b7b 100644 --- a/app/src/main/java/com/key/vibekeyboard/Activity/MainActivity.java +++ b/app/src/main/java/com/key/vibekeyboard/Activity/MainActivity.java @@ -11,6 +11,7 @@ import com.key.vibekeyboard.Adapter.MainViewpager2Adapter; import com.key.vibekeyboard.AppApplication; import com.key.vibekeyboard.Dialog.PermissionRequestDialog; import com.key.vibekeyboard.Dialog.RecommendedDialog; +import com.key.vibekeyboard.R; import com.key.vibekeyboard.Room.Category; import com.key.vibekeyboard.Room.WallpaperInfo; import com.key.vibekeyboard.Utils.Mytool; @@ -52,7 +53,7 @@ public class MainActivity extends AppCompatActivity { showPermissionDialog(); // 否则显示权限请求对话框 } - binding.mainViewpager.setUserInputEnabled(false);//禁止页面左右滑动 +// binding.mainViewpager.setUserInputEnabled(false);//禁止页面左右滑动 // 初始化 TabLayout(标签栏) tabLayout(); @@ -83,11 +84,11 @@ public class MainActivity extends AppCompatActivity { // 设置默认的图标,未选中状态的图标 if (position == 0) { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_camera); // 第一个 Tab 图标 + tabBinding.iconCustom.setImageResource(R.drawable.home_select); // 第一个 Tab 图标 } else if (position == 1) { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_agenda); // 第二个 Tab 图标 + tabBinding.iconCustom.setImageResource(R.drawable.collection); // 第二个 Tab 图标 } else { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_preferences); // 第三个 Tab 图标 + tabBinding.iconCustom.setImageResource(R.drawable.setting); // 第三个 Tab 图标 } }).attach(); // 绑定 TabLayout 和 ViewPager @@ -99,11 +100,11 @@ public class MainActivity extends AppCompatActivity { MainTabCustomBinding tabBinding = MainTabCustomBinding.bind(Objects.requireNonNull(tab.getCustomView())); int position = tab.getPosition(); if (position == 0) { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_camera); // 选中状态的图标 + tabBinding.iconCustom.setImageResource(R.drawable.home_select); // 选中状态的图标 } else if (position == 1) { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_compass); // 第二个 Tab 选中图标 + tabBinding.iconCustom.setImageResource(R.drawable.collection_select); // 第二个 Tab 选中图标 } else { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_rotate); // 第三个 Tab 选中图标 + tabBinding.iconCustom.setImageResource(R.drawable.setting_select); // 第三个 Tab 选中图标 } } @@ -113,11 +114,11 @@ public class MainActivity extends AppCompatActivity { MainTabCustomBinding tabBinding = MainTabCustomBinding.bind(Objects.requireNonNull(tab.getCustomView())); int position = tab.getPosition(); if (position == 0) { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_gallery); // 未选中状态的图标 + tabBinding.iconCustom.setImageResource(R.drawable.home); // 未选中状态的图标 } else if (position == 1) { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_agenda); // 第二个 Tab 未选中图标 + tabBinding.iconCustom.setImageResource(R.drawable.collection); // 第二个 Tab 未选中图标 } else { - tabBinding.iconCustom.setImageResource(android.R.drawable.ic_menu_preferences); // 第三个 Tab 未选中图标 + tabBinding.iconCustom.setImageResource(R.drawable.setting); // 第三个 Tab 未选中图标 } } diff --git a/app/src/main/java/com/key/vibekeyboard/Activity/SearchActivity.java b/app/src/main/java/com/key/vibekeyboard/Activity/SearchActivity.java index 94b6e9b..3c27254 100644 --- a/app/src/main/java/com/key/vibekeyboard/Activity/SearchActivity.java +++ b/app/src/main/java/com/key/vibekeyboard/Activity/SearchActivity.java @@ -40,6 +40,8 @@ public class SearchActivity extends AppCompatActivity { binding.recyclerView.setAdapter(adapter); + binding.back.setOnClickListener(v -> finish()); + // 监听输入框内容变化 binding.searchEditText.addTextChangedListener(new TextWatcher() { @Override diff --git a/app/src/main/java/com/key/vibekeyboard/Activity/SplashActivity.java b/app/src/main/java/com/key/vibekeyboard/Activity/SplashActivity.java index 51000e8..95067bd 100644 --- a/app/src/main/java/com/key/vibekeyboard/Activity/SplashActivity.java +++ b/app/src/main/java/com/key/vibekeyboard/Activity/SplashActivity.java @@ -7,27 +7,32 @@ import android.widget.ProgressBar; import androidx.appcompat.app.AppCompatActivity; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.key.vibekeyboard.R; import com.key.vibekeyboard.databinding.ActivitySplashBinding; public class SplashActivity extends AppCompatActivity { private ActivitySplashBinding binding; - private static final long TOTAL_TIME = 110; + private static final long TOTAL_TIME = 3000; private CountDownTimer countDownTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // 初始化 ViewBinding binding = ActivitySplashBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - // 获取进度条引用 ProgressBar progressBar = binding.progressBar; - // 初始化倒计时 + Glide.with(this) + .load(R.mipmap.ic_launcher_foreground) + .transform(new RoundedCorners(16)) + .into(binding.splashImage); + countDownTimer = new CountDownTimer(TOTAL_TIME, 100) { // 每100ms更新一次 @Override public void onTick(long millisUntilFinished) { @@ -38,29 +43,24 @@ public class SplashActivity extends AppCompatActivity { @Override public void onFinish() { - // 确保进度条更新至满值 progressBar.setProgress(100); - // 跳转到主界面 startMain(); } }; - // 开始倒计时 countDownTimer.start(); } - // 跳转到主界面的方法 private void startMain() { Intent intent = new Intent(SplashActivity.this, MainActivity.class); startActivity(intent); - finish(); // 结束当前 Activity + finish(); } @Override protected void onDestroy() { super.onDestroy(); - // 取消倒计时,防止内存泄漏 if (countDownTimer != null) { countDownTimer.cancel(); } diff --git a/app/src/main/java/com/key/vibekeyboard/Activity/WriteActivity.java b/app/src/main/java/com/key/vibekeyboard/Activity/WriteActivity.java new file mode 100644 index 0000000..5c82d62 --- /dev/null +++ b/app/src/main/java/com/key/vibekeyboard/Activity/WriteActivity.java @@ -0,0 +1,21 @@ +package com.key.vibekeyboard.Activity; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; + +import com.key.vibekeyboard.databinding.ActivityWriteBinding; + +public class WriteActivity extends AppCompatActivity { + + private ActivityWriteBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityWriteBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + binding.back.setOnClickListener(v -> finish()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/key/vibekeyboard/Adapter/CategoryRecyclerViewAdapter.java b/app/src/main/java/com/key/vibekeyboard/Adapter/CategoryRecyclerViewAdapter.java index 2ece9d4..d9ccebf 100644 --- a/app/src/main/java/com/key/vibekeyboard/Adapter/CategoryRecyclerViewAdapter.java +++ b/app/src/main/java/com/key/vibekeyboard/Adapter/CategoryRecyclerViewAdapter.java @@ -46,13 +46,15 @@ public class CategoryRecyclerViewAdapter extends RecyclerView.Adapter limitedList = list.subList(0, Math.min(20, list.size())); + if (wallpaperInfo != null) { holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, DownloadActivity.class); intent.putExtra("wallpaperInfo", wallpaperInfo); // wallpaperInfo 已经实现了 Parcelable - intent.putParcelableArrayListExtra("list", new ArrayList<>(list)); // list 中的 WallpaperInfo 对象实现了 Parcelable + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); // list 中的 WallpaperInfo 对象实现了 Parcelable context.startActivity(intent); } }); @@ -63,8 +65,8 @@ public class CategoryRecyclerViewAdapter extends RecyclerView.Adapter limitedList = list.subList(0, Math.min(20, list.size())); holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(downloadActivity, DownloadActivity.class); intent.putExtra("wallpaperInfo", wallpaperInfo1); // wallpaperInfo 已经实现了 Parcelable - intent.putParcelableArrayListExtra("list", new ArrayList<>(list)); // list 中的 WallpaperInfo 对象实现了 Parcelable + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); // list 中的 WallpaperInfo 对象实现了 Parcelable downloadActivity.startActivity(intent); } }); // 应用圆角变换 RequestOptions options = new RequestOptions() - .placeholder(R.drawable.ic_launcher_background) - .error(R.drawable.ic_launcher_background) + .placeholder(R.mipmap.splash) + .error(R.mipmap.splash) .transform(new CenterCrop()) .transform(new RoundedCorners(16)); // 设置圆角度数 diff --git a/app/src/main/java/com/key/vibekeyboard/Adapter/FavoriteRecyclerViewAdapter.java b/app/src/main/java/com/key/vibekeyboard/Adapter/FavoriteRecyclerViewAdapter.java index e5cf876..2fc80b0 100644 --- a/app/src/main/java/com/key/vibekeyboard/Adapter/FavoriteRecyclerViewAdapter.java +++ b/app/src/main/java/com/key/vibekeyboard/Adapter/FavoriteRecyclerViewAdapter.java @@ -47,13 +47,15 @@ public class FavoriteRecyclerViewAdapter extends RecyclerView.Adapter limitedList = list.subList(0, Math.min(20, list.size())); + if (wallpaperInfo != null) { holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, DownloadActivity.class); intent.putExtra("wallpaperInfo", wallpaperInfo); // wallpaperInfo 已经实现了 Parcelable - intent.putParcelableArrayListExtra("list", new ArrayList<>(list)); // list 中的 WallpaperInfo 对象实现了 Parcelable + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); // list 中的 WallpaperInfo 对象实现了 Parcelable context.startActivity(intent); } }); @@ -61,8 +63,8 @@ public class FavoriteRecyclerViewAdapter extends RecyclerView.Adapter limitedList = list.subList(0, Math.min(20, list.size())); + holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, DownloadActivity.class); intent.putExtra("wallpaperInfo", wallpaperInfo); // wallpaperInfo 已经实现了 Parcelable - intent.putParcelableArrayListExtra("list", new ArrayList<>(list)); // list 中的 WallpaperInfo 对象实现了 Parcelable + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); // list 中的 WallpaperInfo 对象实现了 Parcelable context.startActivity(intent); } }); @@ -60,8 +62,8 @@ public class HomeRecyclerViewAdapter extends RecyclerView.Adapter { @@ -46,23 +47,26 @@ public class HomeViewPager2Adapter extends RecyclerView.Adapter list = category.getList(); WallpaperInfo categoryWallpaperInfo = category.getList().get(position); - WallpaperInfo wallpaperInfo = category.getList().get(0); // 假设只使用列表的第一个壁纸 + Random random = new Random(); + int randomIndex = random.nextInt(20); + WallpaperInfo wallpaperInfo = category.getList().get(randomIndex); + + List limitedList = list.subList(0, Math.min(20, list.size())); holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, DownloadActivity.class); intent.putExtra("wallpaperInfo", wallpaperInfo); - intent.putParcelableArrayListExtra("list", new ArrayList<>(list)); + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); context.startActivity(intent); } }); - // 应用圆角变换 RequestOptions options = new RequestOptions() - .placeholder(R.drawable.ic_launcher_background) - .error(R.drawable.ic_launcher_background) + .placeholder(R.mipmap.splash) + .error(R.mipmap.splash) .transform(new CenterCrop()) .transform(new RoundedCorners(16)); // 设置圆角度数 diff --git a/app/src/main/java/com/key/vibekeyboard/Adapter/SearchRecyclerViewAdapter.java b/app/src/main/java/com/key/vibekeyboard/Adapter/SearchRecyclerViewAdapter.java index d8858a1..663dd70 100644 --- a/app/src/main/java/com/key/vibekeyboard/Adapter/SearchRecyclerViewAdapter.java +++ b/app/src/main/java/com/key/vibekeyboard/Adapter/SearchRecyclerViewAdapter.java @@ -42,19 +42,21 @@ public class SearchRecyclerViewAdapter extends RecyclerView.Adapter limitedList = wallpaperList.subList(0, Math.min(20, wallpaperList.size())); + holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, DownloadActivity.class); intent.putExtra("wallpaperInfo", wallpaperInfo); // wallpaperInfo 已经实现了 Parcelable - intent.putParcelableArrayListExtra("list", new ArrayList<>(wallpaperList)); // list 中的 WallpaperInfo 对象实现了 Parcelable + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); // list 中的 WallpaperInfo 对象实现了 Parcelable context.startActivity(intent); } }); // 应用圆角变换 RequestOptions options = new RequestOptions() - .placeholder(R.drawable.ic_launcher_background) - .error(R.drawable.ic_launcher_background) + .placeholder(R.mipmap.splash) + .error(R.mipmap.splash) .transform(new CenterCrop()) .transform(new RoundedCorners(16)); // 设置圆角度数 diff --git a/app/src/main/java/com/key/vibekeyboard/AppApplication.java b/app/src/main/java/com/key/vibekeyboard/AppApplication.java index 162de7b..99ffe82 100644 --- a/app/src/main/java/com/key/vibekeyboard/AppApplication.java +++ b/app/src/main/java/com/key/vibekeyboard/AppApplication.java @@ -18,6 +18,8 @@ public class AppApplication extends Application { public static AppApplication instance; public static List categories; + public static final int DB_Version = 1; + public static final String DB_Name = "image_database"; @Override public void onCreate() { super.onCreate(); diff --git a/app/src/main/java/com/key/vibekeyboard/Dialog/PermissionRequestDialog.java b/app/src/main/java/com/key/vibekeyboard/Dialog/PermissionRequestDialog.java index f4b9c5c..1844322 100644 --- a/app/src/main/java/com/key/vibekeyboard/Dialog/PermissionRequestDialog.java +++ b/app/src/main/java/com/key/vibekeyboard/Dialog/PermissionRequestDialog.java @@ -3,7 +3,10 @@ package com.key.vibekeyboard.Dialog; import android.app.Dialog; import android.content.Context; import android.content.Intent; +import android.database.ContentObserver; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; @@ -16,7 +19,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.key.vibekeyboard.AppApplication; +import com.key.vibekeyboard.R; import com.key.vibekeyboard.Utils.Mytool; import com.key.vibekeyboard.databinding.DialogPermissionBinding; @@ -24,11 +30,11 @@ public class PermissionRequestDialog extends DialogFragment { private DialogPermissionBinding binding; private InputMethodManager methodManager; + private ContentObserver inputMethodObserver; // 用于监听输入法变化 @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - } @Override @@ -42,25 +48,23 @@ public class PermissionRequestDialog extends DialogFragment { public void onResume() { super.onResume(); Dialog dialog = getDialog(); - setCancelable(true); // 设置为false对话框不可点击外面取消 + setCancelable(true); if (dialog != null && dialog.getWindow() != null) { Window window = dialog.getWindow(); - // 设置宽度为屏幕的 90%,高度自适应内容 window.setLayout((int) (getResources().getDisplayMetrics().widthPixels * 0.9), WindowManager.LayoutParams.WRAP_CONTENT); } - // 每次对话框显示时调用 update() update(); } - @Override - public void onPause() { - super.onPause(); - } - public void init() { methodManager = (InputMethodManager) AppApplication.instance.getSystemService(Context.INPUT_METHOD_SERVICE); + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher_foreground) + .transform(new RoundedCorners(16)) + .into(binding.imageView); + binding.firstIconTextLayout.setOnClickListener(v -> { Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS); startActivity(intent); @@ -70,9 +74,25 @@ public class PermissionRequestDialog extends DialogFragment { methodManager.showInputMethodPicker(); }); - binding.imageView.setOnClickListener(v -> { - dismiss(); - }); + binding.imageView.setOnClickListener(v -> dismiss()); + + // 注册ContentObserver监听输入法变化 + inputMethodObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + if (Mytool.isStep1() && Mytool.isStep2()) { + dismiss(); // 条件满足,关闭对话框 + } + } + }; + + // 注册观察输入法变化 + requireContext().getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.DEFAULT_INPUT_METHOD), + false, + inputMethodObserver + ); } public void update() { @@ -93,8 +113,9 @@ public class PermissionRequestDialog extends DialogFragment { @Override public void onDestroy() { super.onDestroy(); + if (inputMethodObserver != null) { + requireContext().getContentResolver().unregisterContentObserver(inputMethodObserver); + } binding = null; } } - - diff --git a/app/src/main/java/com/key/vibekeyboard/Dialog/RecommendedDialog.java b/app/src/main/java/com/key/vibekeyboard/Dialog/RecommendedDialog.java index dc429d6..a7d7d47 100644 --- a/app/src/main/java/com/key/vibekeyboard/Dialog/RecommendedDialog.java +++ b/app/src/main/java/com/key/vibekeyboard/Dialog/RecommendedDialog.java @@ -62,6 +62,8 @@ public class RecommendedDialog extends DialogFragment { int randomIndex = random.nextInt(list.size()); wallpaperInfo = list.get(randomIndex); // 获取随机的壁纸信息 + List limitedList = list.subList(0, Math.min(20, list.size())); + // 加载图像 loadImage(); @@ -73,7 +75,7 @@ public class RecommendedDialog extends DialogFragment { // 将选中的壁纸信息传递给下一个 Activity intent.putExtra("wallpaperInfo", wallpaperInfo); // wallpaperInfo 已经实现了 Parcelable // 将壁纸列表传递给下一个 Activity - intent.putParcelableArrayListExtra("list", new ArrayList<>(list)); // list 中的 WallpaperInfo 对象实现了 Parcelable + intent.putParcelableArrayListExtra("list", new ArrayList<>(limitedList)); // list 中的 WallpaperInfo 对象实现了 Parcelable dismiss(); // 关闭当前对话框 requireContext().startActivity(intent); // 启动下载界面 } @@ -86,8 +88,8 @@ public class RecommendedDialog extends DialogFragment { if (wallpaperInfo.getPreview() != null && !wallpaperInfo.getPreview().isEmpty()) { // 设置图像的加载选项 RequestOptions options = new RequestOptions() - .placeholder(R.drawable.ic_launcher_foreground) // 图片加载中的占位图 - .error(R.drawable.ic_launcher_foreground) // 图片加载失败时的备用图 + .placeholder(R.mipmap.splash) + .error(R.mipmap.splash) .transform(new CenterCrop()) // 中心裁剪,保证图片填满控件 .transform(new RoundedCorners(16)); // 设置圆角,16px @@ -99,7 +101,7 @@ public class RecommendedDialog extends DialogFragment { .into(binding.imageView); // 设置到 ImageView 上显示 } else { // 如果预览图 URL 为空,显示默认图像 - binding.imageView.setImageResource(R.drawable.ic_launcher_background); // 默认图像 + binding.imageView.setImageResource(R.mipmap.splash); // 默认图像 } } diff --git a/app/src/main/java/com/key/vibekeyboard/Fragment/FavoriteFragment.java b/app/src/main/java/com/key/vibekeyboard/Fragment/FavoriteFragment.java index d35bf35..f2e7f5a 100644 --- a/app/src/main/java/com/key/vibekeyboard/Fragment/FavoriteFragment.java +++ b/app/src/main/java/com/key/vibekeyboard/Fragment/FavoriteFragment.java @@ -17,48 +17,54 @@ import com.key.vibekeyboard.Utils.ItemDecoration; import com.key.vibekeyboard.ViewModel.FavoriteViewModel; import com.key.vibekeyboard.databinding.FragmentFavoriteBinding; +import java.util.ArrayList; import java.util.List; - public class FavoriteFragment extends Fragment { +public class FavoriteFragment extends Fragment { - private FragmentFavoriteBinding binding; - private FavoriteRecyclerViewAdapter adapter; + private FragmentFavoriteBinding binding; + private FavoriteRecyclerViewAdapter adapter; + private final List wallpaperInfoList = new ArrayList<>(); - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - binding = FragmentFavoriteBinding.inflate(inflater, container, false); + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentFavoriteBinding.inflate(inflater, container, false); - // 初始化 RecyclerView 和 LayoutManager - binding.favoriteRecyclerview.setLayoutManager(new GridLayoutManager(getContext(), 2)); - binding.favoriteRecyclerview.addItemDecoration(new ItemDecoration(16, 19, 10)); + adapter = new FavoriteRecyclerViewAdapter(requireContext(), wallpaperInfoList); + binding.favoriteRecyclerview.setAdapter(adapter); - // 获取 ViewModel 实例 - FavoriteViewModel favoriteViewModel = new ViewModelProvider(this).get(FavoriteViewModel.class); + // 初始化 RecyclerView 和 LayoutManager + binding.favoriteRecyclerview.setLayoutManager(new GridLayoutManager(getContext(), 2)); + binding.favoriteRecyclerview.addItemDecoration(new ItemDecoration(16, 19, 10)); - // 监听 LiveData 的变化并更新 RecyclerView - favoriteViewModel.getFavoriteList().observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(List wallpaperInfoList) { - // 更新 RecyclerView 的 Adapter - if (adapter == null) { - adapter = new FavoriteRecyclerViewAdapter(requireContext(), wallpaperInfoList); - binding.favoriteRecyclerview.setAdapter(adapter); - } else { - // 更新现有 Adapter 数据 - adapter.updateList(wallpaperInfoList); - } + // 获取 ViewModel 实例 + FavoriteViewModel favoriteViewModel = new ViewModelProvider(this).get(FavoriteViewModel.class); + + // 监听 LiveData 的变化并更新 RecyclerView + favoriteViewModel.getFavoriteList().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(List wallpaperInfoList) { + + if (wallpaperInfoList.isEmpty()) { + binding.backgroundImage.setVisibility(View.VISIBLE); + binding.backgroundText.setVisibility(View.VISIBLE); + } else { + binding.backgroundImage.setVisibility(View.GONE); + binding.backgroundText.setVisibility(View.GONE); } - }); + adapter.updateList(wallpaperInfoList); + } + }); - return binding.getRoot(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - binding = null; - } + return binding.getRoot(); } + @Override + public void onDestroy() { + super.onDestroy(); + binding = null; + } +} + diff --git a/app/src/main/java/com/key/vibekeyboard/Fragment/HomeFragment.java b/app/src/main/java/com/key/vibekeyboard/Fragment/HomeFragment.java index eda9878..dbcb5b2 100644 --- a/app/src/main/java/com/key/vibekeyboard/Fragment/HomeFragment.java +++ b/app/src/main/java/com/key/vibekeyboard/Fragment/HomeFragment.java @@ -12,11 +12,15 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.ImageView; +import android.widget.LinearLayout; import com.key.vibekeyboard.Activity.CategoryActivity; import com.key.vibekeyboard.Activity.SearchActivity; import com.key.vibekeyboard.Adapter.HomeRecyclerViewAdapter; import com.key.vibekeyboard.Adapter.HomeViewPager2Adapter; +import com.key.vibekeyboard.R; import com.key.vibekeyboard.Room.Category; import com.key.vibekeyboard.Utils.ItemDecoration; import com.key.vibekeyboard.Utils.Mytool; @@ -29,6 +33,7 @@ public class HomeFragment extends Fragment { private FragmentHomeBinding binding; private HomeViewPager2Adapter homeViewPager2Adapter; + private List categories; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, @@ -45,12 +50,13 @@ public class HomeFragment extends Fragment { public void initData() { // 解析Json - List categories = Mytool.parseJsonToList("keyboard.json"); + categories = Mytool.parseJsonToList("keyboard.json"); Log.d("dsd", "size" + categories.size()); // 设置ViewPager2 homeViewPager2Adapter = new HomeViewPager2Adapter(requireContext(), categories); binding.homeViewPager.setAdapter(homeViewPager2Adapter); + setupIndicators(categories.size()); // 设置RecyclerView binding.homeRecycler.setLayoutManager(new GridLayoutManager(getContext(), 2)); @@ -91,8 +97,22 @@ public class HomeFragment extends Fragment { } }); + binding.homeViewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + // 移除布局监听器,避免重复执行 + binding.homeViewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this); + // 动态生成圆点指示器 + setupIndicators(categories.size()); + // 初始设置选中的圆点 + updateIndicators(0); + } + }); + // 设置自动轮播功能 autoSlideImages(); + + setupViewPagerListener(); } // 自动轮播图片 @@ -118,6 +138,54 @@ public class HomeFragment extends Fragment { }, delay); } + private void setupViewPagerListener() { + binding.homeViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + + updateIndicators(position); // 更新圆点 + + } + }); + + } + + private void setupIndicators(int count) { + LinearLayout indicatorLayout = binding.indicatorLayout; + indicatorLayout.removeAllViews(); // 清空原有的圆点 + + for (int i = 0; i < count; i++) { + ImageView indicator = new ImageView(getContext()); + indicator.setImageResource(R.drawable.circle_indicator); // 默认圆点 + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.setMargins(8, 0, 8, 0); // 设置圆点间距 + indicator.setLayoutParams(params); + indicatorLayout.addView(indicator); + } + + // 延迟设置选中的圆点 + indicatorLayout.post(() -> updateIndicators(0)); // 设置第一个圆点为选中状态 + } + + private void updateIndicators(int position) { + LinearLayout indicatorLayout = binding.indicatorLayout; + int childCount = indicatorLayout.getChildCount(); + + for (int i = 0; i < childCount; i++) { + ImageView indicator = (ImageView) indicatorLayout.getChildAt(i); + if (i == position) { + indicator.setImageResource(R.drawable.circle_indicator_selected); // 当前页选中的圆点 + } else { + indicator.setImageResource(R.drawable.circle_indicator); // 默认圆点 + } + } + + // 强制更新布局,确保圆点大小正确 + indicatorLayout.requestLayout(); + } + @Override public void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/key/vibekeyboard/Keyboard/CustomViewConfig.java b/app/src/main/java/com/key/vibekeyboard/Keyboard/CustomViewConfig.java index fdfe0f3..fb05adc 100644 --- a/app/src/main/java/com/key/vibekeyboard/Keyboard/CustomViewConfig.java +++ b/app/src/main/java/com/key/vibekeyboard/Keyboard/CustomViewConfig.java @@ -1,10 +1,14 @@ package com.key.vibekeyboard.Keyboard; +import static android.content.Context.MODE_PRIVATE; + import android.content.Context; +import android.content.SharedPreferences; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.util.Log; import android.util.Xml; import androidx.core.content.ContextCompat; @@ -113,6 +117,7 @@ public class CustomViewConfig { return null; } BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), BitmapFactory.decodeFile(filePath)); + Log.d("custom", "filePath" + filePath); return bitmapDrawable; } @@ -162,7 +167,7 @@ public class CustomViewConfig { } public void updateConfig(Context con) { - String resDirPath = StaticValue.PATH; + String resDirPath = getSavedWallpaperPath(AppApplication.getContext()); if (!resDirPath.isEmpty()) { updateKeyColor(resDirPath); BG = getBackGround(con, resDirPath); @@ -175,5 +180,11 @@ public class CustomViewConfig { } } + public String getSavedWallpaperPath(Context context) { + // 读取 SharedPreferences 中保存的路径 + SharedPreferences sharedPreferences = context.getSharedPreferences("keyboard_prefs", MODE_PRIVATE); + return sharedPreferences.getString("wallpaper_path", ""); // 如果没有保存,返回空字符串 + } + } diff --git a/app/src/main/java/com/key/vibekeyboard/Keyboard/KeyboardService.java b/app/src/main/java/com/key/vibekeyboard/Keyboard/KeyboardService.java index 358c6f5..896d1b7 100644 --- a/app/src/main/java/com/key/vibekeyboard/Keyboard/KeyboardService.java +++ b/app/src/main/java/com/key/vibekeyboard/Keyboard/KeyboardService.java @@ -33,6 +33,9 @@ public class KeyboardService extends InputMethodService implements KeyboardView. // 加载主键盘视图布局文件 View inputView = LayoutInflater.from(this).inflate(R.layout.keyboard_view, null, false); myKeyboard = inputView.findViewById(R.id.keyboardView); // 绑定键盘视图 + + setBackground(); + myKeyboard.setKeyboard(new MyKeyboard.KeyBoard(this, ViewXmls[0])); // 设置默认键盘布局 myKeyboard.setOnKeyboardActionListener(this); // 设置键盘操作监听器 // myKeyboard.setPreviewEnabled(false); // 可选项,禁用按键预览 @@ -43,6 +46,10 @@ public class KeyboardService extends InputMethodService implements KeyboardView. @Override public void onWindowShown() { super.onWindowShown(); + setBackground(); + } + + private void setBackground(){ curImeAction = getImeAction(getCurrentInputEditorInfo().imeOptions); // 获取当前的输入法动作类型 myKeyboard.updateConfigView(this, curImeAction); // 更新键盘配置视图 myKeyboard.invalidate(); // 刷新键盘视图 @@ -54,18 +61,6 @@ public class KeyboardService extends InputMethodService implements KeyboardView. return i; } - // 键被按下时调用 - @Override - public void onPress(int primaryCode) { - - } - - // 键被释放时调用 - @Override - public void onRelease(int primaryCode) { - - } - // 键盘按键被按下时调用 @Override public void onKey(int primaryCode, int[] keyCodes) { @@ -125,6 +120,19 @@ public class KeyboardService extends InputMethodService implements KeyboardView. myKeyboard.setKeyboard(new MyKeyboard.KeyBoard(this, ViewXmls[i])); // 设置新的键盘布局 } + // 键被按下时调用 + @Override + public void onPress(int primaryCode) { + + } + + // 键被释放时调用 + @Override + public void onRelease(int primaryCode) { + + } + + @Override public void onText(CharSequence text) { // 文本输入时调用(未实现) diff --git a/app/src/main/java/com/key/vibekeyboard/Room/MyDatabase.java b/app/src/main/java/com/key/vibekeyboard/Room/MyDatabase.java index dbff1d4..4871635 100644 --- a/app/src/main/java/com/key/vibekeyboard/Room/MyDatabase.java +++ b/app/src/main/java/com/key/vibekeyboard/Room/MyDatabase.java @@ -7,7 +7,7 @@ import androidx.room.RoomDatabase; import com.key.vibekeyboard.AppApplication; -@Database(entities = {WallpaperInfo.class}, version = 1, exportSchema = false) +@Database(entities = {WallpaperInfo.class}, version = AppApplication.DB_Version, exportSchema = false) public abstract class MyDatabase extends RoomDatabase { public abstract WallpaperInfoDao wallpaperInfoDao(); @@ -17,7 +17,7 @@ public abstract class MyDatabase extends RoomDatabase { public static MyDatabase getInstance() { if (INSTANCE == null) { synchronized (MyDatabase.class) { - INSTANCE = Room.databaseBuilder(AppApplication.getContext(), MyDatabase.class, "Database").build(); + INSTANCE = Room.databaseBuilder(AppApplication.getContext(), MyDatabase.class, AppApplication.DB_Name).build(); } } return INSTANCE; diff --git a/app/src/main/java/com/key/vibekeyboard/Utils/Mytool.java b/app/src/main/java/com/key/vibekeyboard/Utils/Mytool.java index 3d4a84d..030f407 100644 --- a/app/src/main/java/com/key/vibekeyboard/Utils/Mytool.java +++ b/app/src/main/java/com/key/vibekeyboard/Utils/Mytool.java @@ -8,6 +8,7 @@ import android.graphics.drawable.Drawable; import android.inputmethodservice.Keyboard; import android.os.Build; import android.provider.Settings; +import android.util.Log; import android.util.TypedValue; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; @@ -44,9 +45,11 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.RandomAccessFile; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -178,26 +181,42 @@ public class Mytool { Toast.makeText(context, context.getString(R.string.app_name), Toast.LENGTH_SHORT).show(); } else { String itemFilePath = ""; + + // 使用应用的外部文件目录来存储解压后的文件 + File externalDir = context.getExternalFilesDir(null); + if (externalDir == null) { + externalDir = context.getFilesDir(); // 如果外部存储不可用,则回退到内部存储 + } + + String extractPath = new File(externalDir, "ExtractedFiles").getAbsolutePath(); // 定义一个专门的文件夹存储解压文件 + RandomAccessFile accessFile = new RandomAccessFile(resource, "r"); RandomAccessFileInStream inStream = new RandomAccessFileInStream(accessFile); IInArchive iInArchive = SevenZip.openInArchive(ArchiveFormat.SEVEN_ZIP, inStream); ISimpleInArchiveItem[] archiveItems = iInArchive.getSimpleInterface().getArchiveItems(); + // 解压每一个文件 for (int d = 0; d < archiveItems.length; d++) { ISimpleInArchiveItem simple = archiveItems[d]; - File file = new File(urlpath, simple.getPath()); + File file = new File(extractPath, simple.getPath()); // 将解压路径设置为外部存储目录 if (!simple.isFolder()) { // 如果不是文件夹,解压文件 RandomAccessFileOutStream outStream = new RandomAccessFileOutStream(new RandomAccessFile(file, "rw")); simple.extractSlow(outStream); itemFilePath = file.getPath(); // 记录解压后的文件路径 + Log.d("--------", "path: " + itemFilePath); } else { boolean mkdirs = file.mkdirs(); // 创建文件夹 } } + inStream.close(); iInArchive.close(); + + // 截取资源路径 int res = itemFilePath.indexOf("res"); String substring = itemFilePath.substring(0, res + 3); // 截取资源路径 + Log.d("--------", "substring: " + substring); + callback.onUnzipCall(true, substring); // 调用回调函数 } } @@ -227,7 +246,23 @@ public class Mytool { public boolean onResourceReady(@NonNull File resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { // 下载成功时的回调 try { - callback.onDownloadCall(true, resource); // 调用回调方法,传递成功状态和下载的文件 + // 使用外部存储目录或内部存储目录 + File externalDir = context.getExternalFilesDir(null); + if (externalDir == null) { + externalDir = context.getFilesDir(); // 如果外部存储不可用,则回退到内部存储 + } + + // 将下载文件保存到外部存储的特定文件夹 + File downloadDir = new File(externalDir, "DownloadedFiles"); + if (!downloadDir.exists()) { + downloadDir.mkdirs(); // 创建目录 + } + + File destinationFile = new File(downloadDir, resource.getName()); + copyFile(resource, destinationFile); // 使用FileUtils来复制文件 + + callback.onDownloadCall(true, destinationFile); // 调用回调方法,传递成功状态和保存后的文件路径 + Log.d("--------", "resource: " + destinationFile); } catch (FileNotFoundException e) { throw new RuntimeException(e); // 如果捕获到FileNotFoundException异常,抛出运行时异常 } catch (IOException e) { @@ -238,6 +273,17 @@ public class Mytool { }).preload(); // 预加载文件 } + public static void copyFile(File sourceFile, File destinationFile) throws IOException { + try (InputStream in = new FileInputStream(sourceFile); + OutputStream out = new FileOutputStream(destinationFile)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + } + // 将文件内容转换为字符串 public static String fileToString(File file) throws IOException { FileInputStream fileInputStream = new FileInputStream(file); diff --git a/app/src/main/res/drawable/all.xml b/app/src/main/res/drawable/all.xml new file mode 100644 index 0000000..c39dd5f --- /dev/null +++ b/app/src/main/res/drawable/all.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/circle_indicator.xml b/app/src/main/res/drawable/circle_indicator.xml new file mode 100644 index 0000000..59ad4e9 --- /dev/null +++ b/app/src/main/res/drawable/circle_indicator.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/circle_indicator_selected.xml b/app/src/main/res/drawable/circle_indicator_selected.xml new file mode 100644 index 0000000..941c09d --- /dev/null +++ b/app/src/main/res/drawable/circle_indicator_selected.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/collection.xml b/app/src/main/res/drawable/collection.xml new file mode 100644 index 0000000..38315b6 --- /dev/null +++ b/app/src/main/res/drawable/collection.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/collection_select.xml b/app/src/main/res/drawable/collection_select.xml new file mode 100644 index 0000000..566ac09 --- /dev/null +++ b/app/src/main/res/drawable/collection_select.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/edit_text_border.xml b/app/src/main/res/drawable/edit_text_border.xml new file mode 100644 index 0000000..ea785cc --- /dev/null +++ b/app/src/main/res/drawable/edit_text_border.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/home.xml b/app/src/main/res/drawable/home.xml new file mode 100644 index 0000000..732d2b3 --- /dev/null +++ b/app/src/main/res/drawable/home.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/home_select.xml b/app/src/main/res/drawable/home_select.xml new file mode 100644 index 0000000..f86bfe5 --- /dev/null +++ b/app/src/main/res/drawable/home_select.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/setting.xml b/app/src/main/res/drawable/setting.xml new file mode 100644 index 0000000..f2330b9 --- /dev/null +++ b/app/src/main/res/drawable/setting.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/setting_select.xml b/app/src/main/res/drawable/setting_select.xml new file mode 100644 index 0000000..9660add --- /dev/null +++ b/app/src/main/res/drawable/setting_select.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/un_rounded_corners.xml b/app/src/main/res/drawable/un_rounded_corners.xml index 3922d39..e5fe793 100644 --- a/app/src/main/res/drawable/un_rounded_corners.xml +++ b/app/src/main/res/drawable/un_rounded_corners.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_category.xml b/app/src/main/res/layout/activity_category.xml index 7c6ff13..23d2e0f 100644 --- a/app/src/main/res/layout/activity_category.xml +++ b/app/src/main/res/layout/activity_category.xml @@ -11,18 +11,21 @@ android:id="@+id/category_back" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="11dp" - android:src="@android:drawable/ic_menu_revert" + android:layout_marginStart="15dp" + android:src="@drawable/back" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/category_title" + app:layout_constraintBottom_toBottomOf="@+id/category_title"/> @@ -31,10 +34,11 @@ android:id="@+id/category_search" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="11dp" + android:layout_marginEnd="15dp" android:src="@android:drawable/ic_menu_search" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/category_title" + app:layout_constraintBottom_toBottomOf="@+id/category_title" /> @@ -21,8 +22,10 @@ android:id="@+id/download_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="11dp" + android:layout_marginTop="26dp" + android:gravity="center" android:text="love kiteen" + android:textSize="24sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -31,7 +34,8 @@ android:id="@+id/download_favorite" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="11dp" + android:layout_marginTop="26dp" + android:layout_marginEnd="15dp" android:src="@android:drawable/btn_star" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -40,14 +44,16 @@ android:id="@+id/download_image" android:layout_width="match_parent" android:layout_height="150dp" + android:layout_marginTop="15dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/download_back" /> + app:layout_constraintTop_toBottomOf="@+id/download_title" /> @@ -80,7 +87,8 @@ android:layout_marginStart="12dp" android:layout_marginTop="16dp" android:gravity="center" - android:text="Simple Keyboard" + android:text="@string/app_name" + android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/download_download" /> @@ -89,8 +97,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" + android:layout_marginEnd="5dp" android:gravity="center" - android:text="View All" + android:text="@string/view_all" + android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/download_all" app:layout_constraintTop_toBottomOf="@+id/download_download" /> @@ -100,7 +110,7 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginEnd="12dp" - android:src="@android:drawable/ic_menu_sort_by_size" + android:src="@drawable/all" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/download_download" /> @@ -127,9 +137,9 @@ android:id="@+id/view" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="#80000000" android:clickable="true" android:focusable="true" - android:background="#80000000" android:visibility="gone" /> \ 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 index 00bd9cc..1cbe121 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -1,16 +1,49 @@ - + + + + + android:layout_marginTop="15dp" + android:hint="@string/search" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/search_title" /> - + android:layout_height="wrap_content" + android:layout_marginTop="15dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/searchEditText" /> + diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index 1785151..609e287 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -10,19 +10,21 @@ + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.388" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/category_tab_custom.xml b/app/src/main/res/layout/category_tab_custom.xml index 3f25072..9bbcd20 100644 --- a/app/src/main/res/layout/category_tab_custom.xml +++ b/app/src/main/res/layout/category_tab_custom.xml @@ -12,6 +12,7 @@ android:paddingTop="10dp" android:paddingEnd="12dp" android:paddingBottom="10dp" + android:textStyle="bold" android:textColor="@color/black" android:textSize="17sp" /> diff --git a/app/src/main/res/layout/dialog_permission.xml b/app/src/main/res/layout/dialog_permission.xml index 6d21320..4ca4086 100644 --- a/app/src/main/res/layout/dialog_permission.xml +++ b/app/src/main/res/layout/dialog_permission.xml @@ -3,77 +3,92 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#f0f0f0"> + android:background="#00BCD4"> - + - + - + - + - - + + - + - + - - + + + + + + + + diff --git a/app/src/main/res/layout/dialog_recommended.xml b/app/src/main/res/layout/dialog_recommended.xml index 32c2e11..6e9ef2e 100644 --- a/app/src/main/res/layout/dialog_recommended.xml +++ b/app/src/main/res/layout/dialog_recommended.xml @@ -3,24 +3,29 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/black"> + android:padding="5dp" + android:background="#00BCD4"> + android:src="@mipmap/splash" + app:layout_constraintTop_toTopOf="parent" /> @@ -22,7 +24,30 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="20dp" - app:layout_constraintTop_toBottomOf="@+id/favorite_title" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/favorite_title" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 7c10027..180ee12 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -11,9 +11,11 @@ android:id="@+id/home_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="11dp" + android:layout_marginTop="26dp" android:gravity="center" - android:text="Simple Keyboard" + android:text="@string/app_name" + android:textSize="24sp" + android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -22,21 +24,34 @@ android:id="@+id/home_search" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="11dp" + android:layout_marginEnd="15dp" android:src="@android:drawable/ic_menu_search" + app:layout_constraintBottom_toBottomOf="@+id/home_title" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/home_title" /> + + @@ -54,7 +70,9 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center" - android:text="View All" + android:text="@string/view_all" + android:layout_marginEnd="5dp" + android:textStyle="bold" app:layout_constraintEnd_toStartOf="@+id/home_all" app:layout_constraintTop_toBottomOf="@+id/home_viewPager" /> @@ -62,9 +80,9 @@ android:id="@+id/home_all" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="12dp" android:layout_marginTop="16dp" - android:src="@android:drawable/ic_menu_sort_by_size" + android:layout_marginEnd="12dp" + android:src="@drawable/all" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/home_viewPager" /> @@ -73,7 +91,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="12dp" - app:layout_constraintTop_toBottomOf="@+id/home_text1" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_text1" /> diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index fe5961f..c56eaf0 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -24,7 +24,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:text="Setting" + android:textStyle="bold" + android:text="@string/setting" android:textSize="24sp" /> @@ -55,7 +56,7 @@ android:layout_gravity="center_vertical" android:layout_marginStart="16dp" android:layout_weight="1" - android:text="Version" + android:text="@string/version" android:textSize="16sp" /> + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/home_viewpager2_item.xml b/app/src/main/res/layout/home_viewpager2_item.xml index c85bda2..752c313 100644 --- a/app/src/main/res/layout/home_viewpager2_item.xml +++ b/app/src/main/res/layout/home_viewpager2_item.xml @@ -1,12 +1,13 @@ + android:layout_height="match_parent" + android:padding="10dp"> + android:scaleType="fitXY" /> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/favorite_back.png b/app/src/main/res/mipmap-hdpi/favorite_back.png new file mode 100644 index 0000000..16b46dc Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/favorite_back.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac46d89..a19079c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,18 @@ - Vibe Keyboard + Mobile Keyboard Hello blank fragment + "No favorite photos in this folder yet." + Type a Message + Write + All categories + Search + Step 1 : Select + Step 2 : Enable + Activate Vibe Keyboard + Today\'s recommendation + Favorite + More recommendations + Setting + Version + Share \ No newline at end of file