Launcher.java revision 7fc77cad3d06bd3647e550f7419e89116471240a
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3; 1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 19dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.animation.Animator; 208edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurkaimport android.animation.AnimatorListenerAdapter; 21dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.animation.AnimatorSet; 222801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.animation.ObjectAnimator; 232801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.animation.PropertyValuesHolder; 24dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.animation.ValueAnimator; 257066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyalimport android.annotation.SuppressLint; 260b395356087901c16af283b5d9ae821a630cb6adAdam Cohenimport android.annotation.TargetApi; 27946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurkaimport android.app.Activity; 282a9e228e6fd719732639beb880d6df64d48158a1Brett Chabotimport android.app.ActivityManager; 29c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chungimport android.app.ActivityOptions; 3040c5ed303909c4df71037be3429aa1423e59585fChris Wrenimport android.app.AlertDialog; 3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.app.SearchManager; 320cf2a7c3eeb75cbd532b011524140a4b963f2c93Adam Cohenimport android.appwidget.AppWidgetHostView; 33af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.appwidget.AppWidgetManager; 34af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.appwidget.AppWidgetProviderInfo; 3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ActivityNotFoundException; 362ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onoratoimport android.content.BroadcastReceiver; 37e326f186af6b00e4ea32849f1527254c669d0600Michael Jurkaimport android.content.ComponentCallbacks2; 38c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandlerimport android.content.ComponentName; 391e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport android.content.ContentResolver; 4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context; 4140c5ed303909c4df71037be3429aa1423e59585fChris Wrenimport android.content.DialogInterface; 4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Intent; 43f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chungimport android.content.IntentFilter; 44173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohenimport android.content.IntentSender; 4582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.content.SharedPreferences; 46aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport android.content.pm.ActivityInfo; 47e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chungimport android.content.pm.ApplicationInfo; 4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.pm.PackageManager; 49716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohenimport android.content.pm.PackageManager.NameNotFoundException; 5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.res.Configuration; 511e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport android.database.ContentObserver; 523f9c971e761222dc9fb4e5866f81c5f7a3348992Adam Cohenimport android.database.sqlite.SQLiteDatabase; 53268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohenimport android.graphics.Bitmap; 54268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohenimport android.graphics.Canvas; 552efc7d928a3df57838f8abd8ed6fdb9eeb21b481Sandeep Siddharthaimport android.graphics.Color; 56268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohenimport android.graphics.PorterDuff; 57af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.graphics.Rect; 584a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyalimport android.graphics.drawable.ColorDrawable; 59af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.graphics.drawable.Drawable; 60c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandlerimport android.net.Uri; 61319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrickimport android.os.AsyncTask; 620f668f3c2be93ad9be221d868abb3d9a6e418f18Adam Cohenimport android.os.Build; 6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Bundle; 640fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauerimport android.os.Environment; 651e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport android.os.Handler; 66ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohenimport android.os.Message; 67a2413751e3a698aef9c87411a639637883856939Winson Chungimport android.os.StrictMode; 68843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandlerimport android.os.SystemClock; 6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.text.Selection; 7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.text.SpannableStringBuilder; 71a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurkaimport android.text.TextUtils; 7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.text.method.TextKeyListener; 737c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onoratoimport android.util.Log; 7496d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Display; 7596d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Gravity; 7696d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.HapticFeedbackConstants; 7796d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.KeyEvent; 7896d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.LayoutInflater; 7996d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Menu; 8096d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.MotionEvent; 8196d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Surface; 8296d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.View; 83f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohenimport android.view.View.OnClickListener; 840cf2a7c3eeb75cbd532b011524140a4b963f2c93Adam Cohenimport android.view.View.OnLongClickListener; 8596d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.ViewGroup; 86c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohenimport android.view.ViewStub; 8796d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.ViewTreeObserver; 88651077bdd603bb182be039925fd17bdf0da15016Sunny Goyalimport android.view.Window; 8996d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.WindowManager; 90815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 915a1f53b306a4fcf56aad577987386ea1b2dfe6b9Sunny Goyalimport android.view.animation.OvershootInterpolator; 9231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 9396d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.Advanceable; 9496d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.FrameLayout; 9596d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.ImageView; 96a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haaseimport android.widget.TextView; 9796d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.Toast; 986c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 99651077bdd603bb182be039925fd17bdf0da15016Sunny Goyalimport com.android.launcher3.DropTarget.DragObject; 100651077bdd603bb182be039925fd17bdf0da15016Sunny Goyalimport com.android.launcher3.PagedView.PageSwitchListener; 10183a8f042adda926489494dff217c15ab696139b4Sunny Goyalimport com.android.launcher3.accessibility.LauncherAccessibilityDelegate; 1025f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chungimport com.android.launcher3.allapps.AllAppsContainerView; 103ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyalimport com.android.launcher3.compat.AppWidgetManagerCompat; 104ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherActivityInfoCompat; 105ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherAppsCompat; 106ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserHandleCompat; 107ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserManagerCompat; 1082bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Songimport com.android.launcher3.model.WidgetsModel; 109e2df0620c13b9dc7e63224153b98fdbb48546f9bSunny Goyalimport com.android.launcher3.util.LongArrayMap; 110091440a9cb9d4f42406631004aa484cbb79214caAdam Cohenimport com.android.launcher3.util.Thunk; 1113f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.widget.PendingAddWidgetInfo; 112b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Songimport com.android.launcher3.widget.WidgetHostViewLoader; 1133f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.widget.WidgetsContainerView; 1146c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 115c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.io.DataInputStream; 116c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.io.DataOutputStream; 1174caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohenimport java.io.File; 11816d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohenimport java.io.FileDescriptor; 119c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.io.FileNotFoundException; 1204caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohenimport java.io.FileOutputStream; 121c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.io.IOException; 12216d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohenimport java.io.PrintWriter; 123a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haaseimport java.lang.reflect.InvocationTargetException; 124a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haaseimport java.lang.reflect.Method; 1254caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohenimport java.text.DateFormat; 126c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.util.ArrayList; 127f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chungimport java.util.Collection; 1284caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohenimport java.util.Date; 129c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.util.HashMap; 1304390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyalimport java.util.HashSet; 131d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurkaimport java.util.List; 132c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohenimport java.util.concurrent.atomic.AtomicInteger; 133c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen 13431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Default launcher application. 13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 137c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringertpublic class Launcher extends Activity 1380e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, 139b745afbdd75157c73d581b345118cdaff99e912dWinson Chung View.OnTouchListener, PageSwitchListener, LauncherProviderChangeListener, 140b745afbdd75157c73d581b345118cdaff99e912dWinson Chung LauncherStateTransitionAnimation.Callbacks { 1414e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song static final String TAG = "Launcher"; 1422bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal static final boolean LOGD = false; 14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14483f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung // Temporary flag 14583f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung static final boolean DISABLE_ALL_APPS_SEARCH_INTEGRATION = true; 14683f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung 147f061f82461b8afe0c62eecb776e807c14bc0a4aaDaniel Sandler static final boolean PROFILE_STARTUP = false; 1483f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song static final boolean DEBUG_WIDGETS = true; 149a2413751e3a698aef9c87411a639637883856939Winson Chung static final boolean DEBUG_STRICT_MODE = false; 150f061f82461b8afe0c62eecb776e807c14bc0a4aaDaniel Sandler static final boolean DEBUG_RESUME_TIME = false; 151ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung static final boolean DEBUG_DUMP_LOG = false; 1526fefcf1f83ba05e898ea7164a68dcced657bb43eRomain Guy 153d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler static final boolean ENABLE_DEBUG_INTENTS = false; // allow DebugIntents to run 154d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler 15531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final int REQUEST_CREATE_SHORTCUT = 1; 1567376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private static final int REQUEST_CREATE_APPWIDGET = 5; 1577376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private static final int REQUEST_PICK_APPWIDGET = 9; 158a0618e4102d0543d953d81e162d93c8ea641d0fdMike Cleron private static final int REQUEST_PICK_WALLPAPER = 10; 15931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1608b805b17158886035b38261eb611d8641701ae43Michael Jurka private static final int REQUEST_BIND_APPWIDGET = 11; 161ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal private static final int REQUEST_RECONFIGURE_APPWIDGET = 12; 162876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood 1634a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal private static final int WORKSPACE_BACKGROUND_GRADIENT = 0; 1644a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal private static final int WORKSPACE_BACKGROUND_TRANSPARENT = 1; 1654a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal private static final int WORKSPACE_BACKGROUND_BLACK = 2; 1664a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal 1675a1f53b306a4fcf56aad577987386ea1b2dfe6b9Sunny Goyal private static final float BOUNCE_ANIMATION_TENSION = 1.3f; 1685a1f53b306a4fcf56aad577987386ea1b2dfe6b9Sunny Goyal 169876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood /** 170876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood * IntentStarter uses request codes starting with this. This must be greater than all activity 171876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood * request codes used internally. 172876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood */ 173876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood protected static final int REQUEST_LAST = 100; 1748b805b17158886035b38261eb611d8641701ae43Michael Jurka 1753a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron static final int SCREEN_COUNT = 5; 17631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1770a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka // To turn on these properties, type 1780a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka // adb shell setprop log.tag.PROPERTY_NAME [VERBOSE | SUPPRESS] 1790a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka static final String DUMP_STATE_PROPERTY = "launcher_dump_state"; 18031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1812672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung // The Intent extra that defines whether to ignore the launch animation 1822672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung static final String INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION = 183325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler "com.android.launcher3.intent.extra.shortcut.INGORE_LAUNCH_ANIMATION"; 1842672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung 18531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 18631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final String RUNTIME_STATE_CURRENT_SCREEN = "launcher.current_screen"; 187883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka // Type: int 188883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka private static final String RUNTIME_STATE = "launcher.state"; 18931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 1903d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung private static final String RUNTIME_STATE_PENDING_ADD_CONTAINER = "launcher.add_container"; 1913d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Type: int 19231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final String RUNTIME_STATE_PENDING_ADD_SCREEN = "launcher.add_screen"; 19331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 194fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_CELL_X = "launcher.add_cell_x"; 19531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 196fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_CELL_Y = "launcher.add_cell_y"; 1979d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // Type: int 1989d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_SPAN_X = "launcher.add_span_x"; 1999d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // Type: int 2009d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_SPAN_Y = "launcher.add_span_y"; 2019d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // Type: parcelable 2029d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_WIDGET_INFO = "launcher.add_widget_info"; 203c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // Type: parcelable 2044637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen private static final String RUNTIME_STATE_PENDING_ADD_WIDGET_ID = "launcher.add_widget_id"; 205c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // Type: int[] 206c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen private static final String RUNTIME_STATE_VIEW_IDS = "launcher.view_ids"; 20731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 208432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen static final String INTRO_SCREEN_DISMISSED = "launcher.intro_screen_dismissed"; 209b54a5989a21bef4e6bac304591ca4030bfbe709dAdam Cohen static final String FIRST_RUN_ACTIVITY_DISPLAYED = "launcher.first_run_activity_displayed"; 210b54a5989a21bef4e6bac304591ca4030bfbe709dAdam Cohen 2113ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen static final String FIRST_LOAD_COMPLETE = "launcher.first_load_complete"; 2123ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen static final String ACTION_FIRST_LOAD_COMPLETE = 2133ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen "com.android.launcher3.action.FIRST_LOAD_COMPLETE"; 2143ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen 21539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen public static final String SHOW_WEIGHT_WATCHER = "debug.show_mem"; 2166053b8007ed22fba6a62a9238aad6d0a42229faeDaniel Sandler public static final boolean SHOW_WEIGHT_WATCHER_DEFAULT = false; 21739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 218594d76dc66cb5666830b62594909fed187987d42Sunny Goyal private static final String QSB_WIDGET_ID = "qsb_widget_id"; 219594d76dc66cb5666830b62594909fed187987d42Sunny Goyal private static final String QSB_WIDGET_PROVIDER = "qsb_widget_provider"; 220594d76dc66cb5666830b62594909fed187987d42Sunny Goyal 221a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public static final String USER_HAS_MIGRATED = "launcher.user_migrated_from_old_data"; 222a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 2236b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy /** The different states that Launcher can be in. */ 2247fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi enum State { NONE, WORKSPACE, APPS, APPS_SPRING_LOADED, WIDGETS, WIDGETS_SPRING_LOADED } 2257fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 226091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk State mState = State.WORKSPACE; 227091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk LauncherStateTransitionAnimation mStateTransitionAnimation; 2286b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy 229c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal private boolean mIsSafeModeEnabled; 230c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal 231c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen LauncherOverlayCallbacks mLauncherOverlayCallbacks = new LauncherOverlayCallbacksImpl(); 232c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen LauncherOverlay mLauncherOverlay; 233a6d0492e5f0dd4e1b43d4034a770241dc65f8f8cAdam Cohen InsettableFrameLayout mLauncherOverlayContainer; 234c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 2359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato static final int APPWIDGET_HOST_ID = 1024; 236ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300; 237ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500; 238646fdf70b45f330a02104106a65ab7a529e70c6eAdam Cohen private static final int ACTIVITY_START_DELAY = 1000; 23931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 240c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen private HashMap<Integer, Integer> mItemIdToViewId = new HashMap<Integer, Integer>(); 241c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); 242c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen 243a2413751e3a698aef9c87411a639637883856939Winson Chung // How long to wait before the new-shortcut animation automatically pans the workspace 24494d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung private static int NEW_APPS_PAGE_MOVE_DELAY = 500; 24594d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung private static int NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS = 5; 246091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk static int NEW_APPS_ANIMATION_DELAY = 500; 247a2413751e3a698aef9c87411a639637883856939Winson Chung 2482ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato private final BroadcastReceiver mCloseSystemDialogsReceiver 2492ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato = new CloseSystemDialogsIntentReceiver(); 2501e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private final ContentObserver mWidgetObserver = new AppWidgetResetObserver(); 2511e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 25231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private LayoutInflater mInflater; 25331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 254091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk Workspace mWorkspace; 255360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner private View mLauncherView; 256a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private View mPageIndicators; 257091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk DragLayer mDragLayer; 258b737ee6ab2dc4938a1b2a574c336af0eab826712Michael Jurka private DragController mDragController; 25939a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen private View mWeightWatcher; 260cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 261ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal private AppWidgetManagerCompat mAppWidgetManager; 2627376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private LauncherAppWidgetHost mAppWidgetHost; 263cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 264091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk ItemInfo mPendingAddInfo = new ItemInfo(); 2655940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen private LauncherAppWidgetProviderInfo mPendingAddWidgetInfo; 2664637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen private int mPendingAddWidgetId = -1; 2679d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen 2680280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka private int[] mTmpAddItemCellCoordinates = new int[2]; 2690280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 2703d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung private Hotseat mHotseat; 271d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi private ViewGroup mOverviewPanel; 272f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 273f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung private View mAllAppsButton; 2743d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 275c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung private SearchDropTargetBar mSearchDropTargetBar; 2763f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 2773f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // Main container view for the all apps screen. 2785f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung @Thunk AllAppsContainerView mAppsView; 2793f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 2802bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song // Main container view and the model for the widget tray screen. 2812bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song @Thunk WidgetsContainerView mWidgetsView; 2822bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song @Thunk WidgetsModel mWidgetsModel; 2833f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 284ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private boolean mAutoAdvanceRunning = false; 285594d76dc66cb5666830b62594909fed187987d42Sunny Goyal private AppWidgetHostView mQsb; 2862b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy 28731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Bundle mSavedState; 2884a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // We set the state in both onCreate and then onNewIntent in some cases, which causes both 2894a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // scroll issues (because the workspace may not have been measured yet) and extra work. 2904a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // Instead, just save the state that we need to restore Launcher to, and commit it in onResume. 2914a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung private State mOnResumeState = State.NONE; 29231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 29331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private SpannableStringBuilder mDefaultKeySsb = null; 29431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 295091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk boolean mWorkspaceLoading = true; 2969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 29734a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato private boolean mPaused = true; 29831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean mRestoring; 29931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean mWaitingForResult; 300ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato private boolean mOnResumeNeedsLoad; 30131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3021e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka private ArrayList<Runnable> mBindOnResumeCallbacks = new ArrayList<Runnable>(); 3037607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka private ArrayList<Runnable> mOnResumeCallbacks = new ArrayList<Runnable>(); 3047607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka 30531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Bundle mSavedInstanceState; 30631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private LauncherModel mModel; 3080589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato private IconCache mIconCache; 309091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk boolean mUserPresent = true; 310d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen private boolean mVisible = false; 311ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen private boolean mHasFocus = false; 312d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen private boolean mAttached = false; 3139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 314091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk static LocaleConfiguration sLocaleConfiguration = null; 315319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 316e2df0620c13b9dc7e63224153b98fdbb48546f9bSunny Goyal private static LongArrayMap<FolderInfo> sFolders = new LongArrayMap<>(); 317cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 31861f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen private View.OnTouchListener mHapticFeedbackTouchListener; 31961f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 320ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen // Related to the auto-advancing of widgets 321ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final int ADVANCE_MSG = 1; 322ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final int mAdvanceInterval = 20000; 323ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final int mAdvanceStagger = 250; 324ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private long mAutoAdvanceSentTime; 325ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private long mAutoAdvanceTimeLeft = -1; 326091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk HashMap<View, AppWidgetProviderInfo> mWidgetsToAdvance = 327ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen new HashMap<View, AppWidgetProviderInfo>(); 328ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 329400438b79fe412cb625c96297edeea9c6155349eWinson Chung // Determines how long to wait after a rotation before restoring the screen orientation to 330400438b79fe412cb625c96297edeea9c6155349eWinson Chung // match the sensor state. 331400438b79fe412cb625c96297edeea9c6155349eWinson Chung private final int mRestoreScreenOrientationDelay = 500; 332400438b79fe412cb625c96297edeea9c6155349eWinson Chung 333091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk Drawable mWorkspaceBackgroundDrawable; 334360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 3351462de39f01cec0ba785386532719cb0207dd827Adam Cohen private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>(); 3366e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung private static final boolean DISABLE_SYNCHRONOUS_BINDING_CURRENT_PAGE = false; 3371462de39f01cec0ba785386532719cb0207dd827Adam Cohen 33816d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen static final ArrayList<String> sDumpLogs = new ArrayList<String>(); 3394caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static Date sDateStamp = new Date(); 3404caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static DateFormat sDateFormat = 3414caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); 3424caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static long sRunStart = System.currentTimeMillis(); 3434caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static final String CORRUPTION_EMAIL_SENT_KEY = "corruptionEmailSent"; 34416d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen 34546353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung // We only want to get the SharedPreferences once since it does an FS stat each time we get 34646353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung // it from the context. 34746353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung private SharedPreferences mSharedPrefs; 34846353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung 349f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung // Holds the page that we need to animate to, and the icon views that we need to animate up 350f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung // when we scroll to that page on resume. 351091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk ImageView mFolderIconImageView; 352268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private Bitmap mFolderIconBitmap; 353268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private Canvas mFolderIconCanvas; 354268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private Rect mRectForFolderAnimation = new Rect(); 3552801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 356dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal private DeviceProfile mDeviceProfile; 357dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal 35813eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung // This is set to the view that launched the activity that navigated the user away from 35913eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung // launcher. Since there is no callback for when the activity has finished launching, enable 36013eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung // the press state and keep this reference to reset the press state when we return to launcher. 361ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka private BubbleTextView mWaitingForResume; 362ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka 3635940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen protected static HashMap<String, CustomAppWidget> sCustomAppWidgets = 3645940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen new HashMap<String, CustomAppWidget>(); 3655940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen 3665940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen private static final boolean ENABLE_CUSTOM_WIDGET_TEST = false; 3675940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen static { 3685940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen if (ENABLE_CUSTOM_WIDGET_TEST) { 3695940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen sCustomAppWidgets.put(DummyWidget.class.getName(), new DummyWidget()); 3705940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen } 3715940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen } 3725940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen 373a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase // TODO: remove this field and call method directly when Launcher3 can depend on M APIs 374a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase private static Method sClipRevealMethod = null; 375a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase static { 376a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase Class<?> activityOptionsClass = ActivityOptions.class; 377a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase try { 378a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase sClipRevealMethod = activityOptionsClass.getDeclaredMethod("makeClipRevealAnimation", 379a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase View.class, int.class, int.class, int.class, int.class); 380a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } catch (Exception e) { 381a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase // Earlier version 382a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 383a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 384a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase 385091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk Runnable mBuildLayersRunnable = new Runnable() { 386c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka public void run() { 3879d906c7742af73160df257a40a702e1cc4f87899Michael Jurka if (mWorkspace != null) { 3889d906c7742af73160df257a40a702e1cc4f87899Michael Jurka mWorkspace.buildPageHardwareLayers(); 3899d906c7742af73160df257a40a702e1cc4f87899Michael Jurka } 390c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka } 391c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka }; 392c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka 393db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private static PendingAddArguments sPendingAddItem; 394002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy 395091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk static class PendingAddArguments { 396002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int requestCode; 397002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy Intent intent; 3983d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung long container; 399dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen long screenId; 400002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int cellX; 401002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int cellY; 402db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen int appWidgetId; 403002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 404002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy 405ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler private Stats mStats; 406ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler 407dcbcc86353e9ed52daac87f292aece667cd0ac71Sunny Goyal FocusIndicatorView mFocusHandler; 408dcbcc86353e9ed52daac87f292aece667cd0ac71Sunny Goyal 4097fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi private boolean mRotationEnabled = false; 4107fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi private boolean mPreferenceObserverRegistered = false; 4117fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 4127fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi final private SharedPreferences.OnSharedPreferenceChangeListener mSettingsObserver = 4137fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi new SharedPreferences.OnSharedPreferenceChangeListener() { 4147fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi @Override 4157fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 4167fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi if (Utilities.ALLOW_ROTATION_PREFERENCE_KEY.equals(key)) { 4177fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi if (mRotationEnabled = sharedPreferences.getBoolean( 4187fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi Utilities.ALLOW_ROTATION_PREFERENCE_KEY, false)) { 4197fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi unlockScreenOrientation(true); 4207fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } else { 4217fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 4227fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } 4237fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } 4247fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } 4257fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi }; 4267fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 42731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 42831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 429a2413751e3a698aef9c87411a639637883856939Winson Chung if (DEBUG_STRICT_MODE) { 430a2413751e3a698aef9c87411a639637883856939Winson Chung StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 431a2413751e3a698aef9c87411a639637883856939Winson Chung .detectDiskReads() 432a2413751e3a698aef9c87411a639637883856939Winson Chung .detectDiskWrites() 433a2413751e3a698aef9c87411a639637883856939Winson Chung .detectNetwork() // or .detectAll() for all detectable problems 434a2413751e3a698aef9c87411a639637883856939Winson Chung .penaltyLog() 435a2413751e3a698aef9c87411a639637883856939Winson Chung .build()); 436a2413751e3a698aef9c87411a639637883856939Winson Chung StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 437a2413751e3a698aef9c87411a639637883856939Winson Chung .detectLeakedSqlLiteObjects() 438a2413751e3a698aef9c87411a639637883856939Winson Chung .detectLeakedClosableObjects() 439a2413751e3a698aef9c87411a639637883856939Winson Chung .penaltyLog() 440a2413751e3a698aef9c87411a639637883856939Winson Chung .penaltyDeath() 441a2413751e3a698aef9c87411a639637883856939Winson Chung .build()); 442a2413751e3a698aef9c87411a639637883856939Winson Chung } 443a2413751e3a698aef9c87411a639637883856939Winson Chung 4449211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 4459211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.preOnCreate(); 4469211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4479211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 44831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onCreate(savedInstanceState); 449e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler 450e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler LauncherAppState.setApplicationContext(getApplicationContext()); 451cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherAppState app = LauncherAppState.getInstance(); 45267e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal LauncherAppState.getLauncherProvider().setLauncherProviderChangeListener(this); 4536e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung 4542e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen // Load configuration-specific DeviceProfile 455c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal mDeviceProfile = getResources().getConfiguration().orientation 456c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal == Configuration.ORIENTATION_LANDSCAPE ? 457c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal app.getInvariantDeviceProfile().landscapeProfile 458c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal : app.getInvariantDeviceProfile().portraitProfile; 459c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal 460c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal // TODO: Move this to icon cache. 461c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal Utilities.setIconSize(mDeviceProfile.iconSizePx); 4625f8afe6280eae34620067696173e71943e1a30a3Winson Chung 4635f8afe6280eae34620067696173e71943e1a30a3Winson Chung // the LauncherApplication should call this, but in case of Instrumentation it might not be present yet 464cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mSharedPrefs = getSharedPreferences(LauncherAppState.getSharedPreferencesKey(), 465f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung Context.MODE_PRIVATE); 466c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal mIsSafeModeEnabled = getPackageManager().isSafeMode(); 4670589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mModel = app.setLauncher(this); 4680589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mIconCache = app.getIconCache(); 4692e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen 47041a12d225a546b0a193628a4e5dd6b62cc60b7d0Joe Onorato mDragController = new DragController(this); 47131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mInflater = getLayoutInflater(); 472b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mStateTransitionAnimation = new LauncherStateTransitionAnimation(this, this); 473cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 474ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler mStats = new Stats(this); 475ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler 476ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal mAppWidgetManager = AppWidgetManagerCompat.getInstance(this); 47753805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen 4787376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID); 4797376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetHost.startListening(); 480cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 481b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung // If we are getting an onCreate, we can actually preempt onResume and unset mPaused here, 482b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung // this also ensures that any synchronous binding below doesn't re-trigger another 483b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung // LauncherModel load. 484b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung mPaused = false; 485b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung 48631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (PROFILE_STARTUP) { 4870fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer android.os.Debug.startMethodTracing( 4880fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer Environment.getExternalStorageDirectory() + "/launcher"); 48931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 49031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 49131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project checkForLocaleChange(); 49231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project setContentView(R.layout.launcher); 4937267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka 49431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project setupViews(); 495dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal mDeviceProfile.layout(this); 49631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4971e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey registerContentObservers(); 4981e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 4997c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato lockAllApps(); 5007404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato 50131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mSavedState = savedInstanceState; 50231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project restoreState(mSavedState); 50331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 50431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (PROFILE_STARTUP) { 50531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project android.os.Debug.stopMethodTracing(); 50631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 50731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 50831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mRestoring) { 509db78dc8a0aeac2e18c995ed5b7e92b963fca18e5Adam Cohen if (DISABLE_SYNCHRONOUS_BINDING_CURRENT_PAGE) { 5104a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // If the user leaves launcher, then we should just load items asynchronously when 5114a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // they return. 5122bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal mModel.startLoader(PagedView.INVALID_RESTORE_PAGE); 5134a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } else { 5144a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // We only load the page synchronously if the user rotates (or triggers a 5154a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // configuration change) while launcher is in the foreground 5162bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal mModel.startLoader(mWorkspace.getRestorePage()); 5174a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } 51831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 51931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 52031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // For handling default keys 52131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mDefaultKeySsb = new SpannableStringBuilder(); 52231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Selection.setSelection(mDefaultKeySsb, 0); 52334a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato 52434a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 52534a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato registerReceiver(mCloseSystemDialogsReceiver, filter); 5264ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 5277fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi mRotationEnabled = Utilities.isRotationAllowedForDevice(getApplicationContext()); 5287fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi // In case we are on a device with locked rotation, we should look at preferences to check 5297fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi // if the user has specifically allowed rotation. 5307fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi if (!mRotationEnabled) { 5317fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi getSharedPreferences(LauncherFiles.ROTATION_PREF_FILE, 5327fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi Context.MODE_MULTI_PROCESS).registerOnSharedPreferenceChangeListener( 5337fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi mSettingsObserver); 5347fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi mPreferenceObserverRegistered = true; 5357fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi mRotationEnabled = Utilities.isAllowRotationPrefEnabled(getApplicationContext()); 5367fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } 5377fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 5387fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi // On large interfaces, or on devices that a user has specifically enabled screen rotation, 5397fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi // we want the screen to auto-rotate based on the current orientation 540f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen unlockScreenOrientation(true); 541af40f205d7f0c5f73a92ff5d9b8e9602dbde58c0Winson Chung 5429211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 5439211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onCreate(savedInstanceState); 544c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mLauncherCallbacks.hasLauncherOverlay()) { 545c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen ViewStub stub = (ViewStub) findViewById(R.id.launcher_overlay_stub); 546a6d0492e5f0dd4e1b43d4034a770241dc65f8f8cAdam Cohen mLauncherOverlayContainer = (InsettableFrameLayout) stub.inflate(); 547a6d0492e5f0dd4e1b43d4034a770241dc65f8f8cAdam Cohen mLauncherOverlay = mLauncherCallbacks.setLauncherOverlayView( 548a6d0492e5f0dd4e1b43d4034a770241dc65f8f8cAdam Cohen mLauncherOverlayContainer, mLauncherOverlayCallbacks); 549c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mWorkspace.setLauncherOverlay(mLauncherOverlay); 550c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 5519211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 552c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen 553c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen if (shouldShowIntroScreen()) { 554c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen showIntroScreen(); 555c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen } else { 556c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen showFirstRunActivity(); 557c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen showFirstRunClings(); 558c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen } 5599211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 5609211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 5619211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen private LauncherCallbacks mLauncherCallbacks; 5629211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 5639211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen public void onPostCreate(Bundle savedInstanceState) { 5649211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen super.onPostCreate(savedInstanceState); 5659211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 5669211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onPostCreate(savedInstanceState); 5679211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 5689211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 5699211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 5709211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen public boolean setLauncherCallbacks(LauncherCallbacks callbacks) { 5719211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks = callbacks; 5720f785720667ab8afe4b4620a6c333d382d8659edWinson Chung mLauncherCallbacks.setLauncherAppsCallback(new Launcher.LauncherAppsCallbacks() { 5730f785720667ab8afe4b4620a6c333d382d8659edWinson Chung @Override 5740f785720667ab8afe4b4620a6c333d382d8659edWinson Chung public void onAllAppsBoundsChanged(Rect bounds) { 575cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung if (LOGD) { 576cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung Log.d(TAG, "onAllAppsBoundsChanged(Rect): " + bounds); 577cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 5789480415d9baf00ecfaac8ab3f608b16a1faa6518Winson Chung mAppsView.setFixedBounds(bounds); 5799480415d9baf00ecfaac8ab3f608b16a1faa6518Winson Chung mWidgetsView.setFixedBounds(bounds); 5800f785720667ab8afe4b4620a6c333d382d8659edWinson Chung } 5810f785720667ab8afe4b4620a6c333d382d8659edWinson Chung 5820f785720667ab8afe4b4620a6c333d382d8659edWinson Chung @Override 5830f785720667ab8afe4b4620a6c333d382d8659edWinson Chung public void dismissAllApps() { 58483f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (!DISABLE_ALL_APPS_SEARCH_INTEGRATION) { 58583f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung // Dismiss All Apps if we aren't already paused/invisible 58683f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (!mPaused) { 58783f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung showWorkspace(WorkspaceStateTransitionAnimation.SCROLL_TO_CURRENT_PAGE, true, 58883f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung null /* onCompleteRunnable */, false /* notifyLauncherCallbacks */); 58983f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung } 590cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 5910f785720667ab8afe4b4620a6c333d382d8659edWinson Chung } 5920f785720667ab8afe4b4620a6c333d382d8659edWinson Chung }); 5938af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mLauncherCallbacks.setLauncherSearchCallback(new Launcher.LauncherSearchCallbacks() { 5948af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai private boolean mImportanceStored = false; 5958af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai private int mWorkspaceImportanceForAccessibility = 5968af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; 5978af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai private int mHotseatImportanceForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; 5988af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai 5998af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai @Override 6008af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai public void onSearchOverlayOpened() { 6018af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai if (mImportanceStored) { 6028af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai return; 6038af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai } 6048af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai // The underlying workspace and hotseat are temporarily suppressed by the search 6058af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai // overlay. So they sholudn't be accessible. 6068af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mWorkspaceImportanceForAccessibility = mWorkspace.getImportantForAccessibility(); 6078af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mHotseatImportanceForAccessibility = mHotseat.getImportantForAccessibility(); 6088af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mWorkspace.setImportantForAccessibility( 6098af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); 6108af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mHotseat.setImportantForAccessibility( 6118af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); 6128af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mImportanceStored = true; 6138af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai } 6148af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai 6158af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai @Override 6168af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai public void onSearchOverlayClosed() { 6178af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mWorkspace.setImportantForAccessibility(mWorkspaceImportanceForAccessibility); 6188af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mHotseat.setImportantForAccessibility(mHotseatImportanceForAccessibility); 6198af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai mImportanceStored = false; 6208af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai } 6218af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai }); 6229211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return true; 623f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen } 624f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen 62567e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal @Override 6269211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen public void onLauncherProviderChange() { 6279211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 6289211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onLauncherProviderChange(); 6299211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 6309211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 63167e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal 6329211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen /** To be overridden by subclasses to hint to Launcher that we have custom content */ 63398ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung protected boolean hasCustomContentToLeft() { 6349211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 6359211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.hasCustomContentToLeft(); 6369211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 63798ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung return false; 63898ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung } 63998ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung 640a888158880fea53479447d883391f552604e46b6Dave Hawkey /** 641dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro * To be overridden by subclasses to populate the custom content container and call 642a888158880fea53479447d883391f552604e46b6Dave Hawkey * {@link #addToCustomContentPage}. This will only be invoked if 643a888158880fea53479447d883391f552604e46b6Dave Hawkey * {@link #hasCustomContentToLeft()} is {@code true}. 644a888158880fea53479447d883391f552604e46b6Dave Hawkey */ 645dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro protected void populateCustomContentContainer() { 6469211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 6479211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.populateCustomContentContainer(); 6489211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 649a888158880fea53479447d883391f552604e46b6Dave Hawkey } 650a888158880fea53479447d883391f552604e46b6Dave Hawkey 651a888158880fea53479447d883391f552604e46b6Dave Hawkey /** 652a888158880fea53479447d883391f552604e46b6Dave Hawkey * Invoked by subclasses to signal a change to the {@link #addCustomContentToLeft} value to 653a888158880fea53479447d883391f552604e46b6Dave Hawkey * ensure the custom content page is added or removed if necessary. 654a888158880fea53479447d883391f552604e46b6Dave Hawkey */ 655a888158880fea53479447d883391f552604e46b6Dave Hawkey protected void invalidateHasCustomContentToLeft() { 6563a733a77e32ea112516b4a7ef0b571d6bcc51315Dave Hawkey if (mWorkspace == null || mWorkspace.getScreenOrder().isEmpty()) { 657a888158880fea53479447d883391f552604e46b6Dave Hawkey // Not bound yet, wait for bindScreens to be called. 658a888158880fea53479447d883391f552604e46b6Dave Hawkey return; 659a888158880fea53479447d883391f552604e46b6Dave Hawkey } 660a888158880fea53479447d883391f552604e46b6Dave Hawkey 661a888158880fea53479447d883391f552604e46b6Dave Hawkey if (!mWorkspace.hasCustomContent() && hasCustomContentToLeft()) { 662a888158880fea53479447d883391f552604e46b6Dave Hawkey // Create the custom content page and call the subclass to populate it. 663dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro mWorkspace.createCustomContentContainer(); 664dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro populateCustomContentContainer(); 665a888158880fea53479447d883391f552604e46b6Dave Hawkey } else if (mWorkspace.hasCustomContent() && !hasCustomContentToLeft()) { 666a888158880fea53479447d883391f552604e46b6Dave Hawkey mWorkspace.removeCustomContentPage(); 667a888158880fea53479447d883391f552604e46b6Dave Hawkey } 668a888158880fea53479447d883391f552604e46b6Dave Hawkey } 669a888158880fea53479447d883391f552604e46b6Dave Hawkey 670091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void checkForLocaleChange() { 671319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick if (sLocaleConfiguration == null) { 672319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick new AsyncTask<Void, Void, LocaleConfiguration>() { 673319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick @Override 674319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick protected LocaleConfiguration doInBackground(Void... unused) { 675319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick LocaleConfiguration localeConfiguration = new LocaleConfiguration(); 676319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick readConfiguration(Launcher.this, localeConfiguration); 677319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick return localeConfiguration; 678319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 679319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 680319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick @Override 681319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick protected void onPostExecute(LocaleConfiguration result) { 682319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration = result; 683319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick checkForLocaleChange(); // recursive, but now with a locale configuration 684319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 685319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick }.execute(); 686319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick return; 687319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 688fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams 68931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final Configuration configuration = getResources().getConfiguration(); 69031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 691319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final String previousLocale = sLocaleConfiguration.locale; 69231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final String locale = configuration.locale.toString(); 69331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 694319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final int previousMcc = sLocaleConfiguration.mcc; 69531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int mcc = configuration.mcc; 69631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 697319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final int previousMnc = sLocaleConfiguration.mnc; 69831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int mnc = configuration.mnc; 69931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 70084f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy boolean localeChanged = !locale.equals(previousLocale) || mcc != previousMcc || mnc != previousMnc; 70131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 70284f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy if (localeChanged) { 703319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration.locale = locale; 704319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration.mcc = mcc; 705319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration.mnc = mnc; 70698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 7070589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mIconCache.flush(); 708319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 709319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final LocaleConfiguration localeConfiguration = sLocaleConfiguration; 7104346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka new AsyncTask<Void, Void, Void>() { 7114346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka public Void doInBackground(Void ... args) { 712319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick writeConfiguration(Launcher.this, localeConfiguration); 7134346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka return null; 714319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 7154346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); 71698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 71798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 71898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 719091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk static class LocaleConfiguration { 72098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public String locale; 72198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public int mcc = -1; 72298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public int mnc = -1; 72398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 724fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams 725091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk static void readConfiguration(Context context, LocaleConfiguration configuration) { 72698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy DataInputStream in = null; 72798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 72828db280b7af14614f2b168ea8c5d496cda650321Helena Josol in = new DataInputStream(context.openFileInput(LauncherFiles.LAUNCHER_PREFERENCES)); 72998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy configuration.locale = in.readUTF(); 73098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy configuration.mcc = in.readInt(); 73198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy configuration.mnc = in.readInt(); 73298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (FileNotFoundException e) { 73398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 73498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 73598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 73698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } finally { 73798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (in != null) { 73898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 73998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy in.close(); 74098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 74198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 74298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 74398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 74498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 74598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 74698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 747091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk static void writeConfiguration(Context context, LocaleConfiguration configuration) { 74898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy DataOutputStream out = null; 74998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 7504fbbb3e3e0e135bc5b304bc63637bbc8b54fb5d8Helena Josol out = new DataOutputStream(context.openFileOutput( 75128db280b7af14614f2b168ea8c5d496cda650321Helena Josol LauncherFiles.LAUNCHER_PREFERENCES, MODE_PRIVATE)); 75298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.writeUTF(configuration.locale); 75398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.writeInt(configuration.mcc); 75498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.writeInt(configuration.mnc); 75598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.flush(); 75698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (FileNotFoundException e) { 75798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 75898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 75998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy //noinspection ResultOfMethodCallIgnored 76028db280b7af14614f2b168ea8c5d496cda650321Helena Josol context.getFileStreamPath(LauncherFiles.LAUNCHER_PREFERENCES).delete(); 76198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } finally { 76298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (out != null) { 76398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 76498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.close(); 76598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 76698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 76798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 76898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 76931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 77031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 77131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 772a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson public Stats getStats() { 773a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson return mStats; 774a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson } 775a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson 776c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert public LayoutInflater getInflater() { 777c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert return mInflater; 778c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 779c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 7803f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public boolean isDraggingEnabled() { 78136a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung // We prevent dragging when we are loading the workspace as it is possible to pick up a view 78236a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung // that is subsequently removed from the workspace in startBinding(). 78336a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung return !mModel.isLoadingWorkspace(); 78436a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung } 78536a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung 78671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 787c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen public static int generateViewId() { 7880c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson if (Build.VERSION.SDK_INT >= 17) { 7890c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson return View.generateViewId(); 7900c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson } else { 7910c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson // View.generateViewId() is not available. The following fallback logic is a copy 7920c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson // of its implementation. 7930c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson for (;;) { 7940c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson final int result = sNextGeneratedId.get(); 7950c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson // aapt-generated IDs have the high byte nonzero; clamp to the range under that. 7960c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson int newValue = result + 1; 7970c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. 7980c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson if (sNextGeneratedId.compareAndSet(result, newValue)) { 7990c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson return result; 8000c2918f4f4c4a9a6609b82cf23155ed51840f2c8Ian Parkinson } 801c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 802c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 803c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 804c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen 805c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen public int getViewIdForItem(ItemInfo info) { 806c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // This cast is safe given the > 2B range for int. 807c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen int itemId = (int) info.id; 808c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen if (mItemIdToViewId.containsKey(itemId)) { 809c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen return mItemIdToViewId.get(itemId); 810c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 811c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen int viewId = generateViewId(); 812c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen mItemIdToViewId.put(itemId, viewId); 813c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen return viewId; 814c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 815c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen 816c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen /** 817557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung * Returns whether we should delay spring loaded mode -- for shortcuts and widgets that have 818557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung * a configuration step, this allows the proper animations to run after other transitions. 819557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung */ 820db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private long completeAdd(PendingAddArguments args) { 82183079e43aed96d8b04358840399490d0c707b53dAdam Cohen long screenId = args.screenId; 82283079e43aed96d8b04358840399490d0c707b53dAdam Cohen if (args.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { 82383079e43aed96d8b04358840399490d0c707b53dAdam Cohen // When the screen id represents an actual screen (as opposed to a rank) we make sure 82483079e43aed96d8b04358840399490d0c707b53dAdam Cohen // that the drop page actually exists. 82583079e43aed96d8b04358840399490d0c707b53dAdam Cohen screenId = ensurePendingDropLayoutExists(args.screenId); 82683079e43aed96d8b04358840399490d0c707b53dAdam Cohen } 827db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 828002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy switch (args.requestCode) { 829002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy case REQUEST_CREATE_SHORTCUT: 830db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen completeAddShortcut(args.intent, args.container, screenId, args.cellX, 8313d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung args.cellY); 832b8472bb83cd96456a543137e1e56d589171934c3Winson Chung break; 833002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy case REQUEST_CREATE_APPWIDGET: 834db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen completeAddAppWidget(args.appWidgetId, args.container, screenId, null, null); 835b8472bb83cd96456a543137e1e56d589171934c3Winson Chung break; 836ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal case REQUEST_RECONFIGURE_APPWIDGET: 837ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal completeRestoreAppWidget(args.appWidgetId); 838ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal break; 839002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 84027614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka // Before adding this resetAddInfo(), after a shortcut was added to a workspace screen, 84127614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka // if you turned the screen off and then back while in All Apps, Launcher would not 84227614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka // return to the workspace. Clearing mAddInfo.container here fixes this issue 84327614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka resetAddInfo(); 844db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return screenId; 845002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 846002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy 847c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen private void handleActivityResult( 8488b805b17158886035b38261eb611d8641701ae43Michael Jurka final int requestCode, final int resultCode, final Intent data) { 849e341d30a13c37ef321aee841592d7d58fe3818d9Winson Chung // Reset the startActivity waiting flag 850ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(false); 851db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final int pendingAddWidgetId = mPendingAddWidgetId; 8524637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mPendingAddWidgetId = -1; 853e341d30a13c37ef321aee841592d7d58fe3818d9Winson Chung 854ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen Runnable exitSpringLoaded = new Runnable() { 855ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen @Override 856ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public void run() { 857ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), 858ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, null); 859ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 860ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }; 861ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen 8628b805b17158886035b38261eb611d8641701ae43Michael Jurka if (requestCode == REQUEST_BIND_APPWIDGET) { 863ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen final int appWidgetId = data != null ? 8648b805b17158886035b38261eb611d8641701ae43Michael Jurka data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) : -1; 8658b805b17158886035b38261eb611d8641701ae43Michael Jurka if (resultCode == RESULT_CANCELED) { 8668b805b17158886035b38261eb611d8641701ae43Michael Jurka completeTwoStageWidgetDrop(RESULT_CANCELED, appWidgetId); 867689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, 868ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 8698b805b17158886035b38261eb611d8641701ae43Michael Jurka } else if (resultCode == RESULT_OK) { 870e6b63a3d7335fed5b7bbcc6d2c6230ae28facd3eSunny Goyal addAppWidgetImpl(appWidgetId, mPendingAddInfo, null, 871ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen mPendingAddWidgetInfo, ON_ACTIVITY_RESULT_ANIMATION_DELAY); 8728b805b17158886035b38261eb611d8641701ae43Michael Jurka } 8738b805b17158886035b38261eb611d8641701ae43Michael Jurka return; 874336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka } else if (requestCode == REQUEST_PICK_WALLPAPER) { 875336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka if (resultCode == RESULT_OK && mWorkspace.isInOverviewMode()) { 876dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(false); 877336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka } 878336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka return; 8798b805b17158886035b38261eb611d8641701ae43Michael Jurka } 880336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka 881ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen boolean isWidgetDrop = (requestCode == REQUEST_PICK_APPWIDGET || 8825c97f51fd9443e461a360ff7852aa223c05d667fSunny Goyal requestCode == REQUEST_CREATE_APPWIDGET); 883aad5ef44c665fc4ce143a61c009dc04be3ab0437Romain Guy 884db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final boolean workspaceLocked = isWorkspaceLocked(); 885ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen // We have special handling for widgets 886ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (isWidgetDrop) { 8874637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen final int appWidgetId; 8884637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen int widgetId = data != null ? data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) 8894637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen : -1; 8904637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen if (widgetId < 0) { 8914637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen appWidgetId = pendingAddWidgetId; 8924637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen } else { 8934637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen appWidgetId = widgetId; 8944637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen } 8954637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen 896ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen final int result; 897f0129b13d1edac399c02dbd93f574a7e3f873525Adam Cohen if (appWidgetId < 0 || resultCode == RESULT_CANCELED) { 898db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen Log.e(TAG, "Error: appWidgetId (EXTRA_APPWIDGET_ID) was not " + 899db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen "returned from the widget configuration activity."); 900ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen result = RESULT_CANCELED; 901ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen completeTwoStageWidgetDrop(result, appWidgetId); 902db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final Runnable onComplete = new Runnable() { 903ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen @Override 904ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public void run() { 905ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed(false, 0, null); 906ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 907ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }; 908db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (workspaceLocked) { 909db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // No need to remove the empty screen if we're mid-binding, as the 910db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // the bind will not add the empty screen. 911db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.postDelayed(onComplete, ON_ACTIVITY_RESULT_ANIMATION_DELAY); 912db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } else { 913db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, 914db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 915db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 9165aaab774cfb83833197dac553d4a6eb769032146Winson Chung } else { 917db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (!workspaceLocked) { 91883079e43aed96d8b04358840399490d0c707b53dAdam Cohen if (mPendingAddInfo.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { 91983079e43aed96d8b04358840399490d0c707b53dAdam Cohen // When the screen id represents an actual screen (as opposed to a rank) 92083079e43aed96d8b04358840399490d0c707b53dAdam Cohen // we make sure that the drop page actually exists. 92183079e43aed96d8b04358840399490d0c707b53dAdam Cohen mPendingAddInfo.screenId = 92283079e43aed96d8b04358840399490d0c707b53dAdam Cohen ensurePendingDropLayoutExists(mPendingAddInfo.screenId); 92383079e43aed96d8b04358840399490d0c707b53dAdam Cohen } 924db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final CellLayout dropLayout = mWorkspace.getScreenWithId(mPendingAddInfo.screenId); 925db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 926db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen dropLayout.setDropPending(true); 927db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final Runnable onComplete = new Runnable() { 928db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen @Override 929db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen public void run() { 930db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen completeTwoStageWidgetDrop(resultCode, appWidgetId); 931db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen dropLayout.setDropPending(false); 932db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 933db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen }; 934db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, 935db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 936db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } else { 937db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen PendingAddArguments args = preparePendingAddArgs(requestCode, data, appWidgetId, 938db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mPendingAddInfo); 939db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen sPendingAddItem = args; 940db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 9415aaab774cfb83833197dac553d4a6eb769032146Winson Chung } 942ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen return; 943ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 944ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 945ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (requestCode == REQUEST_RECONFIGURE_APPWIDGET) { 946ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (resultCode == RESULT_OK) { 947ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // Update the widget view. 948ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal PendingAddArguments args = preparePendingAddArgs(requestCode, data, 949ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal pendingAddWidgetId, mPendingAddInfo); 950ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (workspaceLocked) { 951ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal sPendingAddItem = args; 952ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } else { 953ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal completeAdd(args); 954ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 955ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 956ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // Leave the widget in the pending state if the user canceled the configure. 957ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal return; 958ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 959ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 96031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // The pattern used here is that a user PICKs a specific application, 96131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // which, depending on the target, might need to CREATE the actual target. 962cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 96331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // For example, the user would PICK_SHORTCUT for "Music playlist", and we 96431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // launch over to the Music app to actually CREATE_SHORTCUT. 965c7da555dc5b252042dff0a6920efb1bfeb4a0c9aWinson Chung if (resultCode == RESULT_OK && mPendingAddInfo.container != ItemInfo.NO_ID) { 966db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final PendingAddArguments args = preparePendingAddArgs(requestCode, data, -1, 967db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mPendingAddInfo); 968002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy if (isWorkspaceLocked()) { 969db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen sPendingAddItem = args; 970002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } else { 971ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen completeAdd(args); 972db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, 973db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 97431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 9750007472e20e02589a6305e1aeaa70770963ebec7Adam Cohen } else if (resultCode == RESULT_CANCELED) { 976689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, 977ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 97831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 979ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mDragLayer.clearAnimatedView(); 980c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen 981c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen } 982c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen 983c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen @Override 984c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen protected void onActivityResult( 985c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen final int requestCode, final int resultCode, final Intent data) { 986c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen handleActivityResult(requestCode, resultCode, data); 987c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen if (mLauncherCallbacks != null) { 988c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen mLauncherCallbacks.onActivityResult(requestCode, resultCode, data); 989c7cd2cb28f0d08dd47c79007794fc37036210b6aAdam Cohen } 990ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 991ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 992db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private PendingAddArguments preparePendingAddArgs(int requestCode, Intent data, int 993db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen appWidgetId, ItemInfo info) { 994db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen PendingAddArguments args = new PendingAddArguments(); 995db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.requestCode = requestCode; 996db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.intent = data; 997db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.container = info.container; 998db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.screenId = info.screenId; 999db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.cellX = info.cellX; 1000db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.cellY = info.cellY; 1001db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.appWidgetId = appWidgetId; 1002db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return args; 1003db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 1004db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 1005db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen /** 1006db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * Check to see if a given screen id exists. If not, create it at the end, return the new id. 1007db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * 1008db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * @param screenId the screen id to check 1009db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * @return the new screen, or screenId if it exists 1010db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen */ 1011db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private long ensurePendingDropLayoutExists(long screenId) { 1012db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen CellLayout dropLayout = 1013db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen (CellLayout) mWorkspace.getScreenWithId(screenId); 1014db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (dropLayout == null) { 1015db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // it's possible that the add screen was removed because it was 1016db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // empty and a re-bind occurred 1017db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.addExtraEmptyScreen(); 1018db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return mWorkspace.commitExtraEmptyScreen(); 1019db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } else { 1020db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return screenId; 1021db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 1022db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 1023db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 1024091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void completeTwoStageWidgetDrop(final int resultCode, final int appWidgetId) { 10258b805b17158886035b38261eb611d8641701ae43Michael Jurka CellLayout cellLayout = 1026dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen (CellLayout) mWorkspace.getScreenWithId(mPendingAddInfo.screenId); 1027ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen Runnable onCompleteRunnable = null; 1028ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen int animationType = 0; 1029ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 10309d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen AppWidgetHostView boundWidget = null; 1031ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (resultCode == RESULT_OK) { 1032ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION; 1033ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen final AppWidgetHostView layout = mAppWidgetHost.createView(this, appWidgetId, 10349d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo); 10359d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen boundWidget = layout; 1036ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen onCompleteRunnable = new Runnable() { 1037ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen @Override 1038ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen public void run() { 1039ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen completeAddAppWidget(appWidgetId, mPendingAddInfo.container, 1040dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId, layout, null); 1041ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), 1042ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, null); 1043ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 1044ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen }; 1045ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } else if (resultCode == RESULT_CANCELED) { 10464637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mAppWidgetHost.deleteAppWidgetId(appWidgetId); 1047ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen animationType = Workspace.CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION; 1048ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 10499d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen if (mDragLayer.getAnimatedView() != null) { 10509d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mWorkspace.animateWidgetDrop(mPendingAddInfo, cellLayout, 10519d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen (DragView) mDragLayer.getAnimatedView(), onCompleteRunnable, 10529d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen animationType, boundWidget, true); 1053ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } else if (onCompleteRunnable != null) { 10549d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // The animated view may be null in the case of a rotation during widget configuration 10559d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen onCompleteRunnable.run(); 10569d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen } 105731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 105831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 105931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 1060cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka protected void onStop() { 1061cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka super.onStop(); 1062cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka FirstFrameAnimatorHelper.setIsVisible(false); 10639211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 10649211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 10659211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onStop(); 10669211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 1067cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka } 1068cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka 1069cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka @Override 1070cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka protected void onStart() { 1071cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka super.onStart(); 1072cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka FirstFrameAnimatorHelper.setIsVisible(true); 10739211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 10749211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 10759211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onStart(); 10769211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 1077cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka } 1078cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka 1079cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka @Override 108031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onResume() { 1081447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka long startTime = 0; 1082447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 1083447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka startTime = System.currentTimeMillis(); 1084924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler Log.v(TAG, "Launcher.onResume()"); 1085447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 10869211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 10879211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 10889211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.preOnResume(); 10899211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 10909211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 109131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onResume(); 1092f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung 10934a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // Restore the previous launcher state 109475cc825f3f1c266ccc654ee89d2dcffb7c65890aWinson Chung if (mOnResumeState == State.WORKSPACE) { 10954a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung showWorkspace(false); 1096b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } else if (mOnResumeState == State.APPS) { 109713eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung boolean launchedFromApp = (mWaitingForResume != null); 10984ac30068732c7216288999d255a823adb7ca7c12Winson Chung // Don't update the predicted apps if the user is returning to launcher in the apps 109913eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung // view after launching an app, as they may be depending on the UI to be static to 110013eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung // switch to another app, otherwise, if it was 11014ac30068732c7216288999d255a823adb7ca7c12Winson Chung showAppsView(false /* animated */, false /* resetListToTop */, 110213eb527b5ae7f564e3ace6137a8d466636d87188Winson Chung !launchedFromApp /* updatePredictedApps */); 1103b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } else if (mOnResumeState == State.WIDGETS) { 1104b745afbdd75157c73d581b345118cdaff99e912dWinson Chung showWidgetsView(false, false); 11054a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } 11064a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung mOnResumeState = State.NONE; 11074a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung 1108cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung // Restore the apps state if we are in all apps 11094ac30068732c7216288999d255a823adb7ca7c12Winson Chung if (!Launcher.DISABLE_ALL_APPS_SEARCH_INTEGRATION) { 11104ac30068732c7216288999d255a823adb7ca7c12Winson Chung // Otherwise, notify the callbacks if we are in all apps mode 11114ac30068732c7216288999d255a823adb7ca7c12Winson Chung if (mState == State.APPS) { 11124ac30068732c7216288999d255a823adb7ca7c12Winson Chung if (mLauncherCallbacks != null) { 11134ac30068732c7216288999d255a823adb7ca7c12Winson Chung mLauncherCallbacks.onAllAppsShown(); 11144ac30068732c7216288999d255a823adb7ca7c12Winson Chung } 1115cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 1116cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 1117cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung 11184a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal // Background was set to gradient in onPause(), restore to transparent if in all apps. 1119d70ad0d09519975927697604ba38d50883a4d3bfSunny Goyal setWorkspaceBackground(mState == State.WORKSPACE ? WORKSPACE_BACKGROUND_GRADIENT 1120d70ad0d09519975927697604ba38d50883a4d3bfSunny Goyal : WORKSPACE_BACKGROUND_TRANSPARENT); 1121360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 112234a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato mPaused = false; 1123ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (mRestoring || mOnResumeNeedsLoad) { 1124ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWorkspaceLoading(true); 11252bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal mModel.startLoader(PagedView.INVALID_RESTORE_PAGE); 11269c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mRestoring = false; 1127ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mOnResumeNeedsLoad = false; 112831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 11291e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka if (mBindOnResumeCallbacks.size() > 0) { 1130c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka // We might have postponed some bind calls until onResume (see waitUntilResume) -- 1131c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka // execute them here 1132c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka long startTimeCallbacks = 0; 1133c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (DEBUG_RESUME_TIME) { 1134c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka startTimeCallbacks = System.currentTimeMillis(); 1135c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 1136c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka 11371e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka for (int i = 0; i < mBindOnResumeCallbacks.size(); i++) { 11381e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.get(i).run(); 1139c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 11401e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.clear(); 1141c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (DEBUG_RESUME_TIME) { 1142c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka Log.d(TAG, "Time spent processing callbacks in onResume: " + 1143c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka (System.currentTimeMillis() - startTimeCallbacks)); 1144c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 1145447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 11465455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka if (mOnResumeCallbacks.size() > 0) { 11475455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka for (int i = 0; i < mOnResumeCallbacks.size(); i++) { 11485455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka mOnResumeCallbacks.get(i).run(); 11495455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka } 11505455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka mOnResumeCallbacks.clear(); 11515455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka } 1152e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung 1153e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // Reset the pressed state of icons that were locked in the press state while activities 1154e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // were launching 1155ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka if (mWaitingForResume != null) { 1156e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // Resets the previous workspace icon press state 1157ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka mWaitingForResume.setStayPressed(false); 1158ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka } 115982963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung 116006dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // It is possible that widgets can receive updates while launcher is not in the foreground. 116106dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // Consequently, the widgets will be inflated in the orientation of the foreground activity 116206dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // (framework issue). On resuming, we ensure that any widgets are inflated for the current 116306dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // orientation. 11643d50932a93dd367537db3548bde29d1380b371c0Adam Cohen getWorkspace().reinflateWidgetsIfNecessary(); 116522235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal reinflateQSBIfNecessary(); 1166f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen 1167447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 1168447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime)); 1169447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 11706fecd410e8567af916b1bbd53198d9878c686177Adam Cohen 11716fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace.getCustomContentCallbacks() != null) { 11726fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // If we are resuming and the custom content is the current page, we call onShow(). 11736fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // It is also poassible that onShow will instead be called slightly after first layout 11746fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // if PagedView#setRestorePage was set to the custom content page in onCreate(). 11756fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace.isOnOrMovingToCustomContent()) { 11763a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek mWorkspace.getCustomContentCallbacks().onShow(true); 11776fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 11786fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 1179cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung updateInteraction(Workspace.State.NORMAL, mWorkspace.getState()); 118053805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen mWorkspace.onResume(); 1181e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyal 1182756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal if (!isWorkspaceLoading()) { 1183756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal // Process any items that were added while Launcher was away. 1184756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal InstallShortcutReceiver.disableAndFlushInstallQueue(this); 1185756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal } 11869211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 11879211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 11889211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onResume(); 11899211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 119006dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen } 119106dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen 119231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 11937376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project protected void onPause() { 1194997a92348a6d6e061737399321393449c16cd4d8Winson Chung // Ensure that items added to Launcher are queued until Launcher returns 1195997a92348a6d6e061737399321393449c16cd4d8Winson Chung InstallShortcutReceiver.enableInstallQueue(); 1196997a92348a6d6e061737399321393449c16cd4d8Winson Chung 11977376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project super.onPause(); 1198ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mPaused = true; 119924b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato mDragController.cancelDrag(); 1200a2413751e3a698aef9c87411a639637883856939Winson Chung mDragController.resetLastGestureUpTime(); 12016fecd410e8567af916b1bbd53198d9878c686177Adam Cohen 12026fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // We call onHide() aggressively. The custom content callbacks should be able to 12036fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // debounce excess onHide calls. 12046fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace.getCustomContentCallbacks() != null) { 12056fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mWorkspace.getCustomContentCallbacks().onHide(); 12066fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 1207bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 12089211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 12099211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onPause(); 1210bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1211bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1212bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1213bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public interface CustomContentCallbacks { 12143a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek // Custom content is completely shown. {@code fromResume} indicates whether this was caused 12153a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek // by a onResume or by scrolling otherwise. 12163a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek public void onShow(boolean fromResume); 1217bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1218bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen // Custom content is completely hidden 1219bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public void onHide(); 1220c36fa5ce395bd39d16f6a998372700ed53d5d9d6Adam Cohen 1221c36fa5ce395bd39d16f6a998372700ed53d5d9d6Adam Cohen // Custom content scroll progress changed. From 0 (not showing) to 1 (fully showing). 1222c36fa5ce395bd39d16f6a998372700ed53d5d9d6Adam Cohen public void onScrollProgressChanged(float progress); 12232ff91c46fa6f1b84fb08b6f31499934d30d8a91dJan-Willem Maarse 12242ff91c46fa6f1b84fb08b6f31499934d30d8a91dJan-Willem Maarse // Indicates whether the user is allowed to scroll away from the custom content. 12252ff91c46fa6f1b84fb08b6f31499934d30d8a91dJan-Willem Maarse boolean isScrollingAllowed(); 1226bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1227bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1228c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public interface LauncherOverlay { 1229c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1230c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1231c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * Touch interaction leading to overscroll has begun 1232c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1233c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void onScrollInteractionBegin(); 1234c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1235c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1236c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * Touch interaction related to overscroll has ended 1237c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1238c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void onScrollInteractionEnd(); 1239c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1240c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1241c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * Scroll progress, between 0 and 100, when the user scrolls beyond the leftmost 1242c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * screen (or in the case of RTL, the rightmost screen). 1243c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1244c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void onScrollChange(int progress, boolean rtl); 1245c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1246c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1247c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * Screen has stopped scrolling 1248c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1249c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void onScrollSettled(); 1250c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1251c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1252c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * This method can be called by the Launcher in order to force the LauncherOverlay 1253c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * to exit fully immersive mode. 1254c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1255c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void forceExitFullImmersion(); 1256c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1257c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 12580f785720667ab8afe4b4620a6c333d382d8659edWinson Chung public interface LauncherAppsCallbacks { 12590f785720667ab8afe4b4620a6c333d382d8659edWinson Chung /** 12600f785720667ab8afe4b4620a6c333d382d8659edWinson Chung * Updates launcher to the available space that AllApps can take so as not to overlap with 12610f785720667ab8afe4b4620a6c333d382d8659edWinson Chung * any other views. 12620f785720667ab8afe4b4620a6c333d382d8659edWinson Chung */ 12630f785720667ab8afe4b4620a6c333d382d8659edWinson Chung public void onAllAppsBoundsChanged(Rect bounds); 12640f785720667ab8afe4b4620a6c333d382d8659edWinson Chung 12650f785720667ab8afe4b4620a6c333d382d8659edWinson Chung /** 12660f785720667ab8afe4b4620a6c333d382d8659edWinson Chung * Called to dismiss all apps if it is showing. 12670f785720667ab8afe4b4620a6c333d382d8659edWinson Chung */ 12680f785720667ab8afe4b4620a6c333d382d8659edWinson Chung public void dismissAllApps(); 12690f785720667ab8afe4b4620a6c333d382d8659edWinson Chung } 12700f785720667ab8afe4b4620a6c333d382d8659edWinson Chung 12718af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai public interface LauncherSearchCallbacks { 12728af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai /** 12738af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai * Called when the search overlay is shown. 12748af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai */ 12758af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai public void onSearchOverlayOpened(); 12768af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai 12778af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai /** 12788af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai * Called when the search overlay is dismissed. 12798af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai */ 12808af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai public void onSearchOverlayClosed(); 12818af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai } 12828af0cd808e62973889cd43e2c989220f27d70dd4Jun Mukai 1283c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public interface LauncherOverlayCallbacks { 1284c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1285c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * This method indicates whether a call to {@link #enterFullImmersion()} will succeed, 1286c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * however it doesn't modify any state within the launcher. 1287c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1288c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public boolean canEnterFullImmersion(); 1289c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1290c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1291c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * Should be called to tell Launcher that the LauncherOverlay will take over interaction, 1292c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * eg. by occupying the full screen and handling all touch events. 1293c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * 1294c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * @return true if Launcher allows the LauncherOverlay to become fully immersive. In this 1295c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * case, Launcher will modify any necessary state and assumes the overlay is 1296c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * handling all interaction. If false, the LauncherOverlay should cancel any 1297c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * 1298c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1299c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public boolean enterFullImmersion(); 1300c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1301c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen /** 1302c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * Must be called when exiting fully immersive mode. Indicates to Launcher that it has 1303c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen * full control over UI and state. 1304c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen */ 1305c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void exitFullImmersion(); 1306c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1307c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1308c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen class LauncherOverlayCallbacksImpl implements LauncherOverlayCallbacks { 1309c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1310c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen @Override 1311c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public boolean canEnterFullImmersion() { 1312c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen return mState == State.WORKSPACE; 1313c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1314c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1315c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen @Override 1316c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public boolean enterFullImmersion() { 1317c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mState == State.WORKSPACE) { 1318c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen // When fully immersed, disregard any touches which fall through. 1319c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mDragLayer.setBlockTouch(true); 1320c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen return true; 1321c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1322c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen return false; 1323c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1324c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1325c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen @Override 1326c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen public void exitFullImmersion() { 1327c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen mDragLayer.setBlockTouch(false); 1328c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1329c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen } 1330c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen 1331d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi protected boolean hasSettings() { 13329211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 13339211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.hasSettings(); 13347fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } else { 13357fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi // On devices with a locked orientation, we will at least have the allow rotation 13367fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi // setting. 13377fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi return !Utilities.isRotationAllowedForDevice(this); 13389211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 1339d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } 1340d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi 13419211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen public void addToCustomContentPage(View customContent, 134253805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen CustomContentCallbacks callbacks, String description) { 134353805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen mWorkspace.addToCustomContentPage(customContent, callbacks, description); 134466a01fd24bde7c94ea892b007df7f79fbaa43d80Adam Cohen } 134566a01fd24bde7c94ea892b007df7f79fbaa43d80Adam Cohen 1346edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen // The custom content needs to offset its content to account for the QSB 1347edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen public int getTopOffsetForCustomContent() { 1348edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen return mWorkspace.getPaddingTop(); 1349edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen } 1350edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen 135199c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey @Override 135299c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey public Object onRetainNonConfigurationInstance() { 13539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // Flag the loader to stop early before switching 13541a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen if (mModel.isCurrentCallbacks(this)) { 13551a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen mModel.stopLoader(); 13561a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen } 13573f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song //TODO(hyunyoungs): stop the widgets loader when there is a rotation. 13583f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 135913c2e7b788203f397085bef563bc5597e4c98028Romain Guy return Boolean.TRUE; 136099c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey } 13617376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project 13622d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato // We can't hide the IME if it was forced open. So don't bother 13632d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato @Override 13642d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato public void onWindowFocusChanged(boolean hasFocus) { 13652d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato super.onWindowFocusChanged(hasFocus); 1366ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen mHasFocus = hasFocus; 13679211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 13689211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 13699211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onWindowFocusChanged(hasFocus); 13709211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 13712d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 13722d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato 137331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean acceptFilter() { 137431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final InputMethodManager inputManager = (InputMethodManager) 137531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project getSystemService(Context.INPUT_METHOD_SERVICE); 137631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return !inputManager.isFullscreenMode(); 137731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 137831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 137931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 138031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 138197d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final int uniChar = event.getUnicodeChar(); 138297d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final boolean handled = super.onKeyDown(keyCode, event); 138397d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final boolean isKeyNotWhitespace = uniChar > 0 && !Character.isWhitespace(uniChar); 138497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung if (!handled && acceptFilter() && isKeyNotWhitespace) { 138531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean gotKey = TextKeyListener.getInstance().onKeyDown(mWorkspace, mDefaultKeySsb, 138631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project keyCode, event); 138731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (gotKey && mDefaultKeySsb != null && mDefaultKeySsb.length() > 0) { 1388138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // something usable has been typed - start a search 1389cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy // the typed text will be retrieved and cleared by 1390138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // showSearchDialog() 1391138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // If there are multiple keystrokes before the search dialog takes focus, 1392138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // onSearchRequested() will be called for every keystroke, 1393138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // but it is idempotent, so it's fine. 1394138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return onSearchRequested(); 139531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 139631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 139731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 13988a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato // Eat the long press event so the keyboard doesn't come up. 13998a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato if (keyCode == KeyEvent.KEYCODE_MENU && event.isLongPress()) { 14008a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato return true; 14018a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato } 14028a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato 140331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return handled; 140431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 140531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1406138a04170d964da9cdec228e95b976875ae52481Karl Rosaen private String getTypedText() { 1407138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return mDefaultKeySsb.toString(); 1408138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1409138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 1410138a04170d964da9cdec228e95b976875ae52481Karl Rosaen private void clearTypedText() { 1411138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mDefaultKeySsb.clear(); 1412138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mDefaultKeySsb.clearSpans(); 1413138a04170d964da9cdec228e95b976875ae52481Karl Rosaen Selection.setSelection(mDefaultKeySsb, 0); 1414138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1415138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 141631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 1417883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka * Given the integer (ordinal) value of a State enum instance, convert it to a variable of type 1418883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka * State 1419883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka */ 1420883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka private static State intToState(int stateOrdinal) { 1421883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka State state = State.WORKSPACE; 1422883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka final State[] stateValues = State.values(); 1423883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka for (int i = 0; i < stateValues.length; i++) { 1424883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka if (stateValues[i].ordinal() == stateOrdinal) { 1425883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka state = stateValues[i]; 1426883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka break; 1427883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 1428883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 1429883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka return state; 1430883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 1431883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka 1432883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka /** 143331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Restores the previous state, if it exists. 143431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 143531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param savedState The previous state. 143631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1437c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen @SuppressWarnings("unchecked") 143831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void restoreState(Bundle savedState) { 143931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (savedState == null) { 144031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 144131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 144231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1443883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka State state = intToState(savedState.getInt(RUNTIME_STATE, State.WORKSPACE.ordinal())); 1444b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (state == State.APPS || state == State.WIDGETS) { 1445b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mOnResumeState = state; 14463a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato } 14473a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato 144821cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, 144921cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen PagedView.INVALID_RESTORE_PAGE); 145021cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen if (currentScreen != PagedView.INVALID_RESTORE_PAGE) { 14518c87cd83e09cd361c68069c84940dbaf20e9860dWinson Chung mWorkspace.setRestorePage(currentScreen); 145231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 145331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final long pendingAddContainer = savedState.getLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, -1); 1455dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen final long pendingAddScreen = savedState.getLong(RUNTIME_STATE_PENDING_ADD_SCREEN, -1); 14563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 14573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (pendingAddContainer != ItemInfo.NO_ID && pendingAddScreen > -1) { 14583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = pendingAddContainer; 1459dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = pendingAddScreen; 14603d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_X); 14613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellY = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_Y); 14629d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddInfo.spanX = savedState.getInt(RUNTIME_STATE_PENDING_ADD_SPAN_X); 14639d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddInfo.spanY = savedState.getInt(RUNTIME_STATE_PENDING_ADD_SPAN_Y); 1464b823ae4fca345e051831732ff2760023ef6ec2c4Adam Cohen AppWidgetProviderInfo info = savedState.getParcelable( 1465b823ae4fca345e051831732ff2760023ef6ec2c4Adam Cohen RUNTIME_STATE_PENDING_ADD_WIDGET_INFO); 1466f044bb1edd8670fbc2cf9eeb1a51c31b91f0889cSunny Goyal mPendingAddWidgetInfo = info == null ? 1467f044bb1edd8670fbc2cf9eeb1a51c31b91f0889cSunny Goyal null : LauncherAppWidgetProviderInfo.fromProviderInfo(this, info); 1468f044bb1edd8670fbc2cf9eeb1a51c31b91f0889cSunny Goyal 14694637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mPendingAddWidgetId = savedState.getInt(RUNTIME_STATE_PENDING_ADD_WIDGET_ID); 1470ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(true); 147131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mRestoring = true; 147231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 147331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1474c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen mItemIdToViewId = (HashMap<Integer, Integer>) 1475c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen savedState.getSerializable(RUNTIME_STATE_VIEW_IDS); 147631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 147731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 147831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 147931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Finds all the views we need and configure them properly. 148031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 148131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void setupViews() { 1482a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final DragController dragController = mDragController; 148300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 1484360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner mLauncherView = findViewById(R.id.launcher); 1485dcbcc86353e9ed52daac87f292aece667cd0ac71Sunny Goyal mFocusHandler = (FocusIndicatorView) findViewById(R.id.focus_indicator); 14864c98d9235d164680186180974719f551cf935d08Winson Chung mDragLayer = (DragLayer) findViewById(R.id.drag_layer); 14874c98d9235d164680186180974719f551cf935d08Winson Chung mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace); 1488f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal mWorkspace.setPageSwitchListener(this); 1489a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mPageIndicators = mDragLayer.findViewById(R.id.page_indicator); 1490360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 149177e1f47520958edd7ec04e203db65b932537bd1cJohn Spurlock mLauncherView.setSystemUiVisibility( 149277e1f47520958edd7ec04e203db65b932537bd1cJohn Spurlock View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 1493360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner mWorkspaceBackgroundDrawable = getResources().getDrawable(R.drawable.workspace_bg); 149431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14954c98d9235d164680186180974719f551cf935d08Winson Chung // Setup the drag layer 14964c98d9235d164680186180974719f551cf935d08Winson Chung mDragLayer.setup(this, dragController); 14974c98d9235d164680186180974719f551cf935d08Winson Chung 14983d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Setup the hotseat 14993d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat = (Hotseat) findViewById(R.id.hotseat); 15003d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mHotseat != null) { 150111a1a53651924b544513f1f6971a735b18d67539Winson Chung mHotseat.setOnLongClickListener(this); 15023d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 15033d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 1504d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); 150561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen View widgetButton = findViewById(R.id.widget_button); 150661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen widgetButton.setOnClickListener(new OnClickListener() { 1507f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen @Override 1508f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen public void onClick(View arg0) { 15098e15fdf60a103391839433ced3c0990d13ba5012Winson Chung if (!mWorkspace.isSwitchingState()) { 15107b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal onClickAddWidgetButton(arg0); 15118e15fdf60a103391839433ced3c0990d13ba5012Winson Chung } 1512f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 1513f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen }); 151461f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen widgetButton.setOnTouchListener(getHapticFeedbackTouchListener()); 151561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 151661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen View wallpaperButton = findViewById(R.id.wallpaper_button); 151761f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen wallpaperButton.setOnClickListener(new OnClickListener() { 1518f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen @Override 1519f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen public void onClick(View arg0) { 15208e15fdf60a103391839433ced3c0990d13ba5012Winson Chung if (!mWorkspace.isSwitchingState()) { 15217b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal onClickWallpaperPicker(arg0); 15228e15fdf60a103391839433ced3c0990d13ba5012Winson Chung } 1523f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 1524f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen }); 152561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen wallpaperButton.setOnTouchListener(getHapticFeedbackTouchListener()); 152661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 152761f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen View settingsButton = findViewById(R.id.settings_button); 1528d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi if (hasSettings()) { 1529d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi settingsButton.setOnClickListener(new OnClickListener() { 1530d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi @Override 1531d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi public void onClick(View arg0) { 1532d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi if (!mWorkspace.isSwitchingState()) { 15337b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal onClickSettingsButton(arg0); 1534d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } 1535a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 1536d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi }); 1537d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi settingsButton.setOnTouchListener(getHapticFeedbackTouchListener()); 1538d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } else { 1539d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi settingsButton.setVisibility(View.GONE); 1540d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } 1541d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi 1542dbdff6bc7b225255207a46fad8f536b55a18efacAdam Cohen mOverviewPanel.setAlpha(0f); 1543f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 15444c98d9235d164680186180974719f551cf935d08Winson Chung // Setup the workspace 15454c98d9235d164680186180974719f551cf935d08Winson Chung mWorkspace.setHapticFeedbackEnabled(false); 15464c98d9235d164680186180974719f551cf935d08Winson Chung mWorkspace.setOnLongClickListener(this); 1547cff6af81d721415785bddc2efd74e179d2def9daAdam Cohen mWorkspace.setup(dragController); 1548d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka dragController.addDragListener(mWorkspace); 15494c98d9235d164680186180974719f551cf935d08Winson Chung 1550f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // Get the search/delete bar 155124ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen mSearchDropTargetBar = (SearchDropTargetBar) 155224ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen mDragLayer.findViewById(R.id.search_drop_target_bar); 1553f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 1554b745afbdd75157c73d581b345118cdaff99e912dWinson Chung // Setup Apps 15555f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung mAppsView = (AllAppsContainerView) findViewById(R.id.apps_view); 155683f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (isAllAppsSearchOverridden()) { 155783f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung mAppsView.hideHeaderBar(); 15580f785720667ab8afe4b4620a6c333d382d8659edWinson Chung } 1559b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 1560f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // Setup AppsCustomize 15613f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song mWidgetsView = (WidgetsContainerView) findViewById(R.id.widgets_view); 1562360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 15633d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Setup the drag controller (drop targets have to be added in reverse order in priority) 15644c98d9235d164680186180974719f551cf935d08Winson Chung dragController.setDragScoller(mWorkspace); 15654c98d9235d164680186180974719f551cf935d08Winson Chung dragController.setScrollView(mDragLayer); 15664c98d9235d164680186180974719f551cf935d08Winson Chung dragController.setMoveTarget(mWorkspace); 15674c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mWorkspace); 1568c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (mSearchDropTargetBar != null) { 1569c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung mSearchDropTargetBar.setup(this, dragController); 1570b0df1b0e1ac865818942851b6a0d1fdca4843834Adam Cohen mSearchDropTargetBar.setQsbSearchBar(getOrCreateQsbBar()); 1571e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka } 1572924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 1573a127b7ad151dd1ae66d665a073e98984930c3d9dDaniel Sandler if (getResources().getBoolean(R.bool.debug_memory_enabled)) { 1574924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler Log.v(TAG, "adding WeightWatcher"); 157539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher = new WeightWatcher(this); 157639a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher.setAlpha(0.5f); 157739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen ((FrameLayout) mLauncherView).addView(mWeightWatcher, 1578924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler new FrameLayout.LayoutParams( 1579924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler FrameLayout.LayoutParams.MATCH_PARENT, 1580b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler FrameLayout.LayoutParams.WRAP_CONTENT, 1581924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler Gravity.BOTTOM) 1582924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler ); 158339a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 158439a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen boolean show = shouldShowWeightWatcher(); 158539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher.setVisibility(show ? View.VISIBLE : View.GONE); 1586924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler } 158731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 158831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 158931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 15905ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal * Sets the all apps button. This method is called from {@link Hotseat}. 15915ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal */ 15925ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal public void setAllAppsButton(View allAppsButton) { 15935ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal mAllAppsButton = allAppsButton; 15945ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal } 15955ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal 15965ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal public View getAllAppsButton() { 15975ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal return mAllAppsButton; 15985ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal } 15995ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal 16005ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal /** 160131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Creates a view representing a shortcut. 160231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 160331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param info The data structure describing the shortcut. 160431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 16050589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato View createShortcut(ShortcutInfo info) { 1606dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal return createShortcut((ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentPage()), info); 160731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 160831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 160931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 161031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Creates a view representing a shortcut inflated from the specified resource. 161131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 161231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param parent The group the shortcut belongs to. 161331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param info The data structure describing the shortcut. 161431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 161531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @return A View inflated from layoutResId. 161631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1617dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal public View createShortcut(ViewGroup parent, ShortcutInfo info) { 16185f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung BubbleTextView favorite = (BubbleTextView) mInflater.inflate(R.layout.app_icon, 1619dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal parent, false); 1620dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal favorite.applyFromShortcutInfo(info, mIconCache); 1621dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal favorite.setCompoundDrawablePadding(mDeviceProfile.iconDrawablePaddingPx); 162231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project favorite.setOnClickListener(this); 1623dcbcc86353e9ed52daac87f292aece667cd0ac71Sunny Goyal favorite.setOnFocusChangeListener(mFocusHandler); 162431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return favorite; 162531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 162631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 162731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 162831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Add a shortcut to the workspace. 162931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 163031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param data The intent describing the shortcut. 163131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param cellInfo The position on screen where to create the shortcut. 163231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1633dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen private void completeAddShortcut(Intent data, long container, long screenId, int cellX, 16343d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int cellY) { 16353d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] cellXY = mTmpAddItemCellCoordinates; 16363d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] touchXY = mPendingAddInfo.dropPos; 1637dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen CellLayout layout = getCellLayout(container, screenId); 16380280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 16395c97f51fd9443e461a360ff7852aa223c05d667fSunny Goyal ShortcutInfo info = InstallShortcutReceiver.fromShortcutIntent(this, data); 1640d919882006a457d16dea46bd546472e6534b5c19Adam Cohen if (info == null) { 1641d919882006a457d16dea46bd546472e6534b5c19Adam Cohen return; 1642d919882006a457d16dea46bd546472e6534b5c19Adam Cohen } 1643558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen final View view = createShortcut(info); 1644558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen 16455c97f51fd9443e461a360ff7852aa223c05d667fSunny Goyal boolean foundCellSpan = false; 1646fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen // First we check if we already know the exact location where we want to add this item. 1647fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (cellX >= 0 && cellY >= 0) { 1648fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen cellXY[0] = cellX; 1649fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen cellXY[1] = cellY; 1650fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen foundCellSpan = true; 1651558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen 1652558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen // If appropriate, either create a folder or add to an existing folder 1653482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY, 0, 1654558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen true, null,null)) { 1655558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen return; 1656558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen } 1657558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen DragObject dragObject = new DragObject(); 1658558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen dragObject.dragInfo = info; 1659482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, 0, dragObject, 1660482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen true)) { 1661558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen return; 1662558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen } 1663fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } else if (touchXY != null) { 1664d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka // when dragging and dropping, just find the closest free spot 16653d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] result = layout.findNearestVacantArea(touchXY[0], touchXY[1], 1, 1, cellXY); 1666d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka foundCellSpan = (result != null); 1667d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } else { 1668fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen foundCellSpan = layout.findCellForSpan(cellXY, 1, 1); 1669d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } 1670d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka 1671d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka if (!foundCellSpan) { 167293eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung showOutOfSpaceMessage(isHotseatLayout(layout)); 16730280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return; 16740280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1675cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 16761d4a2df091e2b5928406ea503321563a0ec8a01eSunny Goyal LauncherModel.addItemToDatabase(this, info, container, screenId, cellXY[0], cellXY[1]); 167731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 167831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mRestoring) { 1679dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mWorkspace.addInScreen(view, container, screenId, cellXY[0], cellXY[1], 1, 1, 16803d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung isWorkspaceLocked()); 168131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 168231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 168331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 16842e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen private int[] getSpanForWidget(ComponentName component, int minWidth, int minHeight) { 16852e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen Rect padding = AppWidgetHostView.getDefaultPaddingForWidget(this, component, null); 1686f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen // We want to account for the extra amount of padding that we are adding to the widget 1687f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen // to ensure that it gets the full amount of space that it has requested 1688f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen int requiredWidth = minWidth + padding.left + padding.right; 1689f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen int requiredHeight = minHeight + padding.top + padding.bottom; 16902e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen return CellLayout.rectToCell(this, requiredWidth, requiredHeight, null); 1691f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen } 1692f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen 16932e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen public int[] getSpanForWidget(AppWidgetProviderInfo info) { 16942e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen return getSpanForWidget(info.provider, info.minWidth, info.minHeight); 1695cbf47e38e24cc0d63b4bd3f345c050216f06f404Adam Cohen } 1696cbf47e38e24cc0d63b4bd3f345c050216f06f404Adam Cohen 16972e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen public int[] getMinSpanForWidget(AppWidgetProviderInfo info) { 16982e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen return getSpanForWidget(info.provider, info.minResizeWidth, info.minResizeHeight); 1699d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen } 1700d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen 170131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 17027376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project * Add a widget to the workspace. 170331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 17045bbc91bbbcba6cbcfff66b8d8dd510abb06bc076Romain Guy * @param appWidgetId The app widget id 170531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1706091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void completeAddAppWidget(int appWidgetId, long container, long screenId, 17075940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen AppWidgetHostView hostView, LauncherAppWidgetProviderInfo appWidgetInfo) { 1708cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 17095940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen ItemInfo info = mPendingAddInfo; 17105940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen if (appWidgetInfo == null) { 17115940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen appWidgetInfo = LauncherAppWidgetProviderInfo.fromProviderInfo(this, 17125940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen mAppWidgetManager.getAppWidgetInfo(appWidgetId)); 1713a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 1714a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 17155940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen if (appWidgetInfo.isCustomWidget) { 17165940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen appWidgetId = LauncherAppWidgetInfo.CUSTOM_WIDGET_ID; 171718042c82c5847d3caf9af65583c5590c17927c3dRomain Guy } 171831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17195940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen LauncherAppWidgetInfo launcherInfo; 17205940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen launcherInfo = new LauncherAppWidgetInfo(appWidgetId, appWidgetInfo.provider); 17215940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen launcherInfo.spanX = info.spanX; 17225940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen launcherInfo.spanY = info.spanY; 17235940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen launcherInfo.minSpanX = info.minSpanX; 17245940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen launcherInfo.minSpanY = info.minSpanY; 1725ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal launcherInfo.user = mAppWidgetManager.getUser(appWidgetInfo); 1726cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 172731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project LauncherModel.addItemToDatabase(this, launcherInfo, 17281d4a2df091e2b5928406ea503321563a0ec8a01eSunny Goyal container, screenId, info.cellX, info.cellY); 172931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 173031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mRestoring) { 1731ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (hostView == null) { 1732ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen // Perform actual inflation because we're live 17335940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, 17345940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen appWidgetInfo); 1735ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } else { 1736ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen // The AppWidgetHostView has already been inflated and instantiated 1737ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen launcherInfo.hostView = hostView; 1738ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 173931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project launcherInfo.hostView.setTag(launcherInfo); 1740d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen launcherInfo.hostView.setVisibility(View.VISIBLE); 1741aaa5c21ee2e03def644fb6ba8eadbb59873ddd45Adam Cohen launcherInfo.notifyWidgetSizeChanged(this); 1742aaa5c21ee2e03def644fb6ba8eadbb59873ddd45Adam Cohen 17435940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen mWorkspace.addInScreen(launcherInfo.hostView, container, screenId, info.cellX, 17445940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen info.cellY, launcherInfo.spanX, launcherInfo.spanY, isWorkspaceLocked()); 1745ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1746ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen addWidgetToAutoAdvanceIfNeeded(launcherInfo.hostView, appWidgetInfo); 174731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 17486af9af057f2e40c54a4ed447c4628eef7dc15683Adam Cohen resetAddInfo(); 174931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1750cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1751ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 1752ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1753ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onReceive(Context context, Intent intent) { 1754ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final String action = intent.getAction(); 1755ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (Intent.ACTION_SCREEN_OFF.equals(action)) { 1756ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mUserPresent = false; 1757bec6ac5bb3a9d6a677081eb50147abdc58a2cabbAdam Cohen mDragLayer.clearAllResizeFrames(); 1758b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 1759337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung 1760c100e8eae7d67ad5bd78767494b62b8fae5d1779Winson Chung // Reset AllApps to its initial state only if we are not in the middle of 1761b8472bb83cd96456a543137e1e56d589171934c3Winson Chung // processing a multi-step drop 17623f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song if (mAppsView != null && mWidgetsView != null && 1763b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mPendingAddInfo.container == ItemInfo.NO_ID) { 1764ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showWorkspace(false); 1765785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1766ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else if (Intent.ACTION_USER_PRESENT.equals(action)) { 1767ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mUserPresent = true; 1768b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 1769d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler } else if (ENABLE_DEBUG_INTENTS && DebugIntents.DELETE_DATABASE.equals(action)) { 1770d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler mModel.resetLoadedState(false, true); 17712bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal mModel.startLoader(PagedView.INVALID_RESTORE_PAGE, 1772d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE); 1773d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler } else if (ENABLE_DEBUG_INTENTS && DebugIntents.MIGRATE_DATABASE.equals(action)) { 1774d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler mModel.resetLoadedState(false, true); 17752bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal mModel.startLoader(PagedView.INVALID_RESTORE_PAGE, 1776d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE 1777d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler | LauncherModel.LOADER_FLAG_MIGRATE_SHORTCUTS); 1778ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1779ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1780ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen }; 1781ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1782ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1783ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onAttachedToWindow() { 1784ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen super.onAttachedToWindow(); 1785ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1786ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen // Listen for broadcasts related to user-presence 1787ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final IntentFilter filter = new IntentFilter(); 1788ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen filter.addAction(Intent.ACTION_SCREEN_OFF); 1789ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen filter.addAction(Intent.ACTION_USER_PRESENT); 17906cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani // For handling managed profiles 1791d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler if (ENABLE_DEBUG_INTENTS) { 1792d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler filter.addAction(DebugIntents.DELETE_DATABASE); 1793d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler filter.addAction(DebugIntents.MIGRATE_DATABASE); 1794d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler } 1795ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen registerReceiver(mReceiver, filter); 1796f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka FirstFrameAnimatorHelper.initializeDrawListener(getWindow().getDecorView()); 17970b395356087901c16af283b5d9ae821a630cb6adAdam Cohen setupTransparentSystemBarsForLmp(); 1798d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen mAttached = true; 1799ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mVisible = true; 1800ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1801ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 18020b395356087901c16af283b5d9ae821a630cb6adAdam Cohen /** 18030b395356087901c16af283b5d9ae821a630cb6adAdam Cohen * Sets up transparent navigation and status bars in LMP. 18040b395356087901c16af283b5d9ae821a630cb6adAdam Cohen * This method is a no-op for other platform versions. 18050b395356087901c16af283b5d9ae821a630cb6adAdam Cohen */ 1806d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal @TargetApi(Build.VERSION_CODES.LOLLIPOP) 18070b395356087901c16af283b5d9ae821a630cb6adAdam Cohen private void setupTransparentSystemBarsForLmp() { 1808d794a3f46521b972fa02826d379d1efa112793d2Kenny Guy if (Utilities.isLmpOrAbove()) { 1809d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal Window window = getWindow(); 1810d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal window.getAttributes().systemUiVisibility |= 1811d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal (View.SYSTEM_UI_FLAG_LAYOUT_STABLE 1812d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 1813d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 1814d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 1815d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 1816d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 1817d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal window.setStatusBarColor(Color.TRANSPARENT); 1818d0091012322d5d3a37b6605cdf61ab85431e56a8Sunny Goyal window.setNavigationBarColor(Color.TRANSPARENT); 18190b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } 18200b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } 18210b395356087901c16af283b5d9ae821a630cb6adAdam Cohen 1822ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1823ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onDetachedFromWindow() { 1824ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen super.onDetachedFromWindow(); 1825ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mVisible = false; 1826ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1827d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen if (mAttached) { 1828d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen unregisterReceiver(mReceiver); 1829d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen mAttached = false; 1830d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen } 1831b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 1832ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1833ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1834ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onWindowVisibilityChanged(int visibility) { 1835ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mVisible = visibility == View.VISIBLE; 1836b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 18372a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // The following code used to be in onResume, but it turns out onResume is called when 18382a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // you're in All Apps and click home to go to the workspace. onWindowVisibilityChanged 18392a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // is a more appropriate event to handle 18402a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka if (mVisible) { 18412a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka if (!mWorkspaceLoading) { 18422a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka final ViewTreeObserver observer = mWorkspace.getViewTreeObserver(); 18432a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // We want to let Launcher draw itself at least once before we force it to build 18442a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // layers on all the workspace pages, so that transitioning to Launcher from other 1845f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka // apps is nice and speedy. 1846f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka observer.addOnDrawListener(new ViewTreeObserver.OnDrawListener() { 1847df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka private boolean mStarted = false; 1848f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka public void onDraw() { 1849df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka if (mStarted) return; 1850df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka mStarted = true; 18516ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // We delay the layer building a bit in order to give 18526ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // other message processing a time to run. In particular 18536ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // this avoids a delay in hiding the IME if it was 18546ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // currently shown, because doing that may involve 18556ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // some communication back with the app. 1856aeae56bf1282761a7dd017458fe27d83f9683efcWinson Chung mWorkspace.postDelayed(mBuildLayersRunnable, 500); 1857df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka final ViewTreeObserver.OnDrawListener listener = this; 1858df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka mWorkspace.post(new Runnable() { 1859df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka public void run() { 1860b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka if (mWorkspace != null && 1861b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka mWorkspace.getViewTreeObserver() != null) { 1862b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka mWorkspace.getViewTreeObserver(). 1863b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka removeOnDrawListener(listener); 1864b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka } 1865df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka } 1866df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka }); 1867f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka return; 18682a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 18692a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka }); 18702a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 18712a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka clearTypedText(); 18722a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 1873ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1874ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1875091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void sendAdvanceMessage(long delay) { 1876ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mHandler.removeMessages(ADVANCE_MSG); 1877ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen Message msg = mHandler.obtainMessage(ADVANCE_MSG); 1878ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mHandler.sendMessageDelayed(msg, delay); 1879ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mAutoAdvanceSentTime = System.currentTimeMillis(); 1880ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1881ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1882091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void updateAutoAdvanceState() { 1883ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen boolean autoAdvanceRunning = mVisible && mUserPresent && !mWidgetsToAdvance.isEmpty(); 1884ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (autoAdvanceRunning != mAutoAdvanceRunning) { 1885ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mAutoAdvanceRunning = autoAdvanceRunning; 1886ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (autoAdvanceRunning) { 1887ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen long delay = mAutoAdvanceTimeLeft == -1 ? mAdvanceInterval : mAutoAdvanceTimeLeft; 1888ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen sendAdvanceMessage(delay); 1889ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else { 1890ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (!mWidgetsToAdvance.isEmpty()) { 1891ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mAutoAdvanceTimeLeft = Math.max(0, mAdvanceInterval - 1892ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen (System.currentTimeMillis() - mAutoAdvanceSentTime)); 1893ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1894ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mHandler.removeMessages(ADVANCE_MSG); 18952313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mHandler.removeMessages(0); // Remove messages sent using postDelayed() 1896ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1897ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1898ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1899ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1900ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final Handler mHandler = new Handler() { 1901ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1902ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void handleMessage(Message msg) { 1903ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (msg.what == ADVANCE_MSG) { 1904ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen int i = 0; 1905ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (View key: mWidgetsToAdvance.keySet()) { 1906ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final View v = key.findViewById(mWidgetsToAdvance.get(key).autoAdvanceViewId); 1907ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int delay = mAdvanceStagger * i; 1908ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (v instanceof Advanceable) { 1909ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen postDelayed(new Runnable() { 1910ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void run() { 1911ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen ((Advanceable) v).advance(); 1912ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1913ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen }, delay); 1914ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1915ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen i++; 1916ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1917ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen sendAdvanceMessage(mAdvanceInterval); 1918ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1919ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1920ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen }; 1921ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1922ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen void addWidgetToAutoAdvanceIfNeeded(View hostView, AppWidgetProviderInfo appWidgetInfo) { 1923292c025d06b41c42546e9771b0da0333e08f9db7Adam Cohen if (appWidgetInfo == null || appWidgetInfo.autoAdvanceViewId == -1) return; 1924ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen View v = hostView.findViewById(appWidgetInfo.autoAdvanceViewId); 1925ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (v instanceof Advanceable) { 1926ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mWidgetsToAdvance.put(hostView, appWidgetInfo); 19272ddf13e175910f784cb4e54493ef202671e499f8Adam Cohen ((Advanceable) v).fyiWillBeAdvancedByHostKThx(); 1928b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 1929ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1930ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1931ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1932ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen void removeWidgetToAutoAdvance(View hostView) { 1933ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (mWidgetsToAdvance.containsKey(hostView)) { 1934ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mWidgetsToAdvance.remove(hostView); 1935b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 1936ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 19370280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 19380280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 19399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void removeAppWidget(LauncherAppWidgetInfo launcherInfo) { 1940ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen removeWidgetToAutoAdvance(launcherInfo.hostView); 19419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato launcherInfo.hostView = null; 19429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 19439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 19443f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public void showOutOfSpaceMessage(boolean isHotseatLayout) { 194593eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung int strId = (isHotseatLayout ? R.string.hotseat_out_of_space : R.string.out_of_space); 194693eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT).show(); 1947ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1948ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1949a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public DragLayer getDragLayer() { 1950a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mDragLayer; 1951a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1952a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 19535f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung public AllAppsContainerView getAppsView() { 1954b745afbdd75157c73d581b345118cdaff99e912dWinson Chung return mAppsView; 1955b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 1956b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 19573f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public WidgetsContainerView getWidgetsView() { 19583f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song return mWidgetsView; 1959b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 1960b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 1961a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public Workspace getWorkspace() { 1962a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mWorkspace; 1963a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1964a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1965a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public Hotseat getHotseat() { 1966a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mHotseat; 1967a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1968a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1969d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi public ViewGroup getOverviewPanel() { 1970a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mOverviewPanel; 1971a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1972a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1973a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public SearchDropTargetBar getSearchBar() { 1974a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mSearchDropTargetBar; 1975a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1976a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 19777376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project public LauncherAppWidgetHost getAppWidgetHost() { 19787376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project return mAppWidgetHost; 197931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1980cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1981a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung public LauncherModel getModel() { 1982a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung return mModel; 1983a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung } 1984a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung 1985a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung protected SharedPreferences getSharedPrefs() { 1986a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mSharedPrefs; 1987a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1988a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 19892e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen public DeviceProfile getDeviceProfile() { 19902e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen return mDeviceProfile; 19912e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen } 19922e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen 1993c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert public void closeSystemDialogs() { 19942ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato getWindow().closeAllPanels(); 19952ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 1996a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato // Whatever we were doing is hereby canceled. 1997ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(false); 19982ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 19992ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 200031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 200131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onNewIntent(Intent intent) { 2002447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka long startTime = 0; 2003447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 2004447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka startTime = System.currentTimeMillis(); 2005447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 200631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onNewIntent(intent); 200731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 200831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Close the menu 200931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (Intent.ACTION_MAIN.equals(intent.getAction())) { 2010a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato // also will cancel mWaitingForResult. 20112ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato closeSystemDialogs(); 2012fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams 2013ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen final boolean alreadyOnHome = mHasFocus && ((intent.getFlags() & 2014ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) 2015ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 201601f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka 20176fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace == null) { 20186fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // Can be cases where mWorkspace is null, this prevents a NPE 20196fecd410e8567af916b1bbd53198d9878c686177Adam Cohen return; 20206fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 20216fecd410e8567af916b1bbd53198d9878c686177Adam Cohen Folder openFolder = mWorkspace.getOpenFolder(); 20226fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // In all these cases, only animate if we're already on home 20236fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mWorkspace.exitWidgetResizeMode(); 20249211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 20259211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen boolean moveToDefaultScreen = mLauncherCallbacks != null ? 20269211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.shouldMoveToDefaultScreenOnHomeIntent() : true; 20276fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() && 20289211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen openFolder == null && moveToDefaultScreen) { 20296fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mWorkspace.moveToDefaultScreen(true); 20306fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 2031337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung 20326fecd410e8567af916b1bbd53198d9878c686177Adam Cohen closeFolder(); 20336fecd410e8567af916b1bbd53198d9878c686177Adam Cohen exitSpringLoadedDragMode(); 2034cb222e85d256e37da41f0ffa3744656c9b53083cJamie Gennis 20356fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // If we are already on home, then just animate back to the workspace, 20366fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // otherwise, just wait until onResume to set the state back to Workspace 20376fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (alreadyOnHome) { 2038ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showWorkspace(true); 2039cb222e85d256e37da41f0ffa3744656c9b53083cJamie Gennis } else { 20406fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mOnResumeState = State.WORKSPACE; 2041785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 2042cb222e85d256e37da41f0ffa3744656c9b53083cJamie Gennis 20436fecd410e8567af916b1bbd53198d9878c686177Adam Cohen final View v = getWindow().peekDecorView(); 20446fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (v != null && v.getWindowToken() != null) { 20456fecd410e8567af916b1bbd53198d9878c686177Adam Cohen InputMethodManager imm = (InputMethodManager)getSystemService( 20466fecd410e8567af916b1bbd53198d9878c686177Adam Cohen INPUT_METHOD_SERVICE); 20476fecd410e8567af916b1bbd53198d9878c686177Adam Cohen imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 20486fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 20496fecd410e8567af916b1bbd53198d9878c686177Adam Cohen 2050b745afbdd75157c73d581b345118cdaff99e912dWinson Chung // Reset the apps view 2051b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (!alreadyOnHome && mAppsView != null) { 2052b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mAppsView.scrollToTop(); 2053b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 2054b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 20553f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // Reset the widgets view 20563f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song if (!alreadyOnHome && mWidgetsView != null) { 20573f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song mWidgetsView.scrollToTop(); 20586fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 2059a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp 20609211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 20619211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onHomeIntent(); 20629211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 206331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2064ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen 2065447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 2066447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka Log.d(TAG, "Time spent in onNewIntent: " + (System.currentTimeMillis() - startTime)); 2067447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 2068a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp 20699211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 20709211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onNewIntent(intent); 20719211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2072a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp } 207331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 207431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 20751462de39f01cec0ba785386532719cb0207dd827Adam Cohen public void onRestoreInstanceState(Bundle state) { 20761462de39f01cec0ba785386532719cb0207dd827Adam Cohen super.onRestoreInstanceState(state); 20771462de39f01cec0ba785386532719cb0207dd827Adam Cohen for (int page: mSynchronouslyBoundPages) { 20781462de39f01cec0ba785386532719cb0207dd827Adam Cohen mWorkspace.restoreInstanceStateForChild(page); 20791462de39f01cec0ba785386532719cb0207dd827Adam Cohen } 208031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 208131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 208231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 208331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onSaveInstanceState(Bundle outState) { 208421cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen if (mWorkspace.getChildCount() > 0) { 20859b9fb967b2305413520dc676d6d3c472b2b6b25eWinson Chung outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, 20869b9fb967b2305413520dc676d6d3c472b2b6b25eWinson Chung mWorkspace.getCurrentPageOffsetFromCustomContent()); 208721cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen } 208895bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen super.onSaveInstanceState(outState); 208931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2090883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka outState.putInt(RUNTIME_STATE, mState.ordinal()); 209151e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen // We close any open folder since it will not be re-opened, and we need to make sure 209251e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen // this state is reflected. 209351e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen closeFolder(); 209431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2095dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen if (mPendingAddInfo.container != ItemInfo.NO_ID && mPendingAddInfo.screenId > -1 && 20963d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mWaitingForResult) { 20973d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung outState.putLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, mPendingAddInfo.container); 2098dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen outState.putLong(RUNTIME_STATE_PENDING_ADD_SCREEN, mPendingAddInfo.screenId); 20993d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_X, mPendingAddInfo.cellX); 21003d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_Y, mPendingAddInfo.cellY); 21019d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen outState.putInt(RUNTIME_STATE_PENDING_ADD_SPAN_X, mPendingAddInfo.spanX); 21029d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen outState.putInt(RUNTIME_STATE_PENDING_ADD_SPAN_Y, mPendingAddInfo.spanY); 21039d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen outState.putParcelable(RUNTIME_STATE_PENDING_ADD_WIDGET_INFO, mPendingAddWidgetInfo); 21044637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen outState.putInt(RUNTIME_STATE_PENDING_ADD_WIDGET_ID, mPendingAddWidgetId); 210531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 210631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 21073f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // Save the current widgets tray? 21083f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // TODO(hyunyoungs) 2109c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen outState.putSerializable(RUNTIME_STATE_VIEW_IDS, mItemIdToViewId); 21109211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 21119211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 21129211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onSaveInstanceState(outState); 21139211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 211431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 211531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 211631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 211731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onDestroy() { 211831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onDestroy(); 2119cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 21207fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi if (mPreferenceObserverRegistered) { 21217fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi getSharedPreferences(LauncherFiles.ROTATION_PREF_FILE, 21227fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi Context.MODE_MULTI_PROCESS).unregisterOnSharedPreferenceChangeListener( 21237fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi mSettingsObserver); 21247fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi mPreferenceObserverRegistered = false; 21257fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } 21267fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 2127e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung // Remove all pending runnables 2128e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung mHandler.removeMessages(ADVANCE_MSG); 2129e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung mHandler.removeMessages(0); 21309d906c7742af73160df257a40a702e1cc4f87899Michael Jurka mWorkspace.removeCallbacks(mBuildLayersRunnable); 2131e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung 2132cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung // Stop callbacks from LauncherModel 2133cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherAppState app = (LauncherAppState.getInstance()); 21341a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen 21351a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen // It's possible to receive onDestroy after a new Launcher activity has 21361a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen // been created. In this case, don't interfere with the new Launcher. 21371a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen if (mModel.isCurrentCallbacks(this)) { 21381a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen mModel.stopLoader(); 21391a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen app.setLauncher(null); 21401a85c5839c91942b3c7dd0da5992db4d98defdc3Adam Cohen } 2141cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung 214231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project try { 21437376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetHost.stopListening(); 214431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } catch (NullPointerException ex) { 2145a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato Log.w(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex); 214631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 21472313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mAppWidgetHost = null; 21482313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy 21492313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mWidgetsToAdvance.clear(); 215031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 215131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project TextKeyListener.getInstance().release(); 215231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 21531e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey getContentResolver().unregisterContentObserver(mWidgetObserver); 215434a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato unregisterReceiver(mCloseSystemDialogsReceiver); 21552313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy 2156accf3bffedc736c04034bfee8e1a8e4fe775f568Adam Cohen mDragLayer.clearAllResizeFrames(); 21572313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy ((ViewGroup) mWorkspace.getParent()).removeAllViews(); 2158d552dd90f1da32e1be2dd95ffed57c65d40cb651Adam Cohen mWorkspace.removeAllWorkspaceScreens(); 21592313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mWorkspace = null; 21602313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mDragController = null; 216160b7c53ccc6384b65aaca77d97794e8f09e8cfc8Patrick Dubroy 21622ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka LauncherAnimUtils.onDestroyActivity(); 21639211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 21649211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 21659211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onDestroy(); 21669211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 216731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 216831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2169a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen public DragController getDragController() { 2170a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen return mDragController; 2171a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 2172a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 217331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 217431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void startActivityForResult(Intent intent, int requestCode) { 2175173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen onStartForResult(requestCode); 2176173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen super.startActivityForResult(intent, requestCode); 2177173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen } 2178173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen 2179173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen @Override 2180173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen public void startIntentSenderForResult (IntentSender intent, int requestCode, 2181173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options) { 2182173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen onStartForResult(requestCode); 2183173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen try { 2184173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen super.startIntentSenderForResult(intent, requestCode, 2185173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen fillInIntent, flagsMask, flagsValues, extraFlags, options); 2186173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen } catch (IntentSender.SendIntentException e) { 2187173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen throw new ActivityNotFoundException(); 2188173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen } 2189173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen } 2190173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen 2191173f711e03dfce70d76c3b45f764a4f6b682a3b3Adam Cohen private void onStartForResult(int requestCode) { 2192ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal if (requestCode >= 0) { 2193ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(true); 2194ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 219531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 219631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 219770d721061536e0634f6cfa8cd219759a83befceeWinson Chung /** 219870d721061536e0634f6cfa8cd219759a83befceeWinson Chung * Indicates that we want global search for this activity by setting the globalSearch 219970d721061536e0634f6cfa8cd219759a83befceeWinson Chung * argument for {@link #startSearch} to true. 220070d721061536e0634f6cfa8cd219759a83befceeWinson Chung */ 220131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 2202cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy public void startSearch(String initialQuery, boolean selectInitialQuery, 220331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Bundle appSearchData, boolean globalSearch) { 2204138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 2205138a04170d964da9cdec228e95b976875ae52481Karl Rosaen if (initialQuery == null) { 2206138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // Use any text typed in the launcher as the initial query 2207138a04170d964da9cdec228e95b976875ae52481Karl Rosaen initialQuery = getTypedText(); 2208138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 220931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (appSearchData == null) { 221031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project appSearchData = new Bundle(); 221132b12d2c792b74f193547e4b8375c97240079be1Bjorn Bringert appSearchData.putString("source", "launcher-search"); 221231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2213adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung Rect sourceBounds = new Rect(); 2214adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 2215adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung sourceBounds = mSearchDropTargetBar.getSearchBarBounds(); 2216adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 2217cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2218047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson boolean clearTextImmediately = startSearch(initialQuery, selectInitialQuery, 2219c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert appSearchData, sourceBounds); 2220047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson if (clearTextImmediately) { 2221047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson clearTypedText(); 2222047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson } 2223cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung 2224cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung // We need to show the workspace after starting the search 2225cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung showWorkspace(true); 2226c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 2227c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 2228047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson /** 2229047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson * Start a text search. 2230047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson * 2231047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson * @return {@code true} if the search will start immediately, so any further keypresses 2232047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson * will be handled directly by the search UI. {@code false} if {@link Launcher} should continue 2233047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson * to buffer keypresses. 2234047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson */ 2235047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson public boolean startSearch(String initialQuery, 2236c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert boolean selectInitialQuery, Bundle appSearchData, Rect sourceBounds) { 22379211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) { 22389211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.startSearch(initialQuery, selectInitialQuery, appSearchData, 22399211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen sourceBounds); 22409211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 22419211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 2242a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka startGlobalSearch(initialQuery, selectInitialQuery, 2243c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert appSearchData, sourceBounds); 2244047036e2c171fd676e02319fefdced8a6b55a035Ian Parkinson return false; 2245a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2246a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka 2247a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka /** 2248a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka * Starts the global search activity. This code is a copied from SearchManager 2249a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka */ 2250c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert private void startGlobalSearch(String initialQuery, 2251a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka boolean selectInitialQuery, Bundle appSearchData, Rect sourceBounds) { 2252138a04170d964da9cdec228e95b976875ae52481Karl Rosaen final SearchManager searchManager = 2253a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka (SearchManager) getSystemService(Context.SEARCH_SERVICE); 2254a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity(); 2255a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (globalSearchActivity == null) { 2256a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka Log.w(TAG, "No global search activity found."); 2257a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka return; 2258a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2259a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka Intent intent = new Intent(SearchManager.INTENT_ACTION_GLOBAL_SEARCH); 2260a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2261a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.setComponent(globalSearchActivity); 2262a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka // Make sure that we have a Bundle to put source in 2263a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (appSearchData == null) { 2264a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka appSearchData = new Bundle(); 2265a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } else { 2266a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka appSearchData = new Bundle(appSearchData); 2267a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 22689211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen // Set source to package name of app that starts global search if not set already. 2269a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (!appSearchData.containsKey("source")) { 2270a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka appSearchData.putString("source", getPackageName()); 2271a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2272a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.putExtra(SearchManager.APP_DATA, appSearchData); 2273a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (!TextUtils.isEmpty(initialQuery)) { 2274a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.putExtra(SearchManager.QUERY, initialQuery); 2275a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2276a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (selectInitialQuery) { 2277a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.putExtra(SearchManager.EXTRA_SELECT_QUERY, selectInitialQuery); 2278a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2279a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.setSourceBounds(sourceBounds); 2280a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka try { 2281a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka startActivity(intent); 2282a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } catch (ActivityNotFoundException ex) { 2283a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka Log.e(TAG, "Global search activity not found: " + globalSearchActivity); 2284a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 228531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 228631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 22874f93ec63b13f660fab63745d7127308954d5a6bdYura public boolean isOnCustomContent() { 22884f93ec63b13f660fab63745d7127308954d5a6bdYura return mWorkspace.isOnOrMovingToCustomContent(); 22894f93ec63b13f660fab63745d7127308954d5a6bdYura } 22904f93ec63b13f660fab63745d7127308954d5a6bdYura 229170d721061536e0634f6cfa8cd219759a83befceeWinson Chung @Override 229270d721061536e0634f6cfa8cd219759a83befceeWinson Chung public boolean onPrepareOptionsMenu(Menu menu) { 229370d721061536e0634f6cfa8cd219759a83befceeWinson Chung super.onPrepareOptionsMenu(menu); 22944f93ec63b13f660fab63745d7127308954d5a6bdYura if (!isOnCustomContent()) { 22954f93ec63b13f660fab63745d7127308954d5a6bdYura // Close any open folders 22964f93ec63b13f660fab63745d7127308954d5a6bdYura closeFolder(); 22974f93ec63b13f660fab63745d7127308954d5a6bdYura // Stop resizing any widgets 22984f93ec63b13f660fab63745d7127308954d5a6bdYura mWorkspace.exitWidgetResizeMode(); 22994f93ec63b13f660fab63745d7127308954d5a6bdYura if (!mWorkspace.isInOverviewMode()) { 23004f93ec63b13f660fab63745d7127308954d5a6bdYura // Show the overview mode 23014f93ec63b13f660fab63745d7127308954d5a6bdYura showOverviewMode(true); 23024f93ec63b13f660fab63745d7127308954d5a6bdYura } else { 23034f93ec63b13f660fab63745d7127308954d5a6bdYura showWorkspace(true); 23044f93ec63b13f660fab63745d7127308954d5a6bdYura } 2305e029874bcfd6e55cb93fb6609f3342f180b5995cWinson Chung } 23069211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 23079211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.onPrepareOptionsMenu(menu); 23089211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 23099211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 2310b94f3f804f3954666c73e0564391444ec77dc4d4Michael Jurka return false; 231170d721061536e0634f6cfa8cd219759a83befceeWinson Chung } 231231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2313ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project @Override 2314ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project public boolean onSearchRequested() { 2315cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy startSearch(null, false, null, true); 2316a135ba896e4e12a99deb054f671c63535c3e11e3Amith Yamasani // Use a custom animation for launching search 2317138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return true; 2318ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project } 2319ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 23209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public boolean isWorkspaceLocked() { 23219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return mWorkspaceLoading || mWaitingForResult; 232231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 232331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2324517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen public boolean isWorkspaceLoading() { 2325517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen return mWorkspaceLoading; 2326517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen } 2327517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen 2328ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal private void setWorkspaceLoading(boolean value) { 2329ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal boolean isLocked = isWorkspaceLocked(); 2330ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal mWorkspaceLoading = value; 2331ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal if (isLocked != isWorkspaceLocked()) { 2332ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal onWorkspaceLockedChanged(); 2333ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2334ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2335ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal 2336ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal private void setWaitingForResult(boolean value) { 2337ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal boolean isLocked = isWorkspaceLocked(); 2338ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal mWaitingForResult = value; 2339ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal if (isLocked != isWorkspaceLocked()) { 2340ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal onWorkspaceLockedChanged(); 2341ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2342ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2343ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal 23449211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen protected void onWorkspaceLockedChanged() { 23459211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 23469211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onWorkspaceLockedChanged(); 23479211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 23489211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2349ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal 23500280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka private void resetAddInfo() { 23513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = ItemInfo.NO_ID; 2352dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = -1; 23533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = mPendingAddInfo.cellY = -1; 23543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.spanX = mPendingAddInfo.spanY = -1; 2355d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.minSpanX = mPendingAddInfo.minSpanY = -1; 23563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.dropPos = null; 23570280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 23580280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 2359e6b63a3d7335fed5b7bbcc6d2c6230ae28facd3eSunny Goyal void addAppWidgetImpl(final int appWidgetId, final ItemInfo info, final 23605940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen AppWidgetHostView boundWidget, final LauncherAppWidgetProviderInfo appWidgetInfo) { 2361ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen addAppWidgetImpl(appWidgetId, info, boundWidget, appWidgetInfo, 0); 2362ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 2363ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen 2364e6b63a3d7335fed5b7bbcc6d2c6230ae28facd3eSunny Goyal void addAppWidgetImpl(final int appWidgetId, final ItemInfo info, 23655940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen final AppWidgetHostView boundWidget, final LauncherAppWidgetProviderInfo appWidgetInfo, 23665940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen int delay) { 23679d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen if (appWidgetInfo.configure != null) { 23689d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo = appWidgetInfo; 23694637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mPendingAddWidgetId = appWidgetId; 2370af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka 23717984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert // Launch over to configure widget, if needed 2372ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal mAppWidgetManager.startConfigActivity(appWidgetInfo, appWidgetId, this, 2373ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal mAppWidgetHost, REQUEST_CREATE_APPWIDGET); 2374ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal 23757984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert } else { 23767984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert // Otherwise just add it 2377ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen Runnable onComplete = new Runnable() { 2378ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen @Override 2379ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public void run() { 2380ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen // Exit spring loaded mode if necessary after adding the widget 2381ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed(true, EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, 2382ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen null); 2383ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 2384ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }; 2385dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen completeAddAppWidget(appWidgetId, info.container, info.screenId, boundWidget, 23869d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen appWidgetInfo); 2387689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, delay, false); 238831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 238931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2390cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2391af110e8603b2f372286d9155cbe8955a6a329e2dAllan Wojciechowski protected void moveToCustomContentScreen(boolean animate) { 2392f2b47f13cec19c8e06754fa1c3f46892349c217fSandeep Siddhartha // Close any folders that may be open. 2393f2b47f13cec19c8e06754fa1c3f46892349c217fSandeep Siddhartha closeFolder(); 2394af110e8603b2f372286d9155cbe8955a6a329e2dAllan Wojciechowski mWorkspace.moveToCustomContentScreen(animate); 2395af110e8603b2f372286d9155cbe8955a6a329e2dAllan Wojciechowski } 239671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal 239771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal public void addPendingItem(PendingAddItemInfo info, long container, long screenId, 239871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal int[] cell, int spanX, int spanY) { 239971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal switch (info.itemType) { 240071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal case LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET: 240171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: 240271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal int span[] = new int[2]; 240371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal span[0] = spanX; 240471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal span[1] = spanY; 240571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal addAppWidgetFromDrop((PendingAddWidgetInfo) info, 240671b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal container, screenId, cell, span); 240771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal break; 240871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 240971b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal processShortcutFromDrop(info.componentName, container, screenId, cell); 241071b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal break; 241171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal default: 241271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal throw new IllegalStateException("Unknown item type: " + info.itemType); 241371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal } 241471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal } 241571b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal 2416fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen /** 2417fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * Process a shortcut drop. 2418fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * 2419fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param componentName The name of the component 2420dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen * @param screenId The ID of the screen where it should be added 2421fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param cell The cell it should be added to, optional 2422fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen */ 242371b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal private void processShortcutFromDrop(ComponentName componentName, long container, long screenId, 242471b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal int[] cell) { 24250280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka resetAddInfo(); 24263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = container; 2427dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = screenId; 242871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal mPendingAddInfo.dropPos = null; 2429fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 2430fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (cell != null) { 24313d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = cell[0]; 24323d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellY = cell[1]; 2433fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 24340280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 24350280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka Intent createShortcutIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT); 24360280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka createShortcutIntent.setComponent(componentName); 24370280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka processShortcut(createShortcutIntent); 24380280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 24390280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 2440fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen /** 2441fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * Process a widget drop. 2442fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * 2443fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param info The PendingAppWidgetInfo of the widget being added. 2444dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen * @param screenId The ID of the screen where it should be added 2445fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param cell The cell it should be added to, optional 2446fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen */ 244771b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal private void addAppWidgetFromDrop(PendingAddWidgetInfo info, long container, long screenId, 244871b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal int[] cell, int[] span) { 2449fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen resetAddInfo(); 24503d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = info.container = container; 2451dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = info.screenId = screenId; 245271b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal mPendingAddInfo.dropPos = null; 2453d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.minSpanX = info.minSpanX; 2454d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.minSpanY = info.minSpanY; 2455d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen 2456fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (cell != null) { 24573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = cell[0]; 24583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellY = cell[1]; 2459fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 2460d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen if (span != null) { 2461d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.spanX = span[0]; 2462d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.spanY = span[1]; 2463d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen } 2464fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 2465ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen AppWidgetHostView hostView = info.boundWidget; 2466ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen int appWidgetId; 2467ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (hostView != null) { 2468ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen appWidgetId = hostView.getAppWidgetId(); 24699d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen addAppWidgetImpl(appWidgetId, info, hostView, info.info); 2470ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } else { 24719d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // In this case, we either need to start an activity to get permission to bind 24729d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // the widget, or we need to start an activity to configure the widget, or both. 2473ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen appWidgetId = getAppWidgetHost().allocateAppWidgetId(); 2474dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen Bundle options = info.bindOptions; 2475dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen 2476ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal boolean success = mAppWidgetManager.bindAppWidgetIdIfAllowed( 2477ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal appWidgetId, info.info, options); 2478dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen if (success) { 24799d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen addAppWidgetImpl(appWidgetId, info, null, info.info); 24808b805b17158886035b38261eb611d8641701ae43Michael Jurka } else { 24819d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo = info.info; 24828b805b17158886035b38261eb611d8641701ae43Michael Jurka Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); 24838b805b17158886035b38261eb611d8641701ae43Michael Jurka intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 24848b805b17158886035b38261eb611d8641701ae43Michael Jurka intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName); 2485ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal mAppWidgetManager.getUser(mPendingAddWidgetInfo) 2486ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal .addToIntent(intent, AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE); 2487dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen // TODO: we need to make sure that this accounts for the options bundle. 2488dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen // intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); 24898b805b17158886035b38261eb611d8641701ae43Michael Jurka startActivityForResult(intent, REQUEST_BIND_APPWIDGET); 24908b805b17158886035b38261eb611d8641701ae43Michael Jurka } 2491ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 2492fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 2493fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 2494deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato void processShortcut(Intent intent) { 2495ed13187a745866483139e2878037e1f8427ce567Kenny Guy Utilities.startActivityForResultSafely(this, intent, REQUEST_CREATE_SHORTCUT); 249631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 249731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 249824ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung void processWallpaper(Intent intent) { 249924ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung startActivityForResult(intent, REQUEST_PICK_WALLPAPER); 250024ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung } 250124ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung 2502dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen FolderIcon addFolder(CellLayout layout, long container, final long screenId, int cellX, 25033d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int cellY) { 2504c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka final FolderInfo folderInfo = new FolderInfo(); 250531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project folderInfo.title = getText(R.string.folder_name); 250631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 250731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Update the model 25081d4a2df091e2b5928406ea503321563a0ec8a01eSunny Goyal LauncherModel.addItemToDatabase(Launcher.this, folderInfo, container, screenId, 25091d4a2df091e2b5928406ea503321563a0ec8a01eSunny Goyal cellX, cellY); 2510319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sFolders.put(folderInfo.id, folderInfo); 251131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 251231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Create the view 25133d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung FolderIcon newFolder = 25143d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo, mIconCache); 2515dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mWorkspace.addInScreen(newFolder, container, screenId, cellX, cellY, 1, 1, 25163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung isWorkspaceLocked()); 25175f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Force measure the new folder icon 25185f8afe6280eae34620067696173e71943e1a30a3Winson Chung CellLayout parent = mWorkspace.getParentCellLayoutForView(newFolder); 25195f8afe6280eae34620067696173e71943e1a30a3Winson Chung parent.getShortcutsAndWidgets().measureChild(newFolder); 2520df0353815c629fc678824b07a234b89a1ff94208Adam Cohen return newFolder; 25219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 25229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 25239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato void removeFolder(FolderInfo folder) { 2524319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sFolders.remove(folder.id); 252531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2526cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 25272ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato /** 25282ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato * Registers various content observers. The current implementation registers 25292ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato * only a favorites observer to keep track of the favorites applications. 25302ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato */ 25311e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private void registerContentObservers() { 25321e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey ContentResolver resolver = getContentResolver(); 25331e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey resolver.registerContentObserver(LauncherProvider.CONTENT_APPWIDGET_RESET_URI, 25341e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey true, mWidgetObserver); 25351e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 25361e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 253731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 253831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 253931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (event.getAction() == KeyEvent.ACTION_DOWN) { 254031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project switch (event.getKeyCode()) { 2541678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn case KeyEvent.KEYCODE_HOME: 2542678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn return true; 2543be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 25444bbf419bf98c00decc74b429320258c2a16faeecSunny Goyal if (Utilities.isPropertyEnabled(DUMP_STATE_PROPERTY)) { 2545be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato dumpState(); 2546be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato return true; 2547be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 2548be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato break; 2549678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn } 2550678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn } else if (event.getAction() == KeyEvent.ACTION_UP) { 2551678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn switch (event.getKeyCode()) { 255231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case KeyEvent.KEYCODE_HOME: 255331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return true; 255431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 255531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 255631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 255731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return super.dispatchKeyEvent(event); 255831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 255931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 256088ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato @Override 256188ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato public void onBackPressed() { 25629211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null && mLauncherCallbacks.handleBackPressed()) { 25639211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return; 25649211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 25659211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 25663d9490ab9520ffe3798539ed1626463a7eb6c9e1Winson Chung LauncherAccessibilityDelegate delegate = 25673d9490ab9520ffe3798539ed1626463a7eb6c9e1Winson Chung LauncherAppState.getInstance().getAccessibilityDelegate(); 25683d9490ab9520ffe3798539ed1626463a7eb6c9e1Winson Chung if (delegate != null && delegate.onBackPressed()) { 2569c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen return; 2570c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen } 2571c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen 2572b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (isAppsViewVisible()) { 2573b745afbdd75157c73d581b345118cdaff99e912dWinson Chung showWorkspace(true); 2574b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } else if (isWidgetsViewVisible()) { 2575b745afbdd75157c73d581b345118cdaff99e912dWinson Chung showOverviewMode(true); 2576f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } else if (mWorkspace.isInOverviewMode()) { 2577dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(true); 257894f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy } else if (mWorkspace.getOpenFolder() != null) { 257976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen Folder openFolder = mWorkspace.getOpenFolder(); 258076fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen if (openFolder.isEditingName()) { 258176fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen openFolder.dismissEditingName(); 258276fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen } else { 258376fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen closeFolder(); 258476fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen } 258594f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy } else { 2586758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy mWorkspace.exitWidgetResizeMode(); 2587758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy 258894f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy // Back button is a no-op here, but give at least some feedback for the button press 258994f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy mWorkspace.showOutlinesTemporarily(); 2590af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka } 259188ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato } 259288ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato 259331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 25941e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey * Re-listen when widgets are reset. 25951e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey */ 2596091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void onAppWidgetReset() { 2597bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka if (mAppWidgetHost != null) { 2598bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka mAppWidgetHost.startListening(); 2599bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka } 26001e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 26011e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 26021e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey /** 260331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Launches the intent referred by the clicked shortcut. 260431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 260531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param v The view representing the clicked shortcut. 260631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 260731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onClick(View v) { 26089932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen // Make sure that rogue clicks don't get through while allapps is launching, or after the 26099932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen // view has detached (it's possible for this to happen if the view is removed mid touch). 26109932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen if (v.getWindowToken() == null) { 26119932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen return; 26129932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen } 26139932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen 26149b0b2fefb2de9aca457ab1c38ffd08d7667f4065Winson Chung if (!mWorkspace.isFinishedSwitchingState()) { 26159932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen return; 26169932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen } 26172f84ef259314b0bef20f6e7e503377212fadc88cAdam Cohen 26181697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (v instanceof Workspace) { 26191697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (mWorkspace.isInOverviewMode()) { 2620dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(true); 2621f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2622f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen return; 2623f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2624f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 2625f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen if (v instanceof CellLayout) { 2626f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen if (mWorkspace.isInOverviewMode()) { 2627dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(mWorkspace.indexOfChild(v), true); 2628f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2629f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2630f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 263131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Object tag = v.getTag(); 26320589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (tag instanceof ShortcutInfo) { 2633a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha onClickAppShortcut(v); 263431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else if (tag instanceof FolderInfo) { 2635a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (v instanceof FolderIcon) { 2636a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha onClickFolderIcon(v); 2637a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 2638f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else if (v == mAllAppsButton) { 2639a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha onClickAllAppsButton(v); 2640508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal } else if (tag instanceof AppInfo) { 2641508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal startAppShortcutOrInfoActivity(v); 2642ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } else if (tag instanceof LauncherAppWidgetInfo) { 2643ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (v instanceof PendingAppWidgetHostView) { 2644ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal onClickPendingWidget((PendingAppWidgetHostView) v); 2645ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 264631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 264731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 264831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2649508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal public void onClickPagedViewIcon(View v) { 2650508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal startAppShortcutOrInfoActivity(v); 26519211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 26529211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onClickPagedViewIcon(v); 26539211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2654508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal } 2655508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal 26567066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyal @SuppressLint("ClickableViewAccessibility") 26570e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka public boolean onTouch(View v, MotionEvent event) { 26580e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka return false; 26590e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka } 26600e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka 2661af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka /** 2662ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal * Event handler for the app widget view which has not fully restored. 2663ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal */ 2664e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal public void onClickPendingWidget(final PendingAppWidgetHostView v) { 26659b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal if (mIsSafeModeEnabled) { 26669b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal Toast.makeText(this, R.string.safemode_widget_error, Toast.LENGTH_SHORT).show(); 26679b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal return; 26689b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal } 26699b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal 2670e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal final LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) v.getTag(); 2671ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (v.isReadyForClickSetup()) { 2672ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal int widgetId = info.appWidgetId; 2673ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(widgetId); 2674ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (appWidgetInfo != null) { 26755940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen mPendingAddWidgetInfo = LauncherAppWidgetProviderInfo.fromProviderInfo( 26765940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen this, appWidgetInfo); 2677ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal mPendingAddInfo.copyFrom(info); 2678ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal mPendingAddWidgetId = widgetId; 2679ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 2680ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal AppWidgetManagerCompat.getInstance(this).startConfigActivity(appWidgetInfo, 2681ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal info.appWidgetId, this, mAppWidgetHost, REQUEST_RECONFIGURE_APPWIDGET); 2682ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 2683e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal } else if (info.installProgress < 0) { 2684e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal // The install has not been queued 2685e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal final String packageName = info.providerName.getPackageName(); 2686e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal showBrokenAppInstallDialog(packageName, 2687e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal new DialogInterface.OnClickListener() { 2688e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal public void onClick(DialogInterface dialog, int id) { 2689e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal startActivitySafely(v, LauncherModel.getMarketIntent(packageName), info); 2690e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal } 2691e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal }); 2692e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal } else { 2693e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal // Download has started. 2694e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal final String packageName = info.providerName.getPackageName(); 2695e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal startActivitySafely(v, LauncherModel.getMarketIntent(packageName), info); 2696ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 2697ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 2698ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 2699ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal /** 27002c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * Event handler for the "grid" button that appears on the home screen, which 27012c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * enters all apps mode. 27022c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * 27032c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * @param v The view that was clicked. 27042c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka */ 2705a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha protected void onClickAllAppsButton(View v) { 2706a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickAllAppsButton"); 2707b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (isAppsViewVisible()) { 2708a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha showWorkspace(true); 2709a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } else { 27104ac30068732c7216288999d255a823adb7ca7c12Winson Chung // Try and refresh the set of predicted apps before we enter launcher 27114ac30068732c7216288999d255a823adb7ca7c12Winson Chung showAppsView(true /* animated */, false /* resetListToTop */, 27124ac30068732c7216288999d255a823adb7ca7c12Winson Chung true /* updatePredictedApps */); 2713a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2714a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2715a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2716e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal private void showBrokenAppInstallDialog(final String packageName, 2717e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal DialogInterface.OnClickListener onSearchClickListener) { 2718e03b81294f046474cf4057bec20dc560a2e053d4Sunny Goyal new AlertDialog.Builder(this) 2719e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal .setTitle(R.string.abandoned_promises_title) 2720e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal .setMessage(R.string.abandoned_promise_explanation) 2721e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal .setPositiveButton(R.string.abandoned_search, onSearchClickListener) 2722e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal .setNeutralButton(R.string.abandoned_clean_this, 2723e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal new DialogInterface.OnClickListener() { 2724e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal public void onClick(DialogInterface dialog, int id) { 2725e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal final UserHandleCompat user = UserHandleCompat.myUserHandle(); 2726e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal mWorkspace.removeAbandonedPromise(packageName, user); 2727e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal } 2728e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal }) 2729e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal .create().show(); 2730e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal return; 2731e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal } 2732e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal 2733a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2734a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for an app shortcut click. 2735a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * 2736a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * @param v The view that was clicked. Must be a tagged with a {@link ShortcutInfo}. 2737a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 273840c5ed303909c4df71037be3429aa1423e59585fChris Wren protected void onClickAppShortcut(final View v) { 2739a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickAppShortcut"); 2740a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha Object tag = v.getTag(); 2741a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (!(tag instanceof ShortcutInfo)) { 2742a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha throw new IllegalArgumentException("Input must be a Shortcut"); 2743a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2744a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2745a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Open shortcut 2746a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final ShortcutInfo shortcut = (ShortcutInfo) tag; 27471a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal 27481a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal if (shortcut.isDisabled != 0) { 27491a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal int error = R.string.activity_not_available; 27501a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal if ((shortcut.isDisabled & ShortcutInfo.FLAG_DISABLED_SAFEMODE) != 0) { 27511a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal error = R.string.safemode_shortcut_error; 27521a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal } 27531a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal Toast.makeText(this, error, Toast.LENGTH_SHORT).show(); 27541a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal return; 27551a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal } 27561a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal 2757a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final Intent intent = shortcut.intent; 2758a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2759a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Check for special shortcuts 2760a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (intent.getComponent() != null) { 2761a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final String shortcutClass = intent.getComponent().getClassName(); 2762a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2763a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (shortcutClass.equals(MemoryDumpActivity.class.getName())) { 2764a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha MemoryDumpActivity.startDump(this); 2765a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha return; 2766a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } else if (shortcutClass.equals(ToggleWeightWatcher.class.getName())) { 2767a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha toggleShowWeightWatcher(); 2768a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha return; 2769a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2770a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2771a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 277240c5ed303909c4df71037be3429aa1423e59585fChris Wren // Check for abandoned promise 2773349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal if ((v instanceof BubbleTextView) 2774349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal && shortcut.isPromise() 2775349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal && !shortcut.hasStatusFlag(ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE)) { 2776e7b8cd9e4f8d38d0445f3a032fafd44332f70878Sunny Goyal showBrokenAppInstallDialog( 2777349426234e8c5a0e5bcf2c8d94dbb9844b5f724aSunny Goyal shortcut.getTargetComponent().getPackageName(), 277840c5ed303909c4df71037be3429aa1423e59585fChris Wren new DialogInterface.OnClickListener() { 277940c5ed303909c4df71037be3429aa1423e59585fChris Wren public void onClick(DialogInterface dialog, int id) { 2780508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal startAppShortcutOrInfoActivity(v); 278140c5ed303909c4df71037be3429aa1423e59585fChris Wren } 278240c5ed303909c4df71037be3429aa1423e59585fChris Wren }); 278340c5ed303909c4df71037be3429aa1423e59585fChris Wren return; 278440c5ed303909c4df71037be3429aa1423e59585fChris Wren } 278540c5ed303909c4df71037be3429aa1423e59585fChris Wren 2786a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Start activities 2787508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal startAppShortcutOrInfoActivity(v); 27889211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 27899211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 27909211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onClickAppShortcut(v); 27919211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 279240c5ed303909c4df71037be3429aa1423e59585fChris Wren } 279340c5ed303909c4df71037be3429aa1423e59585fChris Wren 2794091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void startAppShortcutOrInfoActivity(View v) { 279540c5ed303909c4df71037be3429aa1423e59585fChris Wren Object tag = v.getTag(); 2796508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal final ShortcutInfo shortcut; 2797508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal final Intent intent; 2798508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal if (tag instanceof ShortcutInfo) { 2799508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal shortcut = (ShortcutInfo) tag; 2800508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal intent = shortcut.intent; 2801508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal int[] pos = new int[2]; 2802508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal v.getLocationOnScreen(pos); 2803508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal intent.setSourceBounds(new Rect(pos[0], pos[1], 2804508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal pos[0] + v.getWidth(), pos[1] + v.getHeight())); 2805508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal 2806508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal } else if (tag instanceof AppInfo) { 2807508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal shortcut = null; 2808508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal intent = ((AppInfo) tag).intent; 2809508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal } else { 2810508da15509224b46fcccabbe78f3e92fe69a67d8Sunny Goyal throw new IllegalArgumentException("Input must be a Shortcut or AppInfo"); 281140c5ed303909c4df71037be3429aa1423e59585fChris Wren } 2812a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2813a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha boolean success = startActivitySafely(v, intent, tag); 2814a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha mStats.recordLaunch(intent, shortcut); 2815a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2816a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (success && v instanceof BubbleTextView) { 2817a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha mWaitingForResume = (BubbleTextView) v; 2818a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha mWaitingForResume.setStayPressed(true); 2819a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2820a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2821a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2822a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2823a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for a folder icon click. 2824a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * 2825a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * @param v The view that was clicked. Must be an instance of {@link FolderIcon}. 2826a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 2827a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha protected void onClickFolderIcon(View v) { 2828a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickFolder"); 2829a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (!(v instanceof FolderIcon)){ 2830a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha throw new IllegalArgumentException("Input must be a FolderIcon"); 2831a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2832a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2833a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha FolderIcon folderIcon = (FolderIcon) v; 2834a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final FolderInfo info = folderIcon.getFolderInfo(); 2835a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha Folder openFolder = mWorkspace.getFolderForTag(info); 2836a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2837a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // If the folder info reports that the associated folder is open, then verify that 2838a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // it is actually opened. There have been a few instances where this gets out of sync. 2839a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (info.opened && openFolder == null) { 2840a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha Log.d(TAG, "Folder info marked as open, but associated folder is not open. Screen: " 2841a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha + info.screenId + " (" + info.cellX + ", " + info.cellY + ")"); 2842a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha info.opened = false; 2843a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2844a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2845a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (!info.opened && !folderIcon.getFolder().isDestroyed()) { 2846a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Close any open folder 2847a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha closeFolder(); 2848a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Open the requested folder 2849a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha openFolder(folderIcon); 2850a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } else { 2851a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Find the open folder... 2852a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha int folderScreen; 2853a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (openFolder != null) { 2854a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha folderScreen = mWorkspace.getPageForView(openFolder); 2855a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // .. and close it 2856a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha closeFolder(openFolder); 2857a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (folderScreen != mWorkspace.getCurrentPage()) { 2858a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Close any folder open on the current screen 2859a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha closeFolder(); 2860a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Pull the folder onto this screen 2861a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha openFolder(folderIcon); 2862a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2863a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2864a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 28659211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 28669211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 28679211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onClickFolderIcon(v); 28689211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 28695130e401a005fcf6afba6e8e72a628fc45f9a287Michael Jurka } 28705130e401a005fcf6afba6e8e72a628fc45f9a287Michael Jurka 2871d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha /** 2872d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha * Event handler for the (Add) Widgets button that appears after a long press 2873d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha * on the home screen. 2874d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha */ 28757b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal protected void onClickAddWidgetButton(View view) { 2876a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickAddWidgetButton"); 28779b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal if (mIsSafeModeEnabled) { 28789b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal Toast.makeText(this, R.string.safemode_widget_error, Toast.LENGTH_SHORT).show(); 28799b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal } else { 2880b745afbdd75157c73d581b345118cdaff99e912dWinson Chung showWidgetsView(true /* animated */, true /* resetPageToZero */); 28819b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal if (mLauncherCallbacks != null) { 28829b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal mLauncherCallbacks.onClickAddWidgetButton(view); 28839b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal } 28849211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2885d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha } 2886d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha 2887a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2888a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for the wallpaper picker button that appears after a long press 2889a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * on the home screen. 2890a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 28917b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal protected void onClickWallpaperPicker(View v) { 2892a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickWallpaperPicker"); 28936a1e95a3dfb5eb65cc2c682c5ede9e22cc7ff7d9Sunny Goyal startActivityForResult(new Intent(Intent.ACTION_SET_WALLPAPER).setPackage(getPackageName()), 28946a1e95a3dfb5eb65cc2c682c5ede9e22cc7ff7d9Sunny Goyal REQUEST_PICK_WALLPAPER); 28959211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 28969211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 28979211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onClickWallpaperPicker(v); 28989211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2899a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2900a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2901a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2902a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for a click on the settings button that appears after a long press 2903a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * on the home screen. 2904a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 29057b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal protected void onClickSettingsButton(View v) { 2906a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickSettingsButton"); 29079211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 29089211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onClickSettingsButton(v); 29097fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } else { 29107fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi showSettingsActivity(); 29119211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2912a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2913a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 29145130e401a005fcf6afba6e8e72a628fc45f9a287Michael Jurka public void onTouchDownAllAppsButton(View v) { 29152a55232840acc214d95474a3734b3b897669efd9Michael Jurka // Provide the same haptic feedback that the system offers for virtual keys. 29162a55232840acc214d95474a3734b3b897669efd9Michael Jurka v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 29172c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka } 29182c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka 291961f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen public void performHapticFeedbackOnTouchDown(View v) { 292061f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen // Provide the same haptic feedback that the system offers for virtual keys. 292161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 292261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 292361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 292461f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen public View.OnTouchListener getHapticFeedbackTouchListener() { 292561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen if (mHapticFeedbackTouchListener == null) { 292661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen mHapticFeedbackTouchListener = new View.OnTouchListener() { 29277066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyal @SuppressLint("ClickableViewAccessibility") 292861f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen @Override 292961f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen public boolean onTouch(View v, MotionEvent event) { 293061f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) { 293161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 293261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 293361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen return false; 293461f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 293561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen }; 293661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 293761f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen return mHapticFeedbackTouchListener; 293861f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 293961f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 29409211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen public void onDragStarted(View view) { 29419211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (isOnCustomContent()) { 29429211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen // Custom content screen doesn't participate in drag and drop. If on custom 29439211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen // content screen, move to default. 29449211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen moveWorkspaceToDefaultScreen(); 29459211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 29469211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 29479211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 29489211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onDragStarted(view); 29499211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 29509211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 295162d18edcc74ce96e2955048f5e0fc0ce3e4ec275Anjali Koppal 2952ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha /** 2953ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * Called when the user stops interacting with the launcher. 2954ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * This implies that the user is now on the homescreen and is not doing housekeeping. 2955ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha */ 29569211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen protected void onInteractionEnd() { 29579211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 29589211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onInteractionEnd(); 29599211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 29609211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2961ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha 2962ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha /** 2963ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * Called when the user starts interacting with the launcher. 2964ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * The possible interactions are: 2965ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * - open all apps 2966ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * - reorder an app shortcut, or a widget 2967ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * - open the overview mode. 2968ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * This is a good time to stop doing things that only make sense 2969ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * when the user is on the homescreen and not doing housekeeping. 2970ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha */ 29719211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen protected void onInteractionBegin() { 29729211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 29739211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onInteractionBegin(); 29749211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 29759211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 2976ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha 2977cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung /** Updates the interaction state. */ 2978cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung public void updateInteraction(Workspace.State fromState, Workspace.State toState) { 297983f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung // Only update the interacting state if we are transitioning to/from a view with an 2980cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung // overlay 298183f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung boolean fromStateWithOverlay; 298283f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung boolean toStateWithOverlay; 298383f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (Launcher.DISABLE_ALL_APPS_SEARCH_INTEGRATION) { 298483f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung fromStateWithOverlay = fromState != Workspace.State.NORMAL; 298583f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung toStateWithOverlay = toState != Workspace.State.NORMAL; 298683f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung } else { 298783f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung fromStateWithOverlay = fromState != Workspace.State.NORMAL && 298883f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung fromState != Workspace.State.NORMAL_HIDDEN; 298983f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung toStateWithOverlay = toState != Workspace.State.NORMAL && 299083f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung toState != Workspace.State.NORMAL_HIDDEN; 299183f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung } 299283f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (toStateWithOverlay) { 2993cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung onInteractionBegin(); 299483f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung } else if (fromStateWithOverlay) { 2995cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung onInteractionEnd(); 2996cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 2997cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 2998cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung 2999f07af7b77de0319355e228e8630824d924522d78Kenny Guy void startApplicationDetailsActivity(ComponentName componentName, UserHandleCompat user) { 3000f07af7b77de0319355e228e8630824d924522d78Kenny Guy try { 3001f07af7b77de0319355e228e8630824d924522d78Kenny Guy LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this); 3002f07af7b77de0319355e228e8630824d924522d78Kenny Guy launcherApps.showAppDetailsForProfile(componentName, user); 3003f07af7b77de0319355e228e8630824d924522d78Kenny Guy } catch (SecurityException e) { 3004f07af7b77de0319355e228e8630824d924522d78Kenny Guy Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 3005f07af7b77de0319355e228e8630824d924522d78Kenny Guy Log.e(TAG, "Launcher does not have permission to launch settings"); 3006f07af7b77de0319355e228e8630824d924522d78Kenny Guy } catch (ActivityNotFoundException e) { 3007f07af7b77de0319355e228e8630824d924522d78Kenny Guy Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 3008f07af7b77de0319355e228e8630824d924522d78Kenny Guy Log.e(TAG, "Unable to launch settings"); 3009f07af7b77de0319355e228e8630824d924522d78Kenny Guy } 30104ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy } 30114ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy 30121e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka // returns true if the activity was started 3013d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy boolean startApplicationUninstallActivity(ComponentName componentName, int flags, 3014d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy UserHandleCompat user) { 3015eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka if ((flags & AppInfo.DOWNLOADED_FLAG) == 0) { 30165539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy // System applications cannot be installed. For now, show a toast explaining that. 30175539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy // We may give them the option of disabling apps this way. 30185539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy int messageId = R.string.uninstall_system_app_text; 30195539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy Toast.makeText(this, messageId, Toast.LENGTH_SHORT).show(); 30201e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka return false; 30215539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } else { 30221e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka String packageName = componentName.getPackageName(); 30231e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka String className = componentName.getClassName(); 30245539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy Intent intent = new Intent( 30255539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy Intent.ACTION_DELETE, Uri.fromParts("package", packageName, className)); 3026dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 3027dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 3028d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy if (user != null) { 3029d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy user.addToIntent(intent, Intent.EXTRA_USER); 3030d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy } 30315539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy startActivity(intent); 30321e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka return true; 30335539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 3034bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy } 3035bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy 303686a720e4927a997e9fd98276d2dab67244138f79Michael Jurka boolean startActivity(View v, Intent intent, Object tag) { 3037b6cc40bc15ef97ba7d677295c9a3870f18eadbe2Kenny Guy intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 303831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project try { 30392672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung // Only launch using the new animation if the shortcut has not opted out (this is a 30402672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung // private contract between launcher and may be ignored in the future). 30412672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung boolean useLaunchAnimation = (v != null) && 30422672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung !intent.hasExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION); 3043ed13187a745866483139e2878037e1f8427ce567Kenny Guy LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this); 3044ed13187a745866483139e2878037e1f8427ce567Kenny Guy UserManagerCompat userManager = UserManagerCompat.getInstance(this); 3045ed13187a745866483139e2878037e1f8427ce567Kenny Guy 30461317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy UserHandleCompat user = null; 30471317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy if (intent.hasExtra(AppInfo.EXTRA_PROFILE)) { 30481317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy long serialNumber = intent.getLongExtra(AppInfo.EXTRA_PROFILE, -1); 30491317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy user = userManager.getUserForSerialNumber(serialNumber); 30501317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy } 30511317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy 30521317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy Bundle optsBundle = null; 30532672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung if (useLaunchAnimation) { 3054a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase ActivityOptions opts = null; 3055a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase if (sClipRevealMethod != null) { 3056a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase // TODO: call method directly when Launcher3 can depend on M APIs 3057a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase int left = 0, top = 0; 3058a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase int width = v.getMeasuredWidth(), height = v.getMeasuredHeight(); 3059a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase if (v instanceof TextView) { 3060a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase // Launch from center of icon, not entire view 3061b745afbdd75157c73d581b345118cdaff99e912dWinson Chung Drawable icon = Workspace.getTextViewIcon((TextView) v); 3062b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (icon != null) { 3063b745afbdd75157c73d581b345118cdaff99e912dWinson Chung Rect bounds = icon.getBounds(); 3064a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase left = (width - bounds.width()) / 2; 3065b745afbdd75157c73d581b345118cdaff99e912dWinson Chung top = v.getPaddingTop(); 3066a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase width = bounds.width(); 3067a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase height = bounds.height(); 3068a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 3069a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 3070a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase try { 3071a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase opts = (ActivityOptions) sClipRevealMethod.invoke(null, v, 3072a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase left, top, width, height); 3073a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } catch (IllegalAccessException e) { 3074a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase Log.d(TAG, "Could not call makeClipRevealAnimation: " + e); 3075a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase sClipRevealMethod = null; 3076a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } catch (InvocationTargetException e) { 3077a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase Log.d(TAG, "Could not call makeClipRevealAnimation: " + e); 3078a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase sClipRevealMethod = null; 3079a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 3080a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 30812e52c90b3ff0a04bd734aa19c54c39cef186b653Adam Cohen if (opts == null && !Utilities.isLmpOrAbove()) { 30822e52c90b3ff0a04bd734aa19c54c39cef186b653Adam Cohen opts = ActivityOptions.makeScaleUpAnimation(v, 0, 0, 3083a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase v.getMeasuredWidth(), v.getMeasuredHeight()); 3084a8f996d03982d76f59b2694fe9446d2a30eae97aChet Haase } 30852e52c90b3ff0a04bd734aa19c54c39cef186b653Adam Cohen optsBundle = opts != null ? opts.toBundle() : null; 30866ea3b116fc2eea7cc1a6892c548da45a4f581a1dAdam Cohen } 30871317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy 30881317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy if (user == null || user.equals(UserHandleCompat.myUserHandle())) { 30891317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy // Could be launching some bookkeeping activity 30901317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy startActivity(intent, optsBundle); 3091c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung } else { 3092c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal // TODO Component can be null when shortcuts are supported for secondary user 3093c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy launcherApps.startActivityForProfile(intent.getComponent(), user, 3094c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy intent.getSourceBounds(), optsBundle); 3095c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung } 3096ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka return true; 309731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } catch (SecurityException e) { 309831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 3099a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato Log.e(TAG, "Launcher does not have the permission to launch " + intent + 310031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ". Make sure to create a MAIN intent-filter for the corresponding activity " + 3101f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato "or use the exported attribute for this activity. " 3102f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato + "tag="+ tag + " intent=" + intent, e); 31038e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy } 3104ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka return false; 31058e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy } 3106aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 310786a720e4927a997e9fd98276d2dab67244138f79Michael Jurka boolean startActivitySafely(View v, Intent intent, Object tag) { 310886a720e4927a997e9fd98276d2dab67244138f79Michael Jurka boolean success = false; 3109c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal if (mIsSafeModeEnabled && !Utilities.isSystemApp(this, intent)) { 3110c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal Toast.makeText(this, R.string.safemode_shortcut_error, Toast.LENGTH_SHORT).show(); 3111c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal return false; 3112c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal } 311386a720e4927a997e9fd98276d2dab67244138f79Michael Jurka try { 311486a720e4927a997e9fd98276d2dab67244138f79Michael Jurka success = startActivity(v, intent, tag); 311586a720e4927a997e9fd98276d2dab67244138f79Michael Jurka } catch (ActivityNotFoundException e) { 311686a720e4927a997e9fd98276d2dab67244138f79Michael Jurka Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 311786a720e4927a997e9fd98276d2dab67244138f79Michael Jurka Log.e(TAG, "Unable to launch. tag=" + tag + " intent=" + intent, e); 311886a720e4927a997e9fd98276d2dab67244138f79Michael Jurka } 311986a720e4927a997e9fd98276d2dab67244138f79Michael Jurka return success; 312086a720e4927a997e9fd98276d2dab67244138f79Michael Jurka } 312186a720e4927a997e9fd98276d2dab67244138f79Michael Jurka 3122268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen /** 3123268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen * This method draws the FolderIcon to an ImageView and then adds and positions that ImageView 3124268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen * in the DragLayer in the exact absolute location of the original FolderIcon. 3125268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen */ 3126268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private void copyFolderIconToImage(FolderIcon fi) { 3127268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen final int width = fi.getMeasuredWidth(); 3128268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen final int height = fi.getMeasuredHeight(); 3129268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 3130268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Lazy load ImageView, Bitmap and Canvas 3131268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mFolderIconImageView == null) { 3132268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconImageView = new ImageView(this); 3133268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 3134268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mFolderIconBitmap == null || mFolderIconBitmap.getWidth() != width || 3135268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconBitmap.getHeight() != height) { 3136268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 3137268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconCanvas = new Canvas(mFolderIconBitmap); 3138268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 3139268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 3140268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen DragLayer.LayoutParams lp; 3141268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mFolderIconImageView.getLayoutParams() instanceof DragLayer.LayoutParams) { 3142268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp = (DragLayer.LayoutParams) mFolderIconImageView.getLayoutParams(); 3143268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } else { 3144268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp = new DragLayer.LayoutParams(width, height); 3145268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 3146268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 3147307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen // The layout from which the folder is being opened may be scaled, adjust the starting 3148307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen // view size by this scale factor. 3149307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen float scale = mDragLayer.getDescendantRectRelativeToSelf(fi, mRectForFolderAnimation); 3150268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp.customPosition = true; 3151268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp.x = mRectForFolderAnimation.left; 3152268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp.y = mRectForFolderAnimation.top; 3153307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen lp.width = (int) (scale * width); 3154307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen lp.height = (int) (scale * height); 3155268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 3156268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 3157268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen fi.draw(mFolderIconCanvas); 3158268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconImageView.setImageBitmap(mFolderIconBitmap); 3159fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen if (fi.getFolder() != null) { 3160fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen mFolderIconImageView.setPivotX(fi.getFolder().getPivotXForIconAnimation()); 3161fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen mFolderIconImageView.setPivotY(fi.getFolder().getPivotYForIconAnimation()); 31628ec2303379eb467e063113385c9514063abed787Adam Cohen } 3163268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Just in case this image view is still in the drag layer from a previous animation, 3164268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // we remove it and re-add it. 3165268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mDragLayer.indexOfChild(mFolderIconImageView) != -1) { 3166268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.removeView(mFolderIconImageView); 3167268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 3168268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.addView(mFolderIconImageView, lp); 3169fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen if (fi.getFolder() != null) { 3170fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen fi.getFolder().bringToFront(); 31718ec2303379eb467e063113385c9514063abed787Adam Cohen } 3172268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 3173268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 31742801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen private void growAndFadeOutFolderIcon(FolderIcon fi) { 31759932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen if (fi == null) return; 31762801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0); 31772801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.5f); 31782801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.5f); 31792801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 3180c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen FolderInfo info = (FolderInfo) fi.getTag(); 3181c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 3182c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen CellLayout cl = (CellLayout) fi.getParent().getParent(); 3183e50adee3d54978840036bb3a814771ce498aee18Winson Chung CellLayout.LayoutParams lp = (CellLayout.LayoutParams) fi.getLayoutParams(); 3184e50adee3d54978840036bb3a814771ce498aee18Winson Chung cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY); 3185c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen } 3186c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen 3187268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original 3188268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen copyFolderIconToImage(fi); 3189268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen fi.setVisibility(View.INVISIBLE); 3190268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 31912ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(mFolderIconImageView, alpha, 3192268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen scaleX, scaleY); 3193d794a3f46521b972fa02826d379d1efa112793d2Kenny Guy if (Utilities.isLmpOrAbove()) { 3194c4fe9ea11e82fe16d60525323464fd50cf391378Adam Cohen oa.setInterpolator(new LogDecelerateInterpolator(100, 0)); 3195c4fe9ea11e82fe16d60525323464fd50cf391378Adam Cohen } 3196c4fe9ea11e82fe16d60525323464fd50cf391378Adam Cohen oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); 31972801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen oa.start(); 31982801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 31992801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 3200268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private void shrinkAndFadeInFolderIcon(final FolderIcon fi) { 32019932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen if (fi == null) return; 32022801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f); 32032801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f); 32042801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f); 32052801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 3206268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen final CellLayout cl = (CellLayout) fi.getParent().getParent(); 3207268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 3208268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // We remove and re-draw the FolderIcon in-case it has changed 3209268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.removeView(mFolderIconImageView); 3210268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen copyFolderIconToImage(fi); 32112ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(mFolderIconImageView, alpha, 3212268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen scaleX, scaleY); 3213c4fe9ea11e82fe16d60525323464fd50cf391378Adam Cohen oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); 3214c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen oa.addListener(new AnimatorListenerAdapter() { 3215c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen @Override 3216c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen public void onAnimationEnd(Animator animation) { 3217268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (cl != null) { 3218268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen cl.clearFolderLeaveBehind(); 3219268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Remove the ImageView copy of the FolderIcon and make the original visible. 3220268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.removeView(mFolderIconImageView); 3221268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen fi.setVisibility(View.VISIBLE); 3222c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen } 3223c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen } 3224c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen }); 32252801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen oa.start(); 32262801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 32272801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 322831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 3229774bd377df3053ef43e34ab8ca98160eb6811be1Michael Jurka * Opens the user folder described by the specified tag. The opening of the folder 323031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * is animated relative to the specified View. If the View is null, no animation 323131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * is played. 323231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 323331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param folderInfo The FolderInfo describing the folder to open. 323431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 3235a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen public void openFolder(FolderIcon folderIcon) { 3236fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen Folder folder = folderIcon.getFolder(); 3237f406615354a92367481a60966b6b873cae37fe4cSunny Goyal Folder openFolder = mWorkspace != null ? mWorkspace.getOpenFolder() : null; 3238f406615354a92367481a60966b6b873cae37fe4cSunny Goyal if (openFolder != null && openFolder != folder) { 3239f406615354a92367481a60966b6b873cae37fe4cSunny Goyal // Close any open folder before opening a folder. 3240f406615354a92367481a60966b6b873cae37fe4cSunny Goyal closeFolder(); 3241f406615354a92367481a60966b6b873cae37fe4cSunny Goyal } 3242f406615354a92367481a60966b6b873cae37fe4cSunny Goyal 3243a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen FolderInfo info = folder.mInfo; 324431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3245a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen info.opened = true; 324631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3247f406615354a92367481a60966b6b873cae37fe4cSunny Goyal // While the folder is open, the position of the icon cannot change. 3248f406615354a92367481a60966b6b873cae37fe4cSunny Goyal ((CellLayout.LayoutParams) folderIcon.getLayoutParams()).canReorder = false; 3249f406615354a92367481a60966b6b873cae37fe4cSunny Goyal 32504554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen // Just verify that the folder hasn't already been added to the DragLayer. 32514554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen // There was a one-off crash where the folder had a parent already. 32524554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen if (folder.getParent() == null) { 32534554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen mDragLayer.addView(folder); 32544554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen mDragController.addDropTarget((DropTarget) folder); 32554554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } else { 32564554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen Log.w(TAG, "Opening folder (" + folder + ") which already has a parent (" + 32574554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen folder.getParent() + ")."); 32584554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 3259a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen folder.animateOpen(); 3260268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen growAndFadeOutFolderIcon(folderIcon); 326183ca480941b3dd635b62347008fc8d7859d82002Winson Chung 326283ca480941b3dd635b62347008fc8d7859d82002Winson Chung // Notify the accessibility manager that this folder "window" has appeared and occluded 326383ca480941b3dd635b62347008fc8d7859d82002Winson Chung // the workspace items 326483ca480941b3dd635b62347008fc8d7859d82002Winson Chung folder.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 326583ca480941b3dd635b62347008fc8d7859d82002Winson Chung getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); 32664554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 32674554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen 32684554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen public void closeFolder() { 326937c717ffa626c6690ea45ba88e5dfc9bea39ed6eAdam Cohen Folder folder = mWorkspace != null ? mWorkspace.getOpenFolder() : null; 32704554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen if (folder != null) { 3271ac56cff1860b71d3f164aedd268703936e08fdc0Adam Cohen if (folder.isEditingName()) { 3272ac56cff1860b71d3f164aedd268703936e08fdc0Adam Cohen folder.dismissEditingName(); 3273ac56cff1860b71d3f164aedd268703936e08fdc0Adam Cohen } 32744554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen closeFolder(folder); 32754554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 32764554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 32774554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen 327883a8f042adda926489494dff217c15ab696139b4Sunny Goyal public void closeFolder(Folder folder) { 32794554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen folder.getInfo().opened = false; 32804554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen 32814554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen ViewGroup parent = (ViewGroup) folder.getParent().getParent(); 32824554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen if (parent != null) { 32834554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen FolderIcon fi = (FolderIcon) mWorkspace.getViewForTag(folder.mInfo); 32844554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen shrinkAndFadeInFolderIcon(fi); 3285f406615354a92367481a60966b6b873cae37fe4cSunny Goyal if (fi != null) { 3286f406615354a92367481a60966b6b873cae37fe4cSunny Goyal ((CellLayout.LayoutParams) fi.getLayoutParams()).canReorder = true; 3287f406615354a92367481a60966b6b873cae37fe4cSunny Goyal } 32884554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 32894554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen folder.animateClosed(); 329083ca480941b3dd635b62347008fc8d7859d82002Winson Chung 329183ca480941b3dd635b62347008fc8d7859d82002Winson Chung // Notify the accessibility manager that this folder "window" has disappeard and no 329283ca480941b3dd635b62347008fc8d7859d82002Winson Chung // longer occludeds the workspace items 329383ca480941b3dd635b62347008fc8d7859d82002Winson Chung getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 329431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 329531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 329631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onLongClick(View v) { 329736a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung if (!isDraggingEnabled()) return false; 329836a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung if (isWorkspaceLocked()) return false; 329936a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung if (mState != State.WORKSPACE) return false; 330031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 33011697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (v instanceof Workspace) { 33021697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (!mWorkspace.isInOverviewMode()) { 3303dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung if (!mWorkspace.isTouchActive()) { 3304dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showOverviewMode(true); 330593c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, 330693c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); 330793c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen return true; 330893c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen } else { 330993c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen return false; 331093c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen } 3311aa4c8c1fea577431e218a927ae8ba6c47e51bfdbAdam Cohen } else { 3312aa4c8c1fea577431e218a927ae8ba6c47e51bfdbAdam Cohen return false; 33131697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen } 33141697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen } 33151697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen 3316e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen CellLayout.CellInfo longClickCellInfo = null; 3317e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen View itemUnderLongClick = null; 3318e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen if (v.getTag() instanceof ItemInfo) { 3319e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen ItemInfo info = (ItemInfo) v.getTag(); 3320c9735cff2e558aa3f3810e49c15ef13049b9429cAdam Cohen longClickCellInfo = new CellLayout.CellInfo(v, info); 3321e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen itemUnderLongClick = longClickCellInfo.cell; 3322e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen resetAddInfo(); 332331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 332431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 33253d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // The hotseat touch handling does not go through Workspace, and we always allow long press 33263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // on hotseat items. 3327e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler final boolean inHotseat = isHotseatLayout(v); 33288e2133b2c2bde86f913d817942bafdcf6818470bSunny Goyal if (!mDragController.isDragging()) { 33290280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (itemUnderLongClick == null) { 3330d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen // User long pressed on empty space 3331d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, 3332d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); 3333d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen if (mWorkspace.isInOverviewMode()) { 3334d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen mWorkspace.startReordering(v); 3335d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen } else { 3336dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showOverviewMode(true); 3337dedbd962dcfaf055a6835abf5b0000ce1564e51eAdam Cohen } 333831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 3339e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler final boolean isAllAppsButton = inHotseat && isAllAppsButtonRank( 3340e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler mHotseat.getOrderInHotseat( 3341e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler longClickCellInfo.cellX, 3342e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler longClickCellInfo.cellY)); 3343e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler if (!(itemUnderLongClick instanceof Folder || isAllAppsButton)) { 334431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // User long pressed on an item 33450280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka mWorkspace.startDrag(longClickCellInfo); 334631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 334731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 334831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 334931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return true; 335031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 335131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 33523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung boolean isHotseatLayout(View layout) { 33533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return mHotseat != null && layout != null && 33543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); 33551fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy } 33561fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy 33573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung /** 33583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung * Returns the CellLayout of the specified container at the specified screen. 33593d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung */ 33609282059e44604330763340e6c37ffb653b8ef187Sunny Goyal public CellLayout getCellLayout(long container, long screenId) { 33613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 33623d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mHotseat != null) { 33633d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return mHotseat.getLayout(); 33643d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 33653d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return null; 33669d31e9fa3dedf7c51b407c1c5fafe5294fc3c01bRomain Guy } 33673d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 3368b745afbdd75157c73d581b345118cdaff99e912dWinson Chung return mWorkspace.getScreenWithId(screenId); 3369a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy } 3370a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy } 3371a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy 3372b745afbdd75157c73d581b345118cdaff99e912dWinson Chung /** 3373b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * For overridden classes. 3374b745afbdd75157c73d581b345118cdaff99e912dWinson Chung */ 3375843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler public boolean isAllAppsVisible() { 3376b745afbdd75157c73d581b345118cdaff99e912dWinson Chung return isAppsViewVisible(); 3377b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 3378b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 3379b745afbdd75157c73d581b345118cdaff99e912dWinson Chung public boolean isAppsViewVisible() { 3380b745afbdd75157c73d581b345118cdaff99e912dWinson Chung return (mState == State.APPS) || (mOnResumeState == State.APPS); 3381b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 3382b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 3383b745afbdd75157c73d581b345118cdaff99e912dWinson Chung public boolean isWidgetsViewVisible() { 3384b745afbdd75157c73d581b345118cdaff99e912dWinson Chung return (mState == State.WIDGETS) || (mOnResumeState == State.WIDGETS); 3385fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato } 3386fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato 33874a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal private void setWorkspaceBackground(int background) { 33884a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal switch (background) { 33894a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal case WORKSPACE_BACKGROUND_TRANSPARENT: 33904a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 33914a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal break; 33924a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal case WORKSPACE_BACKGROUND_BLACK: 33934a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal getWindow().setBackgroundDrawable(null); 33944a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal break; 33954a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal default: 33964a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal getWindow().setBackgroundDrawable(mWorkspaceBackgroundDrawable); 33974a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal } 3398360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner } 3399360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 34003a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek protected void changeWallpaperVisiblity(boolean visible) { 3401bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0; 3402bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn int curflags = getWindow().getAttributes().flags 3403bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 3404bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn if (wpflags != curflags) { 3405bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn getWindow().setFlags(wpflags, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER); 3406bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn } 34074a6c6f31050a81068cff13fe0cc274f9be826d90Sunny Goyal setWorkspaceBackground(visible ? WORKSPACE_BACKGROUND_GRADIENT : WORKSPACE_BACKGROUND_BLACK); 3408bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn } 3409bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn 3410e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka @Override 3411e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka public void onTrimMemory(int level) { 3412e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka super.onTrimMemory(level); 34133f9c971e761222dc9fb4e5866f81c5f7a3348992Adam Cohen if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { 34143f9c971e761222dc9fb4e5866f81c5f7a3348992Adam Cohen // The widget preview db can result in holding onto over 34153f9c971e761222dc9fb4e5866f81c5f7a3348992Adam Cohen // 3MB of memory for caching which isn't necessary. 34163f9c971e761222dc9fb4e5866f81c5f7a3348992Adam Cohen SQLiteDatabase.releaseMemory(); 34173f9c971e761222dc9fb4e5866f81c5f7a3348992Adam Cohen 3418c8f4e1bc88401cad3cc5e439cd08450974d99d81Adam Cohen // This clears all widget bitmaps from the widget tray 34193f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // TODO(hyunyoungs) 3420e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka } 342167c3086163593db47e57b8cf4fcb034334374000Robert Kozikowski if (mLauncherCallbacks != null) { 342267c3086163593db47e57b8cf4fcb034334374000Robert Kozikowski mLauncherCallbacks.onTrimMemory(level); 342367c3086163593db47e57b8cf4fcb034334374000Robert Kozikowski } 3424e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka } 3425e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka 3426b745afbdd75157c73d581b345118cdaff99e912dWinson Chung @Override 3427b745afbdd75157c73d581b345118cdaff99e912dWinson Chung public void onStateTransitionHideSearchBar() { 3428b745afbdd75157c73d581b345118cdaff99e912dWinson Chung // Hide the search bar 3429b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mSearchDropTargetBar != null) { 3430b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mSearchDropTargetBar.hideSearchBar(false /* animated */); 3431b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 3432ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 3433ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 34345f4e0fdd2e4edeb9211e2dcd1c99497f175731f8Winson Chung public void showWorkspace(boolean animated) { 3435dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(WorkspaceStateTransitionAnimation.SCROLL_TO_CURRENT_PAGE, animated, null, 3436dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung true); 3437dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung } 3438dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung 343983a8f042adda926489494dff217c15ab696139b4Sunny Goyal public void showWorkspace(boolean animated, Runnable onCompleteRunnable) { 3440dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(WorkspaceStateTransitionAnimation.SCROLL_TO_CURRENT_PAGE, animated, 3441dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung onCompleteRunnable, true); 3442dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung } 3443dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung 3444dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung protected void showWorkspace(int snapToPage, boolean animated) { 3445dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung showWorkspace(snapToPage, animated, null, true); 3446ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen } 3447ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen 3448dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung void showWorkspace(int snapToPage, boolean animated, Runnable onCompleteRunnable, 3449dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung boolean notifyLauncherCallbacks) { 34500f785720667ab8afe4b4620a6c333d382d8659edWinson Chung boolean changed = mState != State.WORKSPACE || 34510f785720667ab8afe4b4620a6c333d382d8659edWinson Chung mWorkspace.getState() != Workspace.State.NORMAL; 34520f785720667ab8afe4b4620a6c333d382d8659edWinson Chung if (changed) { 34532d75f125f4e8bb5358dfdb63096d0493488ac2e5Winson Chung boolean wasInSpringLoadedMode = (mState != State.WORKSPACE); 3454b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mWorkspace.setVisibility(View.VISIBLE); 3455b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mStateTransitionAnimation.startAnimationToWorkspace(mState, Workspace.State.NORMAL, 3456dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung snapToPage, animated, onCompleteRunnable); 3457b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3458c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung // Show the search bar (only animate if we were showing the drop target bar in spring 3459c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung // loaded mode) 3460adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 346104c0a5c9110eff549cb1120341797ec986d9943aWinson Chung mSearchDropTargetBar.showSearchBar(animated && wasInSpringLoadedMode); 3462adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 3463c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung 3464b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Set focus to the AppsCustomize button 3465b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka if (mAllAppsButton != null) { 3466b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mAllAppsButton.requestFocus(); 3467b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3468c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 34696b879f0a5885274a85333531e091283405d490ccAdam Lesinski 3470c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka // Change the state *after* we've called all the transition code 3471c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka mState = State.WORKSPACE; 3472815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov 34735fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung // Resume the auto-advance of widgets 34745fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung mUserPresent = true; 3475b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 34765fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung 34770f785720667ab8afe4b4620a6c333d382d8659edWinson Chung if (changed) { 34780f785720667ab8afe4b4620a6c333d382d8659edWinson Chung // Send an accessibility event to announce the context change 34790f785720667ab8afe4b4620a6c333d382d8659edWinson Chung getWindow().getDecorView() 34800f785720667ab8afe4b4620a6c333d382d8659edWinson Chung .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 3481cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung if (notifyLauncherCallbacks) { 3482cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung // Dismiss all apps when the workspace is shown 348383f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (!Launcher.DISABLE_ALL_APPS_SEARCH_INTEGRATION && mLauncherCallbacks != null) { 3484cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung mLauncherCallbacks.onAllAppsHidden(); 3485cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 3486cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 34870f785720667ab8afe4b4620a6c333d382d8659edWinson Chung } 3488c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 3489c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 3490ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen void showOverviewMode(boolean animated) { 3491ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen mWorkspace.setVisibility(View.VISIBLE); 3492b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mStateTransitionAnimation.startAnimationToWorkspace(mState, Workspace.State.OVERVIEW, 3493dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung WorkspaceStateTransitionAnimation.SCROLL_TO_CURRENT_PAGE, animated, 3494dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung null /* onCompleteRunnable */); 3495ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen mState = State.WORKSPACE; 349600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 349700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 3498b745afbdd75157c73d581b345118cdaff99e912dWinson Chung /** 3499b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Shows the apps view. 3500b745afbdd75157c73d581b345118cdaff99e912dWinson Chung */ 35014ac30068732c7216288999d255a823adb7ca7c12Winson Chung void showAppsView(boolean animated, boolean resetListToTop, boolean updatePredictedApps) { 3502b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (resetListToTop) { 3503b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mAppsView.scrollToTop(); 3504b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 35054ac30068732c7216288999d255a823adb7ca7c12Winson Chung if (updatePredictedApps) { 35064ac30068732c7216288999d255a823adb7ca7c12Winson Chung tryAndUpdatePredictedApps(); 35074ac30068732c7216288999d255a823adb7ca7c12Winson Chung } 3508b745afbdd75157c73d581b345118cdaff99e912dWinson Chung showAppsOrWidgets(animated, State.APPS); 3509b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 3510b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3511b745afbdd75157c73d581b345118cdaff99e912dWinson Chung /** 3512b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Shows the widgets view. 3513b745afbdd75157c73d581b345118cdaff99e912dWinson Chung */ 3514b745afbdd75157c73d581b345118cdaff99e912dWinson Chung void showWidgetsView(boolean animated, boolean resetPageToZero) { 35152bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal if (LOGD) Log.d(TAG, "showWidgetsView:" + animated + " resetPageToZero:" + resetPageToZero); 351682963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung if (resetPageToZero) { 35173f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song mWidgetsView.scrollToTop(); 351882963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung } 3519b745afbdd75157c73d581b345118cdaff99e912dWinson Chung showAppsOrWidgets(animated, State.WIDGETS); 35203f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 35213f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song mWidgetsView.post(new Runnable() { 3522dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen @Override 3523dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen public void run() { 35243f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song mWidgetsView.requestFocus(); 3525dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen } 3526dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen }); 3527b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 3528b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 3529b745afbdd75157c73d581b345118cdaff99e912dWinson Chung /** 3530b745afbdd75157c73d581b345118cdaff99e912dWinson Chung * Sets up the transition to show the apps/widgets view. 3531b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song * 3532b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song * @return whether the current from and to state allowed this operation 3533b745afbdd75157c73d581b345118cdaff99e912dWinson Chung */ 3534b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song // TODO: calling method should use the return value so that when {@code false} is returned 3535b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song // the workspace transition doesn't fall into invalid state. 3536b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song private boolean showAppsOrWidgets(boolean animated, State toState) { 3537b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song if (mState != State.WORKSPACE && mState != State.APPS_SPRING_LOADED && 3538b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song mState != State.WIDGETS_SPRING_LOADED) { 3539b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song return false; 3540b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song } 3541b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song if (toState != State.APPS && toState != State.WIDGETS) { 3542b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song return false; 3543b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song } 3544b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 3545b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (toState == State.APPS) { 3546b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mStateTransitionAnimation.startAnimationToAllApps(animated); 354783f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (!Launcher.DISABLE_ALL_APPS_SEARCH_INTEGRATION && mLauncherCallbacks != null) { 35480f785720667ab8afe4b4620a6c333d382d8659edWinson Chung mLauncherCallbacks.onAllAppsShown(); 35490f785720667ab8afe4b4620a6c333d382d8659edWinson Chung } 3550b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } else { 3551b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mStateTransitionAnimation.startAnimationToWidgets(animated); 3552b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 3553b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3554b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Change the state *after* we've called all the transition code 3555b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mState = toState; 3556b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3557b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Pause the auto-advance of widgets until we are out of AllApps 3558b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mUserPresent = false; 3559b745afbdd75157c73d581b345118cdaff99e912dWinson Chung updateAutoAdvanceState(); 3560b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka closeFolder(); 3561b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3562b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Send an accessibility event to announce the context change 35631d4fde686433ddfa7f940e298d935433ecfed8ebalanv getWindow().getDecorView() 35641d4fde686433ddfa7f940e298d935433ecfed8ebalanv .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 3565b790083b8f757e6d73b92460e6447acbf5490654Hyunyoung Song return true; 3566b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3567b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3568cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung /** 3569cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung * Updates the workspace and interaction state on state change, and return the animation to this 3570cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung * new state. 3571cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung */ 3572cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung public Animator startWorkspaceStateChangeAnimation(Workspace.State toState, int toPage, 3573cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung boolean animated, HashMap<View, Integer> layerViews) { 3574cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung Workspace.State fromState = mWorkspace.getState(); 3575cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung Animator anim = mWorkspace.setStateWithAnimation(toState, toPage, animated, layerViews); 3576cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung updateInteraction(fromState, toState); 3577cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung return anim; 3578cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 3579cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung 35803f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public void enterSpringLoadedDragMode() { 35812bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal if (LOGD) Log.d(TAG, String.format("enterSpringLoadedDragMode [mState=%s", mState.name())); 3582b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mState == State.WORKSPACE || mState == State.APPS_SPRING_LOADED || 3583b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mState == State.WIDGETS_SPRING_LOADED) { 3584b745afbdd75157c73d581b345118cdaff99e912dWinson Chung return; 3585b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung } 3586b745afbdd75157c73d581b345118cdaff99e912dWinson Chung 3587b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mStateTransitionAnimation.startAnimationToWorkspace(mState, Workspace.State.SPRING_LOADED, 3588dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung WorkspaceStateTransitionAnimation.SCROLL_TO_CURRENT_PAGE, true /* animated */, 3589dc61c4d41468a8beced2863de1b863b340cf49baWinson Chung null /* onCompleteRunnable */); 3590b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mState = isAppsViewVisible() ? State.APPS_SPRING_LOADED : State.WIDGETS_SPRING_LOADED; 3591d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } 35927777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen 35933f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, int delay, 3594ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen final Runnable onCompleteRunnable) { 3595b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mState != State.APPS_SPRING_LOADED && mState != State.WIDGETS_SPRING_LOADED) return; 359609bfc45ae8aee2db579698c15007b1d138b4141fWinson Chung 3597cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung if (successfulDrop) { 3598cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung // We need to trigger all apps hidden to notify search to update itself before the 3599cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung // delayed call to showWorkspace below 360083f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (!Launcher.DISABLE_ALL_APPS_SEARCH_INTEGRATION && mLauncherCallbacks != null) { 3601cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung mLauncherCallbacks.onAllAppsHidden(); 3602cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 3603cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung } 3604cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung 3605e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung mHandler.postDelayed(new Runnable() { 3606557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung @Override 3607557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung public void run() { 36086a3fd3f042c8bfa7d83e29c1eeadff21323ab089Winson Chung if (successfulDrop) { 36093f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // TODO(hyunyoungs): verify if this hack is still needed, if not, delete. 36103f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // 36117bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka // Before we show workspace, hide all apps again because 36127bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka // exitSpringLoadedDragMode made it visible. This is a bit hacky; we should 36137bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka // clean up our state transition functions 36143f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song mWidgetsView.setVisibility(View.GONE); 3615ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen showWorkspace(true, onCompleteRunnable); 36167777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen } else { 36177777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen exitSpringLoadedDragMode(); 36186a3fd3f042c8bfa7d83e29c1eeadff21323ab089Winson Chung } 3619557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 3620ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }, delay); 3621557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 3622b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3623d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka void exitSpringLoadedDragMode() { 3624b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mState == State.APPS_SPRING_LOADED) { 36254ac30068732c7216288999d255a823adb7ca7c12Winson Chung showAppsView(true /* animated */, false /* resetListToTop */, 36264ac30068732c7216288999d255a823adb7ca7c12Winson Chung false /* updatePredictedApps */); 3627b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } else if (mState == State.WIDGETS_SPRING_LOADED) { 3628cd99cd3ed6a84b9dcd8f4c60b0941760f85a64ceWinson Chung showWidgetsView(true, false); 3629f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3630f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3631f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 36324ac30068732c7216288999d255a823adb7ca7c12Winson Chung /** 36334ac30068732c7216288999d255a823adb7ca7c12Winson Chung * Updates the set of predicted apps if it hasn't been updated since the last time Launcher was 36344ac30068732c7216288999d255a823adb7ca7c12Winson Chung * resumed. 36354ac30068732c7216288999d255a823adb7ca7c12Winson Chung */ 36364ac30068732c7216288999d255a823adb7ca7c12Winson Chung private void tryAndUpdatePredictedApps() { 36374ac30068732c7216288999d255a823adb7ca7c12Winson Chung if (mLauncherCallbacks != null) { 36384ac30068732c7216288999d255a823adb7ca7c12Winson Chung List<ComponentName> apps = mLauncherCallbacks.getPredictedApps(); 36394ac30068732c7216288999d255a823adb7ca7c12Winson Chung if (!apps.isEmpty()) { 36404ac30068732c7216288999d255a823adb7ca7c12Winson Chung mAppsView.setPredictedApps(apps); 36414ac30068732c7216288999d255a823adb7ca7c12Winson Chung } 36424ac30068732c7216288999d255a823adb7ca7c12Winson Chung } 36434ac30068732c7216288999d255a823adb7ca7c12Winson Chung } 36444ac30068732c7216288999d255a823adb7ca7c12Winson Chung 3645b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka void lockAllApps() { 3646b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // TODO 3647b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3648b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3649b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka void unlockAllApps() { 3650b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // TODO 3651b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3652b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3653594d76dc66cb5666830b62594909fed187987d42Sunny Goyal protected void disableVoiceButtonProxy(boolean disable) { 3654594d76dc66cb5666830b62594909fed187987d42Sunny Goyal // NO-OP 3655bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung } 3656bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung 365764b3fcc9f7bd951530bf9b78339882d7b104b50eSunny Goyal public View getOrCreateQsbBar() { 3658c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) { 3659c2d6e897dbcb96b7b629e42002966368fbda2f95Adam Cohen return mLauncherCallbacks.getQsbBar(); 36609211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 36619211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 366224ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen if (mQsb == null) { 3663594d76dc66cb5666830b62594909fed187987d42Sunny Goyal AppWidgetProviderInfo searchProvider = Utilities.getSearchWidgetProvider(this); 3664594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (searchProvider == null) { 3665594d76dc66cb5666830b62594909fed187987d42Sunny Goyal return null; 3666ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 3667ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka 3668594d76dc66cb5666830b62594909fed187987d42Sunny Goyal Bundle opts = new Bundle(); 3669594d76dc66cb5666830b62594909fed187987d42Sunny Goyal opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, 3670eb8e282a77279c7657f49a7391c41270d4997379Adam Cohen AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX); 3671594d76dc66cb5666830b62594909fed187987d42Sunny Goyal 3672594d76dc66cb5666830b62594909fed187987d42Sunny Goyal SharedPreferences sp = getSharedPreferences( 3673594d76dc66cb5666830b62594909fed187987d42Sunny Goyal LauncherAppState.getSharedPreferencesKey(), MODE_PRIVATE); 3674594d76dc66cb5666830b62594909fed187987d42Sunny Goyal int widgetId = sp.getInt(QSB_WIDGET_ID, -1); 3675416541cc0e03ccd919d5669f0d06ef42a3b7ff21Sunny Goyal AppWidgetProviderInfo widgetInfo = mAppWidgetManager.getAppWidgetInfo(widgetId); 3676594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (!searchProvider.provider.flattenToString().equals( 3677594d76dc66cb5666830b62594909fed187987d42Sunny Goyal sp.getString(QSB_WIDGET_PROVIDER, null)) 3678416541cc0e03ccd919d5669f0d06ef42a3b7ff21Sunny Goyal || (widgetInfo == null) 3679416541cc0e03ccd919d5669f0d06ef42a3b7ff21Sunny Goyal || !widgetInfo.provider.equals(searchProvider.provider)) { 3680594d76dc66cb5666830b62594909fed187987d42Sunny Goyal // A valid widget is not already bound. 3681594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (widgetId > -1) { 3682594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mAppWidgetHost.deleteAppWidgetId(widgetId); 3683594d76dc66cb5666830b62594909fed187987d42Sunny Goyal widgetId = -1; 3684594d76dc66cb5666830b62594909fed187987d42Sunny Goyal } 36854ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 3686594d76dc66cb5666830b62594909fed187987d42Sunny Goyal // Try to bind a new widget 3687594d76dc66cb5666830b62594909fed187987d42Sunny Goyal widgetId = mAppWidgetHost.allocateAppWidgetId(); 36881cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung 3689594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (!AppWidgetManagerCompat.getInstance(this) 3690594d76dc66cb5666830b62594909fed187987d42Sunny Goyal .bindAppWidgetIdIfAllowed(widgetId, searchProvider, opts)) { 3691594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mAppWidgetHost.deleteAppWidgetId(widgetId); 3692594d76dc66cb5666830b62594909fed187987d42Sunny Goyal widgetId = -1; 3693594d76dc66cb5666830b62594909fed187987d42Sunny Goyal } 3694ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka 3695594d76dc66cb5666830b62594909fed187987d42Sunny Goyal sp.edit() 3696594d76dc66cb5666830b62594909fed187987d42Sunny Goyal .putInt(QSB_WIDGET_ID, widgetId) 3697594d76dc66cb5666830b62594909fed187987d42Sunny Goyal .putString(QSB_WIDGET_PROVIDER, searchProvider.provider.flattenToString()) 3698594d76dc66cb5666830b62594909fed187987d42Sunny Goyal .commit(); 3699ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 37004ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 3701594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (widgetId != -1) { 3702594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mQsb = mAppWidgetHost.createView(this, widgetId, searchProvider); 3703594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mQsb.updateAppWidgetOptions(opts); 3704594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mQsb.setPadding(0, 0, 0, 0); 3705594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mSearchDropTargetBar.addView(mQsb); 370664b3fcc9f7bd951530bf9b78339882d7b104b50eSunny Goyal mSearchDropTargetBar.setQsbSearchBar(mQsb); 3707594d76dc66cb5666830b62594909fed187987d42Sunny Goyal } 3708ecf33e4819d0c4b019706edd456ed14a6a0f200cBjorn Bringert } 3709594d76dc66cb5666830b62594909fed187987d42Sunny Goyal return mQsb; 37105841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung } 37114ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 371222235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal private void reinflateQSBIfNecessary() { 371322235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal if (mQsb instanceof LauncherAppWidgetHostView && 371422235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal ((LauncherAppWidgetHostView) mQsb).isReinflateRequired()) { 371522235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal mSearchDropTargetBar.removeView(mQsb); 371622235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal mQsb = null; 371722235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal mSearchDropTargetBar.setQsbSearchBar(getOrCreateQsbBar()); 371822235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal } 371922235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal } 372022235bcb40071af464fc9accf0fbf082056182f7Sunny Goyal 3721d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka @Override 3722d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 37231d4fde686433ddfa7f940e298d935433ecfed8ebalanv final boolean result = super.dispatchPopulateAccessibilityEvent(event); 3724d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka final List<CharSequence> text = event.getText(); 3725d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka text.clear(); 37261d4fde686433ddfa7f940e298d935433ecfed8ebalanv // Populate event with a fake title based on the current state. 3727b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mState == State.APPS) { 3728c525d80dcd06b70910de0ea9ef063a032c0c8fadSunny Goyal text.add(getString(R.string.all_apps_button_label)); 3729b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } else if (mState == State.WIDGETS) { 3730c525d80dcd06b70910de0ea9ef063a032c0c8fadSunny Goyal text.add(getString(R.string.widget_button_text)); 37311d4fde686433ddfa7f940e298d935433ecfed8ebalanv } else { 37321d4fde686433ddfa7f940e298d935433ecfed8ebalanv text.add(getString(R.string.all_apps_home_button_label)); 37331d4fde686433ddfa7f940e298d935433ecfed8ebalanv } 3734d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka return result; 3735d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka } 3736d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka 3737ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy /** 3738b8472bb83cd96456a543137e1e56d589171934c3Winson Chung * Receives notifications when system dialogs are to be closed. 37392ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato */ 3740091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk class CloseSystemDialogsIntentReceiver extends BroadcastReceiver { 37412ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato @Override 37422ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato public void onReceive(Context context, Intent intent) { 37432ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato closeSystemDialogs(); 37442ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 37452ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 37462ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 37472ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato /** 37481e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey * Receives notifications whenever the appwidgets are reset. 37491e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey */ 37501e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private class AppWidgetResetObserver extends ContentObserver { 37511e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey public AppWidgetResetObserver() { 37521e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey super(new Handler()); 37531e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 37541e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 37551e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey @Override 37561e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey public void onChange(boolean selfChange) { 37571e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey onAppWidgetReset(); 37581e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 37591e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 37601e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 37611e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey /** 37627607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * If the activity is currently paused, signal that we need to run the passed Runnable 37637607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * in onResume. 37647607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * 37657607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * This needs to be called from incoming places where resources might have been loaded 37668821ca9a6a5bf34308f9b70c2cabf9da17330497Hyunyoung Song * while the activity is paused. That is because the Configuration (e.g., rotation) might be 37678821ca9a6a5bf34308f9b70c2cabf9da17330497Hyunyoung Song * wrong when we're not running, and if the activity comes back to what the configuration was 37688821ca9a6a5bf34308f9b70c2cabf9da17330497Hyunyoung Song * when we were paused, activity is not restarted. 37697607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * 37707607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * Implementation of the method from LauncherModel.Callbacks. 37717607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * 37728821ca9a6a5bf34308f9b70c2cabf9da17330497Hyunyoung Song * @return {@code true} if we are currently paused. The caller might be able to skip some work 37737607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka */ 3774c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private boolean waitUntilResume(Runnable run, boolean deletePreviousRunnables) { 37757607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka if (mPaused) { 37762bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal if (LOGD) Log.d(TAG, "Deferring update until onResume"); 3777c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (deletePreviousRunnables) { 37781e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka while (mBindOnResumeCallbacks.remove(run)) { 3779c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 3780c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 37811e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.add(run); 37827607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return true; 37837607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } else { 37847607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return false; 37857607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 37867607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 37877607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka 3788c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private boolean waitUntilResume(Runnable run) { 3789c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka return waitUntilResume(run, false); 3790c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 3791c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka 37921e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka public void addOnResumeCallback(Runnable run) { 37935455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka mOnResumeCallbacks.add(run); 37941e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka } 37951e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka 37967607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka /** 3797ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * If the activity is currently paused, signal that we need to re-run the loader 3798ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * in onResume. 3799ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * 3800ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * This needs to be called from incoming places where resources might have been loaded 3801ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * while we are paused. That is becaues the Configuration might be wrong 3802ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * when we're not running, and if it comes back to what it was when we 3803ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * were paused, we are not restarted. 3804ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * 3805ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 3806ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * 3807ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * @return true if we are currently paused. The caller might be able to 3808ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * skip some work in that case since we will come back again. 3809ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato */ 3810ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato public boolean setLoadOnResume() { 3811ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (mPaused) { 38122bba4c37c6402dfdc965d0c412c840c57993c7ddSunny Goyal if (LOGD) Log.d(TAG, "setLoadOnResume"); 3813ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mOnResumeNeedsLoad = true; 3814ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return true; 3815ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } else { 3816ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return false; 3817ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 3818ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 3819ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 3820ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato /** 38219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 382231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 38239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public int getCurrentWorkspaceScreen() { 3824d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato if (mWorkspace != null) { 38250142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka return mWorkspace.getCurrentPage(); 3826d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato } else { 3827d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato return SCREEN_COUNT / 2; 3828d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato } 38299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 3830f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 38319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 38329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Refreshes the shortcuts shown on the workspace. 38339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 38349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 38359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 38369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void startBinding() { 3837ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWorkspaceLoading(true); 3838517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen 38397607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka // If we're starting binding all over again, clear any bind calls we'd postponed in 38407607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka // the past (see waitUntilResume) -- we don't need them since we're starting binding 38417607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka // from scratch again 38421e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.clear(); 3843df0353815c629fc678824b07a234b89a1ff94208Adam Cohen 3844d64d1763c590b1c954b759156683abf39ff22945Winson Chung // Clear the workspace because it's going to be rebound 3845df0353815c629fc678824b07a234b89a1ff94208Adam Cohen mWorkspace.clearDropTargets(); 38469e6a0a20d40675ef98c7fdb8892cf34b90152f7aWinson Chung mWorkspace.removeAllWorkspaceScreens(); 3847d64d1763c590b1c954b759156683abf39ff22945Winson Chung 384805bf644e371c9d965ba864cf7dda6515c7cdce91Michael Jurka mWidgetsToAdvance.clear(); 38493d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mHotseat != null) { 38503d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat.resetLayout(); 385131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 385231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 385331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3854dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen @Override 3855dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen public void bindScreens(ArrayList<Long> orderedScreenIds) { 385664359a53dc827797917a8d9a0697a91996789801Winson Chung bindAddScreens(orderedScreenIds); 38570e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung 38585084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen // If there are no screens, we need to have an empty screen 38595084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen if (orderedScreenIds.size() == 0) { 38605084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen mWorkspace.addExtraEmptyScreen(); 38615084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen } 38620e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung 38630e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung // Create the custom content page (this call updates mDefaultScreen which calls 3864a888158880fea53479447d883391f552604e46b6Dave Hawkey // setCurrentPage() so ensure that all pages are added before calling this). 3865dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro if (hasCustomContentToLeft()) { 3866dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro mWorkspace.createCustomContentContainer(); 3867dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro populateCustomContentContainer(); 38680e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung } 386964359a53dc827797917a8d9a0697a91996789801Winson Chung } 387064359a53dc827797917a8d9a0697a91996789801Winson Chung 387164359a53dc827797917a8d9a0697a91996789801Winson Chung @Override 387264359a53dc827797917a8d9a0697a91996789801Winson Chung public void bindAddScreens(ArrayList<Long> orderedScreenIds) { 3873a90303bb6fdad59e4a55855edba68c9902192599Winson Chung // Log to disk 3874a90303bb6fdad59e4a55855edba68c9902192599Winson Chung Launcher.addDumpLog(TAG, "11683562 - bindAddScreens()", true); 3875a90303bb6fdad59e4a55855edba68c9902192599Winson Chung Launcher.addDumpLog(TAG, "11683562 - orderedScreenIds: " + 3876a90303bb6fdad59e4a55855edba68c9902192599Winson Chung TextUtils.join(", ", orderedScreenIds), true); 3877dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen int count = orderedScreenIds.size(); 3878dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen for (int i = 0; i < count; i++) { 387989bddfaa6d1dbd1534c5f5c5f3163c10f627209eAdam Cohen mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i)); 3880dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen } 3881dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen } 3882dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen 388339a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen private boolean shouldShowWeightWatcher() { 388439a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen String spKey = LauncherAppState.getSharedPreferencesKey(); 388539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE); 38866053b8007ed22fba6a62a9238aad6d0a42229faeDaniel Sandler boolean show = sp.getBoolean(SHOW_WEIGHT_WATCHER, SHOW_WEIGHT_WATCHER_DEFAULT); 388739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 388839a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen return show; 388939a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen } 389039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 389139a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen private void toggleShowWeightWatcher() { 389239a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen String spKey = LauncherAppState.getSharedPreferencesKey(); 389339a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE); 389439a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen boolean show = sp.getBoolean(SHOW_WEIGHT_WATCHER, true); 389539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 389639a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen show = !show; 389739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 389839a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen SharedPreferences.Editor editor = sp.edit(); 389939a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen editor.putBoolean(SHOW_WEIGHT_WATCHER, show); 390039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen editor.commit(); 390139a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 390239a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen if (mWeightWatcher != null) { 390339a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher.setVisibility(show ? View.VISIBLE : View.GONE); 390439a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen } 390539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen } 390639a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 3907d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void bindAppsAdded(final ArrayList<Long> newScreens, 3908d64d1763c590b1c954b759156683abf39ff22945Winson Chung final ArrayList<ItemInfo> addNotAnimated, 3909c58497ee619416c4949b16eb43486c11618b69e5Winson Chung final ArrayList<ItemInfo> addAnimated, 3910c58497ee619416c4949b16eb43486c11618b69e5Winson Chung final ArrayList<AppInfo> addedApps) { 3911d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 3912d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 3913c58497ee619416c4949b16eb43486c11618b69e5Winson Chung bindAppsAdded(newScreens, addNotAnimated, addAnimated, addedApps); 3914d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 3915d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 3916d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 3917d64d1763c590b1c954b759156683abf39ff22945Winson Chung return; 3918d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 3919d64d1763c590b1c954b759156683abf39ff22945Winson Chung 3920d64d1763c590b1c954b759156683abf39ff22945Winson Chung // Add the new screens 392176a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen if (newScreens != null) { 392276a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen bindAddScreens(newScreens); 392376a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen } 3924d64d1763c590b1c954b759156683abf39ff22945Winson Chung 3925d64d1763c590b1c954b759156683abf39ff22945Winson Chung // We add the items without animation on non-visible pages, and with 3926d64d1763c590b1c954b759156683abf39ff22945Winson Chung // animations on the new page (which we will try and snap to). 392776a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen if (addNotAnimated != null && !addNotAnimated.isEmpty()) { 3928d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindItems(addNotAnimated, 0, 3929d64d1763c590b1c954b759156683abf39ff22945Winson Chung addNotAnimated.size(), false); 3930d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 393176a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen if (addAnimated != null && !addAnimated.isEmpty()) { 3932d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindItems(addAnimated, 0, 3933d64d1763c590b1c954b759156683abf39ff22945Winson Chung addAnimated.size(), true); 3934d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 3935c58497ee619416c4949b16eb43486c11618b69e5Winson Chung 39368741298d3c6a17015dabc4aacc261fd8eb59992dWinson Chung // Remove the extra empty screen 3937689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreen(false, false); 39388741298d3c6a17015dabc4aacc261fd8eb59992dWinson Chung 3939b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (addedApps != null && mAppsView != null) { 3940b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mAppsView.addApps(addedApps); 3941c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 3942d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 3943d64d1763c590b1c954b759156683abf39ff22945Winson Chung 394431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 39459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Bind the items start-end from the list. 39469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 39479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 394831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 394964359a53dc827797917a8d9a0697a91996789801Winson Chung public void bindItems(final ArrayList<ItemInfo> shortcuts, final int start, final int end, 395064359a53dc827797917a8d9a0697a91996789801Winson Chung final boolean forceAnimateIcons) { 3951d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 3952d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 3953d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindItems(shortcuts, start, end, forceAnimateIcons); 3954d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 3955d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 3956d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 39577607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 39587607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 3959ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 3960f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung // Get the list of added shortcuts and intersect them with the set of shortcuts here 396164359a53dc827797917a8d9a0697a91996789801Winson Chung final AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); 396264359a53dc827797917a8d9a0697a91996789801Winson Chung final Collection<Animator> bounceAnims = new ArrayList<Animator>(); 3963997a92348a6d6e061737399321393449c16cd4d8Winson Chung final boolean animateIcons = forceAnimateIcons && canRunNewAppsAnimation(); 3964f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung Workspace workspace = mWorkspace; 3965997a92348a6d6e061737399321393449c16cd4d8Winson Chung long newShortcutsScreenId = -1; 3966f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung for (int i = start; i < end; i++) { 39679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ItemInfo item = shortcuts.get(i); 39684d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung 39694d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung // Short circuit if we are loading dock items for a configuration which has no dock 39704d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT && 39714d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung mHotseat == null) { 39724d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung continue; 39734d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung } 39744d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung 39759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato switch (item.itemType) { 39769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 39779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 3978f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung ShortcutInfo info = (ShortcutInfo) item; 3979f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung View shortcut = createShortcut(info); 3980dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen 398164359a53dc827797917a8d9a0697a91996789801Winson Chung /* 398264359a53dc827797917a8d9a0697a91996789801Winson Chung * TODO: FIX collision case 398364359a53dc827797917a8d9a0697a91996789801Winson Chung */ 3984ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { 3985ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung CellLayout cl = mWorkspace.getScreenWithId(item.screenId); 3986ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung if (cl != null && cl.isOccupied(item.cellX, item.cellY)) { 39878f006edba228622422088a358aafee069e1d9cfbAdam Cohen View v = cl.getChildAt(item.cellX, item.cellY); 39888f006edba228622422088a358aafee069e1d9cfbAdam Cohen Object tag = v.getTag(); 39898f006edba228622422088a358aafee069e1d9cfbAdam Cohen String desc = "Collision while binding workspace item: " + item 39908f006edba228622422088a358aafee069e1d9cfbAdam Cohen + ". Collides with " + tag; 39918f006edba228622422088a358aafee069e1d9cfbAdam Cohen if (LauncherAppState.isDogfoodBuild()) { 39928f006edba228622422088a358aafee069e1d9cfbAdam Cohen throw (new RuntimeException(desc)); 39938f006edba228622422088a358aafee069e1d9cfbAdam Cohen } else { 39948f006edba228622422088a358aafee069e1d9cfbAdam Cohen Log.d(TAG, desc); 39958f006edba228622422088a358aafee069e1d9cfbAdam Cohen } 3996ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung } 399764359a53dc827797917a8d9a0697a91996789801Winson Chung } 399864359a53dc827797917a8d9a0697a91996789801Winson Chung 3999dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen workspace.addInScreenFromBind(shortcut, item.container, item.screenId, item.cellX, 4000dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen item.cellY, 1, 1); 4001997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (animateIcons) { 400264359a53dc827797917a8d9a0697a91996789801Winson Chung // Animate all the applications up now 400364359a53dc827797917a8d9a0697a91996789801Winson Chung shortcut.setAlpha(0f); 400464359a53dc827797917a8d9a0697a91996789801Winson Chung shortcut.setScaleX(0f); 400564359a53dc827797917a8d9a0697a91996789801Winson Chung shortcut.setScaleY(0f); 400664359a53dc827797917a8d9a0697a91996789801Winson Chung bounceAnims.add(createNewAppBounceAnimation(shortcut, i)); 4007997a92348a6d6e061737399321393449c16cd4d8Winson Chung newShortcutsScreenId = item.screenId; 4008f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung } 40099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 4010df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: 40113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, 40120142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka (ViewGroup) workspace.getChildAt(workspace.getCurrentPage()), 4013df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen (FolderInfo) item, mIconCache); 4014dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen workspace.addInScreenFromBind(newFolder, item.container, item.screenId, item.cellX, 4015dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen item.cellY, 1, 1); 40169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 4017c763c4e4d28c256d1368be3fc1c4526c8b9bd232Winson Chung default: 4018c763c4e4d28c256d1368be3fc1c4526c8b9bd232Winson Chung throw new RuntimeException("Invalid Item Type"); 40199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 402031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4021f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung 4022997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (animateIcons) { 4023997a92348a6d6e061737399321393449c16cd4d8Winson Chung // Animate to the correct page 4024997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (newShortcutsScreenId > -1) { 4025997a92348a6d6e061737399321393449c16cd4d8Winson Chung long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage()); 402694d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newShortcutsScreenId); 4027b232383fd5b0e8cb36990307d7392499729afa23Winson Chung final Runnable startBounceAnimRunnable = new Runnable() { 4028b232383fd5b0e8cb36990307d7392499729afa23Winson Chung public void run() { 4029b232383fd5b0e8cb36990307d7392499729afa23Winson Chung anim.playTogether(bounceAnims); 4030b232383fd5b0e8cb36990307d7392499729afa23Winson Chung anim.start(); 4031b232383fd5b0e8cb36990307d7392499729afa23Winson Chung } 4032b232383fd5b0e8cb36990307d7392499729afa23Winson Chung }; 4033997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (newShortcutsScreenId != currentScreenId) { 403494d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung // We post the animation slightly delayed to prevent slowdowns 403594d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung // when we are loading right after we return to launcher. 403694d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung mWorkspace.postDelayed(new Runnable() { 403794d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung public void run() { 4038944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson if (mWorkspace != null) { 4039944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson mWorkspace.snapToPage(newScreenIndex); 4040944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson mWorkspace.postDelayed(startBounceAnimRunnable, 4041944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson NEW_APPS_ANIMATION_DELAY); 4042944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson } 404394d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung } 404494d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung }, NEW_APPS_PAGE_MOVE_DELAY); 4045b232383fd5b0e8cb36990307d7392499729afa23Winson Chung } else { 4046b232383fd5b0e8cb36990307d7392499729afa23Winson Chung mWorkspace.postDelayed(startBounceAnimRunnable, NEW_APPS_ANIMATION_DELAY); 4047997a92348a6d6e061737399321393449c16cd4d8Winson Chung } 4048997a92348a6d6e061737399321393449c16cd4d8Winson Chung } 404964359a53dc827797917a8d9a0697a91996789801Winson Chung } 40509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato workspace.requestLayout(); 40519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 40529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 40539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 40549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 40559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 4056e2df0620c13b9dc7e63224153b98fdbb48546f9bSunny Goyal public void bindFolders(final LongArrayMap<FolderInfo> folders) { 4057d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4058d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4059d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindFolders(folders); 4060d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4061d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4062d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 40637607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 40647607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 4065e2df0620c13b9dc7e63224153b98fdbb48546f9bSunny Goyal sFolders = folders.clone(); 406631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 406731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 40689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 40699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Add the views for a widget to the workspace. 40709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 40719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 40729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 40737607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka public void bindAppWidget(final LauncherAppWidgetInfo item) { 4074d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4075d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4076d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindAppWidget(item); 4077d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4078d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4079d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 40807607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 40817607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 4082ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 4083843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler final long start = DEBUG_WIDGETS ? SystemClock.uptimeMillis() : 0; 4084843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_WIDGETS) { 4085843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler Log.d(TAG, "bindAppWidget: " + item); 4086843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 40879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final Workspace workspace = mWorkspace; 4088cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 40895940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen LauncherAppWidgetProviderInfo appWidgetInfo = 409026ace12135a662ad864678c9fede9817e5c02b67Robin Lee LauncherModel.getProviderInfo(this, item.providerName, item.user); 40915940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen 40929b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal if (!mIsSafeModeEnabled 40939b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal && ((item.restoreStatus & LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) == 0) 40949b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal && ((item.restoreStatus & LauncherAppWidgetInfo.FLAG_ID_NOT_VALID) != 0)) { 4095ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (appWidgetInfo == null) { 4096ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (DEBUG_WIDGETS) { 4097ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal Log.d(TAG, "Removing restored widget: id=" + item.appWidgetId 4098ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal + " belongs to component " + item.providerName 4099ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal + ", as the povider is null"); 4100ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4101ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal LauncherModel.deleteItemFromDatabase(this, item); 4102ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal return; 4103ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4104ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // Note: This assumes that the id remap broadcast is received before this step. 4105ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // If that is not the case, the id remap will be ignored and user may see the 4106ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // click to setup view. 41072e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen PendingAddWidgetInfo pendingInfo = new PendingAddWidgetInfo(this, appWidgetInfo, null); 4108ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal pendingInfo.spanX = item.spanX; 4109ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal pendingInfo.spanY = item.spanY; 4110ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal pendingInfo.minSpanX = item.minSpanX; 4111ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal pendingInfo.minSpanY = item.minSpanY; 41123f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song Bundle options = null; 4113b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song WidgetHostViewLoader.getDefaultOptionsForWidget(this, pendingInfo); 4114ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 4115ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal int newWidgetId = mAppWidgetHost.allocateAppWidgetId(); 4116ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal boolean success = mAppWidgetManager.bindAppWidgetIdIfAllowed( 4117ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal newWidgetId, appWidgetInfo, options); 4118ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 4119ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // TODO consider showing a permission dialog when the widget is clicked. 4120ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (!success) { 4121ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal mAppWidgetHost.deleteAppWidgetId(newWidgetId); 4122ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if (DEBUG_WIDGETS) { 4123ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal Log.d(TAG, "Removing restored widget: id=" + item.appWidgetId 4124ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal + " belongs to component " + item.providerName 4125ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal + ", as the launcher is unable to bing a new widget id"); 4126ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4127ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal LauncherModel.deleteItemFromDatabase(this, item); 4128ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal return; 4129ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4130ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 4131ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal item.appWidgetId = newWidgetId; 4132ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 4133ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // If the widget has a configure activity, it is still needs to set it up, otherwise 4134ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal // the widget is ready to go. 4135ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal item.restoreStatus = (appWidgetInfo.configure == null) 4136ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal ? LauncherAppWidgetInfo.RESTORE_COMPLETED 4137ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal : LauncherAppWidgetInfo.FLAG_UI_NOT_READY; 4138ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 4139ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal LauncherModel.updateItemInDatabase(this, item); 4140ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4141ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 41429b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal if (!mIsSafeModeEnabled && item.restoreStatus == LauncherAppWidgetInfo.RESTORE_COMPLETED) { 4143651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal final int appWidgetId = item.appWidgetId; 4144651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal if (DEBUG_WIDGETS) { 41455940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen Log.d(TAG, "bindAppWidget: id=" + item.appWidgetId + " belongs to component " 41465940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen + appWidgetInfo.provider); 4147651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal } 4148843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 4149651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); 4150651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal } else { 4151651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal appWidgetInfo = null; 41529b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal PendingAppWidgetHostView view = new PendingAppWidgetHostView(this, item, 41539b4b0812fec41c40d81d507cfdb528ba87663f5fSunny Goyal mIsSafeModeEnabled); 41540fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal view.updateIcon(mIconCache); 41550fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal item.hostView = view; 4156651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal item.hostView.updateAppWidget(null); 4157ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal item.hostView.setOnClickListener(this); 4158651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal } 415931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 41609c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.hostView.setTag(item); 4161211bac3cd89b26bda4ff52df984731d11156dc38Winson Chung item.onBindAppWidget(this); 416231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4163dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen workspace.addInScreen(item.hostView, item.container, item.screenId, item.cellX, 41649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.cellY, item.spanX, item.spanY, false); 41655940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen if (!item.isCustomWidget()) { 41665940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen addWidgetToAutoAdvanceIfNeeded(item.hostView, appWidgetInfo); 41675940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen } 4168ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 41699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato workspace.requestLayout(); 4170cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 4171843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_WIDGETS) { 4172843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler Log.d(TAG, "bound widget id="+item.appWidgetId+" in " 4173843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler + (SystemClock.uptimeMillis()-start) + "ms"); 4174843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 41759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 4176cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 4177ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal /** 4178ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal * Restores a pending widget. 4179ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal * 4180ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal * @param appWidgetId The app widget id 4181ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal * @param cellInfo The position on screen where to create the widget. 4182ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal */ 4183ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal private void completeRestoreAppWidget(final int appWidgetId) { 4184ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal LauncherAppWidgetHostView view = mWorkspace.getWidgetForAppWidgetId(appWidgetId); 4185ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal if ((view == null) || !(view instanceof PendingAppWidgetHostView)) { 4186ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal Log.e(TAG, "Widget update called, when the widget no longer exists."); 4187ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal return; 4188ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4189ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 41900fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) view.getTag(); 4191ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal info.restoreStatus = LauncherAppWidgetInfo.RESTORE_COMPLETED; 4192ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 4193ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal mWorkspace.reinflateWidgetsIfNecessary(); 4194ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal LauncherModel.updateItemInDatabase(this, info); 4195ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal } 4196ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal 41971462de39f01cec0ba785386532719cb0207dd827Adam Cohen public void onPageBoundSynchronously(int page) { 41981462de39f01cec0ba785386532719cb0207dd827Adam Cohen mSynchronouslyBoundPages.add(page); 41991462de39f01cec0ba785386532719cb0207dd827Adam Cohen } 42001462de39f01cec0ba785386532719cb0207dd827Adam Cohen 42019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 42029c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Callback saying that there aren't any more items to bind. 42039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 42049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 42059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 420666cfdc2549b973496f2d5555defc22b7a15b5620Sunny Goyal public void finishBindingItems() { 4207d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4208d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 420966cfdc2549b973496f2d5555defc22b7a15b5620Sunny Goyal finishBindingItems(); 4210d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4211d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4212d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 42137607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 42147607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 42159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mSavedState != null) { 42169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (!mWorkspace.hasFocus()) { 42170142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mWorkspace.getChildAt(mWorkspace.getCurrentPage()).requestFocus(); 42189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 42199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mSavedState = null; 4220138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 4221cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 42221462de39f01cec0ba785386532719cb0207dd827Adam Cohen mWorkspace.restoreInstanceStateForRemainingPages(); 4223cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 4224ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWorkspaceLoading(false); 42253ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen sendLoadingCompleteBroadcastIfNecessary(); 4226db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 4227db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // If we received the result of any pending adds while the loader was running (e.g. the 4228db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // widget configuration forced an orientation change), process them now. 4229db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (sPendingAddItem != null) { 4230db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final long screenId = completeAdd(sPendingAddItem); 4231db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 4232db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // TODO: this moves the user to the page where the pending item was added. Ideally, 4233db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // the screen would be guaranteed to exist after bind, and the page would be set through 4234db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // the workspace restore process. 4235db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.post(new Runnable() { 4236db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen @Override 4237db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen public void run() { 4238db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.snapToScreenId(screenId); 4239db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 4240db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen }); 4241db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen sPendingAddItem = null; 4242db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 4243db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 4244756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal InstallShortcutReceiver.disableAndFlushInstallQueue(this); 42459211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen 42469211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 424766cfdc2549b973496f2d5555defc22b7a15b5620Sunny Goyal mLauncherCallbacks.finishBindingItems(false); 42489211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4249f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung } 4250f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung 42513ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen private void sendLoadingCompleteBroadcastIfNecessary() { 42523ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen if (!mSharedPrefs.getBoolean(FIRST_LOAD_COMPLETE, false)) { 42533ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen String permission = 42543ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen getResources().getString(R.string.receive_first_load_broadcast_permission); 42553ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen Intent intent = new Intent(ACTION_FIRST_LOAD_COMPLETE); 42563ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen sendBroadcast(intent, permission); 42573ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen SharedPreferences.Editor editor = mSharedPrefs.edit(); 42583ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen editor.putBoolean(FIRST_LOAD_COMPLETE, true); 42593ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen editor.apply(); 42603ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen } 42613ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen } 42623ed316a71d5ec5be2e25ba0a993ebd71a260217cAdam Cohen 4263a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung public boolean isAllAppsButtonRank(int rank) { 4264a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung if (mHotseat != null) { 4265a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung return mHotseat.isAllAppsButtonRank(rank); 4266a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung } 4267a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung return false; 4268a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung } 4269a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung 4270a2413751e3a698aef9c87411a639637883856939Winson Chung private boolean canRunNewAppsAnimation() { 4271a2413751e3a698aef9c87411a639637883856939Winson Chung long diff = System.currentTimeMillis() - mDragController.getLastGestureUpTime(); 4272a2413751e3a698aef9c87411a639637883856939Winson Chung return diff > (NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS * 1000); 4273a2413751e3a698aef9c87411a639637883856939Winson Chung } 4274a2413751e3a698aef9c87411a639637883856939Winson Chung 4275c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung private ValueAnimator createNewAppBounceAnimation(View v, int i) { 4276c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung ValueAnimator bounceAnim = LauncherAnimUtils.ofPropertyValuesHolder(v, 4277c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung PropertyValuesHolder.ofFloat("alpha", 1f), 4278c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung PropertyValuesHolder.ofFloat("scaleX", 1f), 4279c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung PropertyValuesHolder.ofFloat("scaleY", 1f)); 4280c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung bounceAnim.setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION); 4281c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung bounceAnim.setStartDelay(i * InstallShortcutReceiver.NEW_SHORTCUT_STAGGER_DELAY); 42825a1f53b306a4fcf56aad577987386ea1b2dfe6b9Sunny Goyal bounceAnim.setInterpolator(new OvershootInterpolator(BOUNCE_ANIMATION_TENSION)); 4283c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung return bounceAnim; 4284c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung } 4285c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung 42862777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen public boolean useVerticalBarLayout() { 4287dfaccf64bd59343de483b12eee6db61c960aedceSunny Goyal return mDeviceProfile.isVerticalBarLayout(); 42882777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen } 42892777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen 42906def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai protected Rect getSearchBarBounds() { 4291c6205603efe1f2987caf96504c87d720a25b5a94Sunny Goyal return mDeviceProfile.getSearchBarBounds(Utilities.isRtl(getResources())); 42926def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai } 42936def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai 4294cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath public void bindSearchablesChanged() { 4295594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (mSearchDropTargetBar == null) { 4296594d76dc66cb5666830b62594909fed187987d42Sunny Goyal return; 4297594d76dc66cb5666830b62594909fed187987d42Sunny Goyal } 4298594d76dc66cb5666830b62594909fed187987d42Sunny Goyal if (mQsb != null) { 4299594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mSearchDropTargetBar.removeView(mQsb); 4300594d76dc66cb5666830b62594909fed187987d42Sunny Goyal mQsb = null; 4301adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 4302b0df1b0e1ac865818942851b6a0d1fdca4843834Adam Cohen mSearchDropTargetBar.setQsbSearchBar(getOrCreateQsbBar()); 4303cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath } 4304cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath 43056d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani /** 4306bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung * A runnable that we can dequeue and re-enqueue when all applications are bound (to prevent 4307bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung * multiple calls to bind the same list.) 4308bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung */ 4309bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung @Thunk ArrayList<AppInfo> mTmpAppsList; 4310bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung private Runnable mBindAllApplicationsRunnable = new Runnable() { 4311bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung public void run() { 4312bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung bindAllApplications(mTmpAppsList); 4313bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung mTmpAppsList = null; 4314bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung } 4315bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung }; 4316bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung 4317bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung /** 43189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Add the icons for all apps. 43199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 43209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 43219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 4322eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka public void bindAllApplications(final ArrayList<AppInfo> apps) { 4323bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung if (waitUntilResume(mBindAllApplicationsRunnable, true)) { 4324bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung mTmpAppsList = apps; 4325bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung return; 4326bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung } 4327bb785c6eb38f9c4b1f71920cb6e57ca8f11d4908Winson Chung 4328b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mAppsView != null) { 4329b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mAppsView.setApps(apps); 4330b745afbdd75157c73d581b345118cdaff99e912dWinson Chung } 43319211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 43329211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.bindAllApplications(apps); 43339211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 43349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 43359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 43369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 43379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * A package was updated. 43389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 43399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 43409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 4341eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka public void bindAppsUpdated(final ArrayList<AppInfo> apps) { 4342d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4343d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4344d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindAppsUpdated(apps); 4345d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4346d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4347d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 43487607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 43497607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 43507607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka 4351b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mAppsView != null) { 4352b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mAppsView.updateApps(apps); 4353c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 43549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 43559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 43564390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal @Override 43574390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal public void bindWidgetsRestored(final ArrayList<LauncherAppWidgetInfo> widgets) { 43584390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal Runnable r = new Runnable() { 43594390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal public void run() { 43604390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal bindWidgetsRestored(widgets); 43614390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal } 43624390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal }; 43634390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal if (waitUntilResume(r)) { 43644390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal return; 43654390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal } 43664390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal mWorkspace.widgetsRestored(widgets); 43674390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal } 43684390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal 43699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 4370b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal * Some shortcuts were updated in the background. 4371b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal * 4372b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal * Implementation of the method from LauncherModel.Callbacks. 4373b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal */ 43744390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal @Override 43754390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal public void bindShortcutsChanged(final ArrayList<ShortcutInfo> updated, 43764390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal final ArrayList<ShortcutInfo> removed, final UserHandleCompat user) { 4377b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal Runnable r = new Runnable() { 4378b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal public void run() { 43794390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal bindShortcutsChanged(updated, removed, user); 4380b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal } 4381b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal }; 4382b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal if (waitUntilResume(r)) { 4383b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal return; 4384b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal } 4385b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal 43864390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal if (!updated.isEmpty()) { 43874390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal mWorkspace.updateShortcuts(updated); 43884390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal } 43894390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal 43904390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal if (!removed.isEmpty()) { 43914390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal HashSet<ComponentName> removedComponents = new HashSet<ComponentName>(); 43924390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal for (ShortcutInfo si : removed) { 43934390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal removedComponents.add(si.getTargetComponent()); 43944390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal } 43954390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal mWorkspace.removeItemsByComponentName(removedComponents, user); 43964390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal // Notify the drag controller 43974390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal mDragController.onAppsRemoved(new ArrayList<String>(), removedComponents); 4398b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal } 4399b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal } 4400b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal 4401b50cc8c5d6125715b139d978887830a5341971aaSunny Goyal /** 4402aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren * Update the state of a package, typically related to install state. 4403aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren * 4404aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren * Implementation of the method from LauncherModel.Callbacks. 4405aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren */ 4406e755d469d40b95e763a9dcb67d0e4f511d1948ddSunny Goyal @Override 4407756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal public void bindRestoreItemsChange(final HashSet<ItemInfo> updates) { 4408756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal Runnable r = new Runnable() { 4409756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal public void run() { 4410756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal bindRestoreItemsChange(updates); 4411756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal } 4412756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal }; 4413756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal if (waitUntilResume(r)) { 4414756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal return; 4415aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren } 4416aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren 4417756adbc3e41ee1edb53c580b8c679f343924fab5Sunny Goyal mWorkspace.updateRestoreItems(updates); 4418a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal } 4419a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal 4420a22666f68151269853e7ab6ab696ee6361bac793Sunny Goyal /** 442183892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * A package was uninstalled. We take both the super set of packageNames 442283892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * in addition to specific applications to remove, the reason being that 442383892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * this can be called when a package is updated as well. In that scenario, 442483892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * we only remove specific components from the workspace, where as 442583892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * package-removal should clear all items by package name. 44269c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 44271a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal * @param reason if non-zero, the icons are not permanently removed, rather marked as disabled. 44289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 44299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 44301a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal @Override 443183892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung public void bindComponentsRemoved(final ArrayList<String> packageNames, 44321a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal final ArrayList<AppInfo> appInfos, final UserHandleCompat user, final int reason) { 4433d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 443483892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung public void run() { 44351a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal bindComponentsRemoved(packageNames, appInfos, user, reason); 443683892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 4437d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4438d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 443983892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung return; 444083892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 444183892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung 44421a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal if (reason == 0) { 44434390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal HashSet<ComponentName> removedComponents = new HashSet<ComponentName>(); 44444390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal for (AppInfo info : appInfos) { 44454390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal removedComponents.add(info.componentName); 44464390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal } 44471a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal if (!packageNames.isEmpty()) { 44481a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal mWorkspace.removeItemsByPackageName(packageNames, user); 44491a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal } 44504390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal if (!removedComponents.isEmpty()) { 44514390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal mWorkspace.removeItemsByComponentName(removedComponents, user); 44521a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal } 44534390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal // Notify the drag controller 44544390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal mDragController.onAppsRemoved(packageNames, removedComponents); 44554390acea35aefae52bd3fe38f5fdbb7ea322afb0Sunny Goyal 44561a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal } else { 44571a745e8f18e54aff152ff51743ae7595adde6927Sunny Goyal mWorkspace.disableShortcutsByPackageName(packageNames, user, reason); 44583611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 4459f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 4460df95eb12a4d288ffa143a0c3db60e7e98f3e03b9Winson Chung // Update AllApps 4461b745afbdd75157c73d581b345118cdaff99e912dWinson Chung if (mAppsView != null) { 4462b745afbdd75157c73d581b345118cdaff99e912dWinson Chung mAppsView.removeApps(appInfos); 4463c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 446431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4465be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato 4466c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private Runnable mBindPackagesUpdatedRunnable = new Runnable() { 446783892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung public void run() { 44682bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song bindAllPackages(mWidgetsModel); 446983892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 4470c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka }; 44713f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 44728821ca9a6a5bf34308f9b70c2cabf9da17330497Hyunyoung Song @Override 44732bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song public void bindAllPackages(final WidgetsModel model) { 4474c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (waitUntilResume(mBindPackagesUpdatedRunnable, true)) { 44752bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song mWidgetsModel = model; 447683892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung return; 447783892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 447883892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung 44792bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song if (mWidgetsView != null && model != null) { 44802bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song mWidgetsView.addWidgets(model); 44812bd3d7d1cb5e4d8d826982d11b456739fed6b817Hyunyoung Song mWidgetsModel = null; 4482785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 448380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 448480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 4485400438b79fe412cb625c96297edeea9c6155349eWinson Chung private int mapConfigurationOriActivityInfoOri(int configOri) { 4486400438b79fe412cb625c96297edeea9c6155349eWinson Chung final Display d = getWindowManager().getDefaultDisplay(); 4487400438b79fe412cb625c96297edeea9c6155349eWinson Chung int naturalOri = Configuration.ORIENTATION_LANDSCAPE; 4488400438b79fe412cb625c96297edeea9c6155349eWinson Chung switch (d.getRotation()) { 4489400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_0: 4490400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_180: 4491400438b79fe412cb625c96297edeea9c6155349eWinson Chung // We are currently in the same basic orientation as the natural orientation 4492400438b79fe412cb625c96297edeea9c6155349eWinson Chung naturalOri = configOri; 4493400438b79fe412cb625c96297edeea9c6155349eWinson Chung break; 4494400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_90: 4495400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_270: 4496400438b79fe412cb625c96297edeea9c6155349eWinson Chung // We are currently in the other basic orientation to the natural orientation 4497400438b79fe412cb625c96297edeea9c6155349eWinson Chung naturalOri = (configOri == Configuration.ORIENTATION_LANDSCAPE) ? 4498400438b79fe412cb625c96297edeea9c6155349eWinson Chung Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE; 4499400438b79fe412cb625c96297edeea9c6155349eWinson Chung break; 4500400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4501400438b79fe412cb625c96297edeea9c6155349eWinson Chung 4502400438b79fe412cb625c96297edeea9c6155349eWinson Chung int[] oriMap = { 4503400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, 4504400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, 4505400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, 4506400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE 4507400438b79fe412cb625c96297edeea9c6155349eWinson Chung }; 4508400438b79fe412cb625c96297edeea9c6155349eWinson Chung // Since the map starts at portrait, we need to offset if this device's natural orientation 4509400438b79fe412cb625c96297edeea9c6155349eWinson Chung // is landscape. 4510400438b79fe412cb625c96297edeea9c6155349eWinson Chung int indexOffset = 0; 4511400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (naturalOri == Configuration.ORIENTATION_LANDSCAPE) { 4512400438b79fe412cb625c96297edeea9c6155349eWinson Chung indexOffset = 1; 4513400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4514400438b79fe412cb625c96297edeea9c6155349eWinson Chung return oriMap[(d.getRotation() + indexOffset) % 4]; 4515400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4516446e940fc8839173de12f1299b8c24f318d53a3fAdam Cohen 4517641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung public void lockScreenOrientation() { 45187fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi if (mRotationEnabled) { 45193c1865ad5050f594d1684fe8962bfbc8ffcbe4bbSunny Goyal if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { 45203c1865ad5050f594d1684fe8962bfbc8ffcbe4bbSunny Goyal setRequestedOrientation(mapConfigurationOriActivityInfoOri(getResources() 45213c1865ad5050f594d1684fe8962bfbc8ffcbe4bbSunny Goyal .getConfiguration().orientation)); 45223c1865ad5050f594d1684fe8962bfbc8ffcbe4bbSunny Goyal } else { 45233c1865ad5050f594d1684fe8962bfbc8ffcbe4bbSunny Goyal setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 45243c1865ad5050f594d1684fe8962bfbc8ffcbe4bbSunny Goyal } 45254b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 4526400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 45277fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 45284b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung public void unlockScreenOrientation(boolean immediate) { 45297fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi if (mRotationEnabled) { 45304b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung if (immediate) { 4531641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 45324b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } else { 45334b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung mHandler.postDelayed(new Runnable() { 45344b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung public void run() { 45354b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 45364b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 45374b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung }, mRestoreScreenOrientationDelay); 4538641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung } 45394b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 4540400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4541400438b79fe412cb625c96297edeea9c6155349eWinson Chung 4542e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung protected boolean isLauncherPreinstalled() { 45439211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 45449211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.isLauncherPreinstalled(); 45459211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4546e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung PackageManager pm = getPackageManager(); 4547e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung try { 4548e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung ApplicationInfo ai = pm.getApplicationInfo(getComponentName().getPackageName(), 0); 4549e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4550e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung return true; 4551e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } else { 4552e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung return false; 4553e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 4554e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } catch (NameNotFoundException e) { 4555e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung e.printStackTrace(); 4556e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung return false; 4557e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 4558e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 4559e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung 4560ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen /** 4561ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen * This method indicates whether or not we should suggest default wallpaper dimensions 4562ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen * when our wallpaper cropper was not yet used to set a wallpaper. 4563ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen */ 4564ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen protected boolean overrideWallpaperDimensions() { 45659211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 45669211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.overrideWallpaperDimensions(); 45679211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4568ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen return true; 4569ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen } 4570ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen 4571432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4572432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overridden by subclasses to indicate that there is an activity to launch 4573432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * before showing the standard launcher experience. 4574432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4575432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected boolean hasFirstRunActivity() { 45769211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 45779211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.hasFirstRunActivity(); 45789211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4579432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return false; 4580432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4581432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4582432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4583432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overridden by subclasses to launch any first run activity 4584432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4585432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected Intent getFirstRunActivity() { 45869211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 45879211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.getFirstRunActivity(); 45889211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4589432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return null; 4590432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4591432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 45922826a401edb12e53cd19e76af3551c34fef05755Winson Chung /** 45932826a401edb12e53cd19e76af3551c34fef05755Winson Chung * Returns whether the launcher callbacks overrides search in all apps. 45942826a401edb12e53cd19e76af3551c34fef05755Winson Chung */ 45952826a401edb12e53cd19e76af3551c34fef05755Winson Chung @Thunk boolean isAllAppsSearchOverridden() { 459683f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung if (DISABLE_ALL_APPS_SEARCH_INTEGRATION) { 459783f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung return false; 459883f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung } 459983f59abc9c566da5deb98afe7ea35cfb061f2920Winson Chung 46002826a401edb12e53cd19e76af3551c34fef05755Winson Chung if (mLauncherCallbacks != null) { 46012826a401edb12e53cd19e76af3551c34fef05755Winson Chung return mLauncherCallbacks.overrideAllAppsSearch(); 46022826a401edb12e53cd19e76af3551c34fef05755Winson Chung } 46032826a401edb12e53cd19e76af3551c34fef05755Winson Chung return false; 46042826a401edb12e53cd19e76af3551c34fef05755Winson Chung } 46052826a401edb12e53cd19e76af3551c34fef05755Winson Chung 4606a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private boolean shouldRunFirstRunActivity() { 4607bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen return !ActivityManager.isRunningInTestHarness() && 4608bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen !mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false); 4609af40f205d7f0c5f73a92ff5d9b8e9602dbde58c0Winson Chung } 4610a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 46114a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen protected boolean hasRunFirstRunActivity() { 46124a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen return mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false); 46134a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen } 46144a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen 4615432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen public boolean showFirstRunActivity() { 4616bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen if (shouldRunFirstRunActivity() && 4617bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen hasFirstRunActivity()) { 4618a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung Intent firstRunIntent = getFirstRunActivity(); 4619a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung if (firstRunIntent != null) { 4620a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung startActivity(firstRunIntent); 4621a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung markFirstRunActivityShown(); 4622432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return true; 4623a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 4624af40f205d7f0c5f73a92ff5d9b8e9602dbde58c0Winson Chung } 4625432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return false; 4626a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 4627a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 4628a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private void markFirstRunActivityShown() { 4629a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung SharedPreferences.Editor editor = mSharedPrefs.edit(); 4630a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung editor.putBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, true); 4631a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung editor.apply(); 4632a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 46333a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung 46347fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi private void showSettingsActivity() { 46357fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi startActivity(new Intent(this, SettingsActivity.class)); 46367fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi } 46377fc77cad3d06bd3647e550f7419e89116471240aRahul Chaturvedi 4638432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4639432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overridden by subclasses to indicate that there is an in-activity full-screen intro 4640432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * screen that must be displayed and dismissed. 4641432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4642432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected boolean hasDismissableIntroScreen() { 46439211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 46449211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.hasDismissableIntroScreen(); 46459211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4646432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return false; 4647432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4648432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4649432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4650432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * Full screen intro screen to be shown and dismissed before the launcher can be used. 4651432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4652432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected View getIntroScreen() { 46539211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 46549211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen return mLauncherCallbacks.getIntroScreen(); 46559211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4656432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return null; 4657432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4658432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4659432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4660432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overriden by subclasses to indicate whether the in-activity intro screen has been 4661432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * dismissed. This method is ignored if #hasDismissableIntroScreen returns false. 4662432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4663432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen private boolean shouldShowIntroScreen() { 4664432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return hasDismissableIntroScreen() && 4665432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen !mSharedPrefs.getBoolean(INTRO_SCREEN_DISMISSED, false); 4666432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4667432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4668432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected void showIntroScreen() { 4669432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen View introScreen = getIntroScreen(); 4670432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen changeWallpaperVisiblity(false); 4671432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen if (introScreen != null) { 4672432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mDragLayer.showOverlayView(introScreen); 4673432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4674c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen if (mLauncherOverlayContainer != null) { 4675c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen mLauncherOverlayContainer.setVisibility(View.INVISIBLE); 4676c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen } 4677432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4678432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4679432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen public void dismissIntroScreen() { 4680432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen markIntroScreenDismissed(); 4681432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen if (showFirstRunActivity()) { 4682432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen // We delay hiding the intro view until the first run activity is showing. This 4683432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen // avoids a blip. 4684432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mWorkspace.postDelayed(new Runnable() { 4685432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen @Override 4686432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen public void run() { 4687432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mDragLayer.dismissOverlayView(); 4688c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen if (mLauncherOverlayContainer != null) { 4689c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen mLauncherOverlayContainer.setVisibility(View.VISIBLE); 4690c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen } 469188d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal showFirstRunClings(); 4692432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4693432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen }, ACTIVITY_START_DELAY); 4694432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } else { 4695432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mDragLayer.dismissOverlayView(); 4696c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen if (mLauncherOverlayContainer != null) { 4697c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen mLauncherOverlayContainer.setVisibility(View.VISIBLE); 4698c3e12c733ea1bac942454237b897d5a321c01072Adam Cohen } 469988d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal showFirstRunClings(); 4700432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4701432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen changeWallpaperVisiblity(true); 4702432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4703432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4704432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen private void markIntroScreenDismissed() { 4705432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen SharedPreferences.Editor editor = mSharedPrefs.edit(); 4706432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen editor.putBoolean(INTRO_SCREEN_DISMISSED, true); 4707432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen editor.apply(); 4708432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4709432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4710091440a9cb9d4f42406631004aa484cbb79214caAdam Cohen @Thunk void showFirstRunClings() { 471188d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal // The two first run cling paths are mutually exclusive, if the launcher is preinstalled 471288d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal // on the device, then we always show the first run cling experience (or if there is no 471388d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal // launcher2). Otherwise, we prompt the user upon started for migration 471488d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal LauncherClings launcherClings = new LauncherClings(this); 471588d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal if (launcherClings.shouldShowFirstRunOrMigrationClings()) { 471688d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal if (mModel.canMigrateFromOldLauncherDb(this)) { 471788d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal launcherClings.showMigrationCling(); 471888d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal } else { 4719af0628f84e38037be735620c23da8cacc2e3447fSunny Goyal launcherClings.showLongPressCling(true); 472088d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal } 472188d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal } 472288d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal } 472388d60f14f2516b2d725ea1a1700905530932b1fdSunny Goyal 4724a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung void showWorkspaceSearchAndHotseat() { 4725205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mWorkspace != null) mWorkspace.setAlpha(1f); 4726205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mHotseat != null) mHotseat.setAlpha(1f); 4727205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mPageIndicators != null) mPageIndicators.setAlpha(1f); 4728205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mSearchDropTargetBar != null) mSearchDropTargetBar.showSearchBar(false); 47297d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 4730a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 4731a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung void hideWorkspaceSearchAndHotseat() { 4732205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mWorkspace != null) mWorkspace.setAlpha(0f); 4733205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mHotseat != null) mHotseat.setAlpha(0f); 4734205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mPageIndicators != null) mPageIndicators.setAlpha(0f); 4735205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mSearchDropTargetBar != null) mSearchDropTargetBar.hideSearchBar(false); 473682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 473782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 473872fbec17e09a1120971621587d5005f683baafd1Mathew Inwood public ItemInfo createAppDragInfo(Intent appLaunchIntent) { 4739ed13187a745866483139e2878037e1f8427ce567Kenny Guy // Called from search suggestion, not supported in other profiles. 4740ed13187a745866483139e2878037e1f8427ce567Kenny Guy final UserHandleCompat myUser = UserHandleCompat.myUserHandle(); 4741ed13187a745866483139e2878037e1f8427ce567Kenny Guy LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this); 4742ed13187a745866483139e2878037e1f8427ce567Kenny Guy LauncherActivityInfoCompat activityInfo = launcherApps.resolveActivity(appLaunchIntent, 4743ed13187a745866483139e2878037e1f8427ce567Kenny Guy myUser); 4744ed13187a745866483139e2878037e1f8427ce567Kenny Guy if (activityInfo == null) { 474572fbec17e09a1120971621587d5005f683baafd1Mathew Inwood return null; 474672fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 47474fbc3828c5ae1e8c5789ede974447fa365f3c5a1Sunny Goyal return new AppInfo(this, activityInfo, myUser, mIconCache); 474872fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 474972fbec17e09a1120971621587d5005f683baafd1Mathew Inwood 475072fbec17e09a1120971621587d5005f683baafd1Mathew Inwood public ItemInfo createShortcutDragInfo(Intent shortcutIntent, CharSequence caption, 475172fbec17e09a1120971621587d5005f683baafd1Mathew Inwood Bitmap icon) { 4752ed13187a745866483139e2878037e1f8427ce567Kenny Guy // Called from search suggestion, not supported in other profiles. 4753ed13187a745866483139e2878037e1f8427ce567Kenny Guy return createShortcutDragInfo(shortcutIntent, caption, icon, 4754ed13187a745866483139e2878037e1f8427ce567Kenny Guy UserHandleCompat.myUserHandle()); 4755ed13187a745866483139e2878037e1f8427ce567Kenny Guy } 4756ed13187a745866483139e2878037e1f8427ce567Kenny Guy 4757ed13187a745866483139e2878037e1f8427ce567Kenny Guy public ItemInfo createShortcutDragInfo(Intent shortcutIntent, CharSequence caption, 4758ed13187a745866483139e2878037e1f8427ce567Kenny Guy Bitmap icon, UserHandleCompat user) { 4759c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy UserManagerCompat userManager = UserManagerCompat.getInstance(this); 4760d6fe52636dcaa96ec1e10ce2daebe98b820c9739Kenny Guy CharSequence contentDescription = userManager.getBadgedLabelForUser(caption, user); 4761c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy return new ShortcutInfo(shortcutIntent, caption, contentDescription, icon, user); 476272fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 476372fbec17e09a1120971621587d5005f683baafd1Mathew Inwood 4764b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood protected void moveWorkspaceToDefaultScreen() { 4765b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood mWorkspace.moveToDefaultScreen(false); 4766b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood } 4767b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood 476872fbec17e09a1120971621587d5005f683baafd1Mathew Inwood public void startDrag(View dragView, ItemInfo dragInfo, DragSource source) { 476972fbec17e09a1120971621587d5005f683baafd1Mathew Inwood dragView.setTag(dragInfo); 4770babb53ef8fd0fcba32fcc8fc213663f0f27b8f5eWinson Chung mWorkspace.onExternalDragStartedWithItem(dragView); 4771babb53ef8fd0fcba32fcc8fc213663f0f27b8f5eWinson Chung mWorkspace.beginExternalDragShared(dragView, source); 477272fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 477372fbec17e09a1120971621587d5005f683baafd1Mathew Inwood 4774f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal @Override 4775f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal public void onPageSwitch(View newPage, int newPageIndex) { 47769211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 47779211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.onPageSwitch(newPage, newPageIndex); 47789211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 4779f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal } 4780f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal 478180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung /** 4782be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato * Prints out out state for debugging. 4783be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato */ 4784be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public void dumpState() { 4785325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler Log.d(TAG, "BEGIN launcher3 dump state for launcher " + this); 478639bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mSavedState=" + mSavedState); 478739bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mWorkspaceLoading=" + mWorkspaceLoading); 478839bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mRestoring=" + mRestoring); 478939bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mWaitingForResult=" + mWaitingForResult); 479039bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mSavedInstanceState=" + mSavedInstanceState); 4791319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick Log.d(TAG, "sFolders.size=" + sFolders.size()); 4792be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato mModel.dumpState(); 47933f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song // TODO(hyunyoungs): add mWidgetsView.dumpState(); or mWidgetsModel.dumpState(); 4794f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 4795325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler Log.d(TAG, "END launcher3 dump state"); 4796be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 479716d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen 479816d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen @Override 479916d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 480016d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen super.dump(prefix, fd, writer, args); 48014caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen synchronized (sDumpLogs) { 48024caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen writer.println(" "); 48034caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen writer.println("Debug logs: "); 48044caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen for (int i = 0; i < sDumpLogs.size(); i++) { 48054caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen writer.println(" " + sDumpLogs.get(i)); 48064caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 480716d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen } 48089211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen if (mLauncherCallbacks != null) { 48099211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen mLauncherCallbacks.dump(prefix, fd, writer, args); 48109211d42f139eeaeeaef1fe4e59df2349e6d1237aAdam Cohen } 481116d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen } 4812487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen 4813487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen public static void dumpDebugLogsToConsole() { 4814ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (DEBUG_DUMP_LOG) { 4815ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung synchronized (sDumpLogs) { 4816ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, ""); 4817ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, "*********************"); 4818ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, "Launcher debug logs: "); 4819ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung for (int i = 0; i < sDumpLogs.size(); i++) { 4820ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, " " + sDumpLogs.get(i)); 4821ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 4822ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, "*********************"); 4823ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, ""); 48244caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48254caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48264caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48274caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen 48284caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen public static void addDumpLog(String tag, String log, boolean debugLog) { 4829295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler addDumpLog(tag, log, null, debugLog); 4830295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler } 4831295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler 4832295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler public static void addDumpLog(String tag, String log, Exception e, boolean debugLog) { 48334caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen if (debugLog) { 4834295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler if (e != null) { 4835295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler Log.d(tag, log, e); 4836295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler } else { 4837295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler Log.d(tag, log); 4838295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler } 48394caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 4840ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (DEBUG_DUMP_LOG) { 4841ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung sDateStamp.setTime(System.currentTimeMillis()); 4842ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung synchronized (sDumpLogs) { 4843295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler sDumpLogs.add(sDateFormat.format(sDateStamp) + ": " + tag + ", " + log 4844295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler + (e == null ? "" : (", Exception: " + e))); 4845ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 48464caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48474caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48484caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen 48495940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen public static CustomAppWidget getCustomAppWidget(String name) { 48505940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen return sCustomAppWidgets.get(name); 48515940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen } 48525940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen 48535940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen public static HashMap<String, CustomAppWidget> getCustomAppWidgets() { 48545940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen return sCustomAppWidgets; 48555940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen } 48565940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen 4857ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung public void dumpLogsToLocalData() { 4858ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (DEBUG_DUMP_LOG) { 48594346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka new AsyncTask<Void, Void, Void>() { 48604346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka public Void doInBackground(Void ... args) { 4861ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung boolean success = false; 4862ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung sDateStamp.setTime(sRunStart); 4863ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung String FILENAME = sDateStamp.getMonth() + "-" 4864ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getDay() + "_" 4865ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getHours() + "-" 4866ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getMinutes() + "_" 4867ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getSeconds() + ".txt"; 4868ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung 4869ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung FileOutputStream fos = null; 4870ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung File outFile = null; 4871ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung try { 4872ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung outFile = new File(getFilesDir(), FILENAME); 4873ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung outFile.createNewFile(); 4874ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung fos = new FileOutputStream(outFile); 4875ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } catch (Exception e) { 4876ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung e.printStackTrace(); 48774caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48784caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen if (fos != null) { 4879ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung PrintWriter writer = new PrintWriter(fos); 4880ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung 4881ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.println(" "); 4882ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.println("Debug logs: "); 4883ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung synchronized (sDumpLogs) { 4884ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung for (int i = 0; i < sDumpLogs.size(); i++) { 4885ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.println(" " + sDumpLogs.get(i)); 4886ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 4887ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 4888ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.close(); 48894caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 4890ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung try { 4891ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (fos != null) { 4892ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung fos.close(); 4893ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung success = true; 4894ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 4895ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } catch (IOException e) { 4896ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung e.printStackTrace(); 48974caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 48984346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka return null; 48994caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 49004346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); 49014caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 4902487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen } 490331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 49042763be3150d429d338b9848286e9365b4052c100Michael Jurka 4905d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandlerinterface DebugIntents { 4906d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler static final String DELETE_DATABASE = "com.android.launcher3.action.DELETE_DATABASE"; 4907d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler static final String MIGRATE_DATABASE = "com.android.launcher3.action.MIGRATE_DATABASE"; 49088b5b05b7f3c8c5d705116c425bd5dbff2b75d56aAdam Cohen} 4909