theme improvements

This commit is contained in:
Mariotaku Lee 2016-03-14 16:17:46 +08:00
parent 3fc43ebe9c
commit 09b1fbb34a
96 changed files with 549 additions and 2107 deletions

Binary file not shown.

View File

@ -87,6 +87,7 @@ dependencies {
compile 'com.android.support:recyclerview-v7:23.2.1' compile 'com.android.support:recyclerview-v7:23.2.1'
compile 'com.android.support:preference-v7:23.2.1' compile 'com.android.support:preference-v7:23.2.1'
compile 'com.android.support:preference-v14:23.2.1' compile 'com.android.support:preference-v14:23.2.1'
compile('com.github.afollestad:app-theme-engine:1.0.1@aar') { transitive = true }
compile 'com.twitter:twitter-text:1.13.0' compile 'com.twitter:twitter-text:1.13.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
compile 'com.squareup:otto:1.3.8' compile 'com.squareup:otto:1.3.8'
@ -106,7 +107,6 @@ dependencies {
compile 'org.apache.commons:commons-lang3:3.4' compile 'org.apache.commons:commons-lang3:3.4'
compile 'commons-primitives:commons-primitives:1.0' compile 'commons-primitives:commons-primitives:1.0'
compile 'com.bluelinelabs:logansquare:1.3.7' compile 'com.bluelinelabs:logansquare:1.3.7'
compile 'org.jraf:android-switch-backport:2.0.1'
compile 'com.makeramen:roundedimageview:2.1.1' compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.soundcloud.android:android-crop:1.0.1@aar' compile 'com.soundcloud.android:android-crop:1.0.1@aar'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2' compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2'

View File

@ -43,6 +43,6 @@
private android.graphics.drawable.Drawable mWindowContentOverlay; private android.graphics.drawable.Drawable mWindowContentOverlay;
} }
-keepclassmembers class org.mariotaku.twidere.activity.support.BrowserSignInActivity.InjectorJavaScriptInterface { -keepclassmembers class org.mariotaku.twidere.activity.BrowserSignInActivity.InjectorJavaScriptInterface {
public *; public *;
} }

View File

@ -1,8 +1,9 @@
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.net.Uri; import android.net.Uri;
import org.junit.Test; import org.junit.Test;
import org.mariotaku.twidere.activity.MediaViewerActivity;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;

View File

@ -33,7 +33,7 @@ import com.squareup.leakcanary.RefWatcher;
import com.squareup.leakcanary.ServiceHeapDumpListener; import com.squareup.leakcanary.ServiceHeapDumpListener;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.activity.support.ComposeActivity; import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.util.net.NoIntercept; import org.mariotaku.twidere.util.net.NoIntercept;
import java.io.IOException; import java.io.IOException;

View File

@ -139,7 +139,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.HomeActivity" android:name=".activity.HomeActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.NoActionBar" android:theme="@style/Theme.Twidere.NoActionBar"
@ -163,11 +163,11 @@
android:value=".activity.support.HomeActivity"/> android:value=".activity.support.HomeActivity"/>
</activity> </activity>
<activity <activity
android:name=".activity.support.ComposeActivity" android:name=".activity.ComposeActivity"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:label="@string/compose" android:label="@string/compose"
android:launchMode="singleTop" android:launchMode="singleTop"
android:parentActivityName=".activity.support.HomeActivity" android:parentActivityName=".activity.HomeActivity"
android:theme="@style/Theme.Twidere.Compose" android:theme="@style/Theme.Twidere.Compose"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/compose"> <intent-filter android:label="@string/compose">
@ -193,10 +193,10 @@
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/> android:value=".activity.HomeActivity"/>
</activity> </activity>
<activity <activity
android:name=".activity.support.QuickSearchBarActivity" android:name=".activity.QuickSearchBarActivity"
android:label="@string/search" android:label="@string/search"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.QuickSearchBar" android:theme="@style/Theme.Twidere.QuickSearchBar"
@ -208,7 +208,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.SignInActivity" android:name=".activity.SignInActivity"
android:label="@string/sign_in" android:label="@string/sign_in"
android:theme="@style/Theme.Twidere.DialogWhenLarge.NoActionBar" android:theme="@style/Theme.Twidere.DialogWhenLarge.NoActionBar"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
@ -219,7 +219,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.BrowserSignInActivity" android:name=".activity.BrowserSignInActivity"
android:label="@string/browser_sign_in" android:label="@string/browser_sign_in"
android:theme="@style/Theme.Twidere" android:theme="@style/Theme.Twidere"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
@ -232,7 +232,7 @@
<activity <activity
android:name=".activity.SettingsActivity" android:name=".activity.SettingsActivity"
android:label="@string/settings" android:label="@string/settings"
android:parentActivityName=".activity.support.HomeActivity" android:parentActivityName=".activity.HomeActivity"
android:theme="@style/Theme.Twidere" android:theme="@style/Theme.Twidere"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>
@ -244,15 +244,15 @@
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/> android:value=".activity.HomeActivity"/>
</activity> </activity>
<activity <activity
android:name=".activity.support.APIEditorActivity" android:name=".activity.APIEditorActivity"
android:label="@string/edit_api" android:label="@string/edit_api"
android:theme="@style/Theme.Twidere.Dialog" android:theme="@style/Theme.Twidere.Dialog"
android:windowSoftInputMode="adjustResize"/> android:windowSoftInputMode="adjustResize"/>
<activity <activity
android:name=".activity.support.AccountSelectorActivity" android:name=".activity.AccountSelectorActivity"
android:label="@string/select_account" android:label="@string/select_account"
android:theme="@style/Theme.Twidere.Dialog"> android:theme="@style/Theme.Twidere.Dialog">
<intent-filter> <intent-filter>
@ -262,17 +262,17 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.ColorPickerDialogActivity" android:name=".activity.ColorPickerDialogActivity"
android:label="@string/set_color" android:label="@string/set_color"
android:theme="@style/Theme.Twidere.NoDisplay"/> android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity <activity
android:name=".activity.support.LinkHandlerActivity" android:name=".activity.LinkHandlerActivity"
android:parentActivityName=".activity.support.HomeActivity" android:parentActivityName=".activity.HomeActivity"
android:theme="@style/Theme.Twidere.DialogWhenLarge.NoActionBar" android:theme="@style/Theme.Twidere"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/> android:value=".activity.HomeActivity"/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW"/> <action android:name="android.intent.action.VIEW"/>
@ -284,7 +284,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.MediaViewerActivity" android:name=".activity.MediaViewerActivity"
android:configChanges="keyboardHidden|orientation|screenSize" android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/media" android:label="@string/media"
android:theme="@style/Theme.Twidere.Viewer" android:theme="@style/Theme.Twidere.Viewer"
@ -292,7 +292,7 @@
<meta-data <meta-data
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity"/> android:value=".activity.HomeActivity"/>
<intent-filter> <intent-filter>
<action android:name="org.mariotaku.twidere.VIEW_MEDIA"/> <action android:name="org.mariotaku.twidere.VIEW_MEDIA"/>
@ -306,7 +306,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.FileSelectorActivity" android:name=".activity.FileSelectorActivity"
android:exported="false" android:exported="false"
android:label="@string/pick_file" android:label="@string/pick_file"
android:theme="@style/Theme.Twidere.NoDisplay" android:theme="@style/Theme.Twidere.NoDisplay"
@ -319,7 +319,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.ThemedImagePickerActivity" android:name=".activity.ThemedImagePickerActivity"
android:exported="false" android:exported="false"
android:theme="@style/Theme.Twidere.NoDisplay" android:theme="@style/Theme.Twidere.NoDisplay"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
@ -332,7 +332,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.CustomTabEditorActivity" android:name=".activity.CustomTabEditorActivity"
android:exported="false" android:exported="false"
android:label="@string/add_tab" android:label="@string/add_tab"
android:theme="@style/Theme.Twidere.Dialog" android:theme="@style/Theme.Twidere.Dialog"
@ -359,7 +359,7 @@
android:label="@string/copy_link" android:label="@string/copy_link"
android:theme="@style/Theme.Twidere.NoDisplay"/> android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity <activity
android:name=".activity.support.RequestPermissionsActivity" android:name=".activity.RequestPermissionsActivity"
android:label="@string/permissions_request" android:label="@string/permissions_request"
android:theme="@style/Theme.Twidere.Dialog"> android:theme="@style/Theme.Twidere.Dialog">
<intent-filter> <intent-filter>
@ -369,7 +369,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.support.UserListSelectorActivity" android:name=".activity.UserListSelectorActivity"
android:label="@string/select_user_list" android:label="@string/select_user_list"
android:theme="@style/Theme.Twidere.Dialog"> android:theme="@style/Theme.Twidere.Dialog">
<intent-filter> <intent-filter>
@ -384,15 +384,15 @@
android:label="@string/settings_wizard" android:label="@string/settings_wizard"
android:theme="@style/Theme.Twidere"/> android:theme="@style/Theme.Twidere"/>
<activity <activity
android:name=".activity.support.DataExportActivity" android:name=".activity.DataExportActivity"
android:label="@string/export_settings" android:label="@string/export_settings"
android:theme="@style/Theme.Twidere.NoDisplay"/> android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity <activity
android:name=".activity.support.DataImportActivity" android:name=".activity.DataImportActivity"
android:label="@string/import_settings" android:label="@string/import_settings"
android:theme="@style/Theme.Twidere.NoDisplay"/> android:theme="@style/Theme.Twidere.NoDisplay"/>
<activity <activity
android:name=".activity.support.ActivityPickerActivity" android:name=".activity.ActivityPickerActivity"
android:theme="@style/Theme.Twidere.Dialog"> android:theme="@style/Theme.Twidere.Dialog">
<intent-filter> <intent-filter>
<action android:name="org.mariotaku.twidere.PICK_ACTIVITY"/> <action android:name="org.mariotaku.twidere.PICK_ACTIVITY"/>

View File

@ -1,98 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package android.support.v7.app;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.view.LayoutInflaterCompat;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Window;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
/**
* Created by mariotaku on 15/4/22.
*/
public class ThemedAppCompatDelegateFactory implements Constants {
/**
* Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code activity}.
*
* @param callback An optional callback for AppCompat specific events
*/
public static ThemedAppCompatDelegate create(@NonNull final IThemedActivity themed,
@NonNull final AppCompatCallback callback) {
final Activity activity = (Activity) themed;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return new ThemedAppCompatDelegate(themed, activity, activity.getWindow(), callback);
} else {
throw new UnsupportedOperationException();
}
}
public static final class ThemedAppCompatDelegate extends AppCompatDelegateImplV14 {
private final IThemedActivity themed;
private KeyListener keyListener;
private ThemedAppCompatDelegate(@NonNull final IThemedActivity themed, @NonNull final Context context,
@NonNull final Window window, @NonNull final AppCompatCallback callback) {
super(context, window, callback);
this.themed = themed;
}
@Override
public void installViewFactory() {
final LayoutInflater inflater = LayoutInflater.from(mContext);
if (inflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(themed, this));
}
}
@Override
boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyListener != null && keyListener.onKeyDown(keyCode, event)) return true;
return super.onKeyDown(keyCode, event);
}
@Override
boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyListener != null && keyListener.onKeyUp(keyCode, event)) return true;
return super.onKeyUp(keyCode, event);
}
public void setKeyListener(KeyListener listener) {
keyListener = listener;
}
}
public interface KeyListener {
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
}
}

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.app.LoaderManager.LoaderCallbacks; import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader; import android.content.CursorLoader;

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;

View File

@ -5,7 +5,6 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.SharedPreferencesWrapper;
public class AssistLauncherActivity extends Activity implements Constants { public class AssistLauncherActivity extends Activity implements Constants {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.graphics.Rect; import android.graphics.Rect;
@ -29,6 +29,7 @@ import android.view.MotionEvent;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;

View File

@ -1,171 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.NonNull;
import android.view.KeyEvent;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ActivityTracker;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import javax.inject.Inject;
public abstract class BasePreferenceActivity extends PreferenceActivity implements Constants,
IThemedActivity, KeyboardShortcutsHandler.KeyboardShortcutCallback {
// Data fields
private int mCurrentThemeColor;
private int mCurrentThemeBackgroundAlpha;
@ShapeStyle
private int mProfileImageStyle;
private String mCurrentThemeBackgroundOption;
@Inject
protected KeyboardShortcutsHandler mKeyboardShortcutsHandler;
private String mCurrentThemeFontFamily;
@Inject
protected ActivityTracker mActivityTracker;
private int mMetaState;
@Override
public String getCurrentThemeFontFamily() {
return mCurrentThemeFontFamily;
}
@Override
public int getCurrentThemeBackgroundAlpha() {
return mCurrentThemeBackgroundAlpha;
}
@Override
public String getCurrentThemeBackgroundOption() {
return mCurrentThemeBackgroundOption;
}
@Override
public int getCurrentThemeColor() {
return mCurrentThemeColor;
}
@Override
public int getThemeBackgroundAlpha() {
return ThemeUtils.getUserThemeBackgroundAlpha(this);
}
@Override
public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override
public String getThemeFontFamily() {
return ThemeUtils.getThemeFontFamily(this);
}
@Override
@ShapeStyle
public int getCurrentProfileImageStyle() {
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event, int metaState) {
return false;
}
@Override
public boolean handleKeyboardShortcutRepeat(@NonNull KeyboardShortcutsHandler handler, int keyCode, int repeatCount, @NonNull KeyEvent event, int metaState) {
return false;
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
super.onCreate(savedInstanceState);
GeneralComponentHelper.build(this).inject(this);
}
@Override
public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) {
if (KeyEvent.isModifierKey(keyCode)) {
mMetaState &= ~KeyboardShortcutsHandler.getMetaStateForKeyCode(keyCode);
}
if (handleKeyboardShortcutSingle(mKeyboardShortcutsHandler, keyCode, event, mMetaState))
return true;
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {
if (KeyEvent.isModifierKey(keyCode)) {
mMetaState |= KeyboardShortcutsHandler.getMetaStateForKeyCode(keyCode);
}
if (handleKeyboardShortcutRepeat(mKeyboardShortcutsHandler, keyCode, event.getRepeatCount(), event, mMetaState))
return true;
return super.onKeyDown(keyCode, event);
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first);
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, getWindow(),
mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
ThemeUtils.fixNightMode(getResources(), newConfig);
super.onConfigurationChanged(newConfig);
}
protected boolean shouldApplyWindowBackground() {
return true;
}
}

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -33,6 +33,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.ThemedFragmentActivity;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
@SuppressLint("Registered") @SuppressLint("Registered")

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;

View File

@ -17,12 +17,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import org.mariotaku.twidere.activity.BaseSupportDialogActivity;
import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment; import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment;
import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment.Callback; import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment.Callback;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask; import android.os.AsyncTask;

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask; import android.os.AsyncTask;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.Manifest; import android.Manifest;
import android.content.Intent; import android.content.Intent;
@ -31,6 +31,7 @@ import android.support.v4.app.DialogFragment;
import android.widget.Toast; import android.widget.Toast;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.BaseSupportDialogActivity;
import org.mariotaku.twidere.fragment.support.FileSelectorDialogFragment; import org.mariotaku.twidere.fragment.support.FileSelectorDialogFragment;
import org.mariotaku.twidere.util.PermissionUtils; import org.mariotaku.twidere.util.PermissionUtils;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.SearchManager; import android.app.SearchManager;
@ -27,24 +27,22 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect; import android.graphics.Rect;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.view.GravityCompat; import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.DrawerLayoutAccessor; import android.support.v4.widget.DrawerLayoutAccessor;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import android.view.Gravity; import android.view.Gravity;
@ -56,16 +54,12 @@ import android.view.View.OnLongClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams; import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window; import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams; import android.widget.FrameLayout.LayoutParams;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.SettingsWizardActivity;
import org.mariotaku.twidere.activity.UsageStatisticsActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.annotation.ReadPositionTag; import org.mariotaku.twidere.annotation.ReadPositionTag;
@ -99,14 +93,9 @@ import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.TwidereMathUtils; import org.mariotaku.twidere.util.TwidereMathUtils;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.ActivitySupport; import org.mariotaku.twidere.view.ExtendedFrameLayout;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.ExtendedViewPager; import org.mariotaku.twidere.view.ExtendedViewPager;
import org.mariotaku.twidere.view.TabPagerIndicator; import org.mariotaku.twidere.view.TabPagerIndicator;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -125,16 +114,15 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
private SupportTabsAdapter mPagerAdapter; private SupportTabsAdapter mPagerAdapter;
private ExtendedViewPager mViewPager; private ExtendedViewPager mViewPager;
private Toolbar mActionBar;
private TabPagerIndicator mTabIndicator; private TabPagerIndicator mTabIndicator;
private DrawerLayout mDrawerLayout; private DrawerLayout mDrawerLayout;
private View mEmptyTabHint; private View mEmptyTabHint;
private View mActionsButton; private FloatingActionButton mActionsButton;
private View mActionBarWithOverlay; private ExtendedFrameLayout mHomeContent;
private TintedStatusFrameLayout mHomeContent;
private UpdateUnreadCountTask mUpdateUnreadCountTask; private UpdateUnreadCountTask mUpdateUnreadCountTask;
private Toolbar mActionBar;
private OnSharedPreferenceChangeListener mReadStateChangeListener = new OnSharedPreferenceChangeListener() { private OnSharedPreferenceChangeListener mReadStateChangeListener = new OnSharedPreferenceChangeListener() {
@Override @Override
@ -144,7 +132,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
}; };
private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this); private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this);
private int mTabColumns; private int mTabColumns;
private View mActionBarContainer;
public void closeAccountsDrawer() { public void closeAccountsDrawer() {
if (mDrawerLayout == null) return; if (mDrawerLayout == null) return;
@ -185,8 +172,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override @Override
public boolean getSystemWindowsInsets(Rect insets) { public boolean getSystemWindowsInsets(Rect insets) {
final int height = mTabIndicator != null ? mTabIndicator.getHeight() : 0; if (mTabIndicator == null || mHomeContent == null) return false;
insets.top = (height != 0 ? height : ThemeUtils.getActionBarHeight(this)); final int height = mTabIndicator.getHeight();
if (height != 0) {
insets.top = height;
} else {
insets.top = ThemeUtils.getActionBarHeight(this);
}
insets.top += mHomeContent.getTop();
return true; return true;
} }
@ -327,14 +320,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
*/ */
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
final Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
}
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mMultiSelectHandler = new MultiSelectEventHandler(this); mMultiSelectHandler = new MultiSelectEventHandler(this);
mMultiSelectHandler.dispatchOnCreate(); mMultiSelectHandler.dispatchOnCreate();
@ -353,7 +338,9 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
return; return;
} }
setContentView(R.layout.activity_home); setContentView(R.layout.activity_home);
setSupportActionBar(mActionBar); setSupportActionBar(mActionBar);
final boolean refreshOnStart = mPreferences.getBoolean(KEY_REFRESH_ON_START, false); final boolean refreshOnStart = mPreferences.getBoolean(KEY_REFRESH_ON_START, false);
int tabDisplayOptionInt = Utils.getTabDisplayOptionInt(this); int tabDisplayOptionInt = Utils.getTabDisplayOptionInt(this);
@ -362,7 +349,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mHomeContent.setOnFitSystemWindowsListener(this); mHomeContent.setOnFitSystemWindowsListener(this);
mPagerAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), mTabIndicator, mTabColumns); mPagerAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), mTabIndicator, mTabColumns);
mViewPager.setAdapter(mPagerAdapter); mViewPager.setAdapter(mPagerAdapter);
// mViewPager.setOffscreenPageLimit(3);
mTabIndicator.setViewPager(mViewPager); mTabIndicator.setViewPager(mViewPager);
mTabIndicator.setOnPageChangeListener(this); mTabIndicator.setOnPageChangeListener(this);
mTabIndicator.setColumns(mTabColumns); mTabIndicator.setColumns(mTabColumns);
@ -374,16 +360,22 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mTabIndicator.setDisplayBadge(mPreferences.getBoolean(KEY_UNREAD_COUNT, true)); mTabIndicator.setDisplayBadge(mPreferences.getBoolean(KEY_UNREAD_COUNT, true));
mTabIndicator.updateAppearance(); mTabIndicator.updateAppearance();
mHomeContent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (top != oldTop) {
final Fragment fragment = getLeftDrawerFragment();
if (fragment instanceof AccountsDashboardFragment) {
((AccountsDashboardFragment) fragment).requestFitSystemWindows();
}
}
}
});
mActionsButton.setOnClickListener(this); mActionsButton.setOnClickListener(this);
mActionsButton.setOnLongClickListener(this); mActionsButton.setOnLongClickListener(this);
mEmptyTabHint.setOnClickListener(this); mEmptyTabHint.setOnClickListener(this);
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
ViewCompat.setElevation(mActionBarContainer, ThemeUtils.getSupportActionBarElevation(this));
ViewSupport.setOutlineProvider(mActionBarContainer, ViewOutlineProviderCompat.BACKGROUND);
final View windowOverlay = findViewById(R.id.window_overlay);
ViewSupport.setBackground(windowOverlay, ThemeUtils.getNormalWindowContentOverlay(this));
setupSlidingMenu(); setupSlidingMenu();
setupBars(); setupBars();
showDataProfilingRequest(); showDataProfilingRequest();
@ -424,11 +416,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (ThemeUtils.isDarkTheme(this)) {
// TODO show dark bar
} else {
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null, getThemeColor()));
}
invalidateOptionsMenu(); invalidateOptionsMenu();
updateActionsButtonStyle(); updateActionsButtonStyle();
updateActionsButton(); updateActionsButton();
@ -533,7 +520,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
if (fragment instanceof AccountsDashboardFragment) { if (fragment instanceof AccountsDashboardFragment) {
((AccountsDashboardFragment) fragment).requestFitSystemWindows(); ((AccountsDashboardFragment) fragment).requestFitSystemWindows();
} }
mHomeContent.setStatusBarHeight(insets.top);
} }
public void updateUnreadCount() { public void updateUnreadCount() {
@ -588,12 +574,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
return 1 - mActionsButton.getTranslationY() / total; return 1 - mActionsButton.getTranslationY() / total;
} }
final float totalHeight = getControlBarHeight(); final float totalHeight = getControlBarHeight();
return 1 + mActionBarWithOverlay.getTranslationY() / totalHeight; return 1 + mActionBar.getTranslationY() / totalHeight;
} }
@Override @Override
public void setControlBarOffset(float offset) { public void setControlBarOffset(float offset) {
mActionBarWithOverlay.setTranslationY(mTabColumns > 1 ? 0 : getControlBarHeight() * (offset - 1)); final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
mActionBar.setTranslationY(mTabColumns > 1 ? 0 : (int) (getControlBarHeight() * (offset - 1)));
final ViewGroup.LayoutParams lp = mActionsButton.getLayoutParams(); final ViewGroup.LayoutParams lp = mActionsButton.getLayoutParams();
if (lp instanceof MarginLayoutParams) { if (lp instanceof MarginLayoutParams) {
mActionsButton.setTranslationY((((MarginLayoutParams) lp).bottomMargin + mActionsButton.getHeight()) * (1 - offset)); mActionsButton.setTranslationY((((MarginLayoutParams) lp).bottomMargin + mActionsButton.getHeight()) * (1 - offset));
@ -606,16 +594,13 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
@Override @Override
public void onContentChanged() { public void onContentChanged() {
super.onContentChanged(); super.onContentChanged();
mActionBar = (Toolbar) findViewById(R.id.action_bar);
mActionBarContainer = findViewById(R.id.twidere_action_bar_container);
mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs); mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs);
mActionBar = (Toolbar) findViewById(R.id.action_bar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.home_menu); mDrawerLayout = (DrawerLayout) findViewById(R.id.home_menu);
mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager); mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager);
mEmptyTabHint = findViewById(R.id.empty_tab_hint); mEmptyTabHint = findViewById(R.id.empty_tab_hint);
mActionsButton = findViewById(R.id.actions_button); mActionsButton = (FloatingActionButton) findViewById(R.id.actions_button);
mActionBarWithOverlay = findViewById(R.id.twidere_action_bar_with_overlay); mHomeContent = (ExtendedFrameLayout) findViewById(R.id.home_content);
mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs);
mHomeContent = (TintedStatusFrameLayout) findViewById(R.id.home_content);
} }
private Fragment getKeyboardShortcutRecipient() { private Fragment getKeyboardShortcutRecipient() {
@ -747,34 +732,20 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
final String backgroundOption = getCurrentThemeBackgroundOption(); final String backgroundOption = getCurrentThemeBackgroundOption();
final boolean isTransparent = ThemeUtils.isTransparentBackground(backgroundOption); final boolean isTransparent = ThemeUtils.isTransparentBackground(backgroundOption);
final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF; final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF;
final IHomeActionButton homeActionButton = (IHomeActionButton) mActionsButton;
mTabIndicator.setItemContext(ThemeUtils.getActionBarThemedContext(this, themeColor)); mTabIndicator.setItemContext(ThemeUtils.getActionBarThemedContext(this, themeColor));
ViewSupport.setBackground(mActionBarContainer, ThemeUtils.getActionBarBackground(this, themeColor,
backgroundOption, true));
final int actionBarColor = ThemeUtils.getActionBarColor(this, themeColor, backgroundOption);
final int actionItemColor = ThemeUtils.getContrastForegroundColor(this, themeColor);
final int[] foregroundColors = new int[2]; final int[] foregroundColors = new int[2];
ThemeUtils.getColorForegroundAndInverse(this, foregroundColors); ThemeUtils.getColorForegroundAndInverse(this, foregroundColors);
if (ThemeUtils.isDarkTheme(this)) { if (ThemeUtils.isDarkTheme(this)) {
homeActionButton.setButtonColor(actionBarColor);
homeActionButton.setIconColor(actionItemColor, Mode.SRC_ATOP);
mTabIndicator.setStripColor(themeColor); mTabIndicator.setStripColor(themeColor);
mTabIndicator.setIconColor(foregroundColors[0]); mTabIndicator.setIconColor(foregroundColors[0]);
mTabIndicator.setLabelColor(foregroundColors[0]); mTabIndicator.setLabelColor(foregroundColors[0]);
} else { } else {
final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor, final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor,
ThemeUtils.ACCENT_COLOR_THRESHOLD, foregroundColors[0], foregroundColors[1]); ThemeUtils.ACCENT_COLOR_THRESHOLD, foregroundColors[0], foregroundColors[1]);
homeActionButton.setButtonColor(themeColor);
homeActionButton.setIconColor(actionItemColor, Mode.SRC_ATOP);
mTabIndicator.setStripColor(contrastColor); mTabIndicator.setStripColor(contrastColor);
mTabIndicator.setIconColor(contrastColor); mTabIndicator.setIconColor(contrastColor);
mTabIndicator.setLabelColor(contrastColor); mTabIndicator.setLabelColor(contrastColor);
} }
mHomeContent.setDrawColor(true);
mHomeContent.setDrawShadow(false);
mHomeContent.setColor(actionBarColor, actionBarAlpha);
mHomeContent.setFactor(1);
mActionBarWithOverlay.setAlpha(actionBarAlpha / 255f);
mActionsButton.setAlpha(actionBarAlpha / 255f); mActionsButton.setAlpha(actionBarAlpha / 255f);
} }
@ -843,11 +814,8 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
icon = R.drawable.ic_action_status_compose; icon = R.drawable.ic_action_status_compose;
title = R.string.compose; title = R.string.compose;
} }
if (mActionsButton instanceof IHomeActionButton) { mActionsButton.setImageResource(icon);
final IHomeActionButton hab = (IHomeActionButton) mActionsButton; mActionsButton.setContentDescription(getString(title));
hab.setIcon(icon);
hab.setTitle(title);
}
} }
private void updateActionsButtonStyle() { private void updateActionsButtonStyle() {

View File

@ -138,11 +138,6 @@ public class ImageCropperActivity extends CropImageActivity implements IThemedAc
return mProfileImageStyle; return mProfileImageStyle;
} }
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override @Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) { protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor(); mCurrentThemeColor = getThemeColor();

View File

@ -37,7 +37,8 @@ import org.mariotaku.twidere.util.ThemeUtils;
/** /**
* Created by mariotaku on 15/4/20. * Created by mariotaku on 15/4/20.
*/ */
public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity implements Constants, OnClickListener { public class KeyboardShortcutPreferenceCompatActivity extends BaseSupportDialogActivity implements
Constants, OnClickListener {
public static final String EXTRA_CONTEXT_TAG = "context_tag"; public static final String EXTRA_CONTEXT_TAG = "context_tag";
public static final String EXTRA_KEY_ACTION = "key_action"; public static final String EXTRA_KEY_ACTION = "key_action";
@ -74,12 +75,12 @@ public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity
switch (v.getId()) { switch (v.getId()) {
case R.id.button_positive: { case R.id.button_positive: {
if (mKeySpec == null) return; if (mKeySpec == null) return;
mKeyboardShortcutHandler.register(mKeySpec, getKeyAction()); mKeyboardShortcutsHandler.register(mKeySpec, getKeyAction());
finish(); finish();
break; break;
} }
case R.id.button_neutral: { case R.id.button_neutral: {
mKeyboardShortcutHandler.unregister(getKeyAction()); mKeyboardShortcutsHandler.unregister(getKeyAction());
finish(); finish();
break; break;
} }
@ -112,10 +113,10 @@ public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity
} }
mKeySpec = spec; mKeySpec = spec;
mKeysLabel.setText(spec.toKeyString()); mKeysLabel.setText(spec.toKeyString());
final String oldAction = mKeyboardShortcutHandler.findAction(spec); final String oldAction = mKeyboardShortcutsHandler.findAction(spec);
final KeyboardShortcutSpec copyOfSpec = spec.copy(); final KeyboardShortcutSpec copyOfSpec = spec.copy();
copyOfSpec.setContextTag(null); copyOfSpec.setContextTag(null);
final String oldGeneralAction = mKeyboardShortcutHandler.findAction(copyOfSpec); final String oldGeneralAction = mKeyboardShortcutsHandler.findAction(copyOfSpec);
if (!TextUtils.isEmpty(oldAction) && !keyAction.equals(oldAction)) { if (!TextUtils.isEmpty(oldAction) && !keyAction.equals(oldAction)) {
// Conflicts with keys in same context tag // Conflicts with keys in same context tag
mConflictLabel.setVisibility(View.VISIBLE); mConflictLabel.setVisibility(View.VISIBLE);

View File

@ -17,30 +17,25 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.graphics.Rect; import android.graphics.Rect;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NavUtils; import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.widget.ActionBarContainer; import android.support.v7.widget.ActionBarContainer;
import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
@ -53,14 +48,10 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback; import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.MultiSelectEventHandler; import org.mariotaku.twidere.util.MultiSelectEventHandler;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereActionModeForChildListener;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.ActivitySupport; import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat; import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport; import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout;
import static org.mariotaku.twidere.util.Utils.createFragmentForIntent; import static org.mariotaku.twidere.util.Utils.createFragmentForIntent;
import static org.mariotaku.twidere.util.Utils.matchLinkId; import static org.mariotaku.twidere.util.Utils.matchLinkId;
@ -70,8 +61,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this); private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this);
private MultiSelectEventHandler mMultiSelectHandler; private MultiSelectEventHandler mMultiSelectHandler;
private TwidereActionModeForChildListener mTwidereActionModeForChildListener;
private TintedStatusFrameLayout mMainContent;
private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() { private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() {
private final Rect tempInsets = new Rect(); private final Rect tempInsets = new Rect();
@ -81,14 +70,11 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (compatCalled) return; if (compatCalled) return;
if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom && !ViewSupport.isInLayout(v)) { if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom && !ViewSupport.isInLayout(v)) {
mMainContent.getSystemWindowsInsets(tempInsets);
onFitSystemWindows(tempInsets); onFitSystemWindows(tempInsets);
compatCalled = true; compatCalled = true;
} }
} }
}; };
private View mActionBarWithOverlay;
private ActionBarContainer mActionBarContainer;
private boolean mFinishOnly; private boolean mFinishOnly;
private int mActionBarHeight; private int mActionBarHeight;
@ -104,14 +90,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
return false; return false;
} }
@Override
public void onBackPressed() {
if (mTwidereActionModeForChildListener.finishExisting()) {
return;
}
super.onBackPressed();
}
@Override @Override
public void onFitSystemWindows(Rect insets) { public void onFitSystemWindows(Rect insets) {
final View actionBarContainer = findViewById(R.id.twidere_action_bar_container); final View actionBarContainer = findViewById(R.id.twidere_action_bar_container);
@ -206,28 +184,14 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
final Intent intent = getIntent(); final Intent intent = getIntent();
final Uri data = intent.getData(); final Uri data = intent.getData();
final int linkId = matchLinkId(data); final int linkId = matchLinkId(data);
requestWindowFeatures(getWindow(), linkId, data);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_fragment);
setSupportActionBar((Toolbar) findViewById(R.id.action_bar));
mTwidereActionModeForChildListener = new TwidereActionModeForChildListener(this, this, false);
final TintedStatusNativeActionModeAwareLayout layout = (TintedStatusNativeActionModeAwareLayout) findViewById(R.id.main_content);
layout.setActionModeForChildListener(mTwidereActionModeForChildListener);
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable()); ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
final View actionBarContainer = findViewById(R.id.twidere_action_bar_container);
ViewCompat.setElevation(actionBarContainer, ThemeUtils.getSupportActionBarElevation(this));
ViewSupport.setOutlineProvider(actionBarContainer, ViewOutlineProviderCompat.BACKGROUND);
final View windowOverlay = findViewById(R.id.window_overlay);
ViewSupport.setBackground(windowOverlay, ThemeUtils.getNormalWindowContentOverlay(this));
final ActionBar actionBar = getSupportActionBar(); final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) { if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true);
setActionBarTheme(linkId); setActionBarTheme(linkId);
} }
mMainContent.setOnFitSystemWindowsListener(this);
setStatusBarColor(linkId, data);
Utils.logOpenNotificationFromUri(this, data); Utils.logOpenNotificationFromUri(this, data);
if (!showFragment(linkId, data)) { if (!showFragment(linkId, data)) {
finish(); finish();
@ -237,7 +201,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override @Override
protected void onStart() { protected void onStart() {
mMainContent.addOnLayoutChangeListener(mLayoutChangeListener);
super.onStart(); super.onStart();
mMultiSelectHandler.dispatchOnStart(); mMultiSelectHandler.dispatchOnStart();
} }
@ -246,22 +209,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
protected void onStop() { protected void onStop() {
mMultiSelectHandler.dispatchOnStop(); mMultiSelectHandler.dispatchOnStop();
super.onStop(); super.onStop();
mMainContent.removeOnLayoutChangeListener(mLayoutChangeListener);
}
@Override
public boolean onPreparePanel(int featureId, View view, Menu menu) {
final boolean result = super.onPreparePanel(featureId, view, menu);
if (shouldSetActionItemColor()) {
setupToolbarMenuItemColor();
mActionBarContainer.post(new Runnable() {
@Override
public void run() {
setupToolbarMenuItemColor();
}
});
}
return result;
} }
private void setupToolbarMenuItemColor() { private void setupToolbarMenuItemColor() {
@ -282,9 +229,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override @Override
public void onContentChanged() { public void onContentChanged() {
super.onContentChanged(); super.onContentChanged();
mMainContent = (TintedStatusFrameLayout) findViewById(R.id.main_content);
mActionBarWithOverlay = findViewById(R.id.twidere_action_bar_with_overlay);
mActionBarContainer = (ActionBarContainer) findViewById(R.id.twidere_action_bar_container);
} }
protected boolean shouldSetActionItemColor() { protected boolean shouldSetActionItemColor() {
@ -313,24 +257,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
return false; return false;
} }
private void requestWindowFeatures(Window window, int linkId, Uri uri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
final int transitionRes;
switch (linkId) {
default: {
transitionRes = 0;
break;
}
}
//noinspection ConstantConditions
if (transitionRes != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
&& !ThemeUtils.isTransparentBackground(getCurrentThemeBackgroundOption())) {
Utils.setSharedElementTransition(this, window, transitionRes);
}
}
@SuppressLint("AppCompatMethod") @SuppressLint("AppCompatMethod")
private void setActionBarTheme(int linkId) { private void setActionBarTheme(int linkId) {
final int themeColor = getCurrentThemeColor(); final int themeColor = getCurrentThemeColor();
@ -349,28 +275,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
break; break;
} }
} }
final boolean isTransparent = ThemeUtils.isTransparentBackground(option);
final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF;
mActionBarWithOverlay.setAlpha(actionBarAlpha / 255f);
}
private void setStatusBarColor(int linkId, Uri uri) {
switch (linkId) {
case LINK_ID_USER: {
mMainContent.setDrawShadow(true);
mMainContent.setShadowColor(0xA0000000);
break;
}
default: {
mMainContent.setDrawShadow(false);
break;
}
}
mMainContent.setDrawColor(true);
mMainContent.setFactor(1);
final int alpha = ThemeUtils.getActionBarAlpha(getThemeBackgroundOption(), getCurrentThemeBackgroundAlpha());
final int statusBarColor = ThemeUtils.getActionBarColor(this, getCurrentThemeColor(), getThemeBackgroundOption());
mMainContent.setColor(statusBarColor, alpha);
} }
private boolean showFragment(final int linkId, final Uri uri) { private boolean showFragment(final int linkId, final Uri uri) {
@ -528,7 +432,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
} }
mFinishOnly = Boolean.parseBoolean(uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY)); mFinishOnly = Boolean.parseBoolean(uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY));
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_fragment, fragment); ft.replace(android.R.id.content, fragment);
ft.commit(); ft.commit();
return true; return true;
} }
@ -549,14 +453,12 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
@Override @Override
public float getControlBarOffset() { public float getControlBarOffset() {
return 1 + mActionBarContainer.getTranslationY() / (float) getControlBarHeight(); return 0;
} }
@Override @Override
public void setControlBarOffset(float offset) { public void setControlBarOffset(float offset) {
final int translationY = -Math.round((1 - offset) * getControlBarHeight()); final int translationY = -Math.round((1 - offset) * getControlBarHeight());
mActionBarContainer.setTranslationY(translationY);
mTwidereActionModeForChildListener.setModeTranslationY(translationY);
notifyControlBarOffsetChanged(); notifyControlBarOffsetChanged();
} }
@ -576,7 +478,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
} }
public ActionBarContainer getActionBarContainer() { public ActionBarContainer getActionBarContainer() {
return mActionBarContainer; return null;
} }
public interface HideUiOnScroll { public interface HideUiOnScroll {

View File

@ -26,7 +26,6 @@ import android.os.Bundle;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -36,6 +36,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.BaseSupportDialogActivity;
import org.mariotaku.twidere.util.HtmlEscapeHelper; import org.mariotaku.twidere.util.HtmlEscapeHelper;
import org.mariotaku.twidere.util.PermissionsManager; import org.mariotaku.twidere.util.PermissionsManager;

View File

@ -51,7 +51,6 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.fragment.CustomTabsFragment; import org.mariotaku.twidere.fragment.CustomTabsFragment;
import org.mariotaku.twidere.fragment.ExtensionsListFragment; import org.mariotaku.twidere.fragment.ExtensionsListFragment;
import org.mariotaku.twidere.fragment.SettingsDetailsFragment; import org.mariotaku.twidere.fragment.SettingsDetailsFragment;

View File

@ -35,12 +35,9 @@ import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceScreen;
import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -48,9 +45,6 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.support.DataImportActivity;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.fragment.BasePreferenceFragment; import org.mariotaku.twidere.fragment.BasePreferenceFragment;
@ -70,7 +64,6 @@ import org.mariotaku.twidere.util.CustomTabUtils;
import org.mariotaku.twidere.util.InternalParseUtils; import org.mariotaku.twidere.util.InternalParseUtils;
import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.TwidereMathUtils; import org.mariotaku.twidere.util.TwidereMathUtils;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.LinePageIndicator; import org.mariotaku.twidere.view.LinePageIndicator;
@ -174,21 +167,6 @@ public class SettingsWizardActivity extends BaseAppCompatActivity implements Con
return ThemeUtils.getUserAccentColor(this); return ThemeUtils.getUserAccentColor(this);
} }
@NonNull
@Override
public LayoutInflater getLayoutInflater() {
final LayoutInflater inflater = super.getLayoutInflater();
if (inflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(this, new LayoutInflaterFactory() {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
return SettingsWizardActivity.this.onCreateView(parent, name, context, attrs);
}
}));
}
return inflater;
}
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -314,7 +292,7 @@ public class SettingsWizardActivity extends BaseAppCompatActivity implements Con
final Intent intent = getIntent(); final Intent intent = getIntent();
intent.putExtra(EXTRA_PAGE, mViewPager.getCurrentItem()); intent.putExtra(EXTRA_PAGE, mViewPager.getCurrentItem());
setIntent(intent); setIntent(intent);
restart(); recreate();
} }
public static class WizardPageCardsFragment extends BaseWizardPageFragment { public static class WizardPageCardsFragment extends BaseWizardPageFragment {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.ContentResolver; import android.content.ContentResolver;
@ -41,7 +41,6 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
@ -69,7 +68,6 @@ import org.mariotaku.restfu.http.Endpoint;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.api.statusnet.model.StatusNetConfig; import org.mariotaku.twidere.api.statusnet.model.StatusNetConfig;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
@ -533,21 +531,6 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
return true; return true;
} }
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setupActionBar();
}
private void setupActionBar() {
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
final int themeColor = getCurrentThemeColor();
final String option = getThemeBackgroundOption();
ThemeUtils.applyActionBarBackground(actionBar, this, themeColor, option, isActionBarOutlineEnabled());
}
private void setupTintStatusBar() { private void setupTintStatusBar() {
if (mMainContent == null) return; if (mMainContent == null) return;

View File

@ -19,32 +19,39 @@
package org.mariotaku.twidere.activity; package org.mariotaku.twidere.activity;
import android.app.Activity;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;
import com.afollestad.appthemeengine.ATE;
import com.afollestad.appthemeengine.ATEActivity;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IAppCompatActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import org.mariotaku.twidere.view.ShapedImageView;
import javax.inject.Inject; public abstract class ThemedAppCompatActivity extends ATEActivity implements Constants,
IThemedActivity, IAppCompatActivity {
public abstract class BaseThemedActivity extends Activity implements IThemedActivity {
// Data fields
private int mCurrentThemeColor; private int mCurrentThemeColor;
private int mCurrentThemeBackgroundAlpha; private int mCurrentThemeBackgroundAlpha;
private String mCurrentThemeFontFamily; @ShapeStyle
private String mCurrentThemeBackgroundOption;
private int mProfileImageStyle; private int mProfileImageStyle;
@Inject private String mCurrentThemeBackgroundOption;
protected KeyboardShortcutsHandler mKeyboardShortcutHandler; private String mCurrentThemeFontFamily;
private Toolbar mToolbar;
@Override @Override
public String getCurrentThemeFontFamily() { public String getCurrentThemeFontFamily() {
@ -72,7 +79,9 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
} }
@Override @Override
public abstract int getThemeColor(); public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override @Override
public String getThemeFontFamily() { public String getThemeFontFamily() {
@ -80,52 +89,42 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
} }
@Override @Override
@ShapedImageView.ShapeStyle @ShapeStyle
public int getCurrentProfileImageStyle() { public int getCurrentProfileImageStyle() {
return mProfileImageStyle; return mProfileImageStyle;
} }
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy(); StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy(); StrictModeUtils.detectAllThreadPolicy();
} }
final int themeColor = getThemeColor();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
GeneralComponentHelper.build(this).inject(this);
setActionBarBackground();
} }
private void setActionBarBackground() {
}
@Nullable
@Override @Override
public void setTheme(int resId) { public String getATEKey() {
super.setTheme(resId); return ThemeUtils.getATEKey(this);
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, getWindow(),
mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
}
} }
@Override @Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) { protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor(); mCurrentThemeColor = getThemeColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mProfileImageStyle = Utils.getProfileImageStyle(this); mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first); super.onApplyThemeResource(theme, resId, first);
} final Window window = getWindow();
if (shouldApplyWindowBackground()) {
protected boolean shouldApplyWindowBackground() { ThemeUtils.applyWindowBackground(this, window, mCurrentThemeBackgroundOption,
return true; mCurrentThemeBackgroundAlpha);
}
} }
@ -134,4 +133,24 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
ThemeUtils.fixNightMode(getResources(), newConfig); ThemeUtils.fixNightMode(getResources(), newConfig);
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
} }
@Nullable
public final Toolbar peekActionBarToolbar() {
return mToolbar;
}
@Nullable
public final Toolbar getActionBarToolbar() {
if (mToolbar != null) return mToolbar;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
return (Toolbar) actionBarView;
}
return null;
}
protected boolean shouldApplyWindowBackground() {
return true;
}
} }

View File

@ -17,20 +17,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.util.AttributeSet;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
@ -46,7 +40,6 @@ import org.mariotaku.twidere.util.PermissionsManager;
import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
@ -84,21 +77,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
private String mCurrentThemeFontFamily; private String mCurrentThemeFontFamily;
private int mMetaState; private int mMetaState;
@NonNull
@Override
public LayoutInflater getLayoutInflater() {
final LayoutInflater inflater = super.getLayoutInflater();
if (inflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(this, new LayoutInflaterFactory() {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
return ThemedFragmentActivity.this.onCreateView(parent, name, context, attrs);
}
}));
}
return inflater;
}
@Override @Override
public String getCurrentThemeFontFamily() { public String getCurrentThemeFontFamily() {
return mCurrentThemeFontFamily; return mCurrentThemeFontFamily;
@ -140,11 +118,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
return mProfileImageStyle; return mProfileImageStyle;
} }
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {

View File

@ -1,4 +1,4 @@
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -6,7 +6,6 @@ import android.net.Uri;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import org.mariotaku.pickncrop.library.ImagePickerActivity; import org.mariotaku.pickncrop.library.ImagePickerActivity;
import org.mariotaku.twidere.activity.ImageCropperActivity;
import org.mariotaku.twidere.util.RestFuNetworkStreamDownloader; import org.mariotaku.twidere.util.RestFuNetworkStreamDownloader;
public class ThemedImagePickerActivity extends ImagePickerActivity { public class ThemedImagePickerActivity extends ImagePickerActivity {

View File

@ -15,7 +15,6 @@ import android.util.Pair;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.IntentSupport; import org.mariotaku.twidere.util.support.IntentSupport;

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.mariotaku.twidere.activity.support; package org.mariotaku.twidere.activity;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask; import android.os.AsyncTask;

View File

@ -42,6 +42,4 @@ public interface IThemedActivity {
@ShapedImageView.ShapeStyle @ShapedImageView.ShapeStyle
int getCurrentProfileImageStyle(); int getCurrentProfileImageStyle();
void restart();
} }

View File

@ -1,197 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity.support;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.ThemedAppCompatDelegateFactory;
import android.support.v7.widget.ActionBarContainer;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IAppCompatActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
public abstract class ThemedAppCompatActivity extends AppCompatActivity implements Constants,
IThemedActivity, IAppCompatActivity {
// Data fields
private int mCurrentThemeColor;
private int mCurrentThemeBackgroundAlpha;
@ShapeStyle
private int mProfileImageStyle;
private String mCurrentThemeBackgroundOption;
private String mCurrentThemeFontFamily;
private ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate mDelegate;
private Toolbar mToolbar;
@Override
public String getCurrentThemeFontFamily() {
return mCurrentThemeFontFamily;
}
@Override
public int getCurrentThemeBackgroundAlpha() {
return mCurrentThemeBackgroundAlpha;
}
@Override
public String getCurrentThemeBackgroundOption() {
return mCurrentThemeBackgroundOption;
}
@Override
public int getCurrentThemeColor() {
return mCurrentThemeColor;
}
@Override
public int getThemeBackgroundAlpha() {
return ThemeUtils.getUserThemeBackgroundAlpha(this);
}
@Override
public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override
public String getThemeFontFamily() {
return ThemeUtils.getThemeFontFamily(this);
}
@Override
@ShapeStyle
public int getCurrentProfileImageStyle() {
return mProfileImageStyle;
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
super.onCreate(savedInstanceState);
ThemeUtils.applyToolbarItemColor(this, getActionBarToolbar(), getCurrentThemeColor());
}
@Override
public void onSupportActionModeStarted(@NonNull android.support.v7.view.ActionMode mode) {
super.onSupportActionModeStarted(mode);
ThemeUtils.applySupportActionModeColor(mode, getCurrentThemeColor(),
getThemeBackgroundOption(), true);
ThemeUtils.applySupportActionModeItemColor(mode, getCurrentThemeColor());
}
@NonNull
@Override
public ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate getDelegate() {
if (mDelegate != null) return mDelegate;
return mDelegate = ThemedAppCompatDelegateFactory.create(this, this);
}
@Override
protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) {
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
mCurrentThemeFontFamily = getThemeFontFamily();
super.onApplyThemeResource(theme, resId, first);
final Window window = getWindow();
if (shouldApplyWindowBackground()) {
ThemeUtils.applyWindowBackground(this, window, mCurrentThemeBackgroundOption,
mCurrentThemeBackgroundAlpha);
}
}
@Override
public void onContentChanged() {
super.onContentChanged();
final Window window = getWindow();
final Toolbar actionBarToolbar = (Toolbar) window.findViewById(R.id.action_bar);
final ActionBarContainer actionBarContainer = (ActionBarContainer) window.findViewById(R.id.action_bar_container);
ThemeUtils.applyActionBarBackground(actionBarContainer, this, mCurrentThemeColor,
mCurrentThemeBackgroundOption, true);
ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
final boolean result = super.onPrepareOptionsMenu(menu);
final Window window = getWindow();
final Toolbar actionBarToolbar = (Toolbar) window.findViewById(R.id.action_bar);
ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor);
return result;
}
@Override
public void setSupportActionBar(Toolbar toolbar) {
super.setSupportActionBar(toolbar);
mToolbar = toolbar;
ThemeUtils.applyToolbarItemColor(this, toolbar, mCurrentThemeColor);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
ThemeUtils.fixNightMode(getResources(), newConfig);
super.onConfigurationChanged(newConfig);
}
@Nullable
public final Toolbar peekActionBarToolbar() {
return mToolbar;
}
@Nullable
public final Toolbar getActionBarToolbar() {
if (mToolbar != null) return mToolbar;
final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (actionBarView instanceof Toolbar) {
return (Toolbar) actionBarView;
}
return null;
}
protected boolean shouldApplyWindowBackground() {
return true;
}
}

View File

@ -36,11 +36,15 @@ import android.os.Handler;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.multidex.MultiDex; import android.support.multidex.MultiDex;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatDelegate; import android.support.v7.app.AppCompatDelegate;
import com.afollestad.appthemeengine.ATE;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.AssistLauncherActivity; import org.mariotaku.twidere.activity.AssistLauncherActivity;
import org.mariotaku.twidere.activity.MainActivity; import org.mariotaku.twidere.activity.MainActivity;
import org.mariotaku.twidere.activity.MainHondaJOJOActivity; import org.mariotaku.twidere.activity.MainHondaJOJOActivity;
@ -114,6 +118,10 @@ public class TwidereApplication extends Application implements Constants,
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
StrictModeUtils.detectAllVmPolicy(); StrictModeUtils.detectAllVmPolicy();
} }
if (!ATE.config(this, null).isConfigured()) {
final int accentColor = ThemeUtils.getUserAccentColor(this);
ATE.config(this, null).primaryColor(accentColor).accentColor(accentColor).commit();
}
resetTheme(getSharedPreferences()); resetTheme(getSharedPreferences());
super.onCreate(); super.onCreate();
initializeAsyncTask(); initializeAsyncTask();
@ -255,6 +263,12 @@ public class TwidereApplication extends Application implements Constants,
resetTheme(preferences); resetTheme(preferences);
break; break;
} }
case KEY_THEME_COLOR: {
final int themeColor = preferences.getInt(key, ContextCompat.getColor(this, R.color.branding_color));
ATE.config(this, "light").primaryColor(themeColor).accentColor(themeColor).commit();
ATE.config(this, "dark").accentColor(themeColor).commit();
break;
}
} }
} }

View File

@ -60,7 +60,7 @@ import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray; import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity; import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.support.CustomTabEditorActivity; import org.mariotaku.twidere.activity.CustomTabEditorActivity;
import org.mariotaku.twidere.fragment.support.BaseSupportFragment; import org.mariotaku.twidere.fragment.support.BaseSupportFragment;
import org.mariotaku.twidere.model.CustomTabConfiguration; import org.mariotaku.twidere.model.CustomTabConfiguration;
import org.mariotaku.twidere.model.CustomTabConfiguration.CustomTabConfigurationComparator; import org.mariotaku.twidere.model.CustomTabConfiguration.CustomTabConfigurationComparator;

View File

@ -35,7 +35,6 @@ import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -43,11 +42,11 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader; import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.view.MenuItemCompat; import android.support.v4.view.MenuItemCompat;
import android.support.v7.view.SupportMenuInflater; import android.support.v7.view.SupportMenuInflater;
import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.ActionMenuView;
@ -66,23 +65,16 @@ import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import com.commonsware.cwac.merge.MergeAdapter;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.activity.QuickSearchBarActivity;
import org.mariotaku.twidere.activity.SettingsActivity; import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.activity.support.QuickSearchBarActivity;
import org.mariotaku.twidere.adapter.ArrayAdapter;
import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.menu.support.AccountToggleProvider; import org.mariotaku.twidere.menu.support.AccountToggleProvider;
import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount;
@ -96,36 +88,27 @@ import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.IntentUtils; import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback; import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.ListViewUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.MenuUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TransitionUtils; import org.mariotaku.twidere.util.TransitionUtils;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver; import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.view.ShapedImageView; import org.mariotaku.twidere.view.ShapedImageView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.inject.Inject;
public class AccountsDashboardFragment extends BaseSupportFragment implements LoaderCallbacks<Cursor>, public class AccountsDashboardFragment extends BaseSupportFragment implements LoaderCallbacks<Cursor>,
OnSharedPreferenceChangeListener, OnClickListener, KeyboardShortcutCallback, OnSharedPreferenceChangeListener, OnClickListener, KeyboardShortcutCallback,
AdapterView.OnItemClickListener { NavigationView.OnNavigationItemSelectedListener {
private final Rect mSystemWindowsInsets = new Rect(); private final Rect mSystemWindowsInsets = new Rect();
private ContentResolver mResolver; private ContentResolver mResolver;
private MergeAdapter mAdapter;
private AccountSelectorAdapter mAccountsAdapter; private AccountSelectorAdapter mAccountsAdapter;
private AccountOptionsAdapter mAccountOptionsAdapter;
private AppMenuAdapter mAppMenuAdapter;
private ListView mListView; private NavigationView mNavigationView;
private View mAccountSelectorView; private View mAccountSelectorView;
private RecyclerView mAccountsSelector; private RecyclerView mAccountsSelector;
private ImageView mAccountProfileBannerView; private ImageView mAccountProfileBannerView;
@ -197,25 +180,24 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
return false; return false;
} }
} }
final int firstVisiblePosition = ListViewUtils.getFirstFullyVisiblePosition(mListView); // final int selectedItem = mNavigationView.getSelectedItemPosition();
final int selectedItem = mListView.getSelectedItemPosition(); // final int count = mNavigationView.getCount();
final int count = mListView.getCount(); // int resultPosition;
int resultPosition; // if (!mNavigationView.isFocused() || selectedItem == ListView.INVALID_POSITION) {
if (!mListView.isFocused() || selectedItem == ListView.INVALID_POSITION) { // resultPosition = firstVisiblePosition;
resultPosition = firstVisiblePosition; // } else {
} else { // resultPosition = selectedItem + offset;
resultPosition = selectedItem + offset; // while (resultPosition >= 0 && resultPosition < count && !mAdapter.isEnabled(resultPosition)) {
while (resultPosition >= 0 && resultPosition < count && !mAdapter.isEnabled(resultPosition)) { // resultPosition += offset;
resultPosition += offset; // }
} // }
} // final View focusedChild = mNavigationView.getFocusedChild();
final View focusedChild = mListView.getFocusedChild(); // if (focusedChild == null) {
if (focusedChild == null) { // mNavigationView.requestChildFocus(mNavigationView.getChildAt(0), null);
mListView.requestChildFocus(mListView.getChildAt(0), null); // }
} // if (resultPosition >= 0 && resultPosition < count) {
if (resultPosition >= 0 && resultPosition < count) { // mNavigationView.setSelection(resultPosition);
mListView.setSelection(resultPosition); // }
}
return true; return true;
} }
@ -225,8 +207,8 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
case REQUEST_SETTINGS: { case REQUEST_SETTINGS: {
if (data == null) return; if (data == null) return;
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
if (data.getBooleanExtra(EXTRA_CHANGED, false) && activity instanceof IThemedActivity) { if (data.getBooleanExtra(EXTRA_CHANGED, false)) {
((IThemedActivity) activity).restart(); activity.recreate();
} }
return; return;
} }
@ -298,8 +280,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
} }
mAccountsAdapter.setSelectedAccountKey(accountKey); mAccountsAdapter.setSelectedAccountKey(accountKey);
mAccountOptionsAdapter.setSelectedAccount(mAccountsAdapter.getSelectedAccount());
if (mAccountActionProvider != null) { if (mAccountActionProvider != null) {
mAccountActionProvider.setExclusive(false); mAccountActionProvider.setExclusive(false);
mAccountActionProvider.setAccounts(accounts); mAccountActionProvider.setAccounts(accounts);
@ -313,87 +293,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
public void onLoaderReset(final Loader<Cursor> loader) { public void onLoaderReset(final Loader<Cursor> loader) {
} }
@Override
public void onItemClick(final AdapterView<?> parent, final View v, final int position, final long id) {
final ListAdapter adapter = mAdapter.getAdapter(position);
final Object item = mAdapter.getItem(position);
if (adapter instanceof AccountOptionsAdapter) {
final ParcelableAccount account = mAccountsAdapter.getSelectedAccount();
if (account == null || !(item instanceof OptionItem)) return;
final OptionItem option = (OptionItem) item;
switch (option.id) {
case R.id.search: {
final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class);
intent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
startActivity(intent);
closeAccountsDrawer();
break;
}
case R.id.compose: {
final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE);
composeIntent.setClass(getActivity(), ComposeActivity.class);
composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
startActivity(composeIntent);
break;
}
case R.id.favorites: {
IntentUtils.openUserFavorites(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.lists: {
IntentUtils.openUserLists(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.groups: {
IntentUtils.openUserGroups(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.public_timeline: {
IntentUtils.openPublicTimeline(getActivity(), account.account_key);
break;
}
case R.id.messages: {
IntentUtils.openDirectMessages(getActivity(), account.account_key);
break;
}
case R.id.interactions: {
IntentUtils.openInteractions(getActivity(), account.account_key);
break;
}
case R.id.edit: {
IntentUtils.openProfileEditor(getActivity(), account.account_key);
break;
}
}
} else if (adapter instanceof AppMenuAdapter) {
if (!(item instanceof OptionItem)) return;
final OptionItem option = (OptionItem) item;
switch (option.id) {
case R.id.accounts: {
IntentUtils.openAccountsManager(getActivity());
break;
}
case R.id.drafts: {
IntentUtils.openDrafts(getActivity());
break;
}
case R.id.filters: {
IntentUtils.openFilters(getActivity());
break;
}
case R.id.settings: {
final Intent intent = new Intent(getActivity(), SettingsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(intent, REQUEST_SETTINGS);
break;
}
}
closeAccountsDrawer();
}
}
@Override @Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
@ -410,9 +309,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
private void updateSystemWindowsInsets() { private void updateSystemWindowsInsets() {
if (mAccountProfileContainer == null) return; if (mAccountProfileContainer == null) return;
final HomeActivity activity = (HomeActivity) getActivity();
final Rect insets = mSystemWindowsInsets; final Rect insets = mSystemWindowsInsets;
if (!activity.getDefaultSystemWindowsInsets(insets)) return;
final int top = Utils.getInsetsTopWithoutActionBarHeight(getActivity(), insets.top); final int top = Utils.getInsetsTopWithoutActionBarHeight(getActivity(), insets.top);
mAccountProfileContainer.setPadding(0, top, 0, 0); mAccountProfileContainer.setPadding(0, top, 0, 0);
} }
@ -424,28 +321,14 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
final View view = getView(); final View view = getView();
assert view != null; assert view != null;
final Context context = view.getContext(); final Context context = view.getContext();
mListView.setItemsCanFocus(true);
mAdapter = new MergeAdapter();
final LayoutInflater inflater = getLayoutInflater(savedInstanceState); final LayoutInflater inflater = getLayoutInflater(savedInstanceState);
mAccountsAdapter = new AccountSelectorAdapter(inflater, this); mAccountsAdapter = new AccountSelectorAdapter(inflater, this);
mAccountOptionsAdapter = new AccountOptionsAdapter(context);
mAppMenuAdapter = new AppMenuAdapter(context);
mAccountSelectorView = inflater.inflate(R.layout.header_drawer_account_selector, mListView, false);
mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.other_accounts_list);
final LinearLayoutManager layoutManager = new FixedLinearLayoutManager(context); final LinearLayoutManager layoutManager = new FixedLinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
layoutManager.setStackFromEnd(true); layoutManager.setStackFromEnd(true);
mAccountsSelector.setLayoutManager(layoutManager); mAccountsSelector.setLayoutManager(layoutManager);
mAccountsSelector.setAdapter(mAccountsAdapter); mAccountsSelector.setAdapter(mAccountsAdapter);
mAccountsSelector.setItemAnimator(null); mAccountsSelector.setItemAnimator(null);
mAccountProfileContainer = mAccountSelectorView.findViewById(R.id.profile_container);
mNoAccountContainer = mAccountSelectorView.findViewById(R.id.no_account_container);
mAccountProfileImageView = (ShapedImageView) mAccountSelectorView.findViewById(R.id.profile_image);
mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.account_profile_banner);
mFloatingProfileImageSnapshotView = (ImageView) mAccountSelectorView.findViewById(R.id.floating_profile_image_snapshot);
mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name);
mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name);
mAccountsToggleMenu = (ActionMenuView) mAccountSelectorView.findViewById(R.id.account_dashboard_menu);
final SupportMenuInflater menuInflater = new SupportMenuInflater(context); final SupportMenuInflater menuInflater = new SupportMenuInflater(context);
menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, mAccountsToggleMenu.getMenu()); menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, mAccountsToggleMenu.getMenu());
mAccountsToggleMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { mAccountsToggleMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@ -479,13 +362,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
}); });
mAccountProfileContainer.setOnClickListener(this); mAccountProfileContainer.setOnClickListener(this);
mNavigationView.setNavigationItemSelectedListener(this);
mAdapter.addView(mAccountSelectorView, true);
mAdapter.addAdapter(mAccountOptionsAdapter);
mAdapter.addView(inflater.inflate(R.layout.layout_divider_drawer, mListView, false), false);
mAdapter.addAdapter(mAppMenuAdapter);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
mPreferences.registerOnSharedPreferenceChangeListener(this); mPreferences.registerOnSharedPreferenceChangeListener(this);
loadAccounts(); loadAccounts();
@ -510,7 +387,17 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
@Override @Override
public void onBaseViewCreated(View view, Bundle savedInstanceState) { public void onBaseViewCreated(View view, Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState); super.onBaseViewCreated(view, savedInstanceState);
mListView = (ListView) view.findViewById(android.R.id.list); mNavigationView = (NavigationView) view.findViewById(R.id.navigation_view);
mAccountSelectorView = mNavigationView.getHeaderView(0);
mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.other_accounts_list);
mAccountProfileContainer = mAccountSelectorView.findViewById(R.id.profile_container);
mNoAccountContainer = mAccountSelectorView.findViewById(R.id.no_account_container);
mAccountProfileImageView = (ShapedImageView) mAccountSelectorView.findViewById(R.id.profile_image);
mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.account_profile_banner);
mFloatingProfileImageSnapshotView = (ImageView) mAccountSelectorView.findViewById(R.id.floating_profile_image_snapshot);
mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name);
mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name);
mAccountsToggleMenu = (ActionMenuView) mAccountSelectorView.findViewById(R.id.account_dashboard_menu);
} }
@Override @Override
@ -552,40 +439,35 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
} }
} }
} }
mAccountOptionsAdapter.clear(); final Menu menu = mNavigationView.getMenu();
mAccountOptionsAdapter.add(new OptionItem(R.string.search, MenuUtils.setMenuItemAvailability(menu, R.id.interactions, !hasInteractionsTab);
R.drawable.ic_action_search, R.id.search)); MenuUtils.setMenuItemAvailability(menu, R.id.messages, !hasDmTab);
if (!hasInteractionsTab) {
mAccountOptionsAdapter.add(new OptionItem(R.string.interactions,
R.drawable.ic_action_notification, R.id.interactions));
}
if (!hasDmTab) {
mAccountOptionsAdapter.add(new OptionItem(R.string.direct_messages,
R.drawable.ic_action_message, R.id.messages));
}
if (mUseStarsForLikes) { if (mUseStarsForLikes) {
mAccountOptionsAdapter.add(new OptionItem(R.string.favorites, R.drawable.ic_action_star, MenuUtils.setMenuItemTitle(menu, R.id.favorites, R.string.favorites);
R.id.favorites)); MenuUtils.setMenuItemIcon(menu, R.id.favorites, R.drawable.ic_action_star);
} else { } else {
mAccountOptionsAdapter.add(new OptionItem(R.string.likes, R.drawable.ic_action_heart, MenuUtils.setMenuItemTitle(menu, R.id.favorites, R.string.likes);
R.id.favorites)); MenuUtils.setMenuItemIcon(menu, R.id.favorites, R.drawable.ic_action_heart);
} }
boolean hasLists = false, hasGroups = false, hasPublicTimeline = false;
switch (ParcelableAccountUtils.getAccountType(account)) { switch (ParcelableAccountUtils.getAccountType(account)) {
case ParcelableAccount.Type.TWITTER: { case ParcelableAccount.Type.TWITTER: {
mAccountOptionsAdapter.add(new OptionItem(R.string.lists, R.drawable.ic_action_list, hasLists = true;
R.id.lists));
break; break;
} }
case ParcelableAccount.Type.STATUSNET: { case ParcelableAccount.Type.STATUSNET: {
mAccountOptionsAdapter.add(new OptionItem(R.string.groups, R.drawable.ic_action_list, hasGroups = true;
R.id.groups));
break; break;
} }
case ParcelableAccount.Type.FANFOU: { case ParcelableAccount.Type.FANFOU: {
mAccountOptionsAdapter.add(new OptionItem(R.string.public_timeline, R.drawable.ic_action_quote, hasPublicTimeline = true;
R.id.public_timeline)); break;
} }
} }
MenuUtils.setMenuItemAvailability(menu, R.id.groups, hasGroups);
MenuUtils.setMenuItemAvailability(menu, R.id.lists, hasLists);
MenuUtils.setMenuItemAvailability(menu, R.id.public_timeline, hasPublicTimeline);
} }
private boolean hasAccountInTab(SupportTabSpec tab, UserKey accountId, boolean isActivated) { private boolean hasAccountInTab(SupportTabSpec tab, UserKey accountId, boolean isActivated) {
@ -693,7 +575,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
editor.putString(KEY_DEFAULT_ACCOUNT_KEY, account.account_key.toString()); editor.putString(KEY_DEFAULT_ACCOUNT_KEY, account.account_key.toString());
editor.apply(); editor.apply();
mAccountsAdapter.setSelectedAccountKey(account.account_key); mAccountsAdapter.setSelectedAccountKey(account.account_key);
mAccountOptionsAdapter.setSelectedAccount(account);
updateAccountActions(); updateAccountActions();
updateAccountOptionsSeparatorLabel(clickedDrawable); updateAccountOptionsSeparatorLabel(clickedDrawable);
snapshotView.setVisibility(View.INVISIBLE); snapshotView.setVisibility(View.INVISIBLE);
@ -743,37 +624,80 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
private void updateDefaultAccountState() { private void updateDefaultAccountState() {
} }
public static final class AccountOptionsAdapter extends OptionItemsAdapter { @Override
public boolean onNavigationItemSelected(MenuItem item) {
private final boolean mNameFirst; final ParcelableAccount account = mAccountsAdapter.getSelectedAccount();
private ParcelableAccount mSelectedAccount; if (account == null) return false;
switch (item.getItemId()) {
AccountOptionsAdapter(final Context context) { case R.id.search: {
super(context); final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class);
mNameFirst = mPreferences.getBoolean(KEY_NAME_FIRST); intent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
} startActivity(intent);
closeAccountsDrawer();
public void setSelectedAccount(ParcelableAccount account) { break;
mSelectedAccount = account; }
notifyDataSetChanged(); case R.id.compose: {
} final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE);
composeIntent.setClass(getActivity(), ComposeActivity.class);
@Override composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key);
public boolean isEnabled(final int position) { startActivity(composeIntent);
return mSelectedAccount != null; break;
} }
case R.id.favorites: {
@Override IntentUtils.openUserFavorites(getActivity(), account.account_key,
protected String getTitle(int position, OptionItem option) { account.account_key.getId(), account.screen_name);
final ParcelableAccount account = mSelectedAccount; break;
if (account != null && option.id == R.id.compose) { }
final Context context = getContext(); case R.id.lists: {
final String displayName = UserColorNameManager.getDisplayName(account.name, IntentUtils.openUserLists(getActivity(), account.account_key,
account.screen_name, mNameFirst); account.account_key.getId(), account.screen_name);
return context.getString(R.string.tweet_from_name, displayName); break;
}
case R.id.groups: {
IntentUtils.openUserGroups(getActivity(), account.account_key,
account.account_key.getId(), account.screen_name);
break;
}
case R.id.public_timeline: {
IntentUtils.openPublicTimeline(getActivity(), account.account_key);
break;
}
case R.id.messages: {
IntentUtils.openDirectMessages(getActivity(), account.account_key);
break;
}
case R.id.interactions: {
IntentUtils.openInteractions(getActivity(), account.account_key);
break;
}
case R.id.edit: {
IntentUtils.openProfileEditor(getActivity(), account.account_key);
break;
}
case R.id.accounts: {
IntentUtils.openAccountsManager(getActivity());
closeAccountsDrawer();
break;
}
case R.id.drafts: {
IntentUtils.openDrafts(getActivity());
closeAccountsDrawer();
break;
}
case R.id.filters: {
IntentUtils.openFilters(getActivity());
closeAccountsDrawer();
break;
}
case R.id.settings: {
final Intent intent = new Intent(getActivity(), SettingsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(intent, REQUEST_SETTINGS);
closeAccountsDrawer();
break;
} }
return super.getTitle(position, option);
} }
return false;
} }
static class AccountProfileImageViewHolder extends ViewHolder implements OnClickListener { static class AccountProfileImageViewHolder extends ViewHolder implements OnClickListener {
@ -922,17 +846,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
} }
} }
private static final class AppMenuAdapter extends OptionItemsAdapter {
public AppMenuAdapter(final Context context) {
super(context);
add(new OptionItem(R.string.accounts, R.drawable.ic_action_accounts, R.id.accounts));
add(new OptionItem(R.string.drafts, R.drawable.ic_action_draft, R.id.drafts));
add(new OptionItem(R.string.filters, R.drawable.ic_action_speaker_muted, R.id.filters));
add(new OptionItem(R.string.settings, R.drawable.ic_action_settings, R.id.settings));
}
}
public static class OptionItem { public static class OptionItem {
@ -972,35 +885,4 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
} }
public static abstract class OptionItemsAdapter extends ArrayAdapter<OptionItem> {
@Inject
UserColorNameManager mUserColorNameManager;
@Inject
SharedPreferencesWrapper mPreferences;
private final int mActionIconColor;
OptionItemsAdapter(final Context context) {
super(context, R.layout.list_item_dashboard_menu);
GeneralComponentHelper.build(context).inject(this);
mActionIconColor = ThemeUtils.getThemeForegroundColor(context);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final OptionItem option = getItem(position);
final TextView text1 = (TextView) view.findViewById(android.R.id.text1);
final ImageView icon = (ImageView) view.findViewById(android.R.id.icon);
text1.setText(getTitle(position, option));
icon.setImageDrawable(ResourcesCompat.getDrawable(icon.getResources(), option.icon, null));
icon.setColorFilter(mActionIconColor, Mode.SRC_ATOP);
return view;
}
protected String getTitle(int position, OptionItem option) {
return getContext().getString(option.name);
}
}
} }

View File

@ -41,8 +41,8 @@ import org.mariotaku.sqliteqb.library.ArgsArray;
import org.mariotaku.sqliteqb.library.Columns; import org.mariotaku.sqliteqb.library.Columns;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.SignInActivity; import org.mariotaku.twidere.activity.SignInActivity;
import org.mariotaku.twidere.adapter.AccountsAdapter; import org.mariotaku.twidere.adapter.AccountsAdapter;
import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.UserKey; import org.mariotaku.twidere.model.UserKey;

View File

@ -56,8 +56,7 @@ import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray; import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.UserListSelectorActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter; import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter;
import org.mariotaku.twidere.adapter.SourceAutoCompleteAdapter; import org.mariotaku.twidere.adapter.SourceAutoCompleteAdapter;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
@ -131,12 +130,6 @@ public abstract class BaseFiltersFragment extends AbsContentListViewFragment<Sim
@Override @Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) { public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
mActionMode = mode; mActionMode = mode;
final FragmentActivity activity = getActivity();
if (activity instanceof IThemedActivity) {
ThemeUtils.applySupportActionModeColor(mode,
((IThemedActivity) activity).getCurrentThemeColor(),
((IThemedActivity) activity).getThemeBackgroundOption(), true);
}
setControlVisible(true); setControlVisible(true);
mode.getMenuInflater().inflate(R.menu.action_multi_select_items, menu); mode.getMenuInflater().inflate(R.menu.action_multi_select_items, menu);
return true; return true;
@ -145,11 +138,6 @@ public abstract class BaseFiltersFragment extends AbsContentListViewFragment<Sim
@Override @Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) { public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
updateTitle(mode); updateTitle(mode);
final FragmentActivity activity = getActivity();
if (activity instanceof IThemedActivity) {
ThemeUtils.applySupportActionModeItemColor(mode,
((IThemedActivity) activity).getCurrentThemeColor());
}
return true; return true;
} }

View File

@ -29,17 +29,12 @@ import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManagerAccessor;
import android.support.v4.text.BidiFormatter; import android.support.v4.text.BidiFormatter;
import android.support.v4.view.LayoutInflaterCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.fragment.iface.IBaseFragment; import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
@ -50,7 +45,6 @@ import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.NotificationManagerWrapper; import org.mariotaku.twidere.util.NotificationManagerWrapper;
import org.mariotaku.twidere.util.ReadStateManager; import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.TwidereValidator; import org.mariotaku.twidere.util.TwidereValidator;
import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
@ -173,19 +167,6 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
mActionHelper.dispatchOnResumeFragments(); mActionHelper.dispatchOnResumeFragments();
} }
@Override
public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
if (!(activity instanceof IThemedActivity)) {
return super.getLayoutInflater(savedInstanceState);
}
final LayoutInflater inflater = activity.getLayoutInflater().cloneInContext(getThemedContext());
getChildFragmentManager(); // Init if needed; use raw implementation below.
final LayoutInflaterFactory delegate = FragmentManagerAccessor.getLayoutInflaterFactory(getChildFragmentManager());
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory((IThemedActivity) activity, delegate));
return inflater;
}
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();

View File

@ -38,7 +38,7 @@ import org.mariotaku.sqliteqb.library.ArgsArray;
import org.mariotaku.sqliteqb.library.Columns.Column; import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter; import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.loader.ExtendedObjectCursorLoader; import org.mariotaku.twidere.loader.ExtendedObjectCursorLoader;

View File

@ -38,7 +38,7 @@ import org.mariotaku.sqliteqb.library.ArgsArray;
import org.mariotaku.sqliteqb.library.Columns.Column; import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter; import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter; import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;

View File

@ -47,8 +47,8 @@ import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity; import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter; import org.mariotaku.twidere.adapter.MessageEntriesAdapter;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter.DirectMessageEntry; import org.mariotaku.twidere.adapter.MessageEntriesAdapter.DirectMessageEntry;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter.MessageEntriesAdapterListener; import org.mariotaku.twidere.adapter.MessageEntriesAdapter.MessageEntriesAdapterListener;

View File

@ -34,7 +34,7 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity; import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment; import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface; import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;

View File

@ -32,7 +32,7 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity; import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface; import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;

View File

@ -75,8 +75,8 @@ import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.OrderBy; import org.mariotaku.sqliteqb.library.OrderBy;
import org.mariotaku.sqliteqb.library.RawItemArray; import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; import org.mariotaku.twidere.activity.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity; import org.mariotaku.twidere.activity.ThemedImagePickerActivity;
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter; import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.adapter.MessageConversationAdapter; import org.mariotaku.twidere.adapter.MessageConversationAdapter;
import org.mariotaku.twidere.adapter.SimpleParcelableUsersAdapter; import org.mariotaku.twidere.adapter.SimpleParcelableUsersAdapter;

View File

@ -44,8 +44,8 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener; import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity; import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity; import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface; import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;

View File

@ -85,7 +85,7 @@ import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter; import org.mariotaku.twidere.adapter.BaseRecyclerViewAdapter;
import org.mariotaku.twidere.adapter.LoadMoreSupportAdapter; import org.mariotaku.twidere.adapter.LoadMoreSupportAdapter;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter; import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;

View File

@ -85,11 +85,11 @@ import org.apache.commons.lang3.ObjectUtils;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity; import org.mariotaku.twidere.activity.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity; import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.activity.support.ThemedAppCompatActivity; import org.mariotaku.twidere.activity.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity; import org.mariotaku.twidere.activity.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterException;

View File

@ -58,8 +58,8 @@ import com.rengwuxian.materialedittext.MaterialEditText;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity; import org.mariotaku.twidere.activity.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity; import org.mariotaku.twidere.activity.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.adapter.SupportTabsAdapter;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterException;

View File

@ -50,8 +50,8 @@ import com.rengwuxian.materialedittext.MaterialEditText;
import com.twitter.Validator; import com.twitter.Validator;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity; import org.mariotaku.twidere.activity.ThemedImagePickerActivity;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.ProfileUpdate; import org.mariotaku.twidere.api.twitter.model.ProfileUpdate;

View File

@ -1,53 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.preference;
import android.content.Context;
import android.util.AttributeSet;
import org.jraf.android.backport.switchwidget.SwitchPreference;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ThemeUtils;
public class DarkLightThemeTogglePreference extends SwitchPreference implements Constants {
public DarkLightThemeTogglePreference(final Context context) {
this(context, null);
}
public DarkLightThemeTogglePreference(final Context context, final AttributeSet attrs) {
this(context, attrs, R.attr.asb_switchPreferenceStyle);
}
public DarkLightThemeTogglePreference(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected boolean getPersistedBoolean(final boolean defaultReturnValue) {
return ThemeUtils.isDarkTheme(getPersistedString(VALUE_THEME_NAME_LIGHT));
}
@Override
protected boolean persistBoolean(final boolean value) {
return persistString(value ? VALUE_THEME_NAME_DARK : VALUE_THEME_NAME_LIGHT);
}
}

View File

@ -43,7 +43,7 @@ import android.widget.Toast;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.APIEditorActivity; import org.mariotaku.twidere.activity.APIEditorActivity;
import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.preference.iface.IDialogPreference; import org.mariotaku.twidere.preference.iface.IDialogPreference;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;

View File

@ -77,7 +77,7 @@ import org.mariotaku.sqliteqb.library.query.SQLSelectQuery;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.activity.HomeActivity;
import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.annotation.NotificationType; import org.mariotaku.twidere.annotation.NotificationType;
import org.mariotaku.twidere.annotation.ReadPositionTag; import org.mariotaku.twidere.annotation.ReadPositionTag;

View File

@ -27,7 +27,7 @@ import android.os.Bundle;
import org.apache.commons.collections.primitives.ArrayIntList; import org.apache.commons.collections.primitives.ArrayIntList;
import org.apache.commons.collections.primitives.IntList; import org.apache.commons.collections.primitives.IntList;
import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.activity.HomeActivity;
import edu.tsinghua.hotmobi.HotMobiLogger; import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.PreProcessing; import edu.tsinghua.hotmobi.PreProcessing;

View File

@ -20,7 +20,7 @@ import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.activity.support.MediaViewerActivity; import org.mariotaku.twidere.activity.MediaViewerActivity;
import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment; import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment;
import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.fragment.support.UserFragment;

View File

@ -12,8 +12,8 @@ import android.view.KeyEvent;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ComposeActivity; import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.support.QuickSearchBarActivity; import org.mariotaku.twidere.activity.QuickSearchBarActivity;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.constant.KeyboardShortcutConstants; import org.mariotaku.twidere.constant.KeyboardShortcutConstants;

View File

@ -27,8 +27,10 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
@ -43,8 +45,8 @@ import android.view.MenuItem;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity; import org.mariotaku.twidere.activity.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.ColorPickerDialogActivity;
import org.mariotaku.twidere.constant.IntentConstants; import org.mariotaku.twidere.constant.IntentConstants;
import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.constant.SharedPreferenceConstants;
import org.mariotaku.twidere.fragment.support.AbsStatusesFragment; import org.mariotaku.twidere.fragment.support.AbsStatusesFragment;
@ -81,7 +83,7 @@ public class MenuUtils implements Constants {
item.setChecked(checked); item.setChecked(checked);
} }
public static void setMenuItemIcon(final Menu menu, final int id, final int icon) { public static void setMenuItemIcon(final Menu menu, final int id, @DrawableRes final int icon) {
if (menu == null) return; if (menu == null) return;
final MenuItem item = menu.findItem(id); final MenuItem item = menu.findItem(id);
if (item == null) return; if (item == null) return;
@ -96,7 +98,7 @@ public class MenuUtils implements Constants {
MenuItemCompat.setShowAsAction(item, flags); MenuItemCompat.setShowAsAction(item, flags);
} }
public static void setMenuItemTitle(final Menu menu, final int id, final int icon) { public static void setMenuItemTitle(final Menu menu, final int id, @StringRes final int icon) {
if (menu == null) return; if (menu == null) return;
final MenuItem item = menu.findItem(id); final MenuItem item = menu.findItem(id);
if (item == null) return; if (item == null) return;

View File

@ -33,7 +33,7 @@ import com.twitter.Extractor;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; import org.mariotaku.twidere.activity.BaseAppCompatActivity;
import org.mariotaku.twidere.menu.AccountActionProvider; import org.mariotaku.twidere.menu.AccountActionProvider;
import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;

View File

@ -28,7 +28,7 @@ import org.mariotaku.restfu.http.HttpRequest;
import org.mariotaku.restfu.http.HttpResponse; import org.mariotaku.restfu.http.HttpResponse;
import org.mariotaku.restfu.http.RestHttpClient; import org.mariotaku.restfu.http.RestHttpClient;
import org.mariotaku.restfu.http.mime.Body; import org.mariotaku.restfu.http.mime.Body;
import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity; import org.mariotaku.twidere.activity.ThemedImagePickerActivity;
import org.mariotaku.twidere.util.dagger.DependencyHolder; import org.mariotaku.twidere.util.dagger.DependencyHolder;
import java.io.IOException; import java.io.IOException;

View File

@ -36,12 +36,7 @@ import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate; import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.WindowDecorActionBar;
import android.support.v7.app.WindowDecorActionBar.ActionModeImpl;
import android.support.v7.view.StandaloneActionMode;
import android.support.v7.view.SupportActionModeWrapperAccessor;
import android.support.v7.view.menu.ActionMenuItemView; import android.support.v7.view.menu.ActionMenuItemView;
import android.support.v7.widget.ActionBarContainer; import android.support.v7.widget.ActionBarContainer;
import android.support.v7.widget.ActionBarContextView; import android.support.v7.widget.ActionBarContextView;
@ -52,7 +47,6 @@ import android.support.v7.widget.Toolbar;
import android.support.v7.widget.TwidereToolbar; import android.support.v7.widget.TwidereToolbar;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.ActionMode;
import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.Menu; import android.view.Menu;
@ -63,13 +57,12 @@ import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.LinkHandlerActivity;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.graphic.ActionBarColorDrawable; import org.mariotaku.twidere.graphic.ActionBarColorDrawable;
import org.mariotaku.twidere.graphic.ActionIconDrawable; import org.mariotaku.twidere.graphic.ActionIconDrawable;
import org.mariotaku.twidere.graphic.iface.DoNotWrapDrawable; import org.mariotaku.twidere.graphic.iface.DoNotWrapDrawable;
@ -96,15 +89,6 @@ public class ThemeUtils implements Constants {
} }
public static void applyActionBarBackground(final ActionBar actionBar, final Context context,
final int accentColor, String backgroundOption, boolean outlineEnabled) {
if (actionBar == null || context == null) return;
actionBar.setBackgroundDrawable(getActionBarBackground(context, accentColor, backgroundOption, outlineEnabled));
actionBar.setSplitBackgroundDrawable(getActionBarSplitBackground(context));
actionBar.setStackedBackgroundDrawable(getActionBarStackedBackground(context, accentColor, backgroundOption, outlineEnabled));
}
public static void applyActionBarBackground(final ActionBarContainer actionBar, final Context context, public static void applyActionBarBackground(final ActionBarContainer actionBar, final Context context,
final int accentColor, String backgroundOption, boolean outlineEnabled) { final int accentColor, String backgroundOption, boolean outlineEnabled) {
if (actionBar == null || context == null) return; if (actionBar == null || context == null) return;
@ -139,77 +123,6 @@ public class ThemeUtils implements Constants {
} }
} }
public static void applySupportActionModeColor(final ActionMode mode,
int accentColor, String backgroundOption,
boolean outlineEnabled) {
android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperAccessor.getWrappedObject(mode);
if (modeCompat == null) return;
applySupportActionModeColor(modeCompat, accentColor, backgroundOption,
outlineEnabled);
}
public static void applySupportActionModeColor(final android.support.v7.view.ActionMode modeCompat,
int accentColor, String backgroundOption,
boolean outlineEnabled) {
// Very dirty implementation
// This call ensures TitleView created
modeCompat.setTitle(modeCompat.getTitle());
final View contextView = findActionBarContextView(modeCompat);
if (!(contextView instanceof ActionBarContextView)) return;
setActionBarContextViewBackground((ActionBarContextView) contextView, accentColor,
backgroundOption, outlineEnabled);
}
public static void applySupportActionModeItemColor(final ActionMode mode, int accentColor) {
android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperAccessor.getWrappedObject(mode);
if (modeCompat == null) return;
applySupportActionModeItemColor(modeCompat, accentColor);
}
public static void applySupportActionModeItemColor(final android.support.v7.view.ActionMode modeCompat,
int accentColor) {
// Very dirty implementation
// This call ensures TitleView created
modeCompat.setTitle(modeCompat.getTitle());
final View contextView = findActionBarContextView(modeCompat);
if (!(contextView instanceof ActionBarContextView)) return;
setActionBarContextViewItemColor((ActionBarContextView) contextView, accentColor);
}
private static void setActionBarContextViewItemColor(ActionBarContextView contextView, int toolbarColor) {
final Context context = contextView.getContext();
final int contrastForegroundColor = getContrastForegroundColor(context, toolbarColor);
if (isDarkTheme(context)) {
return;
}
final View titleView = contextView.findViewById(R.id.action_bar_title);
final View subtitleView = contextView.findViewById(R.id.action_bar_subtitle);
final View closeButton = contextView.findViewById(R.id.action_mode_close_button);
if (titleView instanceof TextView) {
((TextView) titleView).setTextColor(contrastForegroundColor);
}
if (subtitleView instanceof TextView) {
((TextView) subtitleView).setTextColor(contrastForegroundColor);
}
if (closeButton instanceof ImageView) {
((ImageView) closeButton).setColorFilter(contrastForegroundColor, Mode.SRC_ATOP);
}
}
private static View findActionBarContextView(final android.support.v7.view.ActionMode modeCompat) {
if (modeCompat instanceof ActionModeImpl) {
WindowDecorActionBar actionBar = (WindowDecorActionBar) Utils.findFieldOfTypes(modeCompat,
ActionModeImpl.class, WindowDecorActionBar.class);
if (actionBar == null) return null;
return (View) Utils.findFieldOfTypes(actionBar, WindowDecorActionBar.class,
ActionBarContextView.class);
} else if (modeCompat instanceof StandaloneActionMode) {
return (View) Utils.findFieldOfTypes(modeCompat, StandaloneActionMode.class,
ActionBarContextView.class);
}
return null;
}
public static void setActionBarContextViewBackground(@NonNull ActionBarContextView contextView, public static void setActionBarContextViewBackground(@NonNull ActionBarContextView contextView,
int accentColor, int accentColor,
String backgroundOption, boolean outlineEnabled) { String backgroundOption, boolean outlineEnabled) {
@ -1019,6 +932,15 @@ public class ThemeUtils implements Constants {
| Configuration.UI_MODE_NIGHT_YES; | Configuration.UI_MODE_NIGHT_YES;
} }
public static String getATEKey(Context context) {
TypedValue value = new TypedValue();
if (!context.getTheme().resolveAttribute(R.attr.ateThemeKey, value, true)) {
return "dark";
}
if (TextUtils.isEmpty(value.string)) return "dark";
return String.valueOf(value.string);
}
public static final class ActionBarContextThemeWrapper extends android.support.v7.view.ContextThemeWrapper { public static final class ActionBarContextThemeWrapper extends android.support.v7.view.ContextThemeWrapper {

View File

@ -1,269 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.LayoutInflaterFactory;
import android.support.v4.view.TintableBackgroundView;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.app.AppCompatDelegateAccessor;
import android.support.v7.view.ContextThemeWrapper;
import android.support.v7.widget.TwidereToolbar;
import android.util.AttributeSet;
import android.view.InflateException;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.rengwuxian.materialedittext.MaterialEditText;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.ProfileImageView;
import org.mariotaku.twidere.view.ShapedImageView;
import org.mariotaku.twidere.view.WizardHighlightTextView;
import org.mariotaku.twidere.view.iface.IThemeAccentView;
import org.mariotaku.twidere.view.iface.IThemeBackgroundTintView;
import org.mariotaku.twidere.view.themed.ThemedTextView;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by mariotaku on 15/4/22.
*/
public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory {
private static final String[] sCustomViewPrefixWhiteList = {"org.mariotaku.twidere.view"};
private static final Map<String, Constructor> sConstructorCache = new HashMap<>();
private final IThemedActivity activity;
private final LayoutInflaterFactory delegate;
public ThemedLayoutInflaterFactory(IThemedActivity activity, LayoutInflaterFactory delegate) {
this.activity = activity;
this.delegate = delegate;
}
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
View view = delegate.onCreateView(parent, name, context, attrs);
if (view == null) {
view = createCustomView(name, context, attrs);
}
initView(view, activity);
return view;
}
public static View createCustomView(String name, Context context, AttributeSet attrs) {
if (!name.contains(".")) return null;
boolean whiteListed = false;
for (String prefix : sCustomViewPrefixWhiteList) {
if (name.startsWith(prefix)) {
whiteListed = true;
break;
}
}
if (!whiteListed) return null;
//noinspection TryWithIdenticalCatches
try {
Constructor<?> constructor = sConstructorCache.get(name);
if (constructor == null) {
final Class<?> viewCls = Class.forName(name);
if (!View.class.isAssignableFrom(viewCls)) return null;
constructor = viewCls.getConstructor(Context.class, AttributeSet.class);
sConstructorCache.put(name, constructor);
}
return (View) constructor.newInstance(context, attrs);
} catch (ClassNotFoundException ignore) {
} catch (NoSuchMethodException e) {
throw new InflateException(e);
} catch (InvocationTargetException e) {
throw new InflateException(e);
} catch (InstantiationException e) {
throw new InflateException(e);
} catch (IllegalAccessException e) {
throw new InflateException(e);
}
return null;
}
public static void initView(View view, IThemedActivity activity) {
if (view == null) return;
if (view instanceof ShapedImageView) {
final ShapedImageView shapedImageView = (ShapedImageView) view;
shapedImageView.setStyle(activity.getCurrentProfileImageStyle());
}
if (view instanceof ProfileImageView) {
final ProfileImageView profileImageView = (ProfileImageView) view;
profileImageView.setOval(activity.getCurrentProfileImageStyle() == ShapedImageView.SHAPE_CIRCLE);
}
if (view instanceof ThemedTextView) {
final String fontFamily = activity.getCurrentThemeFontFamily();
final TextView textView = (TextView) view;
final Typeface defTypeface = textView.getTypeface();
textView.setTypeface(ThemeUtils.getUserTypeface((Context) activity, fontFamily, defTypeface));
}
initViewTint(view, activity);
}
private static void initViewTint(View view, IThemedActivity activity) {
final int noTintColor, accentColor, backgroundTintColor;
final boolean isColorTint;
// View context is not derived from ActionBar, apply color tint directly
final Context viewContext = view.getContext();
final boolean isActionBarContext = isActionBarContext(viewContext, getActionBarContext((Activity) activity));
final boolean isDarkTheme = ThemeUtils.isDarkTheme(viewContext);
final int backgroundColorApprox;
final int currentThemeColor = activity.getCurrentThemeColor();
if (!isActionBarContext) {
accentColor = currentThemeColor;
final int[] darkLightColors = new int[2];
ThemeUtils.getDarkLightForegroundColors((Context) activity,
darkLightColors);
noTintColor = TwidereColorUtils.getContrastYIQ(accentColor, ThemeUtils.ACCENT_COLOR_THRESHOLD,
darkLightColors[0], darkLightColors[1]);
backgroundTintColor = accentColor;
backgroundColorApprox = isDarkTheme ? Color.BLACK : Color.WHITE;
isColorTint = true;
} else if (isDarkTheme) {
// View context is derived from ActionBar but is currently dark theme, so we should show
// light
noTintColor = Color.WHITE;
accentColor = currentThemeColor;
backgroundTintColor = noTintColor;
backgroundColorApprox = Color.BLACK;
isColorTint = true;
} else {
// View context is derived from ActionBar and it's light theme, so we use contrast color
accentColor = ThemeUtils.getColorFromAttribute(viewContext, android.R.attr.colorForeground, 0);
noTintColor = ThemeUtils.getColorFromAttribute(viewContext, android.R.attr.colorBackground, 0);
backgroundTintColor = accentColor;
backgroundColorApprox = Color.WHITE;
isColorTint = false;
}
final boolean isAccentOptimal = Math.abs(TwidereColorUtils.getYIQContrast(backgroundColorApprox, accentColor)) > 64;
if (view instanceof TextView) {
final TextView textView = (TextView) view;
if (isAccentOptimal) {
textView.setLinkTextColor(accentColor);
}
}
if (view instanceof WizardHighlightTextView) {
((WizardHighlightTextView) view).setTextColor(ThemeUtils.getOptimalAccentColor((Context) activity,
currentThemeColor, isActionBarContext));
}
if (view instanceof IThemeAccentView) {
if (isAccentOptimal || !isColorTint) {
((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(accentColor));
} else {
final int defaultAccentColor = ThemeUtils.getColorFromAttribute(viewContext,
R.attr.colorAccent, ContextCompat.getColor(viewContext, R.color.branding_color));
((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(defaultAccentColor));
}
} else if (view instanceof IThemeBackgroundTintView) {
if (isAccentOptimal || !isColorTint) {
((IThemeBackgroundTintView) view).setBackgroundTintColor(ColorStateList.valueOf(backgroundTintColor));
}
} else if (view instanceof TwidereToolbar) {
if (viewContext instanceof ContextThemeWrapper) {
((TwidereToolbar) view).setItemColor(ThemeUtils.getThemeForegroundColor(viewContext,
((ContextThemeWrapper) viewContext).getThemeResId()));
} else {
((TwidereToolbar) view).setItemColor(ThemeUtils.getThemeForegroundColor(viewContext));
}
} else if (view instanceof EditText) {
if (isAccentOptimal || !isColorTint) {
ViewCompat.setBackgroundTintList(view, ColorStateList.valueOf(backgroundTintColor));
}
if (view instanceof MaterialEditText) {
if (isAccentOptimal || !isColorTint) {
((MaterialEditText) view).setPrimaryColor(backgroundTintColor);
}
}
} else if (view instanceof ProgressBar) {
if (isAccentOptimal || !isColorTint) {
ViewSupport.setIndeterminateTintList((ProgressBar) view, ColorStateList.valueOf(accentColor));
ViewSupport.setProgressTintList((ProgressBar) view, ColorStateList.valueOf(accentColor));
ViewSupport.setProgressBackgroundTintList((ProgressBar) view, ColorStateList.valueOf(accentColor));
}
} else if (view instanceof TintableBackgroundView) {
final TintableBackgroundView tintable = (TintableBackgroundView) view;
if (isAccentOptimal || !isColorTint) {
applyTintableBackgroundViewTint(tintable, accentColor, noTintColor, backgroundTintColor, isColorTint);
}
}
}
private static void applyTintableBackgroundViewTint(TintableBackgroundView tintable, int accentColor, int noTintColor, int backgroundTintColor, boolean isColorTint) {
if (tintable instanceof Button) {
} else if (tintable instanceof EditText) {
tintable.setSupportBackgroundTintList(ColorStateList.valueOf(backgroundTintColor));
} else if (isColorTint) {
// final int[][] states = {{android.R.attr.state_selected}, {android.R.attr.state_focused},
// {android.R.attr.state_pressed}, {0}};
// final int[] colors = {accentColor, accentColor, accentColor, noTintColor};
// tintable.setSupportBackgroundTintList(new ColorStateList(states, colors));
} else {
// tintable.setSupportBackgroundTintList(ColorStateList.valueOf(accentColor));
}
}
private static boolean isActionBarContext(@NonNull Context context, @Nullable Context actionBarContext) {
if (context instanceof ThemeUtils.ActionBarContextThemeWrapper) return true;
if (actionBarContext == null) return false;
if (context == actionBarContext) return true;
Context base = context;
while (base instanceof ContextWrapper && (base = ((ContextWrapper) base).getBaseContext()) != null) {
if (base == actionBarContext) return true;
}
return false;
}
@Nullable
private static Context getActionBarContext(@NonNull Activity activity) {
Context actionBarContext = null;
if (activity instanceof AppCompatActivity) {
final AppCompatDelegate delegate = ((AppCompatActivity) activity).getDelegate();
final ActionBar actionBar = AppCompatDelegateAccessor.peekActionBar(delegate);
if (actionBar != null) {
actionBarContext = actionBar.getThemedContext();
}
}
if (activity != actionBarContext) return actionBarContext;
return null;
}
}

View File

@ -21,12 +21,10 @@ package org.mariotaku.twidere.util.dagger;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import org.mariotaku.twidere.activity.BasePreferenceActivity; import org.mariotaku.twidere.activity.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.BaseThemedActivity; import org.mariotaku.twidere.activity.ComposeActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; import org.mariotaku.twidere.activity.ThemedFragmentActivity;
import org.mariotaku.twidere.activity.support.ComposeActivity; import org.mariotaku.twidere.activity.MediaViewerActivity;
import org.mariotaku.twidere.activity.support.MediaViewerActivity;
import org.mariotaku.twidere.activity.support.ThemedFragmentActivity;
import org.mariotaku.twidere.adapter.AccountsAdapter; import org.mariotaku.twidere.adapter.AccountsAdapter;
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter; import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.adapter.BaseArrayAdapter; import org.mariotaku.twidere.adapter.BaseArrayAdapter;
@ -74,10 +72,6 @@ public interface GeneralComponent {
void inject(MultiSelectEventHandler object); void inject(MultiSelectEventHandler object);
void inject(BasePreferenceActivity object);
void inject(BaseThemedActivity object);
void inject(BaseSupportDialogFragment object); void inject(BaseSupportDialogFragment object);
void inject(RefreshService object); void inject(RefreshService object);
@ -114,8 +108,6 @@ public interface GeneralComponent {
void inject(BaseFiltersFragment.FilteredUsersFragment.FilterUsersListAdapter object); void inject(BaseFiltersFragment.FilteredUsersFragment.FilterUsersListAdapter object);
void inject(AccountsDashboardFragment.OptionItemsAdapter object);
void inject(EmojiSpannableFactory object); void inject(EmojiSpannableFactory object);
void inject(EmojiEditableFactory object); void inject(EmojiEditableFactory object);

View File

@ -39,4 +39,5 @@ public class DrawerContentFrameLayout extends FrameLayout {
super(context, attrs, defStyle); super(context, attrs, defStyle);
ThemeUtils.setupDrawerBackground(context, this); ThemeUtils.setupDrawerBackground(context, this);
} }
} }

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.view;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;

View File

@ -1,163 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.view;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Build;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.Property;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.graphics.OutlineCompat;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
import me.uucky.colorpicker.internal.EffectViewHelper;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class HomeActionButton extends FrameLayout implements IHomeActionButton {
private static class PressElevationProperty extends Property<View, Float> {
private final float mElevation;
public PressElevationProperty(float elevation) {
super(Float.TYPE, null);
mElevation = elevation;
}
@Override
public void set(View object, Float value) {
ViewCompat.setTranslationZ(object, mElevation * value);
}
@Override
public Float get(View object) {
return ViewCompat.getTranslationZ(object) / mElevation;
}
}
private final EffectViewHelper mHelper;
private final ImageView mIconView;
public HomeActionButton(final Context context) {
this(context, null);
}
public HomeActionButton(final Context context, final AttributeSet attrs) {
this(context, attrs, 0);
}
public HomeActionButton(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
final Resources resources = context.getResources();
final float elevation = resources.getDisplayMetrics().density * 4;
mHelper = new EffectViewHelper(this, new PressElevationProperty(elevation), 200);
if (isInEditMode()) {
inflate(context, R.layout.action_item_home_actions, this);
} else if (context instanceof IThemedActivity) {
int themeColor = ((IThemedActivity) context).getCurrentThemeColor();
inflate(ThemeUtils.getActionBarThemedContext(context, themeColor),
R.layout.action_item_home_actions, this);
} else {
inflate(ThemeUtils.getActionBarThemedContext(context), R.layout.action_item_home_actions,
this);
}
mIconView = (ImageView) findViewById(android.R.id.icon);
ViewSupport.setOutlineProvider(this, new HomeActionButtonOutlineProvider());
setClipToOutline(true);
setButtonColor(Color.WHITE);
}
@Override
public void setButtonColor(int color) {
if (isInEditMode()) {
final ShapeDrawable sd = new ShapeDrawable(new OvalShape());
sd.getPaint().setColor(color);
ViewSupport.setBackground(this, sd);
} else {
ViewSupport.setBackground(this, new ColorDrawable(color));
}
}
@Override
public void setIcon(final Bitmap bm) {
mIconView.setImageBitmap(bm);
}
@Override
public void setIcon(final Drawable drawable) {
mIconView.setImageDrawable(drawable);
}
@Override
public void setIcon(final int resId) {
mIconView.setImageResource(resId);
}
@Override
public void setIconColor(int color, Mode mode) {
mIconView.setColorFilter(color, mode);
}
@Override
public void setTitle(final CharSequence title) {
setContentDescription(title);
}
@Override
public void setTitle(final int title) {
setTitle(getResources().getText(title));
}
@Override
public void setPressed(boolean pressed) {
super.setPressed(pressed);
mHelper.setState(pressed);
}
private static class HomeActionButtonOutlineProvider extends ViewOutlineProviderCompat {
@Override
public void getOutline(View view, OutlineCompat outline) {
final int width = view.getWidth(), height = view.getHeight();
final int size = Math.min(width, height);
final int left = (width - size) / 2, top = (height - size) / 2;
outline.setOval(left, top, left + size, top + size);
}
}
}

View File

@ -1,203 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.view;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
public class HomeActionButtonCompat extends FrameLayout implements IHomeActionButton {
private final ImageView mIconView;
private final FloatingActionDrawable mBackground;
public HomeActionButtonCompat(final Context context) {
this(context, null);
}
public HomeActionButtonCompat(final Context context, final AttributeSet attrs) {
this(context, attrs, 0);
}
public HomeActionButtonCompat(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
if (isInEditMode()) {
inflate(context, R.layout.action_item_home_actions_compat, this);
} else if (context instanceof IThemedActivity) {
int themeColor = ((IThemedActivity) context).getCurrentThemeColor();
inflate(ThemeUtils.getActionBarThemedContext(context, themeColor),
R.layout.action_item_home_actions_compat, this);
} else {
inflate(ThemeUtils.getActionBarThemedContext(context), R.layout.action_item_home_actions_compat,
this);
}
mIconView = (ImageView) findViewById(android.R.id.icon);
final Resources resources = getResources();
final int radius = resources.getDimensionPixelSize(R.dimen.element_spacing_small);
mBackground = new FloatingActionDrawable(this, radius);
ViewSupport.setBackground(this, mBackground);
}
@Override
public void setButtonColor(int color) {
mBackground.setColor(color);
}
@Override
public void setIcon(final Bitmap bm) {
mIconView.setImageBitmap(bm);
}
@Override
public void setIcon(final Drawable drawable) {
mIconView.setImageDrawable(drawable);
}
@Override
public void setIcon(final int resId) {
mIconView.setImageResource(resId);
}
@Override
public void setIconColor(int color, Mode mode) {
mIconView.setColorFilter(color, mode);
}
@Override
public void setTitle(final CharSequence title) {
setContentDescription(title);
}
@Override
public void setTitle(final int title) {
setTitle(getResources().getText(title));
}
private static class FloatingActionDrawable extends Drawable {
private static final int SHADOW_START_COLOR = 0x37000000;
private final View mView;
private final float mRadius;
private Bitmap mBitmap;
private Paint mColorPaint;
private Rect mBounds;
public FloatingActionDrawable(View view, float radius) {
mView = view;
mRadius = radius;
mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
}
@Override
public void draw(Canvas canvas) {
if (mBitmap != null) {
canvas.drawBitmap(mBitmap, 0, 0, null);
}
final Rect bounds = mBounds;
if (!bounds.isEmpty()) {
final RectF rect = new RectF(mView.getPaddingLeft(), mView.getPaddingTop(),
bounds.width() - mView.getPaddingRight(), bounds.height() - mView.getPaddingBottom());
canvas.drawOval(rect, mColorPaint);
}
}
@Override
public void setAlpha(int alpha) {
// No-op
}
@Override
public void setColorFilter(ColorFilter cf) {
mColorPaint.setColorFilter(cf);
invalidateSelf();
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
mBounds.set(bounds);
updateBitmap();
invalidateSelf();
}
@Override
public int getIntrinsicWidth() {
return -1;
}
@Override
public int getIntrinsicHeight() {
return -1;
}
public void setColor(int color) {
mColorPaint.setColor(color);
updateBitmap();
invalidateSelf();
}
private void updateBitmap() {
final Rect bounds = mBounds;
if (bounds.isEmpty()) return;
mBitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), Config.ARGB_8888);
final Canvas canvas = new Canvas(mBitmap);
final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0xFF000000 | mColorPaint.getColor());
final float radius = mRadius;
paint.setShadowLayer(radius, 0, radius * 1.5f / 2, SHADOW_START_COLOR);
final RectF rect = new RectF(mView.getPaddingLeft(), mView.getPaddingTop(),
bounds.width() - mView.getPaddingRight(), bounds.height() - mView.getPaddingBottom());
canvas.drawOval(rect, paint);
paint.setShadowLayer(0, 0, 0, 0);
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawOval(rect, paint);
}
}
}

View File

@ -1,24 +0,0 @@
package org.mariotaku.twidere.view.iface;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
/**
* Created by mariotaku on 14/10/23.
*/
public interface IHomeActionButton {
void setButtonColor(int color);
void setIcon(Bitmap bm);
void setIcon(Drawable drawable);
void setIcon(int resId);
void setIconColor(int color, PorterDuff.Mode mode);
void setTitle(CharSequence title);
void setTitle(int title);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 B

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.HomeActionButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actions_button"
android:layout_width="@dimen/float_action_button_size"
android:layout_height="@dimen/float_action_button_size"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/element_spacing_large"
android:elevation="@dimen/element_spacing_small" />

View File

@ -17,16 +17,17 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout xmlns:android="http://schemas.android.com/apk/res/android" <org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content" android:id="@+id/main_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<FrameLayout <FrameLayout
android:id="@+id/content_fragment" android:id="@+id/content_fragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"/>
<RelativeLayout <RelativeLayout
android:id="@+id/twidere_action_bar_with_overlay" android:id="@+id/twidere_action_bar_with_overlay"
@ -41,13 +42,13 @@
android:layout_height="?actionBarSize" android:layout_height="?actionBarSize"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:touchscreenBlocksFocus="true" android:touchscreenBlocksFocus="true"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute"/>
<View <View
android:id="@+id/window_overlay" android:id="@+id/window_overlay"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/twidere_action_bar_container" android:layout_below="@+id/twidere_action_bar_container"
android:background="?android:windowContentOverlay" /> android:background="?android:windowContentOverlay"/>
</RelativeLayout> </RelativeLayout>
</org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout> </org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout>

View File

@ -17,23 +17,25 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v4.widget.DrawerLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_menu" android:id="@+id/home_menu"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:fitsSystemWindows="true">
<include <include
layout="@layout/activity_home_content" layout="@layout/activity_home_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"/>
<include <fragment
layout="@layout/drawer_home_accounts" android:id="@+id/left_drawer"
class="org.mariotaku.twidere.fragment.support.AccountsDashboardFragment"
android:layout_width="@dimen/drawer_width_home" android:layout_width="@dimen/drawer_width_home"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="left" android:layout_gravity="start"
tools:ignore="RtlHardcoded" /> tools:layout="@layout/fragment_accounts_dashboard"/>
</android.support.v4.widget.DrawerLayout> </android.support.v4.widget.DrawerLayout>

View File

@ -17,10 +17,10 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<org.mariotaku.twidere.view.MainFrameLayout <org.mariotaku.twidere.view.ExtendedFrameLayout
android:id="@+id/home_content" android:id="@+id/home_content"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -32,29 +32,33 @@
<include layout="@layout/layout_empty_tab_hint"/> <include layout="@layout/layout_empty_tab_hint"/>
<RelativeLayout <android.support.v7.widget.Toolbar
android:id="@+id/twidere_action_bar_with_overlay" android:id="@+id/action_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:elevation="@dimen/toolbar_elevation"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp">
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/main_tabs"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:tabDisplayOption="icon"
app:tabExpandEnabled="true"
app:tabHorizontalPadding="@dimen/element_spacing_normal"/>
</android.support.v7.widget.Toolbar>
<android.support.design.widget.FloatingActionButton
android:id="@+id/actions_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:layout_gravity="bottom|end"
android:layout_margin="@dimen/element_spacing_large"
android:clickable="true"
android:src="@drawable/ic_action_status_compose"
app:elevation="6dp"
app:pressedTranslationZ="12dp"/>
<org.mariotaku.twidere.view.TwidereActionBarContainer </org.mariotaku.twidere.view.ExtendedFrameLayout>
android:id="@+id/twidere_action_bar_container"
style="?attr/actionBarStyle"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:layout_alignParentTop="true"
android:layout="@layout/layout_actionbar_home"
android:touchscreenBlocksFocus="true"
tools:ignore="UnusedAttribute"/>
<View
android:id="@+id/window_overlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/twidere_action_bar_container"
android:background="?android:windowContentOverlay"/>
</RelativeLayout>
<include layout="@layout/layout_home_actions_button"/>
</org.mariotaku.twidere.view.MainFrameLayout>

View File

@ -26,7 +26,7 @@
android:divider="?android:dividerVertical" android:divider="?android:dividerVertical"
android:orientation="vertical" android:orientation="vertical"
android:showDividers="middle" android:showDividers="middle"
tools:context=".activity.support.RequestPermissionsActivity"> tools:context=".activity.RequestPermissionsActivity">
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -23,8 +23,8 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:focusable="true" android:layout_height="match_parent"
android:layout_height="match_parent"> android:focusable="true">
<fragment <fragment
android:id="@+id/left_drawer" android:id="@+id/left_drawer"

View File

@ -17,14 +17,14 @@
~ You should have received a copy of the GNU General Public License ~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<ListView <android.support.design.widget.NavigationView
android:id="@android:id/list" android:id="@+id/navigation_view"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:divider="@null"
android:dividerHeight="0dp"
android:focusable="true" android:focusable="true"
android:listSelector="?selectableItemBackground" app:headerLayout="@layout/header_drawer_account_selector"
app:menu="@menu/menu_account_dashboard"
tools:context=".fragment.support.AccountsDashboardFragment"/> tools:context=".fragment.support.AccountsDashboardFragment"/>

View File

@ -17,7 +17,9 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout
android:id="@+id/account_dashboard_header"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -36,7 +38,7 @@
android:focusable="false" android:focusable="false"
android:foreground="@color/drawer_banner_foreground" android:foreground="@color/drawer_banner_foreground"
android:scaleType="centerCrop" android:scaleType="centerCrop"
tools:src="@drawable/nyan_stars_background" /> tools:src="@drawable/nyan_stars_background"/>
<FrameLayout <FrameLayout
android:id="@+id/profile_container" android:id="@+id/profile_container"
@ -64,7 +66,7 @@
android:focusable="false" android:focusable="false"
app:sivBorder="true" app:sivBorder="true"
app:sivBorderWidth="2dp" app:sivBorderWidth="2dp"
tools:src="@mipmap/ic_launcher" /> tools:src="@mipmap/ic_launcher"/>
<org.mariotaku.twidere.view.ExtendedRecyclerView <org.mariotaku.twidere.view.ExtendedRecyclerView
android:id="@+id/other_accounts_list" android:id="@+id/other_accounts_list"
@ -78,7 +80,7 @@
android:layout_toEndOf="@id/profile_image" android:layout_toEndOf="@id/profile_image"
android:layout_toRightOf="@id/profile_image" android:layout_toRightOf="@id/profile_image"
android:focusable="false" android:focusable="false"
tools:visibility="invisible" /> tools:visibility="invisible"/>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -104,9 +106,9 @@
android:focusable="false" android:focusable="false"
android:singleLine="true" android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall"
android:textColor="?attr/textColorDrawerNamePrimary" android:textColor="@android:color/white"
android:textStyle="bold" android:textStyle="bold"
tools:text="Name" /> tools:text="Name"/>
<TextView <TextView
android:id="@+id/screen_name" android:id="@+id/screen_name"
@ -115,8 +117,8 @@
android:focusable="false" android:focusable="false"
android:singleLine="true" android:singleLine="true"
android:textAppearance="?android:textAppearanceSmall" android:textAppearance="?android:textAppearanceSmall"
android:textColor="?textColorDrawerNameSecondary" android:textColor="@color/light_gray"
tools:text="\@username" /> tools:text="\@username"/>
</LinearLayout> </LinearLayout>
@ -129,7 +131,7 @@
android:id="@+id/account_dashboard_menu" android:id="@+id/account_dashboard_menu"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:focusable="true" /> android:focusable="true"/>
</FrameLayout> </FrameLayout>
@ -143,7 +145,7 @@
android:focusable="false" android:focusable="false"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:visibility="invisible" android:visibility="invisible"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription"/>
</FrameLayout> </FrameLayout>
<FrameLayout <FrameLayout
@ -159,7 +161,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:text="@string/no_account" /> android:text="@string/no_account"/>
</FrameLayout> </FrameLayout>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:layout_height="?actionBarSize"
tools:layout_width="match_parent">
<android.support.v7.widget.TwidereToolbar
android:id="@+id/action_bar"
style="?attr/toolbarStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp">
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/main_tabs"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:tabDisplayOption="icon"
app:tabExpandEnabled="true"
app:tabHorizontalPadding="@dimen/element_spacing_normal"/>
</android.support.v7.widget.TwidereToolbar>
</merge>

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<org.mariotaku.twidere.view.HomeActionButtonCompat
android:id="@+id/actions_button"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:padding="@dimen/element_spacing_large"
android:visibility="visible"/>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:id="@+id/account_actions"
android:checkableBehavior="none">
<item
android:id="@id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search"/>
<item
android:id="@id/interactions"
android:icon="@drawable/ic_action_notification"
android:title="@string/interactions"/>
<item
android:id="@id/messages"
android:icon="@drawable/ic_action_message"
android:title="@string/direct_messages"/>
<item
android:id="@id/favorites"
android:icon="@drawable/ic_action_heart"
android:title="@string/likes"/>
<item
android:id="@id/lists"
android:icon="@drawable/ic_action_list"
android:title="@string/likes"/>
<item
android:id="@id/groups"
android:icon="@drawable/ic_action_list"
android:title="@string/groups"/>
<item
android:id="@id/public_timeline"
android:icon="@drawable/ic_action_quote"
android:title="@string/public_timeline"/>
</group>
<group
android:id="@+id/app_menu"
android:checkableBehavior="none">
<item
android:id="@id/accounts"
android:icon="@drawable/ic_action_accounts"
android:title="@string/accounts"/>
<item
android:id="@id/drafts"
android:icon="@drawable/ic_action_draft"
android:title="@string/drafts"/>
<item
android:id="@id/filters"
android:icon="@drawable/ic_action_speaker_muted"
android:title="@string/filters"/>
<item
android:id="@id/settings"
android:icon="@drawable/ic_action_settings"
android:title="@string/settings"/>
</group>
</menu>

View File

@ -18,7 +18,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item> <item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">light</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style> </style>
@ -41,7 +42,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item> <item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">light</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style> </style>
@ -69,7 +71,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item> <item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">light</item>
</style> </style>
@ -94,7 +98,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item> <item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">light</item>
</style> </style>
@ -130,7 +136,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
<item name="coloredActionBar">true</item> <item name="coloredActionBar">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">light</item>
</style> </style>
<style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog"> <style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog">
@ -145,8 +153,6 @@
<style name="Theme.Twidere.Drawer" parent="Theme.Twidere.NoActionBar"> <style name="Theme.Twidere.Drawer" parent="Theme.Twidere.NoActionBar">
<!-- Window attributes --> <!-- Window attributes -->
<item name="android:windowBackground">@color/bg_color_drawer_light</item> <item name="android:windowBackground">@color/bg_color_drawer_light</item>
<item name="textColorDrawerNamePrimary">?android:textColorPrimaryInverse</item>
<item name="textColorDrawerNameSecondary">?android:textColorSecondaryInverse</item>
</style> </style>
<style name="Theme.Twidere.NoDisplay" parent="Theme.Twidere.Dialog"> <style name="Theme.Twidere.NoDisplay" parent="Theme.Twidere.Dialog">

View File

@ -12,10 +12,9 @@
<attr name="cardItemBackgroundColor" format="color"/> <attr name="cardItemBackgroundColor" format="color"/>
<attr name="quoteIndicatorBackgroundColor" format="color"/> <attr name="quoteIndicatorBackgroundColor" format="color"/>
<attr name="linePageIndicatorStyle" format="reference"/> <attr name="linePageIndicatorStyle" format="reference"/>
<attr name="textColorDrawerNamePrimary" format="color"/>
<attr name="textColorDrawerNameSecondary" format="color"/>
<attr name="progressWheelStyle" format="reference"/> <attr name="progressWheelStyle" format="reference"/>
<attr name="darkTheme" format="boolean"/> <attr name="darkTheme" format="boolean"/>
<attr name="ateThemeKey" format="string"/>
<attr name="coloredActionBar" format="boolean"/> <attr name="coloredActionBar" format="boolean"/>
<attr name="windowNormalBackground" format="reference"/> <attr name="windowNormalBackground" format="reference"/>
</declare-styleable> </declare-styleable>

View File

@ -96,5 +96,6 @@
<dimen name="activity_vertical_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="height_player_control_panel">40dp</dimen> <dimen name="height_player_control_panel">40dp</dimen>
<dimen name="toolbar_elevation">8dp</dimen>
</resources> </resources>

View File

@ -20,7 +20,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style> </style>
@ -46,7 +47,8 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
</style> </style>
@ -73,7 +75,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Twidere.Dialog" parent="Theme.Compat.Base.Dialog"> <style name="Theme.Twidere.Dialog" parent="Theme.Compat.Base.Dialog">
@ -97,7 +101,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Twidere.Compose" parent="Theme.Compat.Base.Dialog"> <style name="Theme.Twidere.Compose" parent="Theme.Compat.Base.Dialog">
@ -131,7 +137,9 @@
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item> <!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog"> <style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog">
@ -143,15 +151,20 @@
<item name="android:windowActionModeOverlay">false</item> <item name="android:windowActionModeOverlay">false</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Twidere.Drawer" parent="Theme.Twidere.NoActionBar"> <style name="Theme.Twidere.Drawer" parent="Theme.Twidere.NoActionBar">
<!-- Window attributes --> <!-- Window attributes -->
<item name="android:windowBackground">@color/bg_color_drawer_dark</item> <item name="android:windowBackground">@color/bg_color_drawer_dark</item>
<item name="textColorDrawerNamePrimary">?android:textColorPrimary</item>
<item name="textColorDrawerNameSecondary">?android:textColorSecondary</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Twidere.NoDisplay" parent="Theme.Twidere.Dialog"> <style name="Theme.Twidere.NoDisplay" parent="Theme.Twidere.Dialog">
@ -166,7 +179,10 @@
<item name="android:windowTitleStyle">@style/Widget.TextView.WindowTitle.NoDisplay</item> <item name="android:windowTitleStyle">@style/Widget.TextView.WindowTitle.NoDisplay</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<!--<item name="android:windowNoDisplay">true</item>-->
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Twidere.Viewer" parent="Theme.AppCompat"> <style name="Theme.Twidere.Viewer" parent="Theme.AppCompat">
@ -195,8 +211,11 @@
<item name="messageBubbleColor">@color/message_bubble_color_dark</item> <item name="messageBubbleColor">@color/message_bubble_color_dark</item>
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item> <item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
<item name="asb_switchPreferenceStyle">@style/asb_Preference.SwitchPreference</item>
<item name="darkTheme">true</item> <item name="darkTheme">true</item>
<!-- ATE attributes -->
<item name="ateThemeKey">dark</item>
</style> </style>
<style name="Theme.Nyan" parent="Theme.Compat.Base.NoActionBar"> <style name="Theme.Nyan" parent="Theme.Compat.Base.NoActionBar">

View File

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"
android:key="settings_content" xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/content_and_storage"> android:key="settings_content"
android:title="@string/content_and_storage">
<PreferenceCategory <PreferenceCategory
android:key="category_content" android:key="category_content"
@ -11,9 +12,9 @@
<SwitchPreference <SwitchPreference
android:defaultValue="true" android:defaultValue="true"
android:key="name_first" android:key="name_first"
android:title="@string/name_first" android:summaryOff="@string/name_first_summary_off"
app:asb_summaryOff="@string/name_first_summary_off" android:summaryOn="@string/name_first_summary_on"
app:asb_summaryOn="@string/name_first_summary_on"> android:title="@string/name_first">
<extra <extra
android:name="notify_change" android:name="notify_change"
android:value="true"/> android:value="true"/>

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.4 (15588) - http://www.bohemiancoding.com/sketch --> <!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>Artboard</title> <title>ic_action_heart-mdpi</title>
<desc>Created with Sketch.</desc> <desc>Created with Sketch.</desc>
<defs></defs> <defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> <g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Artboard" sketch:type="MSArtboardGroup" fill="#FFFFFF"> <g id="ic_action_heart-mdpi" fill="#FFFFFF">
<path d="M16,24.5708333 L14.6708333,23.3608333 C9.95,19.08 6.83333333,16.2566667 6.83333333,12.7916667 C6.83333333,9.96833333 9.05166667,7.75 11.875,7.75 C13.47,7.75 15.0008333,8.4925 16,9.66583333 C16.9991667,8.4925 18.53,7.75 20.125,7.75 C22.9483333,7.75 25.1666667,9.96833333 25.1666667,12.7916667 C25.1666667,16.2566667 22.05,19.08 17.3291667,23.37 L16,24.5708333 L16,24.5708333 Z" id="Shape" sketch:type="MSShapeGroup"></path> <path d="M16,25.35 L14.55,24.03 C9.4,19.36 6,16.28 6,12.5 C6,9.42 8.42,7 11.5,7 C13.24,7 14.91,7.81 16,9.09 C17.09,7.81 18.76,7 20.5,7 C23.58,7 26,9.42 26,12.5 C26,16.28 22.6,19.36 17.45,24.04 L16,25.35 L16,25.35 Z" id="Shape"></path>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 797 B

View File

@ -1,15 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.5.1 (25234) - http://www.bohemiancoding.com/sketch --> <!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>ic_action_notification-mdpi</title> <title>ic_action_notification-mdpi</title>
<desc>Created with Sketch.</desc> <desc>Created with Sketch.</desc>
<defs></defs> <defs></defs>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> <g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_action_notification-mdpi" sketch:type="MSArtboardGroup"> <g id="ic_action_notification-mdpi" fill="#FFFFFF">
<g id="social_notifications" sketch:type="MSLayerGroup" transform="translate(4.000000, 4.000000)"> <path d="M16,26 C17.1,26 18,25.1 18,24 L14,24 C14,25.1 14.9,26 16,26 L16,26 Z M22.5,20 L22.5,14.5 C22.5,11.43 20.37,8.86 17.5,8.18 L17.5,7.5 C17.5,6.67 16.83,6 16,6 C15.17,6 14.5,6.67 14.5,7.5 L14.5,8.18 C11.63,8.86 9.5,11.43 9.5,14.5 L9.5,20 L7.5,22 L7.5,23 L24.5,23 L24.5,22 L22.5,20 L22.5,20 Z" id="Shape"></path>
<path d="M12,22 C13.1,22 14,21.1 14,20 L10,20 C10,21.1 10.9,22 12,22 L12,22 Z M18.5,16 L18.5,10.5 C18.5,7.43 16.37,4.86 13.5,4.18 L13.5,3.5 C13.5,2.67 12.83,2 12,2 C11.17,2 10.5,2.67 10.5,3.5 L10.5,4.18 C7.63,4.86 5.5,7.43 5.5,10.5 L5.5,16 L3.5,18 L3.5,19 L20.5,19 L20.5,18 L18.5,16 L18.5,16 Z" id="Shape" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
<path d="M0,0 L24,0 L24,24 L0,24 L0,0 Z" id="Shape" sketch:type="MSShapeGroup"></path>
</g>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 893 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>ic_action_star-mdpi</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_action_star-mdpi" fill="#FFFFFF">
<path d="M16,21.27 L22.18,25 L20.54,17.97 L26,13.24 L18.81,12.63 L16,6 L13.19,12.63 L6,13.24 L11.46,17.97 L9.82,25 L16,21.27 Z" id="Shape"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 707 B