Search in sources :

Example 1 with AttributeCache

use of com.android.server.AttributeCache in project platform_frameworks_base by android.

the class ActivityManagerService method updateConfigurationLocked.

/**
     * Do either or both things: (1) change the current configuration, and (2)
     * make sure the given activity is running with the (now) current
     * configuration.  Returns true if the activity has been left running, or
     * false if <var>starting</var> is being destroyed to match the new
     * configuration.
     *
     * @param userId is only used when persistent parameter is set to true to persist configuration
     *               for that particular user
     */
private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean persistent, int userId, boolean deferResume) {
    int changes = 0;
    if (mWindowManager != null) {
        mWindowManager.deferSurfaceLayout();
    }
    if (values != null) {
        Configuration newConfig = new Configuration(mConfiguration);
        changes = newConfig.updateFrom(values);
        if (changes != 0) {
            if (DEBUG_SWITCH || DEBUG_CONFIGURATION)
                Slog.i(TAG_CONFIGURATION, "Updating configuration to: " + values);
            EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
            if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
                final LocaleList locales = values.getLocales();
                int bestLocaleIndex = 0;
                if (locales.size() > 1) {
                    if (mSupportedSystemLocales == null) {
                        mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
                    }
                    bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales));
                }
                SystemProperties.set("persist.sys.locale", locales.get(bestLocaleIndex).toLanguageTag());
                LocaleList.setDefault(locales, bestLocaleIndex);
                mHandler.sendMessage(mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG, locales.get(bestLocaleIndex)));
            }
            mConfigurationSeq++;
            if (mConfigurationSeq <= 0) {
                mConfigurationSeq = 1;
            }
            newConfig.seq = mConfigurationSeq;
            mConfiguration = newConfig;
            Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + newConfig);
            mUsageStatsService.reportConfigurationChange(newConfig, mUserController.getCurrentUserIdLocked());
            //mUsageStatsService.noteStartConfig(newConfig);
            final Configuration configCopy = new Configuration(mConfiguration);
            // TODO: If our config changes, should we auto dismiss any currently
            // showing dialogs?
            mShowDialogs = shouldShowDialogs(newConfig, mInVrMode);
            AttributeCache ac = AttributeCache.instance();
            if (ac != null) {
                ac.updateConfiguration(configCopy);
            }
            // Make sure all resources in our process are updated
            // right now, so that anyone who is going to retrieve
            // resource values after we return will be sure to get
            // the new ones.  This is especially important during
            // boot, where the first config change needs to guarantee
            // all resources have that config before following boot
            // code is executed.
            mSystemThread.applyConfigurationToResources(configCopy);
            if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
                Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
                msg.obj = new Configuration(configCopy);
                msg.arg1 = userId;
                mHandler.sendMessage(msg);
            }
            final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
            if (isDensityChange) {
                // Reset the unsupported display size dialog.
                mUiHandler.sendEmptyMessage(SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG);
                killAllBackgroundProcessesExcept(Build.VERSION_CODES.N, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
            }
            for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
                ProcessRecord app = mLruProcesses.get(i);
                try {
                    if (app.thread != null) {
                        if (DEBUG_CONFIGURATION)
                            Slog.v(TAG_CONFIGURATION, "Sending to proc " + app.processName + " new config " + mConfiguration);
                        app.thread.scheduleConfigurationChanged(configCopy);
                    }
                } catch (Exception e) {
                }
            }
            Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_FOREGROUND);
            broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL);
            if ((changes & ActivityInfo.CONFIG_LOCALE) != 0) {
                intent = new Intent(Intent.ACTION_LOCALE_CHANGED);
                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
                if (initLocale || !mProcessesReady) {
                    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                }
                broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL);
            }
        }
        // ensureActivityConfigurationLocked().
        if (mWindowManager != null) {
            final int[] resizedStacks = mWindowManager.setNewConfiguration(mConfiguration);
            if (resizedStacks != null) {
                for (int stackId : resizedStacks) {
                    final Rect newBounds = mWindowManager.getBoundsForNewConfiguration(stackId);
                    mStackSupervisor.resizeStackLocked(stackId, newBounds, null, null, false, false, deferResume);
                }
            }
        }
    }
    boolean kept = true;
    final ActivityStack mainStack = mStackSupervisor.getFocusedStack();
    // mainStack is null during startup.
    if (mainStack != null) {
        if (changes != 0 && starting == null) {
            // If the configuration changed, and the caller is not already
            // in the process of starting an activity, then find the top
            // activity to check if its configuration needs to change.
            starting = mainStack.topRunningActivityLocked();
        }
        if (starting != null) {
            kept = mainStack.ensureActivityConfigurationLocked(starting, changes, false);
            // And we need to make sure at this point that all other activities
            // are made visible with the correct configuration.
            mStackSupervisor.ensureActivitiesVisibleLocked(starting, changes, !PRESERVE_WINDOWS);
        }
    }
    if (mWindowManager != null) {
        mWindowManager.continueSurfaceLayout();
    }
    return kept;
}
Also used : LocaleList(android.os.LocaleList) Rect(android.graphics.Rect) Configuration(android.content.res.Configuration) Message(android.os.Message) PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) AttributeCache(com.android.server.AttributeCache) Point(android.graphics.Point) RemoteException(android.os.RemoteException) IOException(java.io.IOException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) ActivityNotFoundException(android.content.ActivityNotFoundException) TransactionTooLargeException(android.os.TransactionTooLargeException) InstallerException(com.android.server.pm.Installer.InstallerException) FileNotFoundException(java.io.FileNotFoundException) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException)

Example 2 with AttributeCache

use of com.android.server.AttributeCache in project platform_frameworks_base by android.

the class ActivityManagerService method forceStopPackageLocked.

final boolean forceStopPackageLocked(String packageName, int appId, boolean callerWillRestart, boolean purgeCache, boolean doit, boolean evenPersistent, boolean uninstalling, int userId, String reason) {
    int i;
    if (userId == UserHandle.USER_ALL && packageName == null) {
        Slog.w(TAG, "Can't force stop all processes of all users, that is insane!");
    }
    if (appId < 0 && packageName != null) {
        try {
            appId = UserHandle.getAppId(AppGlobals.getPackageManager().getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, 0));
        } catch (RemoteException e) {
        }
    }
    if (doit) {
        if (packageName != null) {
            Slog.i(TAG, "Force stopping " + packageName + " appid=" + appId + " user=" + userId + ": " + reason);
        } else {
            Slog.i(TAG, "Force stopping u" + userId + ": " + reason);
        }
        mAppErrors.resetProcessCrashTimeLocked(packageName == null, appId, userId);
    }
    boolean didSomething = killPackageProcessesLocked(packageName, appId, userId, ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent, packageName == null ? ("stop user " + userId) : ("stop " + packageName));
    didSomething |= mActivityStarter.clearPendingActivityLaunchesLocked(packageName);
    if (mStackSupervisor.finishDisabledPackageActivitiesLocked(packageName, null, doit, evenPersistent, userId)) {
        if (!doit) {
            return true;
        }
        didSomething = true;
    }
    if (mServices.bringDownDisabledPackageServicesLocked(packageName, null, userId, evenPersistent, true, doit)) {
        if (!doit) {
            return true;
        }
        didSomething = true;
    }
    if (packageName == null) {
        // Remove all sticky broadcasts from this user.
        mStickyBroadcasts.remove(userId);
    }
    ArrayList<ContentProviderRecord> providers = new ArrayList<>();
    if (mProviderMap.collectPackageProvidersLocked(packageName, null, doit, evenPersistent, userId, providers)) {
        if (!doit) {
            return true;
        }
        didSomething = true;
    }
    for (i = providers.size() - 1; i >= 0; i--) {
        removeDyingProviderLocked(null, providers.get(i), true);
    }
    // Remove transient permissions granted from/to this package/user
    removeUriPermissionsForPackageLocked(packageName, userId, false);
    if (doit) {
        for (i = mBroadcastQueues.length - 1; i >= 0; i--) {
            didSomething |= mBroadcastQueues[i].cleanupDisabledPackageReceiversLocked(packageName, null, userId, doit);
        }
    }
    if (packageName == null || uninstalling) {
        // such packages, so they can be left with bad pending intents.
        if (mIntentSenderRecords.size() > 0) {
            Iterator<WeakReference<PendingIntentRecord>> it = mIntentSenderRecords.values().iterator();
            while (it.hasNext()) {
                WeakReference<PendingIntentRecord> wpir = it.next();
                if (wpir == null) {
                    it.remove();
                    continue;
                }
                PendingIntentRecord pir = wpir.get();
                if (pir == null) {
                    it.remove();
                    continue;
                }
                if (packageName == null) {
                    // Stopping user, remove all objects for the user.
                    if (pir.key.userId != userId) {
                        // Not the same user, skip it.
                        continue;
                    }
                } else {
                    if (UserHandle.getAppId(pir.uid) != appId) {
                        // Different app id, skip it.
                        continue;
                    }
                    if (userId != UserHandle.USER_ALL && pir.key.userId != userId) {
                        // Different user, skip it.
                        continue;
                    }
                    if (!pir.key.packageName.equals(packageName)) {
                        // Different package, skip it.
                        continue;
                    }
                }
                if (!doit) {
                    return true;
                }
                didSomething = true;
                it.remove();
                pir.canceled = true;
                if (pir.key.activity != null && pir.key.activity.pendingResults != null) {
                    pir.key.activity.pendingResults.remove(pir.ref);
                }
            }
        }
    }
    if (doit) {
        if (purgeCache && packageName != null) {
            AttributeCache ac = AttributeCache.instance();
            if (ac != null) {
                ac.removePackage(packageName);
            }
        }
        if (mBooted) {
            mStackSupervisor.resumeFocusedStackTopActivityLocked();
            mStackSupervisor.scheduleIdleLocked();
        }
    }
    return didSomething;
}
Also used : WeakReference(java.lang.ref.WeakReference) ArrayList(java.util.ArrayList) RemoteException(android.os.RemoteException) AttributeCache(com.android.server.AttributeCache) Point(android.graphics.Point)

Example 3 with AttributeCache

use of com.android.server.AttributeCache in project android_frameworks_base by DirtyUnicorns.

the class ActivityManagerService method updateConfigurationLocked.

/**
     * Do either or both things: (1) change the current configuration, and (2)
     * make sure the given activity is running with the (now) current
     * configuration.  Returns true if the activity has been left running, or
     * false if <var>starting</var> is being destroyed to match the new
     * configuration.
     *
     * @param userId is only used when persistent parameter is set to true to persist configuration
     *               for that particular user
     */
private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean persistent, int userId, boolean deferResume) {
    int changes = 0;
    if (mWindowManager != null) {
        mWindowManager.deferSurfaceLayout();
    }
    if (values != null) {
        Configuration newConfig = new Configuration(mConfiguration);
        changes = newConfig.updateFrom(values);
        if (changes != 0) {
            if (DEBUG_SWITCH || DEBUG_CONFIGURATION)
                Slog.i(TAG_CONFIGURATION, "Updating configuration to: " + values);
            EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
            if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
                final LocaleList locales = values.getLocales();
                int bestLocaleIndex = 0;
                if (locales.size() > 1) {
                    if (mSupportedSystemLocales == null) {
                        mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
                    }
                    bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales));
                }
                SystemProperties.set("persist.sys.locale", locales.get(bestLocaleIndex).toLanguageTag());
                LocaleList.setDefault(locales, bestLocaleIndex);
                mHandler.sendMessage(mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG, locales.get(bestLocaleIndex)));
            }
            mConfigurationSeq++;
            if (mConfigurationSeq <= 0) {
                mConfigurationSeq = 1;
            }
            newConfig.seq = mConfigurationSeq;
            mConfiguration = newConfig;
            Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + newConfig);
            mUsageStatsService.reportConfigurationChange(newConfig, mUserController.getCurrentUserIdLocked());
            //mUsageStatsService.noteStartConfig(newConfig);
            final Configuration configCopy = new Configuration(mConfiguration);
            // TODO: If our config changes, should we auto dismiss any currently
            // showing dialogs?
            mShowDialogs = shouldShowDialogs(newConfig, mInVrMode);
            AttributeCache ac = AttributeCache.instance();
            if (ac != null) {
                ac.updateConfiguration(configCopy);
            }
            // Make sure all resources in our process are updated
            // right now, so that anyone who is going to retrieve
            // resource values after we return will be sure to get
            // the new ones.  This is especially important during
            // boot, where the first config change needs to guarantee
            // all resources have that config before following boot
            // code is executed.
            mSystemThread.applyConfigurationToResources(configCopy);
            if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
                Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
                msg.obj = new Configuration(configCopy);
                msg.arg1 = userId;
                mHandler.sendMessage(msg);
            }
            final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
            if (isDensityChange) {
                // Reset the unsupported display size dialog.
                mUiHandler.sendEmptyMessage(SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG);
                killAllBackgroundProcessesExcept(Build.VERSION_CODES.N, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
            }
            for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
                ProcessRecord app = mLruProcesses.get(i);
                try {
                    if (app.thread != null) {
                        if (DEBUG_CONFIGURATION)
                            Slog.v(TAG_CONFIGURATION, "Sending to proc " + app.processName + " new config " + mConfiguration);
                        app.thread.scheduleConfigurationChanged(configCopy);
                    }
                } catch (Exception e) {
                }
            }
            Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_FOREGROUND);
            broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL);
            if ((changes & ActivityInfo.CONFIG_LOCALE) != 0) {
                intent = new Intent(Intent.ACTION_LOCALE_CHANGED);
                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
                if (initLocale || !mProcessesReady) {
                    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                }
                broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, Process.SYSTEM_UID, UserHandle.USER_ALL);
            }
        }
        // ensureActivityConfigurationLocked().
        if (mWindowManager != null) {
            final int[] resizedStacks = mWindowManager.setNewConfiguration(mConfiguration);
            if (resizedStacks != null) {
                for (int stackId : resizedStacks) {
                    final Rect newBounds = mWindowManager.getBoundsForNewConfiguration(stackId);
                    mStackSupervisor.resizeStackLocked(stackId, newBounds, null, null, false, false, deferResume);
                }
            }
        }
    }
    boolean kept = true;
    final ActivityStack mainStack = mStackSupervisor.getFocusedStack();
    // mainStack is null during startup.
    if (mainStack != null) {
        if (changes != 0 && starting == null) {
            // If the configuration changed, and the caller is not already
            // in the process of starting an activity, then find the top
            // activity to check if its configuration needs to change.
            starting = mainStack.topRunningActivityLocked();
        }
        if (starting != null) {
            kept = mainStack.ensureActivityConfigurationLocked(starting, changes, false);
            // And we need to make sure at this point that all other activities
            // are made visible with the correct configuration.
            mStackSupervisor.ensureActivitiesVisibleLocked(starting, changes, !PRESERVE_WINDOWS);
        }
    }
    if (mWindowManager != null) {
        mWindowManager.continueSurfaceLayout();
    }
    return kept;
}
Also used : LocaleList(android.os.LocaleList) Rect(android.graphics.Rect) Configuration(android.content.res.Configuration) Message(android.os.Message) PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) AttributeCache(com.android.server.AttributeCache) Point(android.graphics.Point) RemoteException(android.os.RemoteException) IOException(java.io.IOException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) ActivityNotFoundException(android.content.ActivityNotFoundException) TransactionTooLargeException(android.os.TransactionTooLargeException) FileNotFoundException(java.io.FileNotFoundException) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) InstallerException(com.android.internal.os.InstallerConnection.InstallerException)

Example 4 with AttributeCache

use of com.android.server.AttributeCache in project cornerstone by Onskreen.

the class ActivityManagerService method updateConfigurationLocked.

/**
     * Do either or both things: (1) change the current configuration, and (2)
     * make sure the given activity is running with the (now) current
     * configuration.  Returns true if the activity has been left running, or
     * false if <var>starting</var> is being destroyed to match the new
     * configuration.
     * @param persistent TODO
     */
boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean persistent, boolean initLocale) {
    // do nothing if we are headless
    if (mHeadless)
        return true;
    int changes = 0;
    boolean kept = true;
    if (values != null) {
        Configuration newConfig = new Configuration(mConfiguration);
        changes = newConfig.updateFrom(values);
        if (changes != 0) {
            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
                Slog.i(TAG, "Updating configuration to: " + values);
            }
            EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
            if (values.locale != null && !initLocale) {
                saveLocaleLocked(values.locale, !values.locale.equals(mConfiguration.locale), values.userSetLocale);
            }
            mConfigurationSeq++;
            if (mConfigurationSeq <= 0) {
                mConfigurationSeq = 1;
            }
            newConfig.seq = mConfigurationSeq;
            mConfiguration = newConfig;
            Slog.i(TAG, "Config changed: " + newConfig);
            final Configuration configCopy = new Configuration(mConfiguration);
            // TODO: If our config changes, should we auto dismiss any currently
            // showing dialogs?
            mShowDialogs = shouldShowDialogs(newConfig);
            AttributeCache ac = AttributeCache.instance();
            if (ac != null) {
                ac.updateConfiguration(configCopy);
            }
            // Make sure all resources in our process are updated
            // right now, so that anyone who is going to retrieve
            // resource values after we return will be sure to get
            // the new ones.  This is especially important during
            // boot, where the first config change needs to guarantee
            // all resources have that config before following boot
            // code is executed.
            mSystemThread.applyConfigurationToResources(configCopy);
            if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
                Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
                msg.obj = new Configuration(configCopy);
                mHandler.sendMessage(msg);
            }
            for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
                ProcessRecord app = mLruProcesses.get(i);
                try {
                    if (app.thread != null) {
                        /**
                             * Author: Onskreen
                             * Date: 26/12/2011
                             *
                             * Have to send WP specific configs in cases where the process has activities in a WP. In case
                             * where the process holds system level apps, the standard config is set.
                             *
                             */
                        ActivityRecord matchingActivity = matchActivityWithProcess(app);
                        if (matchingActivity != null) {
                            Configuration wpConfigWithChanges = mWindowManager.computeWindowPanelConfiguration(configCopy, matchingActivity.appToken, mWindowManager.mCornerstoneState);
                            if (DEBUG_CONFIGURATION)
                                Slog.v(TAG, "Sending to proc " + app.processName + " new config " + wpConfigWithChanges);
                            app.thread.scheduleConfigurationChanged(wpConfigWithChanges);
                        } else {
                            if (DEBUG_CONFIGURATION)
                                Slog.v(TAG, "Sending to proc " + app.processName + " new config " + mConfiguration);
                            app.thread.scheduleConfigurationChanged(configCopy);
                        }
                    /*if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending to proc "
                                    + app.processName + " new config " + mConfiguration);
                            app.thread.scheduleConfigurationChanged(configCopy);*/
                    }
                } catch (Exception e) {
                }
            }
            Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING);
            broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, false, false, MY_PID, Process.SYSTEM_UID, 0);
            if ((changes & ActivityInfo.CONFIG_LOCALE) != 0) {
                broadcastIntentLocked(null, null, new Intent(Intent.ACTION_LOCALE_CHANGED), null, null, 0, null, null, null, false, false, MY_PID, Process.SYSTEM_UID, 0);
            }
        }
    }
    if (changes != 0) /*&& starting == null*/
    {
        // If the configuration changed, and the caller is not already
        // in the process of starting an activity, then find the top
        // activity to check if its configuration needs to change.
        //starting = mMainStack.topRunningActivityLocked(null);
        /**
             * Author: Onskreen
             * Date: 26/12/2011
             *
             * At this pont mConfiguration contains the changes. Changes below ensures that wpconfig has the wp specific settings
             *  and the mconfiguraiton values also. Then we can diff them to get the changes.
             */
        // Cornerstone Stack
        ActivityRecord csStarting = mCornerstoneStack.topRunningActivityLocked(null);
        if (csStarting != null) {
            Configuration wpConfigWithChanges = mWindowManager.computeWindowPanelConfiguration(mConfiguration, csStarting.appToken, mWindowManager.mCornerstoneState);
            Configuration wpConfigWithoutChanges = new Configuration(mWindowManager.computeWindowPanelConfiguration(WindowManagerService.WP_Panel.CORNERSTONE));
            int wpChanges = wpConfigWithoutChanges.updateFrom(wpConfigWithChanges);
            //kept = mCornerstoneStack.ensureActivityConfigurationLocked(starting, changes);
            kept = mCornerstoneStack.ensureActivityConfigurationLocked(csStarting, wpChanges);
            if (kept) {
                if (DEBUG_SWITCH)
                    Slog.i(TAG, "Config distartingdn't destroy " + csStarting + ", ensuring otstartingFoundInWPStackhers are correct.");
                //mCornerstoneStack.ensureActivitiesVisibleLocked(starting, changes);
                mCornerstoneStack.ensureActivitiesVisibleLocked(csStarting, wpChanges);
            }
        }
        // Cornerstone Panel Stack
        for (int i = 0; i < mCornerstonePanelStacks.size(); i++) {
            ActivityStack targetStack = mCornerstonePanelStacks.get(i);
            ActivityRecord csPanelStarting = targetStack.topRunningActivityLocked(null);
            if (csPanelStarting != null) {
                Configuration wpConfigWithChanges = mWindowManager.computeWindowPanelConfiguration(mConfiguration, csPanelStarting.appToken, mWindowManager.mCornerstoneState);
                Configuration wpConfigWithoutChanges = null;
                if (i == 0) {
                    wpConfigWithoutChanges = new Configuration(mWindowManager.computeWindowPanelConfiguration(WindowManagerService.WP_Panel.CS_APP_0));
                } else {
                    wpConfigWithoutChanges = new Configuration(mWindowManager.computeWindowPanelConfiguration(WindowManagerService.WP_Panel.CS_APP_1));
                }
                int wpChanges = wpConfigWithoutChanges.updateFrom(wpConfigWithChanges);
                //kept = targetStack.ensureActivityConfigurationLocked(starting, changes);
                kept = targetStack.ensureActivityConfigurationLocked(csPanelStarting, wpChanges);
                if (kept) {
                    if (DEBUG_SWITCH)
                        Slog.i(TAG, "Config didn't destroy " + csPanelStarting + ", ensuring others are correct.");
                    //targetStack.ensureActivitiesVisibleLocked(starting, changes);
                    targetStack.ensureActivitiesVisibleLocked(csPanelStarting, wpChanges);
                }
            }
        }
        // Main Panel Stack
        ActivityRecord mainStarting = mMainStack.topRunningActivityLocked(null);
        if (mainStarting != null) {
            Configuration wpConfigWithChanges = mWindowManager.computeWindowPanelConfiguration(mConfiguration, mainStarting.appToken, mWindowManager.mCornerstoneState);
            Configuration wpConfigWithoutChanges = new Configuration(mWindowManager.computeWindowPanelConfiguration(WindowManagerService.WP_Panel.MAIN_PANEL));
            int wpChanges = wpConfigWithoutChanges.updateFrom(wpConfigWithChanges);
            kept = mMainStack.ensureActivityConfigurationLocked(mainStarting, wpChanges);
            //kept = mMainStack.ensureActivityConfigurationLocked(starting, changes);
            if (kept) {
                // other activities are made visible.
                if (DEBUG_SWITCH)
                    Slog.i(TAG, "Config didn't destroy " + mainStarting + ", ensuring others are correct.");
                //mMainStack.ensureActivitiesVisibleLocked(starting, changes);
                mMainStack.ensureActivitiesVisibleLocked(mainStarting, wpChanges);
            }
        }
    //Non-WindowPanel
    /**if (!startingFoundInWPStack && starting != null) {
                kept = mMainStack.ensureActivityConfigurationLocked(starting, changes);
                // And we need to make sure at this point that all other activities
                // are made visible with the correct configuration.
                mMainStack.ensureActivitiesVisibleLocked(starting, changes);
            }**/
    }
    if (values != null && mWindowManager != null) {
        mWindowManager.setNewConfiguration(mConfiguration);
    }
    return kept;
}
Also used : Configuration(android.content.res.Configuration) Message(android.os.Message) PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) AttributeCache(com.android.server.AttributeCache) RemoteException(android.os.RemoteException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) ActivityNotFoundException(android.content.ActivityNotFoundException) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException)

Example 5 with AttributeCache

use of com.android.server.AttributeCache in project cornerstone by Onskreen.

the class ActivityManagerService method forceConfigurationLocked.

/**
     * Author: Onskreen
     * Date: 09/06/2011
     *
     * Force the specified ActivityStack to reconfig itself. The purpose of this method as opposed to
     * using updateConfigurationLocked is we avoid sending every process a new config here since
     * this is used in cases that are system wide.
     */
public void forceConfigurationLocked(ActivityStack stack, WindowManagerService.Cornerstone_State csState) {
    Configuration newConfig = new Configuration(mConfiguration);
    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
        Slog.i(TAG, "Forcing configuration on: " + stack);
    }
    mConfigurationSeq++;
    if (mConfigurationSeq <= 0) {
        mConfigurationSeq = 1;
    }
    newConfig.seq = mConfigurationSeq;
    mConfiguration = newConfig;
    Slog.i(TAG, "Config forced to change: " + newConfig);
    final Configuration configCopy = new Configuration(mConfiguration);
    AttributeCache ac = AttributeCache.instance();
    if (ac != null) {
        ac.updateConfiguration(configCopy);
    }
    /**
             * Do this only for the processes in the specified stack
             */
    for (ActivityRecord ar : stack.mHistory) {
        ProcessRecord app = ar.app;
        try {
            if (app.thread != null) {
                /**
                         * Author: Onskreen
                         * Date: 26/12/2011
                         *
                         * Have to send WP specific configs in cases where the process has activities in a WP. In case
                         * where the process holds system level apps, the standard config is set.
                         *
                         * CONFIG-TODO - same problem, how do we appropriately update here?
                         */
                ActivityRecord matchingActivity = matchActivityWithProcess(app);
                if (matchingActivity != null) {
                    Configuration wpConfigWithChanges = mWindowManager.computeWindowPanelConfiguration(configCopy, matchingActivity.appToken, csState);
                    if (DEBUG_CONFIGURATION)
                        Slog.v(TAG, "Sending to proc " + app.processName + " new config " + wpConfigWithChanges);
                    app.thread.scheduleConfigurationChanged(wpConfigWithChanges);
                } else {
                    if (DEBUG_CONFIGURATION)
                        Slog.v(TAG, "Sending to proc " + app.processName + " new config " + configCopy);
                    app.thread.scheduleConfigurationChanged(configCopy);
                }
            }
        } catch (Exception e) {
        }
    }
    Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING);
    broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, false, false, MY_PID, Process.SYSTEM_UID, 0);
    /**
             * Author: Onskreen
             * Date: 26/12/2011
             *
             * ActivityStack.ensureActivityConfigurationLocked calculates changes on its own now
             */
    ActivityRecord starting = stack.topRunningActivityLocked(null);
    if (starting != null) {
        //Configuration wpConfigWithChanges = mWindowManager.computeWindowPanelConfiguration(config, starting.appToken, csState);
        //Configuration wpConfigWithoutChanges = new Configuration(mWindowManager.computeWindowPanelConfiguration(WindowManagerService.WP_Panel.CORNERSTONE));
        //int wpChanges = wpConfigWithoutChanges.updateFrom(wpConfigWithChanges);
        //              boolean kept = stack.ensureActivityConfigurationLocked(starting, wpChanges);
        boolean kept = stack.ensureActivityConfigurationLocked(starting, 0);
        if (kept) {
            // other activities are made visible.
            if (DEBUG_SWITCH)
                Slog.i(TAG, "Config didn't destroy " + starting + ", ensuring others are correct.");
            //stack.ensureActivitiesVisibleLocked(starting, wpChanges);
            stack.ensureActivitiesVisibleLocked(starting, 0);
        }
    }
    if (mWindowManager != null) {
        mWindowManager.setNewConfiguration(mConfiguration);
    }
}
Also used : Configuration(android.content.res.Configuration) PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) AttributeCache(com.android.server.AttributeCache) RemoteException(android.os.RemoteException) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) ActivityNotFoundException(android.content.ActivityNotFoundException) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException)

Aggregations

RemoteException (android.os.RemoteException)10 AttributeCache (com.android.server.AttributeCache)10 PendingIntent (android.app.PendingIntent)6 ActivityNotFoundException (android.content.ActivityNotFoundException)6 Intent (android.content.Intent)6 NameNotFoundException (android.content.pm.PackageManager.NameNotFoundException)6 Configuration (android.content.res.Configuration)6 FileNotFoundException (java.io.FileNotFoundException)6 IOException (java.io.IOException)6 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)5 Point (android.graphics.Point)4 Message (android.os.Message)4 ArrayList (java.util.ArrayList)4 WeakReference (java.lang.ref.WeakReference)3 Rect (android.graphics.Rect)2 LocaleList (android.os.LocaleList)2 TransactionTooLargeException (android.os.TransactionTooLargeException)2 SparseArray (android.util.SparseArray)2 AtomicLong (java.util.concurrent.atomic.AtomicLong)2 InstallerException (com.android.internal.os.InstallerConnection.InstallerException)1