Launcher.java revision 651077bdd603bb182be039925fd17bdf0da15016
101f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 18325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3; 1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 20dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.animation.Animator; 218edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurkaimport android.animation.AnimatorListenerAdapter; 22dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.animation.AnimatorSet; 232801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.animation.ObjectAnimator; 242801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.animation.PropertyValuesHolder; 25dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.animation.ValueAnimator; 267044272f180d34ab29866f6c59ee75376e8a1df5Winson Chungimport android.animation.ValueAnimator.AnimatorUpdateListener; 270b395356087901c16af283b5d9ae821a630cb6adAdam Cohenimport android.annotation.TargetApi; 28946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurkaimport android.app.Activity; 292a9e228e6fd719732639beb880d6df64d48158a1Brett Chabotimport android.app.ActivityManager; 30c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chungimport android.app.ActivityOptions; 3140c5ed303909c4df71037be3429aa1423e59585fChris Wrenimport android.app.AlertDialog; 3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.app.SearchManager; 330cf2a7c3eeb75cbd532b011524140a4b963f2c93Adam Cohenimport android.appwidget.AppWidgetHostView; 34af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.appwidget.AppWidgetManager; 35af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.appwidget.AppWidgetProviderInfo; 3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ActivityNotFoundException; 372ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onoratoimport android.content.BroadcastReceiver; 38e326f186af6b00e4ea32849f1527254c669d0600Michael Jurkaimport android.content.ComponentCallbacks2; 39c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandlerimport android.content.ComponentName; 401e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport android.content.ContentResolver; 4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context; 4240c5ed303909c4df71037be3429aa1423e59585fChris Wrenimport android.content.DialogInterface; 4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Intent; 44f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chungimport android.content.IntentFilter; 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; 51138a04170d964da9cdec228e95b976875ae52481Karl Rosaenimport android.content.res.Resources; 521e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport android.database.ContentObserver; 53268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohenimport android.graphics.Bitmap; 54268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohenimport android.graphics.Canvas; 552efc7d928a3df57838f8abd8ed6fdb9eeb21b481Sandeep Siddharthaimport android.graphics.Color; 565f8afe6280eae34620067696173e71943e1a30a3Winson Chungimport android.graphics.Point; 57268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohenimport android.graphics.PorterDuff; 58af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.graphics.Rect; 59af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.graphics.drawable.Drawable; 60c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandlerimport android.net.Uri; 61319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrickimport android.os.AsyncTask; 6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Bundle; 630fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauerimport android.os.Environment; 641e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport android.os.Handler; 65ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohenimport android.os.Message; 66a2413751e3a698aef9c87411a639637883856939Winson Chungimport android.os.StrictMode; 67843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandlerimport android.os.SystemClock; 684ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroyimport android.provider.Settings; 696d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasaniimport android.speech.RecognizerIntent; 7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.text.Selection; 7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.text.SpannableStringBuilder; 72a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurkaimport android.text.TextUtils; 7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.text.method.TextKeyListener; 74892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chungimport android.util.DisplayMetrics; 757c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onoratoimport android.util.Log; 7696d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Display; 7796d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Gravity; 7896d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.HapticFeedbackConstants; 7996d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.KeyEvent; 8096d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.LayoutInflater; 8196d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Menu; 8296d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.MotionEvent; 8396d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.Surface; 8496d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.View; 856c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohenimport android.view.ViewAnimationUtils; 860b395356087901c16af283b5d9ae821a630cb6adAdam Cohenimport android.view.Window; 87f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohenimport android.view.View.OnClickListener; 880cf2a7c3eeb75cbd532b011524140a4b963f2c93Adam Cohenimport android.view.View.OnLongClickListener; 8996d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.ViewGroup; 9096d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.ViewTreeObserver; 912a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurkaimport android.view.ViewTreeObserver.OnGlobalLayoutListener; 92651077bdd603bb182be039925fd17bdf0da15016Sunny Goyalimport android.view.Window; 9396d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.view.WindowManager; 94815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 95cff6af81d721415785bddc2efd74e179d2def9daAdam Cohenimport android.view.animation.AccelerateDecelerateInterpolator; 966c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohenimport android.view.animation.AccelerateInterpolator; 97f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohenimport android.view.animation.DecelerateInterpolator; 986c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohenimport android.view.animation.LinearInterpolator; 9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 10096d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.Advanceable; 10196d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.FrameLayout; 10296d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.ImageView; 10396d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.TextView; 10496d30a165185dc59617e181314f4d22634e22952Adam Cohenimport android.widget.Toast; 1056c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 106651077bdd603bb182be039925fd17bdf0da15016Sunny Goyalimport com.android.launcher3.DropTarget.DragObject; 107651077bdd603bb182be039925fd17bdf0da15016Sunny Goyalimport com.android.launcher3.PagedView.PageSwitchListener; 108ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherActivityInfoCompat; 109ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherAppsCompat; 110ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserHandleCompat; 111ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserManagerCompat; 112325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerimport com.android.launcher3.DropTarget.DragObject; 113f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppalimport com.android.launcher3.PagedView.PageSwitchListener; 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; 1230b395356087901c16af283b5d9ae821a630cb6adAdam Cohenimport java.lang.reflect.Field; 1240b395356087901c16af283b5d9ae821a630cb6adAdam Cohenimport java.lang.reflect.InvocationTargetException; 1250b395356087901c16af283b5d9ae821a630cb6adAdam Cohenimport java.lang.reflect.Method; 1264caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohenimport java.text.DateFormat; 127c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.util.ArrayList; 128f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chungimport java.util.Collection; 1294caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohenimport java.util.Date; 130c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.util.HashMap; 131d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurkaimport java.util.List; 132c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohenimport java.util.concurrent.atomic.AtomicInteger; 133c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen 134a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Default launcher application. 13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 138c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringertpublic class Launcher extends Activity 1390e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, 14067e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal View.OnTouchListener, PageSwitchListener, LauncherProviderChangeListener { 141a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato static final String TAG = "Launcher"; 142cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato static final boolean LOGD = false; 14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 144f061f82461b8afe0c62eecb776e807c14bc0a4aaDaniel Sandler static final boolean PROFILE_STARTUP = false; 145843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler static final boolean DEBUG_WIDGETS = false; 146a2413751e3a698aef9c87411a639637883856939Winson Chung static final boolean DEBUG_STRICT_MODE = false; 147f061f82461b8afe0c62eecb776e807c14bc0a4aaDaniel Sandler static final boolean DEBUG_RESUME_TIME = false; 148ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung static final boolean DEBUG_DUMP_LOG = false; 1496fefcf1f83ba05e898ea7164a68dcced657bb43eRomain Guy 150d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler static final boolean ENABLE_DEBUG_INTENTS = false; // allow DebugIntents to run 151d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler 15231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final int REQUEST_CREATE_SHORTCUT = 1; 1537376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private static final int REQUEST_CREATE_APPWIDGET = 5; 15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final int REQUEST_PICK_SHORTCUT = 7; 1557376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private static final int REQUEST_PICK_APPWIDGET = 9; 156a0618e4102d0543d953d81e162d93c8ea641d0fdMike Cleron private static final int REQUEST_PICK_WALLPAPER = 10; 15731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1588b805b17158886035b38261eb611d8641701ae43Michael Jurka private static final int REQUEST_BIND_APPWIDGET = 11; 159876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood 160876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood /** 161876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood * IntentStarter uses request codes starting with this. This must be greater than all activity 162876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood * request codes used internally. 163876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood */ 164876a846edc6a9d9c6957ee0f63b01951763e3606Mathew Inwood protected static final int REQUEST_LAST = 100; 1658b805b17158886035b38261eb611d8641701ae43Michael Jurka 16631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static final String EXTRA_SHORTCUT_DUPLICATE = "duplicate"; 16731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1683a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron static final int SCREEN_COUNT = 5; 1693a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron static final int DEFAULT_SCREEN = 2; 17031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy private static final String PREFERENCES = "launcher.preferences"; 1720a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka // To turn on these properties, type 1730a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka // adb shell setprop log.tag.PROPERTY_NAME [VERBOSE | SUPPRESS] 1740a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka static final String FORCE_ENABLE_ROTATION_PROPERTY = "launcher_force_rotate"; 1750a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka static final String DUMP_STATE_PROPERTY = "launcher_dump_state"; 17616f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal static final String DISABLE_ALL_APPS_PROPERTY = "launcher_noallapps"; 17731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1782672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung // The Intent extra that defines whether to ignore the launch animation 1792672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung static final String INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION = 180325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler "com.android.launcher3.intent.extra.shortcut.INGORE_LAUNCH_ANIMATION"; 1812672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung 18231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 18331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final String RUNTIME_STATE_CURRENT_SCREEN = "launcher.current_screen"; 184883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka // Type: int 185883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka private static final String RUNTIME_STATE = "launcher.state"; 18631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 1873d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung private static final String RUNTIME_STATE_PENDING_ADD_CONTAINER = "launcher.add_container"; 1883d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Type: int 18931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final String RUNTIME_STATE_PENDING_ADD_SCREEN = "launcher.add_screen"; 19031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 191fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_CELL_X = "launcher.add_cell_x"; 19231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: int 193fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_CELL_Y = "launcher.add_cell_y"; 19431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: boolean 19531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final String RUNTIME_STATE_PENDING_FOLDER_RENAME = "launcher.rename_folder"; 19631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Type: long 19731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final String RUNTIME_STATE_PENDING_FOLDER_RENAME_ID = "launcher.rename_folder_id"; 1989d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // Type: int 1999d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_SPAN_X = "launcher.add_span_x"; 2009d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // Type: int 2019d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_SPAN_Y = "launcher.add_span_y"; 2029d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // Type: parcelable 2039d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private static final String RUNTIME_STATE_PENDING_ADD_WIDGET_INFO = "launcher.add_widget_info"; 204c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // Type: parcelable 2054637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen private static final String RUNTIME_STATE_PENDING_ADD_WIDGET_ID = "launcher.add_widget_id"; 206c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // Type: int[] 207c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen private static final String RUNTIME_STATE_VIEW_IDS = "launcher.view_ids"; 20831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 209432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen static final String INTRO_SCREEN_DISMISSED = "launcher.intro_screen_dismissed"; 210b54a5989a21bef4e6bac304591ca4030bfbe709dAdam Cohen static final String FIRST_RUN_ACTIVITY_DISPLAYED = "launcher.first_run_activity_displayed"; 211b54a5989a21bef4e6bac304591ca4030bfbe709dAdam Cohen 212e441bbc7d2baee03e96897b80f55db5ce2aa7e1fBjorn Bringert private static final String TOOLBAR_ICON_METADATA_NAME = "com.android.launcher.toolbar_icon"; 213ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka private static final String TOOLBAR_SEARCH_ICON_METADATA_NAME = 214e441bbc7d2baee03e96897b80f55db5ce2aa7e1fBjorn Bringert "com.android.launcher.toolbar_search_icon"; 215ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka private static final String TOOLBAR_VOICE_SEARCH_ICON_METADATA_NAME = 216e441bbc7d2baee03e96897b80f55db5ce2aa7e1fBjorn Bringert "com.android.launcher.toolbar_voice_search_icon"; 217ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy 21839a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen public static final String SHOW_WEIGHT_WATCHER = "debug.show_mem"; 2196053b8007ed22fba6a62a9238aad6d0a42229faeDaniel Sandler public static final boolean SHOW_WEIGHT_WATCHER_DEFAULT = false; 22039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 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. */ 2244a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung private enum State { NONE, WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED }; 225c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka private State mState = State.WORKSPACE; 226c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka private AnimatorSet mStateAnimation; 2276b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy 228c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal private boolean mIsSafeModeEnabled; 229c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal 2309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato static final int APPWIDGET_HOST_ID = 1024; 231ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300; 232ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500; 233646fdf70b45f330a02104106a65ab7a529e70c6eAdam Cohen private static final int ACTIVITY_START_DELAY = 1000; 23431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 23531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final Object sLock = new Object(); 2363a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron private static int sScreen = DEFAULT_SCREEN; 23731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 238c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen private HashMap<Integer, Integer> mItemIdToViewId = new HashMap<Integer, Integer>(); 239c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); 240c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen 241a2413751e3a698aef9c87411a639637883856939Winson Chung // How long to wait before the new-shortcut animation automatically pans the workspace 24294d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung private static int NEW_APPS_PAGE_MOVE_DELAY = 500; 24394d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung private static int NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS = 5; 24464359a53dc827797917a8d9a0697a91996789801Winson Chung private static int NEW_APPS_ANIMATION_DELAY = 500; 245a2413751e3a698aef9c87411a639637883856939Winson Chung 2462ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato private final BroadcastReceiver mCloseSystemDialogsReceiver 2472ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato = new CloseSystemDialogsIntentReceiver(); 2481e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private final ContentObserver mWidgetObserver = new AppWidgetResetObserver(); 2491e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 25031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private LayoutInflater mInflater; 25131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 25231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Workspace mWorkspace; 253360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner private View mLauncherView; 254a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private View mPageIndicators; 255b737ee6ab2dc4938a1b2a574c336af0eab826712Michael Jurka private DragLayer mDragLayer; 256b737ee6ab2dc4938a1b2a574c336af0eab826712Michael Jurka private DragController mDragController; 25739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen private View mWeightWatcher; 258a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private LauncherClings mLauncherClings; 259cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2607376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private AppWidgetManager mAppWidgetManager; 2617376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project private LauncherAppWidgetHost mAppWidgetHost; 262cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 263c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka private ItemInfo mPendingAddInfo = new ItemInfo(); 2649d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen private AppWidgetProviderInfo mPendingAddWidgetInfo; 2654637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen private int mPendingAddWidgetId = -1; 2669d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen 2670280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka private int[] mTmpAddItemCellCoordinates = new int[2]; 2680280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 26931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private FolderInfo mFolderInfo; 27031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2713d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung private Hotseat mHotseat; 272d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi private ViewGroup mOverviewPanel; 273f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 274f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung private View mAllAppsButton; 2753d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 276c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung private SearchDropTargetBar mSearchDropTargetBar; 277785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung private AppsCustomizeTabHost mAppsCustomizeTabHost; 278785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung private AppsCustomizePagedView mAppsCustomizeContent; 279ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private boolean mAutoAdvanceRunning = false; 28024ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen private View mQsb; 2812b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy 28231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Bundle mSavedState; 2834a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // We set the state in both onCreate and then onNewIntent in some cases, which causes both 2844a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // scroll issues (because the workspace may not have been measured yet) and extra work. 2854a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // Instead, just save the state that we need to restore Launcher to, and commit it in onResume. 2864a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung private State mOnResumeState = State.NONE; 28731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 28831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private SpannableStringBuilder mDefaultKeySsb = null; 28931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private boolean mWorkspaceLoading = true; 2919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 29234a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato private boolean mPaused = true; 29331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean mRestoring; 29431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean mWaitingForResult; 295ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato private boolean mOnResumeNeedsLoad; 29631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2971e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka private ArrayList<Runnable> mBindOnResumeCallbacks = new ArrayList<Runnable>(); 2987607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka private ArrayList<Runnable> mOnResumeCallbacks = new ArrayList<Runnable>(); 2997607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka 30031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Bundle mSavedInstanceState; 30131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3029c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private LauncherModel mModel; 3030589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato private IconCache mIconCache; 304d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen private boolean mUserPresent = true; 305d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen private boolean mVisible = false; 306ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen private boolean mHasFocus = false; 307d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen private boolean mAttached = false; 3089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 309319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick private static LocaleConfiguration sLocaleConfiguration = null; 310319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 311319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick private static HashMap<Long, FolderInfo> sFolders = new HashMap<Long, FolderInfo>(); 312cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 31361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen private View.OnTouchListener mHapticFeedbackTouchListener; 31461f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 315ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen // Related to the auto-advancing of widgets 316ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final int ADVANCE_MSG = 1; 317ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final int mAdvanceInterval = 20000; 318ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final int mAdvanceStagger = 250; 319ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private long mAutoAdvanceSentTime; 320ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private long mAutoAdvanceTimeLeft = -1; 321ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private HashMap<View, AppWidgetProviderInfo> mWidgetsToAdvance = 322ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen new HashMap<View, AppWidgetProviderInfo>(); 323ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 324400438b79fe412cb625c96297edeea9c6155349eWinson Chung // Determines how long to wait after a rotation before restoring the screen orientation to 325400438b79fe412cb625c96297edeea9c6155349eWinson Chung // match the sensor state. 326400438b79fe412cb625c96297edeea9c6155349eWinson Chung private final int mRestoreScreenOrientationDelay = 500; 327400438b79fe412cb625c96297edeea9c6155349eWinson Chung 3284ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka // External icons saved in case of resource changes, orientation, etc. 329dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung private static Drawable.ConstantState[] sGlobalSearchIcon = new Drawable.ConstantState[2]; 330dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung private static Drawable.ConstantState[] sVoiceSearchIcon = new Drawable.ConstantState[2]; 331dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2]; 3324ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 333d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung private Intent mAppMarketIntent = null; 334d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung private static final boolean DISABLE_MARKET_BUTTON = true; 335d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung 336360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner private Drawable mWorkspaceBackgroundDrawable; 337360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 3381462de39f01cec0ba785386532719cb0207dd827Adam Cohen private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>(); 3396e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung private static final boolean DISABLE_SYNCHRONOUS_BINDING_CURRENT_PAGE = false; 3401462de39f01cec0ba785386532719cb0207dd827Adam Cohen 34116d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen static final ArrayList<String> sDumpLogs = new ArrayList<String>(); 3424caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static Date sDateStamp = new Date(); 3434caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static DateFormat sDateFormat = 3444caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); 3454caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static long sRunStart = System.currentTimeMillis(); 3464caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen static final String CORRUPTION_EMAIL_SENT_KEY = "corruptionEmailSent"; 34716d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen 34846353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung // We only want to get the SharedPreferences once since it does an FS stat each time we get 34946353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung // it from the context. 35046353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung private SharedPreferences mSharedPrefs; 35146353de2ab5aa9db30af1b055ebb6faaf47bd2e9Winson Chung 352e25af795647a19f1a0d60bc4baea5a996d215fdfAdam Cohen private static ArrayList<ComponentName> mIntentsOnWorkspaceFromUpgradePath = null; 353e25af795647a19f1a0d60bc4baea5a996d215fdfAdam Cohen 354f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung // Holds the page that we need to animate to, and the icon views that we need to animate up 355f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung // when we scroll to that page on resume. 356268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private ImageView mFolderIconImageView; 357268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private Bitmap mFolderIconBitmap; 358268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private Canvas mFolderIconCanvas; 359268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private Rect mRectForFolderAnimation = new Rect(); 3602801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 361ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka private BubbleTextView mWaitingForResume; 362ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka 363c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka private Runnable mBuildLayersRunnable = new Runnable() { 364c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka public void run() { 3659d906c7742af73160df257a40a702e1cc4f87899Michael Jurka if (mWorkspace != null) { 3669d906c7742af73160df257a40a702e1cc4f87899Michael Jurka mWorkspace.buildPageHardwareLayers(); 3679d906c7742af73160df257a40a702e1cc4f87899Michael Jurka } 368c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka } 369c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka }; 370c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka 371db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private static PendingAddArguments sPendingAddItem; 372002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy 3737267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka public static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY); 3740a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka 375002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy private static class PendingAddArguments { 376002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int requestCode; 377002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy Intent intent; 3783d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung long container; 379dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen long screenId; 380002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int cellX; 381002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int cellY; 382db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen int appWidgetId; 383002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 384002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy 385ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler private Stats mStats; 386ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler 38716f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal static boolean isPropertyEnabled(String propertyName) { 3880a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka return Log.isLoggable(propertyName, Log.VERBOSE); 3899bc8eba3338455c5d915055e8ba044981c512dfaMichael Jurka } 3909bc8eba3338455c5d915055e8ba044981c512dfaMichael Jurka 39131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 39231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 393a2413751e3a698aef9c87411a639637883856939Winson Chung if (DEBUG_STRICT_MODE) { 394a2413751e3a698aef9c87411a639637883856939Winson Chung StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 395a2413751e3a698aef9c87411a639637883856939Winson Chung .detectDiskReads() 396a2413751e3a698aef9c87411a639637883856939Winson Chung .detectDiskWrites() 397a2413751e3a698aef9c87411a639637883856939Winson Chung .detectNetwork() // or .detectAll() for all detectable problems 398a2413751e3a698aef9c87411a639637883856939Winson Chung .penaltyLog() 399a2413751e3a698aef9c87411a639637883856939Winson Chung .build()); 400a2413751e3a698aef9c87411a639637883856939Winson Chung StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 401a2413751e3a698aef9c87411a639637883856939Winson Chung .detectLeakedSqlLiteObjects() 402a2413751e3a698aef9c87411a639637883856939Winson Chung .detectLeakedClosableObjects() 403a2413751e3a698aef9c87411a639637883856939Winson Chung .penaltyLog() 404a2413751e3a698aef9c87411a639637883856939Winson Chung .penaltyDeath() 405a2413751e3a698aef9c87411a639637883856939Winson Chung .build()); 406a2413751e3a698aef9c87411a639637883856939Winson Chung } 407a2413751e3a698aef9c87411a639637883856939Winson Chung 40831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onCreate(savedInstanceState); 409e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler 410e060b0b3c72b93b47031f0f33bf18b121fb99333Daniel Sandler LauncherAppState.setApplicationContext(getApplicationContext()); 411cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherAppState app = LauncherAppState.getInstance(); 41267e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal LauncherAppState.getLauncherProvider().setLauncherProviderChangeListener(this); 4135f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Determine the dynamic grid properties 4145f8afe6280eae34620067696173e71943e1a30a3Winson Chung Point smallestSize = new Point(); 4155f8afe6280eae34620067696173e71943e1a30a3Winson Chung Point largestSize = new Point(); 4165f8afe6280eae34620067696173e71943e1a30a3Winson Chung Point realSize = new Point(); 4175f8afe6280eae34620067696173e71943e1a30a3Winson Chung Display display = getWindowManager().getDefaultDisplay(); 4185f8afe6280eae34620067696173e71943e1a30a3Winson Chung display.getCurrentSizeRange(smallestSize, largestSize); 4195f8afe6280eae34620067696173e71943e1a30a3Winson Chung display.getRealSize(realSize); 420892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung DisplayMetrics dm = new DisplayMetrics(); 421892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung display.getMetrics(dm); 4226e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung 4235f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Lazy-initialize the dynamic grid 4245f8afe6280eae34620067696173e71943e1a30a3Winson Chung DeviceProfile grid = app.initDynamicGrid(this, 4255f8afe6280eae34620067696173e71943e1a30a3Winson Chung Math.min(smallestSize.x, smallestSize.y), 4265f8afe6280eae34620067696173e71943e1a30a3Winson Chung Math.min(largestSize.x, largestSize.y), 427892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung realSize.x, realSize.y, 428892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung dm.widthPixels, dm.heightPixels); 4295f8afe6280eae34620067696173e71943e1a30a3Winson Chung 4305f8afe6280eae34620067696173e71943e1a30a3Winson Chung // the LauncherApplication should call this, but in case of Instrumentation it might not be present yet 431cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler mSharedPrefs = getSharedPreferences(LauncherAppState.getSharedPreferencesKey(), 432f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung Context.MODE_PRIVATE); 433c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal mIsSafeModeEnabled = getPackageManager().isSafeMode(); 4340589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mModel = app.setLauncher(this); 4350589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mIconCache = app.getIconCache(); 436e5467dccdd26ff912afb43d626346e4506c9c062Winson Chung mIconCache.flushInvalidIcons(grid); 43741a12d225a546b0a193628a4e5dd6b62cc60b7d0Joe Onorato mDragController = new DragController(this); 438a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings = new LauncherClings(this); 43931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mInflater = getLayoutInflater(); 440cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 441ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler mStats = new Stats(this); 442ff02d49e464c2fe92ba625a3046f31aa042e5d32Daniel Sandler 4437376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetManager = AppWidgetManager.getInstance(this); 44453805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen 4457376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID); 4467376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetHost.startListening(); 447cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 448b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung // If we are getting an onCreate, we can actually preempt onResume and unset mPaused here, 449b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung // this also ensures that any synchronous binding below doesn't re-trigger another 450b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung // LauncherModel load. 451b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung mPaused = false; 452b8b2a5aa45d82ce81301250707bc373e1da4aa14Winson Chung 45331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (PROFILE_STARTUP) { 4540fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer android.os.Debug.startMethodTracing( 4550fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer Environment.getExternalStorageDirectory() + "/launcher"); 45631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 45731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 45853805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen 45931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project checkForLocaleChange(); 46031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project setContentView(R.layout.launcher); 4617267fa58693549894999db17359ce26f8bc7b4a7Michael Jurka 46231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project setupViews(); 463476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu grid.layout(this); 46431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4651e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey registerContentObservers(); 4661e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 4677c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato lockAllApps(); 4687404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato 46931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mSavedState = savedInstanceState; 47031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project restoreState(mSavedState); 47131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 47231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (PROFILE_STARTUP) { 47331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project android.os.Debug.stopMethodTracing(); 47431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 47531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 47631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mRestoring) { 477db78dc8a0aeac2e18c995ed5b7e92b963fca18e5Adam Cohen if (DISABLE_SYNCHRONOUS_BINDING_CURRENT_PAGE) { 4784a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // If the user leaves launcher, then we should just load items asynchronously when 4794a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // they return. 4807aff399974c756930070d82d7b2df88f125dacd6Derek Prothro mModel.startLoader(true, PagedView.INVALID_RESTORE_PAGE); 4814a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } else { 4824a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // We only load the page synchronously if the user rotates (or triggers a 4834a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // configuration change) while launcher is in the foreground 4849b9fb967b2305413520dc676d6d3c472b2b6b25eWinson Chung mModel.startLoader(true, mWorkspace.getRestorePage()); 4854a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } 48631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 48731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 48831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // For handling default keys 48931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mDefaultKeySsb = new SpannableStringBuilder(); 49031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Selection.setSelection(mDefaultKeySsb, 0); 49134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato 49234a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 49334a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato registerReceiver(mCloseSystemDialogsReceiver, filter); 4944ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 495f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen updateGlobalIcons(); 496f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen 497f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen // On large interfaces, we want the screen to auto-rotate based on the current orientation 498f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen unlockScreenOrientation(true); 499af40f205d7f0c5f73a92ff5d9b8e9602dbde58c0Winson Chung 500432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen if (shouldShowIntroScreen()) { 501432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen showIntroScreen(); 502432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } else { 503432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen showFirstRunActivity(); 504432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 505432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 506e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung // The two first run cling paths are mutually exclusive, if the launcher is preinstalled 507e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung // on the device, then we always show the first run cling experience (or if there is no 508e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung // launcher2). Otherwise, we prompt the user upon started for migration 509e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung if (mLauncherClings.shouldShowFirstRunOrMigrationClings()) { 510e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung if (mModel.canMigrateFromOldLauncherDb(this)) { 511e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung mLauncherClings.showMigrationCling(); 512e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } else { 513e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung mLauncherClings.showFirstRunCling(); 514e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 515a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } else { 516e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung mLauncherClings.removeFirstRunAndMigrationClings(); 517a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 518f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen } 519f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen 52067e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal @Override 52167e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal public void onLauncherProviderChange() { } 52267e7cae5ad97ec5702bbd739c4272e3cfa17556dAnjali Koppal 52398ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung /** To be overriden by subclasses to hint to Launcher that we have custom content */ 52498ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung protected boolean hasCustomContentToLeft() { 52598ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung return false; 52698ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung } 52798ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung 528a888158880fea53479447d883391f552604e46b6Dave Hawkey /** 529dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro * To be overridden by subclasses to populate the custom content container and call 530a888158880fea53479447d883391f552604e46b6Dave Hawkey * {@link #addToCustomContentPage}. This will only be invoked if 531a888158880fea53479447d883391f552604e46b6Dave Hawkey * {@link #hasCustomContentToLeft()} is {@code true}. 532a888158880fea53479447d883391f552604e46b6Dave Hawkey */ 533dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro protected void populateCustomContentContainer() { 534a888158880fea53479447d883391f552604e46b6Dave Hawkey } 535a888158880fea53479447d883391f552604e46b6Dave Hawkey 536a888158880fea53479447d883391f552604e46b6Dave Hawkey /** 537a888158880fea53479447d883391f552604e46b6Dave Hawkey * Invoked by subclasses to signal a change to the {@link #addCustomContentToLeft} value to 538a888158880fea53479447d883391f552604e46b6Dave Hawkey * ensure the custom content page is added or removed if necessary. 539a888158880fea53479447d883391f552604e46b6Dave Hawkey */ 540a888158880fea53479447d883391f552604e46b6Dave Hawkey protected void invalidateHasCustomContentToLeft() { 5413a733a77e32ea112516b4a7ef0b571d6bcc51315Dave Hawkey if (mWorkspace == null || mWorkspace.getScreenOrder().isEmpty()) { 542a888158880fea53479447d883391f552604e46b6Dave Hawkey // Not bound yet, wait for bindScreens to be called. 543a888158880fea53479447d883391f552604e46b6Dave Hawkey return; 544a888158880fea53479447d883391f552604e46b6Dave Hawkey } 545a888158880fea53479447d883391f552604e46b6Dave Hawkey 546a888158880fea53479447d883391f552604e46b6Dave Hawkey if (!mWorkspace.hasCustomContent() && hasCustomContentToLeft()) { 547a888158880fea53479447d883391f552604e46b6Dave Hawkey // Create the custom content page and call the subclass to populate it. 548dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro mWorkspace.createCustomContentContainer(); 549dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro populateCustomContentContainer(); 550a888158880fea53479447d883391f552604e46b6Dave Hawkey } else if (mWorkspace.hasCustomContent() && !hasCustomContentToLeft()) { 551a888158880fea53479447d883391f552604e46b6Dave Hawkey mWorkspace.removeCustomContentPage(); 552a888158880fea53479447d883391f552604e46b6Dave Hawkey } 553a888158880fea53479447d883391f552604e46b6Dave Hawkey } 554a888158880fea53479447d883391f552604e46b6Dave Hawkey 555f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen private void updateGlobalIcons() { 556c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung boolean searchVisible = false; 557c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung boolean voiceVisible = false; 5584ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka // If we have a saved version of these external icons, we load them up immediately 559dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung int coi = getCurrentOrientationIndexForGlobalIcons(); 560dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung if (sGlobalSearchIcon[coi] == null || sVoiceSearchIcon[coi] == null || 561dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung sAppMarketIcon[coi] == null) { 562d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON) { 563d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung updateAppMarketIcon(); 564d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } 565c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung searchVisible = updateGlobalSearchIcon(); 566c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung voiceVisible = updateVoiceSearchIcon(searchVisible); 567f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 568dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung if (sGlobalSearchIcon[coi] != null) { 569dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung updateGlobalSearchIcon(sGlobalSearchIcon[coi]); 570c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung searchVisible = true; 571f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 572dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung if (sVoiceSearchIcon[coi] != null) { 573dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung updateVoiceSearchIcon(sVoiceSearchIcon[coi]); 574c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung voiceVisible = true; 575f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 576d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON && sAppMarketIcon[coi] != null) { 577dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung updateAppMarketIcon(sAppMarketIcon[coi]); 5784ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 579adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 580adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible); 581adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 58231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 583cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 58431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void checkForLocaleChange() { 585319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick if (sLocaleConfiguration == null) { 586319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick new AsyncTask<Void, Void, LocaleConfiguration>() { 587319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick @Override 588319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick protected LocaleConfiguration doInBackground(Void... unused) { 589319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick LocaleConfiguration localeConfiguration = new LocaleConfiguration(); 590319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick readConfiguration(Launcher.this, localeConfiguration); 591319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick return localeConfiguration; 592319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 593319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 594319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick @Override 595319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick protected void onPostExecute(LocaleConfiguration result) { 596319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration = result; 597319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick checkForLocaleChange(); // recursive, but now with a locale configuration 598319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 599319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick }.execute(); 600319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick return; 601319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 602fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams 60331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final Configuration configuration = getResources().getConfiguration(); 60431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 605319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final String previousLocale = sLocaleConfiguration.locale; 60631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final String locale = configuration.locale.toString(); 60731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 608319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final int previousMcc = sLocaleConfiguration.mcc; 60931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int mcc = configuration.mcc; 61031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 611319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final int previousMnc = sLocaleConfiguration.mnc; 61231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int mnc = configuration.mnc; 61331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 61484f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy boolean localeChanged = !locale.equals(previousLocale) || mcc != previousMcc || mnc != previousMnc; 61531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 61684f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy if (localeChanged) { 617319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration.locale = locale; 618319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration.mcc = mcc; 619319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sLocaleConfiguration.mnc = mnc; 62098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 6210589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mIconCache.flush(); 622319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 623319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick final LocaleConfiguration localeConfiguration = sLocaleConfiguration; 6244346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka new AsyncTask<Void, Void, Void>() { 6254346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka public Void doInBackground(Void ... args) { 626319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick writeConfiguration(Launcher.this, localeConfiguration); 6274346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka return null; 628319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 6294346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); 63098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 63198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 63298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 63398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy private static class LocaleConfiguration { 63498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public String locale; 63598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public int mcc = -1; 63698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public int mnc = -1; 63798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 638fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams 63998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy private static void readConfiguration(Context context, LocaleConfiguration configuration) { 64098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy DataInputStream in = null; 64198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 64298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy in = new DataInputStream(context.openFileInput(PREFERENCES)); 64398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy configuration.locale = in.readUTF(); 64498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy configuration.mcc = in.readInt(); 64598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy configuration.mnc = in.readInt(); 64698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (FileNotFoundException e) { 64798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 64898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 64998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 65098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } finally { 65198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (in != null) { 65298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 65398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy in.close(); 65498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 65598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 65698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 65798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 65898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 65998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 66098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 66198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy private static void writeConfiguration(Context context, LocaleConfiguration configuration) { 66298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy DataOutputStream out = null; 66398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 66498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out = new DataOutputStream(context.openFileOutput(PREFERENCES, MODE_PRIVATE)); 66598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.writeUTF(configuration.locale); 66698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.writeInt(configuration.mcc); 66798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.writeInt(configuration.mnc); 66898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.flush(); 66998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (FileNotFoundException e) { 67098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 67198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 67298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy //noinspection ResultOfMethodCallIgnored 67398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy context.getFileStreamPath(PREFERENCES).delete(); 67498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } finally { 67598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (out != null) { 67698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy try { 67798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy out.close(); 67898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } catch (IOException e) { 67998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy // Ignore 68098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 68198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 68231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 68331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 68431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 685a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson public Stats getStats() { 686a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson return mStats; 687a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson } 688a2f665f4f7dc60aa0ea97e20027a79e796241356Anton Hansson 689c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert public LayoutInflater getInflater() { 690c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert return mInflater; 691c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 692c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 69336a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung boolean isDraggingEnabled() { 69436a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung // We prevent dragging when we are loading the workspace as it is possible to pick up a view 69536a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung // that is subsequently removed from the workspace in startBinding(). 69636a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung return !mModel.isLoadingWorkspace(); 69736a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung } 69836a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung 69931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static int getScreen() { 70031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project synchronized (sLock) { 70131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return sScreen; 70231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 70331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 70431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 70531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void setScreen(int screen) { 70631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project synchronized (sLock) { 70731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project sScreen = screen; 70831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 70931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 71031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 711557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung /** 712c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen * Copied from View -- the View version of the method isn't called 713c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen * anywhere else in our process and only exists for API level 17+, 714c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen * so it's ok to keep our own version with no API requirement. 715c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen */ 716c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen public static int generateViewId() { 717c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen for (;;) { 718c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen final int result = sNextGeneratedId.get(); 719c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // aapt-generated IDs have the high byte nonzero; clamp to the range under that. 720c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen int newValue = result + 1; 721c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. 722c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen if (sNextGeneratedId.compareAndSet(result, newValue)) { 723c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen return result; 724c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 725c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 726c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 727c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen 728c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen public int getViewIdForItem(ItemInfo info) { 729c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen // This cast is safe given the > 2B range for int. 730c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen int itemId = (int) info.id; 731c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen if (mItemIdToViewId.containsKey(itemId)) { 732c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen return mItemIdToViewId.get(itemId); 733c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 734c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen int viewId = generateViewId(); 735c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen mItemIdToViewId.put(itemId, viewId); 736c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen return viewId; 737c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen } 738c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen 739c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen /** 740557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung * Returns whether we should delay spring loaded mode -- for shortcuts and widgets that have 741557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung * a configuration step, this allows the proper animations to run after other transitions. 742557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung */ 743db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private long completeAdd(PendingAddArguments args) { 744db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 745db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen long screenId = ensurePendingDropLayoutExists(args.screenId); 746002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy switch (args.requestCode) { 747002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy case REQUEST_CREATE_SHORTCUT: 748db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen completeAddShortcut(args.intent, args.container, screenId, args.cellX, 7493d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung args.cellY); 750b8472bb83cd96456a543137e1e56d589171934c3Winson Chung break; 751002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy case REQUEST_CREATE_APPWIDGET: 752db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen completeAddAppWidget(args.appWidgetId, args.container, screenId, null, null); 753b8472bb83cd96456a543137e1e56d589171934c3Winson Chung break; 754002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 75527614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka // Before adding this resetAddInfo(), after a shortcut was added to a workspace screen, 75627614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka // if you turned the screen off and then back while in All Apps, Launcher would not 75727614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka // return to the workspace. Clearing mAddInfo.container here fixes this issue 75827614d22a159cf376605ebf68b51a5c45964abd9Michael Jurka resetAddInfo(); 759db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return screenId; 760002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 761002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy 76231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 7638b805b17158886035b38261eb611d8641701ae43Michael Jurka protected void onActivityResult( 7648b805b17158886035b38261eb611d8641701ae43Michael Jurka final int requestCode, final int resultCode, final Intent data) { 765e341d30a13c37ef321aee841592d7d58fe3818d9Winson Chung // Reset the startActivity waiting flag 766ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(false); 767db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final int pendingAddWidgetId = mPendingAddWidgetId; 7684637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mPendingAddWidgetId = -1; 769e341d30a13c37ef321aee841592d7d58fe3818d9Winson Chung 770ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen Runnable exitSpringLoaded = new Runnable() { 771ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen @Override 772ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public void run() { 773ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), 774ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, null); 775ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 776ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }; 777ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen 7788b805b17158886035b38261eb611d8641701ae43Michael Jurka if (requestCode == REQUEST_BIND_APPWIDGET) { 779ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen final int appWidgetId = data != null ? 7808b805b17158886035b38261eb611d8641701ae43Michael Jurka data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) : -1; 7818b805b17158886035b38261eb611d8641701ae43Michael Jurka if (resultCode == RESULT_CANCELED) { 7828b805b17158886035b38261eb611d8641701ae43Michael Jurka completeTwoStageWidgetDrop(RESULT_CANCELED, appWidgetId); 783689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, 784ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 7858b805b17158886035b38261eb611d8641701ae43Michael Jurka } else if (resultCode == RESULT_OK) { 786ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen addAppWidgetImpl(appWidgetId, mPendingAddInfo, null, 787ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen mPendingAddWidgetInfo, ON_ACTIVITY_RESULT_ANIMATION_DELAY); 7888b805b17158886035b38261eb611d8641701ae43Michael Jurka } 7898b805b17158886035b38261eb611d8641701ae43Michael Jurka return; 790336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka } else if (requestCode == REQUEST_PICK_WALLPAPER) { 791336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka if (resultCode == RESULT_OK && mWorkspace.isInOverviewMode()) { 792336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka mWorkspace.exitOverviewMode(false); 793336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka } 794336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka return; 7958b805b17158886035b38261eb611d8641701ae43Michael Jurka } 796336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka 797ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen boolean isWidgetDrop = (requestCode == REQUEST_PICK_APPWIDGET || 798ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen requestCode == REQUEST_CREATE_APPWIDGET); 799aad5ef44c665fc4ce143a61c009dc04be3ab0437Romain Guy 800db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final boolean workspaceLocked = isWorkspaceLocked(); 801ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen // We have special handling for widgets 802ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (isWidgetDrop) { 8034637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen final int appWidgetId; 8044637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen int widgetId = data != null ? data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) 8054637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen : -1; 8064637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen if (widgetId < 0) { 8074637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen appWidgetId = pendingAddWidgetId; 8084637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen } else { 8094637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen appWidgetId = widgetId; 8104637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen } 8114637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen 812ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen final int result; 813f0129b13d1edac399c02dbd93f574a7e3f873525Adam Cohen if (appWidgetId < 0 || resultCode == RESULT_CANCELED) { 814db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen Log.e(TAG, "Error: appWidgetId (EXTRA_APPWIDGET_ID) was not " + 815db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen "returned from the widget configuration activity."); 816ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen result = RESULT_CANCELED; 817ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen completeTwoStageWidgetDrop(result, appWidgetId); 818db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final Runnable onComplete = new Runnable() { 819ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen @Override 820ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public void run() { 821ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed(false, 0, null); 822ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 823ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }; 824db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (workspaceLocked) { 825db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // No need to remove the empty screen if we're mid-binding, as the 826db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // the bind will not add the empty screen. 827db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.postDelayed(onComplete, ON_ACTIVITY_RESULT_ANIMATION_DELAY); 828db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } else { 829db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, 830db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 831db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 8325aaab774cfb83833197dac553d4a6eb769032146Winson Chung } else { 833db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (!workspaceLocked) { 834db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mPendingAddInfo.screenId = ensurePendingDropLayoutExists(mPendingAddInfo.screenId); 835db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final CellLayout dropLayout = mWorkspace.getScreenWithId(mPendingAddInfo.screenId); 836db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 837db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen dropLayout.setDropPending(true); 838db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final Runnable onComplete = new Runnable() { 839db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen @Override 840db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen public void run() { 841db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen completeTwoStageWidgetDrop(resultCode, appWidgetId); 842db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen dropLayout.setDropPending(false); 843db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 844db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen }; 845db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, 846db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 847db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } else { 848db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen PendingAddArguments args = preparePendingAddArgs(requestCode, data, appWidgetId, 849db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mPendingAddInfo); 850db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen sPendingAddItem = args; 851db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 8525aaab774cfb83833197dac553d4a6eb769032146Winson Chung } 853ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen return; 854ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 855ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 85631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // The pattern used here is that a user PICKs a specific application, 85731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // which, depending on the target, might need to CREATE the actual target. 858cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 85931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // For example, the user would PICK_SHORTCUT for "Music playlist", and we 86031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // launch over to the Music app to actually CREATE_SHORTCUT. 861c7da555dc5b252042dff0a6920efb1bfeb4a0c9aWinson Chung if (resultCode == RESULT_OK && mPendingAddInfo.container != ItemInfo.NO_ID) { 862db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final PendingAddArguments args = preparePendingAddArgs(requestCode, data, -1, 863db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mPendingAddInfo); 864002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy if (isWorkspaceLocked()) { 865db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen sPendingAddItem = args; 866002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } else { 867ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen completeAdd(args); 868db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, 869db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 87031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 8710007472e20e02589a6305e1aeaa70770963ebec7Adam Cohen } else if (resultCode == RESULT_CANCELED) { 872689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, exitSpringLoaded, 873ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen ON_ACTIVITY_RESULT_ANIMATION_DELAY, false); 87431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 875ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mDragLayer.clearAnimatedView(); 876ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 877ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 878db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private PendingAddArguments preparePendingAddArgs(int requestCode, Intent data, int 879db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen appWidgetId, ItemInfo info) { 880db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen PendingAddArguments args = new PendingAddArguments(); 881db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.requestCode = requestCode; 882db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.intent = data; 883db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.container = info.container; 884db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.screenId = info.screenId; 885db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.cellX = info.cellX; 886db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.cellY = info.cellY; 887db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen args.appWidgetId = appWidgetId; 888db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return args; 889db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 890db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 891db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen /** 892db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * Check to see if a given screen id exists. If not, create it at the end, return the new id. 893db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * 894db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * @param screenId the screen id to check 895db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen * @return the new screen, or screenId if it exists 896db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen */ 897db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen private long ensurePendingDropLayoutExists(long screenId) { 898db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen CellLayout dropLayout = 899db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen (CellLayout) mWorkspace.getScreenWithId(screenId); 900db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (dropLayout == null) { 901db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // it's possible that the add screen was removed because it was 902db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // empty and a re-bind occurred 903db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.addExtraEmptyScreen(); 904db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return mWorkspace.commitExtraEmptyScreen(); 905db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } else { 906db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen return screenId; 907db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 908db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 909db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 910ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen private void completeTwoStageWidgetDrop(final int resultCode, final int appWidgetId) { 9118b805b17158886035b38261eb611d8641701ae43Michael Jurka CellLayout cellLayout = 912dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen (CellLayout) mWorkspace.getScreenWithId(mPendingAddInfo.screenId); 913ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen Runnable onCompleteRunnable = null; 914ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen int animationType = 0; 915ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 9169d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen AppWidgetHostView boundWidget = null; 917ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (resultCode == RESULT_OK) { 918ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION; 919ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen final AppWidgetHostView layout = mAppWidgetHost.createView(this, appWidgetId, 9209d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo); 9219d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen boundWidget = layout; 922ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen onCompleteRunnable = new Runnable() { 923ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen @Override 924ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen public void run() { 925ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen completeAddAppWidget(appWidgetId, mPendingAddInfo.container, 926dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId, layout, null); 927ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), 928ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, null); 929ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 930ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen }; 931ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } else if (resultCode == RESULT_CANCELED) { 9324637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mAppWidgetHost.deleteAppWidgetId(appWidgetId); 933ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen animationType = Workspace.CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION; 934ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 9359d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen if (mDragLayer.getAnimatedView() != null) { 9369d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mWorkspace.animateWidgetDrop(mPendingAddInfo, cellLayout, 9379d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen (DragView) mDragLayer.getAnimatedView(), onCompleteRunnable, 9389d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen animationType, boundWidget, true); 939ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } else if (onCompleteRunnable != null) { 9409d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // The animated view may be null in the case of a rotation during widget configuration 9419d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen onCompleteRunnable.run(); 9429d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen } 94331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 94431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 94531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 946cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka protected void onStop() { 947cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka super.onStop(); 948cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka FirstFrameAnimatorHelper.setIsVisible(false); 949cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka } 950cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka 951cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka @Override 952cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka protected void onStart() { 953cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka super.onStart(); 954cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka FirstFrameAnimatorHelper.setIsVisible(true); 955cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka } 956cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka 957cd496d723ca6b4b100771ae66f09007e7acf0d17Michael Jurka @Override 95831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onResume() { 959447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka long startTime = 0; 960447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 961447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka startTime = System.currentTimeMillis(); 962924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler Log.v(TAG, "Launcher.onResume()"); 963447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 96431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onResume(); 965f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung 9664a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung // Restore the previous launcher state 9674a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung if (mOnResumeState == State.WORKSPACE) { 9684a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung showWorkspace(false); 9694a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } else if (mOnResumeState == State.APPS_CUSTOMIZE) { 97007e045c63775c944f00da037b5d9cfc31e6028dcWinson Chung showAllApps(false, mAppsCustomizeContent.getContentType(), false); 9714a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung } 9724a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung mOnResumeState = State.NONE; 9734a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung 974360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner // Background was set to gradient in onPause(), restore to black if in all apps. 975360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner setWorkspaceBackground(mState == State.WORKSPACE); 976360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 97734a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato mPaused = false; 978ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (mRestoring || mOnResumeNeedsLoad) { 979ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWorkspaceLoading(true); 9807aff399974c756930070d82d7b2df88f125dacd6Derek Prothro mModel.startLoader(true, PagedView.INVALID_RESTORE_PAGE); 9819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mRestoring = false; 982ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mOnResumeNeedsLoad = false; 98331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 9841e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka if (mBindOnResumeCallbacks.size() > 0) { 985c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka // We might have postponed some bind calls until onResume (see waitUntilResume) -- 986c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka // execute them here 987c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka long startTimeCallbacks = 0; 988c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (DEBUG_RESUME_TIME) { 989c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka startTimeCallbacks = System.currentTimeMillis(); 990c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 991c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka 992c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (mAppsCustomizeContent != null) { 993c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka mAppsCustomizeContent.setBulkBind(true); 994c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 9951e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka for (int i = 0; i < mBindOnResumeCallbacks.size(); i++) { 9961e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.get(i).run(); 997c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 998c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (mAppsCustomizeContent != null) { 999c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka mAppsCustomizeContent.setBulkBind(false); 1000c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 10011e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.clear(); 1002c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (DEBUG_RESUME_TIME) { 1003c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka Log.d(TAG, "Time spent processing callbacks in onResume: " + 1004c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka (System.currentTimeMillis() - startTimeCallbacks)); 1005c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 1006447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 10075455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka if (mOnResumeCallbacks.size() > 0) { 10085455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka for (int i = 0; i < mOnResumeCallbacks.size(); i++) { 10095455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka mOnResumeCallbacks.get(i).run(); 10105455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka } 10115455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka mOnResumeCallbacks.clear(); 10125455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka } 1013e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung 1014e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // Reset the pressed state of icons that were locked in the press state while activities 1015e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // were launching 1016ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka if (mWaitingForResume != null) { 1017e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // Resets the previous workspace icon press state 1018ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka mWaitingForResume.setStayPressed(false); 1019ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka } 1020e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung if (mAppsCustomizeContent != null) { 1021e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung // Resets the previous all apps icon press state 1022e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung mAppsCustomizeContent.resetDrawableState(); 1023e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung } 102482963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung 102506dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // It is possible that widgets can receive updates while launcher is not in the foreground. 102606dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // Consequently, the widgets will be inflated in the orientation of the foreground activity 102706dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // (framework issue). On resuming, we ensure that any widgets are inflated for the current 102806dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // orientation. 10293d50932a93dd367537db3548bde29d1380b371c0Adam Cohen getWorkspace().reinflateWidgetsIfNecessary(); 1030f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen 1031780fe59a7af8b12fbdcd7f6841edaa7f2c2e019dWinson Chung // Process any items that were added while Launcher was away. 1032780fe59a7af8b12fbdcd7f6841edaa7f2c2e019dWinson Chung InstallShortcutReceiver.disableAndFlushInstallQueue(this); 1033780fe59a7af8b12fbdcd7f6841edaa7f2c2e019dWinson Chung 10345841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung // Update the voice search button proxy 10355841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung updateVoiceButtonProxyVisible(false); 10365841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung 1037f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen // Again, as with the above scenario, it's possible that one or more of the global icons 1038f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen // were updated in the wrong orientation. 1039f9426d5df0592a67c8a998d3ab445a3bb5eafc18Adam Cohen updateGlobalIcons(); 1040447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 1041447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime)); 1042447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 10436fecd410e8567af916b1bbd53198d9878c686177Adam Cohen 10446fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace.getCustomContentCallbacks() != null) { 10456fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // If we are resuming and the custom content is the current page, we call onShow(). 10466fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // It is also poassible that onShow will instead be called slightly after first layout 10476fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // if PagedView#setRestorePage was set to the custom content page in onCreate(). 10486fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace.isOnOrMovingToCustomContent()) { 10493a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek mWorkspace.getCustomContentCallbacks().onShow(true); 10506fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 10516fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 1052edaaa3023251eb2bd71e3da180df39334f77d4a8Adam Cohen mWorkspace.updateInteractionForState(); 105353805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen mWorkspace.onResume(); 105406dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen } 105506dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen 105631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 10577376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project protected void onPause() { 1058997a92348a6d6e061737399321393449c16cd4d8Winson Chung // Ensure that items added to Launcher are queued until Launcher returns 1059997a92348a6d6e061737399321393449c16cd4d8Winson Chung InstallShortcutReceiver.enableInstallQueue(); 1060997a92348a6d6e061737399321393449c16cd4d8Winson Chung 10617376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project super.onPause(); 1062ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mPaused = true; 106324b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato mDragController.cancelDrag(); 1064a2413751e3a698aef9c87411a639637883856939Winson Chung mDragController.resetLastGestureUpTime(); 10656fecd410e8567af916b1bbd53198d9878c686177Adam Cohen 10666fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // We call onHide() aggressively. The custom content callbacks should be able to 10676fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // debounce excess onHide calls. 10686fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace.getCustomContentCallbacks() != null) { 10696fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mWorkspace.getCustomContentCallbacks().onHide(); 10706fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 10717376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project } 1072cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1073bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen QSBScroller mQsbScroller = new QSBScroller() { 1074bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen int scrollY = 0; 1075bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1076bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen @Override 1077bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public void setScrollY(int scroll) { 1078bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen scrollY = scroll; 1079bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1080bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen if (mWorkspace.isOnOrMovingToCustomContent()) { 1081bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen mSearchDropTargetBar.setTranslationY(- scrollY); 1082d7dc681290d52a00cf8dd6664a8105cb1374a681Mark Brophy getQsbBar().setTranslationY(-scrollY); 1083bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1084bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1085bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen }; 1086bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1087bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public void resetQSBScroll() { 1088bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen mSearchDropTargetBar.animate().translationY(0).start(); 1089d7dc681290d52a00cf8dd6664a8105cb1374a681Mark Brophy getQsbBar().animate().translationY(0).start(); 1090bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1091bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1092bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public interface CustomContentCallbacks { 10933a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek // Custom content is completely shown. {@code fromResume} indicates whether this was caused 10943a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek // by a onResume or by scrolling otherwise. 10953a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek public void onShow(boolean fromResume); 1096bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1097bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen // Custom content is completely hidden 1098bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public void onHide(); 1099c36fa5ce395bd39d16f6a998372700ed53d5d9d6Adam Cohen 1100c36fa5ce395bd39d16f6a998372700ed53d5d9d6Adam Cohen // Custom content scroll progress changed. From 0 (not showing) to 1 (fully showing). 1101c36fa5ce395bd39d16f6a998372700ed53d5d9d6Adam Cohen public void onScrollProgressChanged(float progress); 11022ff91c46fa6f1b84fb08b6f31499934d30d8a91dJan-Willem Maarse 11032ff91c46fa6f1b84fb08b6f31499934d30d8a91dJan-Willem Maarse // Indicates whether the user is allowed to scroll away from the custom content. 11042ff91c46fa6f1b84fb08b6f31499934d30d8a91dJan-Willem Maarse boolean isScrollingAllowed(); 1105bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1106bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 1107d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi protected boolean hasSettings() { 1108d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi return false; 1109d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } 1110d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi 1111bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public interface QSBScroller { 1112bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen public void setScrollY(int scrollY); 1113bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen } 1114bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen 111598ca0f7203f66c491a5362c2f4db79547872bdfeWinson Chung public QSBScroller addToCustomContentPage(View customContent, 111653805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen CustomContentCallbacks callbacks, String description) { 111753805218809cc1f93a0f1307b442df7c65a3068cAdam Cohen mWorkspace.addToCustomContentPage(customContent, callbacks, description); 1118bffe745b1e195deedc1dcc60f37950b3b0b4c652Adam Cohen return mQsbScroller; 111966a01fd24bde7c94ea892b007df7f79fbaa43d80Adam Cohen } 112066a01fd24bde7c94ea892b007df7f79fbaa43d80Adam Cohen 1121edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen // The custom content needs to offset its content to account for the QSB 1122edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen public int getTopOffsetForCustomContent() { 1123edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen return mWorkspace.getPaddingTop(); 1124edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen } 1125edb4076e59861d0c343e7245f247e2bee6d48159Adam Cohen 112699c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey @Override 112799c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey public Object onRetainNonConfigurationInstance() { 11289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // Flag the loader to stop early before switching 11299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mModel.stopLoader(); 1130785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (mAppsCustomizeContent != null) { 1131785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mAppsCustomizeContent.surrender(); 1132785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 113313c2e7b788203f397085bef563bc5597e4c98028Romain Guy return Boolean.TRUE; 113499c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey } 11357376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project 11362d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato // We can't hide the IME if it was forced open. So don't bother 11372d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato @Override 11382d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato public void onWindowFocusChanged(boolean hasFocus) { 11392d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato super.onWindowFocusChanged(hasFocus); 1140ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen mHasFocus = hasFocus; 11412d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 11422d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato 114331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean acceptFilter() { 114431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final InputMethodManager inputManager = (InputMethodManager) 114531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project getSystemService(Context.INPUT_METHOD_SERVICE); 114631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return !inputManager.isFullscreenMode(); 114731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 114831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 114931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 115031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 115197d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final int uniChar = event.getUnicodeChar(); 115297d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final boolean handled = super.onKeyDown(keyCode, event); 115397d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final boolean isKeyNotWhitespace = uniChar > 0 && !Character.isWhitespace(uniChar); 115497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung if (!handled && acceptFilter() && isKeyNotWhitespace) { 115531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean gotKey = TextKeyListener.getInstance().onKeyDown(mWorkspace, mDefaultKeySsb, 115631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project keyCode, event); 115731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (gotKey && mDefaultKeySsb != null && mDefaultKeySsb.length() > 0) { 1158138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // something usable has been typed - start a search 1159cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy // the typed text will be retrieved and cleared by 1160138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // showSearchDialog() 1161138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // If there are multiple keystrokes before the search dialog takes focus, 1162138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // onSearchRequested() will be called for every keystroke, 1163138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // but it is idempotent, so it's fine. 1164138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return onSearchRequested(); 116531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 116631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 116731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11688a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato // Eat the long press event so the keyboard doesn't come up. 11698a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato if (keyCode == KeyEvent.KEYCODE_MENU && event.isLongPress()) { 11708a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato return true; 11718a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato } 11728a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato 117331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return handled; 117431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 117531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1176138a04170d964da9cdec228e95b976875ae52481Karl Rosaen private String getTypedText() { 1177138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return mDefaultKeySsb.toString(); 1178138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1179138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 1180138a04170d964da9cdec228e95b976875ae52481Karl Rosaen private void clearTypedText() { 1181138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mDefaultKeySsb.clear(); 1182138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mDefaultKeySsb.clearSpans(); 1183138a04170d964da9cdec228e95b976875ae52481Karl Rosaen Selection.setSelection(mDefaultKeySsb, 0); 1184138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1185138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 118631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 1187883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka * Given the integer (ordinal) value of a State enum instance, convert it to a variable of type 1188883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka * State 1189883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka */ 1190883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka private static State intToState(int stateOrdinal) { 1191883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka State state = State.WORKSPACE; 1192883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka final State[] stateValues = State.values(); 1193883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka for (int i = 0; i < stateValues.length; i++) { 1194883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka if (stateValues[i].ordinal() == stateOrdinal) { 1195883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka state = stateValues[i]; 1196883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka break; 1197883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 1198883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 1199883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka return state; 1200883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 1201883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka 1202883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka /** 120331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Restores the previous state, if it exists. 120431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 120531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param savedState The previous state. 120631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1207c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen @SuppressWarnings("unchecked") 120831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void restoreState(Bundle savedState) { 120931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (savedState == null) { 121031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 121131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 121231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1213883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka State state = intToState(savedState.getInt(RUNTIME_STATE, State.WORKSPACE.ordinal())); 1214f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (state == State.APPS_CUSTOMIZE) { 12154a2afa36553079e9f75fe7c8fcce863e84578e14Winson Chung mOnResumeState = State.APPS_CUSTOMIZE; 12163a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato } 12173a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato 121821cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, 121921cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen PagedView.INVALID_RESTORE_PAGE); 122021cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen if (currentScreen != PagedView.INVALID_RESTORE_PAGE) { 12218c87cd83e09cd361c68069c84940dbaf20e9860dWinson Chung mWorkspace.setRestorePage(currentScreen); 122231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 122331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 12243d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final long pendingAddContainer = savedState.getLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, -1); 1225dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen final long pendingAddScreen = savedState.getLong(RUNTIME_STATE_PENDING_ADD_SCREEN, -1); 12263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 12273d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (pendingAddContainer != ItemInfo.NO_ID && pendingAddScreen > -1) { 12283d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = pendingAddContainer; 1229dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = pendingAddScreen; 12303d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_X); 12313d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellY = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_Y); 12329d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddInfo.spanX = savedState.getInt(RUNTIME_STATE_PENDING_ADD_SPAN_X); 12339d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddInfo.spanY = savedState.getInt(RUNTIME_STATE_PENDING_ADD_SPAN_Y); 12349d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo = savedState.getParcelable(RUNTIME_STATE_PENDING_ADD_WIDGET_INFO); 12354637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mPendingAddWidgetId = savedState.getInt(RUNTIME_STATE_PENDING_ADD_WIDGET_ID); 1236ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(true); 123731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mRestoring = true; 123831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 123931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 124031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean renameFolder = savedState.getBoolean(RUNTIME_STATE_PENDING_FOLDER_RENAME, false); 124131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (renameFolder) { 124231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long id = savedState.getLong(RUNTIME_STATE_PENDING_FOLDER_RENAME_ID); 1243319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick mFolderInfo = mModel.getFolderById(this, sFolders, id); 124431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mRestoring = true; 124531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1246a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung 1247785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung // Restore the AppsCustomize tab 1248785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (mAppsCustomizeTabHost != null) { 1249785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung String curTab = savedState.getString("apps_customize_currentTab"); 1250785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (curTab != null) { 1251c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mAppsCustomizeTabHost.setContentTypeImmediate( 1252785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mAppsCustomizeTabHost.getContentTypeForTabTag(curTab)); 1253f314b0eab03bb354c14b6c89f694a6685bd246d9Winson Chung mAppsCustomizeContent.loadAssociatedPages( 1254f314b0eab03bb354c14b6c89f694a6685bd246d9Winson Chung mAppsCustomizeContent.getCurrentPage()); 1255785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1256785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 12575afbf7bdd6f6879124c9b8283e005fe57f310d02Winson Chung int currentIndex = savedState.getInt("apps_customize_currentIndex"); 12585afbf7bdd6f6879124c9b8283e005fe57f310d02Winson Chung mAppsCustomizeContent.restorePageForIndex(currentIndex); 1259785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1260c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen mItemIdToViewId = (HashMap<Integer, Integer>) 1261c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen savedState.getSerializable(RUNTIME_STATE_VIEW_IDS); 126231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 126331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 126431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 126531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Finds all the views we need and configure them properly. 126631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 126731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private void setupViews() { 1268a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final DragController dragController = mDragController; 126900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 1270360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner mLauncherView = findViewById(R.id.launcher); 12714c98d9235d164680186180974719f551cf935d08Winson Chung mDragLayer = (DragLayer) findViewById(R.id.drag_layer); 12724c98d9235d164680186180974719f551cf935d08Winson Chung mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace); 1273f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal mWorkspace.setPageSwitchListener(this); 1274a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mPageIndicators = mDragLayer.findViewById(R.id.page_indicator); 1275360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 127677e1f47520958edd7ec04e203db65b932537bd1cJohn Spurlock mLauncherView.setSystemUiVisibility( 127777e1f47520958edd7ec04e203db65b932537bd1cJohn Spurlock View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 1278360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner mWorkspaceBackgroundDrawable = getResources().getDrawable(R.drawable.workspace_bg); 127931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 12804c98d9235d164680186180974719f551cf935d08Winson Chung // Setup the drag layer 12814c98d9235d164680186180974719f551cf935d08Winson Chung mDragLayer.setup(this, dragController); 12824c98d9235d164680186180974719f551cf935d08Winson Chung 12833d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Setup the hotseat 12843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat = (Hotseat) findViewById(R.id.hotseat); 12853d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mHotseat != null) { 12863d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat.setup(this); 128711a1a53651924b544513f1f6971a735b18d67539Winson Chung mHotseat.setOnLongClickListener(this); 12883d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 12893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 1290d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); 129161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen View widgetButton = findViewById(R.id.widget_button); 129261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen widgetButton.setOnClickListener(new OnClickListener() { 1293f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen @Override 1294f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen public void onClick(View arg0) { 12958e15fdf60a103391839433ced3c0990d13ba5012Winson Chung if (!mWorkspace.isSwitchingState()) { 12967b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal onClickAddWidgetButton(arg0); 12978e15fdf60a103391839433ced3c0990d13ba5012Winson Chung } 1298f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 1299f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen }); 130061f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen widgetButton.setOnTouchListener(getHapticFeedbackTouchListener()); 130161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 130261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen View wallpaperButton = findViewById(R.id.wallpaper_button); 130361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen wallpaperButton.setOnClickListener(new OnClickListener() { 1304f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen @Override 1305f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen public void onClick(View arg0) { 13068e15fdf60a103391839433ced3c0990d13ba5012Winson Chung if (!mWorkspace.isSwitchingState()) { 13077b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal onClickWallpaperPicker(arg0); 13088e15fdf60a103391839433ced3c0990d13ba5012Winson Chung } 1309f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 1310f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen }); 131161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen wallpaperButton.setOnTouchListener(getHapticFeedbackTouchListener()); 131261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 131361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen View settingsButton = findViewById(R.id.settings_button); 1314d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi if (hasSettings()) { 1315d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi settingsButton.setOnClickListener(new OnClickListener() { 1316d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi @Override 1317d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi public void onClick(View arg0) { 1318d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi if (!mWorkspace.isSwitchingState()) { 13197b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal onClickSettingsButton(arg0); 1320d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } 1321a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 1322d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi }); 1323d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi settingsButton.setOnTouchListener(getHapticFeedbackTouchListener()); 1324d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } else { 1325d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi settingsButton.setVisibility(View.GONE); 1326d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) widgetButton.getLayoutParams(); 1327d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi lp.gravity = Gravity.END | Gravity.TOP; 1328d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi widgetButton.requestLayout(); 1329d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi } 1330d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi 1331dbdff6bc7b225255207a46fad8f536b55a18efacAdam Cohen mOverviewPanel.setAlpha(0f); 1332f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 13334c98d9235d164680186180974719f551cf935d08Winson Chung // Setup the workspace 13344c98d9235d164680186180974719f551cf935d08Winson Chung mWorkspace.setHapticFeedbackEnabled(false); 13354c98d9235d164680186180974719f551cf935d08Winson Chung mWorkspace.setOnLongClickListener(this); 1336cff6af81d721415785bddc2efd74e179d2def9daAdam Cohen mWorkspace.setup(dragController); 1337d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka dragController.addDragListener(mWorkspace); 13384c98d9235d164680186180974719f551cf935d08Winson Chung 1339f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // Get the search/delete bar 134024ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen mSearchDropTargetBar = (SearchDropTargetBar) 134124ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen mDragLayer.findViewById(R.id.search_drop_target_bar); 1342f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 1343f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // Setup AppsCustomize 1344360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner mAppsCustomizeTabHost = (AppsCustomizeTabHost) findViewById(R.id.apps_customize_pane); 1345f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mAppsCustomizeContent = (AppsCustomizePagedView) 1346f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mAppsCustomizeTabHost.findViewById(R.id.apps_customize_pane_content); 1347f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mAppsCustomizeContent.setup(this, dragController); 1348360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 13493d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Setup the drag controller (drop targets have to be added in reverse order in priority) 13504c98d9235d164680186180974719f551cf935d08Winson Chung dragController.setDragScoller(mWorkspace); 13514c98d9235d164680186180974719f551cf935d08Winson Chung dragController.setScrollView(mDragLayer); 13524c98d9235d164680186180974719f551cf935d08Winson Chung dragController.setMoveTarget(mWorkspace); 13534c98d9235d164680186180974719f551cf935d08Winson Chung dragController.addDropTarget(mWorkspace); 1354c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (mSearchDropTargetBar != null) { 1355c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung mSearchDropTargetBar.setup(this, dragController); 1356e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka } 1357924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler 1358a127b7ad151dd1ae66d665a073e98984930c3d9dDaniel Sandler if (getResources().getBoolean(R.bool.debug_memory_enabled)) { 1359924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler Log.v(TAG, "adding WeightWatcher"); 136039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher = new WeightWatcher(this); 136139a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher.setAlpha(0.5f); 136239a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen ((FrameLayout) mLauncherView).addView(mWeightWatcher, 1363924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler new FrameLayout.LayoutParams( 1364924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler FrameLayout.LayoutParams.MATCH_PARENT, 1365b9eb2865af05d9ade572e71934a9e6a50421aa7dDaniel Sandler FrameLayout.LayoutParams.WRAP_CONTENT, 1366924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler Gravity.BOTTOM) 1367924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler ); 136839a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 136939a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen boolean show = shouldShowWeightWatcher(); 137039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher.setVisibility(show ? View.VISIBLE : View.GONE); 1371924b993c750e6de8537afb750c2d2b9932efbdacDaniel Sandler } 137231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 137331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 137431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 13755ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal * Sets the all apps button. This method is called from {@link Hotseat}. 13765ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal */ 13775ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal public void setAllAppsButton(View allAppsButton) { 13785ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal mAllAppsButton = allAppsButton; 13795ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal } 13805ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal 13815ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal public View getAllAppsButton() { 13825ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal return mAllAppsButton; 13835ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal } 13845ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal 13855ad4484df3e477f9d8819605629b6e75a42e31edAnjali Koppal /** 138631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Creates a view representing a shortcut. 138731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 138831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param info The data structure describing the shortcut. 138931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 139031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @return A View inflated from R.layout.application. 139131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 13920589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato View createShortcut(ShortcutInfo info) { 139331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return createShortcut(R.layout.application, 13940142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentPage()), info); 139531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 139631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 139731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 139831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Creates a view representing a shortcut inflated from the specified resource. 139931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 140031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param layoutResId The id of the XML layout used to create the shortcut. 140131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param parent The group the shortcut belongs to. 140231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param info The data structure describing the shortcut. 140331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 140431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @return A View inflated from layoutResId. 140531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 14060589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato View createShortcut(int layoutResId, ViewGroup parent, ShortcutInfo info) { 140767b2f6cba5aa7b5d0fac5e66ba8f3d5f887baee6Michael Jurka BubbleTextView favorite = (BubbleTextView) mInflater.inflate(layoutResId, parent, false); 1408c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal favorite.applyFromShortcutInfo(info, mIconCache, true); 140931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project favorite.setOnClickListener(this); 141031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return favorite; 141131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 141231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 141331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 141431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Add a shortcut to the workspace. 141531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 141631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param data The intent describing the shortcut. 141731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param cellInfo The position on screen where to create the shortcut. 141831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1419dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen private void completeAddShortcut(Intent data, long container, long screenId, int cellX, 14203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int cellY) { 14213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] cellXY = mTmpAddItemCellCoordinates; 14223d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] touchXY = mPendingAddInfo.dropPos; 1423dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen CellLayout layout = getCellLayout(container, screenId); 14240280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 1425d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka boolean foundCellSpan = false; 1426fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 1427558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen ShortcutInfo info = mModel.infoFromShortcutIntent(this, data, null); 1428d919882006a457d16dea46bd546472e6534b5c19Adam Cohen if (info == null) { 1429d919882006a457d16dea46bd546472e6534b5c19Adam Cohen return; 1430d919882006a457d16dea46bd546472e6534b5c19Adam Cohen } 1431558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen final View view = createShortcut(info); 1432558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen 1433fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen // First we check if we already know the exact location where we want to add this item. 1434fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (cellX >= 0 && cellY >= 0) { 1435fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen cellXY[0] = cellX; 1436fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen cellXY[1] = cellY; 1437fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen foundCellSpan = true; 1438558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen 1439558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen // If appropriate, either create a folder or add to an existing folder 1440482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY, 0, 1441558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen true, null,null)) { 1442558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen return; 1443558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen } 1444558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen DragObject dragObject = new DragObject(); 1445558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen dragObject.dragInfo = info; 1446482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, 0, dragObject, 1447482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen true)) { 1448558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen return; 1449558baaf0a0b1c6a9062a6771088098533a35222bAdam Cohen } 1450fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } else if (touchXY != null) { 1451d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka // when dragging and dropping, just find the closest free spot 14523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] result = layout.findNearestVacantArea(touchXY[0], touchXY[1], 1, 1, cellXY); 1453d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka foundCellSpan = (result != null); 1454d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } else { 1455fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen foundCellSpan = layout.findCellForSpan(cellXY, 1, 1); 1456d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } 1457d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka 1458d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka if (!foundCellSpan) { 145993eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung showOutOfSpaceMessage(isHotseatLayout(layout)); 14600280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return; 14610280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1462cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1463dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen LauncherModel.addItemToDatabase(this, info, container, screenId, cellXY[0], cellXY[1], false); 146431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 146531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mRestoring) { 1466dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mWorkspace.addInScreen(view, container, screenId, cellXY[0], cellXY[1], 1, 1, 14673d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung isWorkspaceLocked()); 146831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 146931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 147031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14712f093b6ad185967c129781526060288e983bc58aAdam Cohen static int[] getSpanForWidget(Context context, ComponentName component, int minWidth, 14722f093b6ad185967c129781526060288e983bc58aAdam Cohen int minHeight) { 14732f093b6ad185967c129781526060288e983bc58aAdam Cohen Rect padding = AppWidgetHostView.getDefaultPaddingForWidget(context, component, null); 1474f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen // We want to account for the extra amount of padding that we are adding to the widget 1475f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen // to ensure that it gets the full amount of space that it has requested 1476f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen int requiredWidth = minWidth + padding.left + padding.right; 1477f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen int requiredHeight = minHeight + padding.top + padding.bottom; 14786670073de833cb56dabecb1eb751b6625a5aed78Winson Chung return CellLayout.rectToCell(requiredWidth, requiredHeight, null); 1479f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen } 1480f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen 14812f093b6ad185967c129781526060288e983bc58aAdam Cohen static int[] getSpanForWidget(Context context, AppWidgetProviderInfo info) { 14822f093b6ad185967c129781526060288e983bc58aAdam Cohen return getSpanForWidget(context, info.provider, info.minWidth, info.minHeight); 1483f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen } 1484f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen 14852f093b6ad185967c129781526060288e983bc58aAdam Cohen static int[] getMinSpanForWidget(Context context, AppWidgetProviderInfo info) { 14862f093b6ad185967c129781526060288e983bc58aAdam Cohen return getSpanForWidget(context, info.provider, info.minResizeWidth, info.minResizeHeight); 1487cbf47e38e24cc0d63b4bd3f345c050216f06f404Adam Cohen } 1488cbf47e38e24cc0d63b4bd3f345c050216f06f404Adam Cohen 14892f093b6ad185967c129781526060288e983bc58aAdam Cohen static int[] getSpanForWidget(Context context, PendingAddWidgetInfo info) { 14902f093b6ad185967c129781526060288e983bc58aAdam Cohen return getSpanForWidget(context, info.componentName, info.minWidth, info.minHeight); 1491f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen } 1492f814aa0f33c020a60de8a921176345f71a4b07c8Adam Cohen 14932f093b6ad185967c129781526060288e983bc58aAdam Cohen static int[] getMinSpanForWidget(Context context, PendingAddWidgetInfo info) { 14942f093b6ad185967c129781526060288e983bc58aAdam Cohen return getSpanForWidget(context, info.componentName, info.minResizeWidth, 1495a5c9636f563a2fa5bd3c97266894e002453b13dcWinson Chung info.minResizeHeight); 1496d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen } 1497d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen 149831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 14997376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project * Add a widget to the workspace. 150031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 15015bbc91bbbcba6cbcfff66b8d8dd510abb06bc076Romain Guy * @param appWidgetId The app widget id 15027376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project * @param cellInfo The position on screen where to create the widget. 150331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1504dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen private void completeAddAppWidget(final int appWidgetId, long container, long screenId, 1505ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen AppWidgetHostView hostView, AppWidgetProviderInfo appWidgetInfo) { 1506ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (appWidgetInfo == null) { 1507ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 1508ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 1509cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 15107376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project // Calculate the grid spans needed to fit this widget 1511dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen CellLayout layout = getCellLayout(container, screenId); 1512093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen 15132f093b6ad185967c129781526060288e983bc58aAdam Cohen int[] minSpanXY = getMinSpanForWidget(this, appWidgetInfo); 15142f093b6ad185967c129781526060288e983bc58aAdam Cohen int[] spanXY = getSpanForWidget(this, appWidgetInfo); 1515cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 151631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Try finding open space on Launcher screen 1517a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // We have saved the position to which the widget was dragged-- this really only matters 1518a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // if we are placing widgets on a "spring-loaded" screen 15193d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] cellXY = mTmpAddItemCellCoordinates; 15203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] touchXY = mPendingAddInfo.dropPos; 1521d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen int[] finalSpan = new int[2]; 15220280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka boolean foundCellSpan = false; 15233d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mPendingAddInfo.cellX >= 0 && mPendingAddInfo.cellY >= 0) { 15243d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung cellXY[0] = mPendingAddInfo.cellX; 15253d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung cellXY[1] = mPendingAddInfo.cellY; 1526d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen spanXY[0] = mPendingAddInfo.spanX; 1527d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen spanXY[1] = mPendingAddInfo.spanY; 1528fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen foundCellSpan = true; 1529fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } else if (touchXY != null) { 15300280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka // when dragging and dropping, just find the closest free spot 15313d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] result = layout.findNearestVacantArea( 1532d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen touchXY[0], touchXY[1], minSpanXY[0], minSpanXY[1], spanXY[0], 1533d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen spanXY[1], cellXY, finalSpan); 1534d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen spanXY[0] = finalSpan[0]; 1535d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen spanXY[1] = finalSpan[1]; 1536d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka foundCellSpan = (result != null); 15370280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } else { 1538d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen foundCellSpan = layout.findCellForSpan(cellXY, minSpanXY[0], minSpanXY[1]); 1539a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 1540a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 15410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (!foundCellSpan) { 1542f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung if (appWidgetId != -1) { 1543f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung // Deleting an app widget ID is a void call but writes to disk before returning 1544f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung // to the caller... 15454346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka new AsyncTask<Void, Void, Void>() { 15464346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka public Void doInBackground(Void ... args) { 1547f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung mAppWidgetHost.deleteAppWidgetId(appWidgetId); 15484346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka return null; 1549f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } 15504346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); 1551f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } 155293eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung showOutOfSpaceMessage(isHotseatLayout(layout)); 155318042c82c5847d3caf9af65583c5590c17927c3dRomain Guy return; 155418042c82c5847d3caf9af65583c5590c17927c3dRomain Guy } 155531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 15567376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project // Build Launcher-specific widget info and save to database 155711a4937fbff0dbc50fb022513dc3b6c643154445Winson Chung LauncherAppWidgetInfo launcherInfo = new LauncherAppWidgetInfo(appWidgetId, 155811a4937fbff0dbc50fb022513dc3b6c643154445Winson Chung appWidgetInfo.provider); 15590280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka launcherInfo.spanX = spanXY[0]; 15600280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka launcherInfo.spanY = spanXY[1]; 1561d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen launcherInfo.minSpanX = mPendingAddInfo.minSpanX; 1562d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen launcherInfo.minSpanY = mPendingAddInfo.minSpanY; 1563cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 156431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project LauncherModel.addItemToDatabase(this, launcherInfo, 1565dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen container, screenId, cellXY[0], cellXY[1], false); 156631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 156731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mRestoring) { 1568ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (hostView == null) { 1569ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen // Perform actual inflation because we're live 1570ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); 1571ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo); 1572ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } else { 1573ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen // The AppWidgetHostView has already been inflated and instantiated 1574ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen launcherInfo.hostView = hostView; 1575ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 1576cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 157731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project launcherInfo.hostView.setTag(launcherInfo); 1578d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen launcherInfo.hostView.setVisibility(View.VISIBLE); 1579aaa5c21ee2e03def644fb6ba8eadbb59873ddd45Adam Cohen launcherInfo.notifyWidgetSizeChanged(this); 1580aaa5c21ee2e03def644fb6ba8eadbb59873ddd45Adam Cohen 1581dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mWorkspace.addInScreen(launcherInfo.hostView, container, screenId, cellXY[0], cellXY[1], 15829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato launcherInfo.spanX, launcherInfo.spanY, isWorkspaceLocked()); 1583ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1584ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen addWidgetToAutoAdvanceIfNeeded(launcherInfo.hostView, appWidgetInfo); 158531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 15866af9af057f2e40c54a4ed447c4628eef7dc15683Adam Cohen resetAddInfo(); 158731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1588cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1589ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 1590ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1591ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onReceive(Context context, Intent intent) { 1592ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final String action = intent.getAction(); 1593ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (Intent.ACTION_SCREEN_OFF.equals(action)) { 1594ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mUserPresent = false; 1595bec6ac5bb3a9d6a677081eb50147abdc58a2cabbAdam Cohen mDragLayer.clearAllResizeFrames(); 1596ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen updateRunning(); 1597337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung 1598c100e8eae7d67ad5bd78767494b62b8fae5d1779Winson Chung // Reset AllApps to its initial state only if we are not in the middle of 1599b8472bb83cd96456a543137e1e56d589171934c3Winson Chung // processing a multi-step drop 1600c100e8eae7d67ad5bd78767494b62b8fae5d1779Winson Chung if (mAppsCustomizeTabHost != null && mPendingAddInfo.container == ItemInfo.NO_ID) { 1601ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showWorkspace(false); 1602785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1603ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else if (Intent.ACTION_USER_PRESENT.equals(action)) { 1604ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mUserPresent = true; 1605ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen updateRunning(); 1606d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler } else if (ENABLE_DEBUG_INTENTS && DebugIntents.DELETE_DATABASE.equals(action)) { 1607d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler mModel.resetLoadedState(false, true); 1608d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler mModel.startLoader(false, PagedView.INVALID_RESTORE_PAGE, 1609d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE); 1610d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler } else if (ENABLE_DEBUG_INTENTS && DebugIntents.MIGRATE_DATABASE.equals(action)) { 1611d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler mModel.resetLoadedState(false, true); 1612d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler mModel.startLoader(false, PagedView.INVALID_RESTORE_PAGE, 1613d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE 1614d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler | LauncherModel.LOADER_FLAG_MIGRATE_SHORTCUTS); 16156cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani } else if (LauncherAppsCompat.ACTION_MANAGED_PROFILE_ADDED.equals(action) 16166cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani || LauncherAppsCompat.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) { 16176cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani getModel().forceReload(); 1618ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1619ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1620ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen }; 1621ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1622ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1623ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onAttachedToWindow() { 1624ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen super.onAttachedToWindow(); 1625ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1626ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen // Listen for broadcasts related to user-presence 1627ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final IntentFilter filter = new IntentFilter(); 1628ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen filter.addAction(Intent.ACTION_SCREEN_OFF); 1629ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen filter.addAction(Intent.ACTION_USER_PRESENT); 16306cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani // For handling managed profiles 16316cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani filter.addAction(LauncherAppsCompat.ACTION_MANAGED_PROFILE_ADDED); 16326cc806d678c8a44478308119c087ac9adde73b66Amith Yamasani filter.addAction(LauncherAppsCompat.ACTION_MANAGED_PROFILE_REMOVED); 1633d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler if (ENABLE_DEBUG_INTENTS) { 1634d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler filter.addAction(DebugIntents.DELETE_DATABASE); 1635d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler filter.addAction(DebugIntents.MIGRATE_DATABASE); 1636d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler } 1637ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen registerReceiver(mReceiver, filter); 1638f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka FirstFrameAnimatorHelper.initializeDrawListener(getWindow().getDecorView()); 16390b395356087901c16af283b5d9ae821a630cb6adAdam Cohen setupTransparentSystemBarsForLmp(); 1640d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen mAttached = true; 1641ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mVisible = true; 1642ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1643ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 16440b395356087901c16af283b5d9ae821a630cb6adAdam Cohen /** 16450b395356087901c16af283b5d9ae821a630cb6adAdam Cohen * Sets up transparent navigation and status bars in LMP. 16460b395356087901c16af283b5d9ae821a630cb6adAdam Cohen * This method is a no-op for other platform versions. 16470b395356087901c16af283b5d9ae821a630cb6adAdam Cohen */ 16480b395356087901c16af283b5d9ae821a630cb6adAdam Cohen @TargetApi(19) 16490b395356087901c16af283b5d9ae821a630cb6adAdam Cohen private void setupTransparentSystemBarsForLmp() { 16500b395356087901c16af283b5d9ae821a630cb6adAdam Cohen // TODO(sansid): use the APIs directly when compiling against L sdk. 16510b395356087901c16af283b5d9ae821a630cb6adAdam Cohen // Currently we use reflection to access the flags and the API to set the transparency 16520b395356087901c16af283b5d9ae821a630cb6adAdam Cohen // on the System bars. 16530b395356087901c16af283b5d9ae821a630cb6adAdam Cohen if (Utilities.isLmp()) { 16540b395356087901c16af283b5d9ae821a630cb6adAdam Cohen try { 16550b395356087901c16af283b5d9ae821a630cb6adAdam Cohen getWindow().getAttributes().systemUiVisibility |= 16560b395356087901c16af283b5d9ae821a630cb6adAdam Cohen (View.SYSTEM_UI_FLAG_LAYOUT_STABLE 16570b395356087901c16af283b5d9ae821a630cb6adAdam Cohen | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 16580b395356087901c16af283b5d9ae821a630cb6adAdam Cohen | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 16590b395356087901c16af283b5d9ae821a630cb6adAdam Cohen getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 16600b395356087901c16af283b5d9ae821a630cb6adAdam Cohen | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 16610b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Field drawsSysBackgroundsField = WindowManager.LayoutParams.class.getField( 16620b395356087901c16af283b5d9ae821a630cb6adAdam Cohen "FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS"); 16630b395356087901c16af283b5d9ae821a630cb6adAdam Cohen getWindow().addFlags(drawsSysBackgroundsField.getInt(null)); 16640b395356087901c16af283b5d9ae821a630cb6adAdam Cohen 16650b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Method setStatusBarColorMethod = 16660b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Window.class.getDeclaredMethod("setStatusBarColor", int.class); 16670b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Method setNavigationBarColorMethod = 16680b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Window.class.getDeclaredMethod("setNavigationBarColor", int.class); 16690b395356087901c16af283b5d9ae821a630cb6adAdam Cohen setStatusBarColorMethod.invoke(getWindow(), Color.TRANSPARENT); 16700b395356087901c16af283b5d9ae821a630cb6adAdam Cohen setNavigationBarColorMethod.invoke(getWindow(), Color.TRANSPARENT); 16710b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } catch (NoSuchFieldException e) { 16720b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Log.w(TAG, "NoSuchFieldException while setting up transparent bars"); 16730b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } catch (NoSuchMethodException ex) { 16740b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Log.w(TAG, "NoSuchMethodException while setting up transparent bars"); 16750b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } catch (IllegalAccessException e) { 16760b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Log.w(TAG, "IllegalAccessException while setting up transparent bars"); 16770b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } catch (IllegalArgumentException e) { 16780b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Log.w(TAG, "IllegalArgumentException while setting up transparent bars"); 16790b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } catch (InvocationTargetException e) { 16800b395356087901c16af283b5d9ae821a630cb6adAdam Cohen Log.w(TAG, "InvocationTargetException while setting up transparent bars"); 16810b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } finally {} 16820b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } 16830b395356087901c16af283b5d9ae821a630cb6adAdam Cohen } 16840b395356087901c16af283b5d9ae821a630cb6adAdam Cohen 1685ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1686ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onDetachedFromWindow() { 1687ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen super.onDetachedFromWindow(); 1688ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mVisible = false; 1689ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1690d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen if (mAttached) { 1691d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen unregisterReceiver(mReceiver); 1692d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen mAttached = false; 1693d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen } 1694ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen updateRunning(); 1695ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1696ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1697ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void onWindowVisibilityChanged(int visibility) { 1698ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mVisible = visibility == View.VISIBLE; 1699ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen updateRunning(); 17002a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // The following code used to be in onResume, but it turns out onResume is called when 17012a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // you're in All Apps and click home to go to the workspace. onWindowVisibilityChanged 17022a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // is a more appropriate event to handle 17032a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka if (mVisible) { 17042a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka mAppsCustomizeTabHost.onWindowVisible(); 17052a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka if (!mWorkspaceLoading) { 17062a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka final ViewTreeObserver observer = mWorkspace.getViewTreeObserver(); 17072a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // We want to let Launcher draw itself at least once before we force it to build 17082a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // layers on all the workspace pages, so that transitioning to Launcher from other 1709f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka // apps is nice and speedy. 1710f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka observer.addOnDrawListener(new ViewTreeObserver.OnDrawListener() { 1711df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka private boolean mStarted = false; 1712f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka public void onDraw() { 1713df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka if (mStarted) return; 1714df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka mStarted = true; 17156ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // We delay the layer building a bit in order to give 17166ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // other message processing a time to run. In particular 17176ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // this avoids a delay in hiding the IME if it was 17186ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // currently shown, because doing that may involve 17196ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // some communication back with the app. 1720aeae56bf1282761a7dd017458fe27d83f9683efcWinson Chung mWorkspace.postDelayed(mBuildLayersRunnable, 500); 1721df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka final ViewTreeObserver.OnDrawListener listener = this; 1722df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka mWorkspace.post(new Runnable() { 1723df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka public void run() { 1724b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka if (mWorkspace != null && 1725b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka mWorkspace.getViewTreeObserver() != null) { 1726b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka mWorkspace.getViewTreeObserver(). 1727b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka removeOnDrawListener(listener); 1728b68e03a83cfc8e59c0c93d070c5e3cc13cc2996bMichael Jurka } 1729df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka } 1730df96add095c82f9083f75305d8fa155c8192a4e6Michael Jurka }); 1731f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka return; 17322a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 17332a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka }); 17342a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 17356ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // When Launcher comes back to foreground, a different Activity might be responsible for 17366ee21d28fadef3b1bd594a0ac8708f40a24bdcd7Michael Jurka // the app market intent, so refresh the icon 1737d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON) { 1738d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung updateAppMarketIcon(); 1739d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } 17402a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka clearTypedText(); 17412a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 1742ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1743ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1744ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void sendAdvanceMessage(long delay) { 1745ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mHandler.removeMessages(ADVANCE_MSG); 1746ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen Message msg = mHandler.obtainMessage(ADVANCE_MSG); 1747ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mHandler.sendMessageDelayed(msg, delay); 1748ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mAutoAdvanceSentTime = System.currentTimeMillis(); 1749ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1750ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1751ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void updateRunning() { 1752ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen boolean autoAdvanceRunning = mVisible && mUserPresent && !mWidgetsToAdvance.isEmpty(); 1753ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (autoAdvanceRunning != mAutoAdvanceRunning) { 1754ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mAutoAdvanceRunning = autoAdvanceRunning; 1755ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (autoAdvanceRunning) { 1756ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen long delay = mAutoAdvanceTimeLeft == -1 ? mAdvanceInterval : mAutoAdvanceTimeLeft; 1757ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen sendAdvanceMessage(delay); 1758ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else { 1759ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (!mWidgetsToAdvance.isEmpty()) { 1760ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mAutoAdvanceTimeLeft = Math.max(0, mAdvanceInterval - 1761ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen (System.currentTimeMillis() - mAutoAdvanceSentTime)); 1762ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1763ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mHandler.removeMessages(ADVANCE_MSG); 17642313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mHandler.removeMessages(0); // Remove messages sent using postDelayed() 1765ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1766ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1767ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1768ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1769ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private final Handler mHandler = new Handler() { 1770ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen @Override 1771ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void handleMessage(Message msg) { 1772ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (msg.what == ADVANCE_MSG) { 1773ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen int i = 0; 1774ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (View key: mWidgetsToAdvance.keySet()) { 1775ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final View v = key.findViewById(mWidgetsToAdvance.get(key).autoAdvanceViewId); 1776ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int delay = mAdvanceStagger * i; 1777ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (v instanceof Advanceable) { 1778ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen postDelayed(new Runnable() { 1779ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public void run() { 1780ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen ((Advanceable) v).advance(); 1781ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1782ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen }, delay); 1783ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1784ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen i++; 1785ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1786ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen sendAdvanceMessage(mAdvanceInterval); 1787ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1788ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1789ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen }; 1790ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1791ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen void addWidgetToAutoAdvanceIfNeeded(View hostView, AppWidgetProviderInfo appWidgetInfo) { 1792292c025d06b41c42546e9771b0da0333e08f9db7Adam Cohen if (appWidgetInfo == null || appWidgetInfo.autoAdvanceViewId == -1) return; 1793ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen View v = hostView.findViewById(appWidgetInfo.autoAdvanceViewId); 1794ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (v instanceof Advanceable) { 1795ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mWidgetsToAdvance.put(hostView, appWidgetInfo); 17962ddf13e175910f784cb4e54493ef202671e499f8Adam Cohen ((Advanceable) v).fyiWillBeAdvancedByHostKThx(); 1797ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen updateRunning(); 1798ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1799ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1800ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1801ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen void removeWidgetToAutoAdvance(View hostView) { 1802ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (mWidgetsToAdvance.containsKey(hostView)) { 1803ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mWidgetsToAdvance.remove(hostView); 1804ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen updateRunning(); 1805ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 18060280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 18070280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 18089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void removeAppWidget(LauncherAppWidgetInfo launcherInfo) { 1809ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen removeWidgetToAutoAdvance(launcherInfo.hostView); 18109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato launcherInfo.hostView = null; 18119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 18129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 181393eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung void showOutOfSpaceMessage(boolean isHotseatLayout) { 181493eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung int strId = (isHotseatLayout ? R.string.hotseat_out_of_space : R.string.out_of_space); 181593eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT).show(); 1816ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1817ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1818a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public DragLayer getDragLayer() { 1819a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mDragLayer; 1820a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1821a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1822a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public Workspace getWorkspace() { 1823a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mWorkspace; 1824a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1825a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1826a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public Hotseat getHotseat() { 1827a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mHotseat; 1828a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1829a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1830d017f882eb67b630adb082dd2227e20f5bc77b05Jorim Jaggi public ViewGroup getOverviewPanel() { 1831a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mOverviewPanel; 1832a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1833a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1834a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public SearchDropTargetBar getSearchBar() { 1835a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mSearchDropTargetBar; 1836a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1837a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 18387376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project public LauncherAppWidgetHost getAppWidgetHost() { 18397376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project return mAppWidgetHost; 184031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1841cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1842a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung public LauncherModel getModel() { 1843a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung return mModel; 1844a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung } 1845a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung 1846a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public LauncherClings getLauncherClings() { 1847a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mLauncherClings; 1848a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1849a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1850a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung protected SharedPreferences getSharedPrefs() { 1851a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung return mSharedPrefs; 1852a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 1853a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 1854c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert public void closeSystemDialogs() { 18552ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato getWindow().closeAllPanels(); 18562ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 1857a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato // Whatever we were doing is hereby canceled. 1858ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(false); 18592ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 18602ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 186131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 186231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onNewIntent(Intent intent) { 1863447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka long startTime = 0; 1864447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 1865447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka startTime = System.currentTimeMillis(); 1866447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 186731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onNewIntent(intent); 186831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 186931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Close the menu 187031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (Intent.ACTION_MAIN.equals(intent.getAction())) { 1871a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato // also will cancel mWaitingForResult. 18722ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato closeSystemDialogs(); 1873fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams 1874ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen final boolean alreadyOnHome = mHasFocus && ((intent.getFlags() & 1875ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) 1876ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 187701f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka 18786fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (mWorkspace == null) { 18796fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // Can be cases where mWorkspace is null, this prevents a NPE 18806fecd410e8567af916b1bbd53198d9878c686177Adam Cohen return; 18816fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 18826fecd410e8567af916b1bbd53198d9878c686177Adam Cohen Folder openFolder = mWorkspace.getOpenFolder(); 18836fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // In all these cases, only animate if we're already on home 18846fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mWorkspace.exitWidgetResizeMode(); 18856fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() && 1886a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp openFolder == null && shouldMoveToDefaultScreenOnHomeIntent()) { 18876fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mWorkspace.moveToDefaultScreen(true); 18886fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 1889337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung 18906fecd410e8567af916b1bbd53198d9878c686177Adam Cohen closeFolder(); 18916fecd410e8567af916b1bbd53198d9878c686177Adam Cohen exitSpringLoadedDragMode(); 1892cb222e85d256e37da41f0ffa3744656c9b53083cJamie Gennis 18936fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // If we are already on home, then just animate back to the workspace, 18946fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // otherwise, just wait until onResume to set the state back to Workspace 18956fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (alreadyOnHome) { 1896ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showWorkspace(true); 1897cb222e85d256e37da41f0ffa3744656c9b53083cJamie Gennis } else { 18986fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mOnResumeState = State.WORKSPACE; 1899785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1900cb222e85d256e37da41f0ffa3744656c9b53083cJamie Gennis 19016fecd410e8567af916b1bbd53198d9878c686177Adam Cohen final View v = getWindow().peekDecorView(); 19026fecd410e8567af916b1bbd53198d9878c686177Adam Cohen if (v != null && v.getWindowToken() != null) { 19036fecd410e8567af916b1bbd53198d9878c686177Adam Cohen InputMethodManager imm = (InputMethodManager)getSystemService( 19046fecd410e8567af916b1bbd53198d9878c686177Adam Cohen INPUT_METHOD_SERVICE); 19056fecd410e8567af916b1bbd53198d9878c686177Adam Cohen imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 19066fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 19076fecd410e8567af916b1bbd53198d9878c686177Adam Cohen 19086fecd410e8567af916b1bbd53198d9878c686177Adam Cohen // Reset the apps customize page 1909e7e97e65524977ad361811b95e8ee4557841d36aWinson Chung if (!alreadyOnHome && mAppsCustomizeTabHost != null) { 19106fecd410e8567af916b1bbd53198d9878c686177Adam Cohen mAppsCustomizeTabHost.reset(); 19116fecd410e8567af916b1bbd53198d9878c686177Adam Cohen } 1912a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp 1913a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp onHomeIntent(); 191431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1915ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen 1916447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka if (DEBUG_RESUME_TIME) { 1917447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka Log.d(TAG, "Time spent in onNewIntent: " + (System.currentTimeMillis() - startTime)); 1918447bf84d2454ac28ac26d70feea8139ed986c321Michael Jurka } 191931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 192031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1921a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp /** 1922a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp * Override point for subclasses to prevent movement to the default screen when the home 1923a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp * button is pressed. Used (for example) in GEL, to prevent movement during a search. 1924a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp */ 1925a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp protected boolean shouldMoveToDefaultScreenOnHomeIntent() { 1926a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp return true; 1927a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp } 1928a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp 1929a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp /** 1930a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp * Override point for subclasses to provide custom behaviour for when a home intent is fired. 1931a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp */ 1932a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp protected void onHomeIntent() { 1933a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp // Do nothing 1934a120b8e304f1541529f26ef5af13f8bb5ac655f6Adam Copp } 193531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 193631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 19371462de39f01cec0ba785386532719cb0207dd827Adam Cohen public void onRestoreInstanceState(Bundle state) { 19381462de39f01cec0ba785386532719cb0207dd827Adam Cohen super.onRestoreInstanceState(state); 19391462de39f01cec0ba785386532719cb0207dd827Adam Cohen for (int page: mSynchronouslyBoundPages) { 19401462de39f01cec0ba785386532719cb0207dd827Adam Cohen mWorkspace.restoreInstanceStateForChild(page); 19411462de39f01cec0ba785386532719cb0207dd827Adam Cohen } 194231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 194331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 194431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 194531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onSaveInstanceState(Bundle outState) { 194621cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen if (mWorkspace.getChildCount() > 0) { 19479b9fb967b2305413520dc676d6d3c472b2b6b25eWinson Chung outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, 19489b9fb967b2305413520dc676d6d3c472b2b6b25eWinson Chung mWorkspace.getCurrentPageOffsetFromCustomContent()); 194921cd002fef13ff0b6336f10f97e29738a2b0ecb9Adam Cohen } 195095bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen super.onSaveInstanceState(outState); 195131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1952883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka outState.putInt(RUNTIME_STATE, mState.ordinal()); 195351e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen // We close any open folder since it will not be re-opened, and we need to make sure 195451e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen // this state is reflected. 195551e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen closeFolder(); 195631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1957dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen if (mPendingAddInfo.container != ItemInfo.NO_ID && mPendingAddInfo.screenId > -1 && 19583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mWaitingForResult) { 19593d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung outState.putLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, mPendingAddInfo.container); 1960dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen outState.putLong(RUNTIME_STATE_PENDING_ADD_SCREEN, mPendingAddInfo.screenId); 19613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_X, mPendingAddInfo.cellX); 19623d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_Y, mPendingAddInfo.cellY); 19639d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen outState.putInt(RUNTIME_STATE_PENDING_ADD_SPAN_X, mPendingAddInfo.spanX); 19649d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen outState.putInt(RUNTIME_STATE_PENDING_ADD_SPAN_Y, mPendingAddInfo.spanY); 19659d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen outState.putParcelable(RUNTIME_STATE_PENDING_ADD_WIDGET_INFO, mPendingAddWidgetInfo); 19664637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen outState.putInt(RUNTIME_STATE_PENDING_ADD_WIDGET_ID, mPendingAddWidgetId); 196731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 196831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 196931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (mFolderInfo != null && mWaitingForResult) { 197031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project outState.putBoolean(RUNTIME_STATE_PENDING_FOLDER_RENAME, true); 197131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project outState.putLong(RUNTIME_STATE_PENDING_FOLDER_RENAME_ID, mFolderInfo.id); 197231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1973946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurka 1974785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung // Save the current AppsCustomize tab 1975785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (mAppsCustomizeTabHost != null) { 197607e045c63775c944f00da037b5d9cfc31e6028dcWinson Chung AppsCustomizePagedView.ContentType type = mAppsCustomizeContent.getContentType(); 197707e045c63775c944f00da037b5d9cfc31e6028dcWinson Chung String currentTabTag = mAppsCustomizeTabHost.getTabTagForContentType(type); 1978785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (currentTabTag != null) { 1979785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung outState.putString("apps_customize_currentTab", currentTabTag); 1980785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 19815afbf7bdd6f6879124c9b8283e005fe57f310d02Winson Chung int currentIndex = mAppsCustomizeContent.getSaveInstanceStateIndex(); 19825afbf7bdd6f6879124c9b8283e005fe57f310d02Winson Chung outState.putInt("apps_customize_currentIndex", currentIndex); 1983785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1984c76e1dda0875c13131462d80d0c1721a6149e08dAdam Cohen outState.putSerializable(RUNTIME_STATE_VIEW_IDS, mItemIdToViewId); 198531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 198631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 198731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 198831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onDestroy() { 198931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.onDestroy(); 1990cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1991e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung // Remove all pending runnables 1992e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung mHandler.removeMessages(ADVANCE_MSG); 1993e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung mHandler.removeMessages(0); 19949d906c7742af73160df257a40a702e1cc4f87899Michael Jurka mWorkspace.removeCallbacks(mBuildLayersRunnable); 1995e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung 1996cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung // Stop callbacks from LauncherModel 1997cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler LauncherAppState app = (LauncherAppState.getInstance()); 1998cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung mModel.stopLoader(); 1999cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung app.setLauncher(null); 2000cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung 200131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project try { 20027376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mAppWidgetHost.stopListening(); 200331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } catch (NullPointerException ex) { 2004a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato Log.w(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex); 200531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 20062313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mAppWidgetHost = null; 20072313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy 20082313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mWidgetsToAdvance.clear(); 200931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 201031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project TextKeyListener.getInstance().release(); 201131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 201281b52252796625dcbadc9f8b908f8d8a284565c0Winson Chung // Disconnect any of the callbacks and drawables associated with ItemInfos on the workspace 201381b52252796625dcbadc9f8b908f8d8a284565c0Winson Chung // to prevent leaking Launcher activities on orientation change. 201481b52252796625dcbadc9f8b908f8d8a284565c0Winson Chung if (mModel != null) { 201581b52252796625dcbadc9f8b908f8d8a284565c0Winson Chung mModel.unbindItemInfosAndClearQueuedBindRunnables(); 201681b52252796625dcbadc9f8b908f8d8a284565c0Winson Chung } 20171e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 20181e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey getContentResolver().unregisterContentObserver(mWidgetObserver); 201934a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato unregisterReceiver(mCloseSystemDialogsReceiver); 20202313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy 2021accf3bffedc736c04034bfee8e1a8e4fe775f568Adam Cohen mDragLayer.clearAllResizeFrames(); 20222313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy ((ViewGroup) mWorkspace.getParent()).removeAllViews(); 2023d552dd90f1da32e1be2dd95ffed57c65d40cb651Adam Cohen mWorkspace.removeAllWorkspaceScreens(); 20242313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mWorkspace = null; 20252313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy mDragController = null; 202660b7c53ccc6384b65aaca77d97794e8f09e8cfc8Patrick Dubroy 20272ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka LauncherAnimUtils.onDestroyActivity(); 202831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 202931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2030a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen public DragController getDragController() { 2031a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen return mDragController; 2032a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 2033a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 203431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 203531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void startActivityForResult(Intent intent, int requestCode) { 2036ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal if (requestCode >= 0) { 2037ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWaitingForResult(true); 2038ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 203931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.startActivityForResult(intent, requestCode); 204031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 204131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 204270d721061536e0634f6cfa8cd219759a83befceeWinson Chung /** 204370d721061536e0634f6cfa8cd219759a83befceeWinson Chung * Indicates that we want global search for this activity by setting the globalSearch 204470d721061536e0634f6cfa8cd219759a83befceeWinson Chung * argument for {@link #startSearch} to true. 204570d721061536e0634f6cfa8cd219759a83befceeWinson Chung */ 204631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 2047cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy public void startSearch(String initialQuery, boolean selectInitialQuery, 204831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Bundle appSearchData, boolean globalSearch) { 2049138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 2050c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka showWorkspace(true); 2051cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2052138a04170d964da9cdec228e95b976875ae52481Karl Rosaen if (initialQuery == null) { 2053138a04170d964da9cdec228e95b976875ae52481Karl Rosaen // Use any text typed in the launcher as the initial query 2054138a04170d964da9cdec228e95b976875ae52481Karl Rosaen initialQuery = getTypedText(); 2055138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 205631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (appSearchData == null) { 205731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project appSearchData = new Bundle(); 205832b12d2c792b74f193547e4b8375c97240079be1Bjorn Bringert appSearchData.putString("source", "launcher-search"); 205931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2060adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung Rect sourceBounds = new Rect(); 2061adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 2062adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung sourceBounds = mSearchDropTargetBar.getSearchBarBounds(); 2063adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 2064cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2065c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert startSearch(initialQuery, selectInitialQuery, 2066c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert appSearchData, sourceBounds); 2067c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 2068c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 2069c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert public void startSearch(String initialQuery, 2070c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert boolean selectInitialQuery, Bundle appSearchData, Rect sourceBounds) { 2071a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka startGlobalSearch(initialQuery, selectInitialQuery, 2072c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert appSearchData, sourceBounds); 2073a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2074a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka 2075a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka /** 2076a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka * Starts the global search activity. This code is a copied from SearchManager 2077a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka */ 2078c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert private void startGlobalSearch(String initialQuery, 2079a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka boolean selectInitialQuery, Bundle appSearchData, Rect sourceBounds) { 2080138a04170d964da9cdec228e95b976875ae52481Karl Rosaen final SearchManager searchManager = 2081a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka (SearchManager) getSystemService(Context.SEARCH_SERVICE); 2082a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity(); 2083a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (globalSearchActivity == null) { 2084a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka Log.w(TAG, "No global search activity found."); 2085a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka return; 2086a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2087a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka Intent intent = new Intent(SearchManager.INTENT_ACTION_GLOBAL_SEARCH); 2088a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2089a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.setComponent(globalSearchActivity); 2090a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka // Make sure that we have a Bundle to put source in 2091a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (appSearchData == null) { 2092a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka appSearchData = new Bundle(); 2093a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } else { 2094a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka appSearchData = new Bundle(appSearchData); 2095a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2096a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka // Set source to package name of app that starts global search, if not set already. 2097a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (!appSearchData.containsKey("source")) { 2098a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka appSearchData.putString("source", getPackageName()); 2099a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2100a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.putExtra(SearchManager.APP_DATA, appSearchData); 2101a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (!TextUtils.isEmpty(initialQuery)) { 2102a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.putExtra(SearchManager.QUERY, initialQuery); 2103a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2104a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka if (selectInitialQuery) { 2105a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.putExtra(SearchManager.EXTRA_SELECT_QUERY, selectInitialQuery); 2106a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 2107a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka intent.setSourceBounds(sourceBounds); 2108a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka try { 2109a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka startActivity(intent); 2110a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } catch (ActivityNotFoundException ex) { 2111a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka Log.e(TAG, "Global search activity not found: " + globalSearchActivity); 2112a33411cb83e2c7f822d6486183a7a4ea7d1b09e6Michael Jurka } 211331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 211431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 21154f93ec63b13f660fab63745d7127308954d5a6bdYura public boolean isOnCustomContent() { 21164f93ec63b13f660fab63745d7127308954d5a6bdYura return mWorkspace.isOnOrMovingToCustomContent(); 21174f93ec63b13f660fab63745d7127308954d5a6bdYura } 21184f93ec63b13f660fab63745d7127308954d5a6bdYura 211970d721061536e0634f6cfa8cd219759a83befceeWinson Chung @Override 212070d721061536e0634f6cfa8cd219759a83befceeWinson Chung public boolean onPrepareOptionsMenu(Menu menu) { 212170d721061536e0634f6cfa8cd219759a83befceeWinson Chung super.onPrepareOptionsMenu(menu); 21224f93ec63b13f660fab63745d7127308954d5a6bdYura if (!isOnCustomContent()) { 21234f93ec63b13f660fab63745d7127308954d5a6bdYura // Close any open folders 21244f93ec63b13f660fab63745d7127308954d5a6bdYura closeFolder(); 21254f93ec63b13f660fab63745d7127308954d5a6bdYura // Stop resizing any widgets 21264f93ec63b13f660fab63745d7127308954d5a6bdYura mWorkspace.exitWidgetResizeMode(); 21274f93ec63b13f660fab63745d7127308954d5a6bdYura if (!mWorkspace.isInOverviewMode()) { 21284f93ec63b13f660fab63745d7127308954d5a6bdYura // Show the overview mode 21294f93ec63b13f660fab63745d7127308954d5a6bdYura showOverviewMode(true); 21304f93ec63b13f660fab63745d7127308954d5a6bdYura } else { 21314f93ec63b13f660fab63745d7127308954d5a6bdYura showWorkspace(true); 21324f93ec63b13f660fab63745d7127308954d5a6bdYura } 2133e029874bcfd6e55cb93fb6609f3342f180b5995cWinson Chung } 2134b94f3f804f3954666c73e0564391444ec77dc4d4Michael Jurka return false; 213570d721061536e0634f6cfa8cd219759a83befceeWinson Chung } 213631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2137ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project @Override 2138ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project public boolean onSearchRequested() { 2139cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy startSearch(null, false, null, true); 2140a135ba896e4e12a99deb054f671c63535c3e11e3Amith Yamasani // Use a custom animation for launching search 2141138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return true; 2142ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project } 2143ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 21449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public boolean isWorkspaceLocked() { 21459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return mWorkspaceLoading || mWaitingForResult; 214631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 214731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2148517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen public boolean isWorkspaceLoading() { 2149517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen return mWorkspaceLoading; 2150517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen } 2151517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen 2152ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal private void setWorkspaceLoading(boolean value) { 2153ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal boolean isLocked = isWorkspaceLocked(); 2154ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal mWorkspaceLoading = value; 2155ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal if (isLocked != isWorkspaceLocked()) { 2156ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal onWorkspaceLockedChanged(); 2157ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2158ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2159ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal 2160ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal private void setWaitingForResult(boolean value) { 2161ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal boolean isLocked = isWorkspaceLocked(); 2162ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal mWaitingForResult = value; 2163ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal if (isLocked != isWorkspaceLocked()) { 2164ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal onWorkspaceLockedChanged(); 2165ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2166ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal } 2167ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal 2168ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal protected void onWorkspaceLockedChanged() { } 2169ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal 21700280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka private void resetAddInfo() { 21713d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = ItemInfo.NO_ID; 2172dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = -1; 21733d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = mPendingAddInfo.cellY = -1; 21743d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.spanX = mPendingAddInfo.spanY = -1; 2175d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.minSpanX = mPendingAddInfo.minSpanY = -1; 21763d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.dropPos = null; 21770280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 21780280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 2179ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen void addAppWidgetImpl(final int appWidgetId, final ItemInfo info, 2180ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen final AppWidgetHostView boundWidget, final AppWidgetProviderInfo appWidgetInfo) { 2181ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen addAppWidgetImpl(appWidgetId, info, boundWidget, appWidgetInfo, 0); 2182ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 2183ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen 2184ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen void addAppWidgetImpl(final int appWidgetId, final ItemInfo info, 2185ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen final AppWidgetHostView boundWidget, final AppWidgetProviderInfo appWidgetInfo, int 2186ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen delay) { 21879d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen if (appWidgetInfo.configure != null) { 21889d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo = appWidgetInfo; 21894637b5ada9cccb5f698fcff73a96a7ce16148e5bAdam Cohen mPendingAddWidgetId = appWidgetId; 2190af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka 21917984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert // Launch over to configure widget, if needed 21927984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); 21939d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen intent.setComponent(appWidgetInfo.configure); 21947984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 2195a805e1a297c0d1fa84d9fed51e0167aa32bd42bbMichael Jurka Utilities.startActivityForResultSafely(this, intent, REQUEST_CREATE_APPWIDGET); 21967984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert } else { 21977984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert // Otherwise just add it 2198ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen Runnable onComplete = new Runnable() { 2199ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen @Override 2200ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen public void run() { 2201ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen // Exit spring loaded mode if necessary after adding the widget 2202ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen exitSpringLoadedDragModeDelayed(true, EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT, 2203ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen null); 2204ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen } 2205ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }; 2206dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen completeAddAppWidget(appWidgetId, info.container, info.screenId, boundWidget, 22079d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen appWidgetInfo); 2208689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreenDelayed(true, onComplete, delay, false); 220931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 221031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2211cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2212af110e8603b2f372286d9155cbe8955a6a329e2dAllan Wojciechowski protected void moveToCustomContentScreen(boolean animate) { 2213f2b47f13cec19c8e06754fa1c3f46892349c217fSandeep Siddhartha // Close any folders that may be open. 2214f2b47f13cec19c8e06754fa1c3f46892349c217fSandeep Siddhartha closeFolder(); 2215af110e8603b2f372286d9155cbe8955a6a329e2dAllan Wojciechowski mWorkspace.moveToCustomContentScreen(animate); 2216af110e8603b2f372286d9155cbe8955a6a329e2dAllan Wojciechowski } 2217fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen /** 2218fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * Process a shortcut drop. 2219fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * 2220fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param componentName The name of the component 2221dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen * @param screenId The ID of the screen where it should be added 2222fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param cell The cell it should be added to, optional 2223fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param position The location on the screen where it was dropped, optional 2224fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen */ 2225dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen void processShortcutFromDrop(ComponentName componentName, long container, long screenId, 22263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int[] cell, int[] loc) { 22270280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka resetAddInfo(); 22283d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = container; 2229dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = screenId; 22303d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.dropPos = loc; 2231fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 2232fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (cell != null) { 22333d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = cell[0]; 22343d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellY = cell[1]; 2235fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 22360280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 22370280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka Intent createShortcutIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT); 22380280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka createShortcutIntent.setComponent(componentName); 22390280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka processShortcut(createShortcutIntent); 22400280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 22410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 2242fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen /** 2243fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * Process a widget drop. 2244fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * 2245fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param info The PendingAppWidgetInfo of the widget being added. 2246dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen * @param screenId The ID of the screen where it should be added 2247fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param cell The cell it should be added to, optional 2248fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen * @param position The location on the screen where it was dropped, optional 2249fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen */ 2250dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen void addAppWidgetFromDrop(PendingAddWidgetInfo info, long container, long screenId, 2251d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen int[] cell, int[] span, int[] loc) { 2252fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen resetAddInfo(); 22533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.container = info.container = container; 2254dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mPendingAddInfo.screenId = info.screenId = screenId; 22553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.dropPos = loc; 2256d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.minSpanX = info.minSpanX; 2257d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.minSpanY = info.minSpanY; 2258d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen 2259fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (cell != null) { 22603d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellX = cell[0]; 22613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mPendingAddInfo.cellY = cell[1]; 2262fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 2263d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen if (span != null) { 2264d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.spanX = span[0]; 2265d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mPendingAddInfo.spanY = span[1]; 2266d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen } 2267fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 2268ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen AppWidgetHostView hostView = info.boundWidget; 2269ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen int appWidgetId; 2270ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (hostView != null) { 2271ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen appWidgetId = hostView.getAppWidgetId(); 22729d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen addAppWidgetImpl(appWidgetId, info, hostView, info.info); 2273ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } else { 22749d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // In this case, we either need to start an activity to get permission to bind 22759d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen // the widget, or we need to start an activity to configure the widget, or both. 2276ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen appWidgetId = getAppWidgetHost().allocateAppWidgetId(); 2277dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen Bundle options = info.bindOptions; 2278dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen 2279dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen boolean success = false; 2280dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen if (options != null) { 2281dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen success = mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, 2282dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen info.componentName, options); 2283dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen } else { 2284dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen success = mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, 2285dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen info.componentName); 2286dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen } 2287dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen if (success) { 22889d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen addAppWidgetImpl(appWidgetId, info, null, info.info); 22898b805b17158886035b38261eb611d8641701ae43Michael Jurka } else { 22909d5b7d81ae498da060deb387a14b6a8475415592Adam Cohen mPendingAddWidgetInfo = info.info; 22918b805b17158886035b38261eb611d8641701ae43Michael Jurka Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); 22928b805b17158886035b38261eb611d8641701ae43Michael Jurka intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 22938b805b17158886035b38261eb611d8641701ae43Michael Jurka intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName); 2294dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen // TODO: we need to make sure that this accounts for the options bundle. 2295dd70d66852bb8bd16f55796e546ba290360d1198Adam Cohen // intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); 22968b805b17158886035b38261eb611d8641701ae43Michael Jurka startActivityForResult(intent, REQUEST_BIND_APPWIDGET); 22978b805b17158886035b38261eb611d8641701ae43Michael Jurka } 2298ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 2299fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 2300fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 2301deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato void processShortcut(Intent intent) { 2302ed13187a745866483139e2878037e1f8427ce567Kenny Guy Utilities.startActivityForResultSafely(this, intent, REQUEST_CREATE_SHORTCUT); 230331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 230431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 230524ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung void processWallpaper(Intent intent) { 230624ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung startActivityForResult(intent, REQUEST_PICK_WALLPAPER); 230724ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung } 230824ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung 2309dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen FolderIcon addFolder(CellLayout layout, long container, final long screenId, int cellX, 23103d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int cellY) { 2311c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka final FolderInfo folderInfo = new FolderInfo(); 231231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project folderInfo.title = getText(R.string.folder_name); 231331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 231431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Update the model 2315dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen LauncherModel.addItemToDatabase(Launcher.this, folderInfo, container, screenId, cellX, cellY, 23163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung false); 2317319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sFolders.put(folderInfo.id, folderInfo); 231831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 231931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Create the view 23203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung FolderIcon newFolder = 23213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo, mIconCache); 2322dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen mWorkspace.addInScreen(newFolder, container, screenId, cellX, cellY, 1, 1, 23233d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung isWorkspaceLocked()); 23245f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Force measure the new folder icon 23255f8afe6280eae34620067696173e71943e1a30a3Winson Chung CellLayout parent = mWorkspace.getParentCellLayoutForView(newFolder); 23265f8afe6280eae34620067696173e71943e1a30a3Winson Chung parent.getShortcutsAndWidgets().measureChild(newFolder); 2327df0353815c629fc678824b07a234b89a1ff94208Adam Cohen return newFolder; 23289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 23299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 23309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato void removeFolder(FolderInfo folder) { 2331319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sFolders.remove(folder.id); 233231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2333cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 2334eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka protected ComponentName getWallpaperPickerComponent() { 23357ad868b86e45d6f58c186d2731ab2beb84643757Michael Jurka return new ComponentName(getPackageName(), LauncherWallpaperPickerActivity.class.getName()); 2336eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka } 2337eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka 23382ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato /** 23392ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato * Registers various content observers. The current implementation registers 23402ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato * only a favorites observer to keep track of the favorites applications. 23412ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato */ 23421e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private void registerContentObservers() { 23431e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey ContentResolver resolver = getContentResolver(); 23441e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey resolver.registerContentObserver(LauncherProvider.CONTENT_APPWIDGET_RESET_URI, 23451e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey true, mWidgetObserver); 23461e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 23471e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 234831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 234931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 235031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (event.getAction() == KeyEvent.ACTION_DOWN) { 235131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project switch (event.getKeyCode()) { 2352678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn case KeyEvent.KEYCODE_HOME: 2353678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn return true; 2354be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 23550a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka if (isPropertyEnabled(DUMP_STATE_PROPERTY)) { 2356be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato dumpState(); 2357be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato return true; 2358be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 2359be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato break; 2360678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn } 2361678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn } else if (event.getAction() == KeyEvent.ACTION_UP) { 2362678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn switch (event.getKeyCode()) { 236331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case KeyEvent.KEYCODE_HOME: 236431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return true; 236531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 236631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 236731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 236831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return super.dispatchKeyEvent(event); 236931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 237031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 237188ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato @Override 237288ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato public void onBackPressed() { 2373c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung if (isAllAppsVisible()) { 2374ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen if (mAppsCustomizeContent.getContentType() == 2375ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen AppsCustomizePagedView.ContentType.Applications) { 2376ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showWorkspace(true); 2377ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen } else { 2378ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showOverviewMode(true); 2379ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen } 2380f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } else if (mWorkspace.isInOverviewMode()) { 2381336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka mWorkspace.exitOverviewMode(true); 238294f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy } else if (mWorkspace.getOpenFolder() != null) { 238376fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen Folder openFolder = mWorkspace.getOpenFolder(); 238476fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen if (openFolder.isEditingName()) { 238576fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen openFolder.dismissEditingName(); 238676fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen } else { 238776fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen closeFolder(); 238876fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen } 238994f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy } else { 2390758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy mWorkspace.exitWidgetResizeMode(); 2391758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy 239294f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy // Back button is a no-op here, but give at least some feedback for the button press 239394f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy mWorkspace.showOutlinesTemporarily(); 2394af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka } 239588ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato } 239688ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato 239731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 23981e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey * Re-listen when widgets are reset. 23991e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey */ 24001e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private void onAppWidgetReset() { 2401bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka if (mAppWidgetHost != null) { 2402bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka mAppWidgetHost.startListening(); 2403bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka } 24041e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 24051e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 24061e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey /** 240731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Launches the intent referred by the clicked shortcut. 240831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 240931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param v The view representing the clicked shortcut. 241031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 241131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onClick(View v) { 24129932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen // Make sure that rogue clicks don't get through while allapps is launching, or after the 24139932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen // view has detached (it's possible for this to happen if the view is removed mid touch). 24149932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen if (v.getWindowToken() == null) { 24159932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen return; 24169932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen } 24179932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen 24189b0b2fefb2de9aca457ab1c38ffd08d7667f4065Winson Chung if (!mWorkspace.isFinishedSwitchingState()) { 24199932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen return; 24209932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen } 24212f84ef259314b0bef20f6e7e503377212fadc88cAdam Cohen 24221697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (v instanceof Workspace) { 24231697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (mWorkspace.isInOverviewMode()) { 24241697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen mWorkspace.exitOverviewMode(true); 2425f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2426f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen return; 2427f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2428f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 2429f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen if (v instanceof CellLayout) { 2430f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen if (mWorkspace.isInOverviewMode()) { 2431336fd4f65b8fa0f5188060eba351fa70bb5bfde0Michael Jurka mWorkspace.exitOverviewMode(mWorkspace.indexOfChild(v), true); 2432f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2433f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen } 2434f358a4bbd6ce5b6ddadfae19e6b9c6872530d627Adam Cohen 243531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Object tag = v.getTag(); 24360589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (tag instanceof ShortcutInfo) { 2437a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha onClickAppShortcut(v); 243831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else if (tag instanceof FolderInfo) { 2439a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (v instanceof FolderIcon) { 2440a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha onClickFolderIcon(v); 2441a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 2442f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else if (v == mAllAppsButton) { 2443a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha onClickAllAppsButton(v); 244431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 244531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 244631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 24470e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka public boolean onTouch(View v, MotionEvent event) { 24480e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka return false; 24490e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka } 24500e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka 2451af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka /** 24522c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * Event handler for the search button 24532c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * 24542c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * @param v The view that was clicked. 24552c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka */ 24562c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka public void onClickSearchButton(View v) { 2457bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 2458bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung 2459a135ba896e4e12a99deb054f671c63535c3e11e3Amith Yamasani onSearchRequested(); 24602c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka } 24612c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka 24622c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka /** 24636d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani * Event handler for the voice button 24646d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani * 24656d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani * @param v The view that was clicked. 24666d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani */ 24676d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani public void onClickVoiceButton(View v) { 2468bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 24696d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani 2470c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert startVoice(); 2471c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 2472c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 2473c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert public void startVoice() { 2474ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka try { 2475ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka final SearchManager searchManager = 2476ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka (SearchManager) getSystemService(Context.SEARCH_SERVICE); 2477ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka ComponentName activityName = searchManager.getGlobalSearchActivity(); 2478ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); 2479f615f710bb1a1c6fdccb538c1add4db5925d7799Andy Huang intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2480ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka if (activityName != null) { 2481ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka intent.setPackage(activityName.getPackageName()); 2482ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 248386a720e4927a997e9fd98276d2dab67244138f79Michael Jurka startActivity(null, intent, "onClickVoiceButton"); 2484ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } catch (ActivityNotFoundException e) { 2485ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); 2486f615f710bb1a1c6fdccb538c1add4db5925d7799Andy Huang intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2487ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka startActivitySafely(null, intent, "onClickVoiceButton"); 2488ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 24896d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 24906d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani 24916d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani /** 24922c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * Event handler for the "grid" button that appears on the home screen, which 24932c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * enters all apps mode. 24942c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * 24952c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka * @param v The view that was clicked. 24962c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka */ 2497a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha protected void onClickAllAppsButton(View v) { 2498a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickAllAppsButton"); 2499a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (isAllAppsVisible()) { 2500a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha showWorkspace(true); 2501a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } else { 2502a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha showAllApps(true, AppsCustomizePagedView.ContentType.Applications, false); 2503a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2504a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2505a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2506a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 25073b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik * Event handler for a paged view icon click. 25083b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik * @param v The view that was clicked. 25093b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik * @param appInfo The {link AppInfo} of the view. 25103b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik */ 25113b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik public void onClickPagedViewIcon(View v, AppInfo appInfo) { 25123b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik if (LOGD) Log.d(TAG, "onClickPagedViewIcon"); 25133b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik startActivitySafely(v, appInfo.intent, appInfo); 25143b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik getStats().recordLaunch(appInfo.intent); 25153b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik } 25163b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik 25173b1a54a2069cfe576dbb043ccf23d24371ffd3a5Mohammadinamul Sheik /** 2518a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for an app shortcut click. 2519a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * 2520a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * @param v The view that was clicked. Must be a tagged with a {@link ShortcutInfo}. 2521a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 252240c5ed303909c4df71037be3429aa1423e59585fChris Wren protected void onClickAppShortcut(final View v) { 2523a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickAppShortcut"); 2524a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha Object tag = v.getTag(); 2525a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (!(tag instanceof ShortcutInfo)) { 2526a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha throw new IllegalArgumentException("Input must be a Shortcut"); 2527a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2528a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2529a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Open shortcut 2530a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final ShortcutInfo shortcut = (ShortcutInfo) tag; 2531a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final Intent intent = shortcut.intent; 2532a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2533a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Check for special shortcuts 2534a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (intent.getComponent() != null) { 2535a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final String shortcutClass = intent.getComponent().getClassName(); 2536a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2537a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (shortcutClass.equals(MemoryDumpActivity.class.getName())) { 2538a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha MemoryDumpActivity.startDump(this); 2539a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha return; 2540a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } else if (shortcutClass.equals(ToggleWeightWatcher.class.getName())) { 2541a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha toggleShowWeightWatcher(); 2542a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha return; 2543a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2544a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2545a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 254640c5ed303909c4df71037be3429aa1423e59585fChris Wren // Check for abandoned promise 254740c5ed303909c4df71037be3429aa1423e59585fChris Wren if (shortcut.isAbandoned() && v instanceof BubbleTextView) { 254840c5ed303909c4df71037be3429aa1423e59585fChris Wren AlertDialog.Builder builder = new AlertDialog.Builder(this); 254940c5ed303909c4df71037be3429aa1423e59585fChris Wren builder.setTitle(R.string.abandoned_promises_title); 2550803a4bec0fe4f291b5e131f0a4fcb6ca8ecd2ec3Chris Wren builder.setMessage(R.string.abandoned_promise_explanation); 255140c5ed303909c4df71037be3429aa1423e59585fChris Wren builder.setPositiveButton(R.string.abandoned_search, 255240c5ed303909c4df71037be3429aa1423e59585fChris Wren new DialogInterface.OnClickListener() { 255340c5ed303909c4df71037be3429aa1423e59585fChris Wren public void onClick(DialogInterface dialog, int id) { 255440c5ed303909c4df71037be3429aa1423e59585fChris Wren startAppShortcutActivity(v); 255540c5ed303909c4df71037be3429aa1423e59585fChris Wren } 255640c5ed303909c4df71037be3429aa1423e59585fChris Wren } 255740c5ed303909c4df71037be3429aa1423e59585fChris Wren ); 255840c5ed303909c4df71037be3429aa1423e59585fChris Wren builder.setNeutralButton(R.string.abandoned_clean_this, 255940c5ed303909c4df71037be3429aa1423e59585fChris Wren new DialogInterface.OnClickListener() { 256040c5ed303909c4df71037be3429aa1423e59585fChris Wren public void onClick(DialogInterface dialog, int id) { 256140c5ed303909c4df71037be3429aa1423e59585fChris Wren final BubbleTextView bubble = (BubbleTextView) v; 256240c5ed303909c4df71037be3429aa1423e59585fChris Wren final UserHandleCompat user = UserHandleCompat.myUserHandle(); 256340c5ed303909c4df71037be3429aa1423e59585fChris Wren mWorkspace.removeAbandonedPromise(bubble, user); 256440c5ed303909c4df71037be3429aa1423e59585fChris Wren } 256540c5ed303909c4df71037be3429aa1423e59585fChris Wren }); 256640c5ed303909c4df71037be3429aa1423e59585fChris Wren builder.create().show(); 256740c5ed303909c4df71037be3429aa1423e59585fChris Wren return; 256840c5ed303909c4df71037be3429aa1423e59585fChris Wren } 256940c5ed303909c4df71037be3429aa1423e59585fChris Wren 2570a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Start activities 257140c5ed303909c4df71037be3429aa1423e59585fChris Wren startAppShortcutActivity(v); 257240c5ed303909c4df71037be3429aa1423e59585fChris Wren } 257340c5ed303909c4df71037be3429aa1423e59585fChris Wren 257440c5ed303909c4df71037be3429aa1423e59585fChris Wren private void startAppShortcutActivity(View v) { 257540c5ed303909c4df71037be3429aa1423e59585fChris Wren Object tag = v.getTag(); 257640c5ed303909c4df71037be3429aa1423e59585fChris Wren if (!(tag instanceof ShortcutInfo)) { 257740c5ed303909c4df71037be3429aa1423e59585fChris Wren throw new IllegalArgumentException("Input must be a Shortcut"); 257840c5ed303909c4df71037be3429aa1423e59585fChris Wren } 257940c5ed303909c4df71037be3429aa1423e59585fChris Wren final ShortcutInfo shortcut = (ShortcutInfo) tag; 258040c5ed303909c4df71037be3429aa1423e59585fChris Wren final Intent intent = shortcut.intent; 258140c5ed303909c4df71037be3429aa1423e59585fChris Wren 2582a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha int[] pos = new int[2]; 2583a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha v.getLocationOnScreen(pos); 2584a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha intent.setSourceBounds(new Rect(pos[0], pos[1], 2585a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha pos[0] + v.getWidth(), pos[1] + v.getHeight())); 2586a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2587a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha boolean success = startActivitySafely(v, intent, tag); 2588a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2589a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha mStats.recordLaunch(intent, shortcut); 2590a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2591a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (success && v instanceof BubbleTextView) { 2592a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha mWaitingForResume = (BubbleTextView) v; 2593a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha mWaitingForResume.setStayPressed(true); 2594a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2595a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2596a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2597a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2598a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for a folder icon click. 2599a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * 2600a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * @param v The view that was clicked. Must be an instance of {@link FolderIcon}. 2601a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 2602a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha protected void onClickFolderIcon(View v) { 2603a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickFolder"); 2604a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (!(v instanceof FolderIcon)){ 2605a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha throw new IllegalArgumentException("Input must be a FolderIcon"); 2606a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2607a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2608a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha FolderIcon folderIcon = (FolderIcon) v; 2609a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final FolderInfo info = folderIcon.getFolderInfo(); 2610a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha Folder openFolder = mWorkspace.getFolderForTag(info); 2611a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2612a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // If the folder info reports that the associated folder is open, then verify that 2613a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // it is actually opened. There have been a few instances where this gets out of sync. 2614a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (info.opened && openFolder == null) { 2615a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha Log.d(TAG, "Folder info marked as open, but associated folder is not open. Screen: " 2616a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha + info.screenId + " (" + info.cellX + ", " + info.cellY + ")"); 2617a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha info.opened = false; 2618a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2619a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2620a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (!info.opened && !folderIcon.getFolder().isDestroyed()) { 2621a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Close any open folder 2622a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha closeFolder(); 2623a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Open the requested folder 2624a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha openFolder(folderIcon); 2625a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } else { 2626a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Find the open folder... 2627a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha int folderScreen; 2628a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (openFolder != null) { 2629a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha folderScreen = mWorkspace.getPageForView(openFolder); 2630a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // .. and close it 2631a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha closeFolder(openFolder); 2632a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (folderScreen != mWorkspace.getCurrentPage()) { 2633a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Close any folder open on the current screen 2634a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha closeFolder(); 2635a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha // Pull the folder onto this screen 2636a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha openFolder(folderIcon); 2637a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2638a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2639a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 26405130e401a005fcf6afba6e8e72a628fc45f9a287Michael Jurka } 26415130e401a005fcf6afba6e8e72a628fc45f9a287Michael Jurka 2642d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha /** 2643d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha * Event handler for the (Add) Widgets button that appears after a long press 2644d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha * on the home screen. 2645d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha */ 26467b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal protected void onClickAddWidgetButton(View view) { 2647a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickAddWidgetButton"); 2648d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true); 2649d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha } 2650d805837a877bb503d7890c4f92cfd183dec8c5eeSandeep Siddhartha 2651a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2652a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for the wallpaper picker button that appears after a long press 2653a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * on the home screen. 2654a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 26557b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal protected void onClickWallpaperPicker(View v) { 2656a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickWallpaperPicker"); 2657a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER); 2658a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha pickWallpaper.setComponent(getWallpaperPickerComponent()); 2659a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha startActivityForResult(pickWallpaper, REQUEST_PICK_WALLPAPER); 2660a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2661a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 2662a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha /** 2663a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * Event handler for a click on the settings button that appears after a long press 2664a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha * on the home screen. 2665a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha */ 26667b168a1bb94044d9ae11004bae18beba9eed46fdAnjali Koppal protected void onClickSettingsButton(View v) { 2667a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha if (LOGD) Log.d(TAG, "onClickSettingsButton"); 2668a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha } 2669a942030eb65a57f19ef0ab62aeeb9287840d16e6Sandeep Siddhartha 26705130e401a005fcf6afba6e8e72a628fc45f9a287Michael Jurka public void onTouchDownAllAppsButton(View v) { 26712a55232840acc214d95474a3734b3b897669efd9Michael Jurka // Provide the same haptic feedback that the system offers for virtual keys. 26722a55232840acc214d95474a3734b3b897669efd9Michael Jurka v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 26732c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka } 26742c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka 267561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen public void performHapticFeedbackOnTouchDown(View v) { 267661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen // Provide the same haptic feedback that the system offers for virtual keys. 267761f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 267861f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 267961f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 268061f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen public View.OnTouchListener getHapticFeedbackTouchListener() { 268161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen if (mHapticFeedbackTouchListener == null) { 268261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen mHapticFeedbackTouchListener = new View.OnTouchListener() { 268361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen @Override 268461f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen public boolean onTouch(View v, MotionEvent event) { 268561f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) { 268661f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); 268761f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 268861f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen return false; 268961f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 269061f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen }; 269161f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 269261f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen return mHapticFeedbackTouchListener; 269361f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen } 269461f560d92ab4b11a61beeb8df97b9952027e08e4Adam Cohen 2695ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy public void onClickAppMarketButton(View v) { 2696d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON) { 2697d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (mAppMarketIntent != null) { 2698d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung startActivitySafely(v, mAppMarketIntent, "app market"); 2699d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } else { 2700d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung Log.e(TAG, "Invalid app market intent."); 2701d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } 2702ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy } 2703ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy } 2704ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy 270562d18edcc74ce96e2955048f5e0fc0ce3e4ec275Anjali Koppal public void onDragStarted(View view) {} 270662d18edcc74ce96e2955048f5e0fc0ce3e4ec275Anjali Koppal 2707ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha /** 2708ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * Called when the user stops interacting with the launcher. 2709ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * This implies that the user is now on the homescreen and is not doing housekeeping. 2710ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha */ 2711ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha protected void onInteractionEnd() {} 2712ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha 2713ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha /** 2714ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * Called when the user starts interacting with the launcher. 2715ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * The possible interactions are: 2716ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * - open all apps 2717ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * - reorder an app shortcut, or a widget 2718ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * - open the overview mode. 2719ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * This is a good time to stop doing things that only make sense 2720ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha * when the user is on the homescreen and not doing housekeeping. 2721ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha */ 2722ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha protected void onInteractionBegin() {} 2723ab2d9d72ae0a37553a82fa845c412167c727a258Sandeep Siddhartha 2724bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy void startApplicationDetailsActivity(ComponentName componentName) { 2725bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy String packageName = componentName.getPackageName(); 27264ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, 27274ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy Uri.fromParts("package", packageName, null)); 2728850f91320c3ae6eeb4b248757b8aa7e14f83ea7cAdrian Roos intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | 2729850f91320c3ae6eeb4b248757b8aa7e14f83ea7cAdrian Roos Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 27303b1b36bf2ebed328ab60f1f78fe4d5bdd5322f2eWinson Chung startActivitySafely(null, intent, "startApplicationDetailsActivity"); 27314ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy } 27324ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy 27331e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka // returns true if the activity was started 2734d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy boolean startApplicationUninstallActivity(ComponentName componentName, int flags, 2735d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy UserHandleCompat user) { 2736eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka if ((flags & AppInfo.DOWNLOADED_FLAG) == 0) { 27375539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy // System applications cannot be installed. For now, show a toast explaining that. 27385539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy // We may give them the option of disabling apps this way. 27395539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy int messageId = R.string.uninstall_system_app_text; 27405539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy Toast.makeText(this, messageId, Toast.LENGTH_SHORT).show(); 27411e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka return false; 27425539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } else { 27431e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka String packageName = componentName.getPackageName(); 27441e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka String className = componentName.getClassName(); 27455539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy Intent intent = new Intent( 27465539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy Intent.ACTION_DELETE, Uri.fromParts("package", packageName, className)); 2747dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 2748dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 2749d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy if (user != null) { 2750d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy user.addToIntent(intent, Intent.EXTRA_USER); 2751d31df54073fbd80a9db9d277dde8c0e7421ffa14Kenny Guy } 27525539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy startActivity(intent); 27531e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka return true; 27545539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 2755bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy } 2756bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy 275786a720e4927a997e9fd98276d2dab67244138f79Michael Jurka boolean startActivity(View v, Intent intent, Object tag) { 2758b6cc40bc15ef97ba7d677295c9a3870f18eadbe2Kenny Guy intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 275931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project try { 27602672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung // Only launch using the new animation if the shortcut has not opted out (this is a 27612672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung // private contract between launcher and may be ignored in the future). 27622672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung boolean useLaunchAnimation = (v != null) && 27632672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung !intent.hasExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION); 2764ed13187a745866483139e2878037e1f8427ce567Kenny Guy LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this); 2765ed13187a745866483139e2878037e1f8427ce567Kenny Guy UserManagerCompat userManager = UserManagerCompat.getInstance(this); 2766ed13187a745866483139e2878037e1f8427ce567Kenny Guy 27671317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy UserHandleCompat user = null; 27681317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy if (intent.hasExtra(AppInfo.EXTRA_PROFILE)) { 27691317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy long serialNumber = intent.getLongExtra(AppInfo.EXTRA_PROFILE, -1); 27701317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy user = userManager.getUserForSerialNumber(serialNumber); 27711317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy } 27721317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy 27731317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy Bundle optsBundle = null; 27742672ff937ea7885d184679dfee9f355b7bf2fc7dWinson Chung if (useLaunchAnimation) { 2775c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(v, 0, 0, 2776c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung v.getMeasuredWidth(), v.getMeasuredHeight()); 27771317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy optsBundle = opts.toBundle(); 27781317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy } 27796ea3b116fc2eea7cc1a6892c548da45a4f581a1dAdam Cohen if (useLaunchAnimation && Utilities.isLmp()) { 27806ea3b116fc2eea7cc1a6892c548da45a4f581a1dAdam Cohen ActivityOptions opts = ActivityOptions.makeCustomAnimation(this, R.anim.task_open_enter, R.anim.no_anim); 27816ea3b116fc2eea7cc1a6892c548da45a4f581a1dAdam Cohen optsBundle = opts.toBundle(); 27826ea3b116fc2eea7cc1a6892c548da45a4f581a1dAdam Cohen } 27831317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy 27841317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy if (user == null || user.equals(UserHandleCompat.myUserHandle())) { 27851317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy // Could be launching some bookkeeping activity 27861317e2dd4a2fb097d1e54759536d515fdeca2c3eKenny Guy startActivity(intent, optsBundle); 2787c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung } else { 2788c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal // TODO Component can be null when shortcuts are supported for secondary user 2789c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy launcherApps.startActivityForProfile(intent.getComponent(), user, 2790c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy intent.getSourceBounds(), optsBundle); 2791c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung } 2792ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka return true; 279331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } catch (SecurityException e) { 279431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 2795a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato Log.e(TAG, "Launcher does not have the permission to launch " + intent + 279631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ". Make sure to create a MAIN intent-filter for the corresponding activity " + 2797f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato "or use the exported attribute for this activity. " 2798f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato + "tag="+ tag + " intent=" + intent, e); 27998e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy } 2800ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka return false; 28018e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy } 2802aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 280386a720e4927a997e9fd98276d2dab67244138f79Michael Jurka boolean startActivitySafely(View v, Intent intent, Object tag) { 280486a720e4927a997e9fd98276d2dab67244138f79Michael Jurka boolean success = false; 2805c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal if (mIsSafeModeEnabled && !Utilities.isSystemApp(this, intent)) { 2806c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal Toast.makeText(this, R.string.safemode_shortcut_error, Toast.LENGTH_SHORT).show(); 2807c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal return false; 2808c5c60ad3592f53549c9ffaa58e9a87b0480080e8Sunny Goyal } 280986a720e4927a997e9fd98276d2dab67244138f79Michael Jurka try { 281086a720e4927a997e9fd98276d2dab67244138f79Michael Jurka success = startActivity(v, intent, tag); 281186a720e4927a997e9fd98276d2dab67244138f79Michael Jurka } catch (ActivityNotFoundException e) { 281286a720e4927a997e9fd98276d2dab67244138f79Michael Jurka Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 281386a720e4927a997e9fd98276d2dab67244138f79Michael Jurka Log.e(TAG, "Unable to launch. tag=" + tag + " intent=" + intent, e); 281486a720e4927a997e9fd98276d2dab67244138f79Michael Jurka } 281586a720e4927a997e9fd98276d2dab67244138f79Michael Jurka return success; 281686a720e4927a997e9fd98276d2dab67244138f79Michael Jurka } 281786a720e4927a997e9fd98276d2dab67244138f79Michael Jurka 2818268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen /** 2819268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen * This method draws the FolderIcon to an ImageView and then adds and positions that ImageView 2820268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen * in the DragLayer in the exact absolute location of the original FolderIcon. 2821268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen */ 2822268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private void copyFolderIconToImage(FolderIcon fi) { 2823268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen final int width = fi.getMeasuredWidth(); 2824268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen final int height = fi.getMeasuredHeight(); 2825268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 2826268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Lazy load ImageView, Bitmap and Canvas 2827268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mFolderIconImageView == null) { 2828268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconImageView = new ImageView(this); 2829268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 2830268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mFolderIconBitmap == null || mFolderIconBitmap.getWidth() != width || 2831268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconBitmap.getHeight() != height) { 2832268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 2833268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconCanvas = new Canvas(mFolderIconBitmap); 2834268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 2835268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 2836268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen DragLayer.LayoutParams lp; 2837268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mFolderIconImageView.getLayoutParams() instanceof DragLayer.LayoutParams) { 2838268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp = (DragLayer.LayoutParams) mFolderIconImageView.getLayoutParams(); 2839268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } else { 2840268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp = new DragLayer.LayoutParams(width, height); 2841268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 2842268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 2843307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen // The layout from which the folder is being opened may be scaled, adjust the starting 2844307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen // view size by this scale factor. 2845307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen float scale = mDragLayer.getDescendantRectRelativeToSelf(fi, mRectForFolderAnimation); 2846268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp.customPosition = true; 2847268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp.x = mRectForFolderAnimation.left; 2848268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen lp.y = mRectForFolderAnimation.top; 2849307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen lp.width = (int) (scale * width); 2850307fe23f125cbbd5512ad8d4660025f2ab68f30bAdam Cohen lp.height = (int) (scale * height); 2851268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 2852268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 2853268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen fi.draw(mFolderIconCanvas); 2854268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mFolderIconImageView.setImageBitmap(mFolderIconBitmap); 2855fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen if (fi.getFolder() != null) { 2856fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen mFolderIconImageView.setPivotX(fi.getFolder().getPivotXForIconAnimation()); 2857fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen mFolderIconImageView.setPivotY(fi.getFolder().getPivotYForIconAnimation()); 28588ec2303379eb467e063113385c9514063abed787Adam Cohen } 2859268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Just in case this image view is still in the drag layer from a previous animation, 2860268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // we remove it and re-add it. 2861268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (mDragLayer.indexOfChild(mFolderIconImageView) != -1) { 2862268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.removeView(mFolderIconImageView); 2863268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 2864268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.addView(mFolderIconImageView, lp); 2865fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen if (fi.getFolder() != null) { 2866fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen fi.getFolder().bringToFront(); 28678ec2303379eb467e063113385c9514063abed787Adam Cohen } 2868268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen } 2869268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 28702801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen private void growAndFadeOutFolderIcon(FolderIcon fi) { 28719932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen if (fi == null) return; 28722801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0); 28732801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.5f); 28742801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.5f); 28752801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 2876c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen FolderInfo info = (FolderInfo) fi.getTag(); 2877c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 2878c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen CellLayout cl = (CellLayout) fi.getParent().getParent(); 2879e50adee3d54978840036bb3a814771ce498aee18Winson Chung CellLayout.LayoutParams lp = (CellLayout.LayoutParams) fi.getLayoutParams(); 2880e50adee3d54978840036bb3a814771ce498aee18Winson Chung cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY); 2881c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen } 2882c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen 2883268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original 2884268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen copyFolderIconToImage(fi); 2885268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen fi.setVisibility(View.INVISIBLE); 2886268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 28872ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(mFolderIconImageView, alpha, 2888268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen scaleX, scaleY); 28892801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen oa.setDuration(getResources().getInteger(R.integer.config_folderAnimDuration)); 28902801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen oa.start(); 28912801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 28922801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 2893268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen private void shrinkAndFadeInFolderIcon(final FolderIcon fi) { 28949932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen if (fi == null) return; 28952801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f); 28962801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f); 28972801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f); 28982801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 2899268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen final CellLayout cl = (CellLayout) fi.getParent().getParent(); 2900268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen 2901268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // We remove and re-draw the FolderIcon in-case it has changed 2902268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.removeView(mFolderIconImageView); 2903268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen copyFolderIconToImage(fi); 29042ecf995e0d2d55eb71d03f7230ca87270872d1a3Michael Jurka ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(mFolderIconImageView, alpha, 2905268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen scaleX, scaleY); 29062801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen oa.setDuration(getResources().getInteger(R.integer.config_folderAnimDuration)); 2907c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen oa.addListener(new AnimatorListenerAdapter() { 2908c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen @Override 2909c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen public void onAnimationEnd(Animator animation) { 2910268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen if (cl != null) { 2911268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen cl.clearFolderLeaveBehind(); 2912268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen // Remove the ImageView copy of the FolderIcon and make the original visible. 2913268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen mDragLayer.removeView(mFolderIconImageView); 2914268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen fi.setVisibility(View.VISIBLE); 2915c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen } 2916c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen } 2917c51934bfdfed6a5011c6d6c5b7b70f2d75613d41Adam Cohen }); 29182801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen oa.start(); 29192801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 29202801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 292131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 2922774bd377df3053ef43e34ab8ca98160eb6811be1Michael Jurka * Opens the user folder described by the specified tag. The opening of the folder 292331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * is animated relative to the specified View. If the View is null, no animation 292431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * is played. 292531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 292631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param folderInfo The FolderInfo describing the folder to open. 292731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 2928a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen public void openFolder(FolderIcon folderIcon) { 2929fb91f303f5e672f9b4c4f9f8a03486b224d60cd6Adam Cohen Folder folder = folderIcon.getFolder(); 2930a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen FolderInfo info = folder.mInfo; 293131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2932a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen info.opened = true; 293331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 29344554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen // Just verify that the folder hasn't already been added to the DragLayer. 29354554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen // There was a one-off crash where the folder had a parent already. 29364554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen if (folder.getParent() == null) { 29374554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen mDragLayer.addView(folder); 29384554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen mDragController.addDropTarget((DropTarget) folder); 29394554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } else { 29404554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen Log.w(TAG, "Opening folder (" + folder + ") which already has a parent (" + 29414554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen folder.getParent() + ")."); 29424554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 2943a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen folder.animateOpen(); 2944268c4751b547e1470a94030af73a4e7bb8ea221eAdam Cohen growAndFadeOutFolderIcon(folderIcon); 294583ca480941b3dd635b62347008fc8d7859d82002Winson Chung 294683ca480941b3dd635b62347008fc8d7859d82002Winson Chung // Notify the accessibility manager that this folder "window" has appeared and occluded 294783ca480941b3dd635b62347008fc8d7859d82002Winson Chung // the workspace items 294883ca480941b3dd635b62347008fc8d7859d82002Winson Chung folder.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 294983ca480941b3dd635b62347008fc8d7859d82002Winson Chung getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); 29504554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 29514554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen 29524554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen public void closeFolder() { 295337c717ffa626c6690ea45ba88e5dfc9bea39ed6eAdam Cohen Folder folder = mWorkspace != null ? mWorkspace.getOpenFolder() : null; 29544554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen if (folder != null) { 2955ac56cff1860b71d3f164aedd268703936e08fdc0Adam Cohen if (folder.isEditingName()) { 2956ac56cff1860b71d3f164aedd268703936e08fdc0Adam Cohen folder.dismissEditingName(); 2957ac56cff1860b71d3f164aedd268703936e08fdc0Adam Cohen } 29584554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen closeFolder(folder); 29597d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 29607d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Dismiss the folder cling 2961a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissFolderCling(null); 29624554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 29634554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 29644554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen 29654554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen void closeFolder(Folder folder) { 29664554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen folder.getInfo().opened = false; 29674554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen 29684554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen ViewGroup parent = (ViewGroup) folder.getParent().getParent(); 29694554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen if (parent != null) { 29704554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen FolderIcon fi = (FolderIcon) mWorkspace.getViewForTag(folder.mInfo); 29714554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen shrinkAndFadeInFolderIcon(fi); 29724554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen } 29734554ee16f122a3dbd9a8d3b828f1c8c7e7b7fe99Adam Cohen folder.animateClosed(); 297483ca480941b3dd635b62347008fc8d7859d82002Winson Chung 297583ca480941b3dd635b62347008fc8d7859d82002Winson Chung // Notify the accessibility manager that this folder "window" has disappeard and no 297683ca480941b3dd635b62347008fc8d7859d82002Winson Chung // longer occludeds the workspace items 297783ca480941b3dd635b62347008fc8d7859d82002Winson Chung getDragLayer().sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 297831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 297931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 298031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onLongClick(View v) { 298136a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung if (!isDraggingEnabled()) return false; 298236a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung if (isWorkspaceLocked()) return false; 298336a62fe917be0a2520c457f985075fb5d3d09d1cWinson Chung if (mState != State.WORKSPACE) return false; 298431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 29851697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (v instanceof Workspace) { 29861697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen if (!mWorkspace.isInOverviewMode()) { 298793c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen if (mWorkspace.enterOverviewMode()) { 298893c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, 298993c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); 299093c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen return true; 299193c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen } else { 299293c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen return false; 299393c9756e7a64e782e6b78ec978d2f7a5802c277dAdam Cohen } 2994aa4c8c1fea577431e218a927ae8ba6c47e51bfdbAdam Cohen } else { 2995aa4c8c1fea577431e218a927ae8ba6c47e51bfdbAdam Cohen return false; 29961697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen } 29971697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen } 29981697b79a86c8244cf2758eec93e0ba299bc107d0Adam Cohen 2999e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen CellLayout.CellInfo longClickCellInfo = null; 3000e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen View itemUnderLongClick = null; 3001e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen if (v.getTag() instanceof ItemInfo) { 3002e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen ItemInfo info = (ItemInfo) v.getTag(); 3003e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen longClickCellInfo = new CellLayout.CellInfo(v, info);; 3004e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen itemUnderLongClick = longClickCellInfo.cell; 3005e0aaa0d3de0eedf5501fee762e0d8279a9e3bc3cAdam Cohen resetAddInfo(); 300631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 300731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 30083d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // The hotseat touch handling does not go through Workspace, and we always allow long press 30093d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // on hotseat items. 3010e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler final boolean inHotseat = isHotseatLayout(v); 3011e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler boolean allowLongPress = inHotseat || mWorkspace.allowLongPress(); 30123d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (allowLongPress && !mDragController.isDragging()) { 30130280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (itemUnderLongClick == null) { 3014d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen // User long pressed on empty space 3015d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, 3016d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); 3017d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen if (mWorkspace.isInOverviewMode()) { 3018d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen mWorkspace.startReordering(v); 3019d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen } else { 3020d3ecce919296594ceeed6619d32994360b65ae40Adam Cohen mWorkspace.enterOverviewMode(); 3021dedbd962dcfaf055a6835abf5b0000ce1564e51eAdam Cohen } 302231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 3023e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler final boolean isAllAppsButton = inHotseat && isAllAppsButtonRank( 3024e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler mHotseat.getOrderInHotseat( 3025e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler longClickCellInfo.cellX, 3026e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler longClickCellInfo.cellY)); 3027e26d09484575f9b1855e5bc42d4fa05a5342f054Dan Sandler if (!(itemUnderLongClick instanceof Folder || isAllAppsButton)) { 302831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // User long pressed on an item 30290280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka mWorkspace.startDrag(longClickCellInfo); 303031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 303131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 303231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 303331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return true; 303431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 303531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 30363d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung boolean isHotseatLayout(View layout) { 30373d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return mHotseat != null && layout != null && 30383d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); 30391fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy } 30401fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy 30413d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung /** 30423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung * Returns the CellLayout of the specified container at the specified screen. 30433d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung */ 3044dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen CellLayout getCellLayout(long container, long screenId) { 30453d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 30463d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mHotseat != null) { 30473d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return mHotseat.getLayout(); 30483d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 30493d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return null; 30509d31e9fa3dedf7c51b407c1c5fafe5294fc3c01bRomain Guy } 30513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 3052dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen return (CellLayout) mWorkspace.getScreenWithId(screenId); 3053a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy } 3054a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy } 3055a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy 3056843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler public boolean isAllAppsVisible() { 3057c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung return (mState == State.APPS_CUSTOMIZE) || (mOnResumeState == State.APPS_CUSTOMIZE); 3058fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato } 3059fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato 30606b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy /** 30616b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy * Helper method for the cameraZoomIn/cameraZoomOut animations 30626b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy * @param view The view being animated 30636b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy * @param scaleFactor The scale factor used for the zoom 30646b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy */ 3065b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka private void setPivotsForZoom(View view, float scaleFactor) { 30666b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy view.setPivotX(view.getWidth() / 2.0f); 30677777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen view.setPivotY(view.getHeight() / 2.0f); 30686b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy } 3069c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler 3070360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner private void setWorkspaceBackground(boolean workspace) { 3071360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner mLauncherView.setBackground(workspace ? 3072496fefb40d403101d0bf1d35ab77a4ae2e85843cMichael Jurka mWorkspaceBackgroundDrawable : null); 3073360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner } 3074360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner 30753a8a8f7c2355863006208fced945f63c9bdb40b4Selim Cinek protected void changeWallpaperVisiblity(boolean visible) { 3076bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0; 3077bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn int curflags = getWindow().getAttributes().flags 3078bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 3079bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn if (wpflags != curflags) { 3080bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn getWindow().setFlags(wpflags, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER); 3081bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn } 3082360310b74de10d7bd2cc0a2ab874b1d246a6a7baCraig Mautner setWorkspaceBackground(visible); 3083bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn } 3084bb003a540bb4599e020b36c2680e0f0f520b32d6Dianne Hackborn 3085a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka private void dispatchOnLauncherTransitionPrepare(View v, boolean animated, boolean toWorkspace) { 3086a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka if (v instanceof LauncherTransitionable) { 3087a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka ((LauncherTransitionable) v).onLauncherTransitionPrepare(this, animated, toWorkspace); 3088a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka } 3089a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka } 3090a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka 3091bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka private void dispatchOnLauncherTransitionStart(View v, boolean animated, boolean toWorkspace) { 3092bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka if (v instanceof LauncherTransitionable) { 3093bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka ((LauncherTransitionable) v).onLauncherTransitionStart(this, animated, toWorkspace); 3094bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka } 30957044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung 30967044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung // Update the workspace transition step as well 30977044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung dispatchOnLauncherTransitionStep(v, 0f); 30987044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung } 30997044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung 31007044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung private void dispatchOnLauncherTransitionStep(View v, float t) { 31017044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung if (v instanceof LauncherTransitionable) { 31027044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung ((LauncherTransitionable) v).onLauncherTransitionStep(this, t); 31037044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung } 3104bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka } 3105bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka 3106bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka private void dispatchOnLauncherTransitionEnd(View v, boolean animated, boolean toWorkspace) { 3107bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka if (v instanceof LauncherTransitionable) { 3108bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka ((LauncherTransitionable) v).onLauncherTransitionEnd(this, animated, toWorkspace); 3109bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka } 31107044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung 31117044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung // Update the workspace transition step as well 31127044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung dispatchOnLauncherTransitionStep(v, 1f); 3113bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka } 3114bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka 31153ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy /** 3116b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * Things to test when changing the following seven functions. 3117b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Home from workspace 3118b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - from center screen 3119b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - from other screens 3120b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Home from all apps 3121b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - from center screen 3122b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - from other screens 3123b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Back from all apps 3124b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - from center screen 3125b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - from other screens 3126b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Launch app from workspace and quit 3127b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with back 3128b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with home 3129b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Launch app from all apps and quit 3130b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with back 3131b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with home 3132b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Go to a screen that's not the default, then all 3133b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * apps, and launch and app, and go back 3134b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with back 3135b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * -with home 3136b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - On workspace, long press power and go back 3137b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with back 3138b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with home 3139b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - On all apps, long press power and go back 3140b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with back 3141b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - with home 3142b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - On workspace, power off 3143b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - On all apps, power off 3144b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Launch an app and turn off the screen while in that app 3145b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Go back with home key 3146b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Go back with back key TODO: make this not go to workspace 3147b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - From all apps 3148b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - From workspace 3149b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - Enter and exit car mode (becuase it causes an extra configuration changed) 3150b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - From all apps 3151b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - From the center workspace 3152b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * - From another workspace 3153b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka */ 3154b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3155b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka /** 31563ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy * Zoom the camera out from the workspace to reveal 'toView'. 31573ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy * Assumes that the view to show is anchored at either the very top or very bottom 31583ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy * of the screen. 31593ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy */ 3160bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka private void showAppsCustomizeHelper(final boolean animated, final boolean springLoaded) { 3161c58497ee619416c4949b16eb43486c11618b69e5Winson Chung AppsCustomizePagedView.ContentType contentType = mAppsCustomizeContent.getContentType(); 3162c58497ee619416c4949b16eb43486c11618b69e5Winson Chung showAppsCustomizeHelper(animated, springLoaded, contentType); 3163c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 31646c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 3165c58497ee619416c4949b16eb43486c11618b69e5Winson Chung private void showAppsCustomizeHelper(final boolean animated, final boolean springLoaded, 3166c58497ee619416c4949b16eb43486c11618b69e5Winson Chung final AppsCustomizePagedView.ContentType contentType) { 3167b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka if (mStateAnimation != null) { 3168f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka mStateAnimation.setDuration(0); 3169b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mStateAnimation.cancel(); 3170b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mStateAnimation = null; 3171b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 31726c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 31736c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen boolean material = Utilities.isLmp(); 31746c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 31753ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy final Resources res = getResources(); 3176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 3177f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final int duration = res.getInteger(R.integer.config_appsCustomizeZoomInTime); 3178f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final int fadeDuration = res.getInteger(R.integer.config_appsCustomizeFadeInTime); 31796c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final int revealDuration = res.getInteger(R.integer.config_appsCustomizeRevealTime); 31806c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 3181f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final float scale = (float) res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor); 3182bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka final View fromView = mWorkspace; 3183a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka final AppsCustomizeTabHost toView = mAppsCustomizeTabHost; 3184cff6af81d721415785bddc2efd74e179d2def9daAdam Cohen final int startDelay = 3185cff6af81d721415785bddc2efd74e179d2def9daAdam Cohen res.getInteger(R.integer.config_workspaceAppsCustomizeAnimationStagger); 31863ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy 3187b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka setPivotsForZoom(toView, scale); 31887247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy 31896c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen Workspace.State workspaceState = contentType == AppsCustomizePagedView.ContentType.Widgets ? 31906c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen Workspace.State.OVERVIEW_HIDDEN : Workspace.State.NORMAL_HIDDEN; 31912a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka Animator workspaceAnim = 31926c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mWorkspace.getChangeStateAnimation(workspaceState, animated); 319316f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal if (!LauncherAppState.isDisableAllApps() 3194306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal || contentType == AppsCustomizePagedView.ContentType.Widgets) { 3195306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal // Set the content type for the all apps/widgets space 3196c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeTabHost.setContentTypeImmediate(contentType); 3197c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 31987247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy 3199df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy if (animated) { 32006c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (!material) { 32016c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setScaleX(scale); 32026c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setScaleY(scale); 32036c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final LauncherViewPropertyAnimator scaleAnim = 32046c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(toView); 32056c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen scaleAnim. 32066c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen scaleX(1f).scaleY(1f). 32076c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen setDuration(duration). 32086c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen setInterpolator(new Workspace.ZoomOutInterpolator()); 32096c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32106c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setVisibility(View.VISIBLE); 32116c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setAlpha(0f); 32126c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final ObjectAnimator alphaAnim = LauncherAnimUtils 32136c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .ofFloat(toView, "alpha", 0f, 1f) 32146c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setDuration(fadeDuration); 32156c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen alphaAnim.setInterpolator(new DecelerateInterpolator(1.5f)); 32166c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen alphaAnim.addUpdateListener(new AnimatorUpdateListener() { 32176c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 32186c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationUpdate(ValueAnimator animation) { 32196c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (animation == null) { 32206c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen throw new RuntimeException("animation is null"); 32216c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 32226c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen float t = (Float) animation.getAnimatedValue(); 32236c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionStep(fromView, t); 32246c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionStep(toView, t); 32256c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 32266c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 322761033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen 32286c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // toView should appear right at the end of the workspace shrink 32296c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // animation 32306c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation = LauncherAnimUtils.createAnimatorSet(); 32316c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(scaleAnim).after(startDelay); 32326c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(alphaAnim).after(startDelay); 32336c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32346c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.addListener(new AnimatorListenerAdapter() { 32356c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 32366c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationStart(Animator animation) { 32376c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // Prepare the position 32386c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setTranslationX(0.0f); 32396c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setTranslationY(0.0f); 32406c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setVisibility(View.VISIBLE); 32416c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.bringToFront(); 3242059798af0927ade335bd9ed7a552798b17690bd8Michael Jurka } 32436c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 32446c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationEnd(Animator animation) { 32456c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionEnd(fromView, animated, false); 32466c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionEnd(toView, animated, false); 3247f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen 32486c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // Hide the search bar 32496c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (mSearchDropTargetBar != null) { 32506c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mSearchDropTargetBar.hideSearchBar(false); 32516c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 32526c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 32536c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 32546c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } else { 32556c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen int width = toView.getMeasuredWidth(); 32566c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen int height = toView.getMeasuredHeight(); 32576c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen float revealRadius = (float) Math.sqrt((width * width) / 4 + height * height); 32582a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka 32596c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation = LauncherAnimUtils.createAnimatorSet(); 32606c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32616c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen AppsCustomizePagedView content = (AppsCustomizePagedView) 32626c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.findViewById(R.id.apps_customize_pane_content); 32636c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32646c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen View page = content.getPageAt(content.getCurrentPage()); 32656c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen View revealView = content; 32666c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32676c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen float yDrift = height / 2f - 400; 32686c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32696c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen LauncherViewPropertyAnimator panelAlphaAndDrift = 32706c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(revealView); 32716c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen revealView.setTranslationY(yDrift); 32726c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen revealView.setAlpha(0.3f); 32736c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen panelAlphaAndDrift.alpha(1) 32746c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .translationY(0) 32756c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setDuration(revealDuration) 32766c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setInterpolator(new LogDecelerateInterpolator(100, 0)); 32776c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32786c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(panelAlphaAndDrift); 32796c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32806c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (page instanceof CellLayout) { 32816c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen CellLayout cellLayout = (CellLayout) page; 32826c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen cellLayout.enableHardwareLayer(true); 32836c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32846c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen View iconsView = cellLayout.getShortcutsAndWidgets(); 32856c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen iconsView.setAlpha(0f); 32866c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 32876c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen LauncherViewPropertyAnimator iconsAlpha = 32886c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(iconsView); 32896c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen iconsAlpha.alpha(1f) 32906c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setDuration(revealDuration - 100) 32916c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setInterpolator(new LogDecelerateInterpolator(100, 0)); 32926c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(iconsAlpha); 3293df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy } 329432174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung 32956c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen View pageIndicators = toView.findViewById(R.id.apps_customize_page_indicator); 32966c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen pageIndicators.setAlpha(0f); 32976c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final LauncherViewPropertyAnimator indicatorsAlpha = 32986c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(pageIndicators); 32996c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen indicatorsAlpha.alpha(1f); 33006c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen indicatorsAlpha.setDuration(revealDuration); 33016c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(indicatorsAlpha); 33026c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 33036c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen width = revealView.getMeasuredWidth(); 33046c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 33056c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen ValueAnimator reveal = 33066c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen ViewAnimationUtils.createCircularReveal(revealView, width / 2, 33076c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen height / 2 + 100, 0f, revealRadius); 33086c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen reveal.setDuration(revealDuration); 33096c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); 33106c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 33116c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setTranslationX(0); 33126c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setTranslationY(0); 33136c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setAlpha(1f); 33146c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // toView should appear right at the end of the workspace shrink 33156c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // animation 33166c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(reveal); 33176c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 33186c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen reveal.addListener(new AnimatorListenerAdapter() { 33196c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 33206c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationStart(Animator animation) { 33216c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // Prepare the position 33226c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.bringToFront(); 33236c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen toView.setVisibility(View.VISIBLE); 3324adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 33256c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 33266b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy 33276c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.addListener(new AnimatorListenerAdapter() { 33286c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 33296c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationEnd(Animator animation) { 33306c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionEnd(fromView, animated, false); 33316c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionEnd(toView, animated, false); 33326c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 33336c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen // Hide the search bar 33346c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (mSearchDropTargetBar != null) { 33356c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mSearchDropTargetBar.hideSearchBar(false); 33366c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 33376c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 33386c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 33392a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 33401899a36ab3aab7671420511f47eb8b273b9b1078Michael Jurka 33411899a36ab3aab7671420511f47eb8b273b9b1078Michael Jurka boolean delayAnim = false; 33426c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (workspaceAnim != null) { 33436c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(workspaceAnim); 33446c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 3345a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionPrepare(fromView, animated, false); 3346a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionPrepare(toView, animated, false); 33472a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka 33482a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // If any of the objects being animated haven't been measured/laid out 33492a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka // yet, delay the animation until we get a layout pass 3350bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka if ((((LauncherTransitionable) toView).getContent().getMeasuredWidth() == 0) || 33512a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka (mWorkspace.getMeasuredWidth() == 0) || 33522a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka (toView.getMeasuredWidth() == 0)) { 33532a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka delayAnim = true; 33541899a36ab3aab7671420511f47eb8b273b9b1078Michael Jurka } 33552a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka 33563dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka final AnimatorSet stateAnimation = mStateAnimation; 33573dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka final Runnable startAnimRunnable = new Runnable() { 33583dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka public void run() { 33593dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka // Check that mStateAnimation hasn't changed while 33603dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka // we waited for a layout/draw pass 33613dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka if (mStateAnimation != stateAnimation) 33623dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka return; 33633dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka setPivotsForZoom(toView, scale); 33643dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka dispatchOnLauncherTransitionStart(fromView, animated, false); 33653dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka dispatchOnLauncherTransitionStart(toView, animated, false); 3366f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka LauncherAnimUtils.startAnimationAfterNextDraw(mStateAnimation, toView); 33673dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka } 33683dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka }; 33692a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka if (delayAnim) { 3370f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka final ViewTreeObserver observer = toView.getViewTreeObserver(); 3371f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 3372f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka public void onGlobalLayout() { 3373f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka startAnimRunnable.run(); 3374f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka toView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 3375f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka } 3376f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka }); 33772a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } else { 33783dcd79ecb39af92b94ac7f41558c2743a51f0596Michael Jurka startAnimRunnable.run(); 33791899a36ab3aab7671420511f47eb8b273b9b1078Michael Jurka } 33806b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy } else { 3381df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy toView.setTranslationX(0.0f); 3382df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy toView.setTranslationY(0.0f); 3383df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy toView.setScaleX(1.0f); 3384df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy toView.setScaleY(1.0f); 3385df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy toView.setVisibility(View.VISIBLE); 3386785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung toView.bringToFront(); 3387bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka 3388e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (!springLoaded && !LauncherAppState.getInstance().isScreenLarge()) { 3389c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung // Hide the search bar 3390adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 3391adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung mSearchDropTargetBar.hideSearchBar(false); 3392adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 3393abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 3394a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionPrepare(fromView, animated, false); 3395bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionStart(fromView, animated, false); 3396bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionEnd(fromView, animated, false); 3397a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionPrepare(toView, animated, false); 3398bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionStart(toView, animated, false); 3399bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionEnd(toView, animated, false); 34006b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy } 34013ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy } 34027247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy 34033ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy /** 34043ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy * Zoom the camera back into the workspace, hiding 'fromView'. 3405b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka * This is the opposite of showAppsCustomizeHelper. 34066b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy * @param animated If true, the transition will be animated. 34073ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy */ 3408ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen private void hideAppsCustomizeHelper(Workspace.State toState, final boolean animated, 3409ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen final boolean springLoaded, final Runnable onCompleteRunnable) { 3410bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka 3411b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka if (mStateAnimation != null) { 3412f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka mStateAnimation.setDuration(0); 3413b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mStateAnimation.cancel(); 3414b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mStateAnimation = null; 3415b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 34166c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34176c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen boolean material = Utilities.isLmp(); 34186c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34193ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy Resources res = getResources(); 3420f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen 3421f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final int duration = res.getInteger(R.integer.config_appsCustomizeZoomOutTime); 34226c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final int fadeOutDuration = res.getInteger(R.integer.config_appsCustomizeFadeOutTime); 34236c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final int revealDuration = res.getInteger(R.integer.config_appsCustomizeRevealTime); 34246c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 3425f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final float scaleFactor = (float) 3426f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor); 3427f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final View fromView = mAppsCustomizeTabHost; 3428bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka final View toView = mWorkspace; 34292a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka Animator workspaceAnim = null; 3430ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen if (toState == Workspace.State.NORMAL) { 34312a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger); 34322a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka workspaceAnim = mWorkspace.getChangeStateAnimation( 3433ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen toState, animated, stagger, -1); 3434ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen } else if (toState == Workspace.State.SPRING_LOADED || 3435ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen toState == Workspace.State.OVERVIEW) { 34362a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka workspaceAnim = mWorkspace.getChangeStateAnimation( 3437ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen toState, animated); 34382a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka } 34392b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy 3440b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka setPivotsForZoom(fromView, scaleFactor); 34414afe9b31f51022538b30646fe83780e83bf22490Winson Chung showHotseat(animated); 3442df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy if (animated) { 34436c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (!material) { 34446c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final LauncherViewPropertyAnimator scaleAnim = 34456c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(fromView); 34466c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen scaleAnim. 34476c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen scaleX(scaleFactor).scaleY(scaleFactor). 34486c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen setDuration(duration). 34496c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen setInterpolator(new Workspace.ZoomInInterpolator()); 34506c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34516c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final ObjectAnimator alphaAnim = LauncherAnimUtils 34526c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .ofFloat(fromView, "alpha", 1f, 0f) 34536c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setDuration(fadeOutDuration); 34546c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen alphaAnim.setInterpolator(new AccelerateDecelerateInterpolator()); 34556c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen alphaAnim.addUpdateListener(new AnimatorUpdateListener() { 34566c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 34576c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationUpdate(ValueAnimator animation) { 34586c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen float t = 1f - (Float) animation.getAnimatedValue(); 34596c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionStep(fromView, t); 34606c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionStep(toView, t); 34616c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 34626c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 34636c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34646c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation = LauncherAnimUtils.createAnimatorSet(); 34656c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34666c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionPrepare(fromView, animated, true); 34676c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionPrepare(toView, animated, true); 34686c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mAppsCustomizeContent.stopScrolling(); 34696c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34706c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.playTogether(scaleAnim, alphaAnim); 34716c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } else { 34726c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation = LauncherAnimUtils.createAnimatorSet(); 34736c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34746c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen int width = fromView.getMeasuredWidth(); 34756c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen int height = fromView.getMeasuredHeight(); 34766c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen float revealRadius = (float) Math.sqrt((width * width) / 4 + height * height); 34776c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34786c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen AppsCustomizePagedView content = (AppsCustomizePagedView) 34796c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen fromView.findViewById(R.id.apps_customize_pane_content); 34806c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34816c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final View page = content.getPageAt(content.getNextPage()); 34826c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen View revealView = page; 34836c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34846c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen float yDrift = height / 2f - 400; 34856c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34866c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen LauncherViewPropertyAnimator panelAlphaAndDrift = 34876c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(revealView); 34886c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen revealView.setTranslationY(0); 34896c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen revealView.setAlpha(1); 34906c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen panelAlphaAndDrift.alpha(0) 34916c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .translationY(yDrift) 34926c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setDuration(revealDuration) 34936c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setInterpolator(new LogDecelerateInterpolator(100, 0)); 34946c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34956c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(panelAlphaAndDrift); 34966c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 34976c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (page instanceof CellLayout) { 34986c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final CellLayout cellLayout = (CellLayout) page; 34996c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen cellLayout.enableHardwareLayer(true); 35006c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35016c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final View iconsView = cellLayout.getShortcutsAndWidgets(); 35026c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35036c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen LauncherViewPropertyAnimator iconsAlpha = 35046c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(iconsView); 35056c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen iconsAlpha.alpha(0f) 35066c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setDuration(revealDuration - 100) 35076c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen .setInterpolator(new LogDecelerateInterpolator(100, 0)); 35086c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35096c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(iconsAlpha); 35106c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35116c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.addListener(new AnimatorListenerAdapter() { 35126c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 35136c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationEnd(Animator animation) { 35146c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen cellLayout.setTranslationY(0); 35156c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen cellLayout.setAlpha(1f); 35166c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen iconsView.setAlpha(1f); 35176c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 35186c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 35197044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung } 3520159b4cc1e463ba730dbdff7c4ada2af01f35a1f1Michael Jurka 35216c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen View pageIndicators = fromView.findViewById(R.id.apps_customize_page_indicator); 35226c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen final LauncherViewPropertyAnimator indicatorsAlpha = 35236c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen new LauncherViewPropertyAnimator(pageIndicators); 35246c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen indicatorsAlpha.alpha(0f); 35256c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen indicatorsAlpha.setDuration(revealDuration); 35266c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen indicatorsAlpha.setInterpolator(new DecelerateInterpolator(1.5f)); 35276c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(indicatorsAlpha); 3528bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka 35296c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen width = revealView.getMeasuredWidth(); 35306c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35316c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen ValueAnimator reveal = 35326c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen ViewAnimationUtils.createCircularReveal(revealView, width / 2, 35336c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen height / 2 + 100, revealRadius, 0f); 35346c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); 35356c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen reveal.setDuration(revealDuration); 35366c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35376c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen reveal.addListener(new AnimatorListenerAdapter() { 35386c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen @Override 35396c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen public void onAnimationEnd(Animator animation) { 35406c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen fromView.setVisibility(View.GONE); 35416c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 35426c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen }); 35436c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35446c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionPrepare(fromView, animated, true); 35456c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen dispatchOnLauncherTransitionPrepare(toView, animated, true); 35466c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mAppsCustomizeContent.stopScrolling(); 35476c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen 35486c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(reveal); 35496c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 35506c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen if (workspaceAnim != null) { 35516c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen mStateAnimation.play(workspaceAnim); 35526c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen } 3553bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka 3554bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka mStateAnimation.addListener(new AnimatorListenerAdapter() { 3555dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne @Override 35568edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka public void onAnimationEnd(Animator animation) { 3557df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy fromView.setVisibility(View.GONE); 3558bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionEnd(fromView, animated, true); 3559bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionEnd(toView, animated, true); 3560ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (onCompleteRunnable != null) { 3561ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen onCompleteRunnable.run(); 3562ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 3563bc2f082dac475eff7fc0e40f90eb6c0552511170Chet Haase mAppsCustomizeContent.updateCurrentPageScroll(); 3564df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy } 3565df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy }); 35666b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy 3567a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionStart(fromView, animated, true); 3568a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionStart(toView, animated, true); 3569f1ad608c28c79c8e9b83d83ce9154f1b7284f412Michael Jurka LauncherAnimUtils.startAnimationAfterNextDraw(mStateAnimation, toView); 3570df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy } else { 3571df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy fromView.setVisibility(View.GONE); 3572a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionPrepare(fromView, animated, true); 3573bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionStart(fromView, animated, true); 3574bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionEnd(fromView, animated, true); 3575a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka dispatchOnLauncherTransitionPrepare(toView, animated, true); 3576bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionStart(toView, animated, true); 3577bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka dispatchOnLauncherTransitionEnd(toView, animated, true); 3578df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy } 35793ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy } 35807247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy 3581e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka @Override 3582e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka public void onTrimMemory(int level) { 3583e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka super.onTrimMemory(level); 3584c7450e3ebd7672fcd7b9d51a8c1e68f63c5ce86bWinson Chung if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) { 3585e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka mAppsCustomizeTabHost.onTrimMemory(); 3586e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka } 3587e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka } 3588e326f186af6b00e4ea32849f1527254c669d0600Michael Jurka 3589ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen protected void showWorkspace(boolean animated) { 3590ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen showWorkspace(animated, null); 3591ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 3592ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 3593ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen protected void showWorkspace() { 3594ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen showWorkspace(true); 3595ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen } 3596ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen 3597ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen void showWorkspace(boolean animated, Runnable onCompleteRunnable) { 3598e25c5d1c94949044c4cd7416f60ea0dc12dadc8dAdam Cohen if (mState != State.WORKSPACE || mWorkspace.getState() != Workspace.State.NORMAL) { 35992d75f125f4e8bb5358dfdb63096d0493488ac2e5Winson Chung boolean wasInSpringLoadedMode = (mState != State.WORKSPACE); 3600b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mWorkspace.setVisibility(View.VISIBLE); 3601ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen hideAppsCustomizeHelper(Workspace.State.NORMAL, animated, false, onCompleteRunnable); 3602b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3603c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung // Show the search bar (only animate if we were showing the drop target bar in spring 3604c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung // loaded mode) 3605adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 360604c0a5c9110eff549cb1120341797ec986d9943aWinson Chung mSearchDropTargetBar.showSearchBar(animated && wasInSpringLoadedMode); 3607adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 3608c7d2b60ab1db9a478f173d045b9f501d994eb8b1Winson Chung 3609b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Set focus to the AppsCustomize button 3610b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka if (mAllAppsButton != null) { 3611b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mAllAppsButton.requestFocus(); 3612b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3613c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 36146b879f0a5885274a85333531e091283405d490ccAdam Lesinski 3615c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka // Change the state *after* we've called all the transition code 3616c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka mState = State.WORKSPACE; 3617815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov 36185fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung // Resume the auto-advance of widgets 36195fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung mUserPresent = true; 36205fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung updateRunning(); 36215fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung 36221d4fde686433ddfa7f940e298d935433ecfed8ebalanv // Send an accessibility event to announce the context change 36231d4fde686433ddfa7f940e298d935433ecfed8ebalanv getWindow().getDecorView() 36241d4fde686433ddfa7f940e298d935433ecfed8ebalanv .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 3625c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 362669688aa359cdbffce4decf334f5d6f0143e3a694Bjorn Bringert onWorkspaceShown(animated); 3627c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert } 3628c459e5241ea0c53dd53c16e73fd7a187701f537bBjorn Bringert 3629ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen void showOverviewMode(boolean animated) { 3630ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen mWorkspace.setVisibility(View.VISIBLE); 3631ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen hideAppsCustomizeHelper(Workspace.State.OVERVIEW, animated, false, null); 3632ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen mState = State.WORKSPACE; 3633ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen onWorkspaceShown(animated); 3634ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen } 3635ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen 363669688aa359cdbffce4decf334f5d6f0143e3a694Bjorn Bringert public void onWorkspaceShown(boolean animated) { 363700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 363800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 363982963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung void showAllApps(boolean animated, AppsCustomizePagedView.ContentType contentType, 364082963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung boolean resetPageToZero) { 3641b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka if (mState != State.WORKSPACE) return; 3642b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 364382963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung if (resetPageToZero) { 364482963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung mAppsCustomizeTabHost.reset(); 364582963d530ac92ca770c5b674ee5a6c80eb6506d2Winson Chung } 3646c58497ee619416c4949b16eb43486c11618b69e5Winson Chung showAppsCustomizeHelper(animated, false, contentType); 3647dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen mAppsCustomizeTabHost.post(new Runnable() { 3648dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen @Override 3649dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen public void run() { 3650dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen // We post this in-case the all apps view isn't yet constructed. 3651dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen mAppsCustomizeTabHost.requestFocus(); 3652dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen } 3653dcc5e71b3fd0ae450241ad820a5797225973ce73Adam Cohen }); 3654b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3655b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Change the state *after* we've called all the transition code 3656b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mState = State.APPS_CUSTOMIZE; 3657b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3658b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Pause the auto-advance of widgets until we are out of AllApps 3659b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka mUserPresent = false; 3660b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka updateRunning(); 3661b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka closeFolder(); 3662b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3663b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // Send an accessibility event to announce the context change 36641d4fde686433ddfa7f940e298d935433ecfed8ebalanv getWindow().getDecorView() 36651d4fde686433ddfa7f940e298d935433ecfed8ebalanv .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); 3666b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3667b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 36687777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen void enterSpringLoadedDragMode() { 3669c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung if (isAllAppsVisible()) { 3670ed307df7446288f23a1ce34e5cdb6b55dd3df675Adam Cohen hideAppsCustomizeHelper(Workspace.State.SPRING_LOADED, true, true, null); 3671c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung mState = State.APPS_CUSTOMIZE_SPRING_LOADED; 3672b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung } 3673d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } 36747777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen 3675ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, int delay, 3676ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen final Runnable onCompleteRunnable) { 367709bfc45ae8aee2db579698c15007b1d138b4141fWinson Chung if (mState != State.APPS_CUSTOMIZE_SPRING_LOADED) return; 367809bfc45ae8aee2db579698c15007b1d138b4141fWinson Chung 3679e7a0394ad468748fb4651c74b44b313e1e07cab6Winson Chung mHandler.postDelayed(new Runnable() { 3680557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung @Override 3681557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung public void run() { 36826a3fd3f042c8bfa7d83e29c1eeadff21323ab089Winson Chung if (successfulDrop) { 36837bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka // Before we show workspace, hide all apps again because 36847bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka // exitSpringLoadedDragMode made it visible. This is a bit hacky; we should 36857bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka // clean up our state transition functions 36867bdb25a9894970da74248c9cdc606d0e1ba05c99Michael Jurka mAppsCustomizeTabHost.setVisibility(View.GONE); 3687ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen showWorkspace(true, onCompleteRunnable); 36887777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen } else { 36897777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen exitSpringLoadedDragMode(); 36906a3fd3f042c8bfa7d83e29c1eeadff21323ab089Winson Chung } 3691557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 3692ad4e15cae4b628677fc249628a9ff661e67add78Adam Cohen }, delay); 3693557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 3694b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3695d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka void exitSpringLoadedDragMode() { 3696b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung if (mState == State.APPS_CUSTOMIZE_SPRING_LOADED) { 3697b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka final boolean animated = true; 3698b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka final boolean springLoaded = true; 3699b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka showAppsCustomizeHelper(animated, springLoaded); 3700b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung mState = State.APPS_CUSTOMIZE; 3701f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3702f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // Otherwise, we are not in spring loaded mode, so don't do anything. 3703f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3704f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 3705b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka void lockAllApps() { 3706b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // TODO 3707b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3708b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3709b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka void unlockAllApps() { 3710b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka // TODO 3711b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka } 3712b3e22d99c1682642352cec71aace0adcef7296a6Michael Jurka 3713f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /** 37143d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung * Shows the hotseat area. 3715f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 37163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung void showHotseat(boolean animated) { 3717e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (!LauncherAppState.getInstance().isScreenLarge()) { 3718f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (animated) { 37197407d2a16ed6cf22494122cf683bf13de6fa3695Michael Jurka if (mHotseat.getAlpha() != 1f) { 3720adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung int duration = 0; 3721adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 3722adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung duration = mSearchDropTargetBar.getTransitionInDuration(); 3723adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 37247407d2a16ed6cf22494122cf683bf13de6fa3695Michael Jurka mHotseat.animate().alpha(1f).setDuration(duration); 37257407d2a16ed6cf22494122cf683bf13de6fa3695Michael Jurka } 3726f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 37273d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat.setAlpha(1f); 3728f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3729f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3730f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3731f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 3732f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung /** 37333d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung * Hides the hotseat area. 3734f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung */ 37353d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung void hideHotseat(boolean animated) { 3736e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler if (!LauncherAppState.getInstance().isScreenLarge()) { 3737f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (animated) { 37387407d2a16ed6cf22494122cf683bf13de6fa3695Michael Jurka if (mHotseat.getAlpha() != 0f) { 3739adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung int duration = 0; 3740adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 3741adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung duration = mSearchDropTargetBar.getTransitionOutDuration(); 3742adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 37437407d2a16ed6cf22494122cf683bf13de6fa3695Michael Jurka mHotseat.animate().alpha(0f).setDuration(duration); 37447407d2a16ed6cf22494122cf683bf13de6fa3695Michael Jurka } 3745f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 37463d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat.setAlpha(0f); 3747f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 3748b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung } 3749d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka } 3750d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka 37515f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy /** 37525f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy * Add an item from all apps or customize onto the given workspace screen. 37535f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy * If layout is null, add to the current screen. 37545f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy */ 37555f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy void addExternalItemToScreen(ItemInfo itemInfo, final CellLayout layout) { 37566b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka if (!mWorkspace.addExternalItemToScreen(itemInfo, layout)) { 375793eef082ec2da802ee4507fb2ca729e550f833f1Winson Chung showOutOfSpaceMessage(isHotseatLayout(layout)); 3758213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka } 37596b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka } 37602b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy 3761dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung /** Maps the current orientation to an index for referencing orientation correct global icons */ 3762dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung private int getCurrentOrientationIndexForGlobalIcons() { 3763dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung // default - 0, landscape - 1 3764dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung switch (getResources().getConfiguration().orientation) { 3765dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung case Configuration.ORIENTATION_LANDSCAPE: 3766dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung return 1; 3767dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung default: 3768dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung return 0; 3769dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung } 3770dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung } 3771dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung 3772ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka private Drawable getExternalPackageToolbarIcon(ComponentName activityName, String resourceName) { 37730423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka try { 3774ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy PackageManager packageManager = getPackageManager(); 37750423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka // Look for the toolbar icon specified in the activity meta-data 37760423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka Bundle metaData = packageManager.getActivityInfo( 37770423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka activityName, PackageManager.GET_META_DATA).metaData; 37780423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka if (metaData != null) { 3779ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka int iconResId = metaData.getInt(resourceName); 37800423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka if (iconResId != 0) { 37810423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka Resources res = packageManager.getResourcesForActivity(activityName); 3782fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung return res.getDrawable(iconResId); 3783ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy } 37840423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 37850423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } catch (NameNotFoundException e) { 3786b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka // This can happen if the activity defines an invalid drawable 3787b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka Log.w(TAG, "Failed to load toolbar icon; " + activityName.flattenToShortString() + 3788b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka " not found", e); 378970d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood } catch (Resources.NotFoundException nfe) { 379070d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood // This can happen if the activity defines an invalid drawable 379170d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood Log.w(TAG, "Failed to load toolbar icon from " + activityName.flattenToShortString(), 379270d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood nfe); 37930423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 3794fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung return null; 3795fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 3796fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung 3797fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung // if successful in getting icon, return it; otherwise, set button to use default drawable 3798fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung private Drawable.ConstantState updateTextButtonWithIconFromExternalActivity( 3799ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka int buttonId, ComponentName activityName, int fallbackDrawableId, 3800ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka String toolbarResourceName) { 3801ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka Drawable toolbarIcon = getExternalPackageToolbarIcon(activityName, toolbarResourceName); 3802128bbcd1e6606b3c1933c8e85a32b30b3e58ead3Winson Chung Resources r = getResources(); 3803128bbcd1e6606b3c1933c8e85a32b30b3e58ead3Winson Chung int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width); 3804128bbcd1e6606b3c1933c8e85a32b30b3e58ead3Winson Chung int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height); 3805fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung 38064da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka TextView button = (TextView) findViewById(buttonId); 3807fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung // If we were unable to find the icon via the meta-data, use a generic one 3808fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung if (toolbarIcon == null) { 3809128bbcd1e6606b3c1933c8e85a32b30b3e58ead3Winson Chung toolbarIcon = r.getDrawable(fallbackDrawableId); 3810128bbcd1e6606b3c1933c8e85a32b30b3e58ead3Winson Chung toolbarIcon.setBounds(0, 0, w, h); 38114da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka if (button != null) { 38124da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka button.setCompoundDrawables(toolbarIcon, null, null, null); 38134da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka } 3814fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung return null; 3815fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } else { 3816128bbcd1e6606b3c1933c8e85a32b30b3e58ead3Winson Chung toolbarIcon.setBounds(0, 0, w, h); 38174da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka if (button != null) { 38184da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka button.setCompoundDrawables(toolbarIcon, null, null, null); 38194da7a3e55618a6ac2eb528a792902bbbfe775c79Michael Jurka } 3820fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung return toolbarIcon.getConstantState(); 3821fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 3822fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 3823fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung 3824fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung // if successful in getting icon, return it; otherwise, set button to use default drawable 3825fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung private Drawable.ConstantState updateButtonWithIconFromExternalActivity( 3826ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka int buttonId, ComponentName activityName, int fallbackDrawableId, 3827ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka String toolbarResourceName) { 3828fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung ImageView button = (ImageView) findViewById(buttonId); 3829ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka Drawable toolbarIcon = getExternalPackageToolbarIcon(activityName, toolbarResourceName); 3830fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung 383119e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka if (button != null) { 383219e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka // If we were unable to find the icon via the meta-data, use a 383319e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka // generic one 383419e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka if (toolbarIcon == null) { 383519e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka button.setImageResource(fallbackDrawableId); 383619e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka } else { 383719e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka button.setImageDrawable(toolbarIcon); 383819e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka } 38390423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 384019e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka 384119e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka return toolbarIcon != null ? toolbarIcon.getConstantState() : null; 384219e0fc53c43a7746d7ae3d7c6027166bded33f0fMichael Jurka 38430423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 38440423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka 38451b8840936f90ed48d6c8edcd87fbc4466dc4e5baWinson Chung private void updateTextButtonWithDrawable(int buttonId, Drawable d) { 3846fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung TextView button = (TextView) findViewById(buttonId); 38471b8840936f90ed48d6c8edcd87fbc4466dc4e5baWinson Chung button.setCompoundDrawables(d, null, null, null); 3848fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 3849fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung 3850e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka private void updateButtonWithDrawable(int buttonId, Drawable.ConstantState d) { 38514ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka ImageView button = (ImageView) findViewById(buttonId); 3852e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka button.setImageDrawable(d.newDrawable(getResources())); 38534ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 38544ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 3855bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung private void invalidatePressedFocusedStates(View container, View button) { 3856bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung if (container instanceof HolographicLinearLayout) { 3857bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung HolographicLinearLayout layout = (HolographicLinearLayout) container; 3858bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung layout.invalidatePressedFocusedStates(); 3859bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung } else if (button instanceof HolographicImageView) { 3860bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung HolographicImageView view = (HolographicImageView) button; 3861bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung view.invalidatePressedFocusedStates(); 3862bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung } 3863bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung } 3864bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung 3865476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu public View getQsbBar() { 386624ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen if (mQsb == null) { 386724ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen mQsb = mInflater.inflate(R.layout.qsb, mSearchDropTargetBar, false); 386824ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen mSearchDropTargetBar.addView(mQsb); 3869476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu } 387024ce0b3708b44e738d6ee52477aa4dd917b547e7Adam Cohen return mQsb; 3871476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu } 3872476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu 3873476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu protected boolean updateGlobalSearchIcon() { 3874c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung final View searchButtonContainer = findViewById(R.id.search_button_container); 38751cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung final ImageView searchButton = (ImageView) findViewById(R.id.search_button); 3876c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung final View voiceButtonContainer = findViewById(R.id.voice_button_container); 3877cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung final View voiceButton = findViewById(R.id.voice_button); 387897d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 38791cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung final SearchManager searchManager = 38801cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung (SearchManager) getSystemService(Context.SEARCH_SERVICE); 38811cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung ComponentName activityName = searchManager.getGlobalSearchActivity(); 38821cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung if (activityName != null) { 3883dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung int coi = getCurrentOrientationIndexForGlobalIcons(); 3884dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung sGlobalSearchIcon[coi] = updateButtonWithIconFromExternalActivity( 3885ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka R.id.search_button, activityName, R.drawable.ic_home_search_normal_holo, 3886ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka TOOLBAR_SEARCH_ICON_METADATA_NAME); 3887ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka if (sGlobalSearchIcon[coi] == null) { 3888ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka sGlobalSearchIcon[coi] = updateButtonWithIconFromExternalActivity( 3889ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka R.id.search_button, activityName, R.drawable.ic_home_search_normal_holo, 3890ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka TOOLBAR_ICON_METADATA_NAME); 3891ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 3892ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka 3893c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (searchButtonContainer != null) searchButtonContainer.setVisibility(View.VISIBLE); 3894c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung searchButton.setVisibility(View.VISIBLE); 3895bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung invalidatePressedFocusedStates(searchButtonContainer, searchButton); 3896c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung return true; 38971cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } else { 3898cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung // We disable both search and voice search when there is no global search provider 3899c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (searchButtonContainer != null) searchButtonContainer.setVisibility(View.GONE); 3900c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE); 39012c38e70acd92372669cf93c2049ad162650a43baJohn Spurlock if (searchButton != null) searchButton.setVisibility(View.GONE); 39022c38e70acd92372669cf93c2049ad162650a43baJohn Spurlock if (voiceButton != null) voiceButton.setVisibility(View.GONE); 39035841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung updateVoiceButtonProxyVisible(false); 3904c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung return false; 39056d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 39066d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 39076d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani 3908476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu protected void updateGlobalSearchIcon(Drawable.ConstantState d) { 3909bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung final View searchButtonContainer = findViewById(R.id.search_button_container); 3910bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung final View searchButton = (ImageView) findViewById(R.id.search_button); 39114ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka updateButtonWithDrawable(R.id.search_button, d); 3912bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung invalidatePressedFocusedStates(searchButtonContainer, searchButton); 39134ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 39144ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 3915476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu protected boolean updateVoiceSearchIcon(boolean searchVisible) { 3916c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung final View voiceButtonContainer = findViewById(R.id.voice_button_container); 39171cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung final View voiceButton = findViewById(R.id.voice_button); 39181cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung 3919c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung // We only show/update the voice search icon if the search icon is enabled as well 3920ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka final SearchManager searchManager = 3921ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka (SearchManager) getSystemService(Context.SEARCH_SERVICE); 3922ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity(); 3923ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka 3924ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka ComponentName activityName = null; 3925ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka if (globalSearchActivity != null) { 3926ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka // Check if the global search activity handles voice search 3927ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); 3928ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka intent.setPackage(globalSearchActivity.getPackageName()); 3929ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka activityName = intent.resolveActivity(getPackageManager()); 3930ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 3931ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka 3932ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka if (activityName == null) { 3933ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka // Fallback: check if an activity other than the global search activity 3934ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka // resolves this 3935ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); 3936ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka activityName = intent.resolveActivity(getPackageManager()); 3937ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 3938c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (searchVisible && activityName != null) { 3939dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung int coi = getCurrentOrientationIndexForGlobalIcons(); 3940dff8ebbafd239e9912a51811edfb865bb16eea81Winson Chung sVoiceSearchIcon[coi] = updateButtonWithIconFromExternalActivity( 3941ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka R.id.voice_button, activityName, R.drawable.ic_home_voice_search_holo, 3942ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka TOOLBAR_VOICE_SEARCH_ICON_METADATA_NAME); 3943ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka if (sVoiceSearchIcon[coi] == null) { 3944ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka sVoiceSearchIcon[coi] = updateButtonWithIconFromExternalActivity( 3945ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka R.id.voice_button, activityName, R.drawable.ic_home_voice_search_holo, 3946ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka TOOLBAR_ICON_METADATA_NAME); 3947ae65ee30331bc2e9cc069687540692d7c62d0fefMichael Jurka } 3948c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.VISIBLE); 39491cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung voiceButton.setVisibility(View.VISIBLE); 39505841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung updateVoiceButtonProxyVisible(false); 3951bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung invalidatePressedFocusedStates(voiceButtonContainer, voiceButton); 3952c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung return true; 39531cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } else { 3954c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE); 39552c38e70acd92372669cf93c2049ad162650a43baJohn Spurlock if (voiceButton != null) voiceButton.setVisibility(View.GONE); 39565841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung updateVoiceButtonProxyVisible(false); 3957c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung return false; 3958ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy } 39596ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka } 39600423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka 3961476493bcc3b2d6cf32db62bf78714aa0f2747108Cristina Stancu protected void updateVoiceSearchIcon(Drawable.ConstantState d) { 3962bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung final View voiceButtonContainer = findViewById(R.id.voice_button_container); 3963bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung final View voiceButton = findViewById(R.id.voice_button); 39644ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka updateButtonWithDrawable(R.id.voice_button, d); 3965bb185bdd57fcdb2c8ff9eee00347b116bab7db23Winson Chung invalidatePressedFocusedStates(voiceButtonContainer, voiceButton); 39664ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 39674ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 39685841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung public void updateVoiceButtonProxyVisible(boolean forceDisableVoiceButtonProxy) { 3969ecf33e4819d0c4b019706edd456ed14a6a0f200cBjorn Bringert final View voiceButtonProxy = findViewById(R.id.voice_button_proxy); 3970ecf33e4819d0c4b019706edd456ed14a6a0f200cBjorn Bringert if (voiceButtonProxy != null) { 39715841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung boolean visible = !forceDisableVoiceButtonProxy && 39725841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung mWorkspace.shouldVoiceButtonProxyBeVisible(); 3973ecf33e4819d0c4b019706edd456ed14a6a0f200cBjorn Bringert voiceButtonProxy.setVisibility(visible ? View.VISIBLE : View.GONE); 39745841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung voiceButtonProxy.bringToFront(); 3975ecf33e4819d0c4b019706edd456ed14a6a0f200cBjorn Bringert } 3976ecf33e4819d0c4b019706edd456ed14a6a0f200cBjorn Bringert } 39775841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung 39785841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung /** 39795841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung * This is an overrid eot disable the voice button proxy. If disabled is true, then the voice button proxy 39805841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung * will be hidden regardless of what shouldVoiceButtonProxyBeVisible() returns. 39815841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung */ 39825841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung public void disableVoiceButtonProxy(boolean disabled) { 39835841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung updateVoiceButtonProxyVisible(disabled); 39845841efa6121fb40dd7c1a6a432a899b894fa5c6dWinson Chung } 39856ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka /** 3986eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung * Sets the app market icon 39876ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka */ 39886ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka private void updateAppMarketIcon() { 3989d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON) { 3990d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung final View marketButton = findViewById(R.id.market_button); 3991d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MARKET); 3992d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung // Find the app market activity by resolving an intent. 3993d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung // (If multiple app markets are installed, it will return the ResolverActivity.) 3994d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung ComponentName activityName = intent.resolveActivity(getPackageManager()); 3995d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (activityName != null) { 3996d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung int coi = getCurrentOrientationIndexForGlobalIcons(); 3997d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung mAppMarketIntent = intent; 3998d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung sAppMarketIcon[coi] = updateTextButtonWithIconFromExternalActivity( 3999d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung R.id.market_button, activityName, R.drawable.ic_launcher_market_holo, 4000d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung TOOLBAR_ICON_METADATA_NAME); 4001d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung marketButton.setVisibility(View.VISIBLE); 4002d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } else { 4003d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung // We should hide and disable the view so that we don't try and restore the visibility 4004d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung // of it when we swap between drag & normal states from IconDropTarget subclasses. 4005d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung marketButton.setVisibility(View.GONE); 4006d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung marketButton.setEnabled(false); 4007d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } 40080423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 4009ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy } 4010ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy 4011e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka private void updateAppMarketIcon(Drawable.ConstantState d) { 4012d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON) { 4013d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung // Ensure that the new drawable we are creating has the approprate toolbar icon bounds 4014d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung Resources r = getResources(); 4015d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung Drawable marketIconDrawable = d.newDrawable(r); 4016d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width); 4017d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height); 4018d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung marketIconDrawable.setBounds(0, 0, w, h); 40191b8840936f90ed48d6c8edcd87fbc4466dc4e5baWinson Chung 4020d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung updateTextButtonWithDrawable(R.id.market_button, marketIconDrawable); 4021d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } 40224ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 40234ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 4024d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka @Override 4025d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 40261d4fde686433ddfa7f940e298d935433ecfed8ebalanv final boolean result = super.dispatchPopulateAccessibilityEvent(event); 4027d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka final List<CharSequence> text = event.getText(); 4028d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka text.clear(); 40291d4fde686433ddfa7f940e298d935433ecfed8ebalanv // Populate event with a fake title based on the current state. 40301d4fde686433ddfa7f940e298d935433ecfed8ebalanv if (mState == State.APPS_CUSTOMIZE) { 40316c5891a9fce95eee3d87823d11d21889743e9c68Adam Cohen text.add(mAppsCustomizeTabHost.getContentTag()); 40321d4fde686433ddfa7f940e298d935433ecfed8ebalanv } else { 40331d4fde686433ddfa7f940e298d935433ecfed8ebalanv text.add(getString(R.string.all_apps_home_button_label)); 40341d4fde686433ddfa7f940e298d935433ecfed8ebalanv } 4035d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka return result; 4036d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka } 4037d7c28056d3fc462f42b508026154d6d8fee5606bMichael Jurka 4038ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy /** 4039b8472bb83cd96456a543137e1e56d589171934c3Winson Chung * Receives notifications when system dialogs are to be closed. 40402ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato */ 40412ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato private class CloseSystemDialogsIntentReceiver extends BroadcastReceiver { 40422ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato @Override 40432ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato public void onReceive(Context context, Intent intent) { 40442ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato closeSystemDialogs(); 40452ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 40462ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 40472ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 40482ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato /** 40491e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey * Receives notifications whenever the appwidgets are reset. 40501e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey */ 40511e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey private class AppWidgetResetObserver extends ContentObserver { 40521e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey public AppWidgetResetObserver() { 40531e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey super(new Handler()); 40541e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 40551e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 40561e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey @Override 40571e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey public void onChange(boolean selfChange) { 40581e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey onAppWidgetReset(); 40591e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 40601e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 40611e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 40621e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey /** 40637607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * If the activity is currently paused, signal that we need to run the passed Runnable 40647607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * in onResume. 40657607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * 40667607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * This needs to be called from incoming places where resources might have been loaded 40677607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * while we are paused. That is becaues the Configuration might be wrong 40687607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * when we're not running, and if it comes back to what it was when we 40697607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * were paused, we are not restarted. 40707607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * 40717607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * Implementation of the method from LauncherModel.Callbacks. 40727607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * 40737607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * @return true if we are currently paused. The caller might be able to 40747607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka * skip some work in that case since we will come back again. 40757607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka */ 4076c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private boolean waitUntilResume(Runnable run, boolean deletePreviousRunnables) { 40777607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka if (mPaused) { 40787607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka Log.i(TAG, "Deferring update until onResume"); 4079c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (deletePreviousRunnables) { 40801e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka while (mBindOnResumeCallbacks.remove(run)) { 4081c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 4082c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 40831e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.add(run); 40847607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return true; 40857607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } else { 40867607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return false; 40877607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 40887607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 40897607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka 4090c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private boolean waitUntilResume(Runnable run) { 4091c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka return waitUntilResume(run, false); 4092c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka } 4093c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka 40941e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka public void addOnResumeCallback(Runnable run) { 40955455425c1b0355f5dd652cc8e7a2369c33dc9883Michael Jurka mOnResumeCallbacks.add(run); 40961e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka } 40971e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka 40987607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka /** 4099ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * If the activity is currently paused, signal that we need to re-run the loader 4100ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * in onResume. 4101ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * 4102ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * This needs to be called from incoming places where resources might have been loaded 4103ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * while we are paused. That is becaues the Configuration might be wrong 4104ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * when we're not running, and if it comes back to what it was when we 4105ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * were paused, we are not restarted. 4106ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * 4107ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 4108ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * 4109ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * @return true if we are currently paused. The caller might be able to 4110ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato * skip some work in that case since we will come back again. 4111ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato */ 4112ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato public boolean setLoadOnResume() { 4113ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (mPaused) { 4114ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato Log.i(TAG, "setLoadOnResume"); 4115ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mOnResumeNeedsLoad = true; 4116ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return true; 4117ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } else { 4118ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return false; 4119ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 4120ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 4121ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 4122ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato /** 41239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 412431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 41259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public int getCurrentWorkspaceScreen() { 4126d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato if (mWorkspace != null) { 41270142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka return mWorkspace.getCurrentPage(); 4128d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato } else { 4129d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato return SCREEN_COUNT / 2; 4130d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato } 41319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 4132f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 41339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 41349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Refreshes the shortcuts shown on the workspace. 41359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 41369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 41379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 41389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void startBinding() { 4139ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWorkspaceLoading(true); 4140517a7f5fd03fb89bd6b465013b278c9f281d0b26Adam Cohen 41417607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka // If we're starting binding all over again, clear any bind calls we'd postponed in 41427607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka // the past (see waitUntilResume) -- we don't need them since we're starting binding 41437607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka // from scratch again 41441e2f465f46ded990ea30516cdb7f0fcf3280411fMichael Jurka mBindOnResumeCallbacks.clear(); 4145df0353815c629fc678824b07a234b89a1ff94208Adam Cohen 4146d64d1763c590b1c954b759156683abf39ff22945Winson Chung // Clear the workspace because it's going to be rebound 4147df0353815c629fc678824b07a234b89a1ff94208Adam Cohen mWorkspace.clearDropTargets(); 41489e6a0a20d40675ef98c7fdb8892cf34b90152f7aWinson Chung mWorkspace.removeAllWorkspaceScreens(); 4149d64d1763c590b1c954b759156683abf39ff22945Winson Chung 415005bf644e371c9d965ba864cf7dda6515c7cdce91Michael Jurka mWidgetsToAdvance.clear(); 41513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (mHotseat != null) { 41523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mHotseat.resetLayout(); 415331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 415431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 415531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4156dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen @Override 4157dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen public void bindScreens(ArrayList<Long> orderedScreenIds) { 415864359a53dc827797917a8d9a0697a91996789801Winson Chung bindAddScreens(orderedScreenIds); 41590e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung 41605084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen // If there are no screens, we need to have an empty screen 41615084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen if (orderedScreenIds.size() == 0) { 41625084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen mWorkspace.addExtraEmptyScreen(); 41635084cbab0eb0c06bd2778e0a48efaf392717cd10Adam Cohen } 41640e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung 41650e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung // Create the custom content page (this call updates mDefaultScreen which calls 4166a888158880fea53479447d883391f552604e46b6Dave Hawkey // setCurrentPage() so ensure that all pages are added before calling this). 4167dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro if (hasCustomContentToLeft()) { 4168dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro mWorkspace.createCustomContentContainer(); 4169dadd984a891a574cebf3dfd38a454a0e6a4228b3Derek Prothro populateCustomContentContainer(); 41700e6a713fca3261021fcaca62c75dad8486c5e39fWinson Chung } 417164359a53dc827797917a8d9a0697a91996789801Winson Chung } 417264359a53dc827797917a8d9a0697a91996789801Winson Chung 417364359a53dc827797917a8d9a0697a91996789801Winson Chung @Override 417464359a53dc827797917a8d9a0697a91996789801Winson Chung public void bindAddScreens(ArrayList<Long> orderedScreenIds) { 4175a90303bb6fdad59e4a55855edba68c9902192599Winson Chung // Log to disk 4176a90303bb6fdad59e4a55855edba68c9902192599Winson Chung Launcher.addDumpLog(TAG, "11683562 - bindAddScreens()", true); 4177a90303bb6fdad59e4a55855edba68c9902192599Winson Chung Launcher.addDumpLog(TAG, "11683562 - orderedScreenIds: " + 4178a90303bb6fdad59e4a55855edba68c9902192599Winson Chung TextUtils.join(", ", orderedScreenIds), true); 4179dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen int count = orderedScreenIds.size(); 4180dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen for (int i = 0; i < count; i++) { 418189bddfaa6d1dbd1534c5f5c5f3163c10f627209eAdam Cohen mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i)); 4182dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen } 4183dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen } 4184dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen 418539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen private boolean shouldShowWeightWatcher() { 418639a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen String spKey = LauncherAppState.getSharedPreferencesKey(); 418739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE); 41886053b8007ed22fba6a62a9238aad6d0a42229faeDaniel Sandler boolean show = sp.getBoolean(SHOW_WEIGHT_WATCHER, SHOW_WEIGHT_WATCHER_DEFAULT); 418939a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 419039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen return show; 419139a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen } 419239a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 419339a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen private void toggleShowWeightWatcher() { 419439a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen String spKey = LauncherAppState.getSharedPreferencesKey(); 419539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE); 419639a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen boolean show = sp.getBoolean(SHOW_WEIGHT_WATCHER, true); 419739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 419839a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen show = !show; 419939a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 420039a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen SharedPreferences.Editor editor = sp.edit(); 420139a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen editor.putBoolean(SHOW_WEIGHT_WATCHER, show); 420239a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen editor.commit(); 420339a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 420439a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen if (mWeightWatcher != null) { 420539a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen mWeightWatcher.setVisibility(show ? View.VISIBLE : View.GONE); 420639a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen } 420739a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen } 420839a06042556a90c98f55a92bda5811e7d9492d13Adam Cohen 4209d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void bindAppsAdded(final ArrayList<Long> newScreens, 4210d64d1763c590b1c954b759156683abf39ff22945Winson Chung final ArrayList<ItemInfo> addNotAnimated, 4211c58497ee619416c4949b16eb43486c11618b69e5Winson Chung final ArrayList<ItemInfo> addAnimated, 4212c58497ee619416c4949b16eb43486c11618b69e5Winson Chung final ArrayList<AppInfo> addedApps) { 4213d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4214d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4215c58497ee619416c4949b16eb43486c11618b69e5Winson Chung bindAppsAdded(newScreens, addNotAnimated, addAnimated, addedApps); 4216d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4217d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4218d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 4219d64d1763c590b1c954b759156683abf39ff22945Winson Chung return; 4220d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4221d64d1763c590b1c954b759156683abf39ff22945Winson Chung 4222d64d1763c590b1c954b759156683abf39ff22945Winson Chung // Add the new screens 422376a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen if (newScreens != null) { 422476a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen bindAddScreens(newScreens); 422576a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen } 4226d64d1763c590b1c954b759156683abf39ff22945Winson Chung 4227d64d1763c590b1c954b759156683abf39ff22945Winson Chung // We add the items without animation on non-visible pages, and with 4228d64d1763c590b1c954b759156683abf39ff22945Winson Chung // animations on the new page (which we will try and snap to). 422976a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen if (addNotAnimated != null && !addNotAnimated.isEmpty()) { 4230d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindItems(addNotAnimated, 0, 4231d64d1763c590b1c954b759156683abf39ff22945Winson Chung addNotAnimated.size(), false); 4232d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 423376a47a1b2273c4d7dfab0beeadc1a8387e6a2840Adam Cohen if (addAnimated != null && !addAnimated.isEmpty()) { 4234d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindItems(addAnimated, 0, 4235d64d1763c590b1c954b759156683abf39ff22945Winson Chung addAnimated.size(), true); 4236d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4237c58497ee619416c4949b16eb43486c11618b69e5Winson Chung 42388741298d3c6a17015dabc4aacc261fd8eb59992dWinson Chung // Remove the extra empty screen 4239689ff16ea27fb7c22c247aaf4f42ffe42fede253Adam Cohen mWorkspace.removeExtraEmptyScreen(false, false); 42408741298d3c6a17015dabc4aacc261fd8eb59992dWinson Chung 424116f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal if (!LauncherAppState.isDisableAllApps() && 4242c58497ee619416c4949b16eb43486c11618b69e5Winson Chung addedApps != null && mAppsCustomizeContent != null) { 4243c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeContent.addApps(addedApps); 4244c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 4245d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4246d64d1763c590b1c954b759156683abf39ff22945Winson Chung 424731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 42489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Bind the items start-end from the list. 42499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 42509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 425131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 425264359a53dc827797917a8d9a0697a91996789801Winson Chung public void bindItems(final ArrayList<ItemInfo> shortcuts, final int start, final int end, 425364359a53dc827797917a8d9a0697a91996789801Winson Chung final boolean forceAnimateIcons) { 4254d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4255d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4256d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindItems(shortcuts, start, end, forceAnimateIcons); 4257d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4258d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4259d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 42607607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 42617607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 4262ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 4263f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung // Get the list of added shortcuts and intersect them with the set of shortcuts here 426464359a53dc827797917a8d9a0697a91996789801Winson Chung final AnimatorSet anim = LauncherAnimUtils.createAnimatorSet(); 426564359a53dc827797917a8d9a0697a91996789801Winson Chung final Collection<Animator> bounceAnims = new ArrayList<Animator>(); 4266997a92348a6d6e061737399321393449c16cd4d8Winson Chung final boolean animateIcons = forceAnimateIcons && canRunNewAppsAnimation(); 4267f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung Workspace workspace = mWorkspace; 4268997a92348a6d6e061737399321393449c16cd4d8Winson Chung long newShortcutsScreenId = -1; 4269f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung for (int i = start; i < end; i++) { 42709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ItemInfo item = shortcuts.get(i); 42714d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung 42724d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung // Short circuit if we are loading dock items for a configuration which has no dock 42734d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT && 42744d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung mHotseat == null) { 42754d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung continue; 42764d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung } 42774d279d94ade1c0d455404312b3c9cfde0078c547Winson Chung 42789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato switch (item.itemType) { 42799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 42809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 4281f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung ShortcutInfo info = (ShortcutInfo) item; 4282f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung View shortcut = createShortcut(info); 4283dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen 428464359a53dc827797917a8d9a0697a91996789801Winson Chung /* 428564359a53dc827797917a8d9a0697a91996789801Winson Chung * TODO: FIX collision case 428664359a53dc827797917a8d9a0697a91996789801Winson Chung */ 4287ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { 4288ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung CellLayout cl = mWorkspace.getScreenWithId(item.screenId); 4289ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung if (cl != null && cl.isOccupied(item.cellX, item.cellY)) { 42908f006edba228622422088a358aafee069e1d9cfbAdam Cohen View v = cl.getChildAt(item.cellX, item.cellY); 42918f006edba228622422088a358aafee069e1d9cfbAdam Cohen Object tag = v.getTag(); 42928f006edba228622422088a358aafee069e1d9cfbAdam Cohen String desc = "Collision while binding workspace item: " + item 42938f006edba228622422088a358aafee069e1d9cfbAdam Cohen + ". Collides with " + tag; 42948f006edba228622422088a358aafee069e1d9cfbAdam Cohen if (LauncherAppState.isDogfoodBuild()) { 42958f006edba228622422088a358aafee069e1d9cfbAdam Cohen throw (new RuntimeException(desc)); 42968f006edba228622422088a358aafee069e1d9cfbAdam Cohen } else { 42978f006edba228622422088a358aafee069e1d9cfbAdam Cohen Log.d(TAG, desc); 42988f006edba228622422088a358aafee069e1d9cfbAdam Cohen } 4299ce376639c8287747e462fd67a7d2d511ac80c344Winson Chung } 430064359a53dc827797917a8d9a0697a91996789801Winson Chung } 430164359a53dc827797917a8d9a0697a91996789801Winson Chung 4302dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen workspace.addInScreenFromBind(shortcut, item.container, item.screenId, item.cellX, 4303dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen item.cellY, 1, 1); 4304997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (animateIcons) { 430564359a53dc827797917a8d9a0697a91996789801Winson Chung // Animate all the applications up now 430664359a53dc827797917a8d9a0697a91996789801Winson Chung shortcut.setAlpha(0f); 430764359a53dc827797917a8d9a0697a91996789801Winson Chung shortcut.setScaleX(0f); 430864359a53dc827797917a8d9a0697a91996789801Winson Chung shortcut.setScaleY(0f); 430964359a53dc827797917a8d9a0697a91996789801Winson Chung bounceAnims.add(createNewAppBounceAnimation(shortcut, i)); 4310997a92348a6d6e061737399321393449c16cd4d8Winson Chung newShortcutsScreenId = item.screenId; 4311f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung } 43129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 4313df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: 43143d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, 43150142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka (ViewGroup) workspace.getChildAt(workspace.getCurrentPage()), 4316df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen (FolderInfo) item, mIconCache); 4317dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen workspace.addInScreenFromBind(newFolder, item.container, item.screenId, item.cellX, 4318dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen item.cellY, 1, 1); 43199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 4320c763c4e4d28c256d1368be3fc1c4526c8b9bd232Winson Chung default: 4321c763c4e4d28c256d1368be3fc1c4526c8b9bd232Winson Chung throw new RuntimeException("Invalid Item Type"); 43229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 432331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4324f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung 4325997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (animateIcons) { 4326997a92348a6d6e061737399321393449c16cd4d8Winson Chung // Animate to the correct page 4327997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (newShortcutsScreenId > -1) { 4328997a92348a6d6e061737399321393449c16cd4d8Winson Chung long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage()); 432994d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newShortcutsScreenId); 4330b232383fd5b0e8cb36990307d7392499729afa23Winson Chung final Runnable startBounceAnimRunnable = new Runnable() { 4331b232383fd5b0e8cb36990307d7392499729afa23Winson Chung public void run() { 4332b232383fd5b0e8cb36990307d7392499729afa23Winson Chung anim.playTogether(bounceAnims); 4333b232383fd5b0e8cb36990307d7392499729afa23Winson Chung anim.start(); 4334b232383fd5b0e8cb36990307d7392499729afa23Winson Chung } 4335b232383fd5b0e8cb36990307d7392499729afa23Winson Chung }; 4336997a92348a6d6e061737399321393449c16cd4d8Winson Chung if (newShortcutsScreenId != currentScreenId) { 433794d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung // We post the animation slightly delayed to prevent slowdowns 433894d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung // when we are loading right after we return to launcher. 433994d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung mWorkspace.postDelayed(new Runnable() { 434094d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung public void run() { 4341944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson if (mWorkspace != null) { 4342944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson mWorkspace.snapToPage(newScreenIndex); 4343944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson mWorkspace.postDelayed(startBounceAnimRunnable, 4344944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson NEW_APPS_ANIMATION_DELAY); 4345944491587e8a8f77233a1916cc16cd07edd97f2eIan Parkinson } 434694d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung } 434794d6768c65929efa21bb893fdef7f269d65da3c3Winson Chung }, NEW_APPS_PAGE_MOVE_DELAY); 4348b232383fd5b0e8cb36990307d7392499729afa23Winson Chung } else { 4349b232383fd5b0e8cb36990307d7392499729afa23Winson Chung mWorkspace.postDelayed(startBounceAnimRunnable, NEW_APPS_ANIMATION_DELAY); 4350997a92348a6d6e061737399321393449c16cd4d8Winson Chung } 4351997a92348a6d6e061737399321393449c16cd4d8Winson Chung } 435264359a53dc827797917a8d9a0697a91996789801Winson Chung } 43539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato workspace.requestLayout(); 43549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 43559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 43569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 43579c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 43589c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 43597607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka public void bindFolders(final HashMap<Long, FolderInfo> folders) { 4360d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4361d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4362d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindFolders(folders); 4363d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4364d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4365d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 43667607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 43677607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 4368319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sFolders.clear(); 4369319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick sFolders.putAll(folders); 437031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 437131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 43729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 43739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Add the views for a widget to the workspace. 43749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 43759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 43769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 43777607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka public void bindAppWidget(final LauncherAppWidgetInfo item) { 4378d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4379d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4380d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindAppWidget(item); 4381d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4382d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4383d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 43847607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 43857607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 4386ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 4387843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler final long start = DEBUG_WIDGETS ? SystemClock.uptimeMillis() : 0; 4388843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_WIDGETS) { 4389843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler Log.d(TAG, "bindAppWidget: " + item); 4390843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 43919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final Workspace workspace = mWorkspace; 4392cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 4393651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal final AppWidgetProviderInfo appWidgetInfo; 4394651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal if (item.restoreStatus == LauncherAppWidgetInfo.RESTORE_COMPLETED) { 4395651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal final int appWidgetId = item.appWidgetId; 4396651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 4397651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal if (DEBUG_WIDGETS) { 4398651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal Log.d(TAG, "bindAppWidget: id=" + item.appWidgetId + " belongs to component " + appWidgetInfo.provider); 4399651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal } 4400843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 4401651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); 4402651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal } else { 4403651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal appWidgetInfo = null; 4404651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal item.hostView = new LauncherAppWidgetHostView(this, false); 4405651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal item.hostView.updateAppWidget(null); 4406651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal } 440731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 44089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.hostView.setTag(item); 4409211bac3cd89b26bda4ff52df984731d11156dc38Winson Chung item.onBindAppWidget(this); 441031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4411dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen workspace.addInScreen(item.hostView, item.container, item.screenId, item.cellX, 44129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.cellY, item.spanX, item.spanY, false); 4413ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen addWidgetToAutoAdvanceIfNeeded(item.hostView, appWidgetInfo); 4414ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 44159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato workspace.requestLayout(); 4416cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 4417843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_WIDGETS) { 4418843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler Log.d(TAG, "bound widget id="+item.appWidgetId+" in " 4419843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler + (SystemClock.uptimeMillis()-start) + "ms"); 4420843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 44219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 4422cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 44231462de39f01cec0ba785386532719cb0207dd827Adam Cohen public void onPageBoundSynchronously(int page) { 44241462de39f01cec0ba785386532719cb0207dd827Adam Cohen mSynchronouslyBoundPages.add(page); 44251462de39f01cec0ba785386532719cb0207dd827Adam Cohen } 44261462de39f01cec0ba785386532719cb0207dd827Adam Cohen 44279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 44289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Callback saying that there aren't any more items to bind. 44299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 44309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 44319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 4432e25af795647a19f1a0d60bc4baea5a996d215fdfAdam Cohen public void finishBindingItems(final boolean upgradePath) { 4433d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4434d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4435d64d1763c590b1c954b759156683abf39ff22945Winson Chung finishBindingItems(upgradePath); 4436d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4437d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4438d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 44397607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 44407607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 44419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mSavedState != null) { 44429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (!mWorkspace.hasFocus()) { 44430142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mWorkspace.getChildAt(mWorkspace.getCurrentPage()).requestFocus(); 44449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 44459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mSavedState = null; 4446138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 4447cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 44481462de39f01cec0ba785386532719cb0207dd827Adam Cohen mWorkspace.restoreInstanceStateForRemainingPages(); 4449cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 4450c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung // Update the market app icon as necessary (the other icons will be managed in response to 4451c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung // package changes in bindSearchablesChanged() 4452d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung if (!DISABLE_MARKET_BUTTON) { 4453d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung updateAppMarketIcon(); 4454d64a66617b6b6aaa3d1d9f9220c33411acdca729Winson Chung } 4455c1f5d26675e9777a55076d41404208e6160ca483Michael Jurka 4456ff7ceff73c77819d4a8328b875c7c238340f2c0cAnjali Koppal setWorkspaceLoading(false); 4457db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 4458db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // If we received the result of any pending adds while the loader was running (e.g. the 4459db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // widget configuration forced an orientation change), process them now. 4460db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen if (sPendingAddItem != null) { 4461db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen final long screenId = completeAdd(sPendingAddItem); 4462db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 4463db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // TODO: this moves the user to the page where the pending item was added. Ideally, 4464db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // the screen would be guaranteed to exist after bind, and the page would be set through 4465db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen // the workspace restore process. 4466db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.post(new Runnable() { 4467db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen @Override 4468db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen public void run() { 4469db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen mWorkspace.snapToScreenId(screenId); 4470db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 4471db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen }); 4472db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen sPendingAddItem = null; 4473db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen } 4474db364c3355a7f5212459c74bd7e837f12aca463bAdam Cohen 4475e25af795647a19f1a0d60bc4baea5a996d215fdfAdam Cohen if (upgradePath) { 44764caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen mWorkspace.getUniqueComponents(true, null); 44774caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen mIntentsOnWorkspaceFromUpgradePath = mWorkspace.getUniqueComponents(true, null); 4478e25af795647a19f1a0d60bc4baea5a996d215fdfAdam Cohen } 4479f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung } 4480f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung 4481a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung public boolean isAllAppsButtonRank(int rank) { 4482a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung if (mHotseat != null) { 4483a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung return mHotseat.isAllAppsButtonRank(rank); 4484a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung } 4485a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung return false; 4486a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung } 4487a0b7e86299ed9baf278e0c1ed73f4a4f6a057322Winson Chung 4488a2413751e3a698aef9c87411a639637883856939Winson Chung private boolean canRunNewAppsAnimation() { 4489a2413751e3a698aef9c87411a639637883856939Winson Chung long diff = System.currentTimeMillis() - mDragController.getLastGestureUpTime(); 4490a2413751e3a698aef9c87411a639637883856939Winson Chung return diff > (NEW_APPS_ANIMATION_INACTIVE_TIMEOUT_SECONDS * 1000); 4491a2413751e3a698aef9c87411a639637883856939Winson Chung } 4492a2413751e3a698aef9c87411a639637883856939Winson Chung 4493c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung private ValueAnimator createNewAppBounceAnimation(View v, int i) { 4494c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung ValueAnimator bounceAnim = LauncherAnimUtils.ofPropertyValuesHolder(v, 4495c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung PropertyValuesHolder.ofFloat("alpha", 1f), 4496c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung PropertyValuesHolder.ofFloat("scaleX", 1f), 4497c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung PropertyValuesHolder.ofFloat("scaleY", 1f)); 4498c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung bounceAnim.setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION); 4499c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung bounceAnim.setStartDelay(i * InstallShortcutReceiver.NEW_SHORTCUT_STAGGER_DELAY); 4500c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung bounceAnim.setInterpolator(new SmoothPagedView.OvershootInterpolator()); 4501c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung return bounceAnim; 4502c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung } 4503c916834ad0da535f08325bcd902a60070f2f7e53Winson Chung 45042777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen public boolean useVerticalBarLayout() { 45052777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen return LauncherAppState.getInstance().getDynamicGrid(). 45062777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen getDeviceProfile().isVerticalBarLayout(); 45072777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen } 45082777273a2a5c710f26726ada0fe4a8f33da57b52Adam Cohen 45096def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai protected Rect getSearchBarBounds() { 45106def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai return LauncherAppState.getInstance().getDynamicGrid(). 45116def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai getDeviceProfile().getSearchBarBounds(); 45126def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai } 45136def4f900c8b92f61256bf33a158aba16d9aceeeMac Duy Hai 4514cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath @Override 4515cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath public void bindSearchablesChanged() { 4516c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung boolean searchVisible = updateGlobalSearchIcon(); 4517c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung boolean voiceVisible = updateVoiceSearchIcon(searchVisible); 4518adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung if (mSearchDropTargetBar != null) { 4519adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible); 4520adf0c180c1c0899f0a91ec91bcdc2002f90a56a5Winson Chung } 4521cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath } 4522cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath 45236d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani /** 45249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Add the icons for all apps. 45259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 45269c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 45279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 4528eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka public void bindAllApplications(final ArrayList<AppInfo> apps) { 452916f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal if (LauncherAppState.isDisableAllApps()) { 4530c58497ee619416c4949b16eb43486c11618b69e5Winson Chung if (mIntentsOnWorkspaceFromUpgradePath != null) { 4531c58497ee619416c4949b16eb43486c11618b69e5Winson Chung if (LauncherModel.UPGRADE_USE_MORE_APPS_FOLDER) { 4532c58497ee619416c4949b16eb43486c11618b69e5Winson Chung getHotseat().addAllAppsFolder(mIconCache, apps, 4533c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mIntentsOnWorkspaceFromUpgradePath, Launcher.this, mWorkspace); 4534c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 4535c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mIntentsOnWorkspaceFromUpgradePath = null; 4536c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 4537306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal if (mAppsCustomizeContent != null) { 4538306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal mAppsCustomizeContent.onPackagesUpdated( 4539306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal LauncherModel.getSortedWidgetsAndShortcuts(this)); 4540306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal } 4541c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } else { 4542ad7db6e8ddddae423d027163a1bdf7015210f7ceWinson Chung if (mAppsCustomizeContent != null) { 4543c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeContent.setApps(apps); 45446e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung mAppsCustomizeContent.onPackagesUpdated( 45456e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung LauncherModel.getSortedWidgetsAndShortcuts(this)); 45468707e0fa1ca2c79be862c29cb919b7372f0b6a50Daniel Sandler } 4547785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 45489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 45499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 45509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 45519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * A package was updated. 45529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 45539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 45549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 4555eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka public void bindAppsUpdated(final ArrayList<AppInfo> apps) { 4556d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 4557d64d1763c590b1c954b759156683abf39ff22945Winson Chung public void run() { 4558d64d1763c590b1c954b759156683abf39ff22945Winson Chung bindAppsUpdated(apps); 4559d64d1763c590b1c954b759156683abf39ff22945Winson Chung } 4560d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4561d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 45627607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka return; 45637607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka } 45647607c2fb2729c7743022ff3fde9cfc75ae6f504fMichael Jurka 4565f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy if (mWorkspace != null) { 4566651077bdd603bb182be039925fd17bdf0da15016Sunny Goyal mWorkspace.updateShortcutsAndWidgets(apps); 4567f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy } 4568c58497ee619416c4949b16eb43486c11618b69e5Winson Chung 456916f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal if (!LauncherAppState.isDisableAllApps() && 4570c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeContent != null) { 4571c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeContent.updateApps(apps); 4572c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 45739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 45749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 45759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 4576aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren * Update the state of a package, typically related to install state. 4577aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren * 4578aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren * Implementation of the method from LauncherModel.Callbacks. 4579aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren */ 4580aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren public void updatePackageState(String pkgName, int state) { 4581aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren if (mWorkspace != null) { 4582aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren mWorkspace.updatePackageState(pkgName, state); 4583aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren } 4584aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren } 4585aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren 4586aeff7ea43409d817490fbb8c22b8d4b9725bb54fChris Wren /** 458783892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * A package was uninstalled. We take both the super set of packageNames 458883892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * in addition to specific applications to remove, the reason being that 458983892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * this can be called when a package is updated as well. In that scenario, 459083892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * we only remove specific components from the workspace, where as 459183892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung * package-removal should clear all items by package name. 45929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 45939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Implementation of the method from LauncherModel.Callbacks. 45949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 459583892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung public void bindComponentsRemoved(final ArrayList<String> packageNames, 4596ed13187a745866483139e2878037e1f8427ce567Kenny Guy final ArrayList<AppInfo> appInfos, final UserHandleCompat user) { 4597d64d1763c590b1c954b759156683abf39ff22945Winson Chung Runnable r = new Runnable() { 459883892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung public void run() { 4599ed13187a745866483139e2878037e1f8427ce567Kenny Guy bindComponentsRemoved(packageNames, appInfos, user); 460083892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 4601d64d1763c590b1c954b759156683abf39ff22945Winson Chung }; 4602d64d1763c590b1c954b759156683abf39ff22945Winson Chung if (waitUntilResume(r)) { 460383892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung return; 460483892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 460583892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung 4606df95eb12a4d288ffa143a0c3db60e7e98f3e03b9Winson Chung if (!packageNames.isEmpty()) { 4607ed13187a745866483139e2878037e1f8427ce567Kenny Guy mWorkspace.removeItemsByPackageName(packageNames, user); 4608df95eb12a4d288ffa143a0c3db60e7e98f3e03b9Winson Chung } 4609df95eb12a4d288ffa143a0c3db60e7e98f3e03b9Winson Chung if (!appInfos.isEmpty()) { 4610ed13187a745866483139e2878037e1f8427ce567Kenny Guy mWorkspace.removeItemsByApplicationInfo(appInfos, user); 46113611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 4612f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 4613a182096cb20e0580dfca6661b2e5871c8886c834Winson Chung // Notify the drag controller 4614df95eb12a4d288ffa143a0c3db60e7e98f3e03b9Winson Chung mDragController.onAppsRemoved(packageNames, appInfos); 4615c58497ee619416c4949b16eb43486c11618b69e5Winson Chung 4616df95eb12a4d288ffa143a0c3db60e7e98f3e03b9Winson Chung // Update AllApps 461716f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal if (!LauncherAppState.isDisableAllApps() && 4618c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeContent != null) { 4619c58497ee619416c4949b16eb43486c11618b69e5Winson Chung mAppsCustomizeContent.removeApps(appInfos); 4620c58497ee619416c4949b16eb43486c11618b69e5Winson Chung } 462131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4622be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato 4623be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato /** 462480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung * A number of packages were updated. 462580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung */ 4626c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private ArrayList<Object> mWidgetsAndShortcuts; 4627c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka private Runnable mBindPackagesUpdatedRunnable = new Runnable() { 462883892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung public void run() { 4629c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka bindPackagesUpdated(mWidgetsAndShortcuts); 4630c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka mWidgetsAndShortcuts = null; 463183892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 4632c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka }; 4633c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka public void bindPackagesUpdated(final ArrayList<Object> widgetsAndShortcuts) { 4634c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka if (waitUntilResume(mBindPackagesUpdatedRunnable, true)) { 4635c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka mWidgetsAndShortcuts = widgetsAndShortcuts; 463683892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung return; 463783892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung } 463883892cc0768bd6d7f0827886e9e7a2eb3eed2b01Winson Chung 463964359a53dc827797917a8d9a0697a91996789801Winson Chung // Update the widgets pane 4640306c1cf200d4e334b19e09a5a5a2026d9f6d12b2Nilesh Agrawal if (mAppsCustomizeContent != null) { 4641c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka mAppsCustomizeContent.onPackagesUpdated(widgetsAndShortcuts); 4642785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 464380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 464480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 4645400438b79fe412cb625c96297edeea9c6155349eWinson Chung private int mapConfigurationOriActivityInfoOri(int configOri) { 4646400438b79fe412cb625c96297edeea9c6155349eWinson Chung final Display d = getWindowManager().getDefaultDisplay(); 4647400438b79fe412cb625c96297edeea9c6155349eWinson Chung int naturalOri = Configuration.ORIENTATION_LANDSCAPE; 4648400438b79fe412cb625c96297edeea9c6155349eWinson Chung switch (d.getRotation()) { 4649400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_0: 4650400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_180: 4651400438b79fe412cb625c96297edeea9c6155349eWinson Chung // We are currently in the same basic orientation as the natural orientation 4652400438b79fe412cb625c96297edeea9c6155349eWinson Chung naturalOri = configOri; 4653400438b79fe412cb625c96297edeea9c6155349eWinson Chung break; 4654400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_90: 4655400438b79fe412cb625c96297edeea9c6155349eWinson Chung case Surface.ROTATION_270: 4656400438b79fe412cb625c96297edeea9c6155349eWinson Chung // We are currently in the other basic orientation to the natural orientation 4657400438b79fe412cb625c96297edeea9c6155349eWinson Chung naturalOri = (configOri == Configuration.ORIENTATION_LANDSCAPE) ? 4658400438b79fe412cb625c96297edeea9c6155349eWinson Chung Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE; 4659400438b79fe412cb625c96297edeea9c6155349eWinson Chung break; 4660400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4661400438b79fe412cb625c96297edeea9c6155349eWinson Chung 4662400438b79fe412cb625c96297edeea9c6155349eWinson Chung int[] oriMap = { 4663400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, 4664400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, 4665400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, 4666400438b79fe412cb625c96297edeea9c6155349eWinson Chung ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE 4667400438b79fe412cb625c96297edeea9c6155349eWinson Chung }; 4668400438b79fe412cb625c96297edeea9c6155349eWinson Chung // Since the map starts at portrait, we need to offset if this device's natural orientation 4669400438b79fe412cb625c96297edeea9c6155349eWinson Chung // is landscape. 4670400438b79fe412cb625c96297edeea9c6155349eWinson Chung int indexOffset = 0; 4671400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (naturalOri == Configuration.ORIENTATION_LANDSCAPE) { 4672400438b79fe412cb625c96297edeea9c6155349eWinson Chung indexOffset = 1; 4673400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4674400438b79fe412cb625c96297edeea9c6155349eWinson Chung return oriMap[(d.getRotation() + indexOffset) % 4]; 4675400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4676446e940fc8839173de12f1299b8c24f318d53a3fAdam Cohen 46774b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung public boolean isRotationEnabled() { 46780a457bfbd9ca6562e8fcd604bcdfeb22f1fb4dedMichael Jurka boolean enableRotation = sForceEnableRotation || 46794b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung getResources().getBoolean(R.bool.allow_rotation); 46804b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung return enableRotation; 46814b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 4682641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung public void lockScreenOrientation() { 46834b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung if (isRotationEnabled()) { 46844b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung setRequestedOrientation(mapConfigurationOriActivityInfoOri(getResources() 46854b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung .getConfiguration().orientation)); 46864b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 4687400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 46884b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung public void unlockScreenOrientation(boolean immediate) { 46894b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung if (isRotationEnabled()) { 46904b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung if (immediate) { 4691641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 46924b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } else { 46934b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung mHandler.postDelayed(new Runnable() { 46944b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung public void run() { 46954b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 46964b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 46974b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung }, mRestoreScreenOrientationDelay); 4698641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung } 46994b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung } 4700400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 4701400438b79fe412cb625c96297edeea9c6155349eWinson Chung 4702d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha /** 4703d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha * Called when the SearchBar hint should be changed. 4704d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha * 4705d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha * @param hint the hint to be displayed in the search bar. 4706d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha */ 4707d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha protected void onSearchBarHintChanged(String hint) { 4708a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.updateSearchBarHint(hint); 4709d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha } 4710d4d3d08741b2c183dbcba1fa25ca100783bfe1eeSandeep Siddhartha 4711e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung protected boolean isLauncherPreinstalled() { 4712e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung PackageManager pm = getPackageManager(); 4713e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung try { 4714e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung ApplicationInfo ai = pm.getApplicationInfo(getComponentName().getPackageName(), 0); 4715e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4716e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung return true; 4717e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } else { 4718e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung return false; 4719e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 4720e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } catch (NameNotFoundException e) { 4721e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung e.printStackTrace(); 4722e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung return false; 4723e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 4724e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung } 4725e43a1e788223ab5a4405c5eeb0133ff57efbc768Winson Chung 4726ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen /** 4727ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen * This method indicates whether or not we should suggest default wallpaper dimensions 4728ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen * when our wallpaper cropper was not yet used to set a wallpaper. 4729ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen */ 4730ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen protected boolean overrideWallpaperDimensions() { 4731ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen return true; 4732ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen } 4733ea90f83e248086b91dbbc7969059f6887190b2a2Adam Cohen 47345eed5d8c7b7ca78dd07bc6d441600cb97e0782a1Adam Cohen protected boolean shouldClingFocusHotseatApp() { 47355eed5d8c7b7ca78dd07bc6d441600cb97e0782a1Adam Cohen return false; 47365eed5d8c7b7ca78dd07bc6d441600cb97e0782a1Adam Cohen } 4737e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung protected String getFirstRunClingSearchBarHint() { 4738e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung return ""; 4739e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung } 4740e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung protected String getFirstRunCustomContentHint() { 4741e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung return ""; 4742e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung } 47433a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung protected int getFirstRunFocusedHotseatAppDrawableId() { 47443a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung return -1; 47453a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung } 47463a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung protected ComponentName getFirstRunFocusedHotseatAppComponentName() { 47473a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung return null; 47483a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung } 47493a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung protected int getFirstRunFocusedHotseatAppRank() { 47503a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung return -1; 47513a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung } 47523a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung protected String getFirstRunFocusedHotseatAppBubbleTitle() { 47533a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung return ""; 47543a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung } 47553a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung protected String getFirstRunFocusedHotseatAppBubbleDescription() { 47563a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung return ""; 47573a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung } 4758e6eabffd39c85b4cdb022c5e803ed561d87bd88bWinson Chung 4759a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public void dismissFirstRunCling(View v) { 4760a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissFirstRunCling(v); 47617d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 4762a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public void dismissMigrationClingCopyApps(View v) { 4763a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissMigrationClingCopyApps(v); 47647d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 4765a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public void dismissMigrationClingUseDefault(View v) { 4766a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissMigrationClingUseDefault(v); 4767104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 4768a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public void dismissMigrationWorkspaceCling(View v) { 4769a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissMigrationWorkspaceCling(v); 4770a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 4771a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public void dismissWorkspaceCling(View v) { 4772a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissWorkspaceCling(v); 4773a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 4774a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung public void dismissFolderCling(View v) { 4775a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung mLauncherClings.dismissFolderCling(v); 47767d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 47776268f2db4c129e33d8d77513cb9df0f4799c7520Adam Cohen public void markFolderClingDismissedIfNecessary() { 47786268f2db4c129e33d8d77513cb9df0f4799c7520Adam Cohen mLauncherClings.markFolderClingDismissedIfNecessary(); 47796268f2db4c129e33d8d77513cb9df0f4799c7520Adam Cohen } 4780432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4781432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4782432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overridden by subclasses to indicate that there is an activity to launch 4783432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * before showing the standard launcher experience. 4784432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4785432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected boolean hasFirstRunActivity() { 4786432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return false; 4787432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4788432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4789432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4790432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overridden by subclasses to launch any first run activity 4791432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4792432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected Intent getFirstRunActivity() { 4793432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return null; 4794432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4795432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4796a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private boolean shouldRunFirstRunActivity() { 4797bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen return !ActivityManager.isRunningInTestHarness() && 4798bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen !mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false); 4799af40f205d7f0c5f73a92ff5d9b8e9602dbde58c0Winson Chung } 4800a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 48014a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen protected boolean hasRunFirstRunActivity() { 48024a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen return mSharedPrefs.getBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, false); 48034a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen } 48044a9423d6ddda9009f9489d5546a822f9222e78c4Adam Cohen 4805432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen public boolean showFirstRunActivity() { 4806bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen if (shouldRunFirstRunActivity() && 4807bc4539df6fd8b0672fbf51a49cba630add5083a3Adam Cohen hasFirstRunActivity()) { 4808a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung Intent firstRunIntent = getFirstRunActivity(); 4809a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung if (firstRunIntent != null) { 4810a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung startActivity(firstRunIntent); 4811a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung markFirstRunActivityShown(); 4812432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return true; 4813a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 4814af40f205d7f0c5f73a92ff5d9b8e9602dbde58c0Winson Chung } 4815432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return false; 4816a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 4817a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 4818a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung private void markFirstRunActivityShown() { 4819a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung SharedPreferences.Editor editor = mSharedPrefs.edit(); 4820a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung editor.putBoolean(FIRST_RUN_ACTIVITY_DISPLAYED, true); 4821a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung editor.apply(); 4822a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung } 48233a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung 4824432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4825432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overridden by subclasses to indicate that there is an in-activity full-screen intro 4826432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * screen that must be displayed and dismissed. 4827432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4828432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected boolean hasDismissableIntroScreen() { 4829432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return false; 4830432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4831432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4832432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4833432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * Full screen intro screen to be shown and dismissed before the launcher can be used. 4834432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4835432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected View getIntroScreen() { 4836432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return null; 4837432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4838432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4839432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen /** 4840432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * To be overriden by subclasses to indicate whether the in-activity intro screen has been 4841432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen * dismissed. This method is ignored if #hasDismissableIntroScreen returns false. 4842432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen */ 4843432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen private boolean shouldShowIntroScreen() { 4844432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen return hasDismissableIntroScreen() && 4845432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen !mSharedPrefs.getBoolean(INTRO_SCREEN_DISMISSED, false); 4846432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4847432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4848432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen protected void showIntroScreen() { 4849432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen View introScreen = getIntroScreen(); 4850432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen changeWallpaperVisiblity(false); 4851432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen if (introScreen != null) { 4852432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mDragLayer.showOverlayView(introScreen); 4853432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4854432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4855432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4856432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen public void dismissIntroScreen() { 4857432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen markIntroScreenDismissed(); 4858432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen if (showFirstRunActivity()) { 4859432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen // We delay hiding the intro view until the first run activity is showing. This 4860432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen // avoids a blip. 4861432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mWorkspace.postDelayed(new Runnable() { 4862432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen @Override 4863432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen public void run() { 4864432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mDragLayer.dismissOverlayView(); 4865432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4866432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen }, ACTIVITY_START_DELAY); 4867432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } else { 4868432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen mDragLayer.dismissOverlayView(); 4869432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4870432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen changeWallpaperVisiblity(true); 4871432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4872432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4873432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen private void markIntroScreenDismissed() { 4874432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen SharedPreferences.Editor editor = mSharedPrefs.edit(); 4875432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen editor.putBoolean(INTRO_SCREEN_DISMISSED, true); 4876432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen editor.apply(); 4877432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen } 4878432609a246819f3cf887a80c2ae56b61fc5ca25aAdam Cohen 4879a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung void showWorkspaceSearchAndHotseat() { 4880205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mWorkspace != null) mWorkspace.setAlpha(1f); 4881205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mHotseat != null) mHotseat.setAlpha(1f); 4882205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mPageIndicators != null) mPageIndicators.setAlpha(1f); 4883205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mSearchDropTargetBar != null) mSearchDropTargetBar.showSearchBar(false); 48847d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 4885a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung 4886a694524047fda0a51dede4eefb1201a598d2d3a7Winson Chung void hideWorkspaceSearchAndHotseat() { 4887205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mWorkspace != null) mWorkspace.setAlpha(0f); 4888205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mHotseat != null) mHotseat.setAlpha(0f); 4889205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mPageIndicators != null) mPageIndicators.setAlpha(0f); 4890205cd7727f3bd8b65892c580e6f243464878fe6eWinson Chung if (mSearchDropTargetBar != null) mSearchDropTargetBar.hideSearchBar(false); 489182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 489282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 489372fbec17e09a1120971621587d5005f683baafd1Mathew Inwood public ItemInfo createAppDragInfo(Intent appLaunchIntent) { 4894ed13187a745866483139e2878037e1f8427ce567Kenny Guy // Called from search suggestion, not supported in other profiles. 4895ed13187a745866483139e2878037e1f8427ce567Kenny Guy final UserHandleCompat myUser = UserHandleCompat.myUserHandle(); 4896ed13187a745866483139e2878037e1f8427ce567Kenny Guy LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this); 4897ed13187a745866483139e2878037e1f8427ce567Kenny Guy LauncherActivityInfoCompat activityInfo = launcherApps.resolveActivity(appLaunchIntent, 4898ed13187a745866483139e2878037e1f8427ce567Kenny Guy myUser); 4899ed13187a745866483139e2878037e1f8427ce567Kenny Guy if (activityInfo == null) { 490072fbec17e09a1120971621587d5005f683baafd1Mathew Inwood return null; 490172fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 4902ed13187a745866483139e2878037e1f8427ce567Kenny Guy return new AppInfo(this, activityInfo, myUser, mIconCache, null); 490372fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 490472fbec17e09a1120971621587d5005f683baafd1Mathew Inwood 490572fbec17e09a1120971621587d5005f683baafd1Mathew Inwood public ItemInfo createShortcutDragInfo(Intent shortcutIntent, CharSequence caption, 490672fbec17e09a1120971621587d5005f683baafd1Mathew Inwood Bitmap icon) { 4907ed13187a745866483139e2878037e1f8427ce567Kenny Guy // Called from search suggestion, not supported in other profiles. 4908ed13187a745866483139e2878037e1f8427ce567Kenny Guy return createShortcutDragInfo(shortcutIntent, caption, icon, 4909ed13187a745866483139e2878037e1f8427ce567Kenny Guy UserHandleCompat.myUserHandle()); 4910ed13187a745866483139e2878037e1f8427ce567Kenny Guy } 4911ed13187a745866483139e2878037e1f8427ce567Kenny Guy 4912ed13187a745866483139e2878037e1f8427ce567Kenny Guy public ItemInfo createShortcutDragInfo(Intent shortcutIntent, CharSequence caption, 4913ed13187a745866483139e2878037e1f8427ce567Kenny Guy Bitmap icon, UserHandleCompat user) { 4914c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy UserManagerCompat userManager = UserManagerCompat.getInstance(this); 4915c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy String contentDescription = userManager.getBadgedLabelForUser(caption.toString(), user); 4916c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy return new ShortcutInfo(shortcutIntent, caption, contentDescription, icon, user); 491772fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 491872fbec17e09a1120971621587d5005f683baafd1Mathew Inwood 4919b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood protected void moveWorkspaceToDefaultScreen() { 4920b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood mWorkspace.moveToDefaultScreen(false); 4921b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood } 4922b90860a99630bbd24f90cc205d8990187b0ed12eMathew Inwood 492372fbec17e09a1120971621587d5005f683baafd1Mathew Inwood public void startDrag(View dragView, ItemInfo dragInfo, DragSource source) { 492472fbec17e09a1120971621587d5005f683baafd1Mathew Inwood dragView.setTag(dragInfo); 4925babb53ef8fd0fcba32fcc8fc213663f0f27b8f5eWinson Chung mWorkspace.onExternalDragStartedWithItem(dragView); 4926babb53ef8fd0fcba32fcc8fc213663f0f27b8f5eWinson Chung mWorkspace.beginExternalDragShared(dragView, source); 492772fbec17e09a1120971621587d5005f683baafd1Mathew Inwood } 492872fbec17e09a1120971621587d5005f683baafd1Mathew Inwood 4929f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal @Override 4930f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal public void onPageSwitch(View newPage, int newPageIndex) { 4931f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal } 4932f5d29130b9f4c501502272d6a97e4c7fb20d95f4Anjali Koppal 493380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung /** 4934be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato * Prints out out state for debugging. 4935be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato */ 4936be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public void dumpState() { 4937325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler Log.d(TAG, "BEGIN launcher3 dump state for launcher " + this); 493839bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mSavedState=" + mSavedState); 493939bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mWorkspaceLoading=" + mWorkspaceLoading); 494039bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mRestoring=" + mRestoring); 494139bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mWaitingForResult=" + mWaitingForResult); 494239bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato Log.d(TAG, "mSavedInstanceState=" + mSavedInstanceState); 4943319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick Log.d(TAG, "sFolders.size=" + sFolders.size()); 4944be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato mModel.dumpState(); 4945f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 4946785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (mAppsCustomizeContent != null) { 4947785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mAppsCustomizeContent.dumpState(); 4948785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 4949325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler Log.d(TAG, "END launcher3 dump state"); 4950be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 495116d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen 495216d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen @Override 495316d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 495416d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen super.dump(prefix, fd, writer, args); 49554caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen synchronized (sDumpLogs) { 49564caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen writer.println(" "); 49574caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen writer.println("Debug logs: "); 49584caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen for (int i = 0; i < sDumpLogs.size(); i++) { 49594caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen writer.println(" " + sDumpLogs.get(i)); 49604caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 496116d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen } 496216d7ffc5d55cc69ddd5a7854f138b2d8cc0a7635Adam Cohen } 4963487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen 4964487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen public static void dumpDebugLogsToConsole() { 4965ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (DEBUG_DUMP_LOG) { 4966ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung synchronized (sDumpLogs) { 4967ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, ""); 4968ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, "*********************"); 4969ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, "Launcher debug logs: "); 4970ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung for (int i = 0; i < sDumpLogs.size(); i++) { 4971ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, " " + sDumpLogs.get(i)); 4972ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 4973ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, "*********************"); 4974ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung Log.d(TAG, ""); 49754caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 49764caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 49774caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 49784caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen 49794caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen public static void addDumpLog(String tag, String log, boolean debugLog) { 4980295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler addDumpLog(tag, log, null, debugLog); 4981295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler } 4982295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler 4983295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler public static void addDumpLog(String tag, String log, Exception e, boolean debugLog) { 49844caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen if (debugLog) { 4985295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler if (e != null) { 4986295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler Log.d(tag, log, e); 4987295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler } else { 4988295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler Log.d(tag, log); 4989295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler } 49904caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 4991ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (DEBUG_DUMP_LOG) { 4992ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung sDateStamp.setTime(System.currentTimeMillis()); 4993ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung synchronized (sDumpLogs) { 4994295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler sDumpLogs.add(sDateFormat.format(sDateStamp) + ": " + tag + ", " + log 4995295ae18d0fa7c102c50cf95a2ea09e7f2e9b1539Dan Sandler + (e == null ? "" : (", Exception: " + e))); 4996ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 49974caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 49984caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 49994caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen 5000ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung public void dumpLogsToLocalData() { 5001ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (DEBUG_DUMP_LOG) { 50024346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka new AsyncTask<Void, Void, Void>() { 50034346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka public Void doInBackground(Void ... args) { 5004ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung boolean success = false; 5005ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung sDateStamp.setTime(sRunStart); 5006ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung String FILENAME = sDateStamp.getMonth() + "-" 5007ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getDay() + "_" 5008ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getHours() + "-" 5009ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getMinutes() + "_" 5010ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung + sDateStamp.getSeconds() + ".txt"; 5011ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung 5012ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung FileOutputStream fos = null; 5013ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung File outFile = null; 5014ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung try { 5015ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung outFile = new File(getFilesDir(), FILENAME); 5016ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung outFile.createNewFile(); 5017ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung fos = new FileOutputStream(outFile); 5018ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } catch (Exception e) { 5019ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung e.printStackTrace(); 50204caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 50214caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen if (fos != null) { 5022ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung PrintWriter writer = new PrintWriter(fos); 5023ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung 5024ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.println(" "); 5025ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.println("Debug logs: "); 5026ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung synchronized (sDumpLogs) { 5027ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung for (int i = 0; i < sDumpLogs.size(); i++) { 5028ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.println(" " + sDumpLogs.get(i)); 5029ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 5030ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 5031ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung writer.close(); 50324caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 5033ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung try { 5034ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung if (fos != null) { 5035ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung fos.close(); 5036ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung success = true; 5037ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } 5038ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung } catch (IOException e) { 5039ede4129e77f8347e32c0da9c615bcff2cbc06fd8Winson Chung e.printStackTrace(); 50404caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 50414346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka return null; 50424caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 50434346746ef37413168a5cbec46bb6db8f96b0123aMichael Jurka }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); 50444caf298a2c9d861d69f5a47b747ada911b125b6dAdam Cohen } 5045487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen } 504631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 50472763be3150d429d338b9848286e9365b4052c100Michael Jurka 5048abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurkainterface LauncherTransitionable { 50492a4b1a809c6bc0af9ae3ad974fe50e2a91569543Michael Jurka View getContent(); 5050a35e35ae0ac2391b8928eb15bf91274aea96b115Michael Jurka void onLauncherTransitionPrepare(Launcher l, boolean animated, boolean toWorkspace); 5051bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace); 50527044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung void onLauncherTransitionStep(Launcher l, float t); 5053bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace); 50542763be3150d429d338b9848286e9365b4052c100Michael Jurka} 5055d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler 5056d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandlerinterface DebugIntents { 5057d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler static final String DELETE_DATABASE = "com.android.launcher3.action.DELETE_DATABASE"; 5058d502404a44fb7c4ea739622d7f8bdd2a764d97a1Dan Sandler static final String MIGRATE_DATABASE = "com.android.launcher3.action.MIGRATE_DATABASE"; 50598b5b05b7f3c8c5d705116c425bd5dbff2b75d56aAdam Cohen} 5060