Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ android {
applicationId "app.olauncher"
minSdkVersion 23
targetSdkVersion 34
versionCode 78
versionName "v4.2.2"
versionCode 80
versionName "v4.3.2"

resourceConfigurations += ["en", "ar", "de", "es-rES", "es-rUS", "fr", "hr", "hu", "in", "it", "ja", "pl", "pt-rBR", "ru-rRU", "sv", "tr", "uk", "zh"]
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand Down Expand Up @@ -62,4 +62,4 @@ dependencies {
//Material dependency
implementation libs.material

}
}
3 changes: 3 additions & 0 deletions app/src/main/java/app/olauncher/data/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ object Constants {
object Key {
const val FLAG = "flag"
const val RENAME = "rename"
const val LAUNCH = "launch"
const val APP_NAME = "app_name"
const val LAUNCH_DELAY = "launch_delay"
}

object Dialog {
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/app/olauncher/data/Prefs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatDelegate

class Prefs(context: Context) {
private val PREFS_FILENAME = "app.olauncher"
private val LAUNCH_DELAYS_PREFS_FILENAME = "app.olauncher.launchdelays"

private val FIRST_OPEN = "FIRST_OPEN"
private val FIRST_OPEN_TIME = "FIRST_OPEN_TIME"
Expand Down Expand Up @@ -88,6 +89,8 @@ class Prefs(context: Context) {
private val CALENDAR_APP_CLASS_NAME = "CALENDAR_APP_CLASS_NAME"

private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_FILENAME, 0);
private val launchDelayPrefs: SharedPreferences =
context.getSharedPreferences(LAUNCH_DELAYS_PREFS_FILENAME, 0)

var firstOpen: Boolean
get() = prefs.getBoolean(FIRST_OPEN, true)
Expand Down Expand Up @@ -448,4 +451,8 @@ class Prefs(context: Context) {
fun getAppRenameLabel(appPackage: String): String = prefs.getString(appPackage, "").toString()

fun setAppRenameLabel(appPackage: String, renameLabel: String) = prefs.edit().putString(appPackage, renameLabel).apply()

fun getAppLaunchDelay(appPackage: String): Int = launchDelayPrefs.getInt(appPackage, 0)

fun setAppLaunchDelay(appPackage: String, time: Int) = launchDelayPrefs.edit().putInt(appPackage, time).apply()
}
41 changes: 35 additions & 6 deletions app/src/main/java/app/olauncher/ui/AppDrawerAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class AppDrawerAdapter(
private val appDeleteListener: (AppModel) -> Unit,
private val appHideListener: (AppModel, Int) -> Unit,
private val appRenameListener: (AppModel, String) -> Unit,
private val appChangeLaunchDelayListener: (AppModel, Int) -> Unit,
) : ListAdapter<AppModel, AppDrawerAdapter.ViewHolder>(DIFF_CALLBACK), Filterable {

companion object {
Expand Down Expand Up @@ -69,7 +70,8 @@ class AppDrawerAdapter(
appDeleteListener,
appInfoListener,
appHideListener,
appRenameListener
appRenameListener,
appChangeLaunchDelayListener
)
} catch (e: Exception) {
e.printStackTrace()
Expand Down Expand Up @@ -156,10 +158,12 @@ class AppDrawerAdapter(
appInfoListener: (AppModel) -> Unit,
appHideListener: (AppModel, Int) -> Unit,
appRenameListener: (AppModel, String) -> Unit,
appChangeLaunchDelayListener: (AppModel, Int) -> Unit,
) =
with(binding) {
appHideLayout.visibility = View.GONE
renameLayout.visibility = View.GONE
changeLaunchDelayLayout.visibility = View.GONE
appTitle.text = appModel.appLabel
appTitle.gravity = appLabelGravity
otherProfileIndicator.isVisible = appModel.user != myUserHandle
Expand Down Expand Up @@ -188,12 +192,20 @@ class AppDrawerAdapter(
etAppRename.imeOptions = EditorInfo.IME_ACTION_DONE;
}
}
etAppRename.onFocusChangeListener = View.OnFocusChangeListener { v, hasFocus ->
if (hasFocus)
appTitle.visibility = View.INVISIBLE
else
appTitle.visibility = View.VISIBLE
appDelayLaunch.setOnClickListener {
if (appModel.appPackage.isNotEmpty()) {
etLaunchDelay.setText("")
changeLaunchDelayLayout.visibility = View.VISIBLE
renameLayout.visibility = View.GONE
appHideLayout.visibility = View.GONE
etLaunchDelay.showKeyboard()
}
}
val onFocusChangeListener = View.OnFocusChangeListener {_, hasFocus ->
appTitle.visibility = if (hasFocus) View.INVISIBLE else View.VISIBLE
}
etAppRename.onFocusChangeListener = onFocusChangeListener
etLaunchDelay.onFocusChangeListener = onFocusChangeListener
etAppRename.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
etAppRename.hint = getAppName(etAppRename.context, appModel.appPackage)
Expand Down Expand Up @@ -244,6 +256,23 @@ class AppDrawerAdapter(
renameLayout.visibility = View.GONE
}
}
val stopLaunchDelayModification = {
val input = etLaunchDelay.text.toString()
if (input.isNotEmpty())
appChangeLaunchDelayListener(appModel, input.toInt())
changeLaunchDelayLayout.visibility = View.GONE
}
etLaunchDelay.setOnEditorActionListener { _, actionCode, _ ->
if (actionCode == EditorInfo.IME_ACTION_DONE) {
stopLaunchDelayModification()
true
}
false
}
tvSaveLaunchDelay.setOnClickListener {
etLaunchDelay.hideKeyboard()
stopLaunchDelayModification()
}
appInfo.setOnClickListener { appInfoListener(appModel) }
appDelete.setOnClickListener { appDeleteListener(appModel) }
appHideLayout.setOnClickListener { appHideLayout.visibility = View.GONE }
Expand Down
27 changes: 23 additions & 4 deletions app/src/main/java/app/olauncher/ui/AppDrawerFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.SearchView
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
Expand Down Expand Up @@ -195,11 +196,26 @@ class AppDrawerFragment : Fragment() {
appClickListener = {
if (it.appPackage.isEmpty())
return@AppDrawerAdapter
viewModel.selectedApp(it, flag)
if (flag == Constants.FLAG_LAUNCH_APP || flag == Constants.FLAG_HIDDEN_APPS)
findNavController().popBackStack(R.id.mainFragment, false)
val navigationController = findNavController()
val launch = {
viewModel.selectedApp(it, flag)
if (flag == Constants.FLAG_LAUNCH_APP || flag == Constants.FLAG_HIDDEN_APPS)
navigationController.popBackStack(R.id.mainFragment, false)
else
navigationController.popBackStack()
}
val launchDelay = prefs.getAppLaunchDelay(it.appPackage)
if ((flag == Constants.FLAG_LAUNCH_APP || flag == Constants.FLAG_HIDDEN_APPS) && launchDelay > 0)
findNavController().navigate(
R.id.action_appListFragment_to_timerFragment,
bundleOf(
Constants.Key.LAUNCH to launch,
Constants.Key.LAUNCH_DELAY to launchDelay,
Constants.Key.APP_NAME to it.appLabel
)
)
else
findNavController().popBackStack()
launch()
},
appInfoListener = {
openAppInfo(
Expand Down Expand Up @@ -243,6 +259,9 @@ class AppDrawerFragment : Fragment() {
appRenameListener = { appModel, renameLabel ->
prefs.setAppRenameLabel(appModel.appPackage, renameLabel)
viewModel.getAppList()
},
appChangeLaunchDelayListener = { appModel, startDelay ->
prefs.setAppLaunchDelay(appModel.appPackage, startDelay)
}
)

Expand Down
24 changes: 19 additions & 5 deletions app/src/main/java/app/olauncher/ui/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -327,16 +327,30 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
}

private fun launchApp(appName: String, packageName: String, activityClassName: String?, userString: String) {
viewModel.selectedApp(
AppModel(
val launch = {
viewModel.selectedApp(
AppModel(
appName,
null,
packageName,
activityClassName,
getUserHandleFromString(requireContext(), userString)
),
Constants.FLAG_LAUNCH_APP
)
),
Constants.FLAG_LAUNCH_APP
)
}
val launchDelay = prefs.getAppLaunchDelay(packageName)
if (launchDelay > 0)
findNavController().navigate(
R.id.action_mainFragment_to_timerFragment,
bundleOf(
Constants.Key.LAUNCH to launch,
Constants.Key.LAUNCH_DELAY to launchDelay,
Constants.Key.APP_NAME to appName
)
)
else
launch()
}

private fun showAppList(flag: Int, rename: Boolean = false, includeHiddenApps: Boolean = false) {
Expand Down
63 changes: 63 additions & 0 deletions app/src/main/java/app/olauncher/ui/TimerFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package app.olauncher.ui

import android.os.Bundle
import android.os.CountDownTimer
import android.text.Editable
import android.text.TextWatcher
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import androidx.navigation.fragment.findNavController
import app.olauncher.R
import app.olauncher.data.Constants
import app.olauncher.data.Prefs
import app.olauncher.databinding.FragmentTimerBinding
import app.olauncher.helper.hideKeyboard
import app.olauncher.helper.isSystemApp
import app.olauncher.helper.showKeyboard

class TimerFragment : Fragment() {
private var _binding: FragmentTimerBinding? = null
private val binding get() = _binding!!

private lateinit var timer: CountDownTimer

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentTimerBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val launchAction = arguments?.getSerializable(Constants.Key.LAUNCH) as () -> Unit
val launchDelay = arguments?.getInt(Constants.Key.LAUNCH_DELAY, 0)!!
val appName = arguments?.getString(Constants.Key.APP_NAME, "unknown")!!

binding.appnameText.text = getString(R.string.launch_delay_question, appName)

timer = object : CountDownTimer(launchDelay * 1000L, 1000L) {
override fun onTick(millisUntilFinish: Long) {
val secondsLeft = (millisUntilFinish + 999) / 1000
binding.timeText.text = getString(R.string.launch_delay_launch_message, secondsLeft)
}

override fun onFinish() {
launchAction()
}
}
timer.start()

binding.cancel.setOnClickListener {
findNavController().navigate(R.id.action_timerFragment_to_mainFragment)
}
}

override fun onStop() {
timer.cancel()
super.onStop()
}
}
12 changes: 12 additions & 0 deletions app/src/main/res/drawable/ic_delay_launch.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?attr/primaryColor"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
<path
android:fillColor="?attr/primaryColor"
android:pathData="M12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z"/>
</vector>
61 changes: 59 additions & 2 deletions app/src/main/res/layout/adapter_app_drawer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,21 @@
android:textSize="12sp"
app:drawableTopCompat="@drawable/ic_hide" />

<TextView
android:id="@+id/appDelayLaunch"
style="@style/TextSmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawablePadding="2dp"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:paddingHorizontal="8dp"
android:text="@string/delay_launch"
android:textSize="12sp"
app:drawableTopCompat="@drawable/ic_delay_launch" />

<TextView
android:id="@+id/appInfo"
style="@style/TextSmall"
Expand Down Expand Up @@ -111,8 +126,7 @@
android:focusable="true"
android:gravity="end|center_vertical"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="gone">
android:visibility="gone">

<EditText
android:id="@+id/etAppRename"
Expand Down Expand Up @@ -141,4 +155,47 @@

</LinearLayout>

<LinearLayout
android:id="@+id/changeLaunchDelayLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="?attr/primaryColorInverseTrans80"
android:clickable="true"
android:focusable="true"
android:gravity="end|center_vertical"
android:orientation="horizontal"
android:visibility="gone">

<EditText
android:id="@+id/etLaunchDelay"
style="@style/TextLarge"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_weight="1"
android:background="@null"
android:gravity="center_vertical"
android:hint="@string/change_launch_delay_hint"
android:inputType="numberDecimal"
android:maxLength="5"
android:maxLines="1"
android:paddingVertical="@dimen/app_padding_vertical"
android:selectAllOnFocus="true"
android:textColorHint="?attr/primaryColorTrans50"
android:imeOptions="actionDone" />

<TextView
android:id="@+id/tvSaveLaunchDelay"
style="@style/TextSmallBold"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:paddingHorizontal="20dp"
android:text="@string/change"
android:textAllCaps="true" />

</LinearLayout>


</FrameLayout>
Loading