Переглянути джерело

added broadcast receiver for package changes, update database when app created

sduduzog 7 роки тому
батько
коміт
f9cf4f99ab
31 змінених файлів з 170 додано та 100 видалено
  1. 2 2
      app/build.gradle
  2. 1 3
      app/src/main/AndroidManifest.xml
  3. BIN
      app/src/main/ic_launcher-web.png
  4. 1 1
      app/src/main/java/com/sduduzog/slimlauncher/data/App.kt
  5. 10 0
      app/src/main/java/com/sduduzog/slimlauncher/data/AppDao.kt
  6. 0 60
      app/src/main/java/com/sduduzog/slimlauncher/data/AppRepository.java
  7. 77 0
      app/src/main/java/com/sduduzog/slimlauncher/data/AppRepository.kt
  8. 6 10
      app/src/main/java/com/sduduzog/slimlauncher/ui/apps/AppsFragment.kt
  9. 2 2
      app/src/main/java/com/sduduzog/slimlauncher/ui/apps/AppsListAdapter.kt
  10. 8 1
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainFragment.kt
  11. 18 0
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainViewModel.kt
  12. 16 5
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsFragment.kt
  13. 1 2
      app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsListAdapter.kt
  14. 0 1
      app/src/main/res/layout/fragment_apps_list.xml
  15. 22 8
      app/src/main/res/layout/fragment_settings.xml
  16. 6 5
      app/src/main/res/layout/main_fragment.xml
  17. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  18. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
  19. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  20. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  21. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
  22. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  23. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  24. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
  25. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  26. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  27. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
  28. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  29. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  30. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
  31. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png

+ 2 - 2
app/build.gradle

@@ -10,8 +10,8 @@ android {
         applicationId "com.sduduzog.slimlauncher"
         minSdkVersion 15
         targetSdkVersion 28
-        versionCode 1
-        versionName "0.1.0"
+        versionCode 2
+        versionName "0.1.2"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
     buildTypes {

+ 1 - 3
app/src/main/AndroidManifest.xml

@@ -3,10 +3,8 @@
     xmlns:tools="http://schemas.android.com/tools"
     package="com.sduduzog.slimlauncher">
 
-    <uses-permission android:name="android.permission.REORDER_TASKS" />
-
     <application
-        android:allowBackup="true"
+        android:allowBackup="false"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:configChanges="orientation|keyboardHidden|screenSize"

BIN
app/src/main/ic_launcher-web.png


+ 1 - 1
app/src/main/java/com/sduduzog/slimlauncher/data/App.kt

@@ -8,4 +8,4 @@ import android.arch.persistence.room.PrimaryKey
 data class App(@field:ColumnInfo(name = "label")
           var label: String, @field:ColumnInfo(name = "activity_name")
           var activityName: String, @field:PrimaryKey @field:ColumnInfo(name = "package_name")
-          var packageName: String)
+          var packageName: String, @field:ColumnInfo(name = "home") var home: Boolean = false)

+ 10 - 0
app/src/main/java/com/sduduzog/slimlauncher/data/AppDao.kt

@@ -4,6 +4,7 @@ import android.arch.lifecycle.LiveData
 import android.arch.persistence.room.Dao
 import android.arch.persistence.room.Insert
 import android.arch.persistence.room.Query
+import android.arch.persistence.room.Update
 
 @Dao
 interface AppDao {
@@ -11,9 +12,18 @@ interface AppDao {
     @get:Query("SELECT * from apps")
     val allApps: LiveData<List<App>>
 
+    @get:Query("SELECT * from apps WHERE home=1")
+    val homeApps: LiveData<List<App>>
+
+    @get:Query("SELECT * from apps WHERE home=0")
+    val availableApps: LiveData<List<App>>
+
     @Insert
     fun insert(app: App)
 
+    @Update
+    fun update(app: App)
+
     @Query("DELETE FROM apps")
     fun deleteAll()
 

+ 0 - 60
app/src/main/java/com/sduduzog/slimlauncher/data/AppRepository.java

@@ -1,60 +0,0 @@
-package com.sduduzog.slimlauncher.data;
-
-import android.app.Application;
-import android.arch.lifecycle.LiveData;
-import android.os.AsyncTask;
-
-import java.util.List;
-
-public class AppRepository {
-    private AppDao appDao;
-    private LiveData<List<App>> apps;
-
-    public AppRepository(Application application){
-        AppRoomDatabase db = AppRoomDatabase.getDatabase(application);
-        appDao = db.appDao();
-        apps = appDao.getAllApps();
-    }
-
-    public LiveData<List<App>> getAllApps() {
-        return apps;
-    }
-
-    public void insert(App app){
-        new insertAsyncTask(appDao).execute(app);
-    }
-
-    public void delete(String packageName) {
-        new deleteAsyncTask(appDao).execute(packageName);
-    }
-
-    private static class insertAsyncTask extends AsyncTask<App, Void, Void> {
-
-        private AppDao mAsyncTaskDao;
-
-        insertAsyncTask(AppDao dao) {
-            mAsyncTaskDao = dao;
-        }
-
-        @Override
-        protected Void doInBackground(final App... params) {
-            mAsyncTaskDao.insert(params[0]);
-            return null;
-        }
-    }
-
-    private static class deleteAsyncTask extends AsyncTask<String, Void, Void> {
-
-        private AppDao mAsyncTaskDao;
-
-        deleteAsyncTask(AppDao dao) {
-            mAsyncTaskDao = dao;
-        }
-
-        @Override
-        protected Void doInBackground(final String... params) {
-            mAsyncTaskDao.delete(params[0]);
-            return null;
-        }
-    }
-}

+ 77 - 0
app/src/main/java/com/sduduzog/slimlauncher/data/AppRepository.kt

@@ -0,0 +1,77 @@
+package com.sduduzog.slimlauncher.data
+
+import android.app.Application
+import android.arch.lifecycle.LiveData
+import android.os.AsyncTask
+
+class AppRepository(application: Application){
+
+    val db = AppRoomDatabase.getDatabase(application)
+    private var appDao: AppDao = db!!.appDao()
+    private var _apps: LiveData<List<App>> = appDao.allApps
+    private var _homeApps: LiveData<List<App>> = appDao.homeApps
+    private var _availableApps: LiveData<List<App>> = appDao.availableApps
+
+
+    val allApps: LiveData<List<App>>
+        get() = _apps
+
+    val homeApps: LiveData<List<App>>
+    get() = _homeApps
+
+    val availableApps: LiveData<List<App>>
+        get() = _availableApps
+
+    fun insert(app: App) {
+        InsertAsyncTask(appDao).execute(app)
+    }
+
+    fun update(app: App) {
+        UpdateAsyncTask(appDao).execute(app)
+    }
+
+    fun bulkInsert(apps: List<App>) {
+        BulkInsertAsyncTask(appDao).execute(apps)
+    }
+
+    fun delete(packageName: String) {
+        DeleteAsyncTask(appDao).execute(packageName)
+    }
+
+    private class InsertAsyncTask internal constructor(private val mAsyncTaskDao: AppDao) : AsyncTask<App, Void, Void>() {
+
+        override fun doInBackground(vararg params: App): Void? {
+            mAsyncTaskDao.insert(params[0])
+            return null
+        }
+    }
+
+    private class UpdateAsyncTask internal constructor(private val mAsyncTaskDao: AppDao) : AsyncTask<App, Void, Void>() {
+
+        override fun doInBackground(vararg params: App): Void? {
+            mAsyncTaskDao.update(params[0])
+            return null
+        }
+    }
+
+    private class BulkInsertAsyncTask internal constructor(private val mAsyncTaskDao: AppDao) : AsyncTask<List<App>, Void, Void>() {
+
+        override fun doInBackground(vararg params: List<App>): Void? {
+            mAsyncTaskDao.deleteAll()
+            val apps = params[0]
+            for (i in apps.indices){
+                mAsyncTaskDao.insert(apps[i])
+            }
+
+            return null
+        }
+    }
+
+    private class DeleteAsyncTask internal constructor(private val mAsyncTaskDao: AppDao) : AsyncTask<String, Void, Void>() {
+
+        override fun doInBackground(vararg params: String): Void? {
+            mAsyncTaskDao.delete(params[0])
+            return null
+        }
+    }
+}

+ 6 - 10
app/src/main/java/com/sduduzog/slimlauncher/ui/apps/AppsFragment.kt

@@ -7,7 +7,6 @@ import android.content.pm.ResolveInfo
 import android.os.Bundle
 import android.support.v4.app.Fragment
 import android.support.v7.widget.RecyclerView
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -42,7 +41,7 @@ class AppsFragment : Fragment() {
             val app = App(activity.loadLabel(pm).toString(), activity.name, activity.applicationInfo.packageName)
             apps.add(app)
         }
-        mAdapter = AppsListAdapter(mutableSetOf(), InteractionHandler())
+        mAdapter = AppsListAdapter(listOf(), InteractionHandler())
         layout = view.findViewById(R.id.appList)
         layout.adapter = mAdapter
         return view
@@ -51,20 +50,17 @@ class AppsFragment : Fragment() {
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
         viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
-        viewModel.apps.observe(this, Observer {
-            val set = mutableSetOf<App>()
-            set.clear()
-            for (i in apps.indices) {
-                set.add(apps[i])
+        viewModel.availableApps.observe(this, Observer {
+            if (it != null) {
+                mAdapter.setList(it)
             }
-            set.removeAll(it as Iterable<App>)
-            mAdapter.setList(set)
         })
     }
 
     inner class InteractionHandler : OnListFragmentInteractionListener {
         override fun onListFragmentInteraction(app: App) {
-            viewModel.insert(app)
+            app.home = true
+            viewModel.update(app)
             val nav = Navigation.findNavController(layout)
             nav.navigateUp()
         }

+ 2 - 2
app/src/main/java/com/sduduzog/slimlauncher/ui/apps/AppsListAdapter.kt

@@ -15,7 +15,7 @@ import kotlinx.android.synthetic.main.fragment_app.view.*
 
 
 class AppsListAdapter(
-        private var mValues: MutableSet<App>,
+        private var mValues: List<App>,
         private val mListener: OnListFragmentInteractionListener?)
     : RecyclerView.Adapter<AppsListAdapter.ViewHolder>() {
 
@@ -44,7 +44,7 @@ class AppsListAdapter(
     }
 
     override fun getItemCount(): Int = mValues.size
-    fun setList(apps: MutableSet<App>) {
+    fun setList(apps: List<App>) {
         mValues = apps
         notifyDataSetChanged()
     }

+ 8 - 1
app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainFragment.kt

@@ -1,8 +1,10 @@
 package com.sduduzog.slimlauncher.ui.main
 
+import android.annotation.TargetApi
 import android.arch.lifecycle.Observer
 import android.arch.lifecycle.ViewModelProviders
 import android.content.*
+import android.os.Build
 import android.os.Bundle
 import android.support.v4.app.Fragment
 import android.view.LayoutInflater
@@ -35,12 +37,17 @@ class MainFragment : Fragment() {
         viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
         adapter = MainAppsAdapter(mutableSetOf(), InteractionHandler())
         mainAppsList.adapter = adapter
-        viewModel.apps.observe(this, Observer {
+        viewModel.homeApps.observe(this, Observer {
             if (it !=null){
                 adapter.setApps(it)
             }
         })
         settingsButton.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_openSettingsFragment))
+        clockTextView.setOnClickListener {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                startActivity(Intent(android.provider.AlarmClock.ACTION_SHOW_ALARMS))
+            }
+        }
         updateUi()
     }
 

+ 18 - 0
app/src/main/java/com/sduduzog/slimlauncher/ui/main/MainViewModel.kt

@@ -9,19 +9,37 @@ import com.sduduzog.slimlauncher.data.AppRepository
 class MainViewModel(application: Application) : AndroidViewModel(application) {
     private var _repository: AppRepository = AppRepository(application)
     private var _apps: LiveData<List<App>>
+    private var _homeApps: LiveData<List<App>>
+    private var _availableApps: LiveData<List<App>>
 
     init {
         _apps = _repository.allApps
+        _homeApps = _repository.homeApps
+        _availableApps = _repository.availableApps
     }
 
     val apps: LiveData<List<App>>
         get() = _apps
 
+    val homeApps: LiveData<List<App>>
+        get() = _homeApps
+
+    val availableApps: LiveData<List<App>>
+        get() = _availableApps
+
     fun insert(app: App) {
         _repository.insert(app)
     }
 
+    fun update(app: App) {
+        _repository.update(app)
+    }
+
     fun deleteApp(packageName: String) {
         _repository.delete(packageName)
     }
+
+    fun bulkInsert(apps: MutableList<App>) {
+        _repository.bulkInsert(apps)
+    }
 }

+ 16 - 5
app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsFragment.kt

@@ -5,6 +5,7 @@ import android.arch.lifecycle.Observer
 import android.arch.lifecycle.ViewModelProviders
 import android.content.Context.MODE_PRIVATE
 import android.content.Intent
+import android.os.Build
 import android.os.Bundle
 import android.support.v4.app.Fragment
 import android.support.v7.widget.LinearLayoutManager
@@ -13,6 +14,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.navigation.Navigation
 import com.sduduzog.slimlauncher.R
+import com.sduduzog.slimlauncher.data.App
 import kotlinx.android.synthetic.main.fragment_settings.*
 
 
@@ -29,7 +31,7 @@ class SettingsFragment : Fragment() {
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
         viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
-        viewModel.apps.observe(this, Observer {
+        viewModel.homeApps.observe(this, Observer {
             if (it != null) {
                 adapter.setApps(it)
                 when (it.size) {
@@ -45,8 +47,16 @@ class SettingsFragment : Fragment() {
         settingsAppList.adapter = adapter
         settingsAppList.layoutManager = LinearLayoutManager(activity)
         deviceSettingsButton.setOnClickListener {
-            startActivityForResult(Intent(android.provider.Settings.ACTION_SETTINGS), 0)
+            startActivity(Intent(android.provider.Settings.ACTION_SETTINGS))
         }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            launcherSettingsButton.setOnClickListener {
+                startActivity(Intent(android.provider.Settings.ACTION_HOME_SETTINGS))
+            }
+        } else {
+            launcherSettingsButton.visibility = View.GONE
+        }
+
         val settings = activity?.getSharedPreferences("settings", MODE_PRIVATE)
         val active = settings?.getBoolean("theme", false)
         themeSwitch.isChecked = active!!
@@ -58,12 +68,13 @@ class SettingsFragment : Fragment() {
     }
 
     inner class InteractionHandler : OnListFragmentInteractionListener {
-        override fun onRemove(packageName: String) {
-            viewModel.deleteApp(packageName)
+        override fun onRemove(app: App) {
+            app.home = false
+            viewModel.update(app)
         }
     }
 
     interface OnListFragmentInteractionListener {
-        fun onRemove(packageName: String)
+        fun onRemove(app: App)
     }
 }

+ 1 - 2
app/src/main/java/com/sduduzog/slimlauncher/ui/main/SettingsListAdapter.kt

@@ -22,8 +22,7 @@ class SettingsListAdapter(private var apps: List<App>, private val listener: Set
     override fun onBindViewHolder(holder: AppViewHolder, position: Int) {
         holder.labelText.text = apps[position].label
         holder.removeButton.setOnClickListener {
-            val packageName = apps[position].packageName
-                listener.onRemove(packageName)
+                listener.onRemove(apps[position])
         }
     }
 

+ 0 - 1
app/src/main/res/layout/fragment_apps_list.xml

@@ -5,7 +5,6 @@
     android:id="@+id/appList"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:layout_margin="16dp"
     android:layout_marginStart="16dp"
     android:layout_marginEnd="16dp"
     app:layoutManager="android.support.v7.widget.LinearLayoutManager"

+ 22 - 8
app/src/main/res/layout/fragment_settings.xml

@@ -25,12 +25,12 @@
         style="@style/Widget.AppCompat.Button.Borderless"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginStart="8dp"
-        android:layout_marginLeft="8dp"
+        android:layout_marginEnd="8dp"
+        android:layout_marginRight="8dp"
         android:layout_marginBottom="16dp"
         android:text="Device settings"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
+        app:layout_constraintEnd_toEndOf="parent" />
 
     <Switch
         android:id="@+id/themeSwitch"
@@ -64,7 +64,7 @@
         android:layout_marginRight="16dp"
         android:text="Add"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/settingsAppList" />
+        app:layout_constraintTop_toBottomOf="@+id/themeSwitch" />
 
     <TextView
         android:id="@+id/textView4"
@@ -72,10 +72,10 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="16dp"
         android:layout_marginLeft="16dp"
-        android:layout_marginTop="8dp"
+        android:layout_marginTop="24dp"
         android:layout_marginEnd="16dp"
         android:layout_marginRight="16dp"
-        android:text="Launcher apps"
+        android:text="Favourite apps"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/themeSwitch" />
@@ -83,15 +83,29 @@
     <android.support.v7.widget.RecyclerView
         android:id="@+id/settingsAppList"
         android:layout_width="0dp"
-        android:layout_height="wrap_content"
+        android:layout_height="0dp"
         android:layout_marginStart="16dp"
         android:layout_marginLeft="16dp"
-        android:layout_marginTop="8dp"
+        android:layout_marginTop="16dp"
         android:layout_marginEnd="16dp"
         android:layout_marginRight="16dp"
+        android:layout_marginBottom="16dp"
+        app:layout_constraintBottom_toTopOf="@+id/deviceSettingsButton"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/textView4"
         tools:listitem="@layout/settings_apps_list_item" />
 
+    <Button
+        android:id="@+id/launcherSettingsButton"
+        style="@style/Widget.AppCompat.Button.Borderless"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginLeft="8dp"
+        android:layout_marginBottom="16dp"
+        android:text="launcher settings"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
 </android.support.constraint.ConstraintLayout>

+ 6 - 5
app/src/main/res/layout/main_fragment.xml

@@ -43,12 +43,13 @@
         android:id="@+id/mainAppsList"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginStart="8dp"
-        android:layout_marginLeft="8dp"
-        android:layout_marginEnd="8dp"
-        android:layout_marginRight="8dp"
-        app:layout_constraintBottom_toTopOf="@+id/settingsButton"
+        android:layout_marginStart="16dp"
+        android:layout_marginLeft="16dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginRight="16dp"
+        android:layout_marginBottom="8dp"
         app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+        app:layout_constraintBottom_toTopOf="@+id/settingsButton"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/dateTextView"

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png