OSDN Git Service

Initializing the Add To Homescreen setting by reading it from market app
authorSunny Goyal <sunnygoyal@google.com>
Mon, 10 Apr 2017 17:49:01 +0000 (10:49 -0700)
committerSunny Goyal <sunnygoyal@google.com>
Wed, 3 May 2017 18:24:54 +0000 (11:24 -0700)
> Also enabling add to home-to-homescreen feature based on install reason

Bug: 36588249
Change-Id: Icfc1edd4c31ed7eb50086f8ffb1a7858a9641b41

src/com/android/launcher3/LauncherProvider.java
src/com/android/launcher3/SessionCommitReceiver.java

index 7d85ac1..d4e3171 100644 (file)
@@ -124,6 +124,7 @@ public class LauncherProvider extends ContentProvider {
         // always available in the main process.
         FileLog.setDir(getContext().getApplicationContext().getFilesDir());
         IconShapeOverride.apply(getContext());
+        SessionCommitReceiver.applyDefaultUserPrefs(getContext());
         return true;
     }
 
index 203bc25..61bcc17 100644 (file)
@@ -16,6 +16,7 @@
 
 package com.android.launcher3;
 
+import android.annotation.TargetApi;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -23,39 +24,51 @@ import android.content.SharedPreferences;
 import android.content.pm.LauncherActivityInfo;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageInstaller.SessionInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
 import android.os.Process;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.launcher3.compat.LauncherAppsCompat;
-import com.android.launcher3.compat.UserManagerCompat;
 
 import java.util.List;
 
 /**
  * BroadcastReceiver to handle session commit intent.
  */
+@TargetApi(Build.VERSION_CODES.O)
 public class SessionCommitReceiver extends BroadcastReceiver {
 
-    private static final long SESSION_IGNORE_DURATION = 3 * 60 * 60 * 1000; // 3 hours
+    private static final String TAG = "SessionCommitReceiver";
+
+    // The content provider for the add to home screen setting. It should be of the format:
+    // <package name>.addtohomescreen
+    private static final String MARKER_PROVIDER_PREFIX = ".addtohomescreen";
 
     // Preference key for automatically adding icon to homescreen.
     public static final String ADD_ICON_PREFERENCE_KEY = "pref_add_icon_to_home";
-
-    private static final String KEY_FIRST_TIME = "first_session_broadcast_time";
+    public static final String ADD_ICON_PREFERENCE_INITIALIZED_KEY =
+            "pref_add_icon_to_home_initialized";
 
     @Override
     public void onReceive(Context context, Intent intent) {
-        if (!isEnabled(context)) {
+        if (!isEnabled(context) || !Utilities.isAtLeastO()) {
             // User has decided to not add icons on homescreen.
             return;
         }
 
         SessionInfo info = intent.getParcelableExtra(PackageInstaller.EXTRA_SESSION);
         UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER);
-        // TODO: Verify install reason
-        if (TextUtils.isEmpty(info.getAppPackageName())) {
+
+        if (TextUtils.isEmpty(info.getAppPackageName()) ||
+                info.getInstallReason() != PackageManager.INSTALL_REASON_USER) {
             return;
         }
 
@@ -64,17 +77,6 @@ public class SessionCommitReceiver extends BroadcastReceiver {
             return;
         }
 
-        // STOPSHIP: Remove this workaround when we start getting proper install reason
-        SharedPreferences prefs = context
-                .getSharedPreferences(LauncherFiles.DEVICE_PREFERENCES_KEY, 0);
-        long now = System.currentTimeMillis();
-        long firstTime = prefs.getLong(KEY_FIRST_TIME, now);
-        prefs.edit().putLong(KEY_FIRST_TIME, firstTime).apply();
-        if ((now - firstTime) < SESSION_IGNORE_DURATION) {
-            Log.d("SessionCommitReceiver", "Temporarily ignoring session broadcast");
-            return;
-        }
-
         List<LauncherActivityInfo> activities = LauncherAppsCompat.getInstance(context)
                 .getActivityList(info.getAppPackageName(), user);
         if (activities == null || activities.isEmpty()) {
@@ -87,4 +89,68 @@ public class SessionCommitReceiver extends BroadcastReceiver {
     public static boolean isEnabled(Context context) {
         return Utilities.getPrefs(context).getBoolean(ADD_ICON_PREFERENCE_KEY, true);
     }
+
+    public static void applyDefaultUserPrefs(final Context context) {
+        if (!Utilities.isAtLeastO()) {
+            return;
+        }
+        SharedPreferences prefs = Utilities.getPrefs(context);
+        if (prefs.getAll().isEmpty()) {
+            // This logic assumes that the code is the first thing that is executed (before any
+            // shared preference is written).
+            // TODO: Move this logic to DB upgrade once we have proper support for db downgrade
+            // If it is a fresh start, just apply the default value. We use prefs.isEmpty() to infer
+            // a fresh start as put preferences always contain some values corresponding to current
+            // grid.
+            prefs.edit().putBoolean(ADD_ICON_PREFERENCE_KEY, true).apply();
+        } else if (!prefs.contains(ADD_ICON_PREFERENCE_INITIALIZED_KEY)) {
+            new PrefInitTask(context).executeOnExecutor(Utilities.THREAD_POOL_EXECUTOR);
+        }
+    }
+
+    private static class PrefInitTask extends AsyncTask<Void, Void, Void> {
+        private final Context mContext;
+
+        PrefInitTask(Context context) {
+            mContext = context;
+        }
+
+        @Override
+        protected Void doInBackground(Void... voids) {
+            boolean addIconToHomeScreenEnabled = readValueFromMarketApp();
+            Utilities.getPrefs(mContext).edit()
+                    .putBoolean(ADD_ICON_PREFERENCE_KEY, addIconToHomeScreenEnabled)
+                    .putBoolean(ADD_ICON_PREFERENCE_INITIALIZED_KEY, true)
+                    .apply();
+            return null;
+        }
+
+        public boolean readValueFromMarketApp() {
+            // Get the marget package
+            ResolveInfo ri = mContext.getPackageManager().resolveActivity(
+                    new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MARKET),
+                    PackageManager.MATCH_DEFAULT_ONLY | PackageManager.MATCH_SYSTEM_ONLY);
+            if (ri == null) {
+                return true;
+            }
+
+            Cursor c = null;
+            try {
+                c = mContext.getContentResolver().query(
+                        Uri.parse("content://" + ri.activityInfo.packageName
+                                + MARKER_PROVIDER_PREFIX),
+                        null, null, null, null);
+                if (c.moveToNext()) {
+                    return c.getInt(c.getColumnIndexOrThrow(Settings.NameValueTable.VALUE)) != 0;
+                }
+            } catch (Exception e) {
+                Log.d(TAG, "Error reading add to homescreen preference", e);
+            } finally {
+                if (c != null) {
+                    c.close();
+                }
+            }
+            return true;
+        }
+    }
 }