Полезная информация


avatar_LIST

Тюнинг и Апгрейд электросамоката XIAOMI

Автор LIST, 16 Фев. 2017 в 11:55

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

LIST

Привет всем! Сегодня получил запрос на Xiaomi на 60 Вольт. Для межконтинентальных полетов наверное??:))) Самому очень интересно - влезет BMS или нет:))) По остальному пока не вижу проблем:))
С уважением
LIST

nicomunet123

Цитата: LIST от 22 Фев. 2017 в 19:50
Привет всем! Сегодня получил запрос на Xiaomi на 60 Вольт.
Ужас  :-D
E-TWOW Eco -> Kugoo -> Ninebot ES1 -> Ninebot ES-Trash

takeshi

Коллеги!
Думаю, многих (а к началу сезона -- будет больше людей) волнует вопрос о "прививках" сяоката, чтоб не получить кирпич через месяц-два покатушек.
Прошу озвучить расценки на вакцину.
Сам планирую начать сезон, когда будет позволять погода, а до этого момента хочется знать все известные подводные камни и способы решения известных проблем :)
А то я начинаю думать, что с покупкой первого электротранспорта поспешил. :(

LIST

Дорогие друзья!
Все самокаты, которые приобретены у LISTа, находятся на годовой гарантии.
Если что то случится с Вашим самокатом - LikonTech бесплатно не только отремонтируют но и установят на самокат дополнительные элементы, исключающие его "окирпичивание".
Для желающих дополнительно "привить" свои самокаты - здесь цены писать нельзя, как только будет посчитана себестоимость, она будет обявлена дополнительно в разделе FERRY
С уважением,
LIST

nicomunet123

#94
Я все еще пытаюсь понять, откуда-то прошивка берется.
Мне кажется, что она берется с сервера Xiaomi.
И сначала качается Download.db
И оттуда уже берется URL
Спойлер

package com.xiaomi.smarthome.download;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.UriMatcher;
import android.database.CrossProcessCursor;
import android.database.Cursor;
import android.database.CursorWindow;
import android.database.CursorWrapper;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.util.Log;
import com.xiaomi.smarthome.device.api.DownloadConstants;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import miui.bluetooth.ble.MiBleProfile;
import org.cybergarage.BuildConfig;
import org.cybergarage.http.HTTP;
import org.cybergarage.soap.SOAP;
import org.cybergarage.upnp.UPnP;
import org.cybergarage.upnp.ssdp.SSDP;

public final class DownloadProvider extends ContentProvider {
    private static final UriMatcher f5503b;
    private static final Uri[] f5504c;
    private static final String[] f5505d;
    private static HashSet<String> f5506e;
    SystemFacade f5507a;
    private SQLiteOpenHelper f5508f;

    private final class DatabaseHelper extends SQLiteOpenHelper {
        final /* synthetic */ DownloadProvider f5498a;

        public DatabaseHelper(DownloadProvider downloadProvider, Context context) {
            this.f5498a = downloadProvider;
            super(context, "downloads.db", null, MiBleProfile.PROPERTY_MI_KEY);
        }

        public void onCreate(SQLiteDatabase sQLiteDatabase) {
            Log.v("DownloadManager", "populating new database");
            onUpgrade(sQLiteDatabase, 0, MiBleProfile.PROPERTY_MI_KEY);
        }

        public void onUpgrade(SQLiteDatabase sQLiteDatabase, int i, int i2) {
            if (i == 31) {
                i = 100;
            } else if (i < 100) {
                Log.i("DownloadManager", "Upgrading downloads database from version " + i + " to version " + i2 + ", which will destroy all old data");
                i = 99;
            } else if (i > i2) {
                Log.i("DownloadManager", "Downgrading downloads database from version " + i + " (current version is " + i2 + "), destroying all old data");
                i = 99;
            }
            for (int i3 = i + 1; i3 <= i2; i3++) {
                m6939a(sQLiteDatabase, i3);
            }
        }

        private void m6939a(SQLiteDatabase sQLiteDatabase, int i) {
            switch (i) {
                case UPnP.SERVER_RETRY_COUNT /*100*/:
                    m6943c(sQLiteDatabase);
                case MiBleProfile.PROPERTY_DEVICE_INFO /*101*/:
                    m6944d(sQLiteDatabase);
                case MiBleProfile.PROPERTY_USER_INFO /*102*/:
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_IS_PUBLIC_API, "INTEGER NOT NULL DEFAULT 0");
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_ALLOW_ROAMING, "INTEGER NOT NULL DEFAULT 0");
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_ALLOWED_NETWORK_TYPES, "INTEGER NOT NULL DEFAULT 0");
                case MiBleProfile.PROPERTY_SPORT_STEPS /*103*/:
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, "INTEGER NOT NULL DEFAULT 1");
                    m6942b(sQLiteDatabase);
                case MiBleProfile.PROPERTY_SPORT_ACTIVITIES /*104*/:
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_BYPASS_RECOMMENDED_SIZE_LIMIT, "INTEGER NOT NULL DEFAULT 0");
                case MiBleProfile.PROPERTY_THEME_COLOR /*105*/:
                    m6938a(sQLiteDatabase);
                case MiBleProfile.PROPERTY_ALARM_CLOCK /*106*/:
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_DELETED, "BOOLEAN NOT NULL DEFAULT 0");
                case MiBleProfile.PROPERTY_MI_KEY /*107*/:
                    m6941a(sQLiteDatabase, "downloads", Downloads.COLUMN_UDN, "TEXT");
                default:
                    throw new IllegalStateException("Don't know how to upgrade to " + i);
            }
        }

        private void m6938a(SQLiteDatabase sQLiteDatabase) {
            ContentValues contentValues = new ContentValues();
            contentValues.put(Downloads.COLUMN_CURRENT_BYTES, Integer.valueOf(0));
            m6940a(sQLiteDatabase, contentValues);
            contentValues.put(Downloads.COLUMN_TOTAL_BYTES, Integer.valueOf(-1));
            m6940a(sQLiteDatabase, contentValues);
            contentValues.put(Downloads.COLUMN_TITLE, BuildConfig.FLAVOR);
            m6940a(sQLiteDatabase, contentValues);
            contentValues.put(Downloads.COLUMN_DESCRIPTION, BuildConfig.FLAVOR);
            m6940a(sQLiteDatabase, contentValues);
        }

        private void m6940a(SQLiteDatabase sQLiteDatabase, ContentValues contentValues) {
            sQLiteDatabase.update("downloads", contentValues, ((String) ((Entry) contentValues.valueSet().iterator().next()).getKey()) + " is null", null);
            contentValues.clear();
        }

        private void m6942b(SQLiteDatabase sQLiteDatabase) {
            ContentValues contentValues = new ContentValues();
            contentValues.put(Downloads.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, Boolean.valueOf(false));
            sQLiteDatabase.update("downloads", contentValues, "destination != 0", null);
        }

        private void m6941a(SQLiteDatabase sQLiteDatabase, String str, String str2, String str3) {
            sQLiteDatabase.execSQL("ALTER TABLE " + str + " ADD COLUMN " + str2 + HTTP.STATUS_LINE_DELIM + str3);
        }

        private void m6943c(SQLiteDatabase sQLiteDatabase) {
            try {
                sQLiteDatabase.execSQL("DROP TABLE IF EXISTS downloads");
                sQLiteDatabase.execSQL("CREATE TABLE downloads(_id INTEGER PRIMARY KEY AUTOINCREMENT,uri TEXT, method INTEGER, entity TEXT, no_integrity BOOLEAN, hint TEXT, otaupdate BOOLEAN, _data TEXT, mimetype TEXT, destination INTEGER, no_system BOOLEAN, visibility INTEGER, control INTEGER, status INTEGER, numfailed INTEGER, lastmod BIGINT, notificationpackage TEXT, notificationclass TEXT, notificationextras TEXT, cookiedata TEXT, useragent TEXT, referer TEXT, total_bytes INTEGER, current_bytes INTEGER, etag TEXT, uid INTEGER, otheruid INTEGER, title TEXT, description TEXT); ");
            } catch (SQLException e) {
                Log.e("DownloadManager", "couldn't create table in downloads database");
                throw e;
            }
        }

        private void m6944d(SQLiteDatabase sQLiteDatabase) {
            sQLiteDatabase.execSQL("DROP TABLE IF EXISTS request_headers");
            sQLiteDatabase.execSQL("CREATE TABLE request_headers(id INTEGER PRIMARY KEY AUTOINCREMENT,download_id INTEGER NOT NULL,header TEXT NOT NULL,value TEXT NOT NULL);");
        }
    }

    private class ReadOnlyCursorWrapper extends CursorWrapper implements CrossProcessCursor {
        final /* synthetic */ DownloadProvider f5499a;
        private CrossProcessCursor f5500b;

        public ReadOnlyCursorWrapper(DownloadProvider downloadProvider, Cursor cursor) {
            this.f5499a = downloadProvider;
            super(cursor);
            this.f5500b = (CrossProcessCursor) cursor;
        }

        public void fillWindow(int i, CursorWindow cursorWindow) {
            this.f5500b.fillWindow(i, cursorWindow);
        }

        public CursorWindow getWindow() {
            return this.f5500b.getWindow();
        }

        public boolean onMove(int i, int i2) {
            return this.f5500b.onMove(i, i2);
        }
    }

    private static class SqlSelection {
        public StringBuilder f5501a;
        public List<String> f5502b;

        private SqlSelection() {
            this.f5501a = new StringBuilder();
            this.f5502b = new ArrayList();
        }

        public <T> void m6946a(String str, T... tArr) {
            if (str != null && str.length() != 0) {
                if (this.f5501a.length() != 0) {
                    this.f5501a.append(" AND ");
                }
                this.f5501a.append("(");
                this.f5501a.append(str);
                this.f5501a.append(")");
                if (tArr != null) {
                    for (Object obj : tArr) {
                        this.f5502b.add(obj.toString());
                    }
                }
            }
        }

        public String m6945a() {
            return this.f5501a.toString();
        }

        public String[] m6947b() {
            return (String[]) this.f5502b.toArray(new String[this.f5502b.size()]);
        }
    }

    public DownloadProvider() {
        this.f5508f = null;
    }

    static {
        int i = 0;
        f5503b = new UriMatcher(-1);
        f5503b.addURI(Downloads.AUTHORITY, "my_downloads", 1);
        f5503b.addURI(Downloads.AUTHORITY, "my_downloads/#", 2);
        f5503b.addURI(Downloads.AUTHORITY, "all_downloads", 3);
        f5503b.addURI(Downloads.AUTHORITY, "all_downloads/#", 4);
        f5503b.addURI(Downloads.AUTHORITY, "my_downloads/#/headers", 5);
        f5503b.addURI(Downloads.AUTHORITY, "all_downloads/#/headers", 5);
        f5504c = new Uri[]{Downloads.CONTENT_URI, Downloads.ALL_DOWNLOADS_CONTENT_URI};
        f5505d = new String[]{DownloadConstants.COLUMN_ID, Downloads.COLUMN_APP_DATA, Downloads._DATA, Downloads.COLUMN_MIME_TYPE, Downloads.COLUMN_VISIBILITY, Downloads.COLUMN_DESTINATION, Downloads.COLUMN_CONTROL, Downloads.COLUMN_STATUS, Downloads.COLUMN_LAST_MODIFICATION, Downloads.COLUMN_NOTIFICATION_PACKAGE, Downloads.COLUMN_NOTIFICATION_CLASS, Downloads.COLUMN_TOTAL_BYTES, Downloads.COLUMN_CURRENT_BYTES, Downloads.COLUMN_TITLE, Downloads.COLUMN_DESCRIPTION, Downloads.COLUMN_URI, Downloads.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, Downloads.COLUMN_FILE_NAME_HINT, Downloads.COLUMN_DELETED, Downloads.COLUMN_UDN};
        f5506e = new HashSet();
        while (i < f5505d.length) {
            f5506e.add(f5505d);
            i++;
        }
    }

    public boolean onCreate() {
        if (this.f5507a == null) {
            this.f5507a = new RealSystemFacade(getContext());
        }
        this.f5508f = new DatabaseHelper(this, getContext());
        return true;
    }

    public String getType(Uri uri) {
        switch (f5503b.match(uri)) {
            case UPnP.USE_ONLY_IPV6_ADDR /*1*/:
                return "vnd.android.cursor.dir/download";
            case UPnP.USE_LOOPBACK_ADDR /*2*/:
                return "vnd.android.cursor.item/download";
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
    }

    /* JADX WARNING: inconsistent code. */
    /* Code decompiled incorrectly, please refer to instructions dump. */
    public android.net.Uri insert(android.net.Uri r14, android.content.ContentValues r15) {
        /*
        r13 = this;
        r3 = 0;
        r10 = 4;
        r2 = 0;
        r1 = 1;
        r13.m6960b(r15);
        r0 = r13.f5508f;
        r4 = r0.getWritableDatabase();
        r0 = f5503b;
        r5 = r0.match(r14);
        if (r5 == r1) goto L_0x0049;
    L_0x0015:
        r0 = "DownloadManager";
        r1 = new java.lang.StringBuilder;
        r1.<init>();
        r2 = "calling insert on an unknown/invalid URI: ";
        r1 = r1.append(r2);
        r1 = r1.append(r14);
        r1 = r1.toString();
        android.util.Log.d(r0, r1);
        r0 = new java.lang.IllegalArgumentException;
        r1 = new java.lang.StringBuilder;
        r1.<init>();
        r2 = "Unknown/Invalid URI ";
        r1 = r1.append(r2);
        r1 = r1.append(r14);
        r1 = r1.toString();
        r0.<init>(r1);
        throw r0;
    L_0x0049:
        r6 = new android.content.ContentValues;
        r6.<init>();
        r0 = "uri";
        m6962c(r0, r15, r6);
        r0 = "entity";
        m6962c(r0, r15, r6);
        r0 = "no_integrity";
        m6961b(r0, r15, r6);
        r0 = "hint";
        m6962c(r0, r15, r6);
        r0 = "mimetype";
        m6962c(r0, r15, r6);
        r0 = "is_public_api";
        m6961b(r0, r15, r6);
        r0 = "is_public_api";
        r0 = r15.getAsBoolean(r0);
        r7 = java.lang.Boolean.TRUE;
        if (r0 != r7) goto L_0x00a9;
    L_0x007d:
        r0 = r1;
    L_0x007e:
        r7 = "destination";
        r7 = r15.getAsInteger(r7);
        if (r7 == 0) goto L_0x00cf;
    L_0x0087:
        r8 = r13.getContext();
        r9 = "com.xiaomi.smarthome.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED";
        r8 = r8.checkCallingPermission(r9);
        if (r8 == 0) goto L_0x00ab;
    L_0x0094:
        r8 = r7.intValue();
        if (r8 == 0) goto L_0x00ab;
    L_0x009a:
        r8 = r7.intValue();
        if (r8 == r10) goto L_0x00ab;
    L_0x00a0:
        r0 = new java.lang.SecurityException;
        r1 = "unauthorized destination code";
        r0.<init>(r1);
        throw r0;
    L_0x00a9:
        r0 = r2;
        goto L_0x007e;
    L_0x00ab:
        r8 = r7.intValue();
        if (r8 != r10) goto L_0x00c9;
    L_0x00b1:
        r8 = r13.getContext();
        r9 = "android.permission.WRITE_EXTERNAL_STORAGE";
        r10 = android.os.Binder.getCallingPid();
        r11 = android.os.Binder.getCallingUid();
        r12 = "need WRITE_EXTERNAL_STORAGE permission to use DESTINATION_FILE_URI";
        r8.enforcePermission(r9, r10, r11, r12);
        r13.m6951a(r15);
    L_0x00c9:
        r8 = "destination";
        r6.put(r8, r7);
    L_0x00cf:
        r8 = "visibility";
        r8 = r15.getAsInteger(r8);
        if (r8 != 0) goto L_0x0247;
    L_0x00d8:
        r8 = r7.intValue();
        if (r8 != 0) goto L_0x023a;
    L_0x00de:
        r8 = "visibility";
        r9 = java.lang.Integer.valueOf(r1);
        r6.put(r8, r9);
    L_0x00e8:
        r8 = "control";
        m6957a(r8, r15, r6);
        r8 = "status";
        r9 = 190; // 0xbe float:2.66E-43 double:9.4E-322;
        r9 = java.lang.Integer.valueOf(r9);
        r6.put(r8, r9);
        r8 = "lastmod";
        r9 = r13.f5507a;
        r10 = r9.m7043a();
        r9 = java.lang.Long.valueOf(r10);
        r6.put(r8, r9);
        r8 = "notificationpackage";
        r8 = r15.getAsString(r8);
        r9 = "notificationclass";
        r9 = r15.getAsString(r9);
        if (r8 == 0) goto L_0x013a;
    L_0x011a:
        if (r9 != 0) goto L_0x011e;
    L_0x011c:
        if (r0 == 0) goto L_0x013a;
    L_0x011e:
        r10 = android.os.Binder.getCallingUid();
        if (r10 == 0) goto L_0x012c;
    L_0x0124:
        r11 = r13.f5507a;    Catch:{ NameNotFoundException -> 0x027b }
        r10 = r11.m7047a(r10, r8);    Catch:{ NameNotFoundException -> 0x027b }
        if (r10 == 0) goto L_0x013a;
    L_0x012c:
        r10 = "notificationpackage";
        r6.put(r10, r8);    Catch:{ NameNotFoundException -> 0x027b }
        if (r9 == 0) goto L_0x013a;
    L_0x0134:
        r8 = "notificationclass";
        r6.put(r8, r9);    Catch:{ NameNotFoundException -> 0x027b }
    L_0x013a:
        r8 = "notificationextras";
        m6962c(r8, r15, r6);
        r8 = "cookiedata";
        m6962c(r8, r15, r6);
        r8 = "useragent";
        m6962c(r8, r15, r6);
        r8 = "referer";
        m6962c(r8, r15, r6);
        r8 = r13.getContext();
        r9 = "com.xiaomi.smarthome.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED";
        r8 = r8.checkCallingPermission(r9);
        if (r8 != 0) goto L_0x0165;
    L_0x015f:
        r8 = "otheruid";
        m6957a(r8, r15, r6);
    L_0x0165:
        r8 = "uid";
        r9 = android.os.Binder.getCallingUid();
        r9 = java.lang.Integer.valueOf(r9);
        r6.put(r8, r9);
        r8 = android.os.Binder.getCallingUid();
        if (r8 != 0) goto L_0x017f;
    L_0x0179:
        r8 = "uid";
        m6957a(r8, r15, r6);
    L_0x017f:
        r8 = "title";
        r9 = "";
        m6958a(r8, r15, r6, r9);
        r8 = "description";
        r9 = "";
        m6958a(r8, r15, r6, r9);
        r8 = "total_bytes";
        r9 = -1;
        r9 = java.lang.Integer.valueOf(r9);
        r6.put(r8, r9);
        r8 = "current_bytes";
        r9 = java.lang.Integer.valueOf(r2);
        r6.put(r8, r9);
        r8 = "is_visible_in_downloads_ui";
        r8 = r15.containsKey(r8);
        if (r8 == 0) goto L_0x024f;
    L_0x01af:
        r1 = "is_visible_in_downloads_ui";
        m6961b(r1, r15, r6);
    L_0x01b5:
        if (r0 == 0) goto L_0x01c3;
    L_0x01b7:
        r0 = "allowed_network_types";
        m6957a(r0, r15, r6);
        r0 = "allow_roaming";
        m6961b(r0, r15, r6);
    L_0x01c3:
        r0 = "udn";
        m6962c(r0, r15, r6);
        r0 = "DownloadManager";
        r1 = new java.lang.StringBuilder;
        r1.<init>();
        r2 = "initiating download with UID ";
        r1 = r1.append(r2);
        r2 = "uid";
        r2 = r6.getAsInteger(r2);
        r1 = r1.append(r2);
        r1 = r1.toString();
        android.util.Log.v(r0, r1);
        r0 = "otheruid";
        r0 = r6.containsKey(r0);
        if (r0 == 0) goto L_0x0214;
    L_0x01f3:
        r0 = "DownloadManager";
        r1 = new java.lang.StringBuilder;
        r1.<init>();
        r2 = "other UID ";
        r1 = r1.append(r2);
        r2 = "otheruid";
        r2 = r6.getAsInteger(r2);
        r1 = r1.append(r2);
        r1 = r1.toString();
        android.util.Log.v(r0, r1);
    L_0x0214:
        r0 = r13.getContext();
        r1 = new android.content.Intent;
        r2 = com.xiaomi.smarthome.download.DownloadService.class;
        r1.<init>(r0, r2);
        r0.startService(r1);
        r1 = "downloads";
        r6 = r4.insert(r1, r3, r6);
        r8 = -1;
        r1 = (r6 > r8 ? 1 : (r6 == r8 ? 0 : -1));
        if (r1 != 0) goto L_0x0264;
    L_0x022f:
        r0 = "DownloadManager";
        r1 = "couldn't insert into downloads database";
        android.util.Log.d(r0, r1);
        r0 = r3;
    L_0x0239:
        return r0;
    L_0x023a:
        r8 = "visibility";
        r9 = 2;
        r9 = java.lang.Integer.valueOf(r9);
        r6.put(r8, r9);
        goto L_0x00e8;
    L_0x0247:
        r9 = "visibility";
        r6.put(r9, r8);
        goto L_0x00e8;
    L_0x024f:
        if (r7 == 0) goto L_0x0257;
    L_0x0251:
        r7 = r7.intValue();
        if (r7 != 0) goto L_0x0258;
    L_0x0257:
        r2 = r1;
    L_0x0258:
        r1 = "is_visible_in_downloads_ui";
        r2 = java.lang.Boolean.valueOf(r2);
        r6.put(r1, r2);
        goto L_0x01b5;
    L_0x0264:
        r13.m6953a(r4, r6, r15);
        r1 = new android.content.Intent;
        r2 = com.xiaomi.smarthome.download.DownloadService.class;
        r1.<init>(r0, r2);
        r0.startService(r1);
        r13.m6955a(r14, r5);
        r0 = com.xiaomi.smarthome.download.Downloads.CONTENT_URI;
        r0 = android.content.ContentUris.withAppendedId(r0, r6);
        goto L_0x0239;
    L_0x027b:
        r8 = move-exception;
        goto L_0x013a;
        */
        throw new UnsupportedOperationException("Method not decompiled: com.xiaomi.smarthome.download.DownloadProvider.insert(android.net.Uri, android.content.ContentValues):android.net.Uri");
    }

    private void m6951a(ContentValues contentValues) {
        String asString = contentValues.getAsString(Downloads.COLUMN_FILE_NAME_HINT);
        if (asString == null) {
            throw new IllegalArgumentException("DESTINATION_FILE_URI must include a file URI under COLUMN_FILE_NAME_HINT");
        }
        Uri parse = Uri.parse(asString);
        String scheme = parse.getScheme();
        if (scheme == null || !scheme.equals("file")) {
            throw new IllegalArgumentException("Not a file URI: " + parse);
        }
        scheme = parse.getPath();
        if (scheme == null) {
            throw new IllegalArgumentException("Invalid file URI: " + parse);
        } else if (!scheme.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) {
            throw new SecurityException("Destination must be on external storage: " + parse);
        }
    }

    private void m6960b(ContentValues contentValues) {
        if (getContext().checkCallingOrSelfPermission(Downloads.PERMISSION_ACCESS) != 0) {
            getContext().enforceCallingOrSelfPermission("android.permission.INTERNET", "INTERNET permission is required to use the download manager");
            ContentValues contentValues2 = new ContentValues(contentValues);
            m6952a(contentValues2, Downloads.COLUMN_IS_PUBLIC_API, Boolean.TRUE);
            m6952a(contentValues2, Downloads.COLUMN_DESTINATION, Integer.valueOf(4));
            if (getContext().checkCallingOrSelfPermission(Downloads.PERMISSION_NO_NOTIFICATION) == 0) {
                m6952a(contentValues2, Downloads.COLUMN_VISIBILITY, Integer.valueOf(2), Integer.valueOf(0));
            } else {
                m6952a(contentValues2, Downloads.COLUMN_VISIBILITY, Integer.valueOf(0));
            }
            contentValues2.remove(Downloads.COLUMN_URI);
            contentValues2.remove(Downloads.COLUMN_TITLE);
            contentValues2.remove(Downloads.COLUMN_DESCRIPTION);
            contentValues2.remove(Downloads.COLUMN_MIME_TYPE);
            contentValues2.remove(Downloads.COLUMN_FILE_NAME_HINT);
            contentValues2.remove(Downloads.COLUMN_NOTIFICATION_PACKAGE);
            contentValues2.remove(Downloads.COLUMN_ALLOWED_NETWORK_TYPES);
            contentValues2.remove(Downloads.COLUMN_ALLOW_ROAMING);
            contentValues2.remove(Downloads.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI);
            Iterator it = contentValues2.valueSet().iterator();
            while (it.hasNext()) {
                if (((String) ((Entry) it.next()).getKey()).startsWith("http_header_")) {
                    it.remove();
                }
            }
            if (contentValues2.size() > 0) {
                StringBuilder stringBuilder = new StringBuilder("Invalid columns in request: ");
                for (Entry key : contentValues2.valueSet()) {
                    stringBuilder.append((String) key.getKey());
                }
                throw new SecurityException(stringBuilder.toString());
            }
        }
    }

    private void m6952a(ContentValues contentValues, String str, Object... objArr) {
        Object obj = contentValues.get(str);
        contentValues.remove(str);
        int length = objArr.length;
        int i = 0;
        while (i < length) {
            Object obj2 = objArr;
            if (obj != null || obj2 != null) {
                if (obj == null || !obj.equals(obj2)) {
                    i++;
                } else {
                    return;
                }
            }
            return;
        }
        throw new SecurityException("Invalid value for " + str + ": " + obj);
    }

    public Cursor query(Uri uri, String[] strArr, String str, String[] strArr2, String str2) {
        Helpers.m7035a(str, f5506e);
        SQLiteDatabase readableDatabase = this.f5508f.getReadableDatabase();
        int match = f5503b.match(uri);
        if (match == -1) {
            throw new IllegalArgumentException("Unknown URI: " + uri);
        } else if (match != 5) {
            Cursor readOnlyCursorWrapper;
            SqlSelection a = m6949a(uri, str, strArr2, match);
            m6959a(strArr, str, strArr2, str2, readableDatabase);
            Cursor query = readableDatabase.query("downloads", strArr, a.m6945a(), a.m6947b(), null, null, str2);
            if (query != null) {
                readOnlyCursorWrapper = new ReadOnlyCursorWrapper(this, query);
            } else {
                readOnlyCursorWrapper = query;
            }
            if (readOnlyCursorWrapper == null) {
                return readOnlyCursorWrapper;
            }
            readOnlyCursorWrapper.setNotificationUri(getContext().getContentResolver(), uri);
            Log.v("DownloadManager", "created cursor " + readOnlyCursorWrapper + " on behalf of " + Binder.getCallingPid());
            return readOnlyCursorWrapper;
        } else if (strArr == null && str == null && str2 == null) {
            return m6948a(readableDatabase, uri);
        } else {
            throw new UnsupportedOperationException("Request header queries do not support projections, selections or sorting");
        }
    }

    private void m6959a(String[] strArr, String str, String[] strArr2, String str2, SQLiteDatabase sQLiteDatabase) {
        int i = 0;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("starting query, database is ");
        if (sQLiteDatabase != null) {
            stringBuilder.append("not ");
        }
        stringBuilder.append("null; ");
        if (strArr == null) {
            stringBuilder.append("projection is null; ");
        } else if (strArr.length == 0) {
            stringBuilder.append("projection is empty; ");
        } else {
            for (int i2 = 0; i2 < strArr.length; i2++) {
                stringBuilder.append("projection[");
                stringBuilder.append(i2);
                stringBuilder.append("] is ");
                stringBuilder.append(strArr[i2]);
                stringBuilder.append("; ");
            }
        }
        stringBuilder.append("selection is ");
        stringBuilder.append(str);
        stringBuilder.append("; ");
        if (strArr2 == null) {
            stringBuilder.append("selectionArgs is null; ");
        } else if (strArr2.length == 0) {
            stringBuilder.append("selectionArgs is empty; ");
        } else {
            while (i < strArr2.length) {
                stringBuilder.append("selectionArgs[");
                stringBuilder.append(i);
                stringBuilder.append("] is ");
                stringBuilder.append(strArr2);
                stringBuilder.append("; ");
                i++;
            }
        }
        stringBuilder.append("sort is ");
        stringBuilder.append(str2);
        stringBuilder.append(".");
        Log.v("DownloadManager", stringBuilder.toString());
    }

    private String m6950a(Uri uri) {
        return (String) uri.getPathSegments().get(1);
    }

    private void m6953a(SQLiteDatabase sQLiteDatabase, long j, ContentValues contentValues) {
        ContentValues contentValues2 = new ContentValues();
        contentValues2.put("download_id", Long.valueOf(j));
        for (Entry entry : contentValues.valueSet()) {
            if (((String) entry.getKey()).startsWith("http_header_")) {
                String obj = entry.getValue().toString();
                if (obj.contains(SOAP.DELIM)) {
                    String[] split = obj.split(SOAP.DELIM, 2);
                    contentValues2.put("header", split[0].trim());
                    contentValues2.put("value", split[1].trim());
                    sQLiteDatabase.insert("request_headers", null, contentValues2);
                } else {
                    throw new IllegalArgumentException("Invalid HTTP header line: " + obj);
                }
            }
        }
    }

    private Cursor m6948a(SQLiteDatabase sQLiteDatabase, Uri uri) {
        String str = "download_id=" + m6950a(uri);
        return new ReadOnlyCursorWrapper(this, sQLiteDatabase.query("request_headers", new String[]{"header", "value"}, str, null, null, null, null));
    }

    private void m6954a(SQLiteDatabase sQLiteDatabase, String str, String[] strArr) {
        SQLiteDatabase sQLiteDatabase2 = sQLiteDatabase;
        Cursor query = sQLiteDatabase2.query("downloads", new String[]{DownloadConstants.COLUMN_ID}, str, strArr, null, null, null, null);
        try {
            query.moveToFirst();
            while (!query.isAfterLast()) {
                String str2 = "request_headers";
                sQLiteDatabase.delete(str2, "download_id=" + query.getLong(0), null);
                query.moveToNext();
            }
        } finally {
            query.close();
        }
    }

    public int update(Uri uri, ContentValues contentValues, String str, String[] strArr) {
        int i;
        int i2;
        int i3 = 0;
        int i4 = 1;
        Helpers.m7035a(str, f5506e);
        SQLiteDatabase writableDatabase = this.f5508f.getWritableDatabase();
        if (contentValues.containsKey(Downloads.COLUMN_DELETED) && contentValues.getAsInteger(Downloads.COLUMN_DELETED).intValue() == 1) {
            i = 1;
        } else {
            i = 0;
        }
        if (Binder.getCallingPid() != Process.myPid()) {
            ContentValues contentValues2 = new ContentValues();
            m6962c(Downloads.COLUMN_APP_DATA, contentValues, contentValues2);
            m6957a(Downloads.COLUMN_VISIBILITY, contentValues, contentValues2);
            Integer asInteger = contentValues.getAsInteger(Downloads.COLUMN_CONTROL);
            if (asInteger != null) {
                contentValues2.put(Downloads.COLUMN_CONTROL, asInteger);
            } else {
                i4 = i;
            }
            m6957a(Downloads.COLUMN_CONTROL, contentValues, contentValues2);
            m6962c(Downloads.COLUMN_TITLE, contentValues, contentValues2);
            m6962c(Downloads.COLUMN_DESCRIPTION, contentValues, contentValues2);
            m6957a(Downloads.COLUMN_DELETED, contentValues, contentValues2);
            contentValues = contentValues2;
        } else {
            String asString = contentValues.getAsString(Downloads._DATA);
            if (asString != null) {
                Cursor query = query(uri, new String[]{Downloads.COLUMN_TITLE}, null, null, null);
                if (!query.moveToFirst() || query.getString(0).length() == 0) {
                    contentValues.put(Downloads.COLUMN_TITLE, new File(asString).getName());
                }
                query.close();
            }
            Integer asInteger2 = contentValues.getAsInteger(Downloads.COLUMN_STATUS);
            if (asInteger2 == null || asInteger2.intValue() != Downloads.STATUS_PENDING) {
                i2 = 0;
            } else {
                i2 = 1;
            }
            boolean containsKey = contentValues.containsKey(Downloads.COLUMN_BYPASS_RECOMMENDED_SIZE_LIMIT);
            if (i2 == 0 && !containsKey) {
                i4 = i;
            }
        }
        i2 = f5503b.match(uri);
        switch (i2) {
            case UPnP.USE_ONLY_IPV6_ADDR /*1*/:
            case UPnP.USE_LOOPBACK_ADDR /*2*/:
            case SSDP.DEFAULT_MSEARCH_MX /*3*/:
            case UPnP.USE_IPV6_SUBNET_SCOPE /*4*/:
                SqlSelection a = m6949a(uri, str, strArr, i2);
                if (contentValues.size() > 0) {
                    i3 = writableDatabase.update("downloads", contentValues, a.m6945a(), a.m6947b());
                }
                m6955a(uri, i2);
                if (i4 != 0) {
                    Context context = getContext();
                    context.startService(new Intent(context, DownloadService.class));
                }
                return i3;
            default:
                Log.d("DownloadManager", "updating unknown/invalid URI: " + uri);
                throw new UnsupportedOperationException("Cannot update URI: " + uri);
        }
    }

    private void m6955a(Uri uri, int i) {
        Long valueOf;
        if (i == 2 || i == 4) {
            valueOf = Long.valueOf(Long.parseLong(m6950a(uri)));
        } else {
            valueOf = null;
        }
        for (Uri uri2 : f5504c) {
            Uri uri22;
            if (valueOf != null) {
                uri22 = ContentUris.withAppendedId(uri22, valueOf.longValue());
            }
            getContext().getContentResolver().notifyChange(uri22, null);
        }
    }

    private SqlSelection m6949a(Uri uri, String str, String[] strArr, int i) {
        SqlSelection sqlSelection = new SqlSelection();
        sqlSelection.m6946a(str, strArr);
        if (i == 2 || i == 4) {
            sqlSelection.m6946a("_id = ?", m6950a(uri));
        }
        if ((i == 1 || i == 2) && getContext().checkCallingPermission(Downloads.PERMISSION_ACCESS_ALL) != 0) {
            sqlSelection.m6946a("uid= ? OR otheruid= ?", Integer.valueOf(Binder.getCallingUid()), Integer.valueOf(Binder.getCallingPid()));
        }
        return sqlSelection;
    }

    public int delete(Uri uri, String str, String[] strArr) {
        Helpers.m7035a(str, f5506e);
        SQLiteDatabase writableDatabase = this.f5508f.getWritableDatabase();
        int match = f5503b.match(uri);
        switch (match) {
            case UPnP.USE_ONLY_IPV6_ADDR /*1*/:
            case UPnP.USE_LOOPBACK_ADDR /*2*/:
            case SSDP.DEFAULT_MSEARCH_MX /*3*/:
            case UPnP.USE_IPV6_SUBNET_SCOPE /*4*/:
                SqlSelection a = m6949a(uri, str, strArr, match);
                m6954a(writableDatabase, a.m6945a(), a.m6947b());
                int delete = writableDatabase.delete("downloads", a.m6945a(), a.m6947b());
                m6955a(uri, match);
                return delete;
            default:
                Log.d("DownloadManager", "deleting unknown/invalid URI: " + uri);
                throw new UnsupportedOperationException("Cannot delete URI: " + uri);
        }
    }

    public ParcelFileDescriptor openFile(Uri uri, String str) {
        int count;
        m6956a(uri, str);
        Cursor query = query(uri, new String[]{Downloads._DATA}, null, null, null);
        if (query != null) {
            try {
                count = query.getCount();
            } catch (Throwable th) {
                if (query != null) {
                    query.close();
                }
            }
        } else {
            count = 0;
        }
        if (count == 1) {
            query.moveToFirst();
            String string = query.getString(0);
            if (query != null) {
                query.close();
            }
            if (string == null) {
                throw new FileNotFoundException("No filename found.");
            } else if (!Helpers.m7040b(string)) {
                throw new FileNotFoundException("Invalid filename.");
            } else if ("r".equals(str)) {
                ParcelFileDescriptor open = ParcelFileDescriptor.open(new File(string), 268435456);
                if (open != null) {
                    return open;
                }
                throw new FileNotFoundException("couldn't open file");
            } else {
                throw new FileNotFoundException("Bad mode for " + uri + ": " + str);
            }
        } else if (count == 0) {
            throw new FileNotFoundException("No entry for " + uri);
        } else {
            throw new FileNotFoundException("Multiple items at " + uri);
        }
    }

    private void m6956a(Uri uri, String str) {
        Log.v("DownloadManager", "openFile uri: " + uri + ", mode: " + str + ", uid: " + Binder.getCallingUid());
        Cursor query = query(Downloads.CONTENT_URI, new String[]{DownloadConstants.COLUMN_ID}, null, null, DownloadConstants.COLUMN_ID);
        if (query == null) {
            Log.v("DownloadManager", "null cursor in openFile");
        } else {
            if (query.moveToFirst()) {
                do {
                    Log.v("DownloadManager", "row " + query.getInt(0) + " available");
                } while (query.moveToNext());
            } else {
                Log.v("DownloadManager", "empty cursor in openFile");
            }
            query.close();
        }
        query = query(uri, new String[]{Downloads._DATA}, null, null, null);
        if (query == null) {
            Log.v("DownloadManager", "null cursor in openFile");
            return;
        }
        if (query.moveToFirst()) {
            String string = query.getString(0);
            Log.v("DownloadManager", "filename in openFile: " + string);
            if (new File(string).isFile()) {
                Log.v("DownloadManager", "file exists in openFile");
            }
        } else {
            Log.v("DownloadManager", "empty cursor in openFile");
        }
        query.close();
    }

    private static final void m6957a(String str, ContentValues contentValues, ContentValues contentValues2) {
        Integer asInteger = contentValues.getAsInteger(str);
        if (asInteger != null) {
            contentValues2.put(str, asInteger);
        }
    }

    private static final void m6961b(String str, ContentValues contentValues, ContentValues contentValues2) {
        Boolean asBoolean = contentValues.getAsBoolean(str);
        if (asBoolean != null) {
            contentValues2.put(str, asBoolean);
        }
    }

    private static final void m6962c(String str, ContentValues contentValues, ContentValues contentValues2) {
        String asString = contentValues.getAsString(str);
        if (asString != null) {
            contentValues2.put(str, asString);
        }
    }

    private static final void m6958a(String str, ContentValues contentValues, ContentValues contentValues2, String str2) {
        m6962c(str, contentValues, contentValues2);
        if (!contentValues2.containsKey(str)) {
            contentValues2.put(str, str2);
        }
    }
}

Вот это я пытаюсь разобрать:  https://drive.google.com/file/d/0BwLYzaYJowBLLTFCMXl4ZVBPWjg/view?usp=sharing
(MiHome + cn.ninebot.ninebot.escooter)

Кому не лень, можете поискать у себя на девайсе download.db?
E-TWOW Eco -> Kugoo -> Ninebot ES1 -> Ninebot ES-Trash

Gennadiy203

Предположу, что если отключить "+" родной батареи от остальной начинки и подключить внешнюю батарею, то сяо не поймёт подмены и будет работать. Только уровень заряда не посмотришь. Зато, как только внешняя сядет, переключил на внутреннюю и дальше покатил. ;-)

LIST

У Сяо нет понятия отдельной батареи или отдельной какой то платы.
Еще раз напоминаю, что компьютер в самокате опрашивает каждый важный электронный элемент в схеме..
Если хоть какая то деталька в БМС не ответит - самокат не включится...

nicomunet123

[user]LIST[/user], скорее не так, самокат включится, но не тронется, так как ток на BMS будет 0, а ток через контроллер N ампер.
Или наоборот, сгорят все транзисторы.
E-TWOW Eco -> Kugoo -> Ninebot ES1 -> Ninebot ES-Trash

LIST

Мы на работающем хорошем самокате выпаивали поочередно некоторые детали... Самокат - не включался..
Ни о каких важных элементах не может быть и речи... :((
С уважением,
LIST

Gennadiy203

Выпаивать ничего не надо. Родная батарея остаётся на месте, бмс не отключается и сяо думает, что всё подключено и рабочее. Только реально для движения подсунуть внешнее питание на контроллер.

inwin

Цитата: LIST от 25 Фев. 2017 в 16:32
Мы на работающем хорошем самокате выпаивали поочередно некоторые детали... Самокат - не включался..
Ни о каких важных элементах не может быть и речи... :((
С уважением,
LIST
разве нельзя вытащить батарею сяоката, вывести провода подключаемые к батарее наружу и при разрядке батареи, подключать батарею, которая от другого сяоката?

poraboloid

К штатной батарее приварить еще ряд параллельный.
И защиту поставить которая на это рассчитана.
И пусть штатная бмс трудится дальше.

Добавлено 25 Фев. 2017 в 17:07

Цитата: inwin от 25 Фев. 2017 в 17:05
Цитата: LIST от 25 Фев. 2017 в 16:32
Мы на работающем хорошем самокате выпаивали поочередно некоторые детали... Самокат - не включался..
Ни о каких важных элементах не может быть и речи... :((
С уважением,
LIST
разве нельзя вытащить батарею сяоката, вывести провода подключаемые к батарее наружу и при разрядке батареи, подключать батарею, которая от другого сяоката?
Можно, на нужно будет параллелить не только силовые но и балансирные провода.
И если вторая батка будет с бмс тоже вопрос как она к этому отнесётся.
Yedoo Ox, МК DD350W, 9А\ч LiFePo4  Yedoo City, МК QQ85,11A\ч LiIon
Yedoo Mezec new, MXUS 350, 9А\ч LiFePo4 Самовар на тесте.
EVO 2xDD500W в ремонте.Оxelo Dirt в доделке

inwin

Цитата: poraboloid от 25 Фев. 2017 в 17:06
К штатной батарее приварить еще ряд параллельный.
И защиту поставить которая на это рассчитана.
И пусть штатная бмс трудится дальше.

Добавлено 25 Фев 2017 в 17:07

Цитата: inwin от 25 Фев. 2017 в 17:05
Цитата: LIST от 25 Фев. 2017 в 16:32
Мы на работающем хорошем самокате выпаивали поочередно некоторые детали... Самокат - не включался..
Ни о каких важных элементах не может быть и речи... :((
С уважением,
LIST
разве нельзя вытащить батарею сяоката, вывести провода подключаемые к батарее наружу и при разрядке батареи, подключать батарею, которая от другого сяоката?
Можно, на нужно будет параллелить не только силовые но и балансирные провода.
И если вторая батка будет с бмс тоже вопрос как она к этому отнесётся.
речь не про паралельность, а отключение разрядившейся и подключение зарядившейся батареи.
грубо говоря как это рализовано на моноколесе кингсонг 14b.
Спойлер

Gennadiy203

Прикинул примерную схемку подключения внешней батареи. ( не пинайте за качество)
При подключенной перемычке , всё работает в штатном режиме. Если её выдернуть, то напруга всё равно останется в схеме, хоть и чуть ниже(подобрать сопротивление только надо). И в разъём подключить внешнюю батарею. Сяокат не заметит подмены. :dance:

black-141

Xiaomi Ninebot Mini/firmware: V1.4.0 / app 3.2.4
Xiaomi Mijia M365 Electric Scooter/firmware: V1.3.0 /


black-141

#106
заказал на лето держатель для телефона http://www.gearbest.com/bike-holder/pp_443056.html

сигнал для пешеходов https://ru.aliexpress.com/item/Bicycle-Bell-Cycling-Horns-Electronic-Bike-Bicycle-Handlebar-Ring-Bell-Horn-Strong-Loud-Air-Alarm-Bell/32583941784.html?spm=2114.03010208.3.242.S0q92A&ws_ab_test=searchweb0_0,searchweb201602_6_10000073_10000074_10000167_10000175_10000069_10000068_10000062_10000063_10099_10000156_10000158_10096_10000056_10000059_10000097_10000094_10000090_10000091_10000147_10000144_10084_10117_10000150_10083_10119_10080_10000153_10082_10081_10110_10111_10112_10113_10114_10000089_10000086_10000083_10000135_10000080_10078_10079_10077_10073_10000140_10070_10122_10123_10120_10126_10127_10124_10125_10065_10068_10000132_10000033_119_10000030_10000126_10000026_10000129_10000023_10000123_432_10060_10062_10056_10055_10054_301_10059_10000120_10000020_10000117_10000013_10103_10102_10000114_10000016_10000111_10052_10053_10050_10107_10051_10106_10000101_10000100_10000104_10000045_10000108_10000191_10000197_10037_10000179_10000042_10000039_10000036_10000187-10052_10113_10120,searchweb201603_4,afswitch_1_afChannel,ppcSwitch_5,single_sort_1_price_asc&btsid=6a1e06c5-7d50-4ab4-a0e4-befcf3f345e1&algo_expid=0f29ed04-6469-4a58-83fe-e92398301653-28&algo_pvid=0f29ed04-6469-4a58-83fe-e92398301653

ну этот если уже совсем пугануть https://market.yandex.ru/search?clid=545&cvredirect=0&lr=213&text=air%20zound%20%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C%20%D0%B2%20%D0%BC%D0%BE%D1%81%D0%BA%D0%B2%D0%B5&local-offers-first=0&deliveryincluded=0&onstock=1
Xiaomi Ninebot Mini/firmware: V1.4.0 / app 3.2.4
Xiaomi Mijia M365 Electric Scooter/firmware: V1.3.0 /

777Andrew777

[user]black-141[/user], куда вы все это прикрутите? Если только на стойку руля, т.к. на самом руле место есть только для чего-нибудь одного.
Первый сигнал прикольный, но не очень эффективный: больше пугает, чем разгоняет - прошлое лето с ним ездил.