📄 home.java
字号:
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.home;import android.app.Activity;import android.app.ActivityManager;import android.app.SearchManager;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.pm.ActivityInfo;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.content.res.Resources;import android.database.ContentObserver;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PaintFlagsDrawFilter;import android.graphics.PixelFormat;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.graphics.drawable.PaintDrawable;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.view.animation.LayoutAnimationController;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.CheckBox;import android.widget.GridView;import android.widget.TextView;import android.net.Uri;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.LinkedList;import java.util.List;public class Home extends Activity{ /** * Tag used for logging errors. */ private static final String LOG_TAG = "Home"; /** * Keys during freeze/thaw. */ private static final String KEY_SAVE_GRID_OPENED = "grid.opened"; // Identifiers for option menu items private static final int MENU_WALLPAPER_SETTINGS = Menu.FIRST + 1; private static final int MENU_SEARCH = MENU_WALLPAPER_SETTINGS + 1; private static final int MENU_SETTINGS = MENU_SEARCH + 1; /** * Maximum number of recent tasks to query. */ private static final int MAX_RECENT_TASKS = 20; private static boolean mWallpaperChecked; private static ArrayList<ApplicationInfo> mApplications; private static LinkedList<ApplicationInfo> mFavorites; private Handler mHandler = new Handler(); private final BroadcastReceiver mWallpaperReceiver = new WallpaperIntentReceiver(); private final BroadcastReceiver mApplicationsReceiver = new ApplicationsIntentReceiver(); private final ContentObserver mObserver = new FavoritesChangeObserver(); private GridView mGrid; private LayoutAnimationController mShowLayoutAnimation; private LayoutAnimationController mHideLayoutAnimation; private boolean mBlockAnimation; private View mShowApplications; private CheckBox mShowApplicationsCheck; private ApplicationsStackLayout mApplicationsStack; private Animation mGridEntry; private Animation mGridExit; private Paint bubblePaint; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); setContentView(R.layout.home); registerIntentReceivers(); registerContentObservers(); setDefaultWallpaper(); loadApplications(true); bindApplications(); bindFavorites(true); bindRecents(); bindButtons(); bubblePaint = new Paint(); bubblePaint.setColor(Color.WHITE); bubblePaint.setAntiAlias(true); mGridEntry = AnimationUtils.loadAnimation(this, R.anim.grid_entry); mGridExit = AnimationUtils.loadAnimation(this, R.anim.grid_exit); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // Close the menu if (Intent.ACTION_MAIN.equals(intent.getAction())) { getWindow().closeAllPanels(); } } @Override public void onDestroy() { super.onDestroy(); // Remove the callback for the cached drawables or we leak // the previous Home screen on orientation change final int count = mApplications.size(); for (int i = 0; i < count; i++) { mApplications.get(i).icon.setCallback(null); } getContentResolver().unregisterContentObserver(mObserver); unregisterReceiver(mWallpaperReceiver); unregisterReceiver(mApplicationsReceiver); } @Override protected void onResume() { super.onResume(); bindRecents(); } @Override protected void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); final boolean opened = state.getBoolean(KEY_SAVE_GRID_OPENED, false); if (opened) { showApplications(false); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(KEY_SAVE_GRID_OPENED, mGrid.getVisibility() == View.VISIBLE); } /** * Registers various intent receivers. The current implementation registers only a wallpaper intent receiver to let other applications change the wallpaper. */ private void registerIntentReceivers() { IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED); registerReceiver(mWallpaperReceiver, filter); filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addDataScheme("package"); registerReceiver(mApplicationsReceiver, filter); } /** * Registers various content observers. The current implementation registers only a favorites observer to keep track of the favorites applications. */ private void registerContentObservers() { ContentResolver resolver = getContentResolver(); resolver.registerContentObserver(Uri.parse("content://" + android.provider.Settings.AUTHORITY + "/favorites?notify=true"), true, mObserver); } /** * Creates a new appplications adapter for the grid view and registers it. */ private void bindApplications() { if (mGrid == null) { mGrid = (GridView) findViewById(R.id.all_apps); } mGrid.setAdapter(new ApplicationsAdapter(this, mApplications)); mGrid.setSelection(0); if (mApplicationsStack == null) { mApplicationsStack = (ApplicationsStackLayout) findViewById(R.id.faves_and_recents); } } /** * Binds actions to the various buttons. */ private void bindButtons() { mShowApplications = findViewById(R.id.show_all_apps); mShowApplications.setOnClickListener(new ShowApplications()); mShowApplicationsCheck = (CheckBox) findViewById(R.id.show_all_apps_check); mGrid.setOnItemClickListener(new ApplicationLauncher()); } /** * When no wallpaper was manually set, a default wallpaper is used instead. */ private void setDefaultWallpaper() { if (!mWallpaperChecked) { Drawable wallpaper = peekWallpaper(); if (wallpaper == null) { try { clearWallpaper(); } catch (IOException e) { Log.e(LOG_TAG, "Failed to clear wallpaper " + e); } } else { getWindow().setBackgroundDrawable(wallpaper); } mWallpaperChecked = true; } } /** * Refreshes the favorite applications stacked over the all apps button. The number of favorites depends on the user. */ private void bindFavorites(boolean isLaunching) { if (!isLaunching || mFavorites == null) { final Cursor c = getContentResolver().query( Uri.parse("content://" + android.provider.Settings.AUTHORITY + "/favorites?notify=true"), null, null, null, "cellX"); final int intentIndex = c.getColumnIndexOrThrow("intent"); final int titleIndex = c.getColumnIndexOrThrow("title"); final int typeIndex = c.getColumnIndexOrThrow("itemType"); final PackageManager manager = getPackageManager(); ApplicationInfo info; String intentDescription; if (mFavorites == null) { mFavorites = new LinkedList<ApplicationInfo>(); } else { mFavorites.clear(); } while (c.moveToNext()) { final int itemType = c.getInt(typeIndex); if (itemType == 0 || // 0 == application itemType == 1) { // 1 == shortcut intentDescription = c.getString(intentIndex); if (intentDescription == null) { continue; } Intent intent; try { intent = Intent.getIntent(intentDescription); } catch (java.net.URISyntaxException e) { continue; } info = getApplicationInfo(manager, intent); if (info != null) { info.title = c.getString(titleIndex); info.intent = intent; mFavorites.addFirst(info); } } } c.close(); } mApplicationsStack.setFavorites(mFavorites); } /** * Refreshes the recently launched applications stacked over the favorites. The number of recents depends on how many favorites are present. */ private void bindRecents() { final PackageManager manager = getPackageManager(); final ActivityManager tasksManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); final List<ActivityManager.RecentTaskInfo> recentTasks = tasksManager.getRecentTasks(MAX_RECENT_TASKS, 0); final int count = recentTasks.size(); final ArrayList<ApplicationInfo> recents = new ArrayList<ApplicationInfo>(); for (int i = count - 1; i >= 0; i--) { final Intent intent = recentTasks.get(i).baseIntent; if (Intent.ACTION_MAIN.equals(intent.getAction()) && !intent.hasCategory(Intent.CATEGORY_HOME)) { ApplicationInfo info = getApplicationInfo(manager, intent); if (info != null) { info.intent = intent; if (!mFavorites.contains(info)) { recents.add(info); } } } } mApplicationsStack.setRecents(recents); } private static ApplicationInfo getApplicationInfo(PackageManager manager, Intent intent) { final ResolveInfo resolveInfo = manager.resolveActivity(intent, 0); if (resolveInfo == null)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -