Giter Club home page Giter Club logo

intellij-java2smali's People

Contributors

ollide avatar signedbit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

intellij-java2smali's Issues

Error:Abnormal build process termination

Error:Abnormal build process termination:
"/Applications/Android Studio 2.app/Contents/jre/jdk/Contents/Home/bin/java" -Xmx4096 -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/Users/apple/Documents/git_work/calwin -Dpreload.config.path=/Users/apple/Library/Preferences/AndroidStudio3.3/options -Dcompile.parallel=true -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-6398992184108619455 -XX:MaxPerMSize=2048 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -Didea.paths.selector=AndroidStudio3.3 "-Didea.home.path=/Applications/Android Studio 2.app/Contents" -Didea.config.path=/Users/apple/Library/Preferences/AndroidStudio3.3 "-Didea.plugins.path=/Users/apple/Library/Application Support/AndroidStudio3.3" -Djps.log.dir=/Users/apple/Library/Logs/AndroidStudio3.3/build-log "-Djps.fallback.jdk.home=/Applications/Android Studio 2.app/Contents/jre/jdk/Contents/Home" -Djps.fallback.jdk.version=1.8.0_152-release -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/Users/apple/Library/Caches/AndroidStudio3.3/compile-server/calwin_3224c5d3/temp -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilation=true -Dkotlin.incremental.compilation.js=true -Dkotlin.daemon.enabled -Dkotlin.daemon.client.alive.path="/var/folders/z6/_rpnq0z10wnd68nsllyy2xfc0000gn/T/kotlin-idea-4547390362373460551-is-running" -classpath "/Applications/Android Studio 2.app/Contents/lib/jps-launcher.jar:/Applications/Android Studio 2.app/Contents/jre/jdk/Contents/Home/lib/tools.jar:/Applications/Android Studio 2.app/Contents/lib/optimizedFileManager.jar" org.jetbrains.jps.cmdline.Launcher "/Applications/Android Studio 2.app/Contents/lib/resources_en.jar:/Applications/Android Studio 2.app/Contents/lib/jna.jar:/Applications/Android Studio 2.app/Contents/lib/forms_rt.jar:/Applications/Android Studio 2.app/Contents/lib/forms-1.1-preview.jar:/Applications/Android Studio 2.app/Contents/lib/aether-transport-file-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/commons-logging-1.2.jar:/Applications/Android Studio 2.app/Contents/lib/oro-2.0.8.jar:/Applications/Android Studio 2.app/Contents/lib/jdom.jar:/Applications/Android Studio 2.app/Contents/lib/plexus-component-annotations-1.6.jar:/Applications/Android Studio 2.app/Contents/lib/jps-model.jar:/Applications/Android Studio 2.app/Contents/lib/protobuf-java-3.4.0.jar:/Applications/Android Studio 2.app/Contents/lib/aether-util-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/httpcore-4.4.9.jar:/Applications/Android Studio 2.app/Contents/lib/aether-spi-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/netty-codec-4.1.25.Final.jar:/Applications/Android Studio 2.app/Contents/lib/netty-buffer-4.1.25.Final.jar:/Applications/Android Studio 2.app/Contents/lib/plexus-utils-3.0.22.jar:/Applications/Android Studio 2.app/Contents/lib/jna-platform.jar:/Applications/Android Studio 2.app/Contents/lib/platform-api.jar:/Applications/Android Studio 2.app/Contents/lib/commons-codec-1.10.jar:/Applications/Android Studio 2.app/Contents/lib/idea_rt.jar:/Applications/Android Studio 2.app/Contents/lib/trove4j.jar:/Applications/Android Studio 2.app/Contents/lib/jps-builders-6.jar:/Applications/Android Studio 2.app/Contents/lib/maven-aether-provider-3.3.9.jar:/Applications/Android Studio 2.app/Contents/lib/lz4-1.3.0.jar:/Applications/Android Studio 2.app/Contents/lib/aether-connector-basic-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/maven-model-builder-3.3.9.jar:/Applications/Android Studio 2.app/Contents/lib/log4j.jar:/Applications/Android Studio 2.app/Contents/lib/aether-dependency-resolver.jar:/Applications/Android Studio 2.app/Contents/lib/jps-builders.jar:/Applications/Android Studio 2.app/Contents/lib/netty-common-4.1.25.Final.jar:/Applications/Android Studio 2.app/Contents/lib/asm-all.jar:/Applications/Android Studio 2.app/Contents/lib/nanoxml-2.2.3.jar:/Applications/Android Studio 2.app/Contents/lib/util.jar:/Applications/Android Studio 2.app/Contents/lib/javac2.jar:/Applications/Android Studio 2.app/Contents/lib/aether-api-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/maven-repository-metadata-3.3.9.jar:/Applications/Android Studio 2.app/Contents/lib/annotations-java5.jar:/Applications/Android Studio 2.app/Contents/lib/aether-transport-http-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/maven-artifact-3.3.9.jar:/Applications/Android Studio 2.app/Contents/lib/maven-model-3.3.9.jar:/Applications/Android Studio 2.app/Contents/lib/commons-lang3-3.4.jar:/Applications/Android Studio 2.app/Contents/lib/aether-impl-1.1.0.jar:/Applications/Android Studio 2.app/Contents/lib/netty-transport-4.1.25.Final.jar:/Applications/Android Studio 2.app/Contents/lib/httpclient-4.5.5.jar:/Applications/Android Studio 2.app/Contents/lib/guava-23.6-jre.jar:/Applications/Android Studio 2.app/Contents/lib/maven-builder-support-3.3.9.jar:/Applications/Android Studio 2.app/Contents/lib/plexus-interpolation-1.21.jar:/Applications/Android Studio 2.app/Contents/lib/netty-resolver-4.1.25.Final.jar:/Applications/Android Studio 2.app/Contents/lib/slf4j-api-1.7.25.jar:/Applications/Android Studio 2.app/Contents/plugins/gradle/lib/gradle-api-4.8.jar:/Applications/Android Studio 2.app/Contents/plugins/gradle/lib/gradle-api-impldep-4.8.jar:/Applications/Android Studio 2.app/Contents/lib/ant/lib/ant.jar:/Applications/Android Studio 2.app/Contents/lib/groovy-all-2.4.15.jar:/Applications/Android Studio 2.app/Contents/lib/gson-2.8.4.jar:/Applications/Android Studio 2.app/Contents/lib/slf4j-api-1.7.25.jar:/Applications/Android Studio 2.app/Contents/lib/slf4j-log4j12-1.7.25.jar:/Applications/Android Studio 2.app/Contents/lib/gson-2.8.4.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/jarutils.jar:/Applications/Android Studio 2.app/Contents/lib/guava-23.6-jre.jar:/Applications/Android Studio 2.app/Contents/lib/android-base-common.jar:/Applications/Android Studio 2.app/Contents/plugins/gradle/lib/gradle-api-4.8.jar:/Applications/Android Studio 2.app/Contents/lib/gson-2.8.4.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/jarutils.jar:/Applications/Android Studio 2.app/Contents/lib/guava-23.6-jre.jar:/Applications/Android Studio 2.app/Contents/lib/android-base-common.jar:/Applications/Android Studio 2.app/Contents/plugins/gradle/lib/gradle-api-4.8.jar:/Applications/Android Studio 2.app/Contents/plugins/IntelliLang/lib/intellilang-jps-plugin.jar:/Applications/Android Studio 2.app/Contents/plugins/Groovy/lib/groovy-jps-plugin.jar:/Applications/Android Studio 2.app/Contents/plugins/Groovy/lib/groovy-rt-constants.jar:/Applications/Android Studio 2.app/Contents/plugins/gradle/lib/gradle-jps-plugin.jar:/Applications/Android Studio 2.app/Contents/plugins/Kotlin/lib/jps/kotlin-jps-plugin.jar:/Applications/Android Studio 2.app/Contents/plugins/Kotlin/lib/kotlin-stdlib.jar:/Applications/Android Studio 2.app/Contents/plugins/Kotlin/lib/kotlin-reflect.jar:/Applications/Android Studio 2.app/Contents/plugins/Kotlin/lib/kotlin-plugin.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/jps/android-jps-plugin.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/android-common.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/build-common.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/android-rt.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/android-extensions-ide.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/sdk-common.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/repository.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/sdklib.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/jarutils.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/layoutlib-api.jar:/Applications/Android Studio 2.app/Contents/plugins/android/lib/manifest-merger.jar" org.jetbrains.jps.cmdline.BuildMain 127.0.0.1 62989 a5162d63-c196-462b-b68e-6b7c7045fc00 /Users/apple/Library/Caches/AndroidStudio3.3/compile-server
Unrecognized VM option 'MaxPerMSize=2048'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Tons of errors

Like this

java: package android.content does not exist

Am I being stupid? How do I fix this?

not able to use version 2.0.1 because I have to work with resource files name start with '$' sign

after updating java2smali to version 2.0.1 I was not able to do my work. it's giving me Error: '$' is not a valid file-based resource name character: File-based resource names must contain only lowercase a-z, 0-9, or underscore

on version 1.6 I was able to use the plugin by adding

lintOptions {
        abortOnError false
}

to my build.gradle. but on the latest version it does not work and giving me the error for resource names

Compiling error on IntelliJ 2021.1.2

I get this error no building errors, only this one after completion:

java.lang.IllegalStateException: Output directory not found
at org.ollide.java2smali.DexCompiler.getFileOutputDirectory(DexCompiler.kt:119)
at org.ollide.java2smali.DexCompiler.onProjectBuildComplete(DexCompiler.kt:53)
at org.ollide.java2smali.DexCompiler.access$onProjectBuildComplete(DexCompiler.kt:21)
at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:25)
at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:21)
at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:45)
at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:21)
at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:84)
at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:16)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
at org.jetbrains.concurrency.AsyncPromise.setResult(AsyncPromise.kt:149)
at com.intellij.task.impl.ProjectTaskManagerImpl$ResultConsumer.lambda$notify$1(ProjectTaskManagerImpl.java:351)
at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:218)
at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:200)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:319)
at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84)
at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133)
at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:839)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

My code:

/*

  • Copyright (C) 2008 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.android.systemui.statusbar;

import static com.android.systemui.plugins.DarkIconDispatcher.getTint;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Notification;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.graphics.Typeface;
import android.os.Handler;
import android.os.Parcelable;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.Log;
import android.util.Property;
import android.util.TypedValue;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Interpolator;

import androidx.core.graphics.ColorUtils;

import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.NotificationIconDozeHelper;
import com.android.systemui.statusbar.notification.NotificationUtils;

import java.text.NumberFormat;
import java.util.Arrays;
import java.util.ArrayList;

public class StatusBarIconView extends AnimatedImageView implements StatusIconDisplayable {
public static final int NO_COLOR = 0;

/**
 * Multiply alpha values with (1+DARK_ALPHA_BOOST) when dozing. The chosen value boosts
 * everything above 30% to 50%, making it appear on 1bit color depths.
 */
private static final float DARK_ALPHA_BOOST = 0.67f;
/**
 * Status icons are currently drawn with the intention of being 17dp tall, but we
 * want to scale them (in a way that doesn't require an asset dump) down 2dp. So
 * 17dp * (15 / 17) = 15dp, the new height.
 */
private static final float SYSTEM_ICON_SCALE = 15.f / 17.f;
private final int ANIMATION_DURATION_FAST = 100;

public static final int STATE_ICON = 0;
public static final int STATE_DOT = 1;
public static final int STATE_HIDDEN = 2;

private static final String TAG = "StatusBarIconView";
private static final Property<StatusBarIconView, Float> ICON_APPEAR_AMOUNT
        = new FloatProperty<StatusBarIconView>("iconAppearAmount") {

    @Override
    public void setValue(StatusBarIconView object, float value) {
        object.setIconAppearAmount(value);
    }

    @Override
    public Float get(StatusBarIconView object) {
        return object.getIconAppearAmount();
    }
};
private static final Property<StatusBarIconView, Float> DOT_APPEAR_AMOUNT
        = new FloatProperty<StatusBarIconView>("dot_appear_amount") {

    @Override
    public void setValue(StatusBarIconView object, float value) {
        object.setDotAppearAmount(value);
    }

    @Override
    public Float get(StatusBarIconView object) {
        return object.getDotAppearAmount();
    }
};

private boolean mAlwaysScaleIcon;
private static boolean mIsSystemUI;
private int mStatusBarIconDrawingSizeIncreased = 1;
private int mStatusBarIconDrawingSize = 1;
private int mStatusBarIconSize = 1;
private StatusBarIcon mIcon;
@ViewDebug.ExportedProperty private String mSlot;
private Drawable mNumberBackground;
private Paint mNumberPain;
private int mNumberX;
private int mNumberY;
private String mNumberText;
private StatusBarNotification mNotification;
private final boolean mBlocked;
private int mDensity;
private boolean mNightMode;
private float mIconScale = 1.0f;
private final Paint mDotPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float mDotRadius;
private int mStaticDotRadius;
private int mVisibleState = STATE_ICON;
private float mIconAppearAmount = 1.0f;
private ObjectAnimator mIconAppearAnimator;
private ObjectAnimator mDotAnimator;
private float mDotAppearAmount;
private OnVisibilityChangedListener mOnVisibilityChangedListener;
private int mDrawableColor;
private int mIconColor;
private int mDecorColor;
private float mDozeAmount;
private ValueAnimator mColorAnimator;
private int mCurrentSetColor = NO_COLOR;
private int mAnimationStartColor = NO_COLOR;
private boolean mShowNotificationCount;
private GlobalSettingsObserver mObserver;
private final ValueAnimator.AnimatorUpdateListener mColorUpdater
        = animation -> {
    int newColor = NotificationUtils.interpolateColors(mAnimationStartColor, mIconColor,
            animation.getAnimatedFraction());
    setColorInternal(newColor);
};
private final NotificationIconDozeHelper mDozer;
private int mContrastedDrawableColor;
private int mCachedContrastBackgroundColor = NO_COLOR;
private float[] mMatrix;
private ColorMatrixColorFilter mMatrixColorFilter;
private boolean mIsInShelf;
private Runnable mLayoutRunnable;
private boolean mDismissed;
private Runnable mOnDismissListener;
private boolean mIncreasedSize;

public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) {
    this(context, slot, sbn, false);
}

public StatusBarIconView(Context context, String slot, StatusBarNotification sbn,
                         boolean blocked) {
    super(context);
    mDozer = new NotificationIconDozeHelper(context);
    mBlocked = blocked;
    final float densityMultiplier = context.getResources().getDisplayMetrics().density;
    final float scaledPx = 8 * densityMultiplier;
    mSlot = slot;
    mNumberPain = new Paint();
    mNumberPain.setTextAlign(Paint.Align.CENTER);
    mNumberPain.setColor(context.getColor(R.drawable.notification_number_text_color));
    mNumberPain.setAntiAlias(true);
    mNumberPain.setTypeface(Typeface.DEFAULT_BOLD);
    mNumberPain.setTextSize(scaledPx);
    setNotification(sbn);
    setScaleType(ScaleType.CENTER);
    mDensity = context.getResources().getDisplayMetrics().densityDpi;
    Configuration configuration = context.getResources().getConfiguration();
    mNightMode = (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK)
            == Configuration.UI_MODE_NIGHT_YES;
    initializeDecorColor();
    reloadDimens();
    maybeUpdateIconScaleDimens();

    mObserver = GlobalSettingsObserver.getInstance(context);
}

/** Should always be preceded by {@link #reloadDimens()} */
private void maybeUpdateIconScaleDimens() {
    // We do not resize and scale system icons (on the right), only notification icons (on the
    // left).
    if (mNotification != null || mAlwaysScaleIcon) {
        updateIconScaleForNotifications();
    } else {
        updateIconScaleForSystemIcons();
    }
}

private void updateIconScaleForNotifications() {
    final float imageBounds = mIncreasedSize ?
            mStatusBarIconDrawingSizeIncreased : mStatusBarIconDrawingSize;
    final int outerBounds = mStatusBarIconSize;
    mIconScale = imageBounds / (float)outerBounds;
    updatePivot();
}

private void updateIconScaleForSystemIcons() {
    mIconScale = SYSTEM_ICON_SCALE;
}

public float getIconScaleIncreased() {
    return (float) mStatusBarIconDrawingSizeIncreased / mStatusBarIconDrawingSize;
}

public float getIconScale() {
    return mIconScale;
}

@Override
protected void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int density = newConfig.densityDpi;
    if (density != mDensity) {
        mDensity = density;
        reloadDimens();
        maybeUpdateIconScaleDimens();
        updateDrawable();
    }
    boolean nightMode = (newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK)
            == Configuration.UI_MODE_NIGHT_YES;
    if (nightMode != mNightMode) {
        mNightMode = nightMode;
        initializeDecorColor();
    }
}

private void reloadDimens() {
    boolean applyRadius = mDotRadius == mStaticDotRadius;
    Resources res = getResources();
    mStaticDotRadius = res.getDimensionPixelSize(R.dimen.overflow_dot_radius);
    mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
    mStatusBarIconDrawingSizeIncreased =
            res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size_dark);
    mStatusBarIconDrawingSize =
            res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size);
    if (applyRadius) {
        mDotRadius = mStaticDotRadius;
    }
}

public void setNotification(StatusBarNotification notification) {
    mNotification = notification;
    mShowNotificationCount = Settings.System.getIntForUser(mContext.getContentResolver(),
            Settings.System.STATUS_BAR_NOTIF_COUNT, 0, UserHandle.USER_CURRENT) == 1;
    if (notification != null) {
        setContentDescription(notification.getNotification());
    }
}

public StatusBarIconView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mDozer = new NotificationIconDozeHelper(context);
    mBlocked = false;
    mAlwaysScaleIcon = true;
    reloadDimens();
    updateIconScaleForNotifications();
    mDensity = context.getResources().getDisplayMetrics().densityDpi;
}

private static boolean streq(String a, String b) {
    if (a == b) {
        return true;
    }
    if (a == null && b != null) {
        return false;
    }
    if (a != null && b == null) {
        return false;
    }
    return a.equals(b);
}

public boolean equalIcons(Icon a, Icon b) {
    if (a == b) return true;
    if (a.getType() != b.getType()) return false;
    switch (a.getType()) {
        case Icon.TYPE_RESOURCE:
            return a.getResPackage().equals(b.getResPackage()) && a.getResId() == b.getResId();
        case Icon.TYPE_URI:
            return a.getUriString().equals(b.getUriString());
        default:
            return false;
    }
}
/**
 * Returns whether the set succeeded.
 */
public boolean set(StatusBarIcon icon) {
    return set(icon, false);
}

private boolean set(StatusBarIcon icon, boolean force) {
    final boolean iconEquals = mIcon != null && equalIcons(mIcon.icon, icon.icon);
    final boolean levelEquals = iconEquals
            && mIcon.iconLevel == icon.iconLevel;
    final boolean visibilityEquals = mIcon != null
            && mIcon.visible == icon.visible;
    final boolean numberEquals = mIcon != null
            && mIcon.number == icon.number;
    if (icon == null) {
        return false;
    }
    mIcon = icon.clone();
    setContentDescription(icon.contentDescription);
    if (!iconEquals || force) {
        if (!updateDrawable(false /* no clear */)) return false;
        // we have to clear the grayscale tag since it may have changed
        setTag(R.id.icon_is_grayscale, null);
    }
    if (!levelEquals || force) {
        setImageLevel(icon.iconLevel);
    }

    if (!numberEquals || force) {
        if (icon.number > 1 && mShowNotificationCount) {
            if (mNumberBackground == null) {
                mNumberBackground = getContext().getResources().getDrawable(
                        R.drawable.ic_notification_overlay);
            }
            placeNumber();
        } else {
            mNumberBackground = null;
            mNumberText = null;
        }
        invalidate();
    }
    if (!visibilityEquals || force) {
        setVisibility(icon.visible && !mBlocked ? VISIBLE : GONE);
    }
    return true;
}

public void updateDrawable() {
    updateDrawable(true /* with clear */);
}

private boolean updateDrawable(boolean withClear) {
    if (mIcon == null) {
        return false;
    }
    Drawable drawable;
    try {
        drawable = getIcon(mIcon);
    } catch (OutOfMemoryError e) {
        Log.w(TAG, "OOM while inflating " + mIcon.icon + " for slot " + mSlot);
        return false;
    }

    if (drawable == null) {
        Log.w(TAG, "No icon for slot " + mSlot + "; " + mIcon.icon);
        return false;
    }
    if (withClear) {
        setImageDrawable(null);
    }
    setImageDrawable(drawable);
    return true;
}

public Icon getSourceIcon() {
    return mIcon.icon;
}

private Drawable getIcon(StatusBarIcon icon) {
    Context notifContext = mNotification != null ?
            mNotification.getPackageContext(getContext()) : getContext();
    return getIcon(getContext(), notifContext, icon);
}

/**
 * Returns the right icon to use for this item
 *
 * @param sysuiContext Context to use to get scale factor
 * @param context Context to use to get resources of notification icon
 * @return Drawable for this item, or null if the package or item could not
 *         be found
 */
public static Drawable getIcon(Context sysuiContext,
                               Context context, StatusBarIcon statusBarIcon) {
    int userId = statusBarIcon.user.getIdentifier();
    if (userId == UserHandle.USER_ALL) {
        userId = UserHandle.USER_SYSTEM;
    }

    Drawable icon;
    String pkgName = statusBarIcon.pkg;
    mIsSystemUI = pkgName.contains("systemui");
    try {
        icon = mIsSystemUI ? statusBarIcon.icon.loadDrawableAsUser(context, userId)
                : context.getPackageManager().getApplicationIcon(pkgName);
    } catch (android.content.pm.PackageManager.NameNotFoundException e) {
        icon = statusBarIcon.icon.loadDrawableAsUser(context, userId);
    }

    TypedValue typedValue = new TypedValue();
    sysuiContext.getResources().getValue(R.dimen.status_bar_icon_scale_factor,
            typedValue, true);
    float scaleFactor = typedValue.getFloat();

    // No need to scale the icon, so return it as is.
    if (scaleFactor == 1.f) {
        return icon;
    }

    return new ScalingDrawableWrapper(icon, scaleFactor);
}

public StatusBarIcon getStatusBarIcon() {
    return mIcon;
}

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(event);
    if (mNotification != null) {
        event.setParcelableData(mNotification.getNotification());
    }
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (mNumberBackground != null) {
        placeNumber();
    }
}

@Override
public void onRtlPropertiesChanged(int layoutDirection) {
    super.onRtlPropertiesChanged(layoutDirection);
    updateDrawable();
}

@Override
protected void onDraw(Canvas canvas) {
    if (mIconAppearAmount > 0.0f) {
        canvas.save();
        canvas.scale(mIconScale * mIconAppearAmount, mIconScale * mIconAppearAmount,
                getWidth() / 2, getHeight() / 2);
        super.onDraw(canvas);
        canvas.restore();
    }

    if (mNumberBackground != null) {
        mNumberBackground.draw(canvas);
        canvas.drawText(mNumberText, mNumberX, mNumberY, mNumberPain);
    }
    if (mDotAppearAmount != 0.0f) {
        float radius;
        float alpha = Color.alpha(mDecorColor) / 255.f;
        if (mDotAppearAmount <= 1.0f) {
            radius = mDotRadius * mDotAppearAmount;
        } else {
            float fadeOutAmount = mDotAppearAmount - 1.0f;
            alpha = alpha * (1.0f - fadeOutAmount);
            radius = NotificationUtils.interpolate(mDotRadius, getWidth() / 4, fadeOutAmount);
        }
        mDotPaint.setAlpha((int) (alpha * 255));
        canvas.drawCircle(mStatusBarIconSize / 2, getHeight() / 2, radius, mDotPaint);
    }
}

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();

    if (mObserver != null) {
        mObserver.attach(this);
    }
}

@Override
public void onDetachedFromWindow() {
    super.onDetachedFromWindow();

    if (mObserver != null) {
        mObserver.detach(this);
    }
}

@Override
protected void debug(int depth) {
    super.debug(depth);
    Log.d("View", debugIndent(depth) + "slot=" + mSlot);
    Log.d("View", debugIndent(depth) + "icon=" + mIcon);
}

void placeNumber() {
    final String str;
    final int tooBig = getContext().getResources().getInteger(
            android.R.integer.status_bar_notification_info_maxnum);
    if (mIcon.number > tooBig) {
        str = getContext().getResources().getString(
                R.string.status_bar_notification_info_overflow);
    } else {
        NumberFormat f = NumberFormat.getIntegerInstance();
        str = f.format(mIcon.number);
    }
    mNumberText = str;

    final int w = getWidth();
    final int h = getHeight();
    final Rect r = new Rect();
    mNumberPain.getTextBounds(str, 0, str.length(), r);
    final int tw = r.right - r.left;
    final int th = r.bottom - r.top;
    mNumberBackground.getPadding(r);
    int dw = r.left + tw + r.right;
    if (dw < mNumberBackground.getMinimumWidth()) {
        dw = mNumberBackground.getMinimumWidth();
    }
    mNumberX = w-r.right-((dw-r.right-r.left)/2);
    int dh = r.top + th + r.bottom;
    if (dh < mNumberBackground.getMinimumWidth()) {
        dh = mNumberBackground.getMinimumWidth();
    }
    mNumberY = h-r.bottom-((dh-r.top-th-r.bottom)/2);
    mNumberBackground.setBounds(w-dw, h-dh, w, h);
}

private void setContentDescription(Notification notification) {
    if (notification != null) {
        String d = contentDescForNotification(mContext, notification);
        if (!TextUtils.isEmpty(d)) {
            setContentDescription(d);
        }
    }
}

public String toString() {
    return "StatusBarIconView(slot=" + mSlot + " icon=" + mIcon
            + " notification=" + mNotification + ")";
}

public StatusBarNotification getNotification() {
    return mNotification;
}

public String getSlot() {
    return mSlot;
}


public static String contentDescForNotification(Context c, Notification n) {
    String appName = "";
    try {
        Notification.Builder builder = Notification.Builder.recoverBuilder(c, n);
        appName = builder.loadHeaderAppName();
    } catch (RuntimeException e) {
        Log.e(TAG, "Unable to recover builder", e);
        // Trying to get the app name from the app info instead.
        Parcelable appInfo = n.extras.getParcelable(
                Notification.EXTRA_BUILDER_APPLICATION_INFO);
        if (appInfo instanceof ApplicationInfo) {
            appName = String.valueOf(((ApplicationInfo) appInfo).loadLabel(
                    c.getPackageManager()));
        }
    }

    CharSequence title = n.extras.getCharSequence(Notification.EXTRA_TITLE);
    CharSequence text = n.extras.getCharSequence(Notification.EXTRA_TEXT);
    CharSequence ticker = n.tickerText;

    // Some apps just put the app name into the title
    CharSequence titleOrText = TextUtils.equals(title, appName) ? text : title;

    CharSequence desc = !TextUtils.isEmpty(titleOrText) ? titleOrText
            : !TextUtils.isEmpty(ticker) ? ticker : "";

    return c.getString(R.string.accessibility_desc_notification_icon, appName, desc);
}


/**
 * Set the color that is used to draw decoration like the overflow dot. This will not be applied
 * to the drawable.
 */
public void setDecorColor(int iconTint) {
    mDecorColor = iconTint;
    updateDecorColor();
}

private void initializeDecorColor() {
    if (mNotification != null) {
        if (mNotification.getPackageName().contains("systemui")) {
            setDecorColor(getContext().getColor(mNightMode
                    ? com.android.internal.R.color.notification_default_color_dark
                    : com.android.internal.R.color.notification_default_color_light));
        }
    }
}

private void updateDecorColor() {
    int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDozeAmount);
    if (mDotPaint.getColor() != color) {
        mDotPaint.setColor(color);

        if (mDotAppearAmount != 0) {
            invalidate();
        }
    }
}

/**
 * Set the static color that should be used for the drawable of this icon if it's not
 * transitioning this also immediately sets the color.
 */
public void setStaticDrawableColor(int color) {
    if (mNotification == null) return;
    if (mNotification.getPackageName().contains("systemui")) { //if (mIsSystemUI) {
        mDrawableColor = color;
        setColorInternal(color);
        updateContrastedStaticColor();
        mIconColor = color;
        mDozer.setColor(color);
    }
}

private void setColorInternal(int color) {
    if (mNotification == null) return;
    if (mNotification.getPackageName().contains("systemui")) { //if (mIsSystemUI) {
        mCurrentSetColor = color;
        updateIconColor();
    }
}

private void updateIconColor() {
    if (mNotification == null) return;
    if (mNotification.getPackageName().contains("systemui")) { //if (mIsSystemUI) {
        if (mCurrentSetColor != NO_COLOR) {
            if (mMatrixColorFilter == null) {
                mMatrix = new float[4 * 5];
                mMatrixColorFilter = new ColorMatrixColorFilter(mMatrix);
            }
            int color = NotificationUtils.interpolateColors(
                    mCurrentSetColor, Color.WHITE, mDozeAmount);
            updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDozeAmount);
            mMatrixColorFilter.setColorMatrixArray(mMatrix);
            setColorFilter(null);  // setColorFilter only invalidates if the instance changed.
            setColorFilter(mMatrixColorFilter);
        } else {
            mDozer.updateGrayscale(this, mDozeAmount);
        }
    }
}

/**
 * Updates {@param array} such that it represents a matrix that changes RGB to {@param color}
 * and multiplies the alpha channel with the color's alpha+{@param alphaBoost}.
 */
private static void updateTintMatrix(float[] array, int color, float alphaBoost) {
    Arrays.fill(array, 0);
    array[4] = Color.red(color);
    array[9] = Color.green(color);
    array[14] = Color.blue(color);
    array[18] = Color.alpha(color) / 255f + alphaBoost;
}

public void setIconColor(int iconColor, boolean animate) {
    if (mNotification == null) return;
    if (mNotification.getPackageName().contains("systemui")) { //if (mIsSystemUI) {
        if (mIconColor != iconColor) {
            mIconColor = iconColor;
            if (mColorAnimator != null) {
                mColorAnimator.cancel();
            }
            if (mCurrentSetColor == iconColor) {
                return;
            }
            if (animate && mCurrentSetColor != NO_COLOR) {
                mAnimationStartColor = mCurrentSetColor;
                mColorAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
                mColorAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
                mColorAnimator.setDuration(ANIMATION_DURATION_FAST);
                mColorAnimator.addUpdateListener(mColorUpdater);
                mColorAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mColorAnimator = null;
                        mAnimationStartColor = NO_COLOR;
                    }
                });
                mColorAnimator.start();
            } else {
                setColorInternal(iconColor);
            }
        }
    }
}

public int getStaticDrawableColor() {
    if (mNotification == null) return mDrawableColor;
    return mNotification.getPackageName().contains("systemui") /*mIsSystemUI*/ ? mDrawableColor : 0;
}

/**
 * A drawable color that passes GAR on a specific background.
 * This value is cached.
 *
 * @param backgroundColor Background to test against.
 * @return GAR safe version of {@link StatusBarIconView#getStaticDrawableColor()}.
 */
int getContrastedStaticDrawableColor(int backgroundColor) {
    if (mCachedContrastBackgroundColor != backgroundColor) {
        mCachedContrastBackgroundColor = backgroundColor;
        updateContrastedStaticColor();
    }
    return mContrastedDrawableColor;
}

private void updateContrastedStaticColor() {
    if (mNotification == null) return;
    if (mNotification.getPackageName().contains("systemui")) { //if (mIsSystemUI) {
        if (Color.alpha(mCachedContrastBackgroundColor) != 255) {
            mContrastedDrawableColor = mDrawableColor;
            return;
        }
        // We'll modify the color if it doesn't pass GAR
        int contrastedColor = mDrawableColor;
        if (!ContrastColorUtil.satisfiesTextContrast(mCachedContrastBackgroundColor,
                contrastedColor)) {
            float[] hsl = new float[3];
            ColorUtils.colorToHSL(mDrawableColor, hsl);
            // This is basically a light grey, pushing the color will only distort it.
            // Best thing to do in here is to fallback to the default color.
            if (hsl[1] < 0.2f) {
                contrastedColor = Notification.COLOR_DEFAULT;
            }
            boolean isDark = !ContrastColorUtil.isColorLight(mCachedContrastBackgroundColor);
            contrastedColor = ContrastColorUtil.resolveContrastColor(mContext,
                    contrastedColor, mCachedContrastBackgroundColor, isDark);
        }
        mContrastedDrawableColor = contrastedColor;
    }
}

@Override
public void setVisibleState(int state) {
    setVisibleState(state, true /* animate */, null /* endRunnable */);
}

public void setVisibleState(int state, boolean animate) {
    setVisibleState(state, animate, null);
}

@Override
public boolean hasOverlappingRendering() {
    return false;
}

public void setVisibleState(int visibleState, boolean animate, Runnable endRunnable) {
    setVisibleState(visibleState, animate, endRunnable, 0);
}

/**
 * Set the visibleState of this view.
 *
 * @param visibleState The new state.
 * @param animate Should we animate?
 * @param endRunnable The runnable to run at the end.
 * @param duration The duration of an animation or 0 if the default should be taken.
 */
public void setVisibleState(int visibleState, boolean animate, Runnable endRunnable,
                            long duration) {
    boolean runnableAdded = false;
    if (visibleState != mVisibleState) {
        mVisibleState = visibleState;
        if (mIconAppearAnimator != null) {
            mIconAppearAnimator.cancel();
        }
        if (mDotAnimator != null) {
            mDotAnimator.cancel();
        }
        if (animate) {
            float targetAmount = 0.0f;
            Interpolator interpolator = Interpolators.FAST_OUT_LINEAR_IN;
            if (visibleState == STATE_ICON) {
                targetAmount = 1.0f;
                interpolator = Interpolators.LINEAR_OUT_SLOW_IN;
            }
            float currentAmount = getIconAppearAmount();
            if (targetAmount != currentAmount) {
                mIconAppearAnimator = ObjectAnimator.ofFloat(this, ICON_APPEAR_AMOUNT,
                        currentAmount, targetAmount);
                mIconAppearAnimator.setInterpolator(interpolator);
                mIconAppearAnimator.setDuration(duration == 0 ? ANIMATION_DURATION_FAST
                        : duration);
                mIconAppearAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mIconAppearAnimator = null;
                        runRunnable(endRunnable);
                    }
                });
                mIconAppearAnimator.start();
                runnableAdded = true;
            }

            targetAmount = visibleState == STATE_ICON ? 2.0f : 0.0f;
            interpolator = Interpolators.FAST_OUT_LINEAR_IN;
            if (visibleState == STATE_DOT) {
                targetAmount = 1.0f;
                interpolator = Interpolators.LINEAR_OUT_SLOW_IN;
            }
            currentAmount = getDotAppearAmount();
            if (targetAmount != currentAmount) {
                mDotAnimator = ObjectAnimator.ofFloat(this, DOT_APPEAR_AMOUNT,
                        currentAmount, targetAmount);
                mDotAnimator.setInterpolator(interpolator);;
                mDotAnimator.setDuration(duration == 0 ? ANIMATION_DURATION_FAST
                        : duration);
                final boolean runRunnable = !runnableAdded;
                mDotAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mDotAnimator = null;
                        if (runRunnable) {
                            runRunnable(endRunnable);
                        }
                    }
                });
                mDotAnimator.start();
                runnableAdded = true;
            }
        } else {
            setIconAppearAmount(visibleState == STATE_ICON ? 1.0f : 0.0f);
            setDotAppearAmount(visibleState == STATE_DOT ? 1.0f
                    : visibleState == STATE_ICON ? 2.0f
                    : 0.0f);
        }
    }
    if (!runnableAdded) {
        runRunnable(endRunnable);
    }
}

private void runRunnable(Runnable runnable) {
    if (runnable != null) {
        runnable.run();
    }
}

public void setIconAppearAmount(float iconAppearAmount) {
    if (mIconAppearAmount != iconAppearAmount) {
        mIconAppearAmount = iconAppearAmount;
        invalidate();
    }
}

public float getIconAppearAmount() {
    return mIconAppearAmount;
}

public int getVisibleState() {
    return mVisibleState;
}

public void setDotAppearAmount(float dotAppearAmount) {
    if (mDotAppearAmount != dotAppearAmount) {
        mDotAppearAmount = dotAppearAmount;
        invalidate();
    }
}

@Override
public void setVisibility(int visibility) {
    super.setVisibility(visibility);
    if (mOnVisibilityChangedListener != null) {
        mOnVisibilityChangedListener.onVisibilityChanged(visibility);
    }
}

public float getDotAppearAmount() {
    return mDotAppearAmount;
}

public void setOnVisibilityChangedListener(OnVisibilityChangedListener listener) {
    mOnVisibilityChangedListener = listener;
}

public void setDozing(boolean dozing, boolean fade, long delay) {
    mDozer.setDozing(f -> {
        mDozeAmount = f;
        updateDecorColor();
        updateIconColor();
        updateAllowAnimation();
    }, dozing, fade, delay, this);
}

private void updateAllowAnimation() {
    if (mDozeAmount == 0 || mDozeAmount == 1) {
        setAllowAnimation(mDozeAmount == 0);
    }
}

/**
 * This method returns the drawing rect for the view which is different from the regular
 * drawing rect, since we layout all children at position 0 and usually the translation is
 * neglected. The standard implementation doesn't account for translation.
 *
 * @param outRect The (scrolled) drawing bounds of the view.
 */
@Override
public void getDrawingRect(Rect outRect) {
    super.getDrawingRect(outRect);
    float translationX = getTranslationX();
    float translationY = getTranslationY();
    outRect.left += translationX;
    outRect.right += translationX;
    outRect.top += translationY;
    outRect.bottom += translationY;
}

public void setIsInShelf(boolean isInShelf) {
    mIsInShelf = isInShelf;
}

public boolean isInShelf() {
    return mIsInShelf;
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    if (mLayoutRunnable != null) {
        mLayoutRunnable.run();
        mLayoutRunnable = null;
    }
    updatePivot();
}

private void updatePivot() {
    setPivotX((1 - mIconScale) / 2.0f * getWidth());
    setPivotY((getHeight() - mIconScale * getWidth()) / 2.0f);
}

public void executeOnLayout(Runnable runnable) {
    mLayoutRunnable = runnable;
}

public void setDismissed() {
    mDismissed = true;
    if (mOnDismissListener != null) {
        mOnDismissListener.run();
    }
}

public boolean isDismissed() {
    return mDismissed;
}

public void setOnDismissListener(Runnable onDismissListener) {
    mOnDismissListener = onDismissListener;
}

@Override
public void onDarkChanged(Rect area, float darkIntensity, int tint) {
    int areaTint = getTint(area, this, tint);
    ColorStateList color = ColorStateList.valueOf(areaTint);
    setImageTintList(color);
    setDecorColor(areaTint);
}

@Override
public boolean isIconVisible() {
    return mIcon != null && mIcon.visible;
}

@Override
public boolean isIconBlocked() {
    return mBlocked;
}

public void setIncreasedSize(boolean increasedSize) {
    mIncreasedSize = increasedSize;
    maybeUpdateIconScaleDimens();
}

public interface OnVisibilityChangedListener {
    void onVisibilityChanged(int newVisibility);
}

static class GlobalSettingsObserver extends ContentObserver {
    private static GlobalSettingsObserver sInstance;
    private ArrayList<StatusBarIconView> mIconViews = new ArrayList<StatusBarIconView>();
    private Context mContext;

    GlobalSettingsObserver(Handler handler, Context context) {
        super(handler);
        mContext = context.getApplicationContext();
    }

    static GlobalSettingsObserver getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new GlobalSettingsObserver(new Handler(), context);
        }
        return sInstance;
    }

    void attach(StatusBarIconView sbiv) {
        if (mIconViews.isEmpty()) {
            observe();
        }
        mIconViews.add(sbiv);
    }

    void detach(StatusBarIconView sbiv) {
        mIconViews.remove(sbiv);
        if (mIconViews.isEmpty()) {
            unobserve();
        }
    }

    void observe() {
        mContext.getContentResolver().registerContentObserver(
                Settings.System.getUriFor(Settings.System.STATUS_BAR_NOTIF_COUNT),
                false, this);
    }

    void unobserve() {
        mContext.getContentResolver().unregisterContentObserver(this);
    }

    @Override
    public void onChange(boolean selfChange) {
        boolean showIconCount = Settings.System.getIntForUser(mContext.getContentResolver(),
                Settings.System.STATUS_BAR_NOTIF_COUNT, 0, UserHandle.USER_CURRENT) == 1;
        for (StatusBarIconView sbiv : mIconViews) {
            sbiv.mShowNotificationCount = showIconCount;
            sbiv.set(sbiv.mIcon, true);
        }
    }
}

}

I tried with the latest plugin version available on the market and also the 2.1 snapshot i found somewhere here on github. Also, I have already set an output folder on the project settings.

Strange bug when I trying to compile to Smali

Intelij IDEA:

org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: NetworkServerManager.dex does not exist
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:83)
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:61)
	at org.ollide.java2smali.Dex2SmaliHelper.disassembleDexFile(Dex2SmaliHelper.kt:24)
	at org.ollide.java2smali.DexCompiler$onProjectBuildComplete$1.run(DexCompiler.kt:67)
	at com.intellij.openapi.command.WriteCommandAction.lambda$runWriteCommandAction$5(WriteCommandAction.java:353)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl$1.run(WriteCommandAction.java:107)
	at com.intellij.openapi.application.RunResult.run(RunResult.java:35)
	at com.intellij.openapi.command.WriteCommandAction.lambda$null$1(WriteCommandAction.java:248)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:976)
	at com.intellij.openapi.command.WriteCommandAction.lambda$performWriteCommandAction$2(WriteCommandAction.java:247)
	at com.intellij.openapi.command.WriteCommandAction.lambda$doExecuteCommand$4(WriteCommandAction.java:305)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:220)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:188)
	at com.intellij.openapi.command.WriteCommandAction.doExecuteCommand(WriteCommandAction.java:307)
	at com.intellij.openapi.command.WriteCommandAction.performWriteCommandAction(WriteCommandAction.java:246)
	at com.intellij.openapi.command.WriteCommandAction.execute(WriteCommandAction.java:227)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:109)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:353)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:345)
	at org.ollide.java2smali.DexCompiler.onProjectBuildComplete(DexCompiler.kt:66)
	at org.ollide.java2smali.DexCompiler.access$onProjectBuildComplete(DexCompiler.kt:22)
	at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:26)
	at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:22)
	at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:46)
	at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:22)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:82)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:14)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at org.jetbrains.concurrency.AsyncPromise.setResult(AsyncPromise.kt:147)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ResultConsumer.lambda$notify$1(ProjectTaskManagerImpl.java:353)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:201)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:310)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:80)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:128)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:184)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:847)
	at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Android Studio:

org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: NetworkServerManager.dex does not exist
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:83)
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:61)
	at org.ollide.java2smali.Dex2SmaliHelper.disassembleDexFile(Dex2SmaliHelper.kt:24)
	at org.ollide.java2smali.DexCompiler$onProjectBuildComplete$1.run(DexCompiler.kt:67)
	at com.intellij.openapi.command.WriteCommandAction.lambda$runWriteCommandAction$5(WriteCommandAction.java:368)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl$1.run(WriteCommandAction.java:125)
	at com.intellij.openapi.application.RunResult.run(RunResult.java:35)
	at com.intellij.openapi.command.WriteCommandAction.lambda$null$1(WriteCommandAction.java:264)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:994)
	at com.intellij.openapi.command.WriteCommandAction.lambda$performWriteCommandAction$2(WriteCommandAction.java:263)
	at com.intellij.openapi.command.WriteCommandAction.lambda$doExecuteCommand$4(WriteCommandAction.java:320)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:220)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:188)
	at com.intellij.openapi.command.WriteCommandAction.doExecuteCommand(WriteCommandAction.java:322)
	at com.intellij.openapi.command.WriteCommandAction.performWriteCommandAction(WriteCommandAction.java:263)
	at com.intellij.openapi.command.WriteCommandAction.execute(WriteCommandAction.java:245)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:127)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:368)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:360)
	at org.ollide.java2smali.DexCompiler.onProjectBuildComplete(DexCompiler.kt:66)
	at org.ollide.java2smali.DexCompiler.access$onProjectBuildComplete(DexCompiler.kt:22)
	at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:26)
	at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:22)
	at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:46)
	at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:22)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:58)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:13)
	at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760)
	at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736)
	at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
	at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962)
	at org.jetbrains.concurrency.AsyncPromise.setResult(AsyncPromise.kt:130)
	at org.ollide.java2smali.SupportProjectTaskManager$Notification.finished(SupportProjectTaskManager.kt:35)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ListenerNotificator.lambda$notify$1(ProjectTaskManagerImpl.java:325)
	at com.intellij.ui.GuiUtils.invokeLaterIfNeeded(GuiUtils.java:323)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ListenerNotificator.notify(ProjectTaskManagerImpl.java:320)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ListenerNotificator.finished(ProjectTaskManagerImpl.java:315)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ProjectTaskResultsAggregator.add(ProjectTaskManagerImpl.java:390)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ProjectTaskRunnerNotification.finished(ProjectTaskManagerImpl.java:360)
	at com.intellij.task.impl.JpsProjectTaskRunner.lambda$run$0(JpsProjectTaskRunner.java:74)
	at com.intellij.compiler.CompilerManagerImpl$ListenerNotificator.finished(CompilerManagerImpl.java:533)
	at com.intellij.compiler.impl.CompileDriver.make(CompileDriver.java:96)
	at com.intellij.compiler.impl.CompileDriver.make(CompileDriver.java:88)
	at com.intellij.compiler.CompilerManagerImpl.make(CompilerManagerImpl.java:252)
	at com.intellij.task.impl.JpsProjectTaskRunner.runModulesBuildTasks(JpsProjectTaskRunner.java:129)
	at com.intellij.task.impl.JpsProjectTaskRunner.lambda$run$1(JpsProjectTaskRunner.java:82)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:312)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:433)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:416)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:399)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
	at java.awt.EventQueue.access$500(EventQueue.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:715)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:878)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:827)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:466)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:704)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:465)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Compile to smali does nothing

I just want to compile my java source to smali but it does nothing. It just say "All files are up-to-date". I tested 1.6 and 1.7 SNAPSHOT

compile error in 2021.3.3 community edition

java.lang.Throwable: Write-unsafe context! Model changes are allowed from write-safe contexts only. Please ensure you're using invokeLater/invokeAndWait with a correct modality state (not "any"). See TransactionGuard documentation for details.
current modality=ModalityState.NON_MODAL
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:182)
at com.intellij.openapi.application.TransactionGuardImpl.assertWriteActionAllowed(TransactionGuardImpl.java:140)
at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.queueSessionSync(RefreshQueueImpl.java:66)
at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.execute(RefreshQueueImpl.java:52)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.launch(RefreshSessionImpl.java:115)
at com.intellij.openapi.vfs.newvfs.RefreshQueue.refresh(RefreshQueue.java:42)
at com.intellij.openapi.vfs.newvfs.RefreshQueue.refresh(RefreshQueue.java:28)
at com.intellij.openapi.vfs.newvfs.NewVirtualFile.refresh(NewVirtualFile.java:62)
at com.intellij.openapi.vfs.VirtualFile.refresh(VirtualFile.java:673)
at org.ollide.java2smali.CompilerCallback$finished$1.run(CompilerCallback.kt:59)
at com.intellij.openapi.command.WriteCommandAction.lambda$runWriteCommandAction$4(WriteCommandAction.java:361)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$1(WriteCommandAction.java:150)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:947)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$2(WriteCommandAction.java:148)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:219)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:184)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.doRunWriteCommandAction(WriteCommandAction.java:157)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:124)
at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:361)
at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:349)
at org.ollide.java2smali.CompilerCallback.finished(CompilerCallback.kt:53)
at com.intellij.compiler.CompilerManagerImpl$ListenerNotificator.finished(CompilerManagerImpl.java:578)
at com.intellij.compiler.impl.CompileDriver.lambda$notifyCompilationCompleted$5(CompileDriver.java:580)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:891)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:760)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:447)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:818)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:446)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:498)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Compile to smali fails on IntelliJ 2021.1

There seems to be some issue related to IntelliJ 2021.1 and the java2smali plugin:

org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: Tracer.dex does not exist
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:83)
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:61)
	at org.ollide.java2smali.Dex2SmaliHelper.disassembleDexFile(Dex2SmaliHelper.kt:24)
	at org.ollide.java2smali.DexCompiler$onProjectBuildComplete$1.run(DexCompiler.kt:67)
	at com.intellij.openapi.command.WriteCommandAction.lambda$runWriteCommandAction$4(WriteCommandAction.java:347)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$1(WriteCommandAction.java:143)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:959)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$2(WriteCommandAction.java:141)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:216)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:182)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.doRunWriteCommandAction(WriteCommandAction.java:150)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:117)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:347)
	at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:335)
	at org.ollide.java2smali.DexCompiler.onProjectBuildComplete(DexCompiler.kt:66)
	at org.ollide.java2smali.DexCompiler.access$onProjectBuildComplete(DexCompiler.kt:22)
	at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:26)
	at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:22)
	at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:46)
	at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:22)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:84)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:16)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at org.jetbrains.concurrency.AsyncPromise.setResult(AsyncPromise.kt:149)
	at com.intellij.task.impl.ProjectTaskManagerImpl$ResultConsumer.lambda$notify$1(ProjectTaskManagerImpl.java:351)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:218)
	at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:200)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:319)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:839)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

The issue was not present on earlier versions of IntelliJ.

Not works with gradle build tool `com.android.tools.build:gradle:3.0.1`

Also not work for me on Android Studio 3.0 now and it work before i upgrade my studio to 3.0+.

Error:Gradle: A problem occurred configuring root project 'xxx'.
Could not resolve all files for configuration ':classpath'.
Could not find com.android.tools.build:gradle:3.0.1.
Searched in the following locations:
https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.pom
https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.jar
Required by:
project :

It works again after i change my gradle build tool from com.android.tools.build:gradle:3.0.1 to com.android.tools.build:gradle:2.3.0

Compile to smali error on every file.

Hello, I'm getting compile error on every file I try it builds but the Compile to smali wont work so I know it's not my code.

error:

Information:2/24/2017 9:28 PM - Compilation completed with 1 error and 0 warnings in 1s 289ms
Error:0

Event log:

9:26:58 PM Gradle sync started
9:27:43 PM Gradle sync completed
9:27:47 PM Executing tasks: [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies]
9:27:55 PM Gradle build finished in 11s 343ms
9:28:59 PM Compilation completed with 1 error and 0 warnings in 1s 289ms

Compile class containing inner class to smali within IntelliJ 2021.1

I wouldn't say it is a real bug, but whenever I try to compile the first time a java class containing an anonymous inner class, e.g. a class defining a callback directly, only the outer class is produced initially. I have to 'Compile to smali' another time that the inner class is generated as well.

Plugin doesn't work with latest versions of IntelliJ IDEA

The plugin needs to be updated, with latest versions of IntelliJ IDEA doesn't work anymore.

I'm not sure what is the latest version of IntelliJ IDEA that works with this plugin but to reproduce the issue is enough to try to use it on IntelliJ IDEA 2023.3.1.

Error after Android Studio 4.0 update

java.lang.IllegalStateException: Output directory not found
at org.ollide.java2smali.DexCompiler.getFileOutputDirectory(DexCompiler.kt:117)
at org.ollide.java2smali.DexCompiler.onProjectBuildComplete(DexCompiler.kt:54)
at org.ollide.java2smali.DexCompiler.access$onProjectBuildComplete(DexCompiler.kt:22)
at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:26)
at org.ollide.java2smali.DexCompiler$run$1.invoke(DexCompiler.kt:22)
at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:46)
at org.ollide.java2smali.DexCompiler$buildModule$1.accept(DexCompiler.kt:22)
at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:58)
at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:13)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1975)
at org.jetbrains.concurrency.AsyncPromise.setResult(AsyncPromise.kt:130)
at com.intellij.task.impl.ProjectTaskManagerImpl$ResultConsumer.lambda$notify$1(ProjectTaskManagerImpl.java:370)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:309)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:441)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:424)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:407)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:908)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:781)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:424)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:423)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Decompile anonymous inner classes

Example:

package vm.manager;

import android.content.DialogInterface;

/**
 * Created by luca on 27.07.17.
 */

public class Test {
    public static void main(String[] args) {
        int test = 1;
        switch(test) {
            case 1:
                int a = 200;
                break;
            case 2:
                int b = 300;
                DialogInterface.OnClickListener v2 = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int action) {
                        int vmPos = 0; // ???
                        switch (action) {
                            case 0:
                                //VMManagerActivityOffline.
                                break;
                            case 1:
                                break;
                        }
                    }
                };
                break;
            case 3:
                int c = 400;
                break;
        }
    }
}

results in (only copied the relevant part)

    new-instance v3, Lvm/manager/Test$1;

    invoke-direct {v3}, Lvm/manager/Test$1;-><init>()V

    .line 31
    .local v3, "v2":Landroid/content/DialogInterface$OnClickListener;

but there isn't a Test$1.smali file or similar in the output directory.

java2smali on IntelliJ IDEA Community Edition 14.1.5 NullPointerException: null

null
java.lang.NullPointerException
at org.ollide.java2smali.GenerateAction$CompilerCallback.finished(GenerateAction.java:81)
at com.intellij.compiler.CompilerManagerImpl$ListenerNotificator.finished(CompilerManagerImpl.java:325)
at com.intellij.compiler.impl.CompileDriver$5.run(CompileDriver.java:509)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:569)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

code fails to compile

Error:Internal error: (java.util.concurrent.ExecutionException) java.lang.NoClassDefFoundError: org/jetbrains/jps/android/model/impl/JpsAndroidModuleProperties
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: org/jetbrains/jps/android/model/impl/JpsAndroidModuleProperties
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.jetbrains.jps.model.serialization.JpsProjectLoader.loadModules(JpsProjectLoader.java:281)
at org.jetbrains.jps.model.serialization.JpsProjectLoader.loadModules(JpsProjectLoader.java:238)
at org.jetbrains.jps.model.serialization.JpsProjectLoader.loadFromDirectory(JpsProjectLoader.java:124)
at org.jetbrains.jps.model.serialization.JpsProjectLoader.loadProject(JpsProjectLoader.java:100)
at org.jetbrains.jps.model.serialization.impl.JpsSerializationManagerImpl.loadModel(JpsSerializationManagerImpl.java:41)
at org.jetbrains.jps.cmdline.JpsModelLoaderImpl.loadModel(JpsModelLoaderImpl.java:45)
at org.jetbrains.jps.cmdline.BuildRunner.load(BuildRunner.java:78)
at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:266)
at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:125)
at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler$1.run(BuildMain.java:232)
at org.jetbrains.jps.service.impl.SharedThreadPoolImpl$1.run(SharedThreadPoolImpl.java:44)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: org/jetbrains/jps/android/model/impl/JpsAndroidModuleProperties
at org.jetbrains.jps.android.model.impl.JpsAndroidModelSerializerExtension$1.loadExtension(JpsAndroidModelSerializerExtension.java:52)
at org.jetbrains.jps.android.model.impl.JpsAndroidModelSerializerExtension$1.loadExtension(JpsAndroidModelSerializerExtension.java:47)
at org.jetbrains.jps.model.serialization.facet.JpsFacetConfigurationSerializer.loadExtension(JpsFacetConfigurationSerializer.java:46)
at org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer.addExtension(JpsFacetSerializer.java:73)
at org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer.addFacets(JpsFacetSerializer.java:65)
at org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer.loadFacets(JpsFacetSerializer.java:45)
at org.jetbrains.jps.model.serialization.JpsProjectLoader.loadModule(JpsProjectLoader.java:323)
at org.jetbrains.jps.model.serialization.JpsProjectLoader.access$000(JpsProjectLoader.java:62)
at org.jetbrains.jps.model.serialization.JpsProjectLoader$2.call(JpsProjectLoader.java:276)
at org.jetbrains.jps.model.serialization.JpsProjectLoader$2.call(JpsProjectLoader.java:273)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.intellij.util.concurrency.BoundedTaskExecutor$2.run(BoundedTaskExecutor.java:187)
... 6 more
Caused by: java.lang.ClassNotFoundException: org.jetbrains.jps.android.model.impl.JpsAndroidModuleProperties
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 18 more

Fatal error after compilation: Write access is allowed from write-safe contexts only

Writing the smali output to the source directory throws a fatal error in the latest version of IntelliJ IDEA 2016.3.2.

Exception Details:

Write access is allowed from write-safe contexts only. Please ensure you're using invokeLater/invokeAndWait with a correct modality state (not "any"). See TransactionGuard documentation for details.
current modality=ModalityState.NON_MODAL
known modalities={ModalityState.NON_MODAL=true}
java.lang.Throwable
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:132)
at com.intellij.openapi.application.TransactionGuardImpl.assertWriteActionAllowed(TransactionGuardImpl.java:246)
at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.execute(RefreshQueueImpl.java:54)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.launch(RefreshSessionImpl.java:115)
at com.intellij.openapi.vfs.newvfs.RefreshQueue.refresh(RefreshQueue.java:58)
at com.intellij.openapi.vfs.newvfs.RefreshQueue.refresh(RefreshQueue.java:44)
at com.intellij.openapi.vfs.newvfs.NewVirtualFile.refresh(NewVirtualFile.java:85)
at com.intellij.openapi.vfs.VirtualFile.refresh(VirtualFile.java:676)
at org.ollide.java2smali.CompilerCallback.finished(CompilerCallback.kt:61)
at com.intellij.compiler.CompilerManagerImpl$ListenerNotificator.finished(CompilerManagerImpl.java:499)
at com.intellij.compiler.impl.CompileDriver.a(CompileDriver.java:486)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at com.intellij.ide.IdeEventQueue.b(IdeEventQueue.java:843)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:679)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:391)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

dx errors don't interrupt plugin execution

While discussing #24 it became apparent that the plugin currently won't interrupt its execution when dx encounters an error.

Quote from #24

I was able to reproduce your findings and you're right with the cached result that is being used by java2smali.

The plugin operates in 3 sequential steps:

  1. Trigger a module/project build for the given file (here, IDEA compiles the .java file into one or multiple .class file)
  2. Run dx.jar to transform the .class file(s) into a .dex file
  3. Run baksmali to transform the .dex file into the final .smali file

Step 1 fails, if IDEA is unable to compile the project / module. Step 3 fails whenever there's no dex file available from step 2 (this is the error from your first message). Unfortunately step 2 seems to fail silently, so baksmali may run on a previously emitted .dex file instead of throwing an error.

The goal here is to not fail silently and to stop the plugin execution properly.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.